diff options
author | Tushar Khandelwal <tushar.khandelwal@arm.com> | 2019-07-05 16:08:09 +0100 |
---|---|---|
committer | Tushar Khandelwal <tushar.khandelwal@arm.com> | 2019-09-04 11:37:10 +0100 |
commit | dcdab40635b39fb7b2cb24474060d0d4560cb2af (patch) | |
tree | 9db87d0afd7fcc0ce7f898db1ac1d8b5ef10242c | |
parent | 6f4663c671aed2ff2d88801c1cccd94de4339ead (diff) |
add event handler module for mailbox controller messages
Change-Id: Iab62f91ecfcf0f331675129c4359f2c008e7e65e
Signed-off-by: Tushar Khandelwal <tushar.khandelwal@arm.com>
-rw-r--r-- | framework/src/Makefile | 1 | ||||
-rw-r--r-- | product/corstone-700/firmware/config_eventhandler.c | 10 | ||||
-rw-r--r-- | product/corstone-700/firmware/firmware.mk | 6 | ||||
-rw-r--r-- | product/corstone-700/module/eventhandler/include/mod_eventhandler.h | 18 | ||||
-rw-r--r-- | product/corstone-700/module/eventhandler/src/Makefile | 10 | ||||
-rw-r--r-- | product/corstone-700/module/eventhandler/src/mod_eventhandler.c | 146 |
6 files changed, 189 insertions, 2 deletions
diff --git a/framework/src/Makefile b/framework/src/Makefile index c3df936..b83968e 100644 --- a/framework/src/Makefile +++ b/framework/src/Makefile @@ -29,5 +29,6 @@ BS_LIB_INCLUDES += $(FWK_DIR)/include BS_LIB_INCLUDES += $(FWK_DIR)/../module/mhuv2/include BS_LIB_INCLUDES += $(FWK_DIR)/../module/log/include BS_LIB_INCLUDES += $(FWK_DIR)/../product/corstone-700/include/ +BS_LIB_INCLUDES += $(FWK_DIR)/../product/corstone-700/module/eventhandler/include/ include $(BS_DIR)/lib.mk diff --git a/product/corstone-700/firmware/config_eventhandler.c b/product/corstone-700/firmware/config_eventhandler.c new file mode 100644 index 0000000..aa9656b --- /dev/null +++ b/product/corstone-700/firmware/config_eventhandler.c @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include <fwk_module.h> + +const struct fwk_module_config config_eventhandler = {}; diff --git a/product/corstone-700/firmware/firmware.mk b/product/corstone-700/firmware/firmware.mk index cdd374a..934e557 100644 --- a/product/corstone-700/firmware/firmware.mk +++ b/product/corstone-700/firmware/firmware.mk @@ -12,10 +12,12 @@ BS_FIRMWARE_HAS_OPENAMP := yes BS_FIRMWARE_MODULES := \ pl011 \ log \ - mhuv2 + mhuv2 \ + eventhandler BS_FIRMWARE_SOURCES := \ config_log.c \ - config_mhuv2.c + config_mhuv2.c \ + config_eventhandler.c include $(BS_DIR)/firmware.mk diff --git a/product/corstone-700/module/eventhandler/include/mod_eventhandler.h b/product/corstone-700/module/eventhandler/include/mod_eventhandler.h new file mode 100644 index 0000000..f59a7d1 --- /dev/null +++ b/product/corstone-700/module/eventhandler/include/mod_eventhandler.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef MOD_EVENTHANDLER_H +#define MOD_EVENTHANDLER_H + +#include <openamp/rpmsg_internal.h> +#include <stddef.h> + +struct mod_eventhandler_api { + int (*handleRpmsgEvent)(struct rpmsg_endpoint *ept, void *data, size_t len); +}; + +#endif /* MOD_eventhandler_H */
\ No newline at end of file diff --git a/product/corstone-700/module/eventhandler/src/Makefile b/product/corstone-700/module/eventhandler/src/Makefile new file mode 100644 index 0000000..1a04be1 --- /dev/null +++ b/product/corstone-700/module/eventhandler/src/Makefile @@ -0,0 +1,10 @@ +# +# Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +BS_LIB_NAME := eventhandler +BS_LIB_SOURCES := mod_eventhandler.c + +include $(BS_DIR)/lib.mk diff --git a/product/corstone-700/module/eventhandler/src/mod_eventhandler.c b/product/corstone-700/module/eventhandler/src/mod_eventhandler.c new file mode 100644 index 0000000..ff7d670 --- /dev/null +++ b/product/corstone-700/module/eventhandler/src/mod_eventhandler.c @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include <assert.h> +#include <fwk_module_idx.h> +#include <fwk_module.h> +#include <mod_log.h> +#include <mod_eventhandler.h> +#include <escm3_mmap.h> +#include <limits.h> +#include <openamp/rpmsg.h> +#include <openamp/rpmsg_client.h> + +const struct mod_log_api *log_api; + +/* MHU Test command syntax + bit 3 downto 0 : command + bit 31 downto 4 : value +*/ + +#define BITMASK(x) ((unsigned)-1 >> ((sizeof(int) * CHAR_BIT) - x)) +#define CMD_WIDTH 4 +#define COMMAND(message) (message & BITMASK(CMD_WIDTH)) +#define VALUE(message) ((unsigned)message >> CMD_WIDTH) +#define ENCODE(command, value) ((command & BITMASK(CMD_WIDTH)) | ((value) << CMD_WIDTH)) + +enum Command { + NONE, + INC_RETURN, // Increment the value and return the value to sender + INC_ECHO_SE, // increment, send to SE, make it increment and echo back + // to this ES + NUM_COMMANDS, +}; + +static int handleRpmsgEvent(struct rpmsg_endpoint *ept, void *data, size_t len){ + log_api->log(MOD_LOG_GROUP_INFO,"Received '%x' ", *(int*)data); + if (ept->dest_addr == MHU0_ES_H_BASE) + log_api->log(MOD_LOG_GROUP_INFO,"From Host MHU0\n"); + else if (ept->dest_addr == MHU1_ES_H_BASE) + log_api->log(MOD_LOG_GROUP_INFO,"From Host MHU1\n"); + else if (ept->dest_addr == MHU0_ES_SE_BASE) + log_api->log(MOD_LOG_GROUP_INFO,"From SE MHU0\n"); + else if (ept->dest_addr == MHU1_ES_SE_BASE) + log_api->log(MOD_LOG_GROUP_INFO,"From SE MHU1\n"); + else + log_api->log(MOD_LOG_GROUP_INFO,"From unknown source\n"); + + int message = *(int*)data; + switch (COMMAND(message)) { + case NONE: + log_api->log(MOD_LOG_GROUP_INFO, + "CMD: Do nothing...\r\n"); + break; + case INC_RETURN: { + log_api->log(MOD_LOG_GROUP_INFO, + "CMD: Increment and return to sender...\r\n"); + const int command = ENCODE(NONE, VALUE(message) + 1); + int status = rpmsg_send(ept, &command, sizeof(command)); + if(status != RPMSG_SUCCESS){ + log_api->log(MOD_LOG_GROUP_INFO, + "EventHandler: Could not send message via rpmsg_send\r\n"); + } + break; + } + case INC_ECHO_SE: { + struct rpmsg_endpoint* se_ept; + switch(ept->dest_addr) { + case MHU0_ES_H_BASE: + se_ept = get_endpoint(MHU0_ES_SE_BASE); + break; + case MHU1_ES_H_BASE: + se_ept = get_endpoint(MHU1_ES_SE_BASE); + break; + default: + log_api->log(MOD_LOG_GROUP_INFO, + "ECHO SE command should be triggered from a host MHU\r\n"); + return FWK_SUCCESS; + } + log_api->log(MOD_LOG_GROUP_INFO, + "CMD: Increment and echo to SE...\r\n"); + const int command = ENCODE(INC_RETURN, VALUE(message) + 1); + int status = rpmsg_send(se_ept, &command, sizeof(command)); + if(status != RPMSG_SUCCESS){ + log_api->log(MOD_LOG_GROUP_INFO, + "EventHandler: Could not send message via rpmsg_send\r\n"); + } + break; + } + default: { + log_api->log(MOD_LOG_GROUP_INFO, + "CMD: Unknwn command: %u\r\n", COMMAND(message)); + break; + } + } + return FWK_SUCCESS; +} + +static struct mod_eventhandler_api module_api = { + .handleRpmsgEvent = handleRpmsgEvent, +}; + +static int eventhandler_process_bind_request( + fwk_id_t requester_id, + fwk_id_t id, + fwk_id_t api_id, + const void **api) +{ + *api = &module_api; + return FWK_SUCCESS; +} + +static int eventhandler_init(fwk_id_t id, unsigned int element_count, + const void* data){ + return FWK_SUCCESS; +} + +static int eventhandler_bind(fwk_id_t id, unsigned int round) +{ + int status; + + if ((round == 1)) { + status = fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_LOG), + FWK_ID_API(FWK_MODULE_IDX_LOG, 0), + &log_api); + if (status != FWK_SUCCESS) { + /* Unable to bind back to SMT channel */ + assert(false); + return status; + } + + } + return FWK_SUCCESS; +} + +const struct fwk_module module_eventhandler = { + .name = "eventhandler", + .type = FWK_MODULE_TYPE_DRIVER, + .api_count = 1, + .bind = eventhandler_bind, + .init = eventhandler_init, + .process_bind_request = eventhandler_process_bind_request, +}; |