EPSS on SA8775P has two instances which requires creation of two device
nodes with different compatible and device data because of unique
icc node id and name limitation in interconnect framework.
Add multidevice support to osm-l3 code to get unique node id from IDA
and node name is made unique by appending node address.
Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com>
---
drivers/interconnect/qcom/osm-l3.c | 85 ++++++++++++++++++++++--------
1 file changed, 63 insertions(+), 22 deletions(-)
diff --git a/drivers/interconnect/qcom/osm-l3.c b/drivers/interconnect/qcom/osm-l3.c
index 6a656ed44d49..a9405b7d251b 100644
--- a/drivers/interconnect/qcom/osm-l3.c
+++ b/drivers/interconnect/qcom/osm-l3.c
@@ -1,16 +1,19 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/args.h>
#include <linux/bitfield.h>
#include <linux/clk.h>
+#include <linux/idr.h>
#include <linux/interconnect-provider.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <dt-bindings/interconnect/qcom,osm-l3.h>
@@ -34,9 +37,14 @@
#define OSM_L3_MAX_LINKS 1
+#define OSM_L3_NODE_ID_START 10000
+#define OSM_NODE_NAME_SUFFIX_SIZE 10
+
#define to_osm_l3_provider(_provider) \
container_of(_provider, struct qcom_osm_l3_icc_provider, provider)
+static DEFINE_IDA(osm_l3_id);
+
struct qcom_osm_l3_icc_provider {
void __iomem *base;
unsigned int max_state;
@@ -55,46 +63,40 @@ struct qcom_osm_l3_icc_provider {
*/
struct qcom_osm_l3_node {
const char *name;
- u16 links[OSM_L3_MAX_LINKS];
+ const char *links[OSM_L3_MAX_LINKS];
u16 id;
u16 num_links;
u16 buswidth;
};
struct qcom_osm_l3_desc {
- const struct qcom_osm_l3_node * const *nodes;
+ struct qcom_osm_l3_node * const *nodes;
size_t num_nodes;
unsigned int lut_row_size;
unsigned int reg_freq_lut;
unsigned int reg_perf_state;
};
-enum {
- OSM_L3_MASTER_NODE = 10000,
- OSM_L3_SLAVE_NODE,
-};
-
-#define DEFINE_QNODE(_name, _id, _buswidth, ...) \
- static const struct qcom_osm_l3_node _name = { \
+#define DEFINE_QNODE(_name, _buswidth, ...) \
+ static struct qcom_osm_l3_node _name = { \
.name = #_name, \
- .id = _id, \
.buswidth = _buswidth, \
.num_links = COUNT_ARGS(__VA_ARGS__), \
- .links = { __VA_ARGS__ }, \
+ __VA_OPT__(.links = { #__VA_ARGS__ }) \
}
-DEFINE_QNODE(osm_l3_master, OSM_L3_MASTER_NODE, 16, OSM_L3_SLAVE_NODE);
-DEFINE_QNODE(osm_l3_slave, OSM_L3_SLAVE_NODE, 16);
+DEFINE_QNODE(osm_l3_master, 16, osm_l3_slave);
+DEFINE_QNODE(osm_l3_slave, 16);
-static const struct qcom_osm_l3_node * const osm_l3_nodes[] = {
+static struct qcom_osm_l3_node * const osm_l3_nodes[] = {
[MASTER_OSM_L3_APPS] = &osm_l3_master,
[SLAVE_OSM_L3] = &osm_l3_slave,
};
-DEFINE_QNODE(epss_l3_master, OSM_L3_MASTER_NODE, 32, OSM_L3_SLAVE_NODE);
-DEFINE_QNODE(epss_l3_slave, OSM_L3_SLAVE_NODE, 32);
+DEFINE_QNODE(epss_l3_master, 32, epss_l3_slave);
+DEFINE_QNODE(epss_l3_slave, 32);
-static const struct qcom_osm_l3_node * const epss_l3_nodes[] = {
+static struct qcom_osm_l3_node * const epss_l3_nodes[] = {
[MASTER_EPSS_L3_APPS] = &epss_l3_master,
[SLAVE_EPSS_L3_SHARED] = &epss_l3_slave,
};
@@ -123,6 +125,19 @@ static const struct qcom_osm_l3_desc epss_l3_l3_vote = {
.reg_perf_state = EPSS_REG_L3_VOTE,
};
+static u16 get_node_id_by_name(const char *node_name,
+ const struct qcom_osm_l3_desc *desc)
+{
+ struct qcom_osm_l3_node *const *nodes = desc->nodes;
+ int i;
+
+ for (i = 0; i < desc->num_nodes; i++) {
+ if (!strcmp(nodes[i]->name, node_name))
+ return nodes[i]->id;
+ }
+ return 0;
+}
+
static int qcom_osm_l3_set(struct icc_node *src, struct icc_node *dst)
{
struct qcom_osm_l3_icc_provider *qp;
@@ -164,10 +179,11 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
const struct qcom_osm_l3_desc *desc;
struct icc_onecell_data *data;
struct icc_provider *provider;
- const struct qcom_osm_l3_node * const *qnodes;
+ struct qcom_osm_l3_node * const *qnodes;
struct icc_node *node;
size_t num_nodes;
struct clk *clk;
+ u64 addr;
int ret;
clk = clk_get(&pdev->dev, "xo");
@@ -188,6 +204,10 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
if (!qp)
return -ENOMEM;
+ ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL);
+ if (ret)
+ return ret;
+
qp->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(qp->base))
return PTR_ERR(qp->base);
@@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
icc_provider_init(provider);
+ /* Allocate unique id for qnodes */
+ for (i = 0; i < num_nodes; i++)
+ qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL);
+
for (i = 0; i < num_nodes; i++) {
- size_t j;
+ char *node_name;
+ size_t j, len;
node = icc_node_create(qnodes[i]->id);
if (IS_ERR(node)) {
@@ -251,13 +276,29 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
goto err;
}
- node->name = qnodes[i]->name;
+ /* len = strlen(node->name) + @ + 8 (base-address) + NULL */
+ len = strlen(qnodes[i]->name) + OSM_NODE_NAME_SUFFIX_SIZE;
+ node_name = devm_kzalloc(&pdev->dev, len, GFP_KERNEL);
+ if (!node_name) {
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ snprintf(node_name, len, "%s@%08llx", qnodes[i]->name, addr);
+ node->name = node_name;
+
/* Cast away const and add it back in qcom_osm_l3_set() */
node->data = (void *)qnodes[i];
icc_node_add(node, provider);
- for (j = 0; j < qnodes[i]->num_links; j++)
- icc_link_create(node, qnodes[i]->links[j]);
+ for (j = 0; j < qnodes[i]->num_links; j++) {
+ u16 link_node_id = get_node_id_by_name(qnodes[i]->links[j], desc);
+
+ if (link_node_id)
+ icc_link_create(node, link_node_id);
+ else
+ goto err;
+ }
data->nodes[i] = node;
}
--
2.39.2
On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: > EPSS on SA8775P has two instances which requires creation of two device > nodes with different compatible and device data because of unique > icc node id and name limitation in interconnect framework. > Add multidevice support to osm-l3 code to get unique node id from IDA > and node name is made unique by appending node address. > > Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> > --- [...] > + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); > + if (ret) > + return ret; > + > qp->base = devm_platform_ioremap_resource(pdev, 0); > if (IS_ERR(qp->base)) > return PTR_ERR(qp->base); > @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) > > icc_provider_init(provider); > > + /* Allocate unique id for qnodes */ > + for (i = 0; i < num_nodes; i++) > + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); As I've said in my previous emails, this is a framework-level problem. Up until now we've simply silently ignored the possibility of an interconnect provider having more than one instance, as conveniently most previous SoCs had a bunch of distinct bus masters. Currently, debugfs-client.c relies on the node names being unique. Keeping them as such is also useful for having a sane sysfs/debugfs interface. But it's not always feasible, and a hierarchical approach (like in pmdomain) may be a better fit. Then, node->id is used for creating links, and we unfortunately cannot assume that both src and dst are within the same provider. I'm not a fan of these IDs being hardcoded, but there are some drivers that rely on that, which itself is also a bit unfortunate.. If Mike (who introduced debugfs-client and is probably the main user) doesn't object to a small ABI break (which is "fine" with a debugfs driver that requires editing the source code to be compiled), we could add a property within icc_provider like `bool dynamic_ids` and have an ICC-global IDA that would take care of any conflicts. Provider drivers whose consumers don't already rely on programmatical use of hardcoded IDs *and* don't have cross-provider links could then enable that flag and have the node IDs and names set like you did in this patch. This also sounds very useful for icc-clk. Konrad
On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: > On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: > > EPSS on SA8775P has two instances which requires creation of two device > > nodes with different compatible and device data because of unique > > icc node id and name limitation in interconnect framework. > > Add multidevice support to osm-l3 code to get unique node id from IDA > > and node name is made unique by appending node address. > > > > Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> > > --- > > [...] > > > + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); > > + if (ret) > > + return ret; > > + > > qp->base = devm_platform_ioremap_resource(pdev, 0); > > if (IS_ERR(qp->base)) > > return PTR_ERR(qp->base); > > @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) > > > > icc_provider_init(provider); > > > > + /* Allocate unique id for qnodes */ > > + for (i = 0; i < num_nodes; i++) > > + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); > > As I've said in my previous emails, this is a framework-level problem. > > Up until now we've simply silently ignored the possibility of an > interconnect provider having more than one instance, as conveniently > most previous SoCs had a bunch of distinct bus masters. > > Currently, debugfs-client.c relies on the node names being unique. > Keeping them as such is also useful for having a sane sysfs/debugfs > interface. But it's not always feasible, and a hierarchical approach > (like in pmdomain) may be a better fit. > > Then, node->id is used for creating links, and we unfortunately cannot > assume that both src and dst are within the same provider. > I'm not a fan of these IDs being hardcoded, but there are some drivers > that rely on that, which itself is also a bit unfortunate.. > > > If Mike (who introduced debugfs-client and is probably the main user) > doesn't object to a small ABI break (which is "fine" with a debugfs > driver that requires editing the source code to be compiled), we could > add a property within icc_provider like `bool dynamic_ids` and have an > ICC-global IDA that would take care of any conflicts. Frankly speaking, I think this just delays the inevitable. We have been there with GPIOs and with some other suppliers. In my opinion the ICC subsystem needs to be refactored in order to support linking based on the supplier (fwnode?) + offset_id, but that's a huuuge rework. > Provider drivers whose consumers don't already rely on programmatical > use of hardcoded IDs *and* don't have cross-provider links could then > enable that flag and have the node IDs and names set like you did in > this patch. This also sounds very useful for icc-clk. -- With best wishes Dmitry
On 30.11.2024 4:09 PM, Dmitry Baryshkov wrote: > On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: >> On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: >>> EPSS on SA8775P has two instances which requires creation of two device >>> nodes with different compatible and device data because of unique >>> icc node id and name limitation in interconnect framework. >>> Add multidevice support to osm-l3 code to get unique node id from IDA >>> and node name is made unique by appending node address. >>> >>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> >>> --- >> >> [...] >> >>> + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); >>> + if (ret) >>> + return ret; >>> + >>> qp->base = devm_platform_ioremap_resource(pdev, 0); >>> if (IS_ERR(qp->base)) >>> return PTR_ERR(qp->base); >>> @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) >>> >>> icc_provider_init(provider); >>> >>> + /* Allocate unique id for qnodes */ >>> + for (i = 0; i < num_nodes; i++) >>> + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); >> >> As I've said in my previous emails, this is a framework-level problem. >> >> Up until now we've simply silently ignored the possibility of an >> interconnect provider having more than one instance, as conveniently >> most previous SoCs had a bunch of distinct bus masters. >> >> Currently, debugfs-client.c relies on the node names being unique. >> Keeping them as such is also useful for having a sane sysfs/debugfs >> interface. But it's not always feasible, and a hierarchical approach >> (like in pmdomain) may be a better fit. >> >> Then, node->id is used for creating links, and we unfortunately cannot >> assume that both src and dst are within the same provider. >> I'm not a fan of these IDs being hardcoded, but there are some drivers >> that rely on that, which itself is also a bit unfortunate.. >> >> >> If Mike (who introduced debugfs-client and is probably the main user) >> doesn't object to a small ABI break (which is "fine" with a debugfs >> driver that requires editing the source code to be compiled), we could >> add a property within icc_provider like `bool dynamic_ids` and have an >> ICC-global IDA that would take care of any conflicts. > > Frankly speaking, I think this just delays the inevitable. We have been > there with GPIOs and with some other suppliers. In my opinion the ICC > subsystem needs to be refactored in order to support linking based on > the supplier (fwnode?) + offset_id, but that's a huuuge rework. I thought about this too, but ended up not including it in the email.. I think this will be more difficult with ICC, as tons of circular dependencies are inevitable by design and we'd essentially have to either provide placeholder nodes (like it's the case today) or probe only parts of a device, recursively, to make sure all links can be created Konrad >> Provider drivers whose consumers don't already rely on programmatical >> use of hardcoded IDs *and* don't have cross-provider links could then >> enable that flag and have the node IDs and names set like you did in >> this patch. This also sounds very useful for icc-clk. >
On Sat, Nov 30, 2024 at 04:12:49PM +0100, Konrad Dybcio wrote: > On 30.11.2024 4:09 PM, Dmitry Baryshkov wrote: > > On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: > >> On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: > >>> EPSS on SA8775P has two instances which requires creation of two device > >>> nodes with different compatible and device data because of unique > >>> icc node id and name limitation in interconnect framework. > >>> Add multidevice support to osm-l3 code to get unique node id from IDA > >>> and node name is made unique by appending node address. > >>> > >>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> > >>> --- > >> > >> [...] > >> > >>> + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); > >>> + if (ret) > >>> + return ret; > >>> + > >>> qp->base = devm_platform_ioremap_resource(pdev, 0); > >>> if (IS_ERR(qp->base)) > >>> return PTR_ERR(qp->base); > >>> @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) > >>> > >>> icc_provider_init(provider); > >>> > >>> + /* Allocate unique id for qnodes */ > >>> + for (i = 0; i < num_nodes; i++) > >>> + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); > >> > >> As I've said in my previous emails, this is a framework-level problem. > >> > >> Up until now we've simply silently ignored the possibility of an > >> interconnect provider having more than one instance, as conveniently > >> most previous SoCs had a bunch of distinct bus masters. > >> > >> Currently, debugfs-client.c relies on the node names being unique. > >> Keeping them as such is also useful for having a sane sysfs/debugfs > >> interface. But it's not always feasible, and a hierarchical approach > >> (like in pmdomain) may be a better fit. > >> > >> Then, node->id is used for creating links, and we unfortunately cannot > >> assume that both src and dst are within the same provider. > >> I'm not a fan of these IDs being hardcoded, but there are some drivers > >> that rely on that, which itself is also a bit unfortunate.. > >> > >> > >> If Mike (who introduced debugfs-client and is probably the main user) > >> doesn't object to a small ABI break (which is "fine" with a debugfs > >> driver that requires editing the source code to be compiled), we could > >> add a property within icc_provider like `bool dynamic_ids` and have an > >> ICC-global IDA that would take care of any conflicts. > > > > Frankly speaking, I think this just delays the inevitable. We have been > > there with GPIOs and with some other suppliers. In my opinion the ICC > > subsystem needs to be refactored in order to support linking based on > > the supplier (fwnode?) + offset_id, but that's a huuuge rework. > > I thought about this too, but ended up not including it in the email.. > > I think this will be more difficult with ICC, as tons of circular > dependencies are inevitable by design and we'd essentially have to > either provide placeholder nodes (like it's the case today) or probe > only parts of a device, recursively, to make sure all links can be > created Or just allow probing, but then fail path creation. It will be a redesign, but I think it is inevitable in the end. > > Konrad > > >> Provider drivers whose consumers don't already rely on programmatical > >> use of hardcoded IDs *and* don't have cross-provider links could then > >> enable that flag and have the node IDs and names set like you did in > >> this patch. This also sounds very useful for icc-clk. > > -- With best wishes Dmitry
On 11/30/2024 9:02 PM, Dmitry Baryshkov wrote: > On Sat, Nov 30, 2024 at 04:12:49PM +0100, Konrad Dybcio wrote: >> On 30.11.2024 4:09 PM, Dmitry Baryshkov wrote: >>> On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: >>>> On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: >>>>> EPSS on SA8775P has two instances which requires creation of two device >>>>> nodes with different compatible and device data because of unique >>>>> icc node id and name limitation in interconnect framework. >>>>> Add multidevice support to osm-l3 code to get unique node id from IDA >>>>> and node name is made unique by appending node address. >>>>> >>>>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> >>>>> --- >>>> >>>> [...] >>>> >>>>> + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); >>>>> + if (ret) >>>>> + return ret; >>>>> + >>>>> qp->base = devm_platform_ioremap_resource(pdev, 0); >>>>> if (IS_ERR(qp->base)) >>>>> return PTR_ERR(qp->base); >>>>> @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) >>>>> >>>>> icc_provider_init(provider); >>>>> >>>>> + /* Allocate unique id for qnodes */ >>>>> + for (i = 0; i < num_nodes; i++) >>>>> + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); >>>> >>>> As I've said in my previous emails, this is a framework-level problem. >>>> >>>> Up until now we've simply silently ignored the possibility of an >>>> interconnect provider having more than one instance, as conveniently >>>> most previous SoCs had a bunch of distinct bus masters. >>>> >>>> Currently, debugfs-client.c relies on the node names being unique. >>>> Keeping them as such is also useful for having a sane sysfs/debugfs >>>> interface. But it's not always feasible, and a hierarchical approach >>>> (like in pmdomain) may be a better fit. >>>> >>>> Then, node->id is used for creating links, and we unfortunately cannot >>>> assume that both src and dst are within the same provider. >>>> I'm not a fan of these IDs being hardcoded, but there are some drivers >>>> that rely on that, which itself is also a bit unfortunate.. >>>> >>>> >>>> If Mike (who introduced debugfs-client and is probably the main user) >>>> doesn't object to a small ABI break (which is "fine" with a debugfs >>>> driver that requires editing the source code to be compiled), we could >>>> add a property within icc_provider like `bool dynamic_ids` and have an >>>> ICC-global IDA that would take care of any conflicts. >>> >>> Frankly speaking, I think this just delays the inevitable. We have been >>> there with GPIOs and with some other suppliers. In my opinion the ICC >>> subsystem needs to be refactored in order to support linking based on >>> the supplier (fwnode?) + offset_id, but that's a huuuge rework. >> >> I thought about this too, but ended up not including it in the email.. >> >> I think this will be more difficult with ICC, as tons of circular >> dependencies are inevitable by design and we'd essentially have to >> either provide placeholder nodes (like it's the case today) or probe >> only parts of a device, recursively, to make sure all links can be >> created > > Or just allow probing, but then fail path creation. It will be a > redesign, but I think it is inevitable in the end. > There are no two instances of l3 or NoC on any SoC except qcs9100 and qcs8300. I dont expect any new SoC as well. As second instance is needed only on qcs9100 and qcs8300, I am keeping the patch (patchset v6) as is and limit the dynamic id addition to l3 provider only. >> >> Konrad >> >>>> Provider drivers whose consumers don't already rely on programmatical >>>> use of hardcoded IDs *and* don't have cross-provider links could then >>>> enable that flag and have the node IDs and names set like you did in >>>> this patch. This also sounds very useful for icc-clk. >>> >
On Thu, Dec 26, 2024 at 09:43:20PM +0530, Raviteja Laggyshetty wrote: > > > On 11/30/2024 9:02 PM, Dmitry Baryshkov wrote: > > On Sat, Nov 30, 2024 at 04:12:49PM +0100, Konrad Dybcio wrote: > >> On 30.11.2024 4:09 PM, Dmitry Baryshkov wrote: > >>> On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: > >>>> On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: > >>>>> EPSS on SA8775P has two instances which requires creation of two device > >>>>> nodes with different compatible and device data because of unique > >>>>> icc node id and name limitation in interconnect framework. > >>>>> Add multidevice support to osm-l3 code to get unique node id from IDA > >>>>> and node name is made unique by appending node address. > >>>>> > >>>>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> > >>>>> --- > >>>> > >>>> [...] > >>>> > >>>>> + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); > >>>>> + if (ret) > >>>>> + return ret; > >>>>> + > >>>>> qp->base = devm_platform_ioremap_resource(pdev, 0); > >>>>> if (IS_ERR(qp->base)) > >>>>> return PTR_ERR(qp->base); > >>>>> @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) > >>>>> > >>>>> icc_provider_init(provider); > >>>>> > >>>>> + /* Allocate unique id for qnodes */ > >>>>> + for (i = 0; i < num_nodes; i++) > >>>>> + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); > >>>> > >>>> As I've said in my previous emails, this is a framework-level problem. > >>>> > >>>> Up until now we've simply silently ignored the possibility of an > >>>> interconnect provider having more than one instance, as conveniently > >>>> most previous SoCs had a bunch of distinct bus masters. > >>>> > >>>> Currently, debugfs-client.c relies on the node names being unique. > >>>> Keeping them as such is also useful for having a sane sysfs/debugfs > >>>> interface. But it's not always feasible, and a hierarchical approach > >>>> (like in pmdomain) may be a better fit. > >>>> > >>>> Then, node->id is used for creating links, and we unfortunately cannot > >>>> assume that both src and dst are within the same provider. > >>>> I'm not a fan of these IDs being hardcoded, but there are some drivers > >>>> that rely on that, which itself is also a bit unfortunate.. > >>>> > >>>> > >>>> If Mike (who introduced debugfs-client and is probably the main user) > >>>> doesn't object to a small ABI break (which is "fine" with a debugfs > >>>> driver that requires editing the source code to be compiled), we could > >>>> add a property within icc_provider like `bool dynamic_ids` and have an > >>>> ICC-global IDA that would take care of any conflicts. > >>> > >>> Frankly speaking, I think this just delays the inevitable. We have been > >>> there with GPIOs and with some other suppliers. In my opinion the ICC > >>> subsystem needs to be refactored in order to support linking based on > >>> the supplier (fwnode?) + offset_id, but that's a huuuge rework. > >> > >> I thought about this too, but ended up not including it in the email.. > >> > >> I think this will be more difficult with ICC, as tons of circular > >> dependencies are inevitable by design and we'd essentially have to > >> either provide placeholder nodes (like it's the case today) or probe > >> only parts of a device, recursively, to make sure all links can be > >> created > > > > Or just allow probing, but then fail path creation. It will be a > > redesign, but I think it is inevitable in the end. > > > > There are no two instances of l3 or NoC on any SoC except qcs9100 and > qcs8300. I dont expect any new SoC as well. > As second instance is needed only on qcs9100 and qcs8300, I am keeping > the patch (patchset v6) as is and limit the dynamic id addition to l3 > provider only. As you could have noticed, it was suggested to change ICC subsystem API to allow the dynamic IDs. This isssue is not limited to just EPSS L3 driver. So we were discussing if you or your colleagues could sign up for updating the interconnect subsystem to use node+arguments approach instead of using a global static ID list. > > >> > >> Konrad > >> > >>>> Provider drivers whose consumers don't already rely on programmatical > >>>> use of hardcoded IDs *and* don't have cross-provider links could then > >>>> enable that flag and have the node IDs and names set like you did in > >>>> this patch. This also sounds very useful for icc-clk. > >>> > > > -- With best wishes Dmitry
On 12/29/2024 6:53 AM, Dmitry Baryshkov wrote: > On Thu, Dec 26, 2024 at 09:43:20PM +0530, Raviteja Laggyshetty wrote: >> >> >> On 11/30/2024 9:02 PM, Dmitry Baryshkov wrote: >>> On Sat, Nov 30, 2024 at 04:12:49PM +0100, Konrad Dybcio wrote: >>>> On 30.11.2024 4:09 PM, Dmitry Baryshkov wrote: >>>>> On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: >>>>>> On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: >>>>>>> EPSS on SA8775P has two instances which requires creation of two device >>>>>>> nodes with different compatible and device data because of unique >>>>>>> icc node id and name limitation in interconnect framework. >>>>>>> Add multidevice support to osm-l3 code to get unique node id from IDA >>>>>>> and node name is made unique by appending node address. >>>>>>> >>>>>>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> >>>>>>> --- >>>>>> >>>>>> [...] >>>>>> >>>>>>> + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); >>>>>>> + if (ret) >>>>>>> + return ret; >>>>>>> + >>>>>>> qp->base = devm_platform_ioremap_resource(pdev, 0); >>>>>>> if (IS_ERR(qp->base)) >>>>>>> return PTR_ERR(qp->base); >>>>>>> @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) >>>>>>> >>>>>>> icc_provider_init(provider); >>>>>>> >>>>>>> + /* Allocate unique id for qnodes */ >>>>>>> + for (i = 0; i < num_nodes; i++) >>>>>>> + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); >>>>>> >>>>>> As I've said in my previous emails, this is a framework-level problem. >>>>>> >>>>>> Up until now we've simply silently ignored the possibility of an >>>>>> interconnect provider having more than one instance, as conveniently >>>>>> most previous SoCs had a bunch of distinct bus masters. >>>>>> >>>>>> Currently, debugfs-client.c relies on the node names being unique. >>>>>> Keeping them as such is also useful for having a sane sysfs/debugfs >>>>>> interface. But it's not always feasible, and a hierarchical approach >>>>>> (like in pmdomain) may be a better fit. >>>>>> >>>>>> Then, node->id is used for creating links, and we unfortunately cannot >>>>>> assume that both src and dst are within the same provider. >>>>>> I'm not a fan of these IDs being hardcoded, but there are some drivers >>>>>> that rely on that, which itself is also a bit unfortunate.. >>>>>> >>>>>> >>>>>> If Mike (who introduced debugfs-client and is probably the main user) >>>>>> doesn't object to a small ABI break (which is "fine" with a debugfs >>>>>> driver that requires editing the source code to be compiled), we could >>>>>> add a property within icc_provider like `bool dynamic_ids` and have an >>>>>> ICC-global IDA that would take care of any conflicts. >>>>> >>>>> Frankly speaking, I think this just delays the inevitable. We have been >>>>> there with GPIOs and with some other suppliers. In my opinion the ICC >>>>> subsystem needs to be refactored in order to support linking based on >>>>> the supplier (fwnode?) + offset_id, but that's a huuuge rework. >>>> >>>> I thought about this too, but ended up not including it in the email.. >>>> >>>> I think this will be more difficult with ICC, as tons of circular >>>> dependencies are inevitable by design and we'd essentially have to >>>> either provide placeholder nodes (like it's the case today) or probe >>>> only parts of a device, recursively, to make sure all links can be >>>> created >>> >>> Or just allow probing, but then fail path creation. It will be a >>> redesign, but I think it is inevitable in the end. >>> >> >> There are no two instances of l3 or NoC on any SoC except qcs9100 and >> qcs8300. I dont expect any new SoC as well. >> As second instance is needed only on qcs9100 and qcs8300, I am keeping >> the patch (patchset v6) as is and limit the dynamic id addition to l3 >> provider only. > > As you could have noticed, it was suggested to change ICC subsystem API > to allow the dynamic IDs. This isssue is not limited to just EPSS L3 > driver. So we were discussing if you or your colleagues could sign up > for updating the interconnect subsystem to use node+arguments approach > instead of using a global static ID list. > This problem is limited to EPSS L3 only, NoCs are not having multi instances and don't expect this problem to arise in new chipsets. we have multi instances of L3 only on qcs9100 and qcs8300. we can limit the dynamic ID creation for L3 provider. If we update the interconnect framework also, we will have to limit it to provider only. Thanks, Raviteja >> >>>> >>>> Konrad >>>> >>>>>> Provider drivers whose consumers don't already rely on programmatical >>>>>> use of hardcoded IDs *and* don't have cross-provider links could then >>>>>> enable that flag and have the node IDs and names set like you did in >>>>>> this patch. This also sounds very useful for icc-clk. >>>>> >>> >> >
On Fri, Jan 03, 2025 at 07:37:07PM +0530, Raviteja Laggyshetty wrote: > > > On 12/29/2024 6:53 AM, Dmitry Baryshkov wrote: > > On Thu, Dec 26, 2024 at 09:43:20PM +0530, Raviteja Laggyshetty wrote: > >> > >> > >> On 11/30/2024 9:02 PM, Dmitry Baryshkov wrote: > >>> On Sat, Nov 30, 2024 at 04:12:49PM +0100, Konrad Dybcio wrote: > >>>> On 30.11.2024 4:09 PM, Dmitry Baryshkov wrote: > >>>>> On Sat, Nov 30, 2024 at 01:49:56PM +0100, Konrad Dybcio wrote: > >>>>>> On 25.11.2024 6:45 PM, Raviteja Laggyshetty wrote: > >>>>>>> EPSS on SA8775P has two instances which requires creation of two device > >>>>>>> nodes with different compatible and device data because of unique > >>>>>>> icc node id and name limitation in interconnect framework. > >>>>>>> Add multidevice support to osm-l3 code to get unique node id from IDA > >>>>>>> and node name is made unique by appending node address. > >>>>>>> > >>>>>>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@quicinc.com> > >>>>>>> --- > >>>>>> > >>>>>> [...] > >>>>>> > >>>>>>> + ret = of_property_read_reg(pdev->dev.of_node, 0, &addr, NULL); > >>>>>>> + if (ret) > >>>>>>> + return ret; > >>>>>>> + > >>>>>>> qp->base = devm_platform_ioremap_resource(pdev, 0); > >>>>>>> if (IS_ERR(qp->base)) > >>>>>>> return PTR_ERR(qp->base); > >>>>>>> @@ -242,8 +262,13 @@ static int qcom_osm_l3_probe(struct platform_device *pdev) > >>>>>>> > >>>>>>> icc_provider_init(provider); > >>>>>>> > >>>>>>> + /* Allocate unique id for qnodes */ > >>>>>>> + for (i = 0; i < num_nodes; i++) > >>>>>>> + qnodes[i]->id = ida_alloc_min(&osm_l3_id, OSM_L3_NODE_ID_START, GFP_KERNEL); > >>>>>> > >>>>>> As I've said in my previous emails, this is a framework-level problem. > >>>>>> > >>>>>> Up until now we've simply silently ignored the possibility of an > >>>>>> interconnect provider having more than one instance, as conveniently > >>>>>> most previous SoCs had a bunch of distinct bus masters. > >>>>>> > >>>>>> Currently, debugfs-client.c relies on the node names being unique. > >>>>>> Keeping them as such is also useful for having a sane sysfs/debugfs > >>>>>> interface. But it's not always feasible, and a hierarchical approach > >>>>>> (like in pmdomain) may be a better fit. > >>>>>> > >>>>>> Then, node->id is used for creating links, and we unfortunately cannot > >>>>>> assume that both src and dst are within the same provider. > >>>>>> I'm not a fan of these IDs being hardcoded, but there are some drivers > >>>>>> that rely on that, which itself is also a bit unfortunate.. > >>>>>> > >>>>>> > >>>>>> If Mike (who introduced debugfs-client and is probably the main user) > >>>>>> doesn't object to a small ABI break (which is "fine" with a debugfs > >>>>>> driver that requires editing the source code to be compiled), we could > >>>>>> add a property within icc_provider like `bool dynamic_ids` and have an > >>>>>> ICC-global IDA that would take care of any conflicts. > >>>>> > >>>>> Frankly speaking, I think this just delays the inevitable. We have been > >>>>> there with GPIOs and with some other suppliers. In my opinion the ICC > >>>>> subsystem needs to be refactored in order to support linking based on > >>>>> the supplier (fwnode?) + offset_id, but that's a huuuge rework. > >>>> > >>>> I thought about this too, but ended up not including it in the email.. > >>>> > >>>> I think this will be more difficult with ICC, as tons of circular > >>>> dependencies are inevitable by design and we'd essentially have to > >>>> either provide placeholder nodes (like it's the case today) or probe > >>>> only parts of a device, recursively, to make sure all links can be > >>>> created > >>> > >>> Or just allow probing, but then fail path creation. It will be a > >>> redesign, but I think it is inevitable in the end. > >>> > >> > >> There are no two instances of l3 or NoC on any SoC except qcs9100 and > >> qcs8300. I dont expect any new SoC as well. > >> As second instance is needed only on qcs9100 and qcs8300, I am keeping > >> the patch (patchset v6) as is and limit the dynamic id addition to l3 > >> provider only. > > > > As you could have noticed, it was suggested to change ICC subsystem API > > to allow the dynamic IDs. This isssue is not limited to just EPSS L3 > > driver. So we were discussing if you or your colleagues could sign up > > for updating the interconnect subsystem to use node+arguments approach > > instead of using a global static ID list. > > > This problem is limited to EPSS L3 only, NoCs are not having > multi instances and don't expect this problem to arise in new > chipsets. we have multi instances of L3 only on qcs9100 and > qcs8300. we can limit the dynamic ID creation for L3 provider. > If we update the interconnect framework also, we will have to > limit it to provider only. This problem is not limited to the EPSS L3 only. You just see one side of a problem. The icc_clk framework has a similar issue. Each time we register ICC node, we have to provide globally unique ID. This works in simple cases, but if the platform is slightly more strange, things start to be complicated. > > Thanks, > Raviteja > >> > >>>> > >>>> Konrad > >>>> > >>>>>> Provider drivers whose consumers don't already rely on programmatical > >>>>>> use of hardcoded IDs *and* don't have cross-provider links could then > >>>>>> enable that flag and have the node IDs and names set like you did in > >>>>>> this patch. This also sounds very useful for icc-clk. > >>>>> > >>> > >> > > > -- With best wishes Dmitry
© 2016 - 2026 Red Hat, Inc.