#include <linux/slab.h>
 
 #include "common.h"
+#include "notify.h"
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/scmi.h>
 
 static void scmi_handle_notification(struct scmi_chan_info *cinfo, u32 msg_hdr)
 {
+       u64 ts;
        struct scmi_xfer *xfer;
        struct device *dev = cinfo->dev;
        struct scmi_info *info = handle_to_scmi_info(cinfo->handle);
        struct scmi_xfers_info *minfo = &info->rx_minfo;
 
+       ts = ktime_get_boottime_ns();
        xfer = scmi_xfer_get(cinfo->handle, minfo);
        if (IS_ERR(xfer)) {
                dev_err(dev, "failed to get free message slot (%ld)\n",
        scmi_dump_header_dbg(dev, &xfer->hdr);
        info->desc->ops->fetch_notification(cinfo, info->desc->max_msg_size,
                                            xfer);
+       scmi_notify(cinfo->handle, xfer->hdr.protocol_id,
+                   xfer->hdr.id, xfer->rx.buf, xfer->rx.len, ts);
 
        trace_scmi_rx_done(xfer->transfer_id, xfer->hdr.id,
                           xfer->hdr.protocol_id, xfer->hdr.seq,
        if (ret)
                return ret;
 
+       if (scmi_notification_init(handle))
+               dev_err(dev, "SCMI Notifications NOT available.\n");
+
        ret = scmi_base_protocol_init(handle);
        if (ret) {
                dev_err(dev, "unable to communicate with SCMI(%d)\n", ret);
        struct scmi_info *info = platform_get_drvdata(pdev);
        struct idr *idr = &info->tx_idr;
 
+       scmi_notification_exit(&info->handle);
+
        mutex_lock(&scmi_list_mutex);
        if (info->users)
                ret = -EBUSY;