Merge remote-tracking branch 'spi/for-5.14' into spi-next
[linux-2.6-microblaze.git] / drivers / firmware / arm_scmi / notify.h
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  * @get_num_sources: Returns the number of possible events' sources for this
39  *                   protocol
40  * @set_notify_enabled: Enable/disable the required evt_id/src_id notifications
41  *                      using the proper custom protocol commands.
42  *                      Return 0 on Success
43  * @fill_custom_report: fills a custom event report from the provided
44  *                      event message payld identifying the event
45  *                      specific src_id.
46  *                      Return NULL on failure otherwise @report now fully
47  *                      populated
48  *
49  * Context: Helpers described in &struct scmi_event_ops are called only in
50  *          process context.
51  */
52 struct scmi_event_ops {
53         int (*get_num_sources)(const struct scmi_protocol_handle *ph);
54         int (*set_notify_enabled)(const struct scmi_protocol_handle *ph,
55                                   u8 evt_id, u32 src_id, bool enabled);
56         void *(*fill_custom_report)(const struct scmi_protocol_handle *ph,
57                                     u8 evt_id, ktime_t timestamp,
58                                     const void *payld, size_t payld_sz,
59                                     void *report, u32 *src_id);
60 };
61
62 /**
63  * struct scmi_protocol_events  - Per-protocol description of available events
64  * @queue_sz: Size in bytes of the per-protocol queue to use.
65  * @ops: Array of protocol-specific events operations.
66  * @evts: Array of supported protocol's events.
67  * @num_events: Number of supported protocol's events described in @evts.
68  * @num_sources: Number of protocol's sources, should be greater than 0; if not
69  *               available at compile time, it will be provided at run-time via
70  *               @get_num_sources.
71  */
72 struct scmi_protocol_events {
73         size_t                          queue_sz;
74         const struct scmi_event_ops     *ops;
75         const struct scmi_event         *evts;
76         unsigned int                    num_events;
77         unsigned int                    num_sources;
78 };
79
80 int scmi_notification_init(struct scmi_handle *handle);
81 void scmi_notification_exit(struct scmi_handle *handle);
82 int scmi_register_protocol_events(const struct scmi_handle *handle, u8 proto_id,
83                                   const struct scmi_protocol_handle *ph,
84                                   const struct scmi_protocol_events *ee);
85 void scmi_deregister_protocol_events(const struct scmi_handle *handle,
86                                      u8 proto_id);
87 int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id,
88                 const void *buf, size_t len, ktime_t ts);
89
90 #endif /* _SCMI_NOTIFY_H */