| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * System Control and Management Interface (SCMI) Message Protocol | |
| * notification header file containing some definitions, structures | |
| * and function prototypes related to SCMI Notification handling. | |
| * | |
| * Copyright (C) 2020-2021 ARM Ltd. | |
| */ | |
| #ifndef _SCMI_NOTIFY_H | |
| #define _SCMI_NOTIFY_H | |
| #include <linux/device.h> | |
| #include <linux/ktime.h> | |
| #include <linux/types.h> | |
| #define SCMI_PROTO_QUEUE_SZ 4096 | |
| /** | |
| * struct scmi_event - Describes an event to be supported | |
| * @id: Event ID | |
| * @max_payld_sz: Max possible size for the payload of a notification message | |
| * @max_report_sz: Max possible size for the report of a notification message | |
| * | |
| * Each SCMI protocol, during its initialization phase, can describe the events | |
| * it wishes to support in a few struct scmi_event and pass them to the core | |
| * using scmi_register_protocol_events(). | |
| */ | |
| struct scmi_event { | |
| u8 id; | |
| size_t max_payld_sz; | |
| size_t max_report_sz; | |
| }; | |
| struct scmi_protocol_handle; | |
| /** | |
| * struct scmi_event_ops - Protocol helpers called by the notification core. | |
| * @is_notify_supported: Return 0 if the specified notification for the | |
| * specified resource (src_id) is supported. | |
| * @get_num_sources: Returns the number of possible events' sources for this | |
| * protocol | |
| * @set_notify_enabled: Enable/disable the required evt_id/src_id notifications | |
| * using the proper custom protocol commands. | |
| * Return 0 on Success | |
| * @fill_custom_report: fills a custom event report from the provided | |
| * event message payld identifying the event | |
| * specific src_id. | |
| * Return NULL on failure otherwise @report now fully | |
| * populated | |
| * | |
| * Context: Helpers described in &struct scmi_event_ops are called only in | |
| * process context. | |
| */ | |
| struct scmi_event_ops { | |
| bool (*is_notify_supported)(const struct scmi_protocol_handle *ph, | |
| u8 evt_id, u32 src_id); | |
| int (*get_num_sources)(const struct scmi_protocol_handle *ph); | |
| int (*set_notify_enabled)(const struct scmi_protocol_handle *ph, | |
| u8 evt_id, u32 src_id, bool enabled); | |
| void *(*fill_custom_report)(const struct scmi_protocol_handle *ph, | |
| u8 evt_id, ktime_t timestamp, | |
| const void *payld, size_t payld_sz, | |
| void *report, u32 *src_id); | |
| }; | |
| /** | |
| * struct scmi_protocol_events - Per-protocol description of available events | |
| * @queue_sz: Size in bytes of the per-protocol queue to use. | |
| * @ops: Array of protocol-specific events operations. | |
| * @evts: Array of supported protocol's events. | |
| * @num_events: Number of supported protocol's events described in @evts. | |
| * @num_sources: Number of protocol's sources, should be greater than 0; if not | |
| * available at compile time, it will be provided at run-time via | |
| * @get_num_sources. | |
| */ | |
| struct scmi_protocol_events { | |
| size_t queue_sz; | |
| const struct scmi_event_ops *ops; | |
| const struct scmi_event *evts; | |
| unsigned int num_events; | |
| unsigned int num_sources; | |
| }; | |
| int scmi_notification_init(struct scmi_handle *handle); | |
| void scmi_notification_quiesce(struct scmi_handle *handle); | |
| void scmi_notification_exit(struct scmi_handle *handle); | |
| int scmi_register_protocol_events(const struct scmi_handle *handle, u8 proto_id, | |
| const struct scmi_protocol_handle *ph, | |
| const struct scmi_protocol_events *ee); | |
| void scmi_deregister_protocol_events(const struct scmi_handle *handle, | |
| u8 proto_id); | |
| int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id, | |
| const void *buf, size_t len, ktime_t ts); | |
| #endif /* _SCMI_NOTIFY_H */ |