blob: 33e073a233dc5b73447be01520fbf64a1bf72ce1 [file] [log] [blame]
/*
* include/linux/amlogic/media/sound/dsp_register.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef DSP_REGISTER_H
#define DSP_REGISTER_H
#include <linux/dma-mapping.h>
#include <linux/amlogic/iomap.h>
#if 0 /* CONFIG_ARCH_MESON8 */
#define SYS_MEM_START 0x00000000
#else
#define SYS_MEM_START 0x80000000
#endif
#define SYS_MEM_SIZE 0x8000000
#define S_1K (1024)
#define S_1M (S_1K*S_1K)
#define AUDIO_DSP_MEM_SIZE S_1M
#if 0 /* MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8 */
#define AUDIO_DSP_START_PHY_ADDR 0x06000000
#else
#define AUDIO_DSP_START_PHY_ADDR 0x85000000
#endif
/* ((SYS_MEM_START+SYS_MEM_SIZE)-AUDIO_DSP_MEM_SIZE) */
#define AUDIO_DSP_START_ADDR \
((unsigned int)phys_to_virt(AUDIO_DSP_START_PHY_ADDR))
#define AUDIO_DSP_END_ADDR ((AUDIO_DSP_START_ADDR+AUDIO_DSP_MEM_SIZE))
#define REG_MEM_SIZE (S_1K*4)
#define DSP_REG_OFFSET (AUDIO_DSP_START_ADDR + AUDIO_DSP_MEM_SIZE-REG_MEM_SIZE)
#define DSP_REG_END (AUDIO_DSP_START_ADDR + AUDIO_DSP_MEM_SIZE-4)
#define DSP_REG(x) (DSP_REG_OFFSET | ((x)<<5))
#define DSP_STATUS_HALT ('H'<<24 | 'a'<<16|'l'<<8 | 't')
#define DSP_STATUS_RUNNING ('R'<<16|'u'<<8 | 'n')
#define DSP_STATUS_SLEEP ('S'<<24 | 'L'<<16|'E'<<8 | 'P')
#define DSP_STATUS_WAKEUP ('W'<<24 | 'A'<<16|'K'<<8 | 'E')
#define DSP_AUDIOINFO_READY ('A'<<24 | 'I'<<16|'R'<<8 | 'D')
#define DSP_STATUS DSP_REG(0)
#define DSP_JIFFIES DSP_REG(1)
#define DSP_STACK_START DSP_REG(3)
#define DSP_STACK_END DSP_REG(4)
#define DSP_GP_STACK_START DSP_REG(5)
#define DSP_GP_STACK_END DSP_REG(6)
#define DSP_MEM_START DSP_REG(7)
#define DSP_MEM_END DSP_REG(8)
#define DSP_DECODE_OUT_START_ADDR DSP_REG(9)
#define DSP_DECODE_OUT_END_ADDR DSP_REG(10)
#define DSP_DECODE_OUT_RD_ADDR DSP_REG(11)
#define DSP_DECODE_OUT_WD_ADDR DSP_REG(12)
#define DSP_AUDIOINFO_STATUS DSP_REG(13)
#define DSP_SLEEP_STATUS DSP_REG(14)
/* #define DEBUG_TIME_TEST */
#ifdef DEBUG_TIME_TEST
#define DSP_TEST_TIME_VALUE DSP_REG(15)
#endif
#define DSP_ARM_REF_CLK_VAL DSP_REG(16)
#define DSP_DECODE_OUT_WD_PTR DSP_REG(18)
#define DSP_BUFFERED_LEN DSP_REG(19)
#define DSP_AFIFO_RD_OFFSET1 DSP_REG(20)
#define DSP_DECODE_OPTION DSP_REG(21)
#define DSP_AUDIO_FORMAT_INFO DSP_REG(22)
#define DSP_GET_EXTRA_INFO_FINISH DSP_REG(23)
#define DSP_HDMI_SR DSP_REG(24)
#define DSP_LOG_START_ADDR DSP_REG(28)
#define DSP_LOG_END_ADDR DSP_REG(29)
#define DSP_LOG_RD_ADDR DSP_REG(30)
#define DSP_LOG_WD_ADDR DSP_REG(31)
#define DSP_CHIP_SUBID DSP_REG(32)
/* other definations */
/* for wifi-display */
#define DSP_SKIP_BYTES DSP_REG(38)
#define MAILBOX1_REG(n) DSP_REG(40+n)
#define MAILBOX2_REG(n) DSP_REG(40+32+n)
/* ---------------------------------------------- */
#define DSP_DECODE_51PCM_OUT_START_ADDR DSP_REG(106)
#define DSP_DECODE_51PCM_OUT_END_ADDR DSP_REG(107)
#define DSP_DECODE_51PCM_OUT_RD_ADDR DSP_REG(108)
#define DSP_DECODE_51PCM_OUT_WD_ADDR DSP_REG(109)
/* ------------------------------------------------ */
/*
* as iec958 output maybe be enabled
* before the spdif module inititation finish in the spdif driver,
* in this case,it will cause 958 module not work.
* so add a protocal register to co-work for that
*/
#define DSP_IEC958_INIT_READY_INFO DSP_REG(110)
#define DSP_AC3_DRC_INFO DSP_IEC958_INIT_READY_INFO
#define DSP_DTS_DEC_INFO DSP_REG(111)
#define DSP_WORK_INFO (AUDIO_DSP_END_ADDR - 128)
#ifndef __ASSEMBLY__
/*mailbox struct*/
struct mail_msg {
int cmd;
int status; /* 0x1:pending.0:free */
char *data;
int len;
};
#endif
#define M1B_IRQ0_PRINT (0+16)
#define M1B_IRQ1_BUF_OVERFLOW (1+16)
#define M1B_IRQ2_BUF_UNDERFLOW (2+16)
#define M1B_IRQ3_DECODE_ERROR (3+16)
#define M1B_IRQ4_DECODE_FINISH_FRAME (4+16)
#define M1B_IRQ5_STREAM_FMT_CHANGED (5+16)
#define M1B_IRQ5_STREAM_RD_WD_TEST (6+16)
#define M1B_IRQ7_DECODE_FATAL_ERR (7+16)
#define M1B_IRQ8_IEC958_INFO (8+16)
#define M2B_IRQ0_DSP_HALT (0)
#define M2B_IRQ1_DSP_RESET (1)
#define M2B_IRQ2_DECODE_START (2)
#define M2B_IRQ3_DECODE_STOP (3)
#define M2B_IRQ4_AUDIO_INFO (4)
#define M2B_IRQ0_DSP_SLEEP (5)
#define M2B_IRQ0_DSP_WAKEUP (6)
#define M2B_IRQ0_DSP_AUDIO_EFFECT (7)
#define CMD_PRINT_LOG (1234<<8 | 1)
#define MB0_REG VDEC_ASSIST_MBOX0_IRQ_REG
#define MB0_SEL VDEC_ASSIST_MBOX0_FIQ_SEL
#define MB0_CLR VDEC_ASSIST_MBOX0_CLR_REG
#define MB0_MSK VDEC_ASSIST_MBOX0_MASK
#define MB1_REG VDEC_ASSIST_MBOX1_IRQ_REG
#define MB1_SEL VDEC_ASSIST_MBOX1_FIQ_SEL
#define MB1_CLR VDEC_ASSIST_MBOX1_CLR_REG
#define MB1_MSK VDEC_ASSIST_MBOX1_MASK
#define MB2_REG VDEC_ASSIST_MBOX2_IRQ_REG
#define MB2_SEL VDEC_ASSIST_MBOX2_FIQ_SEL
#define MB2_CLR VDEC_ASSIST_MBOX2_CLR_REG
#define MB2_MSK VDEC_ASSIST_MBOX2_MASK
#define READ_VREG(r) (aml_read_dosbus(r))
#define WRITE_VREG(r, val) aml_write_dosbus((r), (val))
#define WRITE_VREG_BITS(r, val, start, len) \
(WRITE_VREG(r, READ_VREG(r) & ~(((1L << (len)) - 1) << (start))) | \
(unsigned int)((val) & ((1L << (len)) - 1)) << (start))
#define SET_VREG_MASK(r, mask) WRITE_VREG(r, READ_VREG(r) | (mask))
#define CLEAR_VREG_MASK(r, mask) WRITE_VREG(r, READ_VREG(r) & ~(mask))
#define MDEC_TRIGGER_IRQ(irq) \
do { \
SET_VREG_MASK(MB0_SEL, 1<<irq); \
WRITE_VREG(MB0_REG, 1 << irq); \
} while (0)
#if 0 /* MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8 //>= m8 */
#define SYS_TRIGGER_IRQ(irq) WRITE_VREG(MB1_REG, 1 << irq)
#define SYS_CLEAR_IRQ(irq) WRITE_VREG(MB1_CLR, 1 << irq)
#define DSP_TRIGGER_IRQ(irq) WRITE_VREG(MB2_REG, 1 << irq)
#else
#define SYS_TRIGGER_IRQ(irq) \
do { \
SET_VREG_MASK(MB1_SEL, 1<<irq); \
WRITE_VREG(MB1_REG, 1 << irq); \
} while (0)
#define SYS_CLEAR_IRQ(irq) \
do { \
CLEAR_VREG_MASK(MB1_SEL, 1<<irq); \
WRITE_VREG(MB1_CLR, 1 << irq); \
} while (0)
#define DSP_TRIGGER_IRQ(irq) \
do { \
SET_VREG_MASK(MB2_SEL, 1<<irq); \
WRITE_VREG(MB2_REG, 1 << irq); \
} while (0)
#endif
#define MDEC_CLEAR_IRQ(irq) \
do { \
CLEAR_VREG_MASK(MB0_SEL, 1<<irq); \
WRITE_VREG(MB0_CLR, 1 << irq); \
} while (0)
#define DSP_CLEAR_IRQ(irq) \
do { \
CLEAR_VREG_MASK(MB2_SEL, 1<<irq); \
WRITE_VREG(MB2_CLR, 1 << irq); \
} while (0)
#define MAIBOX0_IRQ_ENABLE(irq) SET_VREG_MASK(MB0_MSK, 1<<irq)
#define MAIBOX1_IRQ_ENABLE(irq) SET_VREG_MASK(MB1_MSK, 1<<irq)
#define MAIBOX2_IRQ_ENABLE(irq) SET_VREG_MASK(MB2_MSK, 1<<irq)
#define ARC_2_ARM_ADDR_SWAP(addr) ((unsigned long)(phys_to_virt(addr)))
#define ARM_2_ARC_ADDR_SWAP(addr) (virt_to_phys((void *)addr))
#define DSP_RD(reg) (*((unsigned long *)reg))
#define DSP_WD(reg, val) ({(*((unsigned long *)(reg))) = val; })
#endif