hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* 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 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.
 * @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 {
   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_exit(struct scmi_handle *handle);
 
struct scmi_protocol_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 */