イベントに対してハンドラーを登録するには、
xlnx_register_event()
API を使用します。複数のイベント マスクに対して OR 演算子を使用すると、複数のイベントに対して 1 つのハンドラーを登録できます。int xlnx_register_event(const enum pm_api_cb_id cb_type, const u32 node_id, const u32 event, const bool wake, event_cb_func_t cb_fun, void *data)
説明:
- cb_type
-
pm_api_cb_id
からのコールバックのタイプ。-
PM_NOTIFY_CB
: エラー イベント。 -
PM_INIT_SUSPEND_CB
: サスペンド コールバック。
-
- node_id
- エラー イベントに対するノード ID。
- event
- エラー イベントに対するエラー イベント マスク。
- wake
- イベント通知によってサブシステムをウェークアップするかどうかを指定するフラグ。
- cb_fun
- コールバック関数を保存するための関数ポインター。
- data
- ドライバー インスタンスへのポインター。
Versal デバイスのエラー イベントの node-id とエラー イベント マスクの詳細 (またはマクロ) は、Linux の include/linux/firmware/xlnx-versal-error-events.h ファイルを参照してください。
たとえば、エージェントが DDRMC ドライバーである場合を考えます。
- このエラー イベントを処理するユーザー コールバック関数を定義します。
void xddr_err_callback(const u32 *payload, void *data) { /* Tack action */ }
ファームウェアでエラー イベントが発生したときに
xddr_err_callback()
が呼び出されると、ドライバーは適切なデータを要求します。Struct xddr_data { U32 var1; . . }
- DDRMC 訂正可能および訂正不可能エラーを登録します。
xlnx_register_event(PM_NOTIFY_CB, XPM_NODETYPE_VERSAL_EVENT_ERROR_PMC_ERR1, XPM_VERSAL_EVENT_ERROR_MASK_DDRMC_CR | XPM_VERSAL_EVENT_ERROR_MASK_DDRMC_NCR, false, xddr_err_callback, (void *) data);
- DDRMC 訂正可能および訂正不可能エラーを登録解除します。
ret = xlnx_unregister_event(PM_NOTIFY_CB, XPM_NODETYPE_VERSAL_EVENT_ERROR_PMC_ERR1, XPM_VERSAL_EVENT_ERROR_MASK_DDRMC_CR | XPM_VERSAL_EVENT_ERROR_MASK_DDRMC_NCR, xddr_err_callback,);