xref: /openbmc/linux/drivers/firmware/arm_scmi/notify.h (revision 72a5eb9d9c319c99c11cfd9cfb486380dd136840)
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