soc/mediatek: add support for tracker version one
There are two versions for tracker system: Version 1 for MT8186, and version 2 for MT8192 and MT8195. Reference document: MT8169_bus_dbg_tracker_cfg_reg.xls from MediaTek internal. BUG=b:202871018 TEST=build pass Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com> Change-Id: Idb146974da118b1cf5a349370bf7b2fa13f1aba8 Reviewed-on: https://review.coreboot.org/c/coreboot/+/59989 Reviewed-by: Yu-Ping Wu <yupingso@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		| @@ -1,25 +1,9 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #ifndef SOC_MEDIATEK_COMMON_TRACKER_H | ||||
| #define SOC_MEDIATEK_COMMON_TRACKER_H | ||||
| #ifndef SOC_MEDIATEK_TRACKER_COMMON_H | ||||
| #define SOC_MEDIATEK_TRACKER_COMMON_H | ||||
|  | ||||
| #define BUS_DBG_CON			0x000 | ||||
| #define BUS_DBG_TIMER_CON0		0x004 | ||||
| #define BUS_DBG_TIMER_CON1		0x008 | ||||
| #define BUS_TRACE_CON_1			0x900 | ||||
| #define BUS_TRACE_CON_AO_1		0x9FC | ||||
| #define BUS_TRACE_CON_2			0xA00 | ||||
| #define BUS_TRACE_CON_AO_2		0xAFC | ||||
| #define BUS_TRACE_EN			16 | ||||
|  | ||||
| #define SYS_TRACK_ENTRY			64 | ||||
| #define INFRA_ENTRY_NUM			32 | ||||
| #define PERI_ENTRY_NUM			16 | ||||
|  | ||||
| #define AR_TRACK_OFFSET			0x0100 | ||||
| #define AW_TRACK_OFFSET			0x0300 | ||||
|  | ||||
| #define BUSTRACKER_TIMEOUT		0x300 | ||||
| #include <stdint.h> | ||||
|  | ||||
| #define BUS_DBG_CON_IRQ_AR_STA0		0x00000100 | ||||
| #define BUS_DBG_CON_IRQ_AW_STA0		0x00000200 | ||||
| @@ -28,13 +12,17 @@ | ||||
| #define BUS_DBG_CON_TIMEOUT		(BUS_DBG_CON_IRQ_AR_STA0 | BUS_DBG_CON_IRQ_AW_STA0 | \ | ||||
| 					 BUS_DBG_CON_IRQ_AR_STA1 | BUS_DBG_CON_IRQ_AW_STA1) | ||||
|  | ||||
| enum { | ||||
| 	TRACKER_SYSTRACKER = 0, | ||||
| 	TRACKER_INFRATRACKER, | ||||
| 	TRACKER_PERISYSTRACKER, | ||||
| 	TRACKER_NUM, | ||||
| struct tracker { | ||||
| 	uintptr_t base_addr; | ||||
| 	u32 timeout; | ||||
| 	u32 entry; | ||||
| 	u32 offset[2]; | ||||
| 	const char *str; | ||||
| }; | ||||
|  | ||||
| extern struct tracker tracker_data[]; | ||||
|  | ||||
| void tracker_setup(void); | ||||
| void bustracker_init(void); | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/soc/mediatek/common/include/soc/tracker_v1.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/soc/mediatek/common/include/soc/tracker_v1.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #ifndef SOC_MEDIATEK_TRACKER_V1_H | ||||
| #define SOC_MEDIATEK_TRACKER_V1_H | ||||
|  | ||||
| #define SYS_TRACK_ENTRY			8 | ||||
|  | ||||
| #define AR_TRACK_OFFSET			0x0100 | ||||
| #define AW_TRACK_OFFSET			0x0200 | ||||
|  | ||||
| enum { | ||||
| 	TRACKER_SYSTRACKER = 0, | ||||
| 	TRACKER_NUM, | ||||
| }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										31
									
								
								src/soc/mediatek/common/include/soc/tracker_v2.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/soc/mediatek/common/include/soc/tracker_v2.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #ifndef SOC_MEDIATEK_TRACKER_V2_H | ||||
| #define SOC_MEDIATEK_TRACKER_V2_H | ||||
|  | ||||
| #define BUS_DBG_CON			0x000 | ||||
| #define BUS_DBG_TIMER_CON0		0x004 | ||||
| #define BUS_DBG_TIMER_CON1		0x008 | ||||
| #define BUS_TRACE_CON_1			0x900 | ||||
| #define BUS_TRACE_CON_AO_1		0x9FC | ||||
| #define BUS_TRACE_CON_2			0xA00 | ||||
| #define BUS_TRACE_CON_AO_2		0xAFC | ||||
| #define BUS_TRACE_EN			16 | ||||
|  | ||||
| #define SYS_TRACK_ENTRY			64 | ||||
| #define INFRA_ENTRY_NUM			32 | ||||
| #define PERI_ENTRY_NUM			16 | ||||
|  | ||||
| #define AR_TRACK_OFFSET			0x0100 | ||||
| #define AW_TRACK_OFFSET			0x0300 | ||||
|  | ||||
| #define BUSTRACKER_TIMEOUT		0x300 | ||||
|  | ||||
| enum { | ||||
| 	TRACKER_SYSTRACKER = 0, | ||||
| 	TRACKER_INFRATRACKER, | ||||
| 	TRACKER_PERISYSTRACKER, | ||||
| 	TRACKER_NUM, | ||||
| }; | ||||
|  | ||||
| #endif | ||||
| @@ -1,81 +1,11 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <console/console.h> | ||||
| #include <device/mmio.h> | ||||
| #include <soc/addressmap.h> | ||||
| #include <soc/tracker.h> | ||||
| #include <soc/tracker_common.h> | ||||
|  | ||||
| static struct tracker { | ||||
| 	uintptr_t base_addr; | ||||
| 	u32 timeout; | ||||
| 	u32 entry; | ||||
| 	u32 offset[2]; | ||||
| 	const char *str; | ||||
| } tracker_data[TRACKER_NUM] = { | ||||
| 	[TRACKER_SYSTRACKER] = { | ||||
| 		.base_addr = DBG_TRACKER_BASE, | ||||
| 		.timeout = BUS_DBG_CON_TIMEOUT, | ||||
| 		.entry = SYS_TRACK_ENTRY, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "systracker", | ||||
| 	}, | ||||
| 	[TRACKER_INFRATRACKER] = { | ||||
| 		.base_addr = INFRA_TRACKER_BASE, | ||||
| 		.timeout = BUSTRACKER_TIMEOUT, | ||||
| 		.entry = INFRA_ENTRY_NUM, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "infra_tracker", | ||||
| 	}, | ||||
| 	[TRACKER_PERISYSTRACKER] = { | ||||
| 		.base_addr = PERI_TRACKER_BASE, | ||||
| 		.timeout = BUSTRACKER_TIMEOUT, | ||||
| 		.entry = PERI_ENTRY_NUM, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "peri_tracker", | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| static void setup_init(void) | ||||
| { | ||||
| 	u32 val; | ||||
| 	/* | ||||
| 	 * Set infra/peri tracker timeout. | ||||
| 	 * timeout = clock_in_mhz * 1000 / 16 * timeout_in_ms | ||||
| 	 * | ||||
| 	 * timeout: 200ms | ||||
| 	 * infra tracker clock: 156MHz | ||||
| 	 * peri tracker clock: 78MHz | ||||
| 	 */ | ||||
| 	val = 156 * 1000 / 16 * 200; | ||||
| 	write32((void *)(INFRA_TRACKER_BASE + BUS_DBG_TIMER_CON0), val); | ||||
| 	write32((void *)(INFRA_TRACKER_BASE + BUS_DBG_TIMER_CON1), val); | ||||
|  | ||||
| 	val = 78 * 1000 / 16 * 200; | ||||
| 	write32((void *)(PERI_TRACKER_BASE + BUS_DBG_TIMER_CON0), val); | ||||
| 	write32((void *)(PERI_TRACKER_BASE + BUS_DBG_TIMER_CON1), val); | ||||
|  | ||||
| 	/* Enable infra/peri tracer because tracker and tracer share the same enable bit. */ | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_1), 1 << BUS_TRACE_EN); | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_2), 1 << BUS_TRACE_EN); | ||||
|  | ||||
| 	/* | ||||
| 	 * Enable infra/peri tracker. | ||||
| 	 * bit[0] - BUS_DBG_EN | ||||
| 	 * bit[1] - TIMEOUT_EN | ||||
| 	 * bit[2] - SLV_ERR_EN | ||||
| 	 * bit[13] - HALT_ON_TIMEOUT_EN | ||||
| 	 * bit[14] - BUS_OT_WEN_CTRL | ||||
| 	 */ | ||||
| 	val = BIT(0) | BIT(1) | BIT(2) | BIT(13) | BIT(14); | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_AO_1), val); | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_AO_2), val); | ||||
|  | ||||
| } | ||||
|  | ||||
| static void tracker_dump_data(void) | ||||
| { | ||||
| 	int i, j, k; | ||||
| @@ -91,19 +21,6 @@ static void tracker_dump_data(void) | ||||
|  | ||||
| 		printk(BIOS_INFO, "**Dump %s debug register start**\n", tra->str); | ||||
| 		for (k = 0; k < 2; k++) { | ||||
| 			/* | ||||
| 			 * for systracker: | ||||
| 			 * offset[0] dump from offset 0x100 ~ 0x2F8. | ||||
| 			 * offset[1] dump from offset 0x300 ~ 0x4FC | ||||
| 			 * | ||||
| 			 * for infra tracker: | ||||
| 			 * offset[0] dump from offset 0x100 ~ 0x1F8 | ||||
| 			 * offset[1] dump from offset 0x300 ~ 0x3FC | ||||
| 			 * | ||||
| 			 * for perisys tracker: | ||||
| 			 * offset[0] dump from offset 0x100 ~ 0x2F8 | ||||
| 			 * offset[1] dump from offset 0x300 ~ 0x4FC | ||||
| 			 */ | ||||
| 			size = 2 * tra->entry; | ||||
| 			for (i = 0; i < size; i++) { | ||||
| 				reg = tra->base_addr + tra->offset[k] + i * 4; | ||||
| @@ -121,5 +38,5 @@ static void tracker_dump_data(void) | ||||
| void bustracker_init(void) | ||||
| { | ||||
| 	tracker_dump_data(); | ||||
| 	setup_init(); | ||||
| 	tracker_setup(); | ||||
| } | ||||
|   | ||||
							
								
								
									
										21
									
								
								src/soc/mediatek/common/tracker_v1.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/soc/mediatek/common/tracker_v1.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #include <soc/addressmap.h> | ||||
| #include <soc/tracker.h> | ||||
| #include <soc/tracker_common.h> | ||||
|  | ||||
| /* | ||||
|  * for systracker: | ||||
|  * offset[0] dump from offset 0x100 ~ 0x13C. | ||||
|  * offset[1] dump from offset 0x200 ~ 0x23C. | ||||
|  */ | ||||
| struct tracker tracker_data[TRACKER_NUM] = { | ||||
| 	[TRACKER_SYSTRACKER] = { | ||||
| 		.base_addr = DBG_TRACKER_BASE, | ||||
| 		.timeout = BUS_DBG_CON_TIMEOUT, | ||||
| 		.entry = SYS_TRACK_ENTRY, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "systracker", | ||||
| 	}, | ||||
| }; | ||||
							
								
								
									
										82
									
								
								src/soc/mediatek/common/tracker_v2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/soc/mediatek/common/tracker_v2.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #include <device/mmio.h> | ||||
| #include <soc/addressmap.h> | ||||
| #include <soc/tracker.h> | ||||
| #include <soc/tracker_common.h> | ||||
|  | ||||
| /* | ||||
|  * for systracker: | ||||
|  * offset[0] dump from offset 0x100 ~ 0x2F8. | ||||
|  * offset[1] dump from offset 0x300 ~ 0x4FC | ||||
|  * | ||||
|  * for infra tracker: | ||||
|  * offset[0] dump from offset 0x100 ~ 0x1F8 | ||||
|  * offset[1] dump from offset 0x300 ~ 0x3FC | ||||
|  * | ||||
|  * for perisys tracker: | ||||
|  * offset[0] dump from offset 0x100 ~ 0x2F8 | ||||
|  * offset[1] dump from offset 0x300 ~ 0x4FC | ||||
|  */ | ||||
| struct tracker tracker_data[TRACKER_NUM] = { | ||||
| 	[TRACKER_SYSTRACKER] = { | ||||
| 		.base_addr = DBG_TRACKER_BASE, | ||||
| 		.timeout = BUS_DBG_CON_TIMEOUT, | ||||
| 		.entry = SYS_TRACK_ENTRY, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "systracker", | ||||
| 	}, | ||||
| 	[TRACKER_INFRATRACKER] = { | ||||
| 		.base_addr = INFRA_TRACKER_BASE, | ||||
| 		.timeout = BUSTRACKER_TIMEOUT, | ||||
| 		.entry = INFRA_ENTRY_NUM, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "infra_tracker", | ||||
| 	}, | ||||
| 	[TRACKER_PERISYSTRACKER] = { | ||||
| 		.base_addr = PERI_TRACKER_BASE, | ||||
| 		.timeout = BUSTRACKER_TIMEOUT, | ||||
| 		.entry = PERI_ENTRY_NUM, | ||||
| 		.offset[0] = AR_TRACK_OFFSET, | ||||
| 		.offset[1] = AW_TRACK_OFFSET, | ||||
| 		.str = "peri_tracker", | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| void tracker_setup(void) | ||||
| { | ||||
| 	u32 val; | ||||
| 	/* | ||||
| 	 * Set infra/peri tracker timeout. | ||||
| 	 * timeout = clock_in_mhz * 1000 / 16 * timeout_in_ms | ||||
| 	 * | ||||
| 	 * timeout: 200ms | ||||
| 	 * infra tracker clock: 156MHz | ||||
| 	 * peri tracker clock: 78MHz | ||||
| 	 */ | ||||
| 	val = 156 * 1000 / 16 * 200; | ||||
| 	write32((void *)(INFRA_TRACKER_BASE + BUS_DBG_TIMER_CON0), val); | ||||
| 	write32((void *)(INFRA_TRACKER_BASE + BUS_DBG_TIMER_CON1), val); | ||||
|  | ||||
| 	val = 78 * 1000 / 16 * 200; | ||||
| 	write32((void *)(PERI_TRACKER_BASE + BUS_DBG_TIMER_CON0), val); | ||||
| 	write32((void *)(PERI_TRACKER_BASE + BUS_DBG_TIMER_CON1), val); | ||||
|  | ||||
| 	/* Enable infra/peri tracer because tracker and tracer share the same enable bit. */ | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_1), 1 << BUS_TRACE_EN); | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_2), 1 << BUS_TRACE_EN); | ||||
|  | ||||
| 	/* | ||||
| 	 * Enable infra/peri tracker. | ||||
| 	 * bit[0] - BUS_DBG_EN | ||||
| 	 * bit[1] - TIMEOUT_EN | ||||
| 	 * bit[2] - SLV_ERR_EN | ||||
| 	 * bit[13] - HALT_ON_TIMEOUT_EN | ||||
| 	 * bit[14] - BUS_OT_WEN_CTRL | ||||
| 	 */ | ||||
| 	val = BIT(0) | BIT(1) | BIT(2) | BIT(13) | BIT(14); | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_AO_1), val); | ||||
| 	write32((void *)(BUS_TRACE_MONITOR_BASE + BUS_TRACE_CON_AO_2), val); | ||||
| } | ||||
| @@ -10,7 +10,7 @@ bootblock-y += ../common/mmu_operations.c | ||||
| bootblock-y += ../common/pll.c pll.c | ||||
| bootblock-$(CONFIG_SPI_FLASH) += ../common/spi.c spi.c | ||||
| bootblock-y += ../common/timer.c | ||||
| bootblock-y += ../common/tracker.c | ||||
| bootblock-y += ../common/tracker.c ../common/tracker_v2.c | ||||
| bootblock-y += ../common/uart.c | ||||
| bootblock-y += ../common/wdt.c | ||||
|  | ||||
|   | ||||
							
								
								
									
										8
									
								
								src/soc/mediatek/mt8192/include/soc/tracker.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/soc/mediatek/mt8192/include/soc/tracker.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #ifndef SOC_MEDIATEK_MT8192_TRACKER_H | ||||
| #define SOC_MEDIATEK_MT8192_TRACKER_H | ||||
|  | ||||
| #include <soc/tracker_v2.h> | ||||
|  | ||||
| #endif | ||||
| @@ -7,7 +7,7 @@ bootblock-y += ../common/flash_controller.c | ||||
| bootblock-y += ../common/gpio.c gpio.c | ||||
| bootblock-y += ../common/i2c.c i2c.c | ||||
| bootblock-y += ../common/mmu_operations.c | ||||
| bootblock-y += ../common/tracker.c | ||||
| bootblock-y += ../common/tracker.c ../common/tracker_v2.c | ||||
| bootblock-y += ../common/pll.c pll.c | ||||
| bootblock-$(CONFIG_SPI_FLASH) += ../common/spi.c spi.c | ||||
| bootblock-y += ../common/timer.c timer.c | ||||
|   | ||||
							
								
								
									
										8
									
								
								src/soc/mediatek/mt8195/include/soc/tracker.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/soc/mediatek/mt8195/include/soc/tracker.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #ifndef SOC_MEDIATEK_MT8195_TRACKER_H | ||||
| #define SOC_MEDIATEK_MT8195_TRACKER_H | ||||
|  | ||||
| #include <soc/tracker_v2.h> | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user