blob: 4e9b627edfefaa819f958be55b67e188b257c1ed [file] [log] [blame]
Cristian Marussi1fc2dd12020-07-01 16:53:40 +01001/* 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 *
Cristian Marussi533c7092021-03-16 12:48:31 +00007 * Copyright (C) 2020-2021 ARM Ltd.
Cristian Marussi1fc2dd12020-07-01 16:53:40 +01008 */
9#ifndef _SCMI_NOTIFY_H
10#define _SCMI_NOTIFY_H
11
12#include <linux/device.h>
Cristian Marussi72a5eb9d2020-07-10 14:39:19 +010013#include <linux/ktime.h>
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010014#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 */
28struct scmi_event {
29 u8 id;
30 size_t max_payld_sz;
31 size_t max_report_sz;
32};
33
Cristian Marussi533c7092021-03-16 12:48:31 +000034struct scmi_protocol_handle;
35
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010036/**
37 * struct scmi_event_ops - Protocol helpers called by the notification core.
Cristian Marussi533c7092021-03-16 12:48:31 +000038 * @get_num_sources: Returns the number of possible events' sources for this
39 * protocol
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010040 * @set_notify_enabled: Enable/disable the required evt_id/src_id notifications
41 * using the proper custom protocol commands.
42 * Return 0 on Success
Cristian Marussibd31b242020-07-01 16:53:42 +010043 * @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
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010048 *
49 * Context: Helpers described in &struct scmi_event_ops are called only in
50 * process context.
51 */
52struct scmi_event_ops {
Cristian Marussi3cb8c952021-03-16 12:48:59 +000053 int (*get_num_sources)(const struct scmi_protocol_handle *ph);
54 int (*set_notify_enabled)(const struct scmi_protocol_handle *ph,
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010055 u8 evt_id, u32 src_id, bool enabled);
Cristian Marussi3cb8c952021-03-16 12:48:59 +000056 void *(*fill_custom_report)(const struct scmi_protocol_handle *ph,
Cristian Marussi72a5eb9d2020-07-10 14:39:19 +010057 u8 evt_id, ktime_t timestamp,
58 const void *payld, size_t payld_sz,
59 void *report, u32 *src_id);
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010060};
61
Cristian Marussi533c7092021-03-16 12:48:31 +000062/**
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 */
72struct 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
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010080int scmi_notification_init(struct scmi_handle *handle);
81void scmi_notification_exit(struct scmi_handle *handle);
Cristian Marussi533c7092021-03-16 12:48:31 +000082int scmi_register_protocol_events(const struct scmi_handle *handle, u8 proto_id,
Cristian Marussib9f7fd92021-03-16 12:48:32 +000083 const struct scmi_protocol_handle *ph,
Cristian Marussi533c7092021-03-16 12:48:31 +000084 const struct scmi_protocol_events *ee);
85void scmi_deregister_protocol_events(const struct scmi_handle *handle,
86 u8 proto_id);
Cristian Marussibd31b242020-07-01 16:53:42 +010087int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id,
Cristian Marussi72a5eb9d2020-07-10 14:39:19 +010088 const void *buf, size_t len, ktime_t ts);
Cristian Marussi1fc2dd12020-07-01 16:53:40 +010089
90#endif /* _SCMI_NOTIFY_H */