forked from Mirrors/opensbi
lib: utils/irqchip: plic: Common PM save/restore
Move the PLIC save/restore functions inside the driver, so they can be reused on any platform that needs them. The memory needed to store the PLIC context is also allocated by the driver. The PM data cannot be completely encapsulated, as some platforms (including Allwinner D1) need to program the IRQ enable status to a sideband interrupt controller for wakeup capability. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:

committed by
Anup Patel

parent
69448a0790
commit
c6c22f00f4
@@ -60,31 +60,6 @@ static void sun20i_d1_csr_restore(void)
|
||||
csr_write(THEAD_C9XX_CSR_MHINT, csr_mhint);
|
||||
}
|
||||
|
||||
/*
|
||||
* PLIC
|
||||
*/
|
||||
|
||||
#define PLIC_SOURCES 175
|
||||
#define PLIC_IE_WORDS (PLIC_SOURCES / 32 + 1)
|
||||
|
||||
static u8 plic_priority[1 + PLIC_SOURCES];
|
||||
static u32 plic_sie[PLIC_IE_WORDS];
|
||||
static u32 plic_threshold;
|
||||
|
||||
static void sun20i_d1_plic_save(void)
|
||||
{
|
||||
fdt_plic_context_save(true, plic_sie, &plic_threshold, PLIC_IE_WORDS);
|
||||
fdt_plic_priority_save(plic_priority, PLIC_SOURCES);
|
||||
}
|
||||
|
||||
static void sun20i_d1_plic_restore(void)
|
||||
{
|
||||
thead_plic_restore();
|
||||
fdt_plic_priority_restore(plic_priority, PLIC_SOURCES);
|
||||
fdt_plic_context_restore(true, plic_sie, plic_threshold,
|
||||
PLIC_IE_WORDS);
|
||||
}
|
||||
|
||||
/*
|
||||
* PPU
|
||||
*/
|
||||
@@ -117,6 +92,9 @@ static void sun20i_d1_ppu_restore(void)
|
||||
|
||||
static void sun20i_d1_riscv_cfg_save(void)
|
||||
{
|
||||
struct plic_data *plic = fdt_plic_get();
|
||||
u32 *plic_sie = plic->pm_data;
|
||||
|
||||
/* Enable MMIO access. Do not assume S-mode leaves the clock enabled. */
|
||||
writel_relaxed(CCU_BGR_ENABLE, SUN20I_D1_CCU_BASE + RISCV_CFG_BGR_REG);
|
||||
|
||||
@@ -126,7 +104,7 @@ static void sun20i_d1_riscv_cfg_save(void)
|
||||
* the wakeup mask registers (the offset is for GIC compatibility). So
|
||||
* copying SIE to the wakeup mask needs some bit manipulation.
|
||||
*/
|
||||
for (int i = 0; i < PLIC_IE_WORDS - 1; i++)
|
||||
for (int i = 0; i < PLIC_IE_WORDS(plic) - 1; i++)
|
||||
writel_relaxed(plic_sie[i] >> 16 | plic_sie[i + 1] << 16,
|
||||
SUN20I_D1_RISCV_CFG_BASE + WAKEUP_MASK_REG(i));
|
||||
|
||||
@@ -158,7 +136,7 @@ static int sun20i_d1_hart_suspend(u32 suspend_type)
|
||||
if (!(suspend_type & SBI_HSM_SUSP_NON_RET_BIT))
|
||||
return SBI_ENOTSUPP;
|
||||
|
||||
sun20i_d1_plic_save();
|
||||
fdt_plic_suspend();
|
||||
sun20i_d1_ppu_save();
|
||||
sun20i_d1_riscv_cfg_save();
|
||||
sun20i_d1_csr_save();
|
||||
@@ -178,7 +156,7 @@ static void sun20i_d1_hart_resume(void)
|
||||
sun20i_d1_csr_restore();
|
||||
sun20i_d1_riscv_cfg_restore();
|
||||
sun20i_d1_ppu_restore();
|
||||
sun20i_d1_plic_restore();
|
||||
fdt_plic_resume();
|
||||
}
|
||||
|
||||
static const struct sbi_hsm_device sun20i_d1_ppu = {
|
||||
|
Reference in New Issue
Block a user