aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAluvala Sai Akhilesh <aluvala.saiakhilesh@arm.com>2019-10-10 23:35:14 +0530
committerThomas Abraham <thomas.abraham@arm.com>2019-10-23 09:22:09 +0530
commitf210b83badbdf0188166527cce3abbf783dee579 (patch)
treee762143b54b635c20dd3aedd680489152c02f35f
parent6249a11030e2779453eea011741de85830afacd4 (diff)
ppu_v1: [hack] poll for operating mode transistionsRD-N1E1-20191024-RC0
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 <aluvala.saiakhilesh@arm.com>
-rw-r--r--module/ppu_v1/src/mod_ppu_v1.c23
-rw-r--r--module/ppu_v1/src/ppu_v1.c11
-rw-r--r--module/ppu_v1/src/ppu_v1.h4
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<<thread_idx)));
+ } else {
operating_mode = ppu_v1_get_operating_mode(ppu);
if (!(operating_mode & thread_mask)) {
status =
@@ -345,10 +348,10 @@ 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_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