aboutsummaryrefslogtreecommitdiff
path: root/src/ethosu_driver.c
diff options
context:
space:
mode:
authorBhavik Patel <bhavik.patel@arm.com>2020-06-12 14:46:47 +0200
committerBhavik Patel <bhavik.patel@arm.com>2020-06-26 14:12:04 +0200
commite645fed716af167ae53e6f842e2baa85bdcb3c24 (patch)
tree735a0cc11d8c667dfa9f6be5865355e6807e0d36 /src/ethosu_driver.c
parent2407e9646fe50709e36440d04d3f35367ea5bf81 (diff)
downloadethos-u-core-driver-e645fed716af167ae53e6f842e2baa85bdcb3c24.tar.gz
MLBEDSW-2447 Set clock_q_enable & power_q_enable correctly
Bit [2] in CMD register is used to enable clock off using clock q-interface and enable the master clock gate. Bit [3] is used to enable power off using power q-interface. The clock_q_enable bit is set when putting the Ethos-U into run state. The power_q_enable bit is set to 0 when running the command stream and set to 1 after command stream has finished running. Change-Id: Id9d1405376508e2af2ec0ddc2ebae8fb6c2f5cba
Diffstat (limited to 'src/ethosu_driver.c')
-rw-r--r--src/ethosu_driver.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/ethosu_driver.c b/src/ethosu_driver.c
index 56d8248..e372312 100644
--- a/src/ethosu_driver.c
+++ b/src/ethosu_driver.c
@@ -192,6 +192,12 @@ int ethosu_init(void)
int return_code = 0;
LOG_INFO("ethosu_init calling NPU embed driver ethosu_dev_init\n");
+ if (ETHOSU_SUCCESS != ethosu_set_clock_and_power(ETHOSU_CLOCK_Q_DISABLE, ETHOSU_POWER_Q_DISABLE))
+ {
+ LOG_ERR("Failed to disable clock-q & power-q for Ethos-U\n");
+ return -1;
+ }
+
ethosu_soft_reset();
if (ETHOSU_SUCCESS != ethosu_wait_for_reset())
@@ -264,15 +270,17 @@ int ethosu_invoke(const void *custom_data_ptr,
}
int custom_data_32bit_size = (custom_data_size / BYTES_IN_32_BITS - CUSTOM_OPTION_LENGTH_32_BIT_WORD);
+ ethosu_set_clock_and_power(ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_DISABLE);
while (data_ptr < (data_start_ptr + custom_data_32bit_size))
{
+ int ret = 0;
switch (data_ptr->driver_action_command)
{
case OPTIMIZER_CONFIG:
LOG_INFO("ethosu_invoke OPTIMIZER_CONFIG\n");
struct opt_cfg_s *opt_cfg_p = (struct opt_cfg_s *)data_ptr;
- return_code = handle_optimizer_config(opt_cfg_p);
+ ret = handle_optimizer_config(opt_cfg_p);
data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD + OPTIMIZER_CONFIG_LENGTH_32_BIT_WORD;
break;
case COMMAND_STREAM:
@@ -284,9 +292,9 @@ int ethosu_invoke(const void *custom_data_ptr,
// It is safe to clear this flag without atomic, because npu is not running.
irq_triggered = false;
- return_code = handle_command_stream(command_stream, cms_length, base_addr, num_base_addr);
+ ret = handle_command_stream(command_stream, cms_length, base_addr, num_base_addr);
- if (return_code == -1 && abort_inference)
+ if (ret == -1 && abort_inference)
{
uint32_t qread = 0;
ethosu_get_qread(&qread);
@@ -301,12 +309,12 @@ int ethosu_invoke(const void *custom_data_ptr,
break;
case READ_APB_REG:
LOG_INFO("ethosu_invoke READ_APB_REG\n");
- return_code = read_apb_reg(data_ptr->driver_action_data);
+ ret = read_apb_reg(data_ptr->driver_action_data);
data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD;
break;
case DUMP_SHRAM:
LOG_INFO("ethosu_invoke DUMP_SHRAM\n");
- return_code = dump_shram();
+ ret = dump_shram();
data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD;
break;
case NOP:
@@ -315,15 +323,17 @@ int ethosu_invoke(const void *custom_data_ptr,
break;
default:
LOG_ERR("ethosu_invoke UNSUPPORTED driver_action_command %d \n", data_ptr->driver_action_command);
- return -1;
+ ret = -1;
break;
}
- if (return_code != 0)
+ if (ret != 0)
{
- return -1;
+ return_code = -1;
+ break;
}
}
- return 0;
+ ethosu_set_clock_and_power(ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_ENABLE);
+ return return_code;
}
void ethosu_abort(void)