unplugged-kernel/drivers/misc/mediatek/adsp/mt6779/adsp_helper.h

190 lines
5.2 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2018 MediaTek Inc.
* Author: HsinYi Chang <hsin-yi.chang@mediatek.com>
*/
#ifndef __ADSP_HELPER_H__
#define __ADSP_HELPER_H__
#include <linux/notifier.h>
#include <linux/interrupt.h>
#include "adsp_reg.h"
#include "adsp_feature_define.h"
#include "adsp_reserved_mem.h"
#include "adsp_clk.h"
#define ADSP_SLEEP_ENABLE (1)
/* adsp config reg. definition*/
#define ADSP_A_TCM_SIZE (adspreg.total_tcmsize)
#define ADSP_A_ITCM_SIZE (adspreg.i_tcmsize)
#define ADSP_A_DTCM_SIZE (adspreg.d_tcmsize)
#define ADSP_A_ITCM (adspreg.iram)
#define ADSP_A_DTCM (adspreg.dram)
#define ADSP_A_SYS_DRAM (adspreg.sysram)
#define ADSP_A_CFG (adspreg.cfg)
#define ADSP_A_CFG_SIZE (adspreg.cfgregsize)
#define ADSP_A_DTCM_SHARE_BASE (adspreg.dram + adspreg.d_tcmsize)
#define ADSP_A_DTCM_SHARE_SIZE (0x1000)
#define ADSP_A_MPUINFO_BUFFER (ADSP_A_DTCM_SHARE_BASE - 0x0020)
#define ADSP_A_OSTIMER_BUFFER (ADSP_A_DTCM_SHARE_BASE - 0x0040)
#define ADSP_A_IPC_BUFFER (ADSP_A_DTCM_SHARE_BASE - 0x0280)
#define ADSP_A_AUDIO_IPI_BUFFER (ADSP_A_DTCM_SHARE_BASE - 0x0680)
#define ADSP_A_WAKELOCK_BUFFER (ADSP_A_DTCM_SHARE_BASE - 0x0684)
#define ADSP_A_SYS_STATUS (ADSP_A_DTCM_SHARE_BASE - 0x0688)
#define ADSP_BUS_MON_BACKUP_BASE (ADSP_A_DTCM_SHARE_BASE - 0x0744)
#define ADSP_INFRA_BUS_DUMP_BASE (ADSP_A_DTCM_SHARE_BASE - 0x07E4)
#define ADSP_A_AP_AWAKE (ADSP_A_WAKELOCK_BUFFER)
/* timesync definition */
#define ADSP_TIMESYNC_TICK_H (ADSP_A_OSTIMER_BUFFER + 0)
#define ADSP_TIMESYNC_TICK_L (ADSP_A_OSTIMER_BUFFER + 4)
#define ADSP_TIMESYNC_TS_H (ADSP_A_OSTIMER_BUFFER + 8)
#define ADSP_TIMESYNC_TS_L (ADSP_A_OSTIMER_BUFFER + 12)
#define ADSP_TIMESYNC_FREEZE (ADSP_A_OSTIMER_BUFFER + 16)
/* Non-Cacheable MPU entry start from this ID. */
#define ADSP_MPU_NONCACHE_ID ADSP_A_DEBUG_DUMP_MEM_ID
#define ADSP_MPU_DATA_RO_ID
#define WDT_FIRST_WAIT_COUNT (2)
#define WDT_LAST_WAIT_COUNT (6)
struct adsp_mpu_info_t {
u32 prog_addr;
u32 prog_size;
u32 data_addr;
u32 data_size;
u32 data_non_cache_addr;
u32 data_non_cache_size;
};
/* adsp notify event */
enum ADSP_NOTIFY_EVENT {
ADSP_EVENT_STOP = 0,
ADSP_EVENT_READY,
};
/* adsp reset status */
enum ADSP_RESET_STATUS {
ADSP_RESET_STATUS_STOP = 0,
ADSP_RESET_STATUS_START = 1,
};
enum ADSP_RECOVERY_FLAG {
ADSP_RECOVERY_START,
ADSP_RECOVERY_OK,
};
/* adsp reset status */
enum ADSP_RESET_TYPE {
ADSP_RESET_TYPE_WDT = 0,
ADSP_RESET_TYPE_AWAKE = 1,
};
/* adsp semaphore definition*/
enum semaphore_2way_flag {
SEMA_2WAY_AUDIOREG = 0,
SEMA_2WAY_NUM = 4,
};
#define SEMA_AUDIOREG SEMA_2WAY_AUDIOREG
enum adsp_status {
ADSP_ERROR = -1,
ADSP_OK,
ADSP_SEMAPHORE_BUSY,
};
/* adsp Core ID definition*/
enum adsp_core_id {
ADSP_A_ID = 0,
ADSP_CORE_TOTAL = 1,
};
struct adsp_regs {
void __iomem *adspsys;
void __iomem *iram;
void __iomem *dram;
void __iomem *sysram;
void __iomem *cfg;
void __iomem *clkctrl;
void __iomem *infracfg_ao;
void __iomem *pericfg;
phys_addr_t sharedram;
int wdt_irq;
int ipc_irq;
size_t i_tcmsize;
size_t d_tcmsize;
size_t cfgregsize;
size_t total_tcmsize;
size_t sysram_size;
size_t shared_size;
enum adsp_clk active_clksrc;
};
/* adsp work struct definition*/
struct adsp_work_t {
struct work_struct work;
unsigned int flags;
unsigned int id;
};
/* adsp device attribute group*/
extern struct attribute_group adsp_awake_attr_group;
extern struct attribute_group adsp_dvfs_attr_group;
extern struct attribute_group adsp_logger_attr_group;
extern struct attribute_group adsp_excep_attr_group;
extern struct adsp_regs adspreg;
#ifdef CFG_RECOVERY_SUPPORT
extern atomic_t adsp_reset_status;
extern unsigned int adsp_recovery_flag[ADSP_CORE_TOTAL];
extern struct completion adsp_sys_reset_cp;
extern unsigned int wdt_counter;
extern unsigned char *adsp_A_dram_dump_buffer;
#endif
/* adsp exception */
extern int adsp_excep_init(void);
extern void adsp_excep_cleanup(void);
/* adsp irq */
extern irqreturn_t adsp_A_irq_handler(int irq, void *dev_id);
extern irqreturn_t adsp_A_wdt_handler(int irq, void *dev_id);
extern void adsp_A_irq_init(void);
extern void adsp_A_ipi_init(void);
/* adsp helper */
extern void adsp_A_register_notify(struct notifier_block *nb);
extern void adsp_A_unregister_notify(struct notifier_block *nb);
extern struct workqueue_struct *adsp_workqueue;
extern void adsp_enable_dsp_clk(bool enable);
void adsp_set_emimpu_region(void);
void adsp_bus_sleep_protect(uint32_t enable);
void adsp_way_en_ctrl(uint32_t enable);
extern void adsp_send_reset_wq(enum ADSP_RESET_TYPE type,
enum adsp_core_id core_id);
extern void adsp_extern_notify(enum ADSP_NOTIFY_EVENT notify_status);
extern unsigned int adsp_set_reset_status(void);
extern int is_adsp_ready(uint32_t adsp_id);
extern bool adsp_feature_is_active(void);
void adsp_reset_ready(uint32_t id);
void adsp_A_ready_ipi_handler(int id, void *data, unsigned int len);
extern int get_adsp_semaphore(unsigned int flag);
extern int release_adsp_semaphore(unsigned int flag);
uint32_t adsp_power_on(uint32_t enable);
#endif