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