From fbaad348109417621b8c83331923ac56fc08bea0 Mon Sep 17 00:00:00 2001 From: Md Golam Tanvir Zim Date: Wed, 18 Dec 2024 11:37:34 +0000 Subject: [PATCH] scmi_clock: Fix clock indexing in device table In some instances while accessing the clock device table, the device index is used instead of scmi index. This patch fixes those. Signed-off-by: Md Golam Tanvir Zim Change-Id: I7c7981f0af4cdd468f68e380e99f9db6beabf67a --- module/scmi_clock/src/mod_scmi_clock.c | 70 ++++++++++--------- module/scmi_clock/test/config_scmi_clock.h | 1 + .../test/mod_scmi_clock_unit_test.c | 43 +++++++----- 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/module/scmi_clock/src/mod_scmi_clock.c b/module/scmi_clock/src/mod_scmi_clock.c index 21f6603c5..633fb6f50 100644 --- a/module/scmi_clock/src/mod_scmi_clock.c +++ b/module/scmi_clock/src/mod_scmi_clock.c @@ -527,13 +527,35 @@ static inline bool clock_ops_is_available(unsigned int clock_dev_idx) static inline bool clock_has_extended_name( unsigned int agent_id, - unsigned int clock_dev_idx) + unsigned int scmi_clock_idx) { return scmi_clock_ctx.agent_table[agent_id] - .device_table[clock_dev_idx] + .device_table[scmi_clock_idx] .supports_extended_name; } +static int find_agent_scmi_clock_idx( + unsigned int agent_id, + fwk_id_t clock_id, + unsigned int *clock_scmi_idx) +{ + unsigned int clock_dev_idx; + const struct mod_scmi_clock_agent *agent; + + clock_dev_idx = fwk_id_get_element_idx(clock_id); + agent = &scmi_clock_ctx.agent_table[agent_id]; + + /* Find the scmi clock index for the agent. */ + for (unsigned int idx = 0; idx < (unsigned int)agent->device_count; idx++) { + if (fwk_id_get_element_idx(agent->device_table[idx].element_id) == + clock_dev_idx) { + *clock_scmi_idx = idx; + return FWK_SUCCESS; + } + } + return FWK_E_DATA; +} + /* * Helper for the 'clock_attributes' response */ @@ -545,7 +567,7 @@ static void clock_attributes_respond( { int respond_status; bool has_extended_name = false; - unsigned int agent_id, clock_dev_idx; + unsigned int agent_id, scmi_clock_idx; size_t response_size; const struct mod_scmi_clock_agent *agent; struct scmi_clock_attributes_p2a return_values = { 0 }; @@ -553,20 +575,26 @@ static void clock_attributes_respond( bool supports_rate_change_requested_notification = false; if (status == FWK_SUCCESS) { - clock_dev_idx = fwk_id_get_element_idx(clock_dev_id); status = scmi_clock_ctx.scmi_api->get_agent_id(service_id, &agent_id); if (status != FWK_SUCCESS) { FWK_LOG_DEBUG("[SCMI-CLK] %s @%d", __func__, __LINE__); } else { agent = &scmi_clock_ctx.agent_table[agent_id]; - has_extended_name = - agent->device_table[clock_dev_idx].supports_extended_name; + + status = find_agent_scmi_clock_idx( + agent_id, clock_dev_id, &scmi_clock_idx); + if (status != FWK_SUCCESS) { + FWK_LOG_DEBUG("[SCMI-CLK] %s @%d", __func__, __LINE__); + } else { + has_extended_name = + agent->device_table[scmi_clock_idx].supports_extended_name; #ifdef BUILD_HAS_SCMI_NOTIFICATIONS - supports_rate_change_requested_notification = - agent->device_table[clock_dev_idx].notify_requested_rate; - supports_rate_changed_notification = - agent->device_table[clock_dev_idx].notify_changed_rate; + supports_rate_change_requested_notification = + agent->device_table[scmi_clock_idx].notify_requested_rate; + supports_rate_changed_notification = + agent->device_table[scmi_clock_idx].notify_changed_rate; #endif + } } return_values.attributes = SET_SCMI_CLOCK_ATTRIBUTES( @@ -2019,28 +2047,6 @@ static int scmi_clock_process_event(const struct fwk_event *event, #ifdef BUILD_HAS_SCMI_NOTIFICATIONS -static int find_agent_scmi_clock_idx( - unsigned int agent_id, - fwk_id_t clock_id, - unsigned int *clock_scmi_idx) -{ - unsigned int clock_dev_idx; - const struct mod_scmi_clock_agent *agent; - - clock_dev_idx = fwk_id_get_element_idx(clock_id); - agent = &scmi_clock_ctx.agent_table[agent_id]; - - /* Find the scmi clock index for the agent. */ - for (unsigned int idx = 0; idx < (unsigned int)agent->device_count; idx++) { - if (fwk_id_get_element_idx(agent->device_table[idx].element_id) == - clock_dev_idx) { - *clock_scmi_idx = idx; - return FWK_SUCCESS; - } - } - return FWK_E_DATA; -} - static void scmi_clock_rate_change_notify( enum scmi_clock_command_id command_id, enum scmi_clock_notification_id notification_message_id, diff --git a/module/scmi_clock/test/config_scmi_clock.h b/module/scmi_clock/test/config_scmi_clock.h index e12d3c14e..e64c49a2d 100644 --- a/module/scmi_clock/test/config_scmi_clock.h +++ b/module/scmi_clock/test/config_scmi_clock.h @@ -92,6 +92,7 @@ static const struct mod_scmi_clock_device agent_device_table_ospm1 .element_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_DEV_IDX_FAKE3), .starts_enabled = true, + .supports_extended_name = true, }, }; diff --git a/module/scmi_clock/test/mod_scmi_clock_unit_test.c b/module/scmi_clock/test/mod_scmi_clock_unit_test.c index 7dab13dec..8d568c6f0 100644 --- a/module/scmi_clock/test/mod_scmi_clock_unit_test.c +++ b/module/scmi_clock/test/mod_scmi_clock_unit_test.c @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -189,6 +190,13 @@ int fwk_put_event_callback(struct fwk_event *event, int numCalls) return FWK_SUCCESS; } +unsigned int get_element_idx_callback( + fwk_id_t clock_id, + int NumCalls) +{ + return clock_id.element.element_idx; +} + void test_function_set_rate(void) { int status; @@ -773,12 +781,19 @@ int clock_attributes_get_state_callback( size_t size, int NumCalls) { + uint32_t expected_attributes; struct scmi_clock_attributes_p2a *return_values; return_values = (struct scmi_clock_attributes_p2a *)payload; + bool extended_name = true, notify_rate = false, notify_requested_rate = false; + + expected_attributes = SET_SCMI_CLOCK_ATTRIBUTES(MOD_CLOCK_STATE_RUNNING, + extended_name, + notify_rate, + notify_requested_rate); + TEST_ASSERT_EQUAL((int32_t)SCMI_SUCCESS, return_values->status); - TEST_ASSERT_EQUAL( - (int32_t)MOD_CLOCK_STATE_RUNNING, return_values->attributes); + TEST_ASSERT_EQUAL(expected_attributes, return_values->attributes); return FWK_SUCCESS; } @@ -824,7 +839,7 @@ void test_mod_scmi_clock_attributes_handler_get_state(void) __fwk_put_event_ExpectAnyArgsAndReturn(FWK_SUCCESS); #endif - fwk_id_get_element_idx_ExpectAnyArgsAndReturn(CLOCK_DEV_IDX_FAKE0); + fwk_id_get_element_idx_Stub(get_element_idx_callback); status = scmi_clock_message_handler( (fwk_id_t)MOD_SCMI_PROTOCOL_ID_CLOCK, @@ -1066,9 +1081,12 @@ void test_process_request_event_get_state(void) int status; uint32_t agent_id = FAKE_SCMI_AGENT_IDX_OSPM0; struct fwk_event event; + struct scmi_clock_event_request_params *params; enum mod_clock_state expected_state = MOD_CLOCK_STATE_RUNNING; - fwk_id_get_element_idx_ExpectAnyArgsAndReturn(SCMI_CLOCK_OSPM0_IDX1); + params = (struct scmi_clock_event_request_params *)event.params; + params->clock_dev_id = (fwk_id_t) FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_DEV_IDX_FAKE1); + fwk_id_get_event_idx_ExpectAnyArgsAndReturn( SCMI_CLOCK_EVENT_IDX_CLOCK_ATTRIBUTES); mod_scmi_from_protocol_api_get_agent_id_ExpectAnyArgsAndReturn( @@ -1080,11 +1098,12 @@ void test_process_request_event_get_state(void) fwk_module_get_element_name_ExpectAnyArgsAndReturn(mock_clock_name); - fwk_id_get_element_idx_ExpectAnyArgsAndReturn(SCMI_CLOCK_OSPM0_IDX1); mod_scmi_from_protocol_api_get_agent_id_ExpectAnyArgsAndReturn( FWK_SUCCESS); mod_scmi_from_protocol_api_get_agent_id_ReturnThruPtr_agent_id(&agent_id); + fwk_id_get_element_idx_Stub(get_element_idx_callback); + mod_scmi_from_protocol_api_respond_Stub(get_state_callback_success); status = process_request_event(&event); @@ -1550,20 +1569,6 @@ int scmi_notification_notify_rate_changed_callback( return FWK_SUCCESS; } -unsigned int get_element_idx( - fwk_id_t clock_id -) -{ - return clock_id.element.element_idx; -} - -unsigned int get_element_idx_callback( - fwk_id_t clock_id, - int NumCalls) -{ - return get_element_idx(clock_id); -} - void test_mod_scmi_clock_process_notification_rate_changed(void) { int status; -- GitLab