11fc2dd18SCristian Marussi /* SPDX-License-Identifier: GPL-2.0 */ 21fc2dd18SCristian Marussi /* 31fc2dd18SCristian Marussi * System Control and Management Interface (SCMI) Message Protocol 41fc2dd18SCristian Marussi * notification header file containing some definitions, structures 51fc2dd18SCristian Marussi * and function prototypes related to SCMI Notification handling. 61fc2dd18SCristian Marussi * 71fc2dd18SCristian Marussi * Copyright (C) 2020 ARM Ltd. 81fc2dd18SCristian Marussi */ 91fc2dd18SCristian Marussi #ifndef _SCMI_NOTIFY_H 101fc2dd18SCristian Marussi #define _SCMI_NOTIFY_H 111fc2dd18SCristian Marussi 121fc2dd18SCristian Marussi #include <linux/device.h> 13*72a5eb9dSCristian Marussi #include <linux/ktime.h> 141fc2dd18SCristian Marussi #include <linux/types.h> 151fc2dd18SCristian Marussi 161fc2dd18SCristian Marussi #define SCMI_PROTO_QUEUE_SZ 4096 171fc2dd18SCristian Marussi 181fc2dd18SCristian Marussi /** 191fc2dd18SCristian Marussi * struct scmi_event - Describes an event to be supported 201fc2dd18SCristian Marussi * @id: Event ID 211fc2dd18SCristian Marussi * @max_payld_sz: Max possible size for the payload of a notification message 221fc2dd18SCristian Marussi * @max_report_sz: Max possible size for the report of a notification message 231fc2dd18SCristian Marussi * 241fc2dd18SCristian Marussi * Each SCMI protocol, during its initialization phase, can describe the events 251fc2dd18SCristian Marussi * it wishes to support in a few struct scmi_event and pass them to the core 261fc2dd18SCristian Marussi * using scmi_register_protocol_events(). 271fc2dd18SCristian Marussi */ 281fc2dd18SCristian Marussi struct scmi_event { 291fc2dd18SCristian Marussi u8 id; 301fc2dd18SCristian Marussi size_t max_payld_sz; 311fc2dd18SCristian Marussi size_t max_report_sz; 321fc2dd18SCristian Marussi }; 331fc2dd18SCristian Marussi 341fc2dd18SCristian Marussi /** 351fc2dd18SCristian Marussi * struct scmi_event_ops - Protocol helpers called by the notification core. 361fc2dd18SCristian Marussi * @set_notify_enabled: Enable/disable the required evt_id/src_id notifications 371fc2dd18SCristian Marussi * using the proper custom protocol commands. 381fc2dd18SCristian Marussi * Return 0 on Success 39bd31b249SCristian Marussi * @fill_custom_report: fills a custom event report from the provided 40bd31b249SCristian Marussi * event message payld identifying the event 41bd31b249SCristian Marussi * specific src_id. 42bd31b249SCristian Marussi * Return NULL on failure otherwise @report now fully 43bd31b249SCristian Marussi * populated 441fc2dd18SCristian Marussi * 451fc2dd18SCristian Marussi * Context: Helpers described in &struct scmi_event_ops are called only in 461fc2dd18SCristian Marussi * process context. 471fc2dd18SCristian Marussi */ 481fc2dd18SCristian Marussi struct scmi_event_ops { 491fc2dd18SCristian Marussi int (*set_notify_enabled)(const struct scmi_handle *handle, 501fc2dd18SCristian Marussi u8 evt_id, u32 src_id, bool enabled); 51bd31b249SCristian Marussi void *(*fill_custom_report)(const struct scmi_handle *handle, 52*72a5eb9dSCristian Marussi u8 evt_id, ktime_t timestamp, 53*72a5eb9dSCristian Marussi const void *payld, size_t payld_sz, 54*72a5eb9dSCristian Marussi void *report, u32 *src_id); 551fc2dd18SCristian Marussi }; 561fc2dd18SCristian Marussi 571fc2dd18SCristian Marussi int scmi_notification_init(struct scmi_handle *handle); 581fc2dd18SCristian Marussi void scmi_notification_exit(struct scmi_handle *handle); 591fc2dd18SCristian Marussi 601fc2dd18SCristian Marussi int scmi_register_protocol_events(const struct scmi_handle *handle, 611fc2dd18SCristian Marussi u8 proto_id, size_t queue_sz, 621fc2dd18SCristian Marussi const struct scmi_event_ops *ops, 631fc2dd18SCristian Marussi const struct scmi_event *evt, int num_events, 641fc2dd18SCristian Marussi int num_sources); 65bd31b249SCristian Marussi int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id, 66*72a5eb9dSCristian Marussi const void *buf, size_t len, ktime_t ts); 671fc2dd18SCristian Marussi 681fc2dd18SCristian Marussi #endif /* _SCMI_NOTIFY_H */ 69