18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2019 MediaTek Inc. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef __RPROC_MTK_COMMON_H 78c2ecf20Sopenharmony_ci#define __RPROC_MTK_COMMON_H 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 128c2ecf20Sopenharmony_ci#include <linux/remoteproc.h> 138c2ecf20Sopenharmony_ci#include <linux/remoteproc/mtk_scp.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define MT8183_SW_RSTN 0x0 168c2ecf20Sopenharmony_ci#define MT8183_SW_RSTN_BIT BIT(0) 178c2ecf20Sopenharmony_ci#define MT8183_SCP_TO_HOST 0x1C 188c2ecf20Sopenharmony_ci#define MT8183_SCP_IPC_INT_BIT BIT(0) 198c2ecf20Sopenharmony_ci#define MT8183_SCP_WDT_INT_BIT BIT(8) 208c2ecf20Sopenharmony_ci#define MT8183_HOST_TO_SCP 0x28 218c2ecf20Sopenharmony_ci#define MT8183_HOST_IPC_INT_BIT BIT(0) 228c2ecf20Sopenharmony_ci#define MT8183_WDT_CFG 0x84 238c2ecf20Sopenharmony_ci#define MT8183_SCP_CLK_SW_SEL 0x4000 248c2ecf20Sopenharmony_ci#define MT8183_SCP_CLK_DIV_SEL 0x4024 258c2ecf20Sopenharmony_ci#define MT8183_SCP_SRAM_PDN 0x402C 268c2ecf20Sopenharmony_ci#define MT8183_SCP_L1_SRAM_PD 0x4080 278c2ecf20Sopenharmony_ci#define MT8183_SCP_TCM_TAIL_SRAM_PD 0x4094 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define MT8183_SCP_CACHE_SEL(x) (0x14000 + (x) * 0x3000) 308c2ecf20Sopenharmony_ci#define MT8183_SCP_CACHE_CON MT8183_SCP_CACHE_SEL(0) 318c2ecf20Sopenharmony_ci#define MT8183_SCP_DCACHE_CON MT8183_SCP_CACHE_SEL(1) 328c2ecf20Sopenharmony_ci#define MT8183_SCP_CACHESIZE_8KB BIT(8) 338c2ecf20Sopenharmony_ci#define MT8183_SCP_CACHE_CON_WAYEN BIT(10) 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#define MT8192_L2TCM_SRAM_PD_0 0x10C0 368c2ecf20Sopenharmony_ci#define MT8192_L2TCM_SRAM_PD_1 0x10C4 378c2ecf20Sopenharmony_ci#define MT8192_L2TCM_SRAM_PD_2 0x10C8 388c2ecf20Sopenharmony_ci#define MT8192_L1TCM_SRAM_PDN 0x102C 398c2ecf20Sopenharmony_ci#define MT8192_CPU0_SRAM_PD 0x1080 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#define MT8192_SCP2APMCU_IPC_SET 0x4080 428c2ecf20Sopenharmony_ci#define MT8192_SCP2APMCU_IPC_CLR 0x4084 438c2ecf20Sopenharmony_ci#define MT8192_SCP_IPC_INT_BIT BIT(0) 448c2ecf20Sopenharmony_ci#define MT8192_SCP2SPM_IPC_CLR 0x4094 458c2ecf20Sopenharmony_ci#define MT8192_GIPC_IN_SET 0x4098 468c2ecf20Sopenharmony_ci#define MT8192_HOST_IPC_INT_BIT BIT(0) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define MT8192_CORE0_SW_RSTN_CLR 0x10000 498c2ecf20Sopenharmony_ci#define MT8192_CORE0_SW_RSTN_SET 0x10004 508c2ecf20Sopenharmony_ci#define MT8192_CORE0_WDT_IRQ 0x10030 518c2ecf20Sopenharmony_ci#define MT8192_CORE0_WDT_CFG 0x10034 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#define SCP_FW_VER_LEN 32 548c2ecf20Sopenharmony_ci#define SCP_SHARE_BUFFER_SIZE 288 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistruct scp_run { 578c2ecf20Sopenharmony_ci u32 signaled; 588c2ecf20Sopenharmony_ci s8 fw_ver[SCP_FW_VER_LEN]; 598c2ecf20Sopenharmony_ci u32 dec_capability; 608c2ecf20Sopenharmony_ci u32 enc_capability; 618c2ecf20Sopenharmony_ci wait_queue_head_t wq; 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistruct scp_ipi_desc { 658c2ecf20Sopenharmony_ci /* For protecting handler. */ 668c2ecf20Sopenharmony_ci struct mutex lock; 678c2ecf20Sopenharmony_ci scp_ipi_handler_t handler; 688c2ecf20Sopenharmony_ci void *priv; 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistruct mtk_scp; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistruct mtk_scp_of_data { 748c2ecf20Sopenharmony_ci int (*scp_before_load)(struct mtk_scp *scp); 758c2ecf20Sopenharmony_ci void (*scp_irq_handler)(struct mtk_scp *scp); 768c2ecf20Sopenharmony_ci void (*scp_reset_assert)(struct mtk_scp *scp); 778c2ecf20Sopenharmony_ci void (*scp_reset_deassert)(struct mtk_scp *scp); 788c2ecf20Sopenharmony_ci void (*scp_stop)(struct mtk_scp *scp); 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci u32 host_to_scp_reg; 818c2ecf20Sopenharmony_ci u32 host_to_scp_int_bit; 828c2ecf20Sopenharmony_ci}; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistruct mtk_scp { 858c2ecf20Sopenharmony_ci struct device *dev; 868c2ecf20Sopenharmony_ci struct rproc *rproc; 878c2ecf20Sopenharmony_ci struct clk *clk; 888c2ecf20Sopenharmony_ci void __iomem *reg_base; 898c2ecf20Sopenharmony_ci void __iomem *sram_base; 908c2ecf20Sopenharmony_ci size_t sram_size; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci const struct mtk_scp_of_data *data; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci struct mtk_share_obj __iomem *recv_buf; 958c2ecf20Sopenharmony_ci struct mtk_share_obj __iomem *send_buf; 968c2ecf20Sopenharmony_ci struct scp_run run; 978c2ecf20Sopenharmony_ci /* To prevent multiple ipi_send run concurrently. */ 988c2ecf20Sopenharmony_ci struct mutex send_lock; 998c2ecf20Sopenharmony_ci struct scp_ipi_desc ipi_desc[SCP_IPI_MAX]; 1008c2ecf20Sopenharmony_ci bool ipi_id_ack[SCP_IPI_MAX]; 1018c2ecf20Sopenharmony_ci wait_queue_head_t ack_wq; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci void __iomem *cpu_addr; 1048c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 1058c2ecf20Sopenharmony_ci size_t dram_size; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci struct rproc_subdev *rpmsg_subdev; 1088c2ecf20Sopenharmony_ci}; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/** 1118c2ecf20Sopenharmony_ci * struct mtk_share_obj - SRAM buffer shared with AP and SCP 1128c2ecf20Sopenharmony_ci * 1138c2ecf20Sopenharmony_ci * @id: IPI id 1148c2ecf20Sopenharmony_ci * @len: share buffer length 1158c2ecf20Sopenharmony_ci * @share_buf: share buffer data 1168c2ecf20Sopenharmony_ci */ 1178c2ecf20Sopenharmony_cistruct mtk_share_obj { 1188c2ecf20Sopenharmony_ci u32 id; 1198c2ecf20Sopenharmony_ci u32 len; 1208c2ecf20Sopenharmony_ci u8 share_buf[SCP_SHARE_BUFFER_SIZE]; 1218c2ecf20Sopenharmony_ci}; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_civoid scp_memcpy_aligned(void __iomem *dst, const void *src, unsigned int len); 1248c2ecf20Sopenharmony_civoid scp_ipi_lock(struct mtk_scp *scp, u32 id); 1258c2ecf20Sopenharmony_civoid scp_ipi_unlock(struct mtk_scp *scp, u32 id); 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci#endif 128