Re: [PATCH v4] remoteproc/mediatek: Add support for mt8192 SCP

2020-10-21 Thread Mathieu Poirier
Hi Shih,

On Wed, 14 Oct 2020 at 23:35, Pi-Hsun Shih  wrote:
>
> Add support for mt8192 SCP.
>

This is a very thin changelog.  I wouldn't be surprised if you get asked to beef
it up.

> Signed-off-by: Pi-Hsun Shih 
> Reviewed-by: Tzung-Bi Shih 
>
> ---
>
> Change since v3:
> * Remove unnecessary barrier and readl in mt8192_scp_before_load, which
>   also fixes build failure on linux-next because of COMPILE_TEST trying
>   to compile this on other platforms.
>
> Change since v2:
> * Inline scp_reset_assert / scp_reset_deassert.
>
> Change since v1:
> * Remove unused register definitions.
>
> ---
>  drivers/remoteproc/mtk_common.h  |  32 +
>  drivers/remoteproc/mtk_scp.c | 200 +--
>  drivers/remoteproc/mtk_scp_ipi.c |   6 +-
>  3 files changed, 200 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h
> index 0066c83636d0..47b4561443a9 100644
> --- a/drivers/remoteproc/mtk_common.h
> +++ b/drivers/remoteproc/mtk_common.h
> @@ -32,6 +32,23 @@
>  #define MT8183_SCP_CACHESIZE_8KB   BIT(8)
>  #define MT8183_SCP_CACHE_CON_WAYEN BIT(10)
>
> +#define MT8192_L2TCM_SRAM_PD_0 0x210C0
> +#define MT8192_L2TCM_SRAM_PD_1 0x210C4
> +#define MT8192_L2TCM_SRAM_PD_2 0x210C8
> +#define MT8192_L1TCM_SRAM_PDN  0x2102C
> +#define MT8192_CPU0_SRAM_PD0x21080
> +
> +#define MT8192_SCP2APMCU_IPC_SET   0x24080
> +#define MT8192_SCP2APMCU_IPC_CLR   0x24084
> +#define MT8192_SCP_IPC_INT_BIT BIT(0)
> +#define MT8192_SCP2SPM_IPC_CLR 0x24094
> +#define MT8192_GIPC_IN_SET 0x24098
> +#define MT8192_HOST_IPC_INT_BITBIT(0)
> +
> +#define MT8192_CORE0_SW_RSTN_CLR   0x3
> +#define MT8192_CORE0_SW_RSTN_SET   0x30004
> +#define MT8192_CORE0_WDT_CFG   0x30034
> +
>  #define SCP_FW_VER_LEN 32
>  #define SCP_SHARE_BUFFER_SIZE  288
>
> @@ -50,6 +67,19 @@ struct scp_ipi_desc {
> void *priv;
>  };
>
> +struct mtk_scp;
> +
> +struct mtk_scp_of_data {
> +   int (*scp_before_load)(struct mtk_scp *scp);
> +   void (*scp_irq_handler)(struct mtk_scp *scp);
> +   void (*scp_reset_assert)(struct mtk_scp *scp);
> +   void (*scp_reset_deassert)(struct mtk_scp *scp);
> +   void (*scp_stop)(struct mtk_scp *scp);
> +
> +   u32 host_to_scp_reg;
> +   u32 host_to_scp_int_bit;
> +};
> +
>  struct mtk_scp {
> struct device *dev;
> struct rproc *rproc;
> @@ -58,6 +88,8 @@ struct mtk_scp {
> void __iomem *sram_base;
> size_t sram_size;
>
> +   const struct mtk_scp_of_data *data;
> +
> struct mtk_share_obj __iomem *recv_buf;
> struct mtk_share_obj __iomem *send_buf;
> struct scp_run run;
> diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
> index ac13e7b046a6..f8c54a0b33fc 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -2,7 +2,6 @@
>  //
>  // Copyright (c) 2019 MediaTek Inc.
>
> -#include 
>  #include 
>  #include 
>  #include 
> @@ -124,9 +123,6 @@ static int scp_ipi_init(struct mtk_scp *scp)
> size_t send_offset = SCP_FW_END - sizeof(struct mtk_share_obj);
> size_t recv_offset = send_offset - sizeof(struct mtk_share_obj);
>
> -   /* Disable SCP to host interrupt */
> -   writel(MT8183_SCP_IPC_INT_BIT, scp->reg_base + MT8183_SCP_TO_HOST);
> -

This needs to be in a patch on its own.

> /* shared buffer initialization */
> scp->recv_buf =
> (struct mtk_share_obj __iomem *)(scp->sram_base + 
> recv_offset);
> @@ -138,7 +134,7 @@ static int scp_ipi_init(struct mtk_scp *scp)
> return 0;
>  }
>
> -static void scp_reset_assert(const struct mtk_scp *scp)
> +static void mt8183_scp_reset_assert(struct mtk_scp *scp)

Rebranding of functions in preparation for mt8192 needs to be in a separate
patch (in the same patchset).  When that is done you can add support for mt8192.

>  {
> u32 val;
>
> @@ -147,7 +143,7 @@ static void scp_reset_assert(const struct mtk_scp *scp)
> writel(val, scp->reg_base + MT8183_SW_RSTN);
>  }
>
> -static void scp_reset_deassert(const struct mtk_scp *scp)
> +static void mt8183_scp_reset_deassert(struct mtk_scp *scp)
>  {
> u32 val;
>
> @@ -156,17 +152,19 @@ static void scp_reset_deassert(const struct mtk_scp 
> *scp)
> writel(val, scp->reg_base + MT8183_SW_RSTN);
>  }
>
> -static irqreturn_t scp_irq_handler(int irq, void *priv)
> +static void mt8192_scp_reset_assert(struct mtk_scp *scp)
>  {
> -   struct mtk_scp *scp = priv;
> -   u32 scp_to_host;
> -   int ret;
> +   writel(1, scp->reg_base + MT8192_CORE0_SW_RSTN_SET);
> +}
>
> -   ret = clk_prepare_enable(scp->clk);
> -   if (ret) {
> -   dev_err(scp->dev, "failed to enable clocks\n");
> -   return IRQ_NONE;
> -   }
> +static void mt8192_scp_reset_deassert(struct 

[PATCH v4] remoteproc/mediatek: Add support for mt8192 SCP

2020-10-14 Thread Pi-Hsun Shih
Add support for mt8192 SCP.

Signed-off-by: Pi-Hsun Shih 
Reviewed-by: Tzung-Bi Shih 

---

Change since v3:
* Remove unnecessary barrier and readl in mt8192_scp_before_load, which
  also fixes build failure on linux-next because of COMPILE_TEST trying
  to compile this on other platforms.

Change since v2:
* Inline scp_reset_assert / scp_reset_deassert.

Change since v1:
* Remove unused register definitions.

---
 drivers/remoteproc/mtk_common.h  |  32 +
 drivers/remoteproc/mtk_scp.c | 200 +--
 drivers/remoteproc/mtk_scp_ipi.c |   6 +-
 3 files changed, 200 insertions(+), 38 deletions(-)

diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h
index 0066c83636d0..47b4561443a9 100644
--- a/drivers/remoteproc/mtk_common.h
+++ b/drivers/remoteproc/mtk_common.h
@@ -32,6 +32,23 @@
 #define MT8183_SCP_CACHESIZE_8KB   BIT(8)
 #define MT8183_SCP_CACHE_CON_WAYEN BIT(10)
 
+#define MT8192_L2TCM_SRAM_PD_0 0x210C0
+#define MT8192_L2TCM_SRAM_PD_1 0x210C4
+#define MT8192_L2TCM_SRAM_PD_2 0x210C8
+#define MT8192_L1TCM_SRAM_PDN  0x2102C
+#define MT8192_CPU0_SRAM_PD0x21080
+
+#define MT8192_SCP2APMCU_IPC_SET   0x24080
+#define MT8192_SCP2APMCU_IPC_CLR   0x24084
+#define MT8192_SCP_IPC_INT_BIT BIT(0)
+#define MT8192_SCP2SPM_IPC_CLR 0x24094
+#define MT8192_GIPC_IN_SET 0x24098
+#define MT8192_HOST_IPC_INT_BITBIT(0)
+
+#define MT8192_CORE0_SW_RSTN_CLR   0x3
+#define MT8192_CORE0_SW_RSTN_SET   0x30004
+#define MT8192_CORE0_WDT_CFG   0x30034
+
 #define SCP_FW_VER_LEN 32
 #define SCP_SHARE_BUFFER_SIZE  288
 
@@ -50,6 +67,19 @@ struct scp_ipi_desc {
void *priv;
 };
 
+struct mtk_scp;
+
+struct mtk_scp_of_data {
+   int (*scp_before_load)(struct mtk_scp *scp);
+   void (*scp_irq_handler)(struct mtk_scp *scp);
+   void (*scp_reset_assert)(struct mtk_scp *scp);
+   void (*scp_reset_deassert)(struct mtk_scp *scp);
+   void (*scp_stop)(struct mtk_scp *scp);
+
+   u32 host_to_scp_reg;
+   u32 host_to_scp_int_bit;
+};
+
 struct mtk_scp {
struct device *dev;
struct rproc *rproc;
@@ -58,6 +88,8 @@ struct mtk_scp {
void __iomem *sram_base;
size_t sram_size;
 
+   const struct mtk_scp_of_data *data;
+
struct mtk_share_obj __iomem *recv_buf;
struct mtk_share_obj __iomem *send_buf;
struct scp_run run;
diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
index ac13e7b046a6..f8c54a0b33fc 100644
--- a/drivers/remoteproc/mtk_scp.c
+++ b/drivers/remoteproc/mtk_scp.c
@@ -2,7 +2,6 @@
 //
 // Copyright (c) 2019 MediaTek Inc.
 
-#include 
 #include 
 #include 
 #include 
@@ -124,9 +123,6 @@ static int scp_ipi_init(struct mtk_scp *scp)
size_t send_offset = SCP_FW_END - sizeof(struct mtk_share_obj);
size_t recv_offset = send_offset - sizeof(struct mtk_share_obj);
 
-   /* Disable SCP to host interrupt */
-   writel(MT8183_SCP_IPC_INT_BIT, scp->reg_base + MT8183_SCP_TO_HOST);
-
/* shared buffer initialization */
scp->recv_buf =
(struct mtk_share_obj __iomem *)(scp->sram_base + recv_offset);
@@ -138,7 +134,7 @@ static int scp_ipi_init(struct mtk_scp *scp)
return 0;
 }
 
-static void scp_reset_assert(const struct mtk_scp *scp)
+static void mt8183_scp_reset_assert(struct mtk_scp *scp)
 {
u32 val;
 
@@ -147,7 +143,7 @@ static void scp_reset_assert(const struct mtk_scp *scp)
writel(val, scp->reg_base + MT8183_SW_RSTN);
 }
 
-static void scp_reset_deassert(const struct mtk_scp *scp)
+static void mt8183_scp_reset_deassert(struct mtk_scp *scp)
 {
u32 val;
 
@@ -156,17 +152,19 @@ static void scp_reset_deassert(const struct mtk_scp *scp)
writel(val, scp->reg_base + MT8183_SW_RSTN);
 }
 
-static irqreturn_t scp_irq_handler(int irq, void *priv)
+static void mt8192_scp_reset_assert(struct mtk_scp *scp)
 {
-   struct mtk_scp *scp = priv;
-   u32 scp_to_host;
-   int ret;
+   writel(1, scp->reg_base + MT8192_CORE0_SW_RSTN_SET);
+}
 
-   ret = clk_prepare_enable(scp->clk);
-   if (ret) {
-   dev_err(scp->dev, "failed to enable clocks\n");
-   return IRQ_NONE;
-   }
+static void mt8192_scp_reset_deassert(struct mtk_scp *scp)
+{
+   writel(1, scp->reg_base + MT8192_CORE0_SW_RSTN_CLR);
+}
+
+static void mt8183_scp_irq_handler(struct mtk_scp *scp)
+{
+   u32 scp_to_host;
 
scp_to_host = readl(scp->reg_base + MT8183_SCP_TO_HOST);
if (scp_to_host & MT8183_SCP_IPC_INT_BIT)
@@ -177,6 +175,40 @@ static irqreturn_t scp_irq_handler(int irq, void *priv)
/* SCP won't send another interrupt until we set SCP_TO_HOST to 0. */
writel(MT8183_SCP_IPC_INT_BIT | MT8183_SCP_WDT_INT_BIT,
   scp->reg_base + MT8183_SCP_TO_HOST);
+}
+
+static void mt8192_scp_irq_handler(struct