* [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).