From nobody Tue Dec 2 00:46:42 2025 Received: from sender3-pp-f112.zoho.com (sender3-pp-f112.zoho.com [136.143.184.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 847F72FF668; Mon, 24 Nov 2025 11:07:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.184.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763982477; cv=pass; b=RwmedQyrYJGSLtvUaLq0MR8wvGOAn11XXh8vuiwcS9oj6P41hbnLP9EBrjGBlB5SusAPowL/wFZKVzQ9EGQ5RKfU1gA7Wh0onIxJ+N5aDuQ3Qsc2V+hzraMwduEb9IUX1xXONN1lWLfxFctg0jI2YLVY+0xXiN9DfEYlTlUsw+s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763982477; c=relaxed/simple; bh=ML/QbAT6wuODK9p64mxODmHtL+wQT+HxiQ+NdN8oXYg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qqSXyewyoNJ6apC/T9sJjPTnxzEPP4p2J7dHAs0zW59pPev0WtgN45TVrOZOkhQ34x89U4IgGxMZ0PGqE6KiyRguPx5qSb8CHyAEEE9wLgEM5T9KS0ZdBBomxuNWGM2xM0CbTx089b1yIDd0eDbMSsE1W5iIzixk19PoKWufRBc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=DlCjuok2; arc=pass smtp.client-ip=136.143.184.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="DlCjuok2" ARC-Seal: i=1; a=rsa-sha256; t=1763982455; cv=none; d=zohomail.com; s=zohoarc; b=d1oDUos2HA5s5Qbyvbb1+z4ERO4MBk+x6v7aKIX6DD3mAPj3ncG0wBMiWlBLLprVTB8WkU3i3Ol/97HpcJ+l2oNCjEwAg7OgNi/fnFmJAaAvhvgPPc5pXwL/h9ZmurM9N4587/lAxDRxq9pTlAiQtqmpcSHgG3TC/Sr8kYMIakE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1763982455; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=Iiq+HYCmnZ7TcdzmTbexqDQH56XfdBR2ZblfoMLBIoA=; b=kVQHxJpV70E+mipZYoRedcBJu3o96p6imJHncUT9bsEOczmAA4D+niucFPItw4wALF74t6EfPWYBTLzL6MHoS2O4Qp3vDmRgBSrjDioZAmdvz0felAc4TCCZjTi6v6EOMRqZRhudTi8DpYY9ohkNIMqHpMVeKNCc0jIn0b+oJJk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1763982455; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=Iiq+HYCmnZ7TcdzmTbexqDQH56XfdBR2ZblfoMLBIoA=; b=DlCjuok2x3mr2p2TjFTSvPF2ql7+rLYI2n0sUGdHTW2ytuFfBUaaGExuDL+0IbOU MJWt5D+90yb15xkrUU18KBVss4OinmjxZPLhK9FUhZMUYT7N6+2In/2GQJhGksv2Tmv nUjOEp56GLIHljWvxUaOMsP+Dzg1qB5kwyjv1aNg= Received: by mx.zohomail.com with SMTPS id 1763982453777661.8440242348057; Mon, 24 Nov 2025 03:07:33 -0800 (PST) From: Nicolas Frattaroli Date: Mon, 24 Nov 2025 12:07:00 +0100 Subject: [PATCH v2 11/13] interconnect: mediatek: Add support for MediaTek MT8196 EMI ICC Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251124-mt8196-dvfsrc-v2-11-d9c1334db9f3@collabora.com> References: <20251124-mt8196-dvfsrc-v2-0-d9c1334db9f3@collabora.com> In-Reply-To: <20251124-mt8196-dvfsrc-v2-0-d9c1334db9f3@collabora.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno , Henry Chen , Georgi Djakov Cc: kernel@collabora.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-pm@vger.kernel.org, Nicolas Frattaroli X-Mailer: b4 0.14.3 From: AngeloGioacchino Del Regno Add a new driver with data to register the External Memory Interface (EMI) Interconnect on the MediaTek MT8196 Chromebook SoC. Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Nicolas Frattaroli --- drivers/interconnect/mediatek/Kconfig | 7 + drivers/interconnect/mediatek/Makefile | 1 + drivers/interconnect/mediatek/mt8196.c | 383 +++++++++++++++++++++++++++++= ++++ 3 files changed, 391 insertions(+) diff --git a/drivers/interconnect/mediatek/Kconfig b/drivers/interconnect/m= ediatek/Kconfig index 985c849efac3..9fd3f2170443 100644 --- a/drivers/interconnect/mediatek/Kconfig +++ b/drivers/interconnect/mediatek/Kconfig @@ -27,3 +27,10 @@ config INTERCONNECT_MTK_MT8195 help This is a driver for the MediaTek bus interconnect on MT8195-based platforms. + +config INTERCONNECT_MTK_MT8196 + tristate "MediaTek MT8196 interconnect driver" + depends on INTERCONNECT_MTK_DVFSRC_EMI + help + This is a driver for the MediaTek bus interconnect on MT8196-based + platforms. diff --git a/drivers/interconnect/mediatek/Makefile b/drivers/interconnect/= mediatek/Makefile index 8e2283a9a5b5..6bd656668f5d 100644 --- a/drivers/interconnect/mediatek/Makefile +++ b/drivers/interconnect/mediatek/Makefile @@ -3,3 +3,4 @@ obj-$(CONFIG_INTERCONNECT_MTK_DVFSRC_EMI) +=3D icc-emi.o obj-$(CONFIG_INTERCONNECT_MTK_MT8183) +=3D mt8183.o obj-$(CONFIG_INTERCONNECT_MTK_MT8195) +=3D mt8195.o +obj-$(CONFIG_INTERCONNECT_MTK_MT8195) +=3D mt8196.o diff --git a/drivers/interconnect/mediatek/mt8196.c b/drivers/interconnect/= mediatek/mt8196.c new file mode 100644 index 000000000000..e9af32065be1 --- /dev/null +++ b/drivers/interconnect/mediatek/mt8196.c @@ -0,0 +1,383 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 Collabora Ltd. + * AngeloGioacchino Del Regno + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "icc-emi.h" + +static struct mtk_icc_node ddr_emi =3D { + .name =3D "ddr-emi", + .id =3D SLAVE_DDR_EMI, + .ep =3D 1, +}; + +static struct mtk_icc_node mcusys =3D { + .name =3D "mcusys", + .id =3D MASTER_MCUSYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mcu_port0 =3D { + .name =3D "mcu-port0", + .id =3D MASTER_MCU_0, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mcu_port1 =3D { + .name =3D "mcu-port1", + .id =3D MASTER_MCU_1, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mcu_port2 =3D { + .name =3D "mcu-port2", + .id =3D MASTER_MCU_2, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mcu_port3 =3D { + .name =3D "mcu-port3", + .id =3D MASTER_MCU_3, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mcu_port4 =3D { + .name =3D "mcu-port4", + .id =3D MASTER_MCU_4, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node gpu =3D { + .name =3D "gpu", + .id =3D MASTER_GPUSYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mmsys =3D { + .name =3D "mmsys", + .id =3D MASTER_MMSYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mm_vpu =3D { + .name =3D "mm-vpu", + .id =3D MASTER_MM_VPU, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node mm_disp =3D { + .name =3D "mm-disp", + .id =3D MASTER_MM_DISP, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node mm_vdec =3D { + .name =3D "mm-vdec", + .id =3D MASTER_MM_VDEC, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node mm_venc =3D { + .name =3D "mm-venc", + .id =3D MASTER_MM_VENC, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node mm_cam =3D { + .name =3D "mm-cam", + .id =3D MASTER_MM_CAM, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node mm_img =3D { + .name =3D "mm-img", + .id =3D MASTER_MM_IMG, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node mm_mdp =3D { + .name =3D "mm-mdp", + .id =3D MASTER_MM_MDP, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MMSYS } +}; + +static struct mtk_icc_node vpusys =3D { + .name =3D "vpusys", + .id =3D MASTER_VPUSYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node vpu_port0 =3D { + .name =3D "vpu-port0", + .id =3D MASTER_VPU_0, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_VPUSYS } +}; + +static struct mtk_icc_node vpu_port1 =3D { + .name =3D "vpu-port1", + .id =3D MASTER_VPU_1, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_VPUSYS } +}; + +static struct mtk_icc_node mdlasys =3D { + .name =3D "mdlasys", + .id =3D MASTER_MDLASYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node mdla_port0 =3D { + .name =3D "mdla-port0", + .id =3D MASTER_MDLA_0, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_MDLASYS } +}; + +static struct mtk_icc_node ufs =3D { + .name =3D "ufs", + .id =3D MASTER_UFS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node pcie =3D { + .name =3D "pcie", + .id =3D MASTER_PCIE, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node usb =3D { + .name =3D "usb", + .id =3D MASTER_USB, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node wifi =3D { + .name =3D "wifi", + .id =3D MASTER_WIFI, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node bt =3D { + .name =3D "bt", + .id =3D MASTER_BT, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node netsys =3D { + .name =3D "netsys", + .id =3D MASTER_NETSYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node dbgif =3D { + .name =3D "dbgif", + .id =3D MASTER_DBGIF, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_DDR_EMI } +}; + +static struct mtk_icc_node hrt_ddr_emi =3D { + .name =3D "hrt-ddr-emi", + .id =3D SLAVE_HRT_DDR_EMI, + .ep =3D 2, +}; + +static struct mtk_icc_node hrt_mmsys =3D { + .name =3D "hrt-mmsys", + .id =3D MASTER_HRT_MMSYS, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_HRT_DDR_EMI } +}; + +static struct mtk_icc_node hrt_mm_disp =3D { + .name =3D "hrt-mm-disp", + .id =3D MASTER_HRT_MM_DISP, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_HRT_MMSYS } +}; + +static struct mtk_icc_node hrt_mm_vdec =3D { + .name =3D "hrt-mm-vdec", + .id =3D MASTER_HRT_MM_VDEC, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_HRT_MMSYS } +}; + +static struct mtk_icc_node hrt_mm_venc =3D { + .name =3D "hrt-mm-venc", + .id =3D MASTER_HRT_MM_VENC, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_HRT_MMSYS } +}; + +static struct mtk_icc_node hrt_mm_cam =3D { + .name =3D "hrt-mm-cam", + .id =3D MASTER_HRT_MM_CAM, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_HRT_MMSYS } +}; + +static struct mtk_icc_node hrt_mm_img =3D { + .name =3D "hrt-mm-img", + .id =3D MASTER_HRT_MM_IMG, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_HRT_MMSYS } +}; + +static struct mtk_icc_node hrt_mm_mdp =3D { + .name =3D "hrt-mm-mdp", + .id =3D MASTER_HRT_MM_MDP, + .ep =3D 0, + .num_links =3D 1, + .links =3D { MASTER_HRT_MMSYS } +}; + +static struct mtk_icc_node hrt_adsp =3D { + .name =3D "hrt-adsp", + .id =3D MASTER_HRT_ADSP, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_HRT_DDR_EMI } +}; + +static struct mtk_icc_node hrt_dbgif =3D { + .name =3D "hrt-dbgif", + .id =3D MASTER_HRT_DBGIF, + .ep =3D 0, + .num_links =3D 1, + .links =3D { SLAVE_HRT_DDR_EMI } +}; + +static struct mtk_icc_node *mt8196_emi_icc_nodes[] =3D { + [SLAVE_DDR_EMI] =3D &ddr_emi, + [MASTER_MCUSYS] =3D &mcusys, + [MASTER_MCU_0] =3D &mcu_port0, + [MASTER_MCU_1] =3D &mcu_port1, + [MASTER_MCU_2] =3D &mcu_port2, + [MASTER_MCU_3] =3D &mcu_port3, + [MASTER_MCU_4] =3D &mcu_port4, + [MASTER_GPUSYS] =3D &gpu, + [MASTER_MMSYS] =3D &mmsys, + [MASTER_MM_VPU] =3D &mm_vpu, + [MASTER_MM_DISP] =3D &mm_disp, + [MASTER_MM_VDEC] =3D &mm_vdec, + [MASTER_MM_VENC] =3D &mm_venc, + [MASTER_MM_CAM] =3D &mm_cam, + [MASTER_MM_IMG] =3D &mm_img, + [MASTER_MM_MDP] =3D &mm_mdp, + [MASTER_VPUSYS] =3D &vpusys, + [MASTER_VPU_0] =3D &vpu_port0, + [MASTER_VPU_1] =3D &vpu_port1, + [MASTER_MDLASYS] =3D &mdlasys, + [MASTER_MDLA_0] =3D &mdla_port0, + [MASTER_UFS] =3D &ufs, + [MASTER_PCIE] =3D &pcie, + [MASTER_USB] =3D &usb, + [MASTER_WIFI] =3D &wifi, + [MASTER_BT] =3D &bt, + [MASTER_NETSYS] =3D &netsys, + [MASTER_DBGIF] =3D &dbgif, + [SLAVE_HRT_DDR_EMI] =3D &hrt_ddr_emi, + [MASTER_HRT_MMSYS] =3D &hrt_mmsys, + [MASTER_HRT_MM_DISP] =3D &hrt_mm_disp, + [MASTER_HRT_MM_VDEC] =3D &hrt_mm_vdec, + [MASTER_HRT_MM_VENC] =3D &hrt_mm_venc, + [MASTER_HRT_MM_CAM] =3D &hrt_mm_cam, + [MASTER_HRT_MM_IMG] =3D &hrt_mm_img, + [MASTER_HRT_MM_MDP] =3D &hrt_mm_mdp, + [MASTER_HRT_ADSP] =3D &hrt_adsp, + [MASTER_HRT_DBGIF] =3D &hrt_dbgif +}; + +static struct mtk_icc_desc mt8196_emi_icc =3D { + .nodes =3D mt8196_emi_icc_nodes, + .num_nodes =3D ARRAY_SIZE(mt8196_emi_icc_nodes), +}; + +static const struct of_device_id mtk_mt8196_emi_icc_of_match[] =3D { + { .compatible =3D "mediatek,mt8196-emi", .data =3D &mt8196_emi_icc }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, mtk_mt8196_emi_icc_of_match); + +static struct platform_driver mtk_emi_icc_mt8196_driver =3D { + .driver =3D { + .name =3D "emi-icc-mt8196", + .of_match_table =3D mtk_mt8196_emi_icc_of_match, + .sync_state =3D icc_sync_state, + }, + .probe =3D mtk_emi_icc_probe, + .remove =3D mtk_emi_icc_remove, + +}; +module_platform_driver(mtk_emi_icc_mt8196_driver); + +MODULE_AUTHOR("AngeloGioacchino Del Regno "); +MODULE_DESCRIPTION("MediaTek MT8196 EMI ICC driver"); +MODULE_LICENSE("GPL"); --=20 2.52.0