1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * System Control and Management Interface (SCMI) Message Protocol 4 * notification header file containing some definitions, structures 5 * and function prototypes related to SCMI Notification handling. 6 * 7 * Copyright (C) 2020-2021 ARM Ltd. 8 */ 9 #ifndef _SCMI_NOTIFY_H 10 #define _SCMI_NOTIFY_H 11 12 #include <linux/device.h> 13 #include <linux/ktime.h> 14 #include <linux/types.h> 15 16 #define SCMI_PROTO_QUEUE_SZ 4096 17 18 /** 19 * struct scmi_event - Describes an event to be supported 20 * @id: Event ID 21 * @max_payld_sz: Max possible size for the payload of a notification message 22 * @max_report_sz: Max possible size for the report of a notification message 23 * 24 * Each SCMI protocol, during its initialization phase, can describe the events 25 * it wishes to support in a few struct scmi_event and pass them to the core 26 * using scmi_register_protocol_events(). 27 */ 28 struct scmi_event { 29 u8 id; 30 size_t max_payld_sz; 31 size_t max_report_sz; 32 }; 33 34 struct scmi_protocol_handle; 35 36 /** 37 * struct scmi_event_ops - Protocol helpers called by the notification core. 38 * @is_notify_supported: Return 0 if the specified notification for the 39 * specified resource (src_id) is supported. 40 * @get_num_sources: Returns the number of possible events' sources for this 41 * protocol 42 * @set_notify_enabled: Enable/disable the required evt_id/src_id notifications 43 * using the proper custom protocol commands. 44 * Return 0 on Success 45 * @fill_custom_report: fills a custom event report from the provided 46 * event message payld identifying the event 47 * specific src_id. 48 * Return NULL on failure otherwise @report now fully 49 * populated 50 * 51 * Context: Helpers described in &struct scmi_event_ops are called only in 52 * process context. 53 */ 54 struct scmi_event_ops { 55 bool (*is_notify_supported)(const struct scmi_protocol_handle *ph, 56 u8 evt_id, u32 src_id); 57 int (*get_num_sources)(const struct scmi_protocol_handle *ph); 58 int (*set_notify_enabled)(const struct scmi_protocol_handle *ph, 59 u8 evt_id, u32 src_id, bool enabled); 60 void *(*fill_custom_report)(const struct scmi_protocol_handle *ph, 61 u8 evt_id, ktime_t timestamp, 62 const void *payld, size_t payld_sz, 63 void *report, u32 *src_id); 64 }; 65 66 /** 67 * struct scmi_protocol_events - Per-protocol description of available events 68 * @queue_sz: Size in bytes of the per-protocol queue to use. 69 * @ops: Array of protocol-specific events operations. 70 * @evts: Array of supported protocol's events. 71 * @num_events: Number of supported protocol's events described in @evts. 72 * @num_sources: Number of protocol's sources, should be greater than 0; if not 73 * available at compile time, it will be provided at run-time via 74 * @get_num_sources. 75 */ 76 struct scmi_protocol_events { 77 size_t queue_sz; 78 const struct scmi_event_ops *ops; 79 const struct scmi_event *evts; 80 unsigned int num_events; 81 unsigned int num_sources; 82 }; 83 84 int scmi_notification_init(struct scmi_handle *handle); 85 void scmi_notification_exit(struct scmi_handle *handle); 86 int scmi_register_protocol_events(const struct scmi_handle *handle, u8 proto_id, 87 const struct scmi_protocol_handle *ph, 88 const struct scmi_protocol_events *ee); 89 void scmi_deregister_protocol_events(const struct scmi_handle *handle, 90 u8 proto_id); 91 int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id, 92 const void *buf, size_t len, ktime_t ts); 93 94 #endif /* _SCMI_NOTIFY_H */ 95