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