mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00
feat(mt8188): add backup/restore function when power on/off
Add APU backup/restore function when power on/off. Change-Id: Id0451bd12f402e1acabeb5c12266a2e01836e9dd Signed-off-by: Chungying Lu <chungying.lu@mediatek.com> Signed-off-by: Karl Li <karl.li@mediatek.com>
This commit is contained in:
parent
94a9e6243e
commit
233d604f50
3 changed files with 56 additions and 0 deletions
|
@ -19,6 +19,10 @@
|
|||
#define UP_CORE0_MVABASE0 (APU_REVISER + 0x0010)
|
||||
#define UP_CORE0_VABASE1 (APU_REVISER + 0x0014)
|
||||
#define UP_CORE0_MVABASE1 (APU_REVISER + 0x0018)
|
||||
#define UP_CORE0_VABASE2 (APU_REVISER + 0x001c)
|
||||
#define UP_CORE0_MVABASE2 (APU_REVISER + 0x0020)
|
||||
#define UP_CORE0_VABASE3 (APU_REVISER + 0x0024)
|
||||
#define UP_CORE0_MVABASE3 (APU_REVISER + 0x0028)
|
||||
#define USERFW_CTXT (APU_REVISER + 0x1000)
|
||||
#define SECUREFW_CTXT (APU_REVISER + 0x1004)
|
||||
#define UP_NORMAL_DOMAIN (7)
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
/* Vendor header */
|
||||
#include "apusys.h"
|
||||
#include "apusys_power.h"
|
||||
#include "apusys_rv.h"
|
||||
#include <mtk_mmap_pool.h>
|
||||
|
||||
static spinlock_t apu_lock;
|
||||
|
@ -47,6 +48,43 @@ static int apu_poll(uintptr_t reg, uint32_t mask, uint32_t value, uint32_t timeo
|
|||
return -1;
|
||||
}
|
||||
|
||||
static void apu_backup_restore(enum APU_BACKUP_RESTORE_CTRL ctrl)
|
||||
{
|
||||
int i;
|
||||
static struct apu_restore_data apu_restore_data[] = {
|
||||
{ UP_NORMAL_DOMAIN_NS, 0 },
|
||||
{ UP_PRI_DOMAIN_NS, 0 },
|
||||
{ UP_IOMMU_CTRL, 0 },
|
||||
{ UP_CORE0_VABASE0, 0 },
|
||||
{ UP_CORE0_MVABASE0, 0 },
|
||||
{ UP_CORE0_VABASE1, 0 },
|
||||
{ UP_CORE0_MVABASE1, 0 },
|
||||
{ UP_CORE0_VABASE2, 0 },
|
||||
{ UP_CORE0_MVABASE2, 0 },
|
||||
{ UP_CORE0_VABASE3, 0 },
|
||||
{ UP_CORE0_MVABASE3, 0 },
|
||||
{ MD32_SYS_CTRL, 0 },
|
||||
{ MD32_CLK_CTRL, 0 },
|
||||
{ UP_WAKE_HOST_MASK0, 0 }
|
||||
};
|
||||
|
||||
switch (ctrl) {
|
||||
case APU_CTRL_BACKUP:
|
||||
for (i = 0; i < ARRAY_SIZE(apu_restore_data); i++) {
|
||||
apu_restore_data[i].data = mmio_read_32(apu_restore_data[i].reg);
|
||||
}
|
||||
break;
|
||||
case APU_CTRL_RESTORE:
|
||||
for (i = 0; i < ARRAY_SIZE(apu_restore_data); i++) {
|
||||
mmio_write_32(apu_restore_data[i].reg, apu_restore_data[i].data);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ERROR(MODULE_TAG "%s invalid op: %d\n", __func__, ctrl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void apu_xpu2apusys_d4_slv_en(enum APU_D4_SLV_CTRL en)
|
||||
{
|
||||
switch (en) {
|
||||
|
@ -120,6 +158,8 @@ int apusys_kernel_apusys_pwr_top_on(void)
|
|||
|
||||
apu_xpu2apusys_d4_slv_en(D4_SLV_OFF);
|
||||
|
||||
apu_backup_restore(APU_CTRL_RESTORE);
|
||||
|
||||
apusys_top_on = true;
|
||||
|
||||
spin_unlock(&apu_lock);
|
||||
|
@ -153,6 +193,8 @@ int apusys_kernel_apusys_pwr_top_off(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
apu_backup_restore(APU_CTRL_BACKUP);
|
||||
|
||||
apu_xpu2apusys_d4_slv_en(D4_SLV_ON);
|
||||
|
||||
if (mmio_read_32(APU_MBOX0_BASE + PWR_FLOW_SYNC_REG) == 0) {
|
||||
|
|
|
@ -29,6 +29,16 @@ enum APU_D4_SLV_CTRL {
|
|||
D4_SLV_ON,
|
||||
};
|
||||
|
||||
enum APU_BACKUP_RESTORE_CTRL {
|
||||
APU_CTRL_BACKUP = 0,
|
||||
APU_CTRL_RESTORE = 1,
|
||||
};
|
||||
|
||||
struct apu_restore_data {
|
||||
uint32_t reg;
|
||||
uint32_t data;
|
||||
};
|
||||
|
||||
#define APU_POLL_STEP_US (5)
|
||||
|
||||
#define OUT_CLK_FREQ_MIN (1500)
|
||||
|
|
Loading…
Add table
Reference in a new issue