Skip to content

Commit fe82f08

Browse files
hailong-fankv2019i
authored andcommitted
platform: mediatek: Add support for mt8196 platform
mt8196 plaform integrates a single-core HIFI5 DSP. The DSP does not have DVFS scenario. When the system is in an active state, the DSP clock is 800MHz(0.75v). When the system enters a low power scenario, the DSP is in WFI state, and the clock is 26MHz. The DSP core and DMA in DSP subsys both can access DRAM directly. Signed-off-by: hailong.fan <hailong.fan@mediatek.com>
1 parent 7bd1bbb commit fe82f08

File tree

20 files changed

+1686
-32
lines changed

20 files changed

+1686
-32
lines changed

src/platform/mt8196/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# SPDX-License-Identifier: BSD-3-Clause
2+
3+
add_subdirectory(lib)
4+
5+
add_local_sources(sof platform.c)
6+
target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/platform/mt8196/include/arch)
7+
target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/platform/mt8196/include/platform)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* SPDX-License-Identifier: BSD-3-Clause */
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Hailong Fan <hailong.fan@mediatek.com>
6+
*/
7+
8+
#if defined(__XTOS_RTOS_IDC_H__) || defined(__ZEPHYR_RTOS_IDC_H__)
9+
10+
#ifndef __PLATFORM_DRIVERS_IDC_H__
11+
#define __PLATFORM_DRIVERS_IDC_H__
12+
13+
#include <stdint.h>
14+
15+
struct idc_msg;
16+
17+
static inline int idc_send_msg(struct idc_msg *msg, uint32_t mode)
18+
{
19+
return 0;
20+
}
21+
22+
static inline int idc_init(void)
23+
{
24+
return 0;
25+
}
26+
27+
#endif /* __PLATFORM_DRIVERS_IDC_H__ */
28+
29+
#else
30+
31+
#error "This file shouldn't be included from outside of Zephyr/XTOS's rtos/idc.h"
32+
33+
#endif
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/* SPDX-License-Identifier: BSD-3-Clause */
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Hailong Fan <hailong.fan@mediatek.com>
6+
*/
7+
#ifndef MTK_INTC_H
8+
#define MTK_INTC_H
9+
10+
#include <rtos/bit.h>
11+
#include <stdint.h>
12+
#include <platform/drivers/mt_reg_base.h>
13+
14+
enum IRQn_Type {
15+
CCU_IRQn = 0,
16+
SCP_IRQn = 1,
17+
SPM_IRQn = 2,
18+
PCIE_IRQn = 3,
19+
INFRA_HANG_IRQn = 4,
20+
PERI_TIMEOUT_IRQn = 5,
21+
MBOX_C0_IRQn = 6,
22+
MBOX_C1_IRQn = 7,
23+
TIMER0_IRQn = 8,
24+
TIMER1_IRQn = 9,
25+
IPC_C0_IRQn = 10,
26+
IPC_C1_IRQn = 11,
27+
IPC1_RSV_IRQn = 12,
28+
C2C_SW_C0_IRQn = 13,
29+
C2C_SW_C1_IRQn = 14,
30+
UART_IRQn = 15,
31+
UART_BT_IRQn = 16,
32+
LATENCY_MON_IRQn = 17,
33+
BUS_TRACKER_IRQn = 18,
34+
USB0_IRQn = 19,
35+
USB1_IRQn = 20,
36+
SCPVOW_IRQn = 21,
37+
CCIF3_C0_IRQn = 22,
38+
CCIF3_C1_IRQn = 23,
39+
PWR_CTRL_IRQn = 24,
40+
DMA_C0_IRQn = 25,
41+
DMA_C1_IRQn = 26, // no use as gdma only has one set
42+
AXI_DMA0_IRQn = 27,
43+
AXI_DMA1_IRQn = 28,
44+
AUDIO_C0_IRQn = 29,
45+
AUDIO_C1_IRQn = 30,
46+
HIFI5_WDT_C0_IRQn = 31,
47+
HIFI5_WDT_C1_IRQn = 32,
48+
APU_MBOX_C0_IRQn = 33,
49+
APU_MBOX_C1_IRQn = 34,
50+
TIMER2_IRQn = 35,
51+
PWR_ON_C0_IRQ = 36,
52+
PWR_ON_C1_IRQ = 37,
53+
WAKEUP_SRC_C0_IRQn = 38,
54+
WAKEUP_SRC_C1_IRQn = 39,
55+
WDT_IRQn = 40,
56+
CONNSYS1_IRQn = 41, // BTCVSD
57+
CONNSYS3_IRQn = 42, // BLEISO
58+
CONNSYS4_IRQn = 43, // ISOCH, bt2dsp_isoch_irq_mask
59+
CONNSYS2_IRQn = 44, // A2DP
60+
IPIC_IRQn = 45,
61+
AXI_DMA2_IRQn = 46,
62+
AXI_DMA3_IRQn = 47,
63+
APSRC_DDREN_IRQn = 48,
64+
LAT_MON_EMI_IRQn = 49,
65+
LAT_MON_INFRA_IRQn = 50,
66+
DEVAPC_VIO_IRQn = 51,
67+
AO_INFRA_HANG_IRQn = 52,
68+
BUS_TRA_EMI_IRQn = 53,
69+
BUS_TRA_INFRA_IRQn = 54,
70+
L2SRAM_VIO_IRQn = 55,
71+
L2SRAM_SETERR_IRQn = 56,
72+
PCIERC_GRP2_IRQn = 57,
73+
PCIERC_GRP3_IRQn = 58,
74+
IRQ_MAX_CHANNEL = 59,
75+
NO_IRQ = 0xFFFFFFFFU, // -1
76+
};
77+
78+
#define INTC_GRP_LEN 2
79+
#define INTC_GRP_GAP 3 // size of group = 2 words = 8 bytes
80+
#define WORD_LEN 32
81+
#define INTC_WORD(irq) ((irq) >> 5)
82+
#define INTC_BIT(irq) (1 << ((irq) & 0x1F))
83+
#define INTC_WORD_OFS(word) ((word) << 2)
84+
#ifndef INTC_GROUP_OFS
85+
#define INTC_GROUP_OFS(grp) ((grp) << INTC_GRP_GAP)
86+
#endif
87+
88+
// #define INTC_IRQ_RAW_STA(word) (INTC_IRQ_RAW_STA0 + INTC_WORD_OFS(word))
89+
#define INTC_IRQ_STA(word) (INTC_IRQ_STA0 + INTC_WORD_OFS(word))
90+
#define INTC_IRQ_EN(word) (INTC_IRQ_EN0 + INTC_WORD_OFS(word))
91+
#define INTC_IRQ_WAKE_EN(word) (INTC_IRQ_WAKE_EN0 + INTC_WORD_OFS(word))
92+
#define INTC_IRQ_STAGE1_EN(word) (INTC_IRQ_STAGE1_EN0 + INTC_WORD_OFS(word))
93+
#define INTC_IRQ_POL(word) (INTC_IRQ_POL0 + INTC_WORD_OFS(word))
94+
#define INTC_IRQ_GRP(grp, word) (INTC_IRQ_GRP0_0 + INTC_GROUP_OFS(grp)\
95+
+ INTC_WORD_OFS(word))
96+
#define INTC_IRQ_GRP_STA(grp, word) (INTC_IRQ_GRP0_STA0 + INTC_GROUP_OFS(grp)\
97+
+ INTC_WORD_OFS(word))
98+
99+
/* intc group level */
100+
#define INTC_GRP0_LEVEL XCHAL_INT0_LEVEL
101+
#define INTC_GRP1_LEVEL XCHAL_INT1_LEVEL
102+
#define INTC_GRP2_LEVEL XCHAL_INT2_LEVEL
103+
#define INTC_GRP3_LEVEL XCHAL_INT3_LEVEL
104+
#define INTC_GRP4_LEVEL XCHAL_INT4_LEVEL
105+
#define INTC_GRP5_LEVEL XCHAL_INT5_LEVEL
106+
#define INTC_GRP6_LEVEL XCHAL_INT7_LEVEL
107+
#define INTC_GRP7_LEVEL XCHAL_INT8_LEVEL
108+
#define INTC_GRP8_LEVEL XCHAL_INT9_LEVEL
109+
#define INTC_GRP9_LEVEL XCHAL_INT10_LEVEL
110+
#define INTC_GRP10_LEVEL XCHAL_INT11_LEVEL
111+
#define INTC_GRP11_LEVEL XCHAL_INT16_LEVEL
112+
#define INTC_GRP12_LEVEL XCHAL_INT17_LEVEL
113+
#define INTC_GRP13_LEVEL XCHAL_INT18_LEVEL
114+
#define INTC_GRP14_LEVEL XCHAL_INT20_LEVEL
115+
#define INTC_GRP15_LEVEL XCHAL_INT21_LEVEL
116+
117+
118+
enum INTC_GROUP {
119+
INTC_GRP0 = 0,
120+
INTC_GRP1,
121+
INTC_GRP2,
122+
INTC_GRP3,
123+
INTC_GRP4,
124+
INTC_GRP5,
125+
INTC_GRP6,
126+
INTC_GRP7,
127+
INTC_GRP8,
128+
INTC_GRP9,
129+
INTC_GRP10,
130+
INTC_GRP11,
131+
INTC_GRP12,
132+
INTC_GRP13,
133+
INTC_GRP14,
134+
INTC_GRP15,
135+
INTC_GRP_NUM,
136+
NO_GRP,
137+
};
138+
139+
enum INTC_POL {
140+
INTC_POL_HIGH = 0x0,
141+
INTC_POL_LOW = 0x1,
142+
INTC_POL_NUM,
143+
};
144+
145+
struct intc_irq_desc_t {
146+
uint8_t id;
147+
uint8_t group;
148+
uint8_t pol;
149+
};
150+
151+
struct intc_desc_t {
152+
uint32_t int_en[INTC_GRP_LEN];
153+
uint32_t grp_irqs[INTC_GRP_NUM][INTC_GRP_LEN];
154+
struct intc_irq_desc_t irqs[IRQ_MAX_CHANNEL];
155+
};
156+
157+
struct intc_irq_config {
158+
uint32_t int_en[INTC_GRP_LEN];
159+
};
160+
161+
struct intc_grp_config {
162+
uint32_t grp_irq[INTC_GRP_NUM][INTC_GRP_LEN];
163+
};
164+
165+
struct intc_coreoff_wake_en_config {
166+
uint32_t wake_en[INTC_GRP_LEN];
167+
};
168+
169+
struct intc_sleep_wake_en_config {
170+
uint32_t wake_en[INTC_GRP_LEN];
171+
};
172+
173+
extern const unsigned char grp_pri[INTC_GRP_NUM];
174+
extern const uint8_t irq2grp_map[IRQ_MAX_CHANNEL];
175+
extern const uint8_t grp2hifi_irq_map[INTC_GRP_NUM];
176+
void intc_init(void);
177+
178+
#ifdef CFG_TICKLESS_SUPPORT
179+
extern struct intc_sleep_wake_en_config sleep_wakeup_src_en;
180+
#endif
181+
#ifdef CFG_CORE_OFF_SUPPORT
182+
extern struct intc_coreoff_wake_en_config coreoff_wakeup_src_en;
183+
#endif
184+
185+
#endif /* INTC_H */
186+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/* SPDX-License-Identifier: BSD-3-Clause */
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Hailong Fan <hailong.fan@mediatek.com>
6+
*/
7+
8+
#ifdef __SOF_DRIVERS_INTERRUPT_H__
9+
10+
#ifndef __PLATFORM_DRIVERS_INTERRUPT_H__
11+
#define __PLATFORM_DRIVERS_INTERRUPT_H__
12+
13+
#include <stdint.h>
14+
#include <platform/drivers/mt_reg_base.h>
15+
#include <platform/drivers/intc.h>
16+
17+
#define PLATFORM_IRQ_HW_NUM XCHAL_NUM_INTERRUPTS
18+
#define PLATFORM_IRQ_FIRST_CHILD PLATFORM_IRQ_HW_NUM
19+
#define PLATFORM_IRQ_CHILDREN 32
20+
21+
/* MTK_ADSP_IRQ_MASK */
22+
#define MTK_DSP_OUT_IRQ_MASK 0x3FF
23+
24+
#define HIFI_IRQ_MAX_CHANNEL 26
25+
26+
#define DEFALUT_WAKEUP_SRC_MASK_BIT 0x001A5E13
27+
#define DEFAULT_WAKEUP_SRC_EN0_BIT 0xA046B550
28+
#define DEFAULT_WAKEUP_SRC_EN1_BIT 0x00002148
29+
30+
#define MTK_DSP_IRQ_MBOX_C0 2
31+
#define MTK_DSP_IRQ_OSTIMER32_C0 1
32+
#define IPC0_IRQn IPC_C0_IRQn
33+
#define C2C_SW_IRQn C2C_SW_C0_IRQn
34+
#define CCIF3_IRQn CCIF3_C0_IRQn
35+
#define DMA_IRQn DMA_C0_IRQn
36+
#define AUDIO_IRQn AUDIO_C0_IRQn
37+
#define HIFI5_WDT_IRQn HIFI5_WDT_C0_IRQn
38+
#define APU_MBOX_IRQn APU_MBOX_C0_IRQn
39+
#define PWR_ON_CORE_IRQn PWR_ON_C0_IRQ
40+
#define WAKEUP_SRC_IRQn WAKEUP_SRC_C0_IRQn
41+
#define AXI_DMA_CH0_IRQn AXI_DMA0_IRQn
42+
#define AXI_DMA_CH1_IRQn AXI_DMA2_IRQn
43+
44+
/* following interrupts are HiFi internal interrupts */
45+
#define MTK_DSP_IRQ_NMI 25
46+
#define MTK_DSP_IRQ_PROFILING 29
47+
#define MTK_DSP_IRQ_WERR 30
48+
#define MTK_DSP_IRQ_SW 31
49+
#define MTK_MAX_IRQ_NUM 59
50+
51+
/* grouped mailbox IRQ */
52+
#define MTK_DSP_IRQ_MBOX0 59
53+
#define MTK_DSP_IRQ_MBOX1 60
54+
#define MTK_DSP_IRQ_MBOX2 61
55+
#define MTK_DSP_IRQ_MBOX3 62
56+
#define MTK_DSP_IRQ_MBOX4 63
57+
58+
#define MTK_DSP_MBOX_MASK 0xF
59+
60+
int mtk_irq_group_id(uint32_t irq);
61+
void intc_irq_unmask(enum IRQn_Type irq);
62+
void intc_irq_mask(enum IRQn_Type irq);
63+
int intc_irq_enable(enum IRQn_Type irq);
64+
int intc_irq_disable(enum IRQn_Type irq);
65+
66+
#endif /* __PLATFORM_DRIVERS_INTERRUPT_H__ */
67+
68+
#else
69+
70+
#error "This file shouldn't be included from outside of sof/drivers/interrupt.h"
71+
72+
#endif /* __SOF_DRIVERS_INTERRUPT_H__ */

src/platform/mt8196/include/platform/drivers/mt_reg_base.h

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#define MTK_ADSP_GENERAL_IRQ_CLR (MTK_DSP_CFGREG_BASE + 0x0038)
2323
#define MTK_ADSP_DVFSRC_STATE (MTK_DSP_CFGREG_BASE + 0x003c)
2424
#define MTK_ADSP_DVFSRC_REQ (MTK_DSP_CFGREG_BASE + 0x0040)
25-
//todo
2625
#define MTK_ADSP_DDREN_REQ_0 (MTK_DSP_CFGREG_BASE + 0x0044)
2726
#define MTK_ADSP_SPM_ACK (MTK_DSP_CFGREG_BASE + 0x004c)
2827
#define MTK_ADSP_IRQ_EN (MTK_DSP_CFGREG_BASE + 0x0050)
@@ -53,7 +52,6 @@
5352
#define INTC_IRQ_GRP0_STA0 (MTK_ADSP_INTC_BASE + 0x0C0)
5453
#define INTC_GRP_IRQ_OUT_STA (MTK_ADSP_INTC_BASE + 0x140)
5554

56-
//todo
5755
#define MTK_GPR_RW_REG0 (MTK_DSP_CFGREG_BASE + 0x0440)
5856
#define MTK_GPR_RW_REG1 (MTK_DSP_CFGREG_BASE + 0x0444)
5957
#define MTK_GPR_RW_REG2 (MTK_DSP_CFGREG_BASE + 0x0448)
@@ -91,7 +89,6 @@
9189
#define MTK_DSP_CKCTRL_BASE (MTK_DSP_CFGREG_BASE + 0x1000)
9290
#define MTK_DSP_CKCTRL_SIZE 0x1000
9391

94-
//todo
9592
#define MTK_DSP_OS_TIMER_BASE (MTK_DSP_CFGREG_BASE + 0xB000)
9693
#define MTK_DSP_OS_TIMER_SIZE 0x1000
9794

@@ -106,35 +103,6 @@
106103
#define MTK_DSP_SECURE_BASE (MTK_DSP_CFGREG_BASE + 0x345000)
107104
#define MTK_MBOX_IRQ_IN (MTK_DSP_SECURE_BASE + 0x70)
108105

109-
#define MTK_REG_TOPCKGEN_BASE 0x10000000
110-
#define MTK_REG_TOPCKGEN_SIZE 0x1000
111-
#define MTK_CLK_CFG_UPDATE1 (MTK_REG_TOPCKGEN_BASE + 0x0008)
112-
#define MTK_CLK_CFG_13_STA (MTK_REG_TOPCKGEN_BASE + 0x00E0)
113-
#define MTK_CLK_CFG_13_SET (MTK_REG_TOPCKGEN_BASE + 0x00E4)
114-
#define MTK_CLK_CFG_13_CLR (MTK_REG_TOPCKGEN_BASE + 0x00E8)
115-
#define MTK_ADSP_CK_UPDATE (0x1 << 23)
116-
#define MTK_ADSP_SEL_BASE (16)
117-
118-
//todo
119-
#define MTK_CLK_CFG_UPDATE2 (MTK_REG_TOPCKGEN_BASE + 0x000C)
120-
#define MTK_CLK_CFG_17 (MTK_REG_TOPCKGEN_BASE + 0x0EC)
121-
#define MTK_CLK_CFG_17_SET (MTK_REG_TOPCKGEN_BASE + 0x0F0)
122-
#define MTK_CLK_CFG_17_CLR (MTK_REG_TOPCKGEN_BASE + 0x0F4)
123-
#define MTK_CLK_CFG_17_CLR (MTK_REG_TOPCKGEN_BASE + 0x0F4)
124-
125-
//todo, pll base?
126-
#define MTK_REG_APMIXDSYS_BASE 0x10000800
127-
#define MTK_REG_APMIXDSYS_SIZE 0x1000
128-
129-
//todo
130-
#define MTK_PLLEN_ALL_EN (MTK_REG_APMIXDSYS_BASE + 0x0080)
131-
#define MTK_PLLEN_ALL_SET (MTK_REG_APMIXDSYS_BASE + 0x0084)
132-
#define MTK_PLLEN_ALL_CLR (MTK_REG_APMIXDSYS_BASE + 0x0088)
133-
#define MTK_ADSPPLL_CON0 (MTK_REG_APMIXDSYS_BASE + 0x028c)
134-
#define MTK_ADSPPLL_CON1 (MTK_REG_APMIXDSYS_BASE + 0x0290)
135-
#define MTK_PLL_ADSP_EN_BIT (0x1 << 3)
136-
137-
138106
/* MBOX registers */
139107
#define MTK_ADSP_MBOX_BASE (MTK_DSP_CFGREG_BASE + 0x350000)
140108
#define MTK_ADSP_MBOX_REG_BASE(x) (MTK_ADSP_MBOX_BASE + (0x10000 * (x)))

0 commit comments

Comments
 (0)