Merge "feat(mt8189): add support display driver" into integration
diff --git a/plat/mediatek/drivers/disp/mt8189/mtk_disp_plat.c b/plat/mediatek/drivers/disp/mt8189/mtk_disp_plat.c
new file mode 100644
index 0000000..cefba82
--- /dev/null
+++ b/plat/mediatek/drivers/disp/mt8189/mtk_disp_plat.c
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2025, MediaTek Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <mtk_disp_priv.h>
+#include <mtk_mmap_pool.h>
+#include <platform_def.h>
+
+/* disp config */
+#define MMSYS_SEC_DIS_0 (0xA00)
+#define MMSYS_SEC_DIS_1 (0xA04)
+#define MMSYS_SEC_DIS_2 (0xA08)
+#define MMSYS_SHADOW (0xC00)
+#define MMSYS_CB_CON (0xC0C)
+#define MMSYS_CG_CON (0x110)
+
+const struct mtk_disp_config mt8189_disp_cfg[] = {
+ /*SECURITY0*/
+ DISP_CFG_ENTRY(MMSYS_CONFIG_BASE + MMSYS_SEC_DIS_0, 0xFFFFFFFF),
+ /*SECURITY1*/
+ DISP_CFG_ENTRY(MMSYS_CONFIG_BASE + MMSYS_SEC_DIS_1, 0xFFFFFFFF),
+ /*SECURITY2*/
+ DISP_CFG_ENTRY(MMSYS_CONFIG_BASE + MMSYS_SEC_DIS_2, 0xFFFFFFFF),
+ /*SHADOW*/
+ DISP_CFG_ENTRY(MMSYS_CONFIG_BASE + MMSYS_SHADOW, 0x1),
+ /*CROSSBAR*/
+ DISP_CFG_ENTRY(MMSYS_CONFIG_BASE + MMSYS_CB_CON, 0x00FF0000),
+ /*CG_BIT*/
+ DISP_CFG_ENTRY(MMSYS_CONFIG_BASE + MMSYS_CG_CON, 0x10000),
+};
+
+const struct mtk_disp_config *disp_cfg = &mt8189_disp_cfg[0];
+const size_t disp_cfg_count = ARRAY_SIZE(mt8189_disp_cfg);
diff --git a/plat/mediatek/drivers/disp/mtk_disp_priv.h b/plat/mediatek/drivers/disp/mtk_disp_priv.h
new file mode 100644
index 0000000..9ae1162
--- /dev/null
+++ b/plat/mediatek/drivers/disp/mtk_disp_priv.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2025, MediaTek Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef DISP_PRIV_H
+#define DISP_PRIV_H
+
+#include <common/debug.h>
+#include <lib/mmio.h>
+
+#define DISP_CFG_ENTRY(base_reg, mask) \
+ { .base = (base_reg), .ns_mask = (mask)}
+
+struct mtk_disp_config {
+ uint32_t base;
+ uint32_t ns_mask;
+};
+
+enum DISP_ATF_CMD {
+ DISP_ATF_CMD_CONFIG_DISP_CONFIG,
+ DISP_ATF_CMD_COUNT,
+};
+
+/* disable secure mode for disp */
+extern const struct mtk_disp_config *disp_cfg;
+extern const size_t disp_cfg_count;
+
+#endif /* DISP_PRIV_H */
diff --git a/plat/mediatek/drivers/disp/mtk_disp_smc.c b/plat/mediatek/drivers/disp/mtk_disp_smc.c
new file mode 100644
index 0000000..746ba46
--- /dev/null
+++ b/plat/mediatek/drivers/disp/mtk_disp_smc.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2025, MediaTek Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <mtk_disp_priv.h>
+#include <mtk_sip_svc.h>
+
+/* defination */
+static int mtk_disp_disable_sec(uint32_t larb_id, uint32_t mmu_en_msk)
+{
+ const struct mtk_disp_config *disp_cfg_t;
+ uint32_t cfg_cnt;
+
+ for (cfg_cnt = 0; cfg_cnt < (disp_cfg_count - 1); cfg_cnt++) {
+ disp_cfg_t = &disp_cfg[cfg_cnt];
+ mmio_setbits_32(disp_cfg_t->base, disp_cfg_t->ns_mask);
+ }
+
+ disp_cfg_t = &disp_cfg[disp_cfg_count - 1];
+ mmio_clrbits_32(disp_cfg_t->base, disp_cfg_t->ns_mask);
+
+ return MTK_SIP_E_SUCCESS;
+}
+
+static u_register_t mtk_disp_handler(u_register_t x1, u_register_t x2,
+ u_register_t x3, u_register_t x4,
+ void *handle, struct smccc_res *smccc_ret)
+{
+ uint32_t cmd_id = x1, mdl_id = x2, val = x3;
+ int ret = MTK_SIP_E_NOT_SUPPORTED;
+
+ (void)x4;
+ (void)handle;
+ (void)smccc_ret;
+
+ switch (cmd_id) {
+ case DISP_ATF_CMD_CONFIG_DISP_CONFIG:
+ ret = mtk_disp_disable_sec(mdl_id, val);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+DECLARE_SMC_HANDLER(MTK_SIP_DISP_CONTROL, mtk_disp_handler);
diff --git a/plat/mediatek/drivers/disp/rules.mk b/plat/mediatek/drivers/disp/rules.mk
new file mode 100644
index 0000000..d05935e
--- /dev/null
+++ b/plat/mediatek/drivers/disp/rules.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2025, MediaTek Inc. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+LOCAL_DIR := $(call GET_LOCAL_DIR)
+
+MODULE := mtk_disp
+
+LOCAL_SRCS-y := ${LOCAL_DIR}/mtk_disp_smc.c
+LOCAL_SRCS-y += ${LOCAL_DIR}/${MTK_SOC}/mtk_disp_plat.c
+
+PLAT_INCLUDES += -I${LOCAL_DIR}
+PLAT_INCLUDES += -I${LOCAL_DIR}/${MTK_SOC}
+
+$(eval $(call MAKE_MODULE,$(MODULE),$(LOCAL_SRCS-y),$(MTK_BL)))
diff --git a/plat/mediatek/include/mtk_sip_def.h b/plat/mediatek/include/mtk_sip_def.h
index 2e0b501..1b51a4b 100644
--- a/plat/mediatek/include/mtk_sip_def.h
+++ b/plat/mediatek/include/mtk_sip_def.h
@@ -18,6 +18,7 @@
_func(MTK_SIP_EMIDBG_CONTROL, 0x50B) \
_func(MTK_SIP_IOMMU_CONTROL, 0x514) \
_func(MTK_SIP_AUDIO_CONTROL, 0x517) \
+ _func(MTK_SIP_DISP_CONTROL, 0x51C) \
_func(MTK_SIP_APUSYS_CONTROL, 0x51E) \
_func(MTK_SIP_DP_CONTROL, 0x523) \
_func(MTK_SIP_KERNEL_GIC_OP, 0x526) \
diff --git a/plat/mediatek/mt8189/include/platform_def.h b/plat/mediatek/mt8189/include/platform_def.h
index 84da643..0211c44 100644
--- a/plat/mediatek/mt8189/include/platform_def.h
+++ b/plat/mediatek/mt8189/include/platform_def.h
@@ -76,7 +76,17 @@
#define SMI_LARB_19_BASE (IO_PHYS + 0x0b10f000)
#define SMI_LARB_20_BASE (IO_PHYS + 0x0b00f000)
#define SMI_LARB_REG_RNG_SIZE (0x1000)
-
+#define MMSYS_CONFIG_BASE (IO_PHYS + 0x04000000)
+#define DISP_MUTEX_BASE (IO_PHYS + 0x04001000)
+#define DISP_OVL0_BASE (IO_PHYS + 0x04002000)
+#define DISP_OVL1_BASE (IO_PHYS + 0x04003000)
+#define DISP_RDMA0_BASE (IO_PHYS + 0x04006000)
+#define DISP_COLOR0_BASE (IO_PHYS + 0x04008000)
+#define DISP_CCORR0_BASE (IO_PHYS + 0x0400A000)
+#define DISP_CCORR2_BASE (IO_PHYS + 0x0400C000)
+#define DISP_AAL0_BASE (IO_PHYS + 0x0400E000)
+#define DISP_GAMMA0_BASE (IO_PHYS + 0x04010000)
+#define DISP_DITHER0_BASE (IO_PHYS + 0x04012000)
#define MM_IOMMU_BASE (IO_PHYS + 0x0e802000 + 0x4000)
#define APU_IOMMU_BASE (IO_PHYS + 0x09010000)
diff --git a/plat/mediatek/mt8189/platform.mk b/plat/mediatek/mt8189/platform.mk
index 31e6cab..d8b90cd 100644
--- a/plat/mediatek/mt8189/platform.mk
+++ b/plat/mediatek/mt8189/platform.mk
@@ -31,6 +31,7 @@
MODULES-y += $(MTK_PLAT)/topology
MODULES-y += $(MTK_PLAT)/drivers/cirq
MODULES-y += $(MTK_PLAT)/drivers/dfd
+MODULES-y += $(MTK_PLAT)/drivers/disp
MODULES-y += $(MTK_PLAT)/drivers/gic600
MODULES-y += $(MTK_PLAT)/drivers/iommu
MODULES-y += $(MTK_PLAT)/drivers/mcusys