Use the
xlnx_register_event()
API to register
handler for the event(s). You can register a single handler for multiple events by using
the OR operator on multiple event
masks.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)
where,
- cb_type
- Type of callback from
pm_api_cb_id
-
PM_NOTIFY_CB
for error events. -
PM_INIT_SUSPEND_CB
for suspend callbacks.
-
- node_id
- The node ID for the error event.
- event
- The error event mask for the error event.
- wake
- Flag specifying whether the subsystem should be woken upon event notification.
- cb_fun
- Function pointer to store the callback function.
- data
- Pointer for the driver instance.
To get information or the macro for error event node-id and error event mask for Versal devices, see the include/linux/firmware/xlnx-versal-error-events.h file in Linux.
For example, assume that the agent is the DDRMC driver.
- Define the user callback function that needs to handle this error
event.
void xddr_err_callback(const u32 *payload, void *data) { /* Tack action */ }
The driver wants the appropriate data when
xddr_err_callback()
is called on occurrence of error event in firmware.Struct xddr_data { U32 var1; . . }
- Register for the DDRMC correctable and non-correctable
error.
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);
- Unregister for the DDRMC correctable and non-correctable
error.
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,);