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