1 /*
2 * Copyright 2025 NXP
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/drivers/firmware/scmi/system.h>
8 #include <string.h>
9 #include <zephyr/kernel.h>
10
11 DT_SCMI_PROTOCOL_DEFINE_NODEV(DT_INST(0, arm_scmi_system), NULL,
12 SCMI_SYSTEM_POWER_PROTOCOL_SUPPORTED_VERSION);
13
scmi_system_protocol_version(uint32_t * version)14 int scmi_system_protocol_version(uint32_t *version)
15 {
16 struct scmi_protocol *proto = &SCMI_PROTOCOL_NAME(SCMI_PROTOCOL_SYSTEM);
17
18 return scmi_protocol_get_version(proto, version);
19 }
20
scmi_system_protocol_attributes(uint32_t * attributes)21 int scmi_system_protocol_attributes(uint32_t *attributes)
22 {
23 struct scmi_protocol *proto = &SCMI_PROTOCOL_NAME(SCMI_PROTOCOL_SYSTEM);
24
25 return scmi_protocol_attributes_get(proto, attributes);
26 }
27
scmi_system_protocol_message_attributes(uint32_t message_id,uint32_t * attributes)28 int scmi_system_protocol_message_attributes(uint32_t message_id, uint32_t *attributes)
29 {
30 struct scmi_protocol *proto = &SCMI_PROTOCOL_NAME(SCMI_PROTOCOL_SYSTEM);
31
32 return scmi_protocol_message_attributes_get(proto, message_id, attributes);
33 }
34
scmi_system_protocol_version_negotiate(uint32_t version)35 int scmi_system_protocol_version_negotiate(uint32_t version)
36 {
37 struct scmi_protocol *proto = &SCMI_PROTOCOL_NAME(SCMI_PROTOCOL_SYSTEM);
38
39 return scmi_protocol_version_negotiate(proto, version);
40 }
41
scmi_system_power_state_set(struct scmi_system_power_state_config * cfg)42 int scmi_system_power_state_set(struct scmi_system_power_state_config *cfg)
43 {
44 struct scmi_protocol *proto = &SCMI_PROTOCOL_NAME(SCMI_PROTOCOL_SYSTEM);
45 struct scmi_message msg, reply;
46 int32_t status;
47 int ret;
48 bool use_polling;
49
50 /* sanity checks */
51 if (!proto || !cfg) {
52 return -EINVAL;
53 }
54
55 if (proto->id != SCMI_PROTOCOL_SYSTEM) {
56 return -EINVAL;
57 }
58
59 msg.hdr = SCMI_MESSAGE_HDR_MAKE(SCMI_SYSTEM_MSG_POWER_STATE_SET, SCMI_COMMAND,
60 proto->id, 0x0);
61 msg.len = sizeof(*cfg);
62 msg.content = cfg;
63
64 reply.hdr = msg.hdr;
65 reply.len = sizeof(status);
66 reply.content = &status;
67
68 use_polling = k_is_pre_kernel();
69
70 ret = scmi_send_message(proto, &msg, &reply, use_polling);
71 if (ret < 0) {
72 return ret;
73 }
74
75 return scmi_status_to_errno(status);
76 }
77