soc/mediatek/mt8196: Enable MMU operation for L2C SRAM and DMA
- Turn off L2C SRAM and reconfigure as L2 cache: Mediatek SoC uses part of the L2 cache as SRAM before DRAM is ready. After DRAM is ready, we should invoke disable_l2c_sram to reconfigure the L2C SRAM as L2 cache. - Configure DMA buffer in DRAM: Set DRAM DMA to be non-cacheable to load blob correctly. TEST=build pass, register(disable_l2c) read ok BUG=b:317009620 Change-Id: I6a3cb63d3418f085f5d8d08b282dd59ea431c294 Signed-off-by: Jarried Lin <jarried.lin@mediatek.corp-partner.google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/83925 Reviewed-by: Yidi Lin <yidilin@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
parent
abf34584db
commit
6c8974b5c7
3 changed files with 51 additions and 0 deletions
|
|
@ -13,8 +13,12 @@ bootblock-y += ../common/mmu_operations.c
|
|||
|
||||
romstage-y += ../common/cbmem.c
|
||||
romstage-y += emi.c
|
||||
romstage-y += l2c_ops.c
|
||||
romstage-y += ../common/mmu_operations.c ../common/mmu_cmops.c
|
||||
|
||||
ramstage-y += emi.c
|
||||
ramstage-y += l2c_ops.c
|
||||
ramstage-y += ../common/mmu_operations.c ../common/mmu_cmops.c
|
||||
ramstage-y += soc.c
|
||||
|
||||
CPPFLAGS_common += -Isrc/soc/mediatek/mt8196/include
|
||||
|
|
|
|||
45
src/soc/mediatek/mt8196/l2c_ops.c
Normal file
45
src/soc/mediatek/mt8196/l2c_ops.c
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
/*
|
||||
* This file is created based on MT8196 Functional Specification
|
||||
* Chapter number: 9
|
||||
*/
|
||||
|
||||
#include <device/mmio.h>
|
||||
#include <soc/mmu_operations.h>
|
||||
|
||||
DEFINE_BIT(MP0_CLUSTER_CFG0_L3_SHARE_FULLNHALF, 0)
|
||||
DEFINE_BIT(MP0_CLUSTER_CFG0_L3_SHARE_EN, 1)
|
||||
DEFINE_BIT(MP0_CLUSTER_CFG0_L3_SHARE_PRE_EN, 2)
|
||||
|
||||
#define MP0_CLUSTER_CFG0 0x0C000060
|
||||
#define CLUST_DIS_VAL 0x3
|
||||
#define CLUST_DIS_SHIFT 0x4
|
||||
|
||||
void mtk_soc_disable_l2c_sram(void)
|
||||
{
|
||||
unsigned long v;
|
||||
|
||||
uint32_t *mp0_cluster_cfg0 = (void *)(MP0_CLUSTER_CFG0);
|
||||
|
||||
SET32_BITFIELDS(mp0_cluster_cfg0,
|
||||
MP0_CLUSTER_CFG0_L3_SHARE_EN, 0);
|
||||
dsb();
|
||||
|
||||
__asm__ volatile ("mrs %0, S3_0_C15_C3_5" : "=r" (v));
|
||||
v |= (CLUST_DIS_VAL << CLUST_DIS_SHIFT);
|
||||
__asm__ volatile ("msr S3_0_C15_C3_5, %0" : : "r" (v));
|
||||
dsb();
|
||||
|
||||
do {
|
||||
__asm__ volatile ("mrs %0, S3_0_C15_C3_7" : "=r" (v));
|
||||
} while (((v >> CLUST_DIS_SHIFT) & CLUST_DIS_VAL) != CLUST_DIS_VAL);
|
||||
|
||||
SET32_BITFIELDS(mp0_cluster_cfg0,
|
||||
MP0_CLUSTER_CFG0_L3_SHARE_PRE_EN, 0);
|
||||
|
||||
SET32_BITFIELDS(mp0_cluster_cfg0,
|
||||
MP0_CLUSTER_CFG0_L3_SHARE_FULLNHALF, 0);
|
||||
|
||||
dsb();
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <device/device.h>
|
||||
#include <soc/emi.h>
|
||||
#include <soc/mmu_operations.h>
|
||||
#include <symbols.h>
|
||||
|
||||
static void soc_read_resources(struct device *dev)
|
||||
|
|
@ -11,6 +12,7 @@ static void soc_read_resources(struct device *dev)
|
|||
|
||||
static void soc_init(struct device *dev)
|
||||
{
|
||||
mtk_mmu_disable_l2c_sram();
|
||||
}
|
||||
|
||||
static struct device_operations soc_ops = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue