Skip to content

Commit 6a1c9aa

Browse files
tinghan-shenmathieupoirier
authored andcommitted
remoteproc: mediatek: Add MT8195 SCP core 1 operations
The SCP rproc driver has a set of chip dependent callbacks for boot sequence and IRQ handling. Implement these callbacks for MT8195 SCP core 1. Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Link: https://lore.kernel.org/r/20230901080935.14571-5-tinghan.shen@mediatek.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
1 parent 6b55b1e commit 6a1c9aa

2 files changed

Lines changed: 64 additions & 0 deletions

File tree

drivers/remoteproc/mtk_common.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#define MT8192_SCP2SPM_IPC_CLR 0x4094
4848
#define MT8192_GIPC_IN_SET 0x4098
4949
#define MT8192_HOST_IPC_INT_BIT BIT(0)
50+
#define MT8195_CORE1_HOST_IPC_INT_BIT BIT(4)
5051

5152
#define MT8192_CORE0_SW_RSTN_CLR 0x10000
5253
#define MT8192_CORE0_SW_RSTN_SET 0x10004
@@ -56,6 +57,14 @@
5657

5758
#define MT8195_L1TCM_SRAM_PDN_RESERVED_RSI_BITS GENMASK(7, 4)
5859

60+
#define MT8195_CPU1_SRAM_PD 0x1084
61+
#define MT8195_SSHUB2APMCU_IPC_SET 0x4088
62+
#define MT8195_SSHUB2APMCU_IPC_CLR 0x408C
63+
#define MT8195_CORE1_SW_RSTN_CLR 0x20000
64+
#define MT8195_CORE1_SW_RSTN_SET 0x20004
65+
#define MT8195_CORE1_MEM_ATT_PREDEF 0x20008
66+
#define MT8195_CORE1_WDT_CFG 0x20034
67+
5968
#define SCP_FW_VER_LEN 32
6069
#define SCP_SHARE_BUFFER_SIZE 288
6170

drivers/remoteproc/mtk_scp.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,16 @@ static void mt8192_scp_reset_deassert(struct mtk_scp *scp)
176176
writel(1, scp->reg_base + MT8192_CORE0_SW_RSTN_CLR);
177177
}
178178

179+
static void mt8195_scp_c1_reset_assert(struct mtk_scp *scp)
180+
{
181+
writel(1, scp->reg_base + MT8195_CORE1_SW_RSTN_SET);
182+
}
183+
184+
static void mt8195_scp_c1_reset_deassert(struct mtk_scp *scp)
185+
{
186+
writel(1, scp->reg_base + MT8195_CORE1_SW_RSTN_CLR);
187+
}
188+
179189
static void mt8183_scp_irq_handler(struct mtk_scp *scp)
180190
{
181191
u32 scp_to_host;
@@ -212,6 +222,18 @@ static void mt8192_scp_irq_handler(struct mtk_scp *scp)
212222
}
213223
}
214224

225+
static void mt8195_scp_c1_irq_handler(struct mtk_scp *scp)
226+
{
227+
u32 scp_to_host;
228+
229+
scp_to_host = readl(scp->reg_base + MT8195_SSHUB2APMCU_IPC_SET);
230+
231+
if (scp_to_host & MT8192_SCP_IPC_INT_BIT)
232+
scp_ipi_handler(scp);
233+
234+
writel(scp_to_host, scp->reg_base + MT8195_SSHUB2APMCU_IPC_CLR);
235+
}
236+
215237
static irqreturn_t scp_irq_handler(int irq, void *priv)
216238
{
217239
struct mtk_scp *scp = priv;
@@ -453,6 +475,18 @@ static int mt8195_scp_before_load(struct mtk_scp *scp)
453475
return 0;
454476
}
455477

478+
static int mt8195_scp_c1_before_load(struct mtk_scp *scp)
479+
{
480+
scp->data->scp_reset_assert(scp);
481+
482+
scp_sram_power_on(scp->reg_base + MT8195_CPU1_SRAM_PD, 0);
483+
484+
/* enable MPU for all memory regions */
485+
writel(0xff, scp->reg_base + MT8195_CORE1_MEM_ATT_PREDEF);
486+
487+
return 0;
488+
}
489+
456490
static int scp_load(struct rproc *rproc, const struct firmware *fw)
457491
{
458492
struct mtk_scp *scp = rproc->priv;
@@ -625,6 +659,15 @@ static void mt8195_scp_stop(struct mtk_scp *scp)
625659
writel(0, scp->reg_base + MT8192_CORE0_WDT_CFG);
626660
}
627661

662+
static void mt8195_scp_c1_stop(struct mtk_scp *scp)
663+
{
664+
/* Power off CPU SRAM */
665+
scp_sram_power_off(scp->reg_base + MT8195_CPU1_SRAM_PD, 0);
666+
667+
/* Disable SCP watchdog */
668+
writel(0, scp->reg_base + MT8195_CORE1_WDT_CFG);
669+
}
670+
628671
static int scp_stop(struct rproc *rproc)
629672
{
630673
struct mtk_scp *scp = rproc->priv;
@@ -989,6 +1032,18 @@ static const struct mtk_scp_of_data mt8195_of_data = {
9891032
.host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT,
9901033
};
9911034

1035+
static const struct mtk_scp_of_data mt8195_of_data_c1 = {
1036+
.scp_clk_get = mt8195_scp_clk_get,
1037+
.scp_before_load = mt8195_scp_c1_before_load,
1038+
.scp_irq_handler = mt8195_scp_c1_irq_handler,
1039+
.scp_reset_assert = mt8195_scp_c1_reset_assert,
1040+
.scp_reset_deassert = mt8195_scp_c1_reset_deassert,
1041+
.scp_stop = mt8195_scp_c1_stop,
1042+
.scp_da_to_va = mt8192_scp_da_to_va,
1043+
.host_to_scp_reg = MT8192_GIPC_IN_SET,
1044+
.host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT,
1045+
};
1046+
9921047
static const struct of_device_id mtk_scp_of_match[] = {
9931048
{ .compatible = "mediatek,mt8183-scp", .data = &mt8183_of_data },
9941049
{ .compatible = "mediatek,mt8186-scp", .data = &mt8186_of_data },

0 commit comments

Comments
 (0)