Skip to content

Commit d7127de

Browse files
YongWu-HFjoergroedel
authored andcommitted
iommu/mediatek: Backup/restore regsiters for multi banks
Each bank has some independent registers. thus backup/restore them for each a bank when suspend and resume. Signed-off-by: Yong Wu <[email protected]> Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Reviewed-by: Matthias Brugger <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joerg Roedel <[email protected]>
1 parent 42d57fc commit d7127de

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

drivers/iommu/mtk_iommu.c

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,12 @@ struct mtk_iommu_suspend_reg {
173173
u32 misc_ctrl;
174174
u32 dcm_dis;
175175
u32 ctrl_reg;
176-
u32 int_control0;
177-
u32 int_main_control;
178-
u32 ivrp_paddr;
179176
u32 vld_pa_rng;
180177
u32 wr_len_ctrl;
178+
179+
u32 int_control[MTK_IOMMU_BANK_MAX];
180+
u32 int_main_control[MTK_IOMMU_BANK_MAX];
181+
u32 ivrp_paddr[MTK_IOMMU_BANK_MAX];
181182
};
182183

183184
struct mtk_iommu_plat_data {
@@ -1302,16 +1303,23 @@ static int __maybe_unused mtk_iommu_runtime_suspend(struct device *dev)
13021303
{
13031304
struct mtk_iommu_data *data = dev_get_drvdata(dev);
13041305
struct mtk_iommu_suspend_reg *reg = &data->reg;
1305-
void __iomem *base = data->bank[0].base;
1306+
void __iomem *base;
1307+
int i = 0;
13061308

1309+
base = data->bank[i].base;
13071310
reg->wr_len_ctrl = readl_relaxed(base + REG_MMU_WR_LEN_CTRL);
13081311
reg->misc_ctrl = readl_relaxed(base + REG_MMU_MISC_CTRL);
13091312
reg->dcm_dis = readl_relaxed(base + REG_MMU_DCM_DIS);
13101313
reg->ctrl_reg = readl_relaxed(base + REG_MMU_CTRL_REG);
1311-
reg->int_control0 = readl_relaxed(base + REG_MMU_INT_CONTROL0);
1312-
reg->int_main_control = readl_relaxed(base + REG_MMU_INT_MAIN_CONTROL);
1313-
reg->ivrp_paddr = readl_relaxed(base + REG_MMU_IVRP_PADDR);
13141314
reg->vld_pa_rng = readl_relaxed(base + REG_MMU_VLD_PA_RNG);
1315+
do {
1316+
if (!data->plat_data->banks_enable[i])
1317+
continue;
1318+
base = data->bank[i].base;
1319+
reg->int_control[i] = readl_relaxed(base + REG_MMU_INT_CONTROL0);
1320+
reg->int_main_control[i] = readl_relaxed(base + REG_MMU_INT_MAIN_CONTROL);
1321+
reg->ivrp_paddr[i] = readl_relaxed(base + REG_MMU_IVRP_PADDR);
1322+
} while (++i < data->plat_data->banks_num);
13151323
clk_disable_unprepare(data->bclk);
13161324
return 0;
13171325
}
@@ -1320,9 +1328,9 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
13201328
{
13211329
struct mtk_iommu_data *data = dev_get_drvdata(dev);
13221330
struct mtk_iommu_suspend_reg *reg = &data->reg;
1323-
struct mtk_iommu_domain *m4u_dom = data->bank[0].m4u_dom;
1324-
void __iomem *base = data->bank[0].base;
1325-
int ret;
1331+
struct mtk_iommu_domain *m4u_dom;
1332+
void __iomem *base;
1333+
int ret, i = 0;
13261334

13271335
ret = clk_prepare_enable(data->bclk);
13281336
if (ret) {
@@ -1334,18 +1342,26 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
13341342
* Uppon first resume, only enable the clk and return, since the values of the
13351343
* registers are not yet set.
13361344
*/
1337-
if (!m4u_dom)
1345+
if (!reg->wr_len_ctrl)
13381346
return 0;
13391347

1348+
base = data->bank[i].base;
13401349
writel_relaxed(reg->wr_len_ctrl, base + REG_MMU_WR_LEN_CTRL);
13411350
writel_relaxed(reg->misc_ctrl, base + REG_MMU_MISC_CTRL);
13421351
writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS);
13431352
writel_relaxed(reg->ctrl_reg, base + REG_MMU_CTRL_REG);
1344-
writel_relaxed(reg->int_control0, base + REG_MMU_INT_CONTROL0);
1345-
writel_relaxed(reg->int_main_control, base + REG_MMU_INT_MAIN_CONTROL);
1346-
writel_relaxed(reg->ivrp_paddr, base + REG_MMU_IVRP_PADDR);
13471353
writel_relaxed(reg->vld_pa_rng, base + REG_MMU_VLD_PA_RNG);
1348-
writel(m4u_dom->cfg.arm_v7s_cfg.ttbr & MMU_PT_ADDR_MASK, base + REG_MMU_PT_BASE_ADDR);
1354+
do {
1355+
m4u_dom = data->bank[i].m4u_dom;
1356+
if (!data->plat_data->banks_enable[i] || !m4u_dom)
1357+
continue;
1358+
base = data->bank[i].base;
1359+
writel_relaxed(reg->int_control[i], base + REG_MMU_INT_CONTROL0);
1360+
writel_relaxed(reg->int_main_control[i], base + REG_MMU_INT_MAIN_CONTROL);
1361+
writel_relaxed(reg->ivrp_paddr[i], base + REG_MMU_IVRP_PADDR);
1362+
writel(m4u_dom->cfg.arm_v7s_cfg.ttbr & MMU_PT_ADDR_MASK,
1363+
base + REG_MMU_PT_BASE_ADDR);
1364+
} while (++i < data->plat_data->banks_num);
13491365

13501366
/*
13511367
* Users may allocate dma buffer before they call pm_runtime_get,

0 commit comments

Comments
 (0)