mirror of
https://github.com/hardkernel/kernel_common_drivers.git
synced 2026-06-25 12:03:48 +09:00
32a62cf946
PD#SWPL-222902 Problem: dsp need to reset when dsp hang Solution: add reset function when dsp panic Verify: a5 Change-Id: I3203af2530026098d929c32558abafcf328a17d5 Signed-off-by: Liming Xue <liming.xue@amlogic.com>
255 lines
7.9 KiB
C
255 lines
7.9 KiB
C
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||
/*
|
||
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
||
*/
|
||
|
||
#ifndef _HOST_MODULE_H
|
||
#define _HOST_MODULE_H
|
||
#include <linux/platform_device.h>
|
||
#include <linux/of_reserved_mem.h>
|
||
#include <linux/miscdevice.h>
|
||
#include <linux/amlogic/scpi_protocol.h>
|
||
|
||
/*m4 cmd and subid*/
|
||
#define SMC_M4_CMD 0x8200004E
|
||
/*soc: g12a/sm1*/
|
||
#define SMC_SUBID_MFH_V1_BOOT 0x20
|
||
/*soc: p1*/
|
||
#define SMC_SUBID_MFH_V2_BOOT 0x21
|
||
#define SMC_SUBID_MFH_V2_RESET 0x22
|
||
#define SMC_M4_BANK 0xFCB87430
|
||
/*hifi dsp cmd and subid*/
|
||
#define SMC_HIFI_DSP_CMD 0x82000090
|
||
#define SMC_SUBID_HIFI_DSP_BOOT 0x10
|
||
#define SMC_SUBID_HIFI_DSP_REMAP 0x11
|
||
#define SMC_SUBID_HIFI_DSP_PWR_SET 0x13
|
||
#define SMC_SUBID_HIFI_DSP_RESET_HIGH 0x14
|
||
#define SMC_SUBID_SHIFT 0x8
|
||
#define PACK_SMC_SUBID_ID(subid, id) (((subid) << SMC_SUBID_SHIFT) | (id))
|
||
|
||
/*hifi dsp ffv to wake arm*/
|
||
#define MBX_CMD_VAD_AWE_WAKEUP 0x62
|
||
#define DSP_VAD_WAKUP_ARM 0x5555AAAA
|
||
|
||
/* pm support function
|
||
*
|
||
* bit0: pm_support_suspend
|
||
* bit1: pm_support_always_on
|
||
* bit2: pm_support_ffv
|
||
*/
|
||
#define PM_SUPPORT_DSP_SUSPEND(pm_support) ((pm_support) & 0x1)
|
||
#define PM_SUPPORT_DSP_ALWAYS_ON(pm_support) (((pm_support) & 0x2) >> 1)
|
||
#define PM_SUPPORT_DSP_FFV(pm_support) (((pm_support) & 0x4) >> 2)
|
||
|
||
struct host_module;
|
||
struct dsp_info_t;
|
||
struct host_data;
|
||
struct host_mfh;
|
||
struct host_dsp;
|
||
|
||
struct host_data {
|
||
struct miscdevice misc;
|
||
char name[20];
|
||
u8 hostid;
|
||
struct host_module *host;
|
||
} __packed;
|
||
|
||
struct dsp_info_t {
|
||
char id; /*dsp_id 0,1,2...*/
|
||
char fw_id;
|
||
char fw_name[32]; /*name of firmware which used for dsp*/
|
||
char fw1_name[32]; /*name of firmware which used for dsp ddr*/
|
||
char fw2_name[32]; /*name of firmware which used for dsp sram*/
|
||
unsigned int phy_addr; /*phy address of firmware will be loaded on*/
|
||
unsigned int size; /*size of reserved hifi memory*/
|
||
} __packed;
|
||
|
||
struct dsp_shm_info_t {
|
||
unsigned int addr;
|
||
unsigned int size;
|
||
} __packed;
|
||
|
||
struct mbox_buf {
|
||
u32 id;
|
||
u32 addr;
|
||
u32 cfg0;
|
||
} __packed;
|
||
|
||
struct mfh_info {
|
||
int cpuid;
|
||
char name[30];
|
||
};
|
||
|
||
struct mfh_msg_buf {
|
||
int size;
|
||
char buf[96];
|
||
} __packed;
|
||
|
||
struct mfh_msg {
|
||
struct list_head list;
|
||
struct mfh_msg_buf msg_buf;
|
||
struct completion complete;
|
||
};
|
||
|
||
#define HOSTFW_NAME_LEN 32
|
||
#define REG_DSP_CFG0 (0x0)
|
||
#define REG_DSP_CFG1 (0x4)
|
||
#define REG_DSP_CFG2 (0x8)
|
||
#define REG_DSP_RESET_VEC (0x004 << 2)
|
||
|
||
#define HOST_IOC_MAGIC 'H'
|
||
|
||
#define MFH_FIRMWARE_LOAD _IOWR(HOST_IOC_MAGIC, 1, struct mfh_info)
|
||
#define MFH_CMD_SEND _IOWR(HOST_IOC_MAGIC, 2, struct mfh_msg_buf)
|
||
#define MFH_CMD_LISTEN _IOWR(HOST_IOC_MAGIC, 3, struct mfh_msg_buf)
|
||
#define HOST_LOAD _IOWR(HOST_IOC_MAGIC, 1, struct dsp_info_t)
|
||
#define HOST_START _IOWR(HOST_IOC_MAGIC, 3, struct dsp_info_t)
|
||
#define HOST_STOP _IOWR(HOST_IOC_MAGIC, 4, struct dsp_info_t)
|
||
#define HOST_2LOAD _IOWR(HOST_IOC_MAGIC, 7, struct dsp_info_t)
|
||
#define HOST_GET_INFO _IOWR((HOST_IOC_MAGIC), (18), \
|
||
struct dsp_info_t)
|
||
#define HOST_SHM_CLEAN _IOWR(HOST_IOC_MAGIC, 64, \
|
||
struct dsp_shm_info_t)
|
||
#define HOST_SHM_INV _IOWR(HOST_IOC_MAGIC, 65, \
|
||
struct dsp_shm_info_t)
|
||
|
||
/** struct host_mfh, the struct of host mfh
|
||
* @mfh_info: m4 mfh_info struct
|
||
* @mfh_buf: m4 mfh_buf struct
|
||
* @mfh_msg: m4 mfh_msg struct
|
||
*/
|
||
|
||
struct host_mfh {
|
||
struct mfh_info mfh_info;
|
||
struct mfh_msg_buf mfh_buf;
|
||
struct mfh_msg *mfh_msg;
|
||
};
|
||
|
||
/** struct host_dsp, the struct of host dsp
|
||
* @mbox_buf: dsp mbox_buf struct
|
||
* @shminfo: dsp dsp_shm_info_t struct
|
||
* @usrinfo: dsp dsp_info_t struct
|
||
* @pm_support_suspend: dsp support suspend/resume
|
||
* @pm_support_always_on:dsp work when arm suspend
|
||
* @pm_support_ffv: If support dsp far field voice
|
||
* @input_device: input_device for ffv to wakeup screen
|
||
* @clk_hifi: dsp hifi clk source
|
||
*/
|
||
|
||
struct host_dsp {
|
||
struct mbox_buf mbox_buf;
|
||
struct dsp_shm_info_t shminfo;
|
||
struct dsp_info_t *usrinfo;
|
||
u8 pm_support_suspend;
|
||
u8 pm_support_always_on;
|
||
u8 pm_support_ffv;
|
||
struct input_dev *input_device;
|
||
struct clk *clk_hifi;
|
||
struct host_module *host;
|
||
struct delayed_work host_ffv_work;
|
||
struct workqueue_struct *host_ffv_wq;
|
||
u8 uevent_flag;
|
||
};
|
||
|
||
/** struct host_module, the struct of host module
|
||
* @dev: struct device for this Host driver
|
||
* @base_reg: Base register of host
|
||
* @health_reg: Health monitor register
|
||
* @device_spt_reg: Whether the boards support dsp/m4
|
||
* @sram_addr: Sram virtual address
|
||
* @phys_sram_addr: Sram physical address
|
||
* @phys_sram_size: Sram physical address size
|
||
* @ddr_addr: Ddr virtual address
|
||
* @shm_addr: Share memory address
|
||
* @phys_ddr_addr: Ddr physical address
|
||
* @phys_ddr_size: Ddr physical address size
|
||
* @phys_shm_addr: Share memory physical address
|
||
* @phys_shm_size: Share memory physical address size
|
||
* @phys_remap_addr: Ddr physical remap address
|
||
* @phys_remap_size: Ddr physical remap size
|
||
* @start_pos: Boot from sram, ddr or both
|
||
* @logbuff_polling_period_ms: Host logbuff polling period
|
||
* @health_polling_ms: Host health polling period
|
||
* @addr_remap: Addr remap flag
|
||
* @clk: Host clock
|
||
* @clk_rate: Host clock rate
|
||
* @pm_support: If support power management
|
||
* @mbox_chan_to_dev: Mbox channel from host to dev
|
||
* @mbox_chan_from_dev: Mbox channel from dev to host
|
||
* @init_mbox_chan: Mbox channel for dev init
|
||
* @misc: Misc device
|
||
* @hostid: Host id
|
||
* @fname0: Host firmware name0
|
||
* @fname1: Host firmware name1
|
||
* @suspended: Host suspend flag
|
||
* @pre_cnt: Host health monitor last value
|
||
* @cur_cnt: Host health monitor current value
|
||
* @host_monitor_work: Host monitor work
|
||
* @host_logbuff_work: Host logbuff work
|
||
* @host_wq: Host work queue
|
||
* @hang: Host hang flag
|
||
* @mbox_buf: Aocpu mbox buffer
|
||
* @firmware_load: Host firmware is load
|
||
* @firmware_started: host dsp firmware started
|
||
* @device_support_bit: DSP/M4 support bit
|
||
* @host_data: Struct host_data
|
||
* @host_mfh: Struct host_mfh
|
||
* @host_dsp: Struct host_dsp
|
||
* @nb: Host die notifier
|
||
*/
|
||
|
||
struct host_module {
|
||
struct device *dev;
|
||
void __iomem *base_reg;
|
||
void __iomem *health_reg;
|
||
void __iomem *device_spt_reg;
|
||
void __iomem *sram_addr;
|
||
phys_addr_t phys_sram_addr;
|
||
phys_addr_t phys_sram_size;
|
||
void __iomem *ddr_addr;
|
||
void __iomem *shm_addr;
|
||
phys_addr_t phys_ddr_addr;
|
||
phys_addr_t phys_ddr_size;
|
||
phys_addr_t phys_shm_addr;
|
||
phys_addr_t phys_shm_size;
|
||
phys_addr_t phys_remap_addr;
|
||
phys_addr_t phys_remap_size;
|
||
u8 start_pos;
|
||
u32 logbuff_polling_ms;
|
||
u32 health_polling_ms;
|
||
bool addr_remap;
|
||
struct clk *clk;
|
||
u32 clk_rate;
|
||
u8 pm_support;
|
||
struct mbox_chan *mbox_chan_to_dev;
|
||
struct mbox_chan *mbox_chan_from_dev;
|
||
struct mbox_chan *init_mbox_chan;
|
||
struct miscdevice *misc;
|
||
int hostid;
|
||
char fname0[HOSTFW_NAME_LEN];
|
||
char fname1[HOSTFW_NAME_LEN];
|
||
u32 pre_cnt, cur_cnt;
|
||
struct delayed_work host_monitor_work;
|
||
struct delayed_work host_logbuff_work;
|
||
struct workqueue_struct *host_wq;
|
||
struct workqueue_struct *host_logbuff_wq;
|
||
u32 hang;
|
||
bool core_reset;
|
||
|
||
u32 firmware_load;
|
||
u32 firmware_started;
|
||
u32 device_support_bit;
|
||
|
||
struct host_data *host_data;
|
||
struct host_mfh *host_mfh;
|
||
struct host_dsp *host_dsp;
|
||
struct notifier_block nb;
|
||
};
|
||
|
||
bool host_firmware_ready(u8 host_id);
|
||
struct device *host_to_device(u8 host_id);
|
||
void host_core_reset(struct host_module *host);
|
||
int host_phyaddr_info(u8 host_id, phys_addr_t *addr, phys_addr_t *size);
|
||
|
||
#endif /*_HOST_MODULE_H*/
|