From 1ce3030499f5cbb5ad38abee1037ae9c34ab03ee Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Tue, 5 Nov 2019 22:43:45 +0100 Subject: [PATCH 1/7] [PR-114] log: discard non standard %e format Prior this change was %e a valid format for printing error codes as strings when identified. This change removes such support and replace use of %e with use of standard format identifier and a error code to string conversion function. With this change, any standard printf-like format comply with SCP-firmware traces implementation. fwk_status_str() helps traces to get nice string identifiers for errors. This change updates few impacted modules. Change tracked as https://github.com/ARM-software/SCP-firmware/pull/114. Signed-off-by: Etienne Carriere --- framework/include/fwk_status.h | 9 ++++ framework/src/Makefile | 1 + framework/src/fwk_status.c | 52 +++++++++++++++++++ module/log/include/mod_log.h | 1 - module/log/src/mod_log.c | 39 -------------- module/power_domain/src/mod_power_domain.c | 12 ++--- module/scmi/src/mod_scmi.c | 8 +-- .../src/mod_scmi_power_domain.c | 4 +- 8 files changed, 75 insertions(+), 51 deletions(-) create mode 100644 framework/src/fwk_status.c diff --git a/framework/include/fwk_status.h b/framework/include/fwk_status.h index 67ff54364..364d5be93 100644 --- a/framework/include/fwk_status.h +++ b/framework/include/fwk_status.h @@ -81,6 +81,15 @@ /*! Unrecoverable error */ #define FWK_E_PANIC -18 +/*! + * \brief Return a human readable string representation of a status code. + * + * \param status Status code value. + * + * \return String representation of \p status + */ +const char *fwk_status_str(int status); + /*! * @} */ diff --git a/framework/src/Makefile b/framework/src/Makefile index 91ec78b2c..4cbf903ef 100644 --- a/framework/src/Makefile +++ b/framework/src/Makefile @@ -23,6 +23,7 @@ endif ifeq ($(BUILD_HAS_NOTIFICATION),yes) BS_LIB_SOURCES += fwk_notification.c endif +BS_LIB_SOURCES += fwk_status.c BS_LIB_INCLUDES += $(ARCH_DIR)/include BS_LIB_INCLUDES += $(FWK_DIR)/include diff --git a/framework/src/fwk_status.c b/framework/src/fwk_status.c new file mode 100644 index 000000000..c54d11d94 --- /dev/null +++ b/framework/src/fwk_status.c @@ -0,0 +1,52 @@ +/* + * Arm SCP/MCP Software + * Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Description: + * Framework status code helpers. + */ + +#include +#include + +static const char * const error_string[] = { + [-FWK_E_PARAM] = "E_PARAM", + [-FWK_E_ALIGN] = "E_ALIGN", + [-FWK_E_SIZE] = "E_SIZE", + [-FWK_E_HANDLER] = "E_HANDLER", + [-FWK_E_ACCESS] = "E_ACCESS", + [-FWK_E_RANGE] = "E_RANGE", + [-FWK_E_TIMEOUT] = "E_TIMEOUT", + [-FWK_E_NOMEM] = "E_NOMEM", + [-FWK_E_PWRSTATE] = "E_PWRSTATE", + [-FWK_E_SUPPORT] = "E_SUPPORT", + [-FWK_E_DEVICE] = "E_DEVICE", + [-FWK_E_BUSY] = "E_BUSY", + [-FWK_E_OS] = "E_OS", + [-FWK_E_DATA] = "E_DATA", + [-FWK_E_STATE] = "E_STATE", + [-FWK_E_INIT] = "E_INIT", + [-FWK_E_OVERWRITTEN] = "E_OVERWRITTEN", + [-FWK_E_PANIC] = "E_PANIC", +}; + +static const char * const status_string[] = { + [FWK_SUCCESS] = "SUCCESS", + [FWK_PENDING] = "PENDING", +}; + +const char *fwk_status_str(int status) +{ + static const char unknown[] = "unknown"; + + unsigned int error_idx = (unsigned int)(-status); + + if ((status < 0) && (error_idx < FWK_ARRAY_SIZE(error_string))) + return error_string[error_idx]; + else if ((status >= 0) && (status < (int)FWK_ARRAY_SIZE(status_string))) + return status_string[status]; + + return unknown; +} diff --git a/module/log/include/mod_log.h b/module/log/include/mod_log.h index 1df66d0ba..540949aaf 100644 --- a/module/log/include/mod_log.h +++ b/module/log/include/mod_log.h @@ -146,7 +146,6 @@ struct mod_log_api { * * \%s - string format * * \%u - unsigned 32-bit decimal format * * \%x - 32-bit hexadecimal format - * * \%e - framework error code format * * Numeric formats also accept a padding flag '0\' between the * '\%' and the format specifier where the resulting string number will diff --git a/module/log/src/mod_log.c b/module/log/src/mod_log.c index 7cf510917..60bd74bda 100644 --- a/module/log/src/mod_log.c +++ b/module/log/src/mod_log.c @@ -25,28 +25,6 @@ static struct mod_log_driver_api *log_driver; MOD_LOG_GROUP_INFO | \ MOD_LOG_GROUP_WARNING) -static const char * const errstr[] = { - [FWK_SUCCESS] = "SUCCESS", - [-FWK_E_PARAM] = "E_PARAM", - [-FWK_E_ALIGN] = "E_ALIGN", - [-FWK_E_SIZE] = "E_SIZE", - [-FWK_E_HANDLER] = "E_HANDLER", - [-FWK_E_ACCESS] = "E_ACCESS", - [-FWK_E_RANGE] = "E_RANGE", - [-FWK_E_TIMEOUT] = "E_TIMEOUT", - [-FWK_E_NOMEM] = "E_NOMEM", - [-FWK_E_PWRSTATE] = "E_PWRSTATE", - [-FWK_E_SUPPORT] = "E_SUPPORT", - [-FWK_E_DEVICE] = "E_DEVICE", - [-FWK_E_BUSY] = "E_BUSY", - [-FWK_E_OS] = "E_OS", - [-FWK_E_DATA] = "E_DATA", - [-FWK_E_STATE] = "E_STATE", - [-FWK_E_INIT] = "E_INIT", - [-FWK_E_OVERWRITTEN] = "E_OVERWRITTEN", - [-FWK_E_PANIC] = "E_PANIC", -}; - static int do_putchar(char c) { int status; @@ -141,23 +119,6 @@ static int do_print(const char *fmt, va_list *args) next_symbol: /* Check the format specifier */ switch (*fmt) { - case 'e': - num = va_arg(*args, int); - unum = (uint64_t)(-num); - if ((num <= 0) && (unum < FWK_ARRAY_SIZE(errstr))) { - - status = print_string("FWK_"); - if (status != FWK_SUCCESS) - return status; - - status = print_string(errstr[unum]); - } else - status = print_int32(num, 0); - - if (status != FWK_SUCCESS) - return status; - break; - case 'i': /* Fall through to next one */ case 'd': if (bit64) diff --git a/module/power_domain/src/mod_power_domain.c b/module/power_domain/src/mod_power_domain.c index ce135351a..6f1bb961e 100644 --- a/module/power_domain/src/mod_power_domain.c +++ b/module/power_domain/src/mod_power_domain.c @@ -294,7 +294,7 @@ static const unsigned int mod_pd_cs_level_state_shift[MOD_PD_LEVEL_COUNT] = { * Internal variables */ static struct mod_pd_ctx mod_pd_ctx; -static const char driver_error_msg[] = "[PD] Driver error %e in %s @%d\n"; +static const char driver_error_msg[] = "[PD] Driver error %s (%d) in %s @%d\n"; static const unsigned int tree_pos_level_shift[MOD_PD_LEVEL_COUNT] = { MOD_PD_TREE_POS_LEVEL_0_SHIFT, @@ -711,9 +711,9 @@ static int initiate_power_state_transition(struct pd_ctx *pd) status = pd->driver_api->set_state(pd->driver_id, state); mod_pd_ctx.log_api->log(MOD_LOG_GROUP_DEBUG, - "[PD] %s: %s->%s, %e\n", fwk_module_get_name(pd->id), + "[PD] %s: %s->%s, %s (%d)\n", fwk_module_get_name(pd->id), get_state_name(pd, pd->state_requested_to_driver), - get_state_name(pd, state), status); + get_state_name(pd, state), fwk_status_str(status), status); pd->state_requested_to_driver = state; @@ -1208,8 +1208,8 @@ static void process_system_shutdown_request( if (status != FWK_SUCCESS) mod_pd_ctx.log_api->log(MOD_LOG_GROUP_ERROR, - "[PD] Shutdown of %s returned %e\n", - fwk_module_get_name(pd_id), status); + "[PD] Shutdown of %s returned %s (%d)\n", + fwk_module_get_name(pd_id), fwk_status_str(status), status); else mod_pd_ctx.log_api->log(MOD_LOG_GROUP_DEBUG, "[PD] %s shutdown\n", fwk_module_get_name(pd_id)); @@ -1795,7 +1795,7 @@ static int pd_start(fwk_id_t id) status = pd->driver_api->get_state(pd->driver_id, &state); if (status != FWK_SUCCESS) { mod_pd_ctx.log_api->log(MOD_LOG_GROUP_ERROR, driver_error_msg, - status, __func__, __LINE__); + fwk_status_str(status), status, __func__, __LINE__); } else { pd->requested_state = pd->state_requested_to_driver = state; diff --git a/module/scmi/src/mod_scmi.c b/module/scmi/src/mod_scmi.c index b6e18500f..11be9fe33 100644 --- a/module/scmi/src/mod_scmi.c +++ b/module/scmi/src/mod_scmi.c @@ -265,7 +265,8 @@ static void respond(fwk_id_t service_id, const void *payload, size_t size) status = ctx->respond(ctx->transport_id, payload, size); if (status != FWK_SUCCESS) scmi_ctx.log_api->log(MOD_LOG_GROUP_ERROR, - "[SCMI] Failed to send response (%e)\n", status); + "[SCMI] Failed to send response %s (%d)\n", + fwk_status_str(status), status); } static const struct mod_scmi_from_protocol_api mod_scmi_from_protocol_api = { @@ -790,8 +791,9 @@ static int scmi_process_event(const struct fwk_event *event, if (status != FWK_SUCCESS) { scmi_ctx.log_api->log(MOD_LOG_GROUP_ERROR, - "[SCMI] Protocol 0x%x handler error (%e), message_id = 0x%x\n", - ctx->scmi_protocol_id, status, ctx->scmi_message_id); + "[SCMI] Protocol 0x%x handler error %s (%d), message_id = 0x%x\n", + ctx->scmi_protocol_id, fwk_status_str(status), status, + ctx->scmi_message_id); } return FWK_SUCCESS; diff --git a/module/scmi_power_domain/src/mod_scmi_power_domain.c b/module/scmi_power_domain/src/mod_scmi_power_domain.c index 92f10407b..441e9677d 100644 --- a/module/scmi_power_domain/src/mod_scmi_power_domain.c +++ b/module/scmi_power_domain/src/mod_scmi_power_domain.c @@ -290,8 +290,8 @@ static int scmi_power_scp_set_core_state(fwk_id_t pd_id, composite_state); if (status != FWK_SUCCESS) { scmi_pd_ctx.log_api->log(MOD_LOG_GROUP_ERROR, - "[SCMI:power] Failed to send core set request (error %e)\n", - status); + "[SCMI:power] Failed to send core set request (error %s (%d))\n", + fwk_status_str(status), status); } return status; -- GitLab From ba7740ac205ce0e1bed4aac2b4bf5dcaa79dd4cd Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Wed, 6 Nov 2019 07:58:18 +0100 Subject: [PATCH 2/7] module/log: support for OP-TEE when BUILD_OPTEE This change modifies module log to support OP-TEE traces. It could be slip in 3 commits. Changes do_print() API to support OP-TEE, passing group info to local do_print() which leverage OP-TEE implementation of trace levels. Changes log module implementation to support a log device without any configuration data which appends when BUILD_OPTEE is enabled where no backend driver configuration is expected. Implements specific do_print() and do_flush() when BUILD_OPTEE is enabled. Module traces are printed through OP-TEE trace_vprintf() with a trace level converted from the log group ID. do_flush() calls OP-TEE console_flush(). Signed-off-by: Etienne Carriere --- module/log/src/mod_log.c | 57 +++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/module/log/src/mod_log.c b/module/log/src/mod_log.c index 60bd74bda..cd1d7a217 100644 --- a/module/log/src/mod_log.c +++ b/module/log/src/mod_log.c @@ -17,6 +17,11 @@ #include #include +#ifdef BUILD_OPTEE +#include +#include +#endif + static const struct mod_log_config *log_config; static struct mod_log_driver_api *log_driver; @@ -25,6 +30,31 @@ static struct mod_log_driver_api *log_driver; MOD_LOG_GROUP_INFO | \ MOD_LOG_GROUP_WARNING) +#ifdef BUILD_OPTEE +static int do_print(enum mod_log_group group, const char *fmt, va_list *args) +{ +#if TRACE_LEVEL > 0 + int level = TRACE_DEBUG; + + switch (group) { + case MOD_LOG_GROUP_ERROR: + level = TRACE_ERROR; + break; + case MOD_LOG_GROUP_INFO: + case MOD_LOG_GROUP_WARNING: + level = TRACE_INFO; + break; + case MOD_LOG_GROUP_DEBUG: + default: + break; + } + + trace_vprintf("[scmi-server]", 0, level, true, fmt, *args); +#endif + + return 0; +} +#else /* BUILD_OPTEE */ static int do_putchar(char c) { int status; @@ -101,7 +131,8 @@ static int print_string(const char *str) return FWK_SUCCESS; } -static int do_print(const char *fmt, va_list *args) +static int do_print(enum mod_log_group group __unused, + const char *fmt, va_list *args) { int status; int bit64; @@ -190,6 +221,7 @@ next_symbol: return FWK_SUCCESS; } +#endif /* BUILD_OPTEE */ static bool is_valid_group(unsigned int group) { @@ -215,7 +247,7 @@ static int do_log(enum mod_log_group group, const char *fmt, ...) va_list args; /* API called too early */ - if (log_driver == NULL) + if ((log_config != NULL) && (log_driver == NULL)) return FWK_E_STATE; status = fwk_module_check_call(FWK_ID_MODULE(FWK_MODULE_IDX_LOG)); @@ -228,9 +260,9 @@ static int do_log(enum mod_log_group group, const char *fmt, ...) if (fmt == NULL) return FWK_E_PARAM; - if (group & log_config->log_groups) { + if ((log_config == NULL) || (group & log_config->log_groups)) { va_start(args, fmt); - status = do_print(fmt, &args); + status = do_print(group, fmt, &args); va_end(args); if (status != FWK_SUCCESS) @@ -240,12 +272,20 @@ static int do_log(enum mod_log_group group, const char *fmt, ...) return FWK_SUCCESS; } +#ifdef BUILD_OPTEE +static int do_flush(void) +{ + console_flush(); + + return FWK_SUCCESS; +} +#else static int do_flush(void) { int status; /* API called too early */ - if (log_driver == NULL) + if ((log_config != NULL) && (log_driver == NULL)) return FWK_E_STATE; status = fwk_module_check_call(FWK_ID_MODULE(FWK_MODULE_IDX_LOG)); @@ -258,6 +298,7 @@ static int do_flush(void) return FWK_SUCCESS; } +#endif static const struct mod_log_api module_api = { .log = do_log, @@ -277,7 +318,7 @@ static int log_init(fwk_id_t module_id, unsigned int element_count, return FWK_E_DATA; /* Check for invalid groups in the 'log_groups' mask */ - if (config->log_groups & ~ALL_GROUPS_MASK) + if (config && (config->log_groups & ~ALL_GROUPS_MASK)) return FWK_E_PARAM; log_config = config; @@ -294,6 +335,10 @@ static int log_bind(fwk_id_t id, unsigned int round) if (round == 1) return FWK_SUCCESS; + /* No expected driver => we're done */ + if (log_config == NULL) + return FWK_SUCCESS; + /* Get the device driver's API */ status = fwk_module_bind(log_config->device_id, log_config->api_id, -- GitLab From 9f1035c34b4ed35467a0b93e68590467566bebc0 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Tue, 5 Nov 2019 23:08:14 +0100 Subject: [PATCH 3/7] module/clock: simplify functions exit in framework Few occurrences of return sequences that can be shorten. Signed-off-by: Etienne Carriere --- module/clock/src/mod_clock.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/module/clock/src/mod_clock.c b/module/clock/src/mod_clock.c index 9622e056b..dafc1106a 100644 --- a/module/clock/src/mod_clock.c +++ b/module/clock/src/mod_clock.c @@ -191,10 +191,8 @@ static int clock_set_rate(fwk_id_t clock_id, uint64_t rate, status = ctx->api->set_rate(ctx->config->driver_id, rate, round_mode); if (status == FWK_PENDING) return create_async_request(ctx, clock_id); - else if (status == FWK_SUCCESS) - return FWK_SUCCESS; - else - return status; + + return status; } static int clock_get_rate(fwk_id_t clock_id, uint64_t *rate) @@ -216,10 +214,8 @@ static int clock_get_rate(fwk_id_t clock_id, uint64_t *rate) status = ctx->api->get_rate(ctx->config->driver_id, rate); if (status == FWK_PENDING) return create_async_request(ctx, clock_id); - else if (status == FWK_SUCCESS) - return FWK_SUCCESS; - else - return status; + + return status; } static int clock_get_rate_from_index(fwk_id_t clock_id, unsigned int rate_index, @@ -255,10 +251,8 @@ static int clock_set_state(fwk_id_t clock_id, enum mod_clock_state state) status = ctx->api->set_state(ctx->config->driver_id, state); if (status == FWK_PENDING) return create_async_request(ctx, clock_id); - else if (status == FWK_SUCCESS) - return FWK_SUCCESS; - else - return status; + + return status; } static int clock_get_state(fwk_id_t clock_id, enum mod_clock_state *state) @@ -280,10 +274,8 @@ static int clock_get_state(fwk_id_t clock_id, enum mod_clock_state *state) status = ctx->api->get_state(ctx->config->driver_id, state); if (status == FWK_PENDING) return create_async_request(ctx, clock_id); - else if (status == FWK_SUCCESS) - return FWK_SUCCESS; - else - return status; + + return status; } static int clock_get_info(fwk_id_t clock_id, struct mod_clock_info *info) -- GitLab From 04ec5263985813c9676a99714fd53dc01ade46fc Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Wed, 6 Nov 2019 08:00:41 +0100 Subject: [PATCH 4/7] module/clock: allow build without notification support When not using notification (BUILD_HAS_NOTIFICATION is not define), module clock does not need configuration data and may not embed related API. This change makes BUILD_HAS_NOTIFICATION conditioning related resources. This change also changes few indentation and a pre-decrement instruction to ease source code readability. Signed-off-by: Etienne Carriere --- module/clock/src/mod_clock.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/module/clock/src/mod_clock.c b/module/clock/src/mod_clock.c index dafc1106a..88bb34bb2 100644 --- a/module/clock/src/mod_clock.c +++ b/module/clock/src/mod_clock.c @@ -25,6 +25,7 @@ struct clock_dev_ctx { /* Driver API */ struct mod_clock_drv_api *api; +#ifdef BUILD_HAS_NOTIFICATION /* Cookie for the pre-transition notification response */ unsigned int pd_pre_power_transition_notification_cookie; @@ -33,6 +34,7 @@ struct clock_dev_ctx { /* Status of the pending transition */ unsigned int transition_pending_response_status; +#endif /* A request is on-going */ bool is_request_ongoing; @@ -133,6 +135,7 @@ static int get_ctx(fwk_id_t clock_id, struct clock_dev_ctx **ctx) return FWK_SUCCESS; } +#if defined(BUILD_HAS_NOTIFICATION) /* * Driver response API. */ @@ -169,6 +172,7 @@ void request_complete(fwk_id_t dev_id, static struct mod_clock_driver_response_api clock_driver_response_api = { .request_complete = request_complete, }; +#endif /* * Module API functions @@ -320,8 +324,10 @@ static int clock_init(fwk_id_t module_id, unsigned int element_count, if (element_count == 0) return FWK_SUCCESS; +#ifdef BUILD_HAS_NOTIFICATION if (config == NULL) return FWK_E_PARAM; +#endif module_ctx.config = config; module_ctx.dev_ctx_table = fwk_mm_calloc(element_count, @@ -365,7 +371,9 @@ static int clock_bind(fwk_id_t id, unsigned int round) static int clock_start(fwk_id_t id) { +#ifdef BUILD_HAS_NOTIFICATION int status; +#endif struct clock_dev_ctx *ctx; /* Nothing to be done at the module level */ @@ -377,6 +385,7 @@ static int clock_start(fwk_id_t id) if (fwk_id_is_type(ctx->config->pd_source_id, FWK_ID_TYPE_NONE)) return FWK_SUCCESS; +#ifdef BUILD_HAS_NOTIFICATION if ((ctx->api->process_power_transition != NULL) && (fwk_id_is_type( module_ctx.config->pd_transition_notification_id, @@ -400,6 +409,7 @@ static int clock_start(fwk_id_t id) if (status != FWK_SUCCESS) return status; } +#endif return FWK_SUCCESS; } @@ -408,7 +418,9 @@ static int clock_process_bind_request(fwk_id_t source_id, fwk_id_t target_id, fwk_id_t api_id, const void **api) { enum mod_clock_api_type api_type = fwk_id_get_api_idx(api_id); +#ifdef BUILD_HAS_NOTIFICATION struct clock_dev_ctx *ctx; +#endif switch (api_type) { case MOD_CLOCK_API_TYPE_HAL: @@ -416,6 +428,7 @@ static int clock_process_bind_request(fwk_id_t source_id, fwk_id_t target_id, return FWK_SUCCESS; +#if defined(BUILD_HAS_NOTIFICATION) case MOD_CLOCK_API_TYPE_DRIVER_RESPONSE: if (!fwk_id_is_type(target_id, FWK_ID_TYPE_ELEMENT)) return FWK_E_PARAM; @@ -428,12 +441,15 @@ static int clock_process_bind_request(fwk_id_t source_id, fwk_id_t target_id, return FWK_E_ACCESS; return FWK_SUCCESS; +#endif default: return FWK_E_ACCESS; } } +#ifdef BUILD_HAS_NOTIFICATION + static int clock_process_pd_pre_transition_notification( struct clock_dev_ctx *ctx, const struct fwk_event *event, @@ -538,9 +554,8 @@ static int clock_process_pd_transition_notification( return FWK_SUCCESS; } -static int clock_process_notification_response( - struct clock_dev_ctx *ctx, - const struct fwk_event *event) +static int clock_process_notification_response(struct clock_dev_ctx *ctx, + const struct fwk_event *event) { struct clock_state_change_pending_resp_params *resp_params; struct mod_pd_power_state_pre_transition_notification_resp_params @@ -574,7 +589,8 @@ static int clock_process_notification_response( if (resp_params->status != FWK_SUCCESS) ctx->transition_pending_response_status = resp_params->status; - if ((--(ctx->transition_pending_notifications_sent)) == 0) { + ctx->transition_pending_notifications_sent--; + if (ctx->transition_pending_notifications_sent == 0) { /* * If this is the final response then the response to the power domain * notification can be sent. @@ -609,11 +625,12 @@ static int clock_process_notification( return clock_process_pd_transition_notification(ctx, event); else if (fwk_id_is_equal(event->id, module_ctx.config->pd_pre_transition_notification_id)) - return clock_process_pd_pre_transition_notification( - ctx, event, resp_event); + return clock_process_pd_pre_transition_notification(ctx, event, + resp_event); else return FWK_E_HANDLER; } +#endif /* BUILD_HAS_NOTIFICATION */ static int clock_process_event(const struct fwk_event *event, struct fwk_event *resp_event) @@ -640,12 +657,16 @@ const struct fwk_module module_clock = { .type = FWK_MODULE_TYPE_HAL, .api_count = MOD_CLOCK_API_COUNT, .event_count = CLOCK_EVENT_IDX_COUNT, +#ifdef BUILD_HAS_NOTIFICATION .notification_count = MOD_CLOCK_NOTIFICATION_IDX_COUNT, +#endif .init = clock_init, .element_init = clock_dev_init, .bind = clock_bind, .start = clock_start, .process_bind_request = clock_process_bind_request, +#ifdef BUILD_HAS_NOTIFICATION .process_notification = clock_process_notification, +#endif .process_event = clock_process_event, }; -- GitLab From d7d7939e24021e919c4dccdbee744869f526c2b9 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Wed, 6 Nov 2019 08:06:12 +0100 Subject: [PATCH 5/7] module clock: add missing casts, fix include path and indentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds missing cast unless what compiler complains with an error trace like below. core/scmi-server/SCP-firmware/module/clock/src/mod_clock.c: In function ‘process_response_event’: core/scmi-server/SCP-firmware/module/clock/src/mod_clock.c:67:9: warning: cast increases required alignment of target type [-Wcast-align] (struct mod_clock_driver_resp_params *)event->params; ^ core/scmi-server/SCP-firmware/module/clock/src/mod_clock.c:69:9: warning: cast increases required alignment of target type [-Wcast-align] (struct mod_clock_resp_params *)resp_event.params; ^ core/scmi-server/SCP-firmware/module/clock/src/mod_clock.c:149:9: warning: cast increases required alignment of target type [-Wcast-align] (struct mod_clock_driver_resp_params *)event.params; ^ Change request_complete() to static scope to fix builld issue reported by toolchain with trace like below. core/scmi-server/SCP-firmware/module/clock/src/mod_clock.c:142:6: warning: no previous prototype for ‘request_complete’ [-Wmissing-prototypes] void request_complete(fwk_id_t dev_id, ^~~~~~~~~~~~~~~~ Fixes include directory for clock.h which is found from local source directory not from the include path. Issue reported by toolchain with error trace like below: core/scmi-server/SCP-firmware/module/clock/src/mod_clock.c:18:10: fatal error: clock.h: No such file or directory #include ^~~~~~~~~ Corrects 2 indentations. Signed-off-by: Etienne Carriere --- module/clock/src/mod_clock.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/module/clock/src/mod_clock.c b/module/clock/src/mod_clock.c index 88bb34bb2..a5ed1f8cb 100644 --- a/module/clock/src/mod_clock.c +++ b/module/clock/src/mod_clock.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include "clock.h" /* Device context */ struct clock_dev_ctx { @@ -64,9 +64,9 @@ static int process_response_event(const struct fwk_event *event) struct fwk_event resp_event; struct clock_dev_ctx *ctx; struct mod_clock_driver_resp_params *event_params = - (struct mod_clock_driver_resp_params *)event->params; + (struct mod_clock_driver_resp_params *)(void *)event->params; struct mod_clock_resp_params *resp_params = - (struct mod_clock_resp_params *)resp_event.params; + (struct mod_clock_resp_params *)(void *)resp_event.params; ctx = &module_ctx.dev_ctx_table[fwk_id_get_element_idx(event->target_id)]; @@ -140,14 +140,14 @@ static int get_ctx(fwk_id_t clock_id, struct clock_dev_ctx **ctx) * Driver response API. */ -void request_complete(fwk_id_t dev_id, - struct mod_clock_driver_resp_params *response) +static void request_complete(fwk_id_t dev_id, + struct mod_clock_driver_resp_params *response) { int status; struct fwk_event event; struct clock_dev_ctx *ctx; struct mod_clock_driver_resp_params *event_params = - (struct mod_clock_driver_resp_params *)event.params; + (struct mod_clock_driver_resp_params *)(void *)event.params; fwk_assert(fwk_module_is_valid_element_id(dev_id)); @@ -626,7 +626,7 @@ static int clock_process_notification( else if (fwk_id_is_equal(event->id, module_ctx.config->pd_pre_transition_notification_id)) return clock_process_pd_pre_transition_notification(ctx, event, - resp_event); + resp_event); else return FWK_E_HANDLER; } -- GitLab From be1d1bf8ef1802cdaa8f8fcfae3b4d430a9da430 Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Wed, 6 Nov 2019 08:03:19 +0100 Subject: [PATCH 6/7] module/scmi_clock: indentation fixup Corrects minor indentation issues to ease code readability. Signed-off-by: Etienne Carriere --- module/scmi_clock/src/mod_scmi_clock.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/module/scmi_clock/src/mod_scmi_clock.c b/module/scmi_clock/src/mod_scmi_clock.c index d2560b897..dfccb68c9 100644 --- a/module/scmi_clock/src/mod_scmi_clock.c +++ b/module/scmi_clock/src/mod_scmi_clock.c @@ -538,7 +538,9 @@ static int scmi_clock_attributes_handler(fwk_id_t service_id, exit: response_size = (return_values.status == SCMI_SUCCESS) ? sizeof(return_values) : sizeof(return_values.status); + scmi_clock_ctx.scmi_api->respond(service_id, &return_values, response_size); + return status; } @@ -991,9 +993,8 @@ static int scmi_clock_init(fwk_id_t module_id, unsigned int element_count, return FWK_E_PANIC; /* Allocate a table of clock operations */ - scmi_clock_ctx.clock_ops = - fwk_mm_calloc((unsigned int)clock_devices, - sizeof(struct mod_clock_api)); + scmi_clock_ctx.clock_ops = fwk_mm_calloc((unsigned int)clock_devices, + sizeof(struct mod_clock_api)); if (scmi_clock_ctx.clock_ops == NULL) return FWK_E_NOMEM; @@ -1075,10 +1076,8 @@ static int process_request_event(const struct fwk_event *event) rate = (uint64_t)set_rate_data.rate[0] + (((uint64_t)set_rate_data.rate[1]) << 32); - status = - scmi_clock_ctx.clock_api->set_rate(params->clock_dev_id, - rate, - set_rate_data.round_mode); + status = scmi_clock_ctx.clock_api->set_rate(params->clock_dev_id, rate, + set_rate_data.round_mode); if (status != FWK_PENDING) { /* Request completed */ set_request_respond(service_id, status); @@ -1134,7 +1133,7 @@ static int process_response_event(const struct fwk_event *event) clock_state = params->value.state; get_state_respond(event->source_id, service_id, &clock_state, - FWK_SUCCESS); + FWK_SUCCESS); break; -- GitLab From 5afef4c977aacfdc7d645dbf07e9bb6152728a0e Mon Sep 17 00:00:00 2001 From: Etienne Carriere Date: Wed, 6 Nov 2019 08:07:50 +0100 Subject: [PATCH 7/7] module/scmi_clock: fix missing casts Add cast unless which compiler complains with an errors trace like below. core/scmi-server/SCP-firmware/module/scmi_clock/src/mod_scmi_clock.c:355:14: warning: cast increases required alignment of target type [-Wcast-align] params = (struct event_request_params *)event.params; ^ core/scmi-server/SCP-firmware/module/scmi_clock/src/mod_scmi_clock.c:1047:14: warning: cast increases required alignment of target type [-Wcast-align] params = (struct event_request_params *)event->params; ^ core/scmi-server/SCP-firmware/module/scmi_clock/src/mod_scmi_clock.c:1116:9: warning: cast increases required alignment of target type [-Wcast-align] (struct mod_clock_resp_params *)event->params; ^ Signed-off-by: Etienne Carriere --- module/scmi_clock/src/mod_scmi_clock.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/module/scmi_clock/src/mod_scmi_clock.c b/module/scmi_clock/src/mod_scmi_clock.c index dfccb68c9..1dc4ffed3 100644 --- a/module/scmi_clock/src/mod_scmi_clock.c +++ b/module/scmi_clock/src/mod_scmi_clock.c @@ -352,7 +352,7 @@ static int create_event_request(fwk_id_t clock_id, .target_id = fwk_module_id_scmi_clock, }; - params = (struct event_request_params *)event.params; + params = (struct event_request_params *)(void *)event.params; switch (request) { case SCMI_CLOCK_REQUEST_GET_STATE: @@ -366,7 +366,7 @@ static int create_event_request(fwk_id_t clock_id, case SCMI_CLOCK_REQUEST_SET_RATE: { struct event_set_rate_request_data *rate_data = - (struct event_set_rate_request_data *)data; + (struct event_set_rate_request_data *)(void *)data; request_data.set_rate_data.rate[0] = rate_data->rate[0]; request_data.set_rate_data.rate[1] = rate_data->rate[1]; @@ -381,7 +381,7 @@ static int create_event_request(fwk_id_t clock_id, case SCMI_CLOCK_REQUEST_SET_STATE: { struct event_set_state_request_data *state_data = - (struct event_set_state_request_data *)data; + (struct event_set_state_request_data *)(void *)data; request_data.set_state_data.state = state_data->state; params->request_data = request_data; @@ -1044,7 +1044,7 @@ static int process_request_event(const struct fwk_event *event) struct event_set_state_request_data set_state_data; fwk_id_t service_id; - params = (struct event_request_params *)event->params; + params = (struct event_request_params *)(void *)event->params; clock_dev_idx = fwk_id_get_element_idx(params->clock_dev_id); service_id = clock_ops_get_service(clock_dev_idx); @@ -1113,7 +1113,7 @@ static int process_request_event(const struct fwk_event *event) static int process_response_event(const struct fwk_event *event) { struct mod_clock_resp_params *params = - (struct mod_clock_resp_params *)event->params; + (struct mod_clock_resp_params *)(void *)event->params; unsigned int clock_dev_idx; fwk_id_t service_id; enum scmi_clock_request_type request; -- GitLab