public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
@ 2025-11-12 16:58 Aswin Murugan
  2025-12-17 11:00 ` Varadarajan Narayanan
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Aswin Murugan @ 2025-11-12 16:58 UTC (permalink / raw)
  To: casey.connolly, neil.armstrong, sumit.garg, trini, aswin.murugan,
	u-boot-qcom, u-boot

The SMEM driver was failing to resolve memory regions on some boards
because `dev_of_offset()` + `fdtdec_lookup_phandle()` did not yield a
valid DT node. Modernize the code to use driver-model/ofnode accessors
and make the probe robust for both DT styles (direct `reg` vs
`memory-region` phandle).

- qcom_smem_map_memory():
  * Drop fdtdec path; use dev_read_phandle_with_args() +
    ofnode_read_resource().
  * Use dev_read_phandle_with_args() +
    fnode_read_resource().

- qcom_smem_probe():
  * Try dev_read_addr_size() first (map via <reg>), else fall back to
    qcom_smem_map_memory() with "memory-region".
  * Check "qcom,rpm-msg-ram" presence to add second region.

- Additionally, SMEM_HOST_COUNT is increased to support newer SMEM
  versions that include more remote processors. This avoids failures
  during processor ID checks.

Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
---
 drivers/smem/msm_smem.c | 56 +++++++++++++++++++++++++++++------------
 1 file changed, 40 insertions(+), 16 deletions(-)

diff --git a/drivers/smem/msm_smem.c b/drivers/smem/msm_smem.c
index ccd145f9afb..b6b92d3530d 100644
--- a/drivers/smem/msm_smem.c
+++ b/drivers/smem/msm_smem.c
@@ -88,7 +88,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #define SMEM_GLOBAL_HOST	0xfffe
 
 /* Max number of processors/hosts in a system */
-#define SMEM_HOST_COUNT		10
+#define SMEM_HOST_COUNT		25
 
 /**
  * struct smem_proc_comm - proc_comm communication struct (legacy)
@@ -821,23 +821,34 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem,
 static int qcom_smem_map_memory(struct qcom_smem *smem, struct udevice *dev,
 				const char *name, int i)
 {
-	struct fdt_resource r;
 	int ret;
-	int node = dev_of_offset(dev);
+	struct ofnode_phandle_args args;
+	struct resource r;
 
-	ret = fdtdec_lookup_phandle(gd->fdt_blob, node, name);
-	if (ret < 0) {
-		dev_err(dev, "No %s specified\n", name);
+	if (!dev_read_prop(dev, name, NULL)) {
+		dev_err(dev, "%s prop not found\n", name);
 		return -EINVAL;
 	}
 
-	ret = fdt_get_resource(gd->fdt_blob, ret, "reg", 0, &r);
-	if (ret)
-		return ret;
+	ret = dev_read_phandle_with_args(dev, name, NULL, 0, 0, &args);
+	if (ret) {
+		dev_err(dev, "%s phandle read failed\n", name);
+		return -EINVAL;
+	}
 
+	if (!ofnode_valid(args.node)) {
+		dev_err(dev, "Invalid node from phandle args\n");
+		return -EINVAL;
+	}
+
+	ret = ofnode_read_resource(args.node, 0, &r);
+	if (ret) {
+		dev_err(dev, "Can't get mmap base address(%d)\n", ret);
+		return ret;
+	}
 	smem->regions[i].aux_base = (u32)r.start;
-	smem->regions[i].size = fdt_resource_size(&r);
-	smem->regions[i].virt_base = devm_ioremap(dev, r.start, fdt_resource_size(&r));
+	smem->regions[i].size = resource_size(&r);
+	smem->regions[i].virt_base = devm_ioremap(dev, r.start, resource_size(&r));
 	if (!smem->regions[i].virt_base)
 		return -ENOMEM;
 
@@ -852,10 +863,14 @@ static int qcom_smem_probe(struct udevice *dev)
 	int num_regions;
 	u32 version;
 	int ret;
-	int node = dev_of_offset(dev);
+	fdt_addr_t addr;
+	fdt_size_t size;
+
+	if (__smem)
+		return 0;
 
 	num_regions = 1;
-	if (fdtdec_lookup_phandle(gd->fdt_blob, node, "qcomrpm-msg-ram") >= 0)
+	if (dev_read_prop(dev, "qcom,rpm-msg-ram", NULL))
 		num_regions++;
 
 	array_size = num_regions * sizeof(struct smem_region);
@@ -866,9 +881,18 @@ static int qcom_smem_probe(struct udevice *dev)
 	smem->dev = dev;
 	smem->num_regions = num_regions;
 
-	ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
-	if (ret)
-		return ret;
+	addr = dev_read_addr_size(dev, &size);
+	if (addr == FDT_ADDR_T_NONE) {
+		ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
+		if (ret)
+			return ret;
+	} else {
+		smem->regions[0].aux_base = (u32)addr;
+		smem->regions[0].size = size;
+		smem->regions[0].virt_base = devm_ioremap(dev, addr, size);
+		if (!smem->regions[0].virt_base)
+			return -ENOMEM;
+	}
 
 	if (num_regions > 1) {
 		ret = qcom_smem_map_memory(smem, dev,
-- 
2.34.1


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

* Re: [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
  2025-11-12 16:58 [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count Aswin Murugan
@ 2025-12-17 11:00 ` Varadarajan Narayanan
  2025-12-26 10:51 ` Sumit Garg
  2026-01-16 18:03 ` Casey Connolly
  2 siblings, 0 replies; 6+ messages in thread
From: Varadarajan Narayanan @ 2025-12-17 11:00 UTC (permalink / raw)
  To: Aswin Murugan
  Cc: casey.connolly, neil.armstrong, sumit.garg, trini, u-boot-qcom,
	u-boot

On Wed, Nov 12, 2025 at 10:28:51PM +0530, Aswin Murugan wrote:
> The SMEM driver was failing to resolve memory regions on some boards
> because `dev_of_offset()` + `fdtdec_lookup_phandle()` did not yield a
> valid DT node. Modernize the code to use driver-model/ofnode accessors
> and make the probe robust for both DT styles (direct `reg` vs
> `memory-region` phandle).
>
> - qcom_smem_map_memory():
>   * Drop fdtdec path; use dev_read_phandle_with_args() +
>     ofnode_read_resource().
>   * Use dev_read_phandle_with_args() +
>     fnode_read_resource().
>
> - qcom_smem_probe():
>   * Try dev_read_addr_size() first (map via <reg>), else fall back to
>     qcom_smem_map_memory() with "memory-region".
>   * Check "qcom,rpm-msg-ram" presence to add second region.
>
> - Additionally, SMEM_HOST_COUNT is increased to support newer SMEM
>   versions that include more remote processors. This avoids failures
>   during processor ID checks.

Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>

> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
>  drivers/smem/msm_smem.c | 56 +++++++++++++++++++++++++++++------------
>  1 file changed, 40 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/smem/msm_smem.c b/drivers/smem/msm_smem.c
> index ccd145f9afb..b6b92d3530d 100644
> --- a/drivers/smem/msm_smem.c
> +++ b/drivers/smem/msm_smem.c
> @@ -88,7 +88,7 @@ DECLARE_GLOBAL_DATA_PTR;
>  #define SMEM_GLOBAL_HOST	0xfffe
>
>  /* Max number of processors/hosts in a system */
> -#define SMEM_HOST_COUNT		10
> +#define SMEM_HOST_COUNT		25
>
>  /**
>   * struct smem_proc_comm - proc_comm communication struct (legacy)
> @@ -821,23 +821,34 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem,
>  static int qcom_smem_map_memory(struct qcom_smem *smem, struct udevice *dev,
>  				const char *name, int i)
>  {
> -	struct fdt_resource r;
>  	int ret;
> -	int node = dev_of_offset(dev);
> +	struct ofnode_phandle_args args;
> +	struct resource r;
>
> -	ret = fdtdec_lookup_phandle(gd->fdt_blob, node, name);
> -	if (ret < 0) {
> -		dev_err(dev, "No %s specified\n", name);
> +	if (!dev_read_prop(dev, name, NULL)) {
> +		dev_err(dev, "%s prop not found\n", name);
>  		return -EINVAL;
>  	}
>
> -	ret = fdt_get_resource(gd->fdt_blob, ret, "reg", 0, &r);
> -	if (ret)
> -		return ret;
> +	ret = dev_read_phandle_with_args(dev, name, NULL, 0, 0, &args);
> +	if (ret) {
> +		dev_err(dev, "%s phandle read failed\n", name);
> +		return -EINVAL;
> +	}
>
> +	if (!ofnode_valid(args.node)) {
> +		dev_err(dev, "Invalid node from phandle args\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = ofnode_read_resource(args.node, 0, &r);
> +	if (ret) {
> +		dev_err(dev, "Can't get mmap base address(%d)\n", ret);
> +		return ret;
> +	}
>  	smem->regions[i].aux_base = (u32)r.start;
> -	smem->regions[i].size = fdt_resource_size(&r);
> -	smem->regions[i].virt_base = devm_ioremap(dev, r.start, fdt_resource_size(&r));
> +	smem->regions[i].size = resource_size(&r);
> +	smem->regions[i].virt_base = devm_ioremap(dev, r.start, resource_size(&r));
>  	if (!smem->regions[i].virt_base)
>  		return -ENOMEM;
>
> @@ -852,10 +863,14 @@ static int qcom_smem_probe(struct udevice *dev)
>  	int num_regions;
>  	u32 version;
>  	int ret;
> -	int node = dev_of_offset(dev);
> +	fdt_addr_t addr;
> +	fdt_size_t size;
> +
> +	if (__smem)
> +		return 0;
>
>  	num_regions = 1;
> -	if (fdtdec_lookup_phandle(gd->fdt_blob, node, "qcomrpm-msg-ram") >= 0)
> +	if (dev_read_prop(dev, "qcom,rpm-msg-ram", NULL))
>  		num_regions++;
>
>  	array_size = num_regions * sizeof(struct smem_region);
> @@ -866,9 +881,18 @@ static int qcom_smem_probe(struct udevice *dev)
>  	smem->dev = dev;
>  	smem->num_regions = num_regions;
>
> -	ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
> -	if (ret)
> -		return ret;
> +	addr = dev_read_addr_size(dev, &size);
> +	if (addr == FDT_ADDR_T_NONE) {
> +		ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
> +		if (ret)
> +			return ret;
> +	} else {
> +		smem->regions[0].aux_base = (u32)addr;
> +		smem->regions[0].size = size;
> +		smem->regions[0].virt_base = devm_ioremap(dev, addr, size);
> +		if (!smem->regions[0].virt_base)
> +			return -ENOMEM;
> +	}
>
>  	if (num_regions > 1) {
>  		ret = qcom_smem_map_memory(smem, dev,
>
> --
> 2.34.1
>

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

* Re: [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
  2025-11-12 16:58 [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count Aswin Murugan
  2025-12-17 11:00 ` Varadarajan Narayanan
@ 2025-12-26 10:51 ` Sumit Garg
  2026-01-08 20:41   ` Casey Connolly
  2026-01-16 18:03 ` Casey Connolly
  2 siblings, 1 reply; 6+ messages in thread
From: Sumit Garg @ 2025-12-26 10:51 UTC (permalink / raw)
  To: Aswin Murugan, casey.connolly; +Cc: neil.armstrong, trini, u-boot-qcom, u-boot

On Wed, Nov 12, 2025 at 10:28:51PM +0530, Aswin Murugan wrote:
> The SMEM driver was failing to resolve memory regions on some boards
> because `dev_of_offset()` + `fdtdec_lookup_phandle()` did not yield a
> valid DT node. Modernize the code to use driver-model/ofnode accessors
> and make the probe robust for both DT styles (direct `reg` vs
> `memory-region` phandle).
> 
> - qcom_smem_map_memory():
>   * Drop fdtdec path; use dev_read_phandle_with_args() +
>     ofnode_read_resource().
>   * Use dev_read_phandle_with_args() +
>     fnode_read_resource().
> 
> - qcom_smem_probe():
>   * Try dev_read_addr_size() first (map via <reg>), else fall back to
>     qcom_smem_map_memory() with "memory-region".
>   * Check "qcom,rpm-msg-ram" presence to add second region.
> 
> - Additionally, SMEM_HOST_COUNT is increased to support newer SMEM
>   versions that include more remote processors. This avoids failures
>   during processor ID checks.
> 
> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
> ---
>  drivers/smem/msm_smem.c | 56 +++++++++++++++++++++++++++++------------
>  1 file changed, 40 insertions(+), 16 deletions(-)

There was an earlier effort from Casey to import SMEM driver here [1]
from Linux kernel. But unfortunately that patch-set didn't got reworked
to make into U-Boot mainline.

Casey, do you have any plans to respin the patch-set? Or it's fine for
others to take over that patch-set?

[1] https://patchwork.ozlabs.org/project/uboot/list/?series=433987&state=*

-Sumit

> 
> diff --git a/drivers/smem/msm_smem.c b/drivers/smem/msm_smem.c
> index ccd145f9afb..b6b92d3530d 100644
> --- a/drivers/smem/msm_smem.c
> +++ b/drivers/smem/msm_smem.c
> @@ -88,7 +88,7 @@ DECLARE_GLOBAL_DATA_PTR;
>  #define SMEM_GLOBAL_HOST	0xfffe
>  
>  /* Max number of processors/hosts in a system */
> -#define SMEM_HOST_COUNT		10
> +#define SMEM_HOST_COUNT		25
>  
>  /**
>   * struct smem_proc_comm - proc_comm communication struct (legacy)
> @@ -821,23 +821,34 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem,
>  static int qcom_smem_map_memory(struct qcom_smem *smem, struct udevice *dev,
>  				const char *name, int i)
>  {
> -	struct fdt_resource r;
>  	int ret;
> -	int node = dev_of_offset(dev);
> +	struct ofnode_phandle_args args;
> +	struct resource r;
>  
> -	ret = fdtdec_lookup_phandle(gd->fdt_blob, node, name);
> -	if (ret < 0) {
> -		dev_err(dev, "No %s specified\n", name);
> +	if (!dev_read_prop(dev, name, NULL)) {
> +		dev_err(dev, "%s prop not found\n", name);
>  		return -EINVAL;
>  	}
>  
> -	ret = fdt_get_resource(gd->fdt_blob, ret, "reg", 0, &r);
> -	if (ret)
> -		return ret;
> +	ret = dev_read_phandle_with_args(dev, name, NULL, 0, 0, &args);
> +	if (ret) {
> +		dev_err(dev, "%s phandle read failed\n", name);
> +		return -EINVAL;
> +	}
>  
> +	if (!ofnode_valid(args.node)) {
> +		dev_err(dev, "Invalid node from phandle args\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = ofnode_read_resource(args.node, 0, &r);
> +	if (ret) {
> +		dev_err(dev, "Can't get mmap base address(%d)\n", ret);
> +		return ret;
> +	}
>  	smem->regions[i].aux_base = (u32)r.start;
> -	smem->regions[i].size = fdt_resource_size(&r);
> -	smem->regions[i].virt_base = devm_ioremap(dev, r.start, fdt_resource_size(&r));
> +	smem->regions[i].size = resource_size(&r);
> +	smem->regions[i].virt_base = devm_ioremap(dev, r.start, resource_size(&r));
>  	if (!smem->regions[i].virt_base)
>  		return -ENOMEM;
>  
> @@ -852,10 +863,14 @@ static int qcom_smem_probe(struct udevice *dev)
>  	int num_regions;
>  	u32 version;
>  	int ret;
> -	int node = dev_of_offset(dev);
> +	fdt_addr_t addr;
> +	fdt_size_t size;
> +
> +	if (__smem)
> +		return 0;
>  
>  	num_regions = 1;
> -	if (fdtdec_lookup_phandle(gd->fdt_blob, node, "qcomrpm-msg-ram") >= 0)
> +	if (dev_read_prop(dev, "qcom,rpm-msg-ram", NULL))
>  		num_regions++;
>  
>  	array_size = num_regions * sizeof(struct smem_region);
> @@ -866,9 +881,18 @@ static int qcom_smem_probe(struct udevice *dev)
>  	smem->dev = dev;
>  	smem->num_regions = num_regions;
>  
> -	ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
> -	if (ret)
> -		return ret;
> +	addr = dev_read_addr_size(dev, &size);
> +	if (addr == FDT_ADDR_T_NONE) {
> +		ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
> +		if (ret)
> +			return ret;
> +	} else {
> +		smem->regions[0].aux_base = (u32)addr;
> +		smem->regions[0].size = size;
> +		smem->regions[0].virt_base = devm_ioremap(dev, addr, size);
> +		if (!smem->regions[0].virt_base)
> +			return -ENOMEM;
> +	}
>  
>  	if (num_regions > 1) {
>  		ret = qcom_smem_map_memory(smem, dev,
> -- 
> 2.34.1
> 

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

* Re: [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
  2025-12-26 10:51 ` Sumit Garg
@ 2026-01-08 20:41   ` Casey Connolly
  2026-01-12 16:35     ` Casey Connolly
  0 siblings, 1 reply; 6+ messages in thread
From: Casey Connolly @ 2026-01-08 20:41 UTC (permalink / raw)
  To: Sumit Garg, Aswin Murugan; +Cc: neil.armstrong, trini, u-boot-qcom, u-boot



On 26/12/2025 11:51, Sumit Garg wrote:
> On Wed, Nov 12, 2025 at 10:28:51PM +0530, Aswin Murugan wrote:
>> The SMEM driver was failing to resolve memory regions on some boards
>> because `dev_of_offset()` + `fdtdec_lookup_phandle()` did not yield a
>> valid DT node. Modernize the code to use driver-model/ofnode accessors
>> and make the probe robust for both DT styles (direct `reg` vs
>> `memory-region` phandle).
>>
>> - qcom_smem_map_memory():
>>   * Drop fdtdec path; use dev_read_phandle_with_args() +
>>     ofnode_read_resource().
>>   * Use dev_read_phandle_with_args() +
>>     fnode_read_resource().
>>
>> - qcom_smem_probe():
>>   * Try dev_read_addr_size() first (map via <reg>), else fall back to
>>     qcom_smem_map_memory() with "memory-region".
>>   * Check "qcom,rpm-msg-ram" presence to add second region.
>>
>> - Additionally, SMEM_HOST_COUNT is increased to support newer SMEM
>>   versions that include more remote processors. This avoids failures
>>   during processor ID checks.
>>
>> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
>> ---
>>  drivers/smem/msm_smem.c | 56 +++++++++++++++++++++++++++++------------
>>  1 file changed, 40 insertions(+), 16 deletions(-)
> 
> There was an earlier effort from Casey to import SMEM driver here [1]
> from Linux kernel. But unfortunately that patch-set didn't got reworked
> to make into U-Boot mainline.
> 
> Casey, do you have any plans to respin the patch-set? Or it's fine for
> others to take over that patch-set?

If any of you guys would be willing to take it over that would be a huge
help! I'm not sure when I'd get around to it myself. I'm very much
looking forward to getting the memory map from smem at long last :D

I'd appreciate it if you could fixup the authorship/sob on my old
patches if you do resend them.

Thanks and kind regards,
> 
> [1] https://patchwork.ozlabs.org/project/uboot/list/?series=433987&state=*
> 
> -Sumit
> 
>>
>> diff --git a/drivers/smem/msm_smem.c b/drivers/smem/msm_smem.c
>> index ccd145f9afb..b6b92d3530d 100644
>> --- a/drivers/smem/msm_smem.c
>> +++ b/drivers/smem/msm_smem.c
>> @@ -88,7 +88,7 @@ DECLARE_GLOBAL_DATA_PTR;
>>  #define SMEM_GLOBAL_HOST	0xfffe
>>  
>>  /* Max number of processors/hosts in a system */
>> -#define SMEM_HOST_COUNT		10
>> +#define SMEM_HOST_COUNT		25
>>  
>>  /**
>>   * struct smem_proc_comm - proc_comm communication struct (legacy)
>> @@ -821,23 +821,34 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem,
>>  static int qcom_smem_map_memory(struct qcom_smem *smem, struct udevice *dev,
>>  				const char *name, int i)
>>  {
>> -	struct fdt_resource r;
>>  	int ret;
>> -	int node = dev_of_offset(dev);
>> +	struct ofnode_phandle_args args;
>> +	struct resource r;
>>  
>> -	ret = fdtdec_lookup_phandle(gd->fdt_blob, node, name);
>> -	if (ret < 0) {
>> -		dev_err(dev, "No %s specified\n", name);
>> +	if (!dev_read_prop(dev, name, NULL)) {
>> +		dev_err(dev, "%s prop not found\n", name);
>>  		return -EINVAL;
>>  	}
>>  
>> -	ret = fdt_get_resource(gd->fdt_blob, ret, "reg", 0, &r);
>> -	if (ret)
>> -		return ret;
>> +	ret = dev_read_phandle_with_args(dev, name, NULL, 0, 0, &args);
>> +	if (ret) {
>> +		dev_err(dev, "%s phandle read failed\n", name);
>> +		return -EINVAL;
>> +	}
>>  
>> +	if (!ofnode_valid(args.node)) {
>> +		dev_err(dev, "Invalid node from phandle args\n");
>> +		return -EINVAL;
>> +	}
>> +
>> +	ret = ofnode_read_resource(args.node, 0, &r);
>> +	if (ret) {
>> +		dev_err(dev, "Can't get mmap base address(%d)\n", ret);
>> +		return ret;
>> +	}
>>  	smem->regions[i].aux_base = (u32)r.start;
>> -	smem->regions[i].size = fdt_resource_size(&r);
>> -	smem->regions[i].virt_base = devm_ioremap(dev, r.start, fdt_resource_size(&r));
>> +	smem->regions[i].size = resource_size(&r);
>> +	smem->regions[i].virt_base = devm_ioremap(dev, r.start, resource_size(&r));
>>  	if (!smem->regions[i].virt_base)
>>  		return -ENOMEM;
>>  
>> @@ -852,10 +863,14 @@ static int qcom_smem_probe(struct udevice *dev)
>>  	int num_regions;
>>  	u32 version;
>>  	int ret;
>> -	int node = dev_of_offset(dev);
>> +	fdt_addr_t addr;
>> +	fdt_size_t size;
>> +
>> +	if (__smem)
>> +		return 0;
>>  
>>  	num_regions = 1;
>> -	if (fdtdec_lookup_phandle(gd->fdt_blob, node, "qcomrpm-msg-ram") >= 0)
>> +	if (dev_read_prop(dev, "qcom,rpm-msg-ram", NULL))
>>  		num_regions++;
>>  
>>  	array_size = num_regions * sizeof(struct smem_region);
>> @@ -866,9 +881,18 @@ static int qcom_smem_probe(struct udevice *dev)
>>  	smem->dev = dev;
>>  	smem->num_regions = num_regions;
>>  
>> -	ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
>> -	if (ret)
>> -		return ret;
>> +	addr = dev_read_addr_size(dev, &size);
>> +	if (addr == FDT_ADDR_T_NONE) {
>> +		ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
>> +		if (ret)
>> +			return ret;
>> +	} else {
>> +		smem->regions[0].aux_base = (u32)addr;
>> +		smem->regions[0].size = size;
>> +		smem->regions[0].virt_base = devm_ioremap(dev, addr, size);
>> +		if (!smem->regions[0].virt_base)
>> +			return -ENOMEM;
>> +	}
>>  
>>  	if (num_regions > 1) {
>>  		ret = qcom_smem_map_memory(smem, dev,
>> -- 
>> 2.34.1
>>

-- 
// Casey (she/her)


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

* Re: [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
  2026-01-08 20:41   ` Casey Connolly
@ 2026-01-12 16:35     ` Casey Connolly
  0 siblings, 0 replies; 6+ messages in thread
From: Casey Connolly @ 2026-01-12 16:35 UTC (permalink / raw)
  To: Sumit Garg, Aswin Murugan; +Cc: neil.armstrong, trini, u-boot-qcom, u-boot



On 08/01/2026 21:41, Casey Connolly wrote:
> 
> 
> On 26/12/2025 11:51, Sumit Garg wrote:
>> On Wed, Nov 12, 2025 at 10:28:51PM +0530, Aswin Murugan wrote:
>>> The SMEM driver was failing to resolve memory regions on some boards
>>> because `dev_of_offset()` + `fdtdec_lookup_phandle()` did not yield a
>>> valid DT node. Modernize the code to use driver-model/ofnode accessors
>>> and make the probe robust for both DT styles (direct `reg` vs
>>> `memory-region` phandle).
>>>
>>> - qcom_smem_map_memory():
>>>   * Drop fdtdec path; use dev_read_phandle_with_args() +
>>>     ofnode_read_resource().
>>>   * Use dev_read_phandle_with_args() +
>>>     fnode_read_resource().
>>>
>>> - qcom_smem_probe():
>>>   * Try dev_read_addr_size() first (map via <reg>), else fall back to
>>>     qcom_smem_map_memory() with "memory-region".
>>>   * Check "qcom,rpm-msg-ram" presence to add second region.
>>>
>>> - Additionally, SMEM_HOST_COUNT is increased to support newer SMEM
>>>   versions that include more remote processors. This avoids failures
>>>   during processor ID checks.
>>>
>>> Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>
>>> ---
>>>  drivers/smem/msm_smem.c | 56 +++++++++++++++++++++++++++++------------
>>>  1 file changed, 40 insertions(+), 16 deletions(-)
>>
>> There was an earlier effort from Casey to import SMEM driver here [1]
>> from Linux kernel. But unfortunately that patch-set didn't got reworked
>> to make into U-Boot mainline.

I'll pick this fix up for now, but hopefully we can drop this old crummy
driver soon :D

Thanks,

>>
>> Casey, do you have any plans to respin the patch-set? Or it's fine for
>> others to take over that patch-set?
> 
> If any of you guys would be willing to take it over that would be a huge
> help! I'm not sure when I'd get around to it myself. I'm very much
> looking forward to getting the memory map from smem at long last :D
> 
> I'd appreciate it if you could fixup the authorship/sob on my old
> patches if you do resend them.
> 
> Thanks and kind regards,
>>
>> [1] https://patchwork.ozlabs.org/project/uboot/list/?series=433987&state=*
>>
>> -Sumit
>>
>>>
>>> diff --git a/drivers/smem/msm_smem.c b/drivers/smem/msm_smem.c
>>> index ccd145f9afb..b6b92d3530d 100644
>>> --- a/drivers/smem/msm_smem.c
>>> +++ b/drivers/smem/msm_smem.c
>>> @@ -88,7 +88,7 @@ DECLARE_GLOBAL_DATA_PTR;
>>>  #define SMEM_GLOBAL_HOST	0xfffe
>>>  
>>>  /* Max number of processors/hosts in a system */
>>> -#define SMEM_HOST_COUNT		10
>>> +#define SMEM_HOST_COUNT		25
>>>  
>>>  /**
>>>   * struct smem_proc_comm - proc_comm communication struct (legacy)
>>> @@ -821,23 +821,34 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem,
>>>  static int qcom_smem_map_memory(struct qcom_smem *smem, struct udevice *dev,
>>>  				const char *name, int i)
>>>  {
>>> -	struct fdt_resource r;
>>>  	int ret;
>>> -	int node = dev_of_offset(dev);
>>> +	struct ofnode_phandle_args args;
>>> +	struct resource r;
>>>  
>>> -	ret = fdtdec_lookup_phandle(gd->fdt_blob, node, name);
>>> -	if (ret < 0) {
>>> -		dev_err(dev, "No %s specified\n", name);
>>> +	if (!dev_read_prop(dev, name, NULL)) {
>>> +		dev_err(dev, "%s prop not found\n", name);
>>>  		return -EINVAL;
>>>  	}
>>>  
>>> -	ret = fdt_get_resource(gd->fdt_blob, ret, "reg", 0, &r);
>>> -	if (ret)
>>> -		return ret;
>>> +	ret = dev_read_phandle_with_args(dev, name, NULL, 0, 0, &args);
>>> +	if (ret) {
>>> +		dev_err(dev, "%s phandle read failed\n", name);
>>> +		return -EINVAL;
>>> +	}
>>>  
>>> +	if (!ofnode_valid(args.node)) {
>>> +		dev_err(dev, "Invalid node from phandle args\n");
>>> +		return -EINVAL;
>>> +	}
>>> +
>>> +	ret = ofnode_read_resource(args.node, 0, &r);
>>> +	if (ret) {
>>> +		dev_err(dev, "Can't get mmap base address(%d)\n", ret);
>>> +		return ret;
>>> +	}
>>>  	smem->regions[i].aux_base = (u32)r.start;
>>> -	smem->regions[i].size = fdt_resource_size(&r);
>>> -	smem->regions[i].virt_base = devm_ioremap(dev, r.start, fdt_resource_size(&r));
>>> +	smem->regions[i].size = resource_size(&r);
>>> +	smem->regions[i].virt_base = devm_ioremap(dev, r.start, resource_size(&r));
>>>  	if (!smem->regions[i].virt_base)
>>>  		return -ENOMEM;
>>>  
>>> @@ -852,10 +863,14 @@ static int qcom_smem_probe(struct udevice *dev)
>>>  	int num_regions;
>>>  	u32 version;
>>>  	int ret;
>>> -	int node = dev_of_offset(dev);
>>> +	fdt_addr_t addr;
>>> +	fdt_size_t size;
>>> +
>>> +	if (__smem)
>>> +		return 0;
>>>  
>>>  	num_regions = 1;
>>> -	if (fdtdec_lookup_phandle(gd->fdt_blob, node, "qcomrpm-msg-ram") >= 0)
>>> +	if (dev_read_prop(dev, "qcom,rpm-msg-ram", NULL))
>>>  		num_regions++;
>>>  
>>>  	array_size = num_regions * sizeof(struct smem_region);
>>> @@ -866,9 +881,18 @@ static int qcom_smem_probe(struct udevice *dev)
>>>  	smem->dev = dev;
>>>  	smem->num_regions = num_regions;
>>>  
>>> -	ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
>>> -	if (ret)
>>> -		return ret;
>>> +	addr = dev_read_addr_size(dev, &size);
>>> +	if (addr == FDT_ADDR_T_NONE) {
>>> +		ret = qcom_smem_map_memory(smem, dev, "memory-region", 0);
>>> +		if (ret)
>>> +			return ret;
>>> +	} else {
>>> +		smem->regions[0].aux_base = (u32)addr;
>>> +		smem->regions[0].size = size;
>>> +		smem->regions[0].virt_base = devm_ioremap(dev, addr, size);
>>> +		if (!smem->regions[0].virt_base)
>>> +			return -ENOMEM;
>>> +	}
>>>  
>>>  	if (num_regions > 1) {
>>>  		ret = qcom_smem_map_memory(smem, dev,
>>> -- 
>>> 2.34.1
>>>
> 

-- 
// Casey (she/her)


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

* Re: [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
  2025-11-12 16:58 [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count Aswin Murugan
  2025-12-17 11:00 ` Varadarajan Narayanan
  2025-12-26 10:51 ` Sumit Garg
@ 2026-01-16 18:03 ` Casey Connolly
  2 siblings, 0 replies; 6+ messages in thread
From: Casey Connolly @ 2026-01-16 18:03 UTC (permalink / raw)
  To: neil.armstrong, sumit.garg, trini, u-boot-qcom, u-boot,
	Aswin Murugan


On Wed, 12 Nov 2025 22:28:51 +0530, Aswin Murugan wrote:
> The SMEM driver was failing to resolve memory regions on some boards
> because `dev_of_offset()` + `fdtdec_lookup_phandle()` did not yield a
> valid DT node. Modernize the code to use driver-model/ofnode accessors
> and make the probe robust for both DT styles (direct `reg` vs
> `memory-region` phandle).
> 
> - qcom_smem_map_memory():
>   * Drop fdtdec path; use dev_read_phandle_with_args() +
>     ofnode_read_resource().
>   * Use dev_read_phandle_with_args() +
>     fnode_read_resource().
> 
> [...]

Applied, thanks!

[1/1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count
      https://source.denx.de/u-boot/custodians/u-boot-snapdragon/-/commit/984ebe2d553b

Best regards,
-- 
// Casey (she/they)



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

end of thread, other threads:[~2026-01-16 18:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-12 16:58 [PATCH v1] smem: msm: Fix memory-region lookup, direct <reg> mapping and update SMEM host count Aswin Murugan
2025-12-17 11:00 ` Varadarajan Narayanan
2025-12-26 10:51 ` Sumit Garg
2026-01-08 20:41   ` Casey Connolly
2026-01-12 16:35     ` Casey Connolly
2026-01-16 18:03 ` Casey Connolly

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox