1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "scp_unity.h"
9 #include "unity.h"
10 
11 #ifdef TEST_ON_TARGET
12 #    include <fwk_id.h>
13 #    include <fwk_module.h>
14 #else
15 #    include <Mockfwk_id.h>
16 #    include <Mockfwk_module.h>
17 #    include <internal/Mockfwk_core_internal.h>
18 #endif
19 #include <Mockmod_scmi_clock_extra.h>
20 #include <mod_clock.h>
21 
22 #include <mod_scmi.h>
23 #include <config_scmi_clock.h>
24 
25 #include <fwk_element.h>
26 #include <fwk_macros.h>
27 
28 #if defined(BUILD_HAS_MOD_RESOURCE_PERMS)
29     #include <mod_resource_perms.h>
30 #endif
31 
32 #include UNIT_TEST_SRC
33 
34 static struct mod_scmi_clock_ctx scmi_clock_ctx;
35 
36 struct mod_scmi_to_protocol_api *to_protocol_api = NULL;
37 
38 struct mod_scmi_from_protocol_api from_protocol_api = {
39     .get_agent_count = mod_scmi_from_protocol_api_get_agent_count,
40     .get_agent_id = mod_scmi_from_protocol_api_get_agent_id,
41     .get_agent_type = mod_scmi_from_protocol_api_get_agent_type,
42     .get_max_payload_size = mod_scmi_from_protocol_api_get_max_payload_size,
43     .write_payload = mod_scmi_from_protocol_api_write_payload,
44     .respond = mod_scmi_from_protocol_api_respond,
45     .notify = mod_scmi_from_protocol_api_notify,
46 };
47 
48 #if defined(BUILD_HAS_MOD_RESOURCE_PERMS)
49 struct mod_res_permissions_api perm_api = {
50     .agent_has_protocol_permission = mod_res_permissions_api_agent_has_protocol_permission,
51     .agent_has_message_permission = mod_res_permissions_api_agent_has_message_permission,
52     .agent_has_resource_permission = mod_res_permissions_api_agent_has_resource_permission,
53     .agent_set_device_permission = mod_res_permissions_api_agent_set_device_permission,
54     .agent_set_device_protocol_permission = mod_res_permissions_api_agent_set_device_protocol_permission,
55     .agent_reset_config = mod_res_permissions_api_agent_reset_config,
56 };
57 #endif
58 
setUp(void)59 void setUp(void)
60 {
61     scmi_clock_ctx.config = config_scmi_clock.data;
62     scmi_clock_ctx.max_pending_transactions = scmi_clock_ctx.config->max_pending_transactions;
63     scmi_clock_ctx.agent_table = scmi_clock_ctx.config->agent_table;
64 
65     scmi_clock_ctx.clock_devices = FWK_ARRAY_SIZE(agent_device_table_ospm);
66 
67     /* Allocate a table of clock operations */
68     scmi_clock_ctx.clock_ops =
69         fwk_mm_calloc((unsigned int)scmi_clock_ctx.clock_devices,
70         sizeof(struct clock_operations));
71 
72     /* Initialize table */
73     for (unsigned int i = 0; i < (unsigned int)scmi_clock_ctx.clock_devices; i++) {
74         scmi_clock_ctx.clock_ops[i].service_id = FWK_ID_NONE;
75     }
76 
77     scmi_clock_ctx.scmi_api = &from_protocol_api;
78     #if defined(BUILD_HAS_MOD_RESOURCE_PERMS)
79         scmi_clock_ctx.res_perms_api = &perm_api;
80     #endif
81 
82     fwk_id_is_equal_ExpectAnyArgsAndReturn(true);
83     module_scmi_clock.process_bind_request(fwk_module_id_scmi, fwk_module_id_scmi_clock,
84                                            FWK_ID_API(FWK_MODULE_IDX_SCMI_CLOCK, 0),
85                                            (const void **)&to_protocol_api);
86 }
87 
tearDown(void)88 void tearDown(void)
89 {
90 }
91 
fwk_put_event_callback(struct fwk_event * event,int numCalls)92 int fwk_put_event_callback(struct fwk_event *event, int numCalls)
93 {
94     struct scmi_clock_event_request_params *params;
95     params = (struct scmi_clock_event_request_params *)event->params;
96 
97     TEST_ASSERT_EQUAL(0x00000001, params->request_data.set_rate_data.rate[0]);
98     TEST_ASSERT_EQUAL(0x00000001, params->request_data.set_rate_data.rate[1]);
99     TEST_ASSERT_EQUAL(MOD_CLOCK_ROUND_MODE_NEAREST,
100                       params->request_data.set_rate_data.round_mode);
101 
102     return FWK_SUCCESS;
103 }
104 
test_function_set_rate(void)105 void test_function_set_rate(void)
106 {
107     int status;
108 
109     fwk_id_t service_id =
110         FWK_ID_ELEMENT_INIT(FAKE_MODULE_IDX, FAKE_SCMI_AGENT_IDX_OSPM);
111 
112     unsigned int agent_id = FAKE_SCMI_AGENT_IDX_OSPM;
113 
114     struct scmi_clock_rate_set_a2p payload = {
115         .flags = SCMI_CLOCK_RATE_SET_ROUND_AUTO_MASK,
116         .clock_id = CLOCK_DEV_IDX_VPU,
117         .rate[0] = 0x00000001,
118         .rate[1] = 0x00000001,
119     };
120 
121     mod_scmi_from_protocol_api_get_agent_id_ExpectAnyArgsAndReturn(FWK_SUCCESS);
122     mod_scmi_from_protocol_api_get_agent_id_ReturnThruPtr_agent_id(&agent_id);
123 
124     #if defined(BUILD_HAS_MOD_RESOURCE_PERMS)
125         mod_scmi_from_protocol_api_get_agent_id_ExpectAnyArgsAndReturn(FWK_SUCCESS);
126         mod_res_permissions_api_agent_has_resource_permission_ExpectAnyArgsAndReturn(MOD_RES_PERMS_ACCESS_ALLOWED);
127     #endif
128 
129     fwk_module_is_valid_element_id_ExpectAnyArgsAndReturn(true);
130 
131     mod_scmi_from_protocol_api_get_agent_id_ExpectAnyArgsAndReturn(FWK_SUCCESS);
132     mod_scmi_from_protocol_api_get_agent_id_ReturnThruPtr_agent_id(&agent_id);
133 
134     fwk_id_get_element_idx_ExpectAnyArgsAndReturn(CLOCK_DEV_IDX_VPU);
135     fwk_id_is_equal_ExpectAnyArgsAndReturn(true);
136 
137     __fwk_put_event_Stub(fwk_put_event_callback);
138 
139     status = to_protocol_api->message_handler((fwk_id_t)MOD_SCMI_PROTOCOL_ID_CLOCK, service_id,
140                                                (const uint32_t *)&payload,
141                                                payload_size_table[MOD_SCMI_CLOCK_RATE_SET],
142                                                MOD_SCMI_CLOCK_RATE_SET);
143 
144     TEST_ASSERT_EQUAL(FWK_SUCCESS, status);
145 }
146 
scmi_test_main(void)147 int scmi_test_main(void)
148 {
149     UNITY_BEGIN();
150     #if defined(BUILD_HAS_MOD_RESOURCE_PERMS)
151         RUN_TEST(test_function_set_rate);
152     #else
153         RUN_TEST(test_function_set_rate);
154     #endif
155     return UNITY_END();
156 }
157 
158 #if !defined(TEST_ON_TARGET)
main(void)159 int main(void)
160 {
161     return scmi_test_main();
162 }
163 #endif
164