From f210b83badbdf0188166527cce3abbf783dee579 Mon Sep 17 00:00:00 2001 From: Aluvala Sai Akhilesh Date: Thu, 10 Oct 2019 23:35:14 +0530 Subject: ppu_v1: [hack] poll for operating mode transistions Poll for operating mode transitions instead of transition interrupts. This is a temporary workaround to avoid the interrupt generation issues in the model. Change-Id: Ic515afb551fa1a21fddf733823cb6ce4cd61dcd4 Signed-off-by: Aluvala Sai Akhilesh --- module/ppu_v1/src/mod_ppu_v1.c | 23 ++++++++++------------- module/ppu_v1/src/ppu_v1.c | 11 ++++++++++- module/ppu_v1/src/ppu_v1.h | 4 ++++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/module/ppu_v1/src/mod_ppu_v1.c b/module/ppu_v1/src/mod_ppu_v1.c index 23098c51..511ab626 100644 --- a/module/ppu_v1/src/mod_ppu_v1.c +++ b/module/ppu_v1/src/mod_ppu_v1.c @@ -317,6 +317,7 @@ static int ppu_v1_thread_set_state(fwk_id_t thread_id, unsigned int state) thread_ctx->off_power_mode_power_state = MOD_PD_STATE_OFF; ppu_v1_set_op_active_edge_sensitivity( ppu, op_devactive, PPU_V1_EDGE_SENSITIVITY_MASKED); + ppu_v1_interrupt_mask(ppu, PPU_V1_IMR_STA_POLICY_TRN_IRQ_MASK); /* * Disable interrupts as the core operating mode is shared between @@ -324,11 +325,13 @@ static int ppu_v1_thread_set_state(fwk_id_t thread_id, unsigned int state) * asserted for another thread. */ fwk_interrupt_global_disable(); - operating_mode = ppu_v1_get_programmed_operating_mode(ppu); - - if (operating_mode & thread_mask) - ppu_v1_request_operating_mode(ppu, operating_mode & (~thread_mask)); - else { + while (ppu_v1_is_op_devactive_high(ppu, op_devactive)) + continue; + operating_mode = ppu_v1_get_operating_mode(ppu); + if (operating_mode & thread_mask) { + ppu_v1_dynamic_disable(ppu); + ppu_v1_set_operating_mode(ppu,operating_mode & (~(1<off_power_mode_power_state = MOD_PD_STATE_SLEEP; ppu_v1_set_op_active_edge_sensitivity( - ppu, op_devactive, PPU_V1_EDGE_SENSITIVITY_FALLING_EDGE); + ppu, op_devactive, PPU_V1_EDGE_SENSITIVITY_MASKED); fwk_interrupt_global_disable(); - operating_mode = ppu_v1_get_programmed_operating_mode(ppu); + operating_mode = ppu_v1_get_operating_mode(ppu); ppu_v1_request_operating_mode(ppu, operating_mode | thread_mask); fwk_interrupt_global_enable(); @@ -362,17 +365,12 @@ static int ppu_v1_thread_set_state(fwk_id_t thread_id, unsigned int state) thread_ctx->off_power_state_requested = false; thread_ctx->off_power_mode_power_state = MOD_PD_STATE_SLEEP; - ppu_v1_set_op_active_edge_sensitivity( - ppu, op_devactive, PPU_V1_EDGE_SENSITIVITY_RISING_EDGE); - if (ppu_v1_is_op_devactive_high(ppu, op_devactive)) { fwk_interrupt_global_disable(); operating_mode = ppu_v1_get_programmed_operating_mode(ppu); ppu_v1_request_operating_mode( ppu, operating_mode | thread_mask); fwk_interrupt_global_enable(); - ppu_v1_set_op_active_edge_sensitivity( - ppu, op_devactive, PPU_V1_EDGE_SENSITIVITY_FALLING_EDGE); } } break; @@ -610,7 +608,6 @@ static int ppu_v1_core_pd_init(struct ppu_v1_pd_ctx *pd_ctx) MOD_PD_STATE_OFF : MOD_PD_STATE_SLEEP; } - ppu_v1_lock_off_enable(ppu); ppu_v1_dynamic_enable(ppu, MOD_PPU_V1_MODE_OFF); ppu_v1_interrupt_unmask(ppu, PPU_V1_IMR_LOCKED_IRQ_MASK); diff --git a/module/ppu_v1/src/ppu_v1.c b/module/ppu_v1/src/ppu_v1.c index 6d4faf60..6bb3bf25 100644 --- a/module/ppu_v1/src/ppu_v1.c +++ b/module/ppu_v1/src/ppu_v1.c @@ -34,7 +34,8 @@ int ppu_v1_request_power_mode(struct ppu_v1_reg *ppu, assert(ppu != NULL); assert(ppu_mode < MOD_PPU_V1_MODE_COUNT); - power_policy = ppu->PWPR & ~(PPU_V1_PWPR_POLICY | PPU_V1_PWPR_DYNAMIC_EN); + power_policy = ppu->PWPR & ~(PPU_V1_PWPR_POLICY | PPU_V1_PWPR_DYNAMIC_EN | + PPU_V1_PWPR_OP_DYN_EN); ppu->PWPR = power_policy | ppu_mode; return FWK_SUCCESS; @@ -113,6 +114,14 @@ void ppu_v1_dynamic_enable(struct ppu_v1_reg *ppu, continue; } +void ppu_v1_dynamic_disable(struct ppu_v1_reg *ppu) +{ + assert(ppu != NULL); + assert(min_dyn_mode < PPU_V1_OPMODE_COUNT); + + ppu->PWPR = ppu->PWPR & (~PPU_V1_PWPR_DYNAMIC_EN); +} + void ppu_v1_lock_off_enable(struct ppu_v1_reg *ppu) { assert(ppu != NULL); diff --git a/module/ppu_v1/src/ppu_v1.h b/module/ppu_v1/src/ppu_v1.h index 32ae7671..de12c99a 100644 --- a/module/ppu_v1/src/ppu_v1.h +++ b/module/ppu_v1/src/ppu_v1.h @@ -276,6 +276,10 @@ void ppu_v1_opmode_dynamic_enable(struct ppu_v1_reg *ppu, */ void ppu_v1_dynamic_enable(struct ppu_v1_reg *ppu, enum mod_ppu_v1_mode min_dyn_state); +/* + * Disable PPU's dynamic power mode transitions + */ +void ppu_v1_dynamic_disable(struct ppu_v1_reg *ppu); /* * Enable the lock in the OFF state -- cgit v1.2.3