linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V2 0/9] interconnect: support i.MX8MP
@ 2022-06-16  7:33 Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc Peng Fan (OSS)
                   ` (8 more replies)
  0 siblings, 9 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

V2:
 Per dt maintainer: drop syscon, move binding file fsl,imx8mp.h out from driver
 Per ICC maintainer, add kernel doc and add static inline for an API in header file
 Rename max_node_id to num_nodes
 Describe more on the registers.

This patchset is to support i.MX8MP NoC settings, i.MX8MP NoC initial
value after power up is invalid, need set a valid value after related
power domain up.

This patchset also includes two patch[1,2] during my development to enable
the ICC feature for i.MX8MP.

I not include ddrc DVFS in this patchset, ths patchset is only to
support NoC value mode/priority/ext_control being set to a valid value
that suggested by i.MX Chip Design Team. The value is same as NXP
downstream one inside Arm Trusted Firmware:
https://source.codeaurora.org/external/imx/imx-atf/tree/plat/imx/imx8m/imx8mp/gpc.c?h=lf_v2.4#n97

A repo created here: https://github.com/MrVan/linux/tree/imx8mp-interconnect

Peng Fan (9):
  dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc
  dt-bindings: interconnect: add fsl,imx8mp.h
  interconnect: add device managed bulk API
  interconnect: imx: fix max_node_id
  interconnect: imx: set src node
  interconnect: imx: introduce imx_icc_provider
  interconnect: imx: set of_node for interconnect provider
  interconnect: imx: configure NoC mode/prioriry/ext_control
  interconnect: imx: Add platform driver for imx8mp

 .../bindings/interconnect/fsl,imx8m-noc.yaml  |   6 +-
 drivers/interconnect/bulk.c                   |  42 +++
 drivers/interconnect/imx/Kconfig              |   4 +
 drivers/interconnect/imx/Makefile             |   2 +
 drivers/interconnect/imx/imx.c                |  78 ++++--
 drivers/interconnect/imx/imx.h                |  50 +++-
 drivers/interconnect/imx/imx8mm.c             |   2 +-
 drivers/interconnect/imx/imx8mn.c             |   2 +-
 drivers/interconnect/imx/imx8mp.c             | 259 ++++++++++++++++++
 drivers/interconnect/imx/imx8mq.c             |   2 +-
 include/dt-bindings/interconnect/fsl,imx8mp.h |  59 ++++
 include/linux/interconnect.h                  |   7 +
 12 files changed, 490 insertions(+), 23 deletions(-)
 create mode 100644 drivers/interconnect/imx/imx8mp.c
 create mode 100644 include/dt-bindings/interconnect/fsl,imx8mp.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-27 22:18   ` Rob Herring
  2022-06-16  7:33 ` [PATCH V2 2/9] dt-bindings: interconnect: add fsl,imx8mp.h Peng Fan (OSS)
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

i.MX8MP features same NoC/NIC as i.MX8MM/N/Q, and use two compatible
strings.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 .../devicetree/bindings/interconnect/fsl,imx8m-noc.yaml     | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml b/Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml
index b8204ed22dd5..09c8948b5e25 100644
--- a/Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml
+++ b/Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml
@@ -26,14 +26,16 @@ properties:
     oneOf:
       - items:
           - enum:
-              - fsl,imx8mn-nic
               - fsl,imx8mm-nic
+              - fsl,imx8mn-nic
+              - fsl,imx8mp-nic
               - fsl,imx8mq-nic
           - const: fsl,imx8m-nic
       - items:
           - enum:
-              - fsl,imx8mn-noc
               - fsl,imx8mm-noc
+              - fsl,imx8mn-noc
+              - fsl,imx8mp-noc
               - fsl,imx8mq-noc
           - const: fsl,imx8m-noc
       - const: fsl,imx8m-nic
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 2/9] dt-bindings: interconnect: add fsl,imx8mp.h
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-27 22:19   ` Rob Herring
  2022-06-16  7:33 ` [PATCH V2 3/9] interconnect: add device managed bulk API Peng Fan (OSS)
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Add fsl,imx8mp.h for i.MX8MP

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 include/dt-bindings/interconnect/fsl,imx8mp.h | 59 +++++++++++++++++++
 1 file changed, 59 insertions(+)
 create mode 100644 include/dt-bindings/interconnect/fsl,imx8mp.h

diff --git a/include/dt-bindings/interconnect/fsl,imx8mp.h b/include/dt-bindings/interconnect/fsl,imx8mp.h
new file mode 100644
index 000000000000..7357d417529a
--- /dev/null
+++ b/include/dt-bindings/interconnect/fsl,imx8mp.h
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
+/*
+ * Interconnect framework driver for i.MX SoC
+ *
+ * Copyright 2022 NXP
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#ifndef __DT_BINDINGS_INTERCONNECT_IMX8MP_H
+#define __DT_BINDINGS_INTERCONNECT_IMX8MP_H
+
+#define IMX8MP_ICN_NOC		0
+#define IMX8MP_ICN_MAIN		1
+#define IMX8MP_ICS_DRAM		2
+#define IMX8MP_ICS_OCRAM	3
+#define IMX8MP_ICM_A53		4
+#define IMX8MP_ICM_SUPERMIX	5
+#define IMX8MP_ICM_GIC		6
+#define IMX8MP_ICM_MLMIX	7
+
+#define IMX8MP_ICN_AUDIO	8
+#define IMX8MP_ICM_DSP		9
+#define IMX8MP_ICM_SDMA2PER	10
+#define IMX8MP_ICM_SDMA2BURST	11
+#define IMX8MP_ICM_SDMA3PER	12
+#define IMX8MP_ICM_SDMA3BURST	13
+#define IMX8MP_ICM_EDMA		14
+
+#define IMX8MP_ICN_GPU		15
+#define IMX8MP_ICM_GPU2D	16
+#define IMX8MP_ICM_GPU3D	17
+
+#define IMX8MP_ICN_HDMI		18
+#define IMX8MP_ICM_HRV		19
+#define IMX8MP_ICM_LCDIF_HDMI	20
+#define IMX8MP_ICM_HDCP		21
+
+#define IMX8MP_ICN_HSIO		22
+#define IMX8MP_ICM_NOC_PCIE	23
+#define IMX8MP_ICM_USB1		24
+#define IMX8MP_ICM_USB2		25
+#define IMX8MP_ICM_PCIE		26
+
+#define IMX8MP_ICN_MEDIA	27
+#define IMX8MP_ICM_LCDIF_RD	28
+#define IMX8MP_ICM_LCDIF_WR	29
+#define IMX8MP_ICM_ISI0		30
+#define IMX8MP_ICM_ISI1		31
+#define IMX8MP_ICM_ISI2		32
+#define IMX8MP_ICM_ISP0		33
+#define IMX8MP_ICM_ISP1		34
+#define IMX8MP_ICM_DWE		35
+
+#define IMX8MP_ICN_VIDEO	36
+#define IMX8MP_ICM_VPU_G1	37
+#define IMX8MP_ICM_VPU_G2	38
+#define IMX8MP_ICM_VPU_H1	39
+
+#endif /* __DT_BINDINGS_INTERCONNECT_IMX8MP_H */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 3/9] interconnect: add device managed bulk API
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 2/9] dt-bindings: interconnect: add fsl,imx8mp.h Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 4/9] interconnect: imx: fix max_node_id Peng Fan (OSS)
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Add device managed bulk API to simplify driver.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/bulk.c  | 42 ++++++++++++++++++++++++++++++++++++
 include/linux/interconnect.h |  7 ++++++
 2 files changed, 49 insertions(+)

diff --git a/drivers/interconnect/bulk.c b/drivers/interconnect/bulk.c
index 448cc536aa79..8b1d8a412464 100644
--- a/drivers/interconnect/bulk.c
+++ b/drivers/interconnect/bulk.c
@@ -115,3 +115,45 @@ void icc_bulk_disable(int num_paths, const struct icc_bulk_data *paths)
 		icc_disable(paths[num_paths].path);
 }
 EXPORT_SYMBOL_GPL(icc_bulk_disable);
+
+struct icc_bulk_devres {
+	struct icc_bulk_data *paths;
+	int num_paths;
+};
+
+static void devm_icc_bulk_release(struct device *dev, void *res)
+{
+	struct icc_bulk_devres *devres = res;
+
+	icc_bulk_put(devres->num_paths, devres->paths);
+}
+
+/**
+ * devm_of_icc_bulk_get() - resource managed of_icc_bulk_get
+ * @dev: the device requesting the path
+ * @num_paths: the number of icc_bulk_data
+ * @paths: the table with the paths we want to get
+ *
+ * Returns 0 on success or negative errno otherwise.
+ */
+int devm_of_icc_bulk_get(struct device *dev, int num_paths, struct icc_bulk_data *paths)
+{
+	struct icc_bulk_devres *devres;
+	int ret;
+
+	devres = devres_alloc(devm_icc_bulk_release, sizeof(*devres), GFP_KERNEL);
+	if (!devres)
+		return -ENOMEM;
+
+	ret = of_icc_bulk_get(dev, num_paths, paths);
+	if (!ret) {
+		devres->paths = paths;
+		devres->num_paths = num_paths;
+		devres_add(dev, devres);
+	} else {
+		devres_free(devres);
+	}
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(devm_of_icc_bulk_get);
diff --git a/include/linux/interconnect.h b/include/linux/interconnect.h
index f685777b875e..2b0e784ba771 100644
--- a/include/linux/interconnect.h
+++ b/include/linux/interconnect.h
@@ -44,6 +44,7 @@ struct icc_path *icc_get(struct device *dev, const int src_id,
 			 const int dst_id);
 struct icc_path *of_icc_get(struct device *dev, const char *name);
 struct icc_path *devm_of_icc_get(struct device *dev, const char *name);
+int devm_of_icc_bulk_get(struct device *dev, int num_paths, struct icc_bulk_data *paths);
 struct icc_path *of_icc_get_by_index(struct device *dev, int idx);
 void icc_put(struct icc_path *path);
 int icc_enable(struct icc_path *path);
@@ -116,6 +117,12 @@ static inline int of_icc_bulk_get(struct device *dev, int num_paths, struct icc_
 	return 0;
 }
 
+static inline int devm_of_icc_bulk_get(struct device *dev, int num_paths,
+				       struct icc_bulk_data *paths)
+{
+	return 0;
+}
+
 static inline void icc_bulk_put(int num_paths, struct icc_bulk_data *paths)
 {
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 4/9] interconnect: imx: fix max_node_id
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
                   ` (2 preceding siblings ...)
  2022-06-16  7:33 ` [PATCH V2 3/9] interconnect: add device managed bulk API Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 5/9] interconnect: imx: set src node Peng Fan (OSS)
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

max_node_id not equal to the ARRAY_SIZE of node array, need increase 1,
otherwise xlate will fail for the last entry. And rename max_node_id
to num_nodes to reflect the reality.

Fixes: f0d8048525d7d("interconnect: Add imx core driver")
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/imx/imx.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
index 249ca25d1d55..4406ec45fa90 100644
--- a/drivers/interconnect/imx/imx.c
+++ b/drivers/interconnect/imx/imx.c
@@ -234,16 +234,16 @@ int imx_icc_register(struct platform_device *pdev,
 	struct device *dev = &pdev->dev;
 	struct icc_onecell_data *data;
 	struct icc_provider *provider;
-	int max_node_id;
+	int num_nodes;
 	int ret;
 
 	/* icc_onecell_data is indexed by node_id, unlike nodes param */
-	max_node_id = get_max_node_id(nodes, nodes_count);
-	data = devm_kzalloc(dev, struct_size(data, nodes, max_node_id),
+	num_nodes = get_max_node_id(nodes, nodes_count) + 1;
+	data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes),
 			    GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
-	data->num_nodes = max_node_id;
+	data->num_nodes = num_nodes;
 
 	provider = devm_kzalloc(dev, sizeof(*provider), GFP_KERNEL);
 	if (!provider)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 5/9] interconnect: imx: set src node
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
                   ` (3 preceding siblings ...)
  2022-06-16  7:33 ` [PATCH V2 4/9] interconnect: imx: fix max_node_id Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 6/9] interconnect: imx: introduce imx_icc_provider Peng Fan (OSS)
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

When set QoS for a icc path, only set dst icc node is not enough,
also need to set src icc node.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/imx/imx.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
index 4406ec45fa90..9b83f69945d8 100644
--- a/drivers/interconnect/imx/imx.c
+++ b/drivers/interconnect/imx/imx.c
@@ -61,6 +61,12 @@ static int imx_icc_node_set(struct icc_node *node)
 
 static int imx_icc_set(struct icc_node *src, struct icc_node *dst)
 {
+	int ret;
+
+	ret = imx_icc_node_set(src);
+	if (ret)
+		return ret;
+
 	return imx_icc_node_set(dst);
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 6/9] interconnect: imx: introduce imx_icc_provider
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
                   ` (4 preceding siblings ...)
  2022-06-16  7:33 ` [PATCH V2 5/9] interconnect: imx: set src node Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider Peng Fan (OSS)
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Introduce imx_icc_provider as a wrapper of icc_provider to
add i.MX specific information.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/imx/imx.c | 24 ++++++++++++++----------
 drivers/interconnect/imx/imx.h |  6 ++++++
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
index 9b83f69945d8..1f16eedea21c 100644
--- a/drivers/interconnect/imx/imx.c
+++ b/drivers/interconnect/imx/imx.c
@@ -134,9 +134,10 @@ static int imx_icc_node_init_qos(struct icc_provider *provider,
 				      DEV_PM_QOS_MIN_FREQUENCY, 0);
 }
 
-static struct icc_node *imx_icc_node_add(struct icc_provider *provider,
+static struct icc_node *imx_icc_node_add(struct imx_icc_provider *imx_provider,
 					 const struct imx_icc_node_desc *node_desc)
 {
+	struct icc_provider *provider = &imx_provider->provider;
 	struct device *dev = provider->dev;
 	struct imx_icc_node *node_data;
 	struct icc_node *node;
@@ -184,10 +185,11 @@ static void imx_icc_unregister_nodes(struct icc_provider *provider)
 		imx_icc_node_destroy(node);
 }
 
-static int imx_icc_register_nodes(struct icc_provider *provider,
+static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider,
 				  const struct imx_icc_node_desc *descs,
 				  int count)
 {
+	struct icc_provider *provider = &imx_provider->provider;
 	struct icc_onecell_data *provider_data = provider->data;
 	int ret;
 	int i;
@@ -197,7 +199,7 @@ static int imx_icc_register_nodes(struct icc_provider *provider,
 		const struct imx_icc_node_desc *node_desc = &descs[i];
 		size_t j;
 
-		node = imx_icc_node_add(provider, node_desc);
+		node = imx_icc_node_add(imx_provider, node_desc);
 		if (IS_ERR(node)) {
 			ret = dev_err_probe(provider->dev, PTR_ERR(node),
 					    "failed to add %s\n", node_desc->name);
@@ -239,6 +241,7 @@ int imx_icc_register(struct platform_device *pdev,
 {
 	struct device *dev = &pdev->dev;
 	struct icc_onecell_data *data;
+	struct imx_icc_provider *imx_provider;
 	struct icc_provider *provider;
 	int num_nodes;
 	int ret;
@@ -251,16 +254,17 @@ int imx_icc_register(struct platform_device *pdev,
 		return -ENOMEM;
 	data->num_nodes = num_nodes;
 
-	provider = devm_kzalloc(dev, sizeof(*provider), GFP_KERNEL);
-	if (!provider)
+	imx_provider = devm_kzalloc(dev, sizeof(*imx_provider), GFP_KERNEL);
+	if (!imx_provider)
 		return -ENOMEM;
+	provider = &imx_provider->provider;
 	provider->set = imx_icc_set;
 	provider->get_bw = imx_icc_get_bw;
 	provider->aggregate = icc_std_aggregate;
 	provider->xlate = of_icc_xlate_onecell;
 	provider->data = data;
 	provider->dev = dev->parent;
-	platform_set_drvdata(pdev, provider);
+	platform_set_drvdata(pdev, imx_provider);
 
 	ret = icc_provider_add(provider);
 	if (ret) {
@@ -268,7 +272,7 @@ int imx_icc_register(struct platform_device *pdev,
 		return ret;
 	}
 
-	ret = imx_icc_register_nodes(provider, nodes, nodes_count);
+	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count);
 	if (ret)
 		goto provider_del;
 
@@ -282,11 +286,11 @@ EXPORT_SYMBOL_GPL(imx_icc_register);
 
 int imx_icc_unregister(struct platform_device *pdev)
 {
-	struct icc_provider *provider = platform_get_drvdata(pdev);
+	struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev);
 
-	imx_icc_unregister_nodes(provider);
+	imx_icc_unregister_nodes(&imx_provider->provider);
 
-	return icc_provider_del(provider);
+	return icc_provider_del(&imx_provider->provider);
 }
 EXPORT_SYMBOL_GPL(imx_icc_unregister);
 
diff --git a/drivers/interconnect/imx/imx.h b/drivers/interconnect/imx/imx.h
index 75da51076c68..0ad2c654c222 100644
--- a/drivers/interconnect/imx/imx.h
+++ b/drivers/interconnect/imx/imx.h
@@ -10,10 +10,16 @@
 #ifndef __DRIVERS_INTERCONNECT_IMX_H
 #define __DRIVERS_INTERCONNECT_IMX_H
 
+#include <linux/interconnect-provider.h>
 #include <linux/kernel.h>
 
 #define IMX_ICC_MAX_LINKS	4
 
+struct imx_icc_provider {
+	void __iomem *noc_base;
+	struct icc_provider provider;
+};
+
 /*
  * struct imx_icc_node_adj - Describe a dynamic adjustable node
  */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
                   ` (5 preceding siblings ...)
  2022-06-16  7:33 ` [PATCH V2 6/9] interconnect: imx: introduce imx_icc_provider Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-29 15:08   ` Lucas Stach
  2022-06-16  7:33 ` [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control Peng Fan (OSS)
  2022-06-16  7:33 ` [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp Peng Fan (OSS)
  8 siblings, 1 reply; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

The provider device is created using platform_device_register_data in
imx-bus driver, which not has of_node. With of_node set, it will be
easy to support QoS settings.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/imx/imx.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
index 1f16eedea21c..78557fe6da2c 100644
--- a/drivers/interconnect/imx/imx.c
+++ b/drivers/interconnect/imx/imx.c
@@ -264,6 +264,7 @@ int imx_icc_register(struct platform_device *pdev,
 	provider->xlate = of_icc_xlate_onecell;
 	provider->data = data;
 	provider->dev = dev->parent;
+	provider->dev->of_node = dev->parent->of_node;
 	platform_set_drvdata(pdev, imx_provider);
 
 	ret = icc_provider_add(provider);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
                   ` (6 preceding siblings ...)
  2022-06-16  7:33 ` [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-28 17:57   ` Georgi Djakov
  2022-06-29 15:14   ` Lucas Stach
  2022-06-16  7:33 ` [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp Peng Fan (OSS)
  8 siblings, 2 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Introduce imx_icc_noc_setting structure to describe a master port setting
Pass imx_icc_noc_setting as a parameter from specific driver
Set priority level, mode, ext control in imx_icc_node_set

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/imx/imx.c    | 43 ++++++++++++++++++++++++++----
 drivers/interconnect/imx/imx.h    | 44 ++++++++++++++++++++++++++++++-
 drivers/interconnect/imx/imx8mm.c |  2 +-
 drivers/interconnect/imx/imx8mn.c |  2 +-
 drivers/interconnect/imx/imx8mq.c |  2 +-
 5 files changed, 84 insertions(+), 9 deletions(-)

diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
index 78557fe6da2c..bd728caf2b85 100644
--- a/drivers/interconnect/imx/imx.c
+++ b/drivers/interconnect/imx/imx.c
@@ -10,6 +10,7 @@
 
 #include <linux/device.h>
 #include <linux/interconnect-provider.h>
+#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
@@ -21,8 +22,10 @@
 /* private icc_node data */
 struct imx_icc_node {
 	const struct imx_icc_node_desc *desc;
+	const struct imx_icc_noc_setting *setting;
 	struct device *qos_dev;
 	struct dev_pm_qos_request qos_req;
+	struct imx_icc_provider *imx_provider;
 };
 
 static int imx_icc_get_bw(struct icc_node *node, u32 *avg, u32 *peak)
@@ -37,8 +40,24 @@ static int imx_icc_node_set(struct icc_node *node)
 {
 	struct device *dev = node->provider->dev;
 	struct imx_icc_node *node_data = node->data;
+	void __iomem *base;
+	u32 prio;
 	u64 freq;
 
+	if (node_data->setting && !node_data->setting->ignore && node->peak_bw) {
+		base = node_data->setting->reg + node_data->imx_provider->noc_base;
+		if (node_data->setting->mode == IMX_NOC_MODE_FIXED) {
+			prio = node_data->setting->prio_level;
+			prio = PRIORITY_COMP_MARK | (prio << 8) | prio;
+			writel(prio, base + IMX_NOC_PRIO_REG);
+			writel(node_data->setting->mode, base + IMX_NOC_MODE_REG);
+			writel(node_data->setting->ext_control, base + IMX_NOC_EXT_CTL_REG);
+		} else {
+			dev_info(dev, "mode: %d not supported\n", node_data->setting->mode);
+			return -ENOTSUPP;
+		}
+	}
+
 	if (!node_data->qos_dev)
 		return 0;
 
@@ -135,7 +154,8 @@ static int imx_icc_node_init_qos(struct icc_provider *provider,
 }
 
 static struct icc_node *imx_icc_node_add(struct imx_icc_provider *imx_provider,
-					 const struct imx_icc_node_desc *node_desc)
+					 const struct imx_icc_node_desc *node_desc,
+					 const struct imx_icc_noc_setting *setting)
 {
 	struct icc_provider *provider = &imx_provider->provider;
 	struct device *dev = provider->dev;
@@ -164,6 +184,8 @@ static struct icc_node *imx_icc_node_add(struct imx_icc_provider *imx_provider,
 	node->name = node_desc->name;
 	node->data = node_data;
 	node_data->desc = node_desc;
+	node_data->setting = setting;
+	node_data->imx_provider = imx_provider;
 	icc_node_add(node, provider);
 
 	if (node_desc->adj) {
@@ -187,7 +209,8 @@ static void imx_icc_unregister_nodes(struct icc_provider *provider)
 
 static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider,
 				  const struct imx_icc_node_desc *descs,
-				  int count)
+				  int count,
+				  const struct imx_icc_noc_setting *settings)
 {
 	struct icc_provider *provider = &imx_provider->provider;
 	struct icc_onecell_data *provider_data = provider->data;
@@ -199,7 +222,10 @@ static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider,
 		const struct imx_icc_node_desc *node_desc = &descs[i];
 		size_t j;
 
-		node = imx_icc_node_add(imx_provider, node_desc);
+		if (settings)
+			node = imx_icc_node_add(imx_provider, node_desc, &settings[node_desc->id]);
+		else
+			node = imx_icc_node_add(imx_provider, node_desc, NULL);
 		if (IS_ERR(node)) {
 			ret = dev_err_probe(provider->dev, PTR_ERR(node),
 					    "failed to add %s\n", node_desc->name);
@@ -237,7 +263,8 @@ static int get_max_node_id(struct imx_icc_node_desc *nodes, int nodes_count)
 }
 
 int imx_icc_register(struct platform_device *pdev,
-		     struct imx_icc_node_desc *nodes, int nodes_count)
+		     struct imx_icc_node_desc *nodes, int nodes_count,
+		     struct imx_icc_noc_setting *settings)
 {
 	struct device *dev = &pdev->dev;
 	struct icc_onecell_data *data;
@@ -267,13 +294,19 @@ int imx_icc_register(struct platform_device *pdev,
 	provider->dev->of_node = dev->parent->of_node;
 	platform_set_drvdata(pdev, imx_provider);
 
+	if (settings) {
+		imx_provider->noc_base = devm_of_iomap(dev, provider->dev->of_node, 0, NULL);
+		if (!imx_provider->noc_base)
+			return PTR_ERR(imx_provider->noc_base);
+	}
+
 	ret = icc_provider_add(provider);
 	if (ret) {
 		dev_err(dev, "error adding interconnect provider: %d\n", ret);
 		return ret;
 	}
 
-	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count);
+	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings);
 	if (ret)
 		goto provider_del;
 
diff --git a/drivers/interconnect/imx/imx.h b/drivers/interconnect/imx/imx.h
index 0ad2c654c222..1da87cfe27da 100644
--- a/drivers/interconnect/imx/imx.h
+++ b/drivers/interconnect/imx/imx.h
@@ -15,6 +15,31 @@
 
 #define IMX_ICC_MAX_LINKS	4
 
+/*
+ * High throughput priority level in Regulator mode
+ * Read Priority in Fixed/Limiter mode
+ */
+#define PRIORITY0_SHIFT	0
+/*
+ * Low throughput priority level in Regulator mode
+ * Write Priority in Fixed/Limiter mode
+ */
+#define PRIORITY1_SHIFT	8
+#define PRIORITY_MASK		0x7
+
+#define PRIORITY_COMP_MARK	BIT(31)	/* Must set */
+
+#define IMX_NOC_MODE_FIXED	0
+#define IMX_NOC_MODE_LIMITER	1
+#define IMX_NOC_MODE_BYPASS	2
+#define IMX_NOC_MODE_REGULATOR	3
+
+#define IMX_NOC_PRIO_REG	0x8
+#define IMX_NOC_MODE_REG	0xC
+#define IMX_NOC_BANDWIDTH_REG	0x10
+#define IMX_NOC_SATURATION	0x14
+#define IMX_NOC_EXT_CTL_REG	0x18
+
 struct imx_icc_provider {
 	void __iomem *noc_base;
 	struct icc_provider provider;
@@ -44,6 +69,22 @@ struct imx_icc_node_desc {
 	const struct imx_icc_node_adj_desc *adj;
 };
 
+/*
+ * struct imx_icc_noc_setting - Describe an interconnect node setting
+ * @ignore: indicate whether need apply this setting
+ * @reg: register offset inside the NoC
+ * @prio_level: priority level
+ * @mode: functional mode
+ * @ext_control: external input control
+ */
+struct imx_icc_noc_setting {
+	bool ignore;
+	u32 reg;
+	u32 prio_level;
+	u32 mode;
+	u32 ext_control;
+};
+
 #define DEFINE_BUS_INTERCONNECT(_name, _id, _adj, ...)			\
 	{								\
 		.id = _id,						\
@@ -61,7 +102,8 @@ struct imx_icc_node_desc {
 
 int imx_icc_register(struct platform_device *pdev,
 		     struct imx_icc_node_desc *nodes,
-		     int nodes_count);
+		     int nodes_count,
+		     struct imx_icc_noc_setting *noc_settings);
 int imx_icc_unregister(struct platform_device *pdev);
 
 #endif /* __DRIVERS_INTERCONNECT_IMX_H */
diff --git a/drivers/interconnect/imx/imx8mm.c b/drivers/interconnect/imx/imx8mm.c
index 1083490bb391..ae797412db96 100644
--- a/drivers/interconnect/imx/imx8mm.c
+++ b/drivers/interconnect/imx/imx8mm.c
@@ -83,7 +83,7 @@ static struct imx_icc_node_desc nodes[] = {
 
 static int imx8mm_icc_probe(struct platform_device *pdev)
 {
-	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
+	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
 }
 
 static int imx8mm_icc_remove(struct platform_device *pdev)
diff --git a/drivers/interconnect/imx/imx8mn.c b/drivers/interconnect/imx/imx8mn.c
index ad97e55fd4e5..1ce94c5bdd8c 100644
--- a/drivers/interconnect/imx/imx8mn.c
+++ b/drivers/interconnect/imx/imx8mn.c
@@ -72,7 +72,7 @@ static struct imx_icc_node_desc nodes[] = {
 
 static int imx8mn_icc_probe(struct platform_device *pdev)
 {
-	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
+	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
 }
 
 static int imx8mn_icc_remove(struct platform_device *pdev)
diff --git a/drivers/interconnect/imx/imx8mq.c b/drivers/interconnect/imx/imx8mq.c
index d7768d3c6d8a..7f00a0511c6e 100644
--- a/drivers/interconnect/imx/imx8mq.c
+++ b/drivers/interconnect/imx/imx8mq.c
@@ -82,7 +82,7 @@ static struct imx_icc_node_desc nodes[] = {
 
 static int imx8mq_icc_probe(struct platform_device *pdev)
 {
-	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
+	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
 }
 
 static int imx8mq_icc_remove(struct platform_device *pdev)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp
  2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
                   ` (7 preceding siblings ...)
  2022-06-16  7:33 ` [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control Peng Fan (OSS)
@ 2022-06-16  7:33 ` Peng Fan (OSS)
  2022-06-28 17:58   ` Georgi Djakov
  2022-06-29 15:17   ` Lucas Stach
  8 siblings, 2 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-06-16  7:33 UTC (permalink / raw)
  To: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, l.stach,
	laurent.pinchart, marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Add a platform driver for the i.MX8MP SoC describing bus topology, based
on internal documentation.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/interconnect/imx/Kconfig  |   4 +
 drivers/interconnect/imx/Makefile |   2 +
 drivers/interconnect/imx/imx8mp.c | 259 ++++++++++++++++++++++++++++++
 3 files changed, 265 insertions(+)
 create mode 100644 drivers/interconnect/imx/imx8mp.c

diff --git a/drivers/interconnect/imx/Kconfig b/drivers/interconnect/imx/Kconfig
index be2928362bb7..c772552431f5 100644
--- a/drivers/interconnect/imx/Kconfig
+++ b/drivers/interconnect/imx/Kconfig
@@ -15,3 +15,7 @@ config INTERCONNECT_IMX8MN
 config INTERCONNECT_IMX8MQ
 	tristate "i.MX8MQ interconnect driver"
 	depends on INTERCONNECT_IMX
+
+config INTERCONNECT_IMX8MP
+	tristate "i.MX8MP interconnect driver"
+	depends on INTERCONNECT_IMX
diff --git a/drivers/interconnect/imx/Makefile b/drivers/interconnect/imx/Makefile
index 21fd5233754f..16d256cdeab4 100644
--- a/drivers/interconnect/imx/Makefile
+++ b/drivers/interconnect/imx/Makefile
@@ -2,8 +2,10 @@ imx-interconnect-objs			:= imx.o
 imx8mm-interconnect-objs       		:= imx8mm.o
 imx8mq-interconnect-objs       		:= imx8mq.o
 imx8mn-interconnect-objs       		:= imx8mn.o
+imx8mp-interconnect-objs       		:= imx8mp.o
 
 obj-$(CONFIG_INTERCONNECT_IMX)		+= imx-interconnect.o
 obj-$(CONFIG_INTERCONNECT_IMX8MM)	+= imx8mm-interconnect.o
 obj-$(CONFIG_INTERCONNECT_IMX8MQ)	+= imx8mq-interconnect.o
 obj-$(CONFIG_INTERCONNECT_IMX8MN)	+= imx8mn-interconnect.o
+obj-$(CONFIG_INTERCONNECT_IMX8MP)	+= imx8mp-interconnect.o
diff --git a/drivers/interconnect/imx/imx8mp.c b/drivers/interconnect/imx/imx8mp.c
new file mode 100644
index 000000000000..2be2e9e2974e
--- /dev/null
+++ b/drivers/interconnect/imx/imx8mp.c
@@ -0,0 +1,259 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Interconnect framework driver for i.MX8MP SoC
+ *
+ * Copyright 2022 NXP
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/interconnect/fsl,imx8mp.h>
+
+#include "imx.h"
+
+static const struct imx_icc_node_adj_desc imx8mp_noc_adj = {
+	.bw_mul = 1,
+	.bw_div = 16,
+	.main_noc = true,
+};
+
+static struct imx_icc_noc_setting noc_setting_nodes[] = {
+	[IMX8MP_ICM_MLMIX] = {
+		.reg = 0x180,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_DSP] = {
+		.reg = 0x200,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_SDMA2PER] = {
+		.reg = 0x280,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 4,
+	},
+	[IMX8MP_ICM_SDMA2BURST] = {
+		.reg = 0x300,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 4,
+	},
+	[IMX8MP_ICM_SDMA3PER] = {
+		.reg = 0x380,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 4,
+	},
+	[IMX8MP_ICM_SDMA3BURST] = {
+		.reg = 0x400,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 4,
+	},
+	[IMX8MP_ICM_EDMA] = {
+		.reg = 0x480,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 4,
+	},
+	[IMX8MP_ICM_GPU3D] = {
+		.reg = 0x500,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_GPU2D] = {
+		.reg = 0x580,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_HRV] = {
+		.reg = 0x600,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_LCDIF_HDMI] = {
+		.reg = 0x680,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_HDCP] = {
+		.reg = 0x700,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 5,
+	},
+	[IMX8MP_ICM_NOC_PCIE] = {
+		.reg = 0x780,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_USB1] = {
+		.reg = 0x800,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_USB2] = {
+		.reg = 0x880,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_PCIE] = {
+		.reg = 0x900,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_LCDIF_RD] = {
+		.reg = 0x980,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_LCDIF_WR] = {
+		.reg = 0xa00,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_ISI0] = {
+		.reg = 0xa80,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_ISI1] = {
+		.reg = 0xb00,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_ISI2] = {
+		.reg = 0xb80,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 2,
+		.ext_control = 1,
+	},
+	[IMX8MP_ICM_ISP0] = {
+		.reg = 0xc00,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 7,
+	},
+	[IMX8MP_ICM_ISP1] = {
+		.reg = 0xc80,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 7,
+	},
+	[IMX8MP_ICM_DWE] = {
+		.reg = 0xd00,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 7,
+	},
+	[IMX8MP_ICM_VPU_G1] = {
+		.reg = 0xd80,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_VPU_G2] = {
+		.reg = 0xe00,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICM_VPU_H1] = {
+		.reg = 0xe80,
+		.mode = IMX_NOC_MODE_FIXED,
+		.prio_level = 3,
+	},
+	[IMX8MP_ICN_MEDIA] = {
+		.ignore = true,
+	},
+	[IMX8MP_ICN_VIDEO] = {
+		.ignore = true,
+	},
+	[IMX8MP_ICN_AUDIO] = {
+		.ignore = true,
+	},
+	[IMX8MP_ICN_HDMI] = {
+		.ignore = true,
+	},
+	[IMX8MP_ICN_GPU] = {
+		.ignore = true,
+	},
+	[IMX8MP_ICN_HSIO] = {
+		.ignore = true,
+	},
+};
+
+/* Describe bus masters, slaves and connections between them */
+static struct imx_icc_node_desc nodes[] = {
+	DEFINE_BUS_INTERCONNECT("NOC", IMX8MP_ICN_NOC, &imx8mp_noc_adj,
+				IMX8MP_ICS_DRAM, IMX8MP_ICN_MAIN),
+
+	DEFINE_BUS_SLAVE("OCRAM", IMX8MP_ICS_OCRAM, NULL),
+	DEFINE_BUS_SLAVE("DRAM", IMX8MP_ICS_DRAM, NULL),
+	DEFINE_BUS_MASTER("A53", IMX8MP_ICM_A53, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("SUPERMIX", IMX8MP_ICM_SUPERMIX, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("GIC", IMX8MP_ICM_GIC, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("MLMIX", IMX8MP_ICM_MLMIX, IMX8MP_ICN_NOC),
+
+	DEFINE_BUS_INTERCONNECT("NOC_AUDIO", IMX8MP_ICN_AUDIO, NULL, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("DSP", IMX8MP_ICM_DSP, IMX8MP_ICN_AUDIO),
+	DEFINE_BUS_MASTER("SDMA2PER", IMX8MP_ICM_SDMA2PER, IMX8MP_ICN_AUDIO),
+	DEFINE_BUS_MASTER("SDMA2BURST", IMX8MP_ICM_SDMA2BURST, IMX8MP_ICN_AUDIO),
+	DEFINE_BUS_MASTER("SDMA3PER", IMX8MP_ICM_SDMA3PER, IMX8MP_ICN_AUDIO),
+	DEFINE_BUS_MASTER("SDMA3BURST", IMX8MP_ICM_SDMA3BURST, IMX8MP_ICN_AUDIO),
+	DEFINE_BUS_MASTER("EDMA", IMX8MP_ICM_EDMA, IMX8MP_ICN_AUDIO),
+
+	DEFINE_BUS_INTERCONNECT("NOC_GPU", IMX8MP_ICN_GPU, NULL, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("GPU 2D", IMX8MP_ICM_GPU2D, IMX8MP_ICN_GPU),
+	DEFINE_BUS_MASTER("GPU 3D", IMX8MP_ICM_GPU3D, IMX8MP_ICN_GPU),
+
+	DEFINE_BUS_INTERCONNECT("NOC_HDMI", IMX8MP_ICN_HDMI, NULL, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("HRV", IMX8MP_ICM_HRV, IMX8MP_ICN_HDMI),
+	DEFINE_BUS_MASTER("LCDIF_HDMI", IMX8MP_ICM_LCDIF_HDMI, IMX8MP_ICN_HDMI),
+	DEFINE_BUS_MASTER("HDCP", IMX8MP_ICM_HDCP, IMX8MP_ICN_HDMI),
+
+	DEFINE_BUS_INTERCONNECT("NOC_HSIO", IMX8MP_ICN_HSIO, NULL, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("NOC_PCIE", IMX8MP_ICM_NOC_PCIE, IMX8MP_ICN_HSIO),
+	DEFINE_BUS_MASTER("USB1", IMX8MP_ICM_USB1, IMX8MP_ICN_HSIO),
+	DEFINE_BUS_MASTER("USB2", IMX8MP_ICM_USB2, IMX8MP_ICN_HSIO),
+	DEFINE_BUS_MASTER("PCIE", IMX8MP_ICM_PCIE, IMX8MP_ICN_HSIO),
+
+	DEFINE_BUS_INTERCONNECT("NOC_MEDIA", IMX8MP_ICN_MEDIA, NULL, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("LCDIF_RD", IMX8MP_ICM_LCDIF_RD, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("LCDIF_WR", IMX8MP_ICM_LCDIF_WR, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("ISI0", IMX8MP_ICM_ISI0, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("ISI1", IMX8MP_ICM_ISI1, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("ISI2", IMX8MP_ICM_ISI2, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("ISP0", IMX8MP_ICM_ISP0, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("ISP1", IMX8MP_ICM_ISP1, IMX8MP_ICN_MEDIA),
+	DEFINE_BUS_MASTER("DWE", IMX8MP_ICM_DWE, IMX8MP_ICN_MEDIA),
+
+	DEFINE_BUS_INTERCONNECT("NOC_VIDEO", IMX8MP_ICN_VIDEO, NULL, IMX8MP_ICN_NOC),
+	DEFINE_BUS_MASTER("VPU G1", IMX8MP_ICM_VPU_G1, IMX8MP_ICN_VIDEO),
+	DEFINE_BUS_MASTER("VPU G2", IMX8MP_ICM_VPU_G2, IMX8MP_ICN_VIDEO),
+	DEFINE_BUS_MASTER("VPU H1", IMX8MP_ICM_VPU_H1, IMX8MP_ICN_VIDEO),
+	DEFINE_BUS_INTERCONNECT("PL301_MAIN", IMX8MP_ICN_MAIN, NULL,
+				IMX8MP_ICN_NOC, IMX8MP_ICS_OCRAM),
+};
+
+static int imx8mp_icc_probe(struct platform_device *pdev)
+{
+	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), noc_setting_nodes);
+}
+
+static int imx8mp_icc_remove(struct platform_device *pdev)
+{
+	return imx_icc_unregister(pdev);
+}
+
+static struct platform_driver imx8mp_icc_driver = {
+	.probe = imx8mp_icc_probe,
+	.remove = imx8mp_icc_remove,
+	.driver = {
+		.name = "imx8mp-interconnect",
+	},
+};
+
+module_platform_driver(imx8mp_icc_driver);
+MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:imx8mp-interconnect");
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc
  2022-06-16  7:33 ` [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc Peng Fan (OSS)
@ 2022-06-27 22:18   ` Rob Herring
  0 siblings, 0 replies; 23+ messages in thread
From: Rob Herring @ 2022-06-27 22:18 UTC (permalink / raw)
  To: Peng Fan (OSS)
  Cc: devicetree, linux-arm-kernel, marex, robh+dt, kernel, paul.elder,
	abailon, s.hauer, linux-pm, Peng Fan, aford173, linux-imx,
	l.stach, krzysztof.kozlowski+dt, Markus.Niebel, festevam,
	shawnguo, linux-kernel, laurent.pinchart, abelvesa, abel.vesa,
	djakov

On Thu, 16 Jun 2022 15:33:12 +0800, Peng Fan (OSS) wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> i.MX8MP features same NoC/NIC as i.MX8MM/N/Q, and use two compatible
> strings.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  .../devicetree/bindings/interconnect/fsl,imx8m-noc.yaml     | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 2/9] dt-bindings: interconnect: add fsl,imx8mp.h
  2022-06-16  7:33 ` [PATCH V2 2/9] dt-bindings: interconnect: add fsl,imx8mp.h Peng Fan (OSS)
@ 2022-06-27 22:19   ` Rob Herring
  0 siblings, 0 replies; 23+ messages in thread
From: Rob Herring @ 2022-06-27 22:19 UTC (permalink / raw)
  To: Peng Fan (OSS)
  Cc: robh+dt, laurent.pinchart, shawnguo, aford173, abelvesa,
	linux-imx, djakov, Peng Fan, linux-arm-kernel, abailon, marex,
	krzysztof.kozlowski+dt, s.hauer, festevam, linux-kernel,
	Markus.Niebel, l.stach, devicetree, paul.elder, abel.vesa,
	kernel, linux-pm

On Thu, 16 Jun 2022 15:33:13 +0800, Peng Fan (OSS) wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Add fsl,imx8mp.h for i.MX8MP
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  include/dt-bindings/interconnect/fsl,imx8mp.h | 59 +++++++++++++++++++
>  1 file changed, 59 insertions(+)
>  create mode 100644 include/dt-bindings/interconnect/fsl,imx8mp.h
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control
  2022-06-16  7:33 ` [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control Peng Fan (OSS)
@ 2022-06-28 17:57   ` Georgi Djakov
  2022-07-02 12:41     ` Peng Fan
  2022-06-29 15:14   ` Lucas Stach
  1 sibling, 1 reply; 23+ messages in thread
From: Georgi Djakov @ 2022-06-28 17:57 UTC (permalink / raw)
  To: Peng Fan (OSS),
	shawnguo, s.hauer, festevam, robh+dt, krzysztof.kozlowski+dt,
	abel.vesa, abailon, l.stach, laurent.pinchart, marex, paul.elder,
	Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

Hi Peng,

On 16.06.22 10:33, Peng Fan (OSS) wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Introduce imx_icc_noc_setting structure to describe a master port setting
> Pass imx_icc_noc_setting as a parameter from specific driver
> Set priority level, mode, ext control in imx_icc_node_set
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>   drivers/interconnect/imx/imx.c    | 43 ++++++++++++++++++++++++++----
>   drivers/interconnect/imx/imx.h    | 44 ++++++++++++++++++++++++++++++-
>   drivers/interconnect/imx/imx8mm.c |  2 +-
>   drivers/interconnect/imx/imx8mn.c |  2 +-
>   drivers/interconnect/imx/imx8mq.c |  2 +-
>   5 files changed, 84 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
> index 78557fe6da2c..bd728caf2b85 100644

[..]

> @@ -37,8 +40,24 @@ static int imx_icc_node_set(struct icc_node *node)
>   {
>   	struct device *dev = node->provider->dev;
>   	struct imx_icc_node *node_data = node->data;
> +	void __iomem *base;
> +	u32 prio;
>   	u64 freq;
>   
> +	if (node_data->setting && !node_data->setting->ignore && node->peak_bw) {
> +		base = node_data->setting->reg + node_data->imx_provider->noc_base;
> +		if (node_data->setting->mode == IMX_NOC_MODE_FIXED) {
> +			prio = node_data->setting->prio_level;
> +			prio = PRIORITY_COMP_MARK | (prio << 8) | prio;
> +			writel(prio, base + IMX_NOC_PRIO_REG);
> +			writel(node_data->setting->mode, base + IMX_NOC_MODE_REG);
> +			writel(node_data->setting->ext_control, base + IMX_NOC_EXT_CTL_REG);
> +		} else {
> +			dev_info(dev, "mode: %d not supported\n", node_data->setting->mode);
> +			return -ENOTSUPP;

Nit: I believe that -EOPNOTSUPP is the preferred error code.

> +		}
> +	}
> +
>   	if (!node_data->qos_dev)
>   		return 0;
>   

[..]

> @@ -237,7 +263,8 @@ static int get_max_node_id(struct imx_icc_node_desc *nodes, int nodes_count)
>   }
>   
>   int imx_icc_register(struct platform_device *pdev,
> -		     struct imx_icc_node_desc *nodes, int nodes_count)
> +		     struct imx_icc_node_desc *nodes, int nodes_count,
> +		     struct imx_icc_noc_setting *settings)
>   {
>   	struct device *dev = &pdev->dev;
>   	struct icc_onecell_data *data;
> @@ -267,13 +294,19 @@ int imx_icc_register(struct platform_device *pdev,
>   	provider->dev->of_node = dev->parent->of_node;
>   	platform_set_drvdata(pdev, imx_provider);
>   
> +	if (settings) {
> +		imx_provider->noc_base = devm_of_iomap(dev, provider->dev->of_node, 0, NULL);
> +		if (!imx_provider->noc_base)

devm_of_iomap() returns ERR_PTR(). So we should check it with IS_ERR().

Thanks,
Georgi

> +			return PTR_ERR(imx_provider->noc_base);
> +	}
> +
>   	ret = icc_provider_add(provider);
>   	if (ret) {
>   		dev_err(dev, "error adding interconnect provider: %d\n", ret);
>   		return ret;
>   	}
>   
> -	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count);
> +	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings);
>   	if (ret)
>   		goto provider_del;
>   

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp
  2022-06-16  7:33 ` [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp Peng Fan (OSS)
@ 2022-06-28 17:58   ` Georgi Djakov
  2022-06-29 15:17   ` Lucas Stach
  1 sibling, 0 replies; 23+ messages in thread
From: Georgi Djakov @ 2022-06-28 17:58 UTC (permalink / raw)
  To: Peng Fan (OSS),
	shawnguo, s.hauer, festevam, robh+dt, krzysztof.kozlowski+dt,
	abel.vesa, abailon, l.stach, laurent.pinchart, marex, paul.elder,
	Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan


On 16.06.22 10:33, Peng Fan (OSS) wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Add a platform driver for the i.MX8MP SoC describing bus topology, based
> on internal documentation.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>   drivers/interconnect/imx/Kconfig  |   4 +
>   drivers/interconnect/imx/Makefile |   2 +
>   drivers/interconnect/imx/imx8mp.c | 259 ++++++++++++++++++++++++++++++
>   3 files changed, 265 insertions(+)
>   create mode 100644 drivers/interconnect/imx/imx8mp.c
> 
[..]
> +static int imx8mp_icc_probe(struct platform_device *pdev)
> +{
> +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), noc_setting_nodes);
> +}
> +
> +static int imx8mp_icc_remove(struct platform_device *pdev)
> +{
> +	return imx_icc_unregister(pdev);
> +}
> +
> +static struct platform_driver imx8mp_icc_driver = {
> +	.probe = imx8mp_icc_probe,
> +	.remove = imx8mp_icc_remove,
> +	.driver = {
> +		.name = "imx8mp-interconnect",
> +	},
> +};
> +
> +module_platform_driver(imx8mp_icc_driver);
> +MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
> +MODULE_LICENSE("GPL v2");

Nit: According to Documentation/process/license-rules.rst this should be just "GPL".

> +MODULE_ALIAS("platform:imx8mp-interconnect");

Thanks,
Georgi

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider
  2022-06-16  7:33 ` [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider Peng Fan (OSS)
@ 2022-06-29 15:08   ` Lucas Stach
  2022-06-29 17:32     ` Laurent Pinchart
  2022-07-02 12:48     ` Peng Fan
  0 siblings, 2 replies; 23+ messages in thread
From: Lucas Stach @ 2022-06-29 15:08 UTC (permalink / raw)
  To: Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, laurent.pinchart,
	marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> From: Peng Fan <peng.fan@nxp.com>
> 
> The provider device is created using platform_device_register_data in
> imx-bus driver, which not has of_node. With of_node set, it will be
> easy to support QoS settings.
> 
That's a bit dangerous, as sharing a of_node between two devices can
lead to some reference counting issues IIRC, but then I also don't see
a good way to do this any differently.

Regards,
Lucas

> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/interconnect/imx/imx.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
> index 1f16eedea21c..78557fe6da2c 100644
> --- a/drivers/interconnect/imx/imx.c
> +++ b/drivers/interconnect/imx/imx.c
> @@ -264,6 +264,7 @@ int imx_icc_register(struct platform_device *pdev,
>  	provider->xlate = of_icc_xlate_onecell;
>  	provider->data = data;
>  	provider->dev = dev->parent;
> +	provider->dev->of_node = dev->parent->of_node;
>  	platform_set_drvdata(pdev, imx_provider);
>  
>  	ret = icc_provider_add(provider);



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control
  2022-06-16  7:33 ` [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control Peng Fan (OSS)
  2022-06-28 17:57   ` Georgi Djakov
@ 2022-06-29 15:14   ` Lucas Stach
  2022-07-02 12:50     ` Peng Fan
  1 sibling, 1 reply; 23+ messages in thread
From: Lucas Stach @ 2022-06-29 15:14 UTC (permalink / raw)
  To: Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, laurent.pinchart,
	marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> From: Peng Fan <peng.fan@nxp.com>
> 
> Introduce imx_icc_noc_setting structure to describe a master port setting
> Pass imx_icc_noc_setting as a parameter from specific driver
> Set priority level, mode, ext control in imx_icc_node_set
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/interconnect/imx/imx.c    | 43 ++++++++++++++++++++++++++----
>  drivers/interconnect/imx/imx.h    | 44 ++++++++++++++++++++++++++++++-
>  drivers/interconnect/imx/imx8mm.c |  2 +-
>  drivers/interconnect/imx/imx8mn.c |  2 +-
>  drivers/interconnect/imx/imx8mq.c |  2 +-
>  5 files changed, 84 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
> index 78557fe6da2c..bd728caf2b85 100644
> --- a/drivers/interconnect/imx/imx.c
> +++ b/drivers/interconnect/imx/imx.c
> @@ -10,6 +10,7 @@
>  
>  #include <linux/device.h>
>  #include <linux/interconnect-provider.h>
> +#include <linux/io.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
>  #include <linux/of_platform.h>
> @@ -21,8 +22,10 @@
>  /* private icc_node data */
>  struct imx_icc_node {
>  	const struct imx_icc_node_desc *desc;
> +	const struct imx_icc_noc_setting *setting;
>  	struct device *qos_dev;
>  	struct dev_pm_qos_request qos_req;
> +	struct imx_icc_provider *imx_provider;
>  };
>  
>  static int imx_icc_get_bw(struct icc_node *node, u32 *avg, u32 *peak)
> @@ -37,8 +40,24 @@ static int imx_icc_node_set(struct icc_node *node)
>  {
>  	struct device *dev = node->provider->dev;
>  	struct imx_icc_node *node_data = node->data;
> +	void __iomem *base;
> +	u32 prio;
>  	u64 freq;
>  
> +	if (node_data->setting && !node_data->setting->ignore && node->peak_bw) {
> +		base = node_data->setting->reg + node_data->imx_provider->noc_base;
> +		if (node_data->setting->mode == IMX_NOC_MODE_FIXED) {
> +			prio = node_data->setting->prio_level;
> +			prio = PRIORITY_COMP_MARK | (prio << 8) | prio;
> +			writel(prio, base + IMX_NOC_PRIO_REG);
> +			writel(node_data->setting->mode, base + IMX_NOC_MODE_REG);
> +			writel(node_data->setting->ext_control, base + IMX_NOC_EXT_CTL_REG);
> +		} else {
> +			dev_info(dev, "mode: %d not supported\n", node_data->setting->mode);
> +			return -ENOTSUPP;
> +		}
> +	}
> +
>  	if (!node_data->qos_dev)
>  		return 0;
>  
> @@ -135,7 +154,8 @@ static int imx_icc_node_init_qos(struct icc_provider *provider,
>  }
>  
>  static struct icc_node *imx_icc_node_add(struct imx_icc_provider *imx_provider,
> -					 const struct imx_icc_node_desc *node_desc)
> +					 const struct imx_icc_node_desc *node_desc,
> +					 const struct imx_icc_noc_setting *setting)
>  {
>  	struct icc_provider *provider = &imx_provider->provider;
>  	struct device *dev = provider->dev;
> @@ -164,6 +184,8 @@ static struct icc_node *imx_icc_node_add(struct imx_icc_provider *imx_provider,
>  	node->name = node_desc->name;
>  	node->data = node_data;
>  	node_data->desc = node_desc;
> +	node_data->setting = setting;
> +	node_data->imx_provider = imx_provider;
>  	icc_node_add(node, provider);
>  
>  	if (node_desc->adj) {
> @@ -187,7 +209,8 @@ static void imx_icc_unregister_nodes(struct icc_provider *provider)
>  
>  static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider,
>  				  const struct imx_icc_node_desc *descs,
> -				  int count)
> +				  int count,
> +				  const struct imx_icc_noc_setting *settings)
>  {
>  	struct icc_provider *provider = &imx_provider->provider;
>  	struct icc_onecell_data *provider_data = provider->data;
> @@ -199,7 +222,10 @@ static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider,
>  		const struct imx_icc_node_desc *node_desc = &descs[i];
>  		size_t j;
>  
> -		node = imx_icc_node_add(imx_provider, node_desc);
> +		if (settings)
> +			node = imx_icc_node_add(imx_provider, node_desc, &settings[node_desc->id]);
> +		else
> +			node = imx_icc_node_add(imx_provider, node_desc, NULL);

Maybe just write as
node = imx_icc_node_add(imx_provider, node_desc, settings ? &settings[node_desc->id] : NULL);

But I don't really care, so feel free to ignore this suggestion if you
don't like it.

>  		if (IS_ERR(node)) {
>  			ret = dev_err_probe(provider->dev,
> PTR_ERR(node),
>  					    "failed to add %s\n",
> node_desc->name);
> @@ -237,7 +263,8 @@ static int get_max_node_id(struct
> imx_icc_node_desc *nodes, int nodes_count)
>  }
>  
>  int imx_icc_register(struct platform_device *pdev,
> -		     struct imx_icc_node_desc *nodes, int
> nodes_count)
> +		     struct imx_icc_node_desc *nodes, int
> nodes_count,
> +		     struct imx_icc_noc_setting *settings)
>  {
>  	struct device *dev = &pdev->dev;
>  	struct icc_onecell_data *data;
> @@ -267,13 +294,19 @@ int imx_icc_register(struct platform_device
> *pdev,
>  	provider->dev->of_node = dev->parent->of_node;
>  	platform_set_drvdata(pdev, imx_provider);
>  
> +	if (settings) {
> +		imx_provider->noc_base = devm_of_iomap(dev,
> provider->dev->of_node, 0, NULL);
> +		if (!imx_provider->noc_base)
> +			return PTR_ERR(imx_provider->noc_base);
> +	}
> +
>  	ret = icc_provider_add(provider);
>  	if (ret) {
>  		dev_err(dev, "error adding interconnect provider:
> %d\n", ret);
>  		return ret;
>  	}
>  
> -	ret = imx_icc_register_nodes(imx_provider, nodes,
> nodes_count);
> +	ret = imx_icc_register_nodes(imx_provider, nodes,
> nodes_count, settings);
>  	if (ret)
>  		goto provider_del;
>  
> diff --git a/drivers/interconnect/imx/imx.h
> b/drivers/interconnect/imx/imx.h
> index 0ad2c654c222..1da87cfe27da 100644
> --- a/drivers/interconnect/imx/imx.h
> +++ b/drivers/interconnect/imx/imx.h
> @@ -15,6 +15,31 @@
>  
>  #define IMX_ICC_MAX_LINKS	4
>  
> +/*
> + * High throughput priority level in Regulator mode
> + * Read Priority in Fixed/Limiter mode
> + */
> +#define PRIORITY0_SHIFT	0
> +/*
> + * Low throughput priority level in Regulator mode
> + * Write Priority in Fixed/Limiter mode
> + */
> +#define PRIORITY1_SHIFT	8
> +#define PRIORITY_MASK		0x7
> +
> +#define PRIORITY_COMP_MARK	BIT(31)	/* Must set */
> +
> +#define IMX_NOC_MODE_FIXED	0
> +#define IMX_NOC_MODE_LIMITER	1
> +#define IMX_NOC_MODE_BYPASS	2
> +#define IMX_NOC_MODE_REGULATOR	3
> +
> +#define IMX_NOC_PRIO_REG	0x8
> +#define IMX_NOC_MODE_REG	0xC
> +#define IMX_NOC_BANDWIDTH_REG	0x10
> +#define IMX_NOC_SATURATION	0x14
> +#define IMX_NOC_EXT_CTL_REG	0x18
> +
>  struct imx_icc_provider {
>  	void __iomem *noc_base;
>  	struct icc_provider provider;
> @@ -44,6 +69,22 @@ struct imx_icc_node_desc {
>  	const struct imx_icc_node_adj_desc *adj;
>  };
>  
> +/*
> + * struct imx_icc_noc_setting - Describe an interconnect node
> setting
> + * @ignore: indicate whether need apply this setting
> + * @reg: register offset inside the NoC
> + * @prio_level: priority level
> + * @mode: functional mode
> + * @ext_control: external input control
> + */
> +struct imx_icc_noc_setting {
> +	bool ignore;

I don't like this ignore member. Can we get rid of this and make the
"don't touch" a special mode, like IMX_NOC_MODE_UNCONFIGURED?

Other than those two nitpicks, the patch looks good.

Regards,
Lucas

> +	u32 reg;
> +	u32 prio_level;
> +	u32 mode;
> +	u32 ext_control;
> +};
> +
>  #define DEFINE_BUS_INTERCONNECT(_name, _id, _adj, ...)			\
>  	{								\
>  		.id = _id,						\
> @@ -61,7 +102,8 @@ struct imx_icc_node_desc {
>  
>  int imx_icc_register(struct platform_device *pdev,
>  		     struct imx_icc_node_desc *nodes,
> -		     int nodes_count);
> +		     int nodes_count,
> +		     struct imx_icc_noc_setting *noc_settings);
>  int imx_icc_unregister(struct platform_device *pdev);
>  
>  #endif /* __DRIVERS_INTERCONNECT_IMX_H */
> diff --git a/drivers/interconnect/imx/imx8mm.c b/drivers/interconnect/imx/imx8mm.c
> index 1083490bb391..ae797412db96 100644
> --- a/drivers/interconnect/imx/imx8mm.c
> +++ b/drivers/interconnect/imx/imx8mm.c
> @@ -83,7 +83,7 @@ static struct imx_icc_node_desc nodes[] = {
>  
>  static int imx8mm_icc_probe(struct platform_device *pdev)
>  {
> -	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
> +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
>  }
>  
>  static int imx8mm_icc_remove(struct platform_device *pdev)
> diff --git a/drivers/interconnect/imx/imx8mn.c b/drivers/interconnect/imx/imx8mn.c
> index ad97e55fd4e5..1ce94c5bdd8c 100644
> --- a/drivers/interconnect/imx/imx8mn.c
> +++ b/drivers/interconnect/imx/imx8mn.c
> @@ -72,7 +72,7 @@ static struct imx_icc_node_desc nodes[] = {
>  
>  static int imx8mn_icc_probe(struct platform_device *pdev)
>  {
> -	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
> +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
>  }
>  
>  static int imx8mn_icc_remove(struct platform_device *pdev)
> diff --git a/drivers/interconnect/imx/imx8mq.c b/drivers/interconnect/imx/imx8mq.c
> index d7768d3c6d8a..7f00a0511c6e 100644
> --- a/drivers/interconnect/imx/imx8mq.c
> +++ b/drivers/interconnect/imx/imx8mq.c
> @@ -82,7 +82,7 @@ static struct imx_icc_node_desc nodes[] = {
>  
>  static int imx8mq_icc_probe(struct platform_device *pdev)
>  {
> -	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
> +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
>  }
>  
>  static int imx8mq_icc_remove(struct platform_device *pdev)



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp
  2022-06-16  7:33 ` [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp Peng Fan (OSS)
  2022-06-28 17:58   ` Georgi Djakov
@ 2022-06-29 15:17   ` Lucas Stach
  2022-07-02 12:51     ` Peng Fan
  1 sibling, 1 reply; 23+ messages in thread
From: Lucas Stach @ 2022-06-29 15:17 UTC (permalink / raw)
  To: Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, laurent.pinchart,
	marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	linux-imx, abelvesa, Peng Fan

Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> From: Peng Fan <peng.fan@nxp.com>
> 
> Add a platform driver for the i.MX8MP SoC describing bus topology, based
> on internal documentation.

This series is missing the compatible addition in drivers/devfreq/imx-
bus.c to make the platform driver probe.

Other than that, looks good.

Regards,
Lucas

> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/interconnect/imx/Kconfig  |   4 +
>  drivers/interconnect/imx/Makefile |   2 +
>  drivers/interconnect/imx/imx8mp.c | 259 ++++++++++++++++++++++++++++++
>  3 files changed, 265 insertions(+)
>  create mode 100644 drivers/interconnect/imx/imx8mp.c
> 
> diff --git a/drivers/interconnect/imx/Kconfig b/drivers/interconnect/imx/Kconfig
> index be2928362bb7..c772552431f5 100644
> --- a/drivers/interconnect/imx/Kconfig
> +++ b/drivers/interconnect/imx/Kconfig
> @@ -15,3 +15,7 @@ config INTERCONNECT_IMX8MN
>  config INTERCONNECT_IMX8MQ
>  	tristate "i.MX8MQ interconnect driver"
>  	depends on INTERCONNECT_IMX
> +
> +config INTERCONNECT_IMX8MP
> +	tristate "i.MX8MP interconnect driver"
> +	depends on INTERCONNECT_IMX
> diff --git a/drivers/interconnect/imx/Makefile b/drivers/interconnect/imx/Makefile
> index 21fd5233754f..16d256cdeab4 100644
> --- a/drivers/interconnect/imx/Makefile
> +++ b/drivers/interconnect/imx/Makefile
> @@ -2,8 +2,10 @@ imx-interconnect-objs			:= imx.o
>  imx8mm-interconnect-objs       		:= imx8mm.o
>  imx8mq-interconnect-objs       		:= imx8mq.o
>  imx8mn-interconnect-objs       		:= imx8mn.o
> +imx8mp-interconnect-objs       		:= imx8mp.o
>  
>  obj-$(CONFIG_INTERCONNECT_IMX)		+= imx-interconnect.o
>  obj-$(CONFIG_INTERCONNECT_IMX8MM)	+= imx8mm-interconnect.o
>  obj-$(CONFIG_INTERCONNECT_IMX8MQ)	+= imx8mq-interconnect.o
>  obj-$(CONFIG_INTERCONNECT_IMX8MN)	+= imx8mn-interconnect.o
> +obj-$(CONFIG_INTERCONNECT_IMX8MP)	+= imx8mp-interconnect.o
> diff --git a/drivers/interconnect/imx/imx8mp.c b/drivers/interconnect/imx/imx8mp.c
> new file mode 100644
> index 000000000000..2be2e9e2974e
> --- /dev/null
> +++ b/drivers/interconnect/imx/imx8mp.c
> @@ -0,0 +1,259 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Interconnect framework driver for i.MX8MP SoC
> + *
> + * Copyright 2022 NXP
> + * Peng Fan <peng.fan@nxp.com>
> + */
> +
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <dt-bindings/interconnect/fsl,imx8mp.h>
> +
> +#include "imx.h"
> +
> +static const struct imx_icc_node_adj_desc imx8mp_noc_adj = {
> +	.bw_mul = 1,
> +	.bw_div = 16,
> +	.main_noc = true,
> +};
> +
> +static struct imx_icc_noc_setting noc_setting_nodes[] = {
> +	[IMX8MP_ICM_MLMIX] = {
> +		.reg = 0x180,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_DSP] = {
> +		.reg = 0x200,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_SDMA2PER] = {
> +		.reg = 0x280,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 4,
> +	},
> +	[IMX8MP_ICM_SDMA2BURST] = {
> +		.reg = 0x300,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 4,
> +	},
> +	[IMX8MP_ICM_SDMA3PER] = {
> +		.reg = 0x380,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 4,
> +	},
> +	[IMX8MP_ICM_SDMA3BURST] = {
> +		.reg = 0x400,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 4,
> +	},
> +	[IMX8MP_ICM_EDMA] = {
> +		.reg = 0x480,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 4,
> +	},
> +	[IMX8MP_ICM_GPU3D] = {
> +		.reg = 0x500,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_GPU2D] = {
> +		.reg = 0x580,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_HRV] = {
> +		.reg = 0x600,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_LCDIF_HDMI] = {
> +		.reg = 0x680,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_HDCP] = {
> +		.reg = 0x700,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 5,
> +	},
> +	[IMX8MP_ICM_NOC_PCIE] = {
> +		.reg = 0x780,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_USB1] = {
> +		.reg = 0x800,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_USB2] = {
> +		.reg = 0x880,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_PCIE] = {
> +		.reg = 0x900,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_LCDIF_RD] = {
> +		.reg = 0x980,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_LCDIF_WR] = {
> +		.reg = 0xa00,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_ISI0] = {
> +		.reg = 0xa80,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_ISI1] = {
> +		.reg = 0xb00,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_ISI2] = {
> +		.reg = 0xb80,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 2,
> +		.ext_control = 1,
> +	},
> +	[IMX8MP_ICM_ISP0] = {
> +		.reg = 0xc00,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 7,
> +	},
> +	[IMX8MP_ICM_ISP1] = {
> +		.reg = 0xc80,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 7,
> +	},
> +	[IMX8MP_ICM_DWE] = {
> +		.reg = 0xd00,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 7,
> +	},
> +	[IMX8MP_ICM_VPU_G1] = {
> +		.reg = 0xd80,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_VPU_G2] = {
> +		.reg = 0xe00,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICM_VPU_H1] = {
> +		.reg = 0xe80,
> +		.mode = IMX_NOC_MODE_FIXED,
> +		.prio_level = 3,
> +	},
> +	[IMX8MP_ICN_MEDIA] = {
> +		.ignore = true,
> +	},
> +	[IMX8MP_ICN_VIDEO] = {
> +		.ignore = true,
> +	},
> +	[IMX8MP_ICN_AUDIO] = {
> +		.ignore = true,
> +	},
> +	[IMX8MP_ICN_HDMI] = {
> +		.ignore = true,
> +	},
> +	[IMX8MP_ICN_GPU] = {
> +		.ignore = true,
> +	},
> +	[IMX8MP_ICN_HSIO] = {
> +		.ignore = true,
> +	},
> +};
> +
> +/* Describe bus masters, slaves and connections between them */
> +static struct imx_icc_node_desc nodes[] = {
> +	DEFINE_BUS_INTERCONNECT("NOC", IMX8MP_ICN_NOC, &imx8mp_noc_adj,
> +				IMX8MP_ICS_DRAM, IMX8MP_ICN_MAIN),
> +
> +	DEFINE_BUS_SLAVE("OCRAM", IMX8MP_ICS_OCRAM, NULL),
> +	DEFINE_BUS_SLAVE("DRAM", IMX8MP_ICS_DRAM, NULL),
> +	DEFINE_BUS_MASTER("A53", IMX8MP_ICM_A53, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("SUPERMIX", IMX8MP_ICM_SUPERMIX, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("GIC", IMX8MP_ICM_GIC, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("MLMIX", IMX8MP_ICM_MLMIX, IMX8MP_ICN_NOC),
> +
> +	DEFINE_BUS_INTERCONNECT("NOC_AUDIO", IMX8MP_ICN_AUDIO, NULL, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("DSP", IMX8MP_ICM_DSP, IMX8MP_ICN_AUDIO),
> +	DEFINE_BUS_MASTER("SDMA2PER", IMX8MP_ICM_SDMA2PER, IMX8MP_ICN_AUDIO),
> +	DEFINE_BUS_MASTER("SDMA2BURST", IMX8MP_ICM_SDMA2BURST, IMX8MP_ICN_AUDIO),
> +	DEFINE_BUS_MASTER("SDMA3PER", IMX8MP_ICM_SDMA3PER, IMX8MP_ICN_AUDIO),
> +	DEFINE_BUS_MASTER("SDMA3BURST", IMX8MP_ICM_SDMA3BURST, IMX8MP_ICN_AUDIO),
> +	DEFINE_BUS_MASTER("EDMA", IMX8MP_ICM_EDMA, IMX8MP_ICN_AUDIO),
> +
> +	DEFINE_BUS_INTERCONNECT("NOC_GPU", IMX8MP_ICN_GPU, NULL, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("GPU 2D", IMX8MP_ICM_GPU2D, IMX8MP_ICN_GPU),
> +	DEFINE_BUS_MASTER("GPU 3D", IMX8MP_ICM_GPU3D, IMX8MP_ICN_GPU),
> +
> +	DEFINE_BUS_INTERCONNECT("NOC_HDMI", IMX8MP_ICN_HDMI, NULL, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("HRV", IMX8MP_ICM_HRV, IMX8MP_ICN_HDMI),
> +	DEFINE_BUS_MASTER("LCDIF_HDMI", IMX8MP_ICM_LCDIF_HDMI, IMX8MP_ICN_HDMI),
> +	DEFINE_BUS_MASTER("HDCP", IMX8MP_ICM_HDCP, IMX8MP_ICN_HDMI),
> +
> +	DEFINE_BUS_INTERCONNECT("NOC_HSIO", IMX8MP_ICN_HSIO, NULL, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("NOC_PCIE", IMX8MP_ICM_NOC_PCIE, IMX8MP_ICN_HSIO),
> +	DEFINE_BUS_MASTER("USB1", IMX8MP_ICM_USB1, IMX8MP_ICN_HSIO),
> +	DEFINE_BUS_MASTER("USB2", IMX8MP_ICM_USB2, IMX8MP_ICN_HSIO),
> +	DEFINE_BUS_MASTER("PCIE", IMX8MP_ICM_PCIE, IMX8MP_ICN_HSIO),
> +
> +	DEFINE_BUS_INTERCONNECT("NOC_MEDIA", IMX8MP_ICN_MEDIA, NULL, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("LCDIF_RD", IMX8MP_ICM_LCDIF_RD, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("LCDIF_WR", IMX8MP_ICM_LCDIF_WR, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("ISI0", IMX8MP_ICM_ISI0, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("ISI1", IMX8MP_ICM_ISI1, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("ISI2", IMX8MP_ICM_ISI2, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("ISP0", IMX8MP_ICM_ISP0, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("ISP1", IMX8MP_ICM_ISP1, IMX8MP_ICN_MEDIA),
> +	DEFINE_BUS_MASTER("DWE", IMX8MP_ICM_DWE, IMX8MP_ICN_MEDIA),
> +
> +	DEFINE_BUS_INTERCONNECT("NOC_VIDEO", IMX8MP_ICN_VIDEO, NULL, IMX8MP_ICN_NOC),
> +	DEFINE_BUS_MASTER("VPU G1", IMX8MP_ICM_VPU_G1, IMX8MP_ICN_VIDEO),
> +	DEFINE_BUS_MASTER("VPU G2", IMX8MP_ICM_VPU_G2, IMX8MP_ICN_VIDEO),
> +	DEFINE_BUS_MASTER("VPU H1", IMX8MP_ICM_VPU_H1, IMX8MP_ICN_VIDEO),
> +	DEFINE_BUS_INTERCONNECT("PL301_MAIN", IMX8MP_ICN_MAIN, NULL,
> +				IMX8MP_ICN_NOC, IMX8MP_ICS_OCRAM),
> +};
> +
> +static int imx8mp_icc_probe(struct platform_device *pdev)
> +{
> +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), noc_setting_nodes);
> +}
> +
> +static int imx8mp_icc_remove(struct platform_device *pdev)
> +{
> +	return imx_icc_unregister(pdev);
> +}
> +
> +static struct platform_driver imx8mp_icc_driver = {
> +	.probe = imx8mp_icc_probe,
> +	.remove = imx8mp_icc_remove,
> +	.driver = {
> +		.name = "imx8mp-interconnect",
> +	},
> +};
> +
> +module_platform_driver(imx8mp_icc_driver);
> +MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
> +MODULE_LICENSE("GPL v2");
> +MODULE_ALIAS("platform:imx8mp-interconnect");



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider
  2022-06-29 15:08   ` Lucas Stach
@ 2022-06-29 17:32     ` Laurent Pinchart
  2022-07-03  8:43       ` Peng Fan (OSS)
  2022-07-02 12:48     ` Peng Fan
  1 sibling, 1 reply; 23+ messages in thread
From: Laurent Pinchart @ 2022-06-29 17:32 UTC (permalink / raw)
  To: Lucas Stach
  Cc: Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, marex, paul.elder,
	Markus.Niebel, aford173, kernel, linux-pm, devicetree,
	linux-arm-kernel, linux-kernel, linux-imx, abelvesa, Peng Fan

On Wed, Jun 29, 2022 at 05:08:58PM +0200, Lucas Stach wrote:
> Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> > From: Peng Fan <peng.fan@nxp.com>
> > 
> > The provider device is created using platform_device_register_data in
> > imx-bus driver, which not has of_node. With of_node set, it will be
> > easy to support QoS settings.
> > 
> That's a bit dangerous, as sharing a of_node between two devices can
> lead to some reference counting issues IIRC, but then I also don't see
> a good way to do this any differently.
> 
> Regards,
> Lucas
> 
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  drivers/interconnect/imx/imx.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
> > index 1f16eedea21c..78557fe6da2c 100644
> > --- a/drivers/interconnect/imx/imx.c
> > +++ b/drivers/interconnect/imx/imx.c
> > @@ -264,6 +264,7 @@ int imx_icc_register(struct platform_device *pdev,
> >  	provider->xlate = of_icc_xlate_onecell;
> >  	provider->data = data;
> >  	provider->dev = dev->parent;
> > +	provider->dev->of_node = dev->parent->of_node;

Due to the previous line, provider->dev is equal to dev->parent, so
doesn't this essentially do

	dev->parent->of_node = dev->parent->of_node;

which is a no-op ?

> >  	platform_set_drvdata(pdev, imx_provider);
> >  
> >  	ret = icc_provider_add(provider);

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 23+ messages in thread

* RE: [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control
  2022-06-28 17:57   ` Georgi Djakov
@ 2022-07-02 12:41     ` Peng Fan
  0 siblings, 0 replies; 23+ messages in thread
From: Peng Fan @ 2022-07-02 12:41 UTC (permalink / raw)
  To: Georgi Djakov, Peng Fan (OSS),
	shawnguo, s.hauer, festevam, robh+dt, krzysztof.kozlowski+dt,
	Abel Vesa, abailon, l.stach, laurent.pinchart, marex, paul.elder,
	Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	dl-linux-imx, abelvesa

> Subject: Re: [PATCH V2 8/9] interconnect: imx: configure NoC
> mode/prioriry/ext_control
> 
> Hi Peng,
> 
> On 16.06.22 10:33, Peng Fan (OSS) wrote:
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > Introduce imx_icc_noc_setting structure to describe a master port
> > setting Pass imx_icc_noc_setting as a parameter from specific driver
> > Set priority level, mode, ext control in imx_icc_node_set
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >   drivers/interconnect/imx/imx.c    | 43 ++++++++++++++++++++++++++----
> >   drivers/interconnect/imx/imx.h    | 44
> ++++++++++++++++++++++++++++++-
> >   drivers/interconnect/imx/imx8mm.c |  2 +-
> >   drivers/interconnect/imx/imx8mn.c |  2 +-
> >   drivers/interconnect/imx/imx8mq.c |  2 +-
> >   5 files changed, 84 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/interconnect/imx/imx.c
> > b/drivers/interconnect/imx/imx.c index 78557fe6da2c..bd728caf2b85
> > 100644
> 
> [..]
> 
> > @@ -37,8 +40,24 @@ static int imx_icc_node_set(struct icc_node *node)
> >   {
> >   	struct device *dev = node->provider->dev;
> >   	struct imx_icc_node *node_data = node->data;
> > +	void __iomem *base;
> > +	u32 prio;
> >   	u64 freq;
> >
> > +	if (node_data->setting && !node_data->setting->ignore && node-
> >peak_bw) {
> > +		base = node_data->setting->reg + node_data-
> >imx_provider->noc_base;
> > +		if (node_data->setting->mode == IMX_NOC_MODE_FIXED) {
> > +			prio = node_data->setting->prio_level;
> > +			prio = PRIORITY_COMP_MARK | (prio << 8) | prio;
> > +			writel(prio, base + IMX_NOC_PRIO_REG);
> > +			writel(node_data->setting->mode, base +
> IMX_NOC_MODE_REG);
> > +			writel(node_data->setting->ext_control, base +
> IMX_NOC_EXT_CTL_REG);
> > +		} else {
> > +			dev_info(dev, "mode: %d not supported\n",
> node_data->setting->mode);
> > +			return -ENOTSUPP;
> 
> Nit: I believe that -EOPNOTSUPP is the preferred error code.

Fix in V3.

> 
> > +		}
> > +	}
> > +
> >   	if (!node_data->qos_dev)
> >   		return 0;
> >
> 
> [..]
> 
> > @@ -237,7 +263,8 @@ static int get_max_node_id(struct
> imx_icc_node_desc *nodes, int nodes_count)
> >   }
> >
> >   int imx_icc_register(struct platform_device *pdev,
> > -		     struct imx_icc_node_desc *nodes, int nodes_count)
> > +		     struct imx_icc_node_desc *nodes, int nodes_count,
> > +		     struct imx_icc_noc_setting *settings)
> >   {
> >   	struct device *dev = &pdev->dev;
> >   	struct icc_onecell_data *data;
> > @@ -267,13 +294,19 @@ int imx_icc_register(struct platform_device
> *pdev,
> >   	provider->dev->of_node = dev->parent->of_node;
> >   	platform_set_drvdata(pdev, imx_provider);
> >
> > +	if (settings) {
> > +		imx_provider->noc_base = devm_of_iomap(dev, provider-
> >dev->of_node, 0, NULL);
> > +		if (!imx_provider->noc_base)
> 
> devm_of_iomap() returns ERR_PTR(). So we should check it with IS_ERR().

Oops, fix in V3.

Thanks,
Peng.

> 
> Thanks,
> Georgi
> 
> > +			return PTR_ERR(imx_provider->noc_base);
> > +	}
> > +
> >   	ret = icc_provider_add(provider);
> >   	if (ret) {
> >   		dev_err(dev, "error adding interconnect provider: %d\n",
> ret);
> >   		return ret;
> >   	}
> >
> > -	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count);
> > +	ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count,
> > +settings);
> >   	if (ret)
> >   		goto provider_del;
> >

^ permalink raw reply	[flat|nested] 23+ messages in thread

* RE: [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider
  2022-06-29 15:08   ` Lucas Stach
  2022-06-29 17:32     ` Laurent Pinchart
@ 2022-07-02 12:48     ` Peng Fan
  1 sibling, 0 replies; 23+ messages in thread
From: Peng Fan @ 2022-07-02 12:48 UTC (permalink / raw)
  To: Lucas Stach, Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, Abel Vesa, abailon, laurent.pinchart,
	marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	dl-linux-imx, abelvesa

> Subject: Re: [PATCH V2 7/9] interconnect: imx: set of_node for interconnect
> provider
> 
> Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > The provider device is created using platform_device_register_data in
> > imx-bus driver, which not has of_node. With of_node set, it will be
> > easy to support QoS settings.
> >
> That's a bit dangerous, as sharing a of_node between two devices can lead
> to some reference counting issues IIRC, but then I also don't see a good way
> to do this any differently.

I just recalled there is a similar usage in usb code, I not remember the exact
file.

I thought not to let imx-bus.c to register the device, but I wanna to do all
these stuff step by step. The next step is to pick Abel's
https://lore.kernel.org/linux-arm-kernel/20220106164150.3474048-1-
abel.vesa@nxp.com/

Abel told me he was trying to decouple imx-bus with icc.

Thanks,
Peng.


> 
> Regards,
> Lucas
> 
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  drivers/interconnect/imx/imx.c | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/drivers/interconnect/imx/imx.c
> > b/drivers/interconnect/imx/imx.c index 1f16eedea21c..78557fe6da2c
> > 100644
> > --- a/drivers/interconnect/imx/imx.c
> > +++ b/drivers/interconnect/imx/imx.c
> > @@ -264,6 +264,7 @@ int imx_icc_register(struct platform_device *pdev,
> >  	provider->xlate = of_icc_xlate_onecell;
> >  	provider->data = data;
> >  	provider->dev = dev->parent;
> > +	provider->dev->of_node = dev->parent->of_node;
> >  	platform_set_drvdata(pdev, imx_provider);
> >
> >  	ret = icc_provider_add(provider);
> 


^ permalink raw reply	[flat|nested] 23+ messages in thread

* RE: [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control
  2022-06-29 15:14   ` Lucas Stach
@ 2022-07-02 12:50     ` Peng Fan
  0 siblings, 0 replies; 23+ messages in thread
From: Peng Fan @ 2022-07-02 12:50 UTC (permalink / raw)
  To: Lucas Stach, Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, Abel Vesa, abailon, laurent.pinchart,
	marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	dl-linux-imx, abelvesa

> Subject: Re: [PATCH V2 8/9] interconnect: imx: configure NoC
> mode/prioriry/ext_control
> 
> Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > Introduce imx_icc_noc_setting structure to describe a master port
> > setting Pass imx_icc_noc_setting as a parameter from specific driver
> > Set priority level, mode, ext control in imx_icc_node_set
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  drivers/interconnect/imx/imx.c    | 43 ++++++++++++++++++++++++++----
> >  drivers/interconnect/imx/imx.h    | 44
> ++++++++++++++++++++++++++++++-
> >  drivers/interconnect/imx/imx8mm.c |  2 +-
> > drivers/interconnect/imx/imx8mn.c |  2 +-
> > drivers/interconnect/imx/imx8mq.c |  2 +-
> >  5 files changed, 84 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/interconnect/imx/imx.c
> > b/drivers/interconnect/imx/imx.c index 78557fe6da2c..bd728caf2b85
> > 100644
> > --- a/drivers/interconnect/imx/imx.c
> > +++ b/drivers/interconnect/imx/imx.c
> > @@ -10,6 +10,7 @@
> >
> >  #include <linux/device.h>
> >  #include <linux/interconnect-provider.h>
> > +#include <linux/io.h>
> >  #include <linux/module.h>
> >  #include <linux/of.h>
> >  #include <linux/of_platform.h>
> > @@ -21,8 +22,10 @@
> >  /* private icc_node data */
> >  struct imx_icc_node {
> >  	const struct imx_icc_node_desc *desc;
> > +	const struct imx_icc_noc_setting *setting;
> >  	struct device *qos_dev;
> >  	struct dev_pm_qos_request qos_req;
> > +	struct imx_icc_provider *imx_provider;
> >  };
> >
> >  static int imx_icc_get_bw(struct icc_node *node, u32 *avg, u32 *peak)
> > @@ -37,8 +40,24 @@ static int imx_icc_node_set(struct icc_node *node)
> > {
> >  	struct device *dev = node->provider->dev;
> >  	struct imx_icc_node *node_data = node->data;
> > +	void __iomem *base;
> > +	u32 prio;
> >  	u64 freq;
> >
> > +	if (node_data->setting && !node_data->setting->ignore && node-
> >peak_bw) {
> > +		base = node_data->setting->reg + node_data-
> >imx_provider->noc_base;
> > +		if (node_data->setting->mode == IMX_NOC_MODE_FIXED) {
> > +			prio = node_data->setting->prio_level;
> > +			prio = PRIORITY_COMP_MARK | (prio << 8) | prio;
> > +			writel(prio, base + IMX_NOC_PRIO_REG);
> > +			writel(node_data->setting->mode, base +
> IMX_NOC_MODE_REG);
> > +			writel(node_data->setting->ext_control, base +
> IMX_NOC_EXT_CTL_REG);
> > +		} else {
> > +			dev_info(dev, "mode: %d not supported\n",
> node_data->setting->mode);
> > +			return -ENOTSUPP;
> > +		}
> > +	}
> > +
> >  	if (!node_data->qos_dev)
> >  		return 0;
> >
> > @@ -135,7 +154,8 @@ static int imx_icc_node_init_qos(struct
> > icc_provider *provider,  }
> >
> >  static struct icc_node *imx_icc_node_add(struct imx_icc_provider
> *imx_provider,
> > -					 const struct imx_icc_node_desc
> *node_desc)
> > +					 const struct imx_icc_node_desc
> *node_desc,
> > +					 const struct imx_icc_noc_setting
> *setting)
> >  {
> >  	struct icc_provider *provider = &imx_provider->provider;
> >  	struct device *dev = provider->dev;
> > @@ -164,6 +184,8 @@ static struct icc_node *imx_icc_node_add(struct
> imx_icc_provider *imx_provider,
> >  	node->name = node_desc->name;
> >  	node->data = node_data;
> >  	node_data->desc = node_desc;
> > +	node_data->setting = setting;
> > +	node_data->imx_provider = imx_provider;
> >  	icc_node_add(node, provider);
> >
> >  	if (node_desc->adj) {
> > @@ -187,7 +209,8 @@ static void imx_icc_unregister_nodes(struct
> > icc_provider *provider)
> >
> >  static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider,
> >  				  const struct imx_icc_node_desc *descs,
> > -				  int count)
> > +				  int count,
> > +				  const struct imx_icc_noc_setting *settings)
> >  {
> >  	struct icc_provider *provider = &imx_provider->provider;
> >  	struct icc_onecell_data *provider_data = provider->data; @@ -
> 199,7
> > +222,10 @@ static int imx_icc_register_nodes(struct imx_icc_provider
> *imx_provider,
> >  		const struct imx_icc_node_desc *node_desc = &descs[i];
> >  		size_t j;
> >
> > -		node = imx_icc_node_add(imx_provider, node_desc);
> > +		if (settings)
> > +			node = imx_icc_node_add(imx_provider, node_desc,
> &settings[node_desc->id]);
> > +		else
> > +			node = imx_icc_node_add(imx_provider, node_desc,
> NULL);
> 
> Maybe just write as
> node = imx_icc_node_add(imx_provider, node_desc, settings ?
> &settings[node_desc->id] : NULL);

Sure, cleaner.

> 
> But I don't really care, so feel free to ignore this suggestion if you don't like it.
> 
> >  		if (IS_ERR(node)) {
> >  			ret = dev_err_probe(provider->dev, PTR_ERR(node),
> >  					    "failed to add %s\n",
> > node_desc->name);
> > @@ -237,7 +263,8 @@ static int get_max_node_id(struct
> > imx_icc_node_desc *nodes, int nodes_count)  }
> >
> >  int imx_icc_register(struct platform_device *pdev,
> > -		     struct imx_icc_node_desc *nodes, int
> > nodes_count)
> > +		     struct imx_icc_node_desc *nodes, int
> > nodes_count,
> > +		     struct imx_icc_noc_setting *settings)
> >  {
> >  	struct device *dev = &pdev->dev;
> >  	struct icc_onecell_data *data;
> > @@ -267,13 +294,19 @@ int imx_icc_register(struct platform_device
> > *pdev,
> >  	provider->dev->of_node = dev->parent->of_node;
> >  	platform_set_drvdata(pdev, imx_provider);
> >
> > +	if (settings) {
> > +		imx_provider->noc_base = devm_of_iomap(dev,
> > provider->dev->of_node, 0, NULL);
> > +		if (!imx_provider->noc_base)
> > +			return PTR_ERR(imx_provider->noc_base);
> > +	}
> > +
> >  	ret = icc_provider_add(provider);
> >  	if (ret) {
> >  		dev_err(dev, "error adding interconnect provider:
> > %d\n", ret);
> >  		return ret;
> >  	}
> >
> > -	ret = imx_icc_register_nodes(imx_provider, nodes,
> > nodes_count);
> > +	ret = imx_icc_register_nodes(imx_provider, nodes,
> > nodes_count, settings);
> >  	if (ret)
> >  		goto provider_del;
> >
> > diff --git a/drivers/interconnect/imx/imx.h
> > b/drivers/interconnect/imx/imx.h index 0ad2c654c222..1da87cfe27da
> > 100644
> > --- a/drivers/interconnect/imx/imx.h
> > +++ b/drivers/interconnect/imx/imx.h
> > @@ -15,6 +15,31 @@
> >
> >  #define IMX_ICC_MAX_LINKS	4
> >
> > +/*
> > + * High throughput priority level in Regulator mode
> > + * Read Priority in Fixed/Limiter mode  */
> > +#define PRIORITY0_SHIFT	0
> > +/*
> > + * Low throughput priority level in Regulator mode
> > + * Write Priority in Fixed/Limiter mode  */
> > +#define PRIORITY1_SHIFT	8
> > +#define PRIORITY_MASK		0x7
> > +
> > +#define PRIORITY_COMP_MARK	BIT(31)	/* Must set */
> > +
> > +#define IMX_NOC_MODE_FIXED	0
> > +#define IMX_NOC_MODE_LIMITER	1
> > +#define IMX_NOC_MODE_BYPASS	2
> > +#define IMX_NOC_MODE_REGULATOR	3
> > +
> > +#define IMX_NOC_PRIO_REG	0x8
> > +#define IMX_NOC_MODE_REG	0xC
> > +#define IMX_NOC_BANDWIDTH_REG	0x10
> > +#define IMX_NOC_SATURATION	0x14
> > +#define IMX_NOC_EXT_CTL_REG	0x18
> > +
> >  struct imx_icc_provider {
> >  	void __iomem *noc_base;
> >  	struct icc_provider provider;
> > @@ -44,6 +69,22 @@ struct imx_icc_node_desc {
> >  	const struct imx_icc_node_adj_desc *adj;  };
> >
> > +/*
> > + * struct imx_icc_noc_setting - Describe an interconnect node
> > setting
> > + * @ignore: indicate whether need apply this setting
> > + * @reg: register offset inside the NoC
> > + * @prio_level: priority level
> > + * @mode: functional mode
> > + * @ext_control: external input control  */ struct
> > +imx_icc_noc_setting {
> > +	bool ignore;
> 
> I don't like this ignore member. Can we get rid of this and make the "don't
> touch" a special mode, like IMX_NOC_MODE_UNCONFIGURED?

I'll address in V3.

Thanks,
Peng.

> 
> Other than those two nitpicks, the patch looks good.
> 
> Regards,
> Lucas
> 
> > +	u32 reg;
> > +	u32 prio_level;
> > +	u32 mode;
> > +	u32 ext_control;
> > +};
> > +
> >  #define DEFINE_BUS_INTERCONNECT(_name, _id, _adj, ...)
> 	\
> >  	{								\
> >  		.id = _id,						\
> > @@ -61,7 +102,8 @@ struct imx_icc_node_desc {
> >
> >  int imx_icc_register(struct platform_device *pdev,
> >  		     struct imx_icc_node_desc *nodes,
> > -		     int nodes_count);
> > +		     int nodes_count,
> > +		     struct imx_icc_noc_setting *noc_settings);
> >  int imx_icc_unregister(struct platform_device *pdev);
> >
> >  #endif /* __DRIVERS_INTERCONNECT_IMX_H */ diff --git
> > a/drivers/interconnect/imx/imx8mm.c
> > b/drivers/interconnect/imx/imx8mm.c
> > index 1083490bb391..ae797412db96 100644
> > --- a/drivers/interconnect/imx/imx8mm.c
> > +++ b/drivers/interconnect/imx/imx8mm.c
> > @@ -83,7 +83,7 @@ static struct imx_icc_node_desc nodes[] = {
> >
> >  static int imx8mm_icc_probe(struct platform_device *pdev)  {
> > -	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
> > +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
> >  }
> >
> >  static int imx8mm_icc_remove(struct platform_device *pdev) diff --git
> > a/drivers/interconnect/imx/imx8mn.c
> > b/drivers/interconnect/imx/imx8mn.c
> > index ad97e55fd4e5..1ce94c5bdd8c 100644
> > --- a/drivers/interconnect/imx/imx8mn.c
> > +++ b/drivers/interconnect/imx/imx8mn.c
> > @@ -72,7 +72,7 @@ static struct imx_icc_node_desc nodes[] = {
> >
> >  static int imx8mn_icc_probe(struct platform_device *pdev)  {
> > -	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
> > +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
> >  }
> >
> >  static int imx8mn_icc_remove(struct platform_device *pdev) diff --git
> > a/drivers/interconnect/imx/imx8mq.c
> > b/drivers/interconnect/imx/imx8mq.c
> > index d7768d3c6d8a..7f00a0511c6e 100644
> > --- a/drivers/interconnect/imx/imx8mq.c
> > +++ b/drivers/interconnect/imx/imx8mq.c
> > @@ -82,7 +82,7 @@ static struct imx_icc_node_desc nodes[] = {
> >
> >  static int imx8mq_icc_probe(struct platform_device *pdev)  {
> > -	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes));
> > +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL);
> >  }
> >
> >  static int imx8mq_icc_remove(struct platform_device *pdev)
> 


^ permalink raw reply	[flat|nested] 23+ messages in thread

* RE: [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp
  2022-06-29 15:17   ` Lucas Stach
@ 2022-07-02 12:51     ` Peng Fan
  0 siblings, 0 replies; 23+ messages in thread
From: Peng Fan @ 2022-07-02 12:51 UTC (permalink / raw)
  To: Lucas Stach, Peng Fan (OSS),
	djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, Abel Vesa, abailon, laurent.pinchart,
	marex, paul.elder, Markus.Niebel, aford173
  Cc: kernel, linux-pm, devicetree, linux-arm-kernel, linux-kernel,
	dl-linux-imx, abelvesa

> Subject: Re: [PATCH V2 9/9] interconnect: imx: Add platform driver for
> imx8mp
> 
> Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > Add a platform driver for the i.MX8MP SoC describing bus topology,
> > based on internal documentation.
> 
> This series is missing the compatible addition in drivers/devfreq/imx- bus.c
> to make the platform driver probe.
[Peng Fan] 
This is interconnect patchset, so I not include it.

I was thinking to directly take Abel's previous
https://lore.kernel.org/linux-arm-kernel/202201061641
50.3474048-1-abel.vesa@nxp.com/

Or update imx-bus driver.

But my next step.

Thanks,
Peng.
> 
> Other than that, looks good.
> 
> Regards,
> Lucas
> 
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  drivers/interconnect/imx/Kconfig  |   4 +
> >  drivers/interconnect/imx/Makefile |   2 +
> >  drivers/interconnect/imx/imx8mp.c | 259
> > ++++++++++++++++++++++++++++++
> >  3 files changed, 265 insertions(+)
> >  create mode 100644 drivers/interconnect/imx/imx8mp.c
> >
> > diff --git a/drivers/interconnect/imx/Kconfig
> > b/drivers/interconnect/imx/Kconfig
> > index be2928362bb7..c772552431f5 100644
> > --- a/drivers/interconnect/imx/Kconfig
> > +++ b/drivers/interconnect/imx/Kconfig
> > @@ -15,3 +15,7 @@ config INTERCONNECT_IMX8MN  config
> > INTERCONNECT_IMX8MQ
> >  	tristate "i.MX8MQ interconnect driver"
> >  	depends on INTERCONNECT_IMX
> > +
> > +config INTERCONNECT_IMX8MP
> > +	tristate "i.MX8MP interconnect driver"
> > +	depends on INTERCONNECT_IMX
> > diff --git a/drivers/interconnect/imx/Makefile
> > b/drivers/interconnect/imx/Makefile
> > index 21fd5233754f..16d256cdeab4 100644
> > --- a/drivers/interconnect/imx/Makefile
> > +++ b/drivers/interconnect/imx/Makefile
> > @@ -2,8 +2,10 @@ imx-interconnect-objs			:= imx.o
> >  imx8mm-interconnect-objs       		:= imx8mm.o
> >  imx8mq-interconnect-objs       		:= imx8mq.o
> >  imx8mn-interconnect-objs       		:= imx8mn.o
> > +imx8mp-interconnect-objs       		:= imx8mp.o
> >
> >  obj-$(CONFIG_INTERCONNECT_IMX)		+= imx-interconnect.o
> >  obj-$(CONFIG_INTERCONNECT_IMX8MM)	+= imx8mm-interconnect.o
> >  obj-$(CONFIG_INTERCONNECT_IMX8MQ)	+= imx8mq-interconnect.o
> >  obj-$(CONFIG_INTERCONNECT_IMX8MN)	+= imx8mn-interconnect.o
> > +obj-$(CONFIG_INTERCONNECT_IMX8MP)	+= imx8mp-interconnect.o
> > diff --git a/drivers/interconnect/imx/imx8mp.c
> > b/drivers/interconnect/imx/imx8mp.c
> > new file mode 100644
> > index 000000000000..2be2e9e2974e
> > --- /dev/null
> > +++ b/drivers/interconnect/imx/imx8mp.c
> > @@ -0,0 +1,259 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Interconnect framework driver for i.MX8MP SoC
> > + *
> > + * Copyright 2022 NXP
> > + * Peng Fan <peng.fan@nxp.com>
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/of_device.h>
> > +#include <linux/platform_device.h>
> > +#include <dt-bindings/interconnect/fsl,imx8mp.h>
> > +
> > +#include "imx.h"
> > +
> > +static const struct imx_icc_node_adj_desc imx8mp_noc_adj = {
> > +	.bw_mul = 1,
> > +	.bw_div = 16,
> > +	.main_noc = true,
> > +};
> > +
> > +static struct imx_icc_noc_setting noc_setting_nodes[] = {
> > +	[IMX8MP_ICM_MLMIX] = {
> > +		.reg = 0x180,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_DSP] = {
> > +		.reg = 0x200,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_SDMA2PER] = {
> > +		.reg = 0x280,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 4,
> > +	},
> > +	[IMX8MP_ICM_SDMA2BURST] = {
> > +		.reg = 0x300,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 4,
> > +	},
> > +	[IMX8MP_ICM_SDMA3PER] = {
> > +		.reg = 0x380,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 4,
> > +	},
> > +	[IMX8MP_ICM_SDMA3BURST] = {
> > +		.reg = 0x400,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 4,
> > +	},
> > +	[IMX8MP_ICM_EDMA] = {
> > +		.reg = 0x480,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 4,
> > +	},
> > +	[IMX8MP_ICM_GPU3D] = {
> > +		.reg = 0x500,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_GPU2D] = {
> > +		.reg = 0x580,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_HRV] = {
> > +		.reg = 0x600,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_LCDIF_HDMI] = {
> > +		.reg = 0x680,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_HDCP] = {
> > +		.reg = 0x700,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 5,
> > +	},
> > +	[IMX8MP_ICM_NOC_PCIE] = {
> > +		.reg = 0x780,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_USB1] = {
> > +		.reg = 0x800,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_USB2] = {
> > +		.reg = 0x880,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_PCIE] = {
> > +		.reg = 0x900,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_LCDIF_RD] = {
> > +		.reg = 0x980,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_LCDIF_WR] = {
> > +		.reg = 0xa00,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_ISI0] = {
> > +		.reg = 0xa80,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_ISI1] = {
> > +		.reg = 0xb00,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_ISI2] = {
> > +		.reg = 0xb80,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 2,
> > +		.ext_control = 1,
> > +	},
> > +	[IMX8MP_ICM_ISP0] = {
> > +		.reg = 0xc00,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 7,
> > +	},
> > +	[IMX8MP_ICM_ISP1] = {
> > +		.reg = 0xc80,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 7,
> > +	},
> > +	[IMX8MP_ICM_DWE] = {
> > +		.reg = 0xd00,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 7,
> > +	},
> > +	[IMX8MP_ICM_VPU_G1] = {
> > +		.reg = 0xd80,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_VPU_G2] = {
> > +		.reg = 0xe00,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICM_VPU_H1] = {
> > +		.reg = 0xe80,
> > +		.mode = IMX_NOC_MODE_FIXED,
> > +		.prio_level = 3,
> > +	},
> > +	[IMX8MP_ICN_MEDIA] = {
> > +		.ignore = true,
> > +	},
> > +	[IMX8MP_ICN_VIDEO] = {
> > +		.ignore = true,
> > +	},
> > +	[IMX8MP_ICN_AUDIO] = {
> > +		.ignore = true,
> > +	},
> > +	[IMX8MP_ICN_HDMI] = {
> > +		.ignore = true,
> > +	},
> > +	[IMX8MP_ICN_GPU] = {
> > +		.ignore = true,
> > +	},
> > +	[IMX8MP_ICN_HSIO] = {
> > +		.ignore = true,
> > +	},
> > +};
> > +
> > +/* Describe bus masters, slaves and connections between them */
> > +static struct imx_icc_node_desc nodes[] = {
> > +	DEFINE_BUS_INTERCONNECT("NOC", IMX8MP_ICN_NOC,
> &imx8mp_noc_adj,
> > +				IMX8MP_ICS_DRAM, IMX8MP_ICN_MAIN),
> > +
> > +	DEFINE_BUS_SLAVE("OCRAM", IMX8MP_ICS_OCRAM, NULL),
> > +	DEFINE_BUS_SLAVE("DRAM", IMX8MP_ICS_DRAM, NULL),
> > +	DEFINE_BUS_MASTER("A53", IMX8MP_ICM_A53,
> IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("SUPERMIX", IMX8MP_ICM_SUPERMIX,
> IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("GIC", IMX8MP_ICM_GIC,
> IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("MLMIX", IMX8MP_ICM_MLMIX,
> IMX8MP_ICN_NOC),
> > +
> > +	DEFINE_BUS_INTERCONNECT("NOC_AUDIO", IMX8MP_ICN_AUDIO,
> NULL, IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("DSP", IMX8MP_ICM_DSP,
> IMX8MP_ICN_AUDIO),
> > +	DEFINE_BUS_MASTER("SDMA2PER", IMX8MP_ICM_SDMA2PER,
> IMX8MP_ICN_AUDIO),
> > +	DEFINE_BUS_MASTER("SDMA2BURST", IMX8MP_ICM_SDMA2BURST,
> IMX8MP_ICN_AUDIO),
> > +	DEFINE_BUS_MASTER("SDMA3PER", IMX8MP_ICM_SDMA3PER,
> IMX8MP_ICN_AUDIO),
> > +	DEFINE_BUS_MASTER("SDMA3BURST", IMX8MP_ICM_SDMA3BURST,
> IMX8MP_ICN_AUDIO),
> > +	DEFINE_BUS_MASTER("EDMA", IMX8MP_ICM_EDMA,
> IMX8MP_ICN_AUDIO),
> > +
> > +	DEFINE_BUS_INTERCONNECT("NOC_GPU", IMX8MP_ICN_GPU, NULL,
> IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("GPU 2D", IMX8MP_ICM_GPU2D,
> IMX8MP_ICN_GPU),
> > +	DEFINE_BUS_MASTER("GPU 3D", IMX8MP_ICM_GPU3D,
> IMX8MP_ICN_GPU),
> > +
> > +	DEFINE_BUS_INTERCONNECT("NOC_HDMI", IMX8MP_ICN_HDMI,
> NULL, IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("HRV", IMX8MP_ICM_HRV,
> IMX8MP_ICN_HDMI),
> > +	DEFINE_BUS_MASTER("LCDIF_HDMI", IMX8MP_ICM_LCDIF_HDMI,
> IMX8MP_ICN_HDMI),
> > +	DEFINE_BUS_MASTER("HDCP", IMX8MP_ICM_HDCP,
> IMX8MP_ICN_HDMI),
> > +
> > +	DEFINE_BUS_INTERCONNECT("NOC_HSIO", IMX8MP_ICN_HSIO,
> NULL, IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("NOC_PCIE", IMX8MP_ICM_NOC_PCIE,
> IMX8MP_ICN_HSIO),
> > +	DEFINE_BUS_MASTER("USB1", IMX8MP_ICM_USB1,
> IMX8MP_ICN_HSIO),
> > +	DEFINE_BUS_MASTER("USB2", IMX8MP_ICM_USB2,
> IMX8MP_ICN_HSIO),
> > +	DEFINE_BUS_MASTER("PCIE", IMX8MP_ICM_PCIE,
> IMX8MP_ICN_HSIO),
> > +
> > +	DEFINE_BUS_INTERCONNECT("NOC_MEDIA", IMX8MP_ICN_MEDIA,
> NULL, IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("LCDIF_RD", IMX8MP_ICM_LCDIF_RD,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("LCDIF_WR", IMX8MP_ICM_LCDIF_WR,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("ISI0", IMX8MP_ICM_ISI0,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("ISI1", IMX8MP_ICM_ISI1,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("ISI2", IMX8MP_ICM_ISI2,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("ISP0", IMX8MP_ICM_ISP0,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("ISP1", IMX8MP_ICM_ISP1,
> IMX8MP_ICN_MEDIA),
> > +	DEFINE_BUS_MASTER("DWE", IMX8MP_ICM_DWE,
> IMX8MP_ICN_MEDIA),
> > +
> > +	DEFINE_BUS_INTERCONNECT("NOC_VIDEO", IMX8MP_ICN_VIDEO,
> NULL, IMX8MP_ICN_NOC),
> > +	DEFINE_BUS_MASTER("VPU G1", IMX8MP_ICM_VPU_G1,
> IMX8MP_ICN_VIDEO),
> > +	DEFINE_BUS_MASTER("VPU G2", IMX8MP_ICM_VPU_G2,
> IMX8MP_ICN_VIDEO),
> > +	DEFINE_BUS_MASTER("VPU H1", IMX8MP_ICM_VPU_H1,
> IMX8MP_ICN_VIDEO),
> > +	DEFINE_BUS_INTERCONNECT("PL301_MAIN", IMX8MP_ICN_MAIN,
> NULL,
> > +				IMX8MP_ICN_NOC, IMX8MP_ICS_OCRAM), };
> > +
> > +static int imx8mp_icc_probe(struct platform_device *pdev) {
> > +	return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes),
> > +noc_setting_nodes); }
> > +
> > +static int imx8mp_icc_remove(struct platform_device *pdev) {
> > +	return imx_icc_unregister(pdev);
> > +}
> > +
> > +static struct platform_driver imx8mp_icc_driver = {
> > +	.probe = imx8mp_icc_probe,
> > +	.remove = imx8mp_icc_remove,
> > +	.driver = {
> > +		.name = "imx8mp-interconnect",
> > +	},
> > +};
> > +
> > +module_platform_driver(imx8mp_icc_driver);
> > +MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
> MODULE_LICENSE("GPL
> > +v2"); MODULE_ALIAS("platform:imx8mp-interconnect");
> 


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider
  2022-06-29 17:32     ` Laurent Pinchart
@ 2022-07-03  8:43       ` Peng Fan (OSS)
  0 siblings, 0 replies; 23+ messages in thread
From: Peng Fan (OSS) @ 2022-07-03  8:43 UTC (permalink / raw)
  To: Laurent Pinchart, Lucas Stach
  Cc: djakov, shawnguo, s.hauer, festevam, robh+dt,
	krzysztof.kozlowski+dt, abel.vesa, abailon, marex, paul.elder,
	Markus.Niebel, aford173, kernel, linux-pm, devicetree,
	linux-arm-kernel, linux-kernel, linux-imx, abelvesa, Peng Fan



在 2022/6/30 1:32, Laurent Pinchart 写道:
> On Wed, Jun 29, 2022 at 05:08:58PM +0200, Lucas Stach wrote:
>> Am Donnerstag, dem 16.06.2022 um 15:33 +0800 schrieb Peng Fan (OSS):
>>> From: Peng Fan <peng.fan@nxp.com>
>>>
>>> The provider device is created using platform_device_register_data in
>>> imx-bus driver, which not has of_node. With of_node set, it will be
>>> easy to support QoS settings.
>>>
>> That's a bit dangerous, as sharing a of_node between two devices can
>> lead to some reference counting issues IIRC, but then I also don't see
>> a good way to do this any differently.
>>
>> Regards,
>> Lucas
>>
>>> Signed-off-by: Peng Fan <peng.fan@nxp.com>
>>> ---
>>>   drivers/interconnect/imx/imx.c | 1 +
>>>   1 file changed, 1 insertion(+)
>>>
>>> diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c
>>> index 1f16eedea21c..78557fe6da2c 100644
>>> --- a/drivers/interconnect/imx/imx.c
>>> +++ b/drivers/interconnect/imx/imx.c
>>> @@ -264,6 +264,7 @@ int imx_icc_register(struct platform_device *pdev,
>>>   	provider->xlate = of_icc_xlate_onecell;
>>>   	provider->data = data;
>>>   	provider->dev = dev->parent;
>>> +	provider->dev->of_node = dev->parent->of_node;
> Due to the previous line, provider->dev is equal to dev->parent, so
> doesn't this essentially do
>
> 	dev->parent->of_node = dev->parent->of_node;
>
> which is a no-op ?

hmm. Indeed, I just not able to recall the issue I met before. I'll drop 
this patch in V3.

Thanks,
Peng.

>
>>>   	platform_set_drvdata(pdev, imx_provider);
>>>   
>>>   	ret = icc_provider_add(provider);


^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2022-07-03  8:43 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-16  7:33 [PATCH V2 0/9] interconnect: support i.MX8MP Peng Fan (OSS)
2022-06-16  7:33 ` [PATCH V2 1/9] dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc Peng Fan (OSS)
2022-06-27 22:18   ` Rob Herring
2022-06-16  7:33 ` [PATCH V2 2/9] dt-bindings: interconnect: add fsl,imx8mp.h Peng Fan (OSS)
2022-06-27 22:19   ` Rob Herring
2022-06-16  7:33 ` [PATCH V2 3/9] interconnect: add device managed bulk API Peng Fan (OSS)
2022-06-16  7:33 ` [PATCH V2 4/9] interconnect: imx: fix max_node_id Peng Fan (OSS)
2022-06-16  7:33 ` [PATCH V2 5/9] interconnect: imx: set src node Peng Fan (OSS)
2022-06-16  7:33 ` [PATCH V2 6/9] interconnect: imx: introduce imx_icc_provider Peng Fan (OSS)
2022-06-16  7:33 ` [PATCH V2 7/9] interconnect: imx: set of_node for interconnect provider Peng Fan (OSS)
2022-06-29 15:08   ` Lucas Stach
2022-06-29 17:32     ` Laurent Pinchart
2022-07-03  8:43       ` Peng Fan (OSS)
2022-07-02 12:48     ` Peng Fan
2022-06-16  7:33 ` [PATCH V2 8/9] interconnect: imx: configure NoC mode/prioriry/ext_control Peng Fan (OSS)
2022-06-28 17:57   ` Georgi Djakov
2022-07-02 12:41     ` Peng Fan
2022-06-29 15:14   ` Lucas Stach
2022-07-02 12:50     ` Peng Fan
2022-06-16  7:33 ` [PATCH V2 9/9] interconnect: imx: Add platform driver for imx8mp Peng Fan (OSS)
2022-06-28 17:58   ` Georgi Djakov
2022-06-29 15:17   ` Lucas Stach
2022-07-02 12:51     ` Peng Fan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).