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