linux/drivers/remoteproc/mtk_common.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (c) 2019 MediaTek Inc.
   4 */
   5
   6#ifndef __RPROC_MTK_COMMON_H
   7#define __RPROC_MTK_COMMON_H
   8
   9#include <linux/interrupt.h>
  10#include <linux/kernel.h>
  11#include <linux/platform_device.h>
  12#include <linux/remoteproc.h>
  13#include <linux/remoteproc/mtk_scp.h>
  14
  15#define MT8183_SW_RSTN                  0x0
  16#define MT8183_SW_RSTN_BIT              BIT(0)
  17#define MT8183_SCP_TO_HOST              0x1C
  18#define MT8183_SCP_IPC_INT_BIT          BIT(0)
  19#define MT8183_SCP_WDT_INT_BIT          BIT(8)
  20#define MT8183_HOST_TO_SCP              0x28
  21#define MT8183_HOST_IPC_INT_BIT         BIT(0)
  22#define MT8183_WDT_CFG                  0x84
  23#define MT8183_SCP_CLK_SW_SEL           0x4000
  24#define MT8183_SCP_CLK_DIV_SEL          0x4024
  25#define MT8183_SCP_SRAM_PDN             0x402C
  26#define MT8183_SCP_L1_SRAM_PD           0x4080
  27#define MT8183_SCP_TCM_TAIL_SRAM_PD     0x4094
  28
  29#define MT8183_SCP_CACHE_SEL(x)         (0x14000 + (x) * 0x3000)
  30#define MT8183_SCP_CACHE_CON            MT8183_SCP_CACHE_SEL(0)
  31#define MT8183_SCP_DCACHE_CON           MT8183_SCP_CACHE_SEL(1)
  32#define MT8183_SCP_CACHESIZE_8KB        BIT(8)
  33#define MT8183_SCP_CACHE_CON_WAYEN      BIT(10)
  34
  35#define SCP_FW_VER_LEN                  32
  36#define SCP_SHARE_BUFFER_SIZE           288
  37
  38struct scp_run {
  39        u32 signaled;
  40        s8 fw_ver[SCP_FW_VER_LEN];
  41        u32 dec_capability;
  42        u32 enc_capability;
  43        wait_queue_head_t wq;
  44};
  45
  46struct scp_ipi_desc {
  47        /* For protecting handler. */
  48        struct mutex lock;
  49        scp_ipi_handler_t handler;
  50        void *priv;
  51};
  52
  53struct mtk_scp {
  54        struct device *dev;
  55        struct rproc *rproc;
  56        struct clk *clk;
  57        void __iomem *reg_base;
  58        void __iomem *sram_base;
  59        size_t sram_size;
  60
  61        struct mtk_share_obj __iomem *recv_buf;
  62        struct mtk_share_obj __iomem *send_buf;
  63        struct scp_run run;
  64        /* To prevent multiple ipi_send run concurrently. */
  65        struct mutex send_lock;
  66        struct scp_ipi_desc ipi_desc[SCP_IPI_MAX];
  67        bool ipi_id_ack[SCP_IPI_MAX];
  68        wait_queue_head_t ack_wq;
  69
  70        void __iomem *cpu_addr;
  71        phys_addr_t phys_addr;
  72        size_t dram_size;
  73
  74        struct rproc_subdev *rpmsg_subdev;
  75};
  76
  77/**
  78 * struct mtk_share_obj - SRAM buffer shared with AP and SCP
  79 *
  80 * @id:         IPI id
  81 * @len:        share buffer length
  82 * @share_buf:  share buffer data
  83 */
  84struct mtk_share_obj {
  85        u32 id;
  86        u32 len;
  87        u8 share_buf[SCP_SHARE_BUFFER_SIZE];
  88};
  89
  90void scp_memcpy_aligned(void __iomem *dst, const void *src, unsigned int len);
  91void scp_ipi_lock(struct mtk_scp *scp, u32 id);
  92void scp_ipi_unlock(struct mtk_scp *scp, u32 id);
  93
  94#endif
  95