Skip to content

Commit c70b9d5

Browse files
robherringandersson
authored andcommitted
remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
Use the newly added of_reserved_mem_region_to_resource() and of_reserved_mem_region_count() functions to handle "memory-region" properties. The error handling is a bit different in some cases. Often "memory-region" is optional, so failed lookup is not an error. But then an error in of_reserved_mem_lookup() is treated as an error. However, that distinction is not really important. Either the region is available and usable or it is not. So now, it is just of_reserved_mem_region_to_resource() which is checked for an error. Signed-off-by: Rob Herring (Arm) <robh@kernel.org> Link: https://lore.kernel.org/r/20251124182751.507624-2-robh@kernel.org Signed-off-by: Bjorn Andersson <andersson@kernel.org>
1 parent a1f2c2d commit c70b9d5

5 files changed

Lines changed: 72 additions & 129 deletions

File tree

drivers/remoteproc/qcom_q6v5_adsp.c

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -625,26 +625,20 @@ static int adsp_init_mmio(struct qcom_adsp *adsp,
625625

626626
static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
627627
{
628-
struct reserved_mem *rmem = NULL;
629-
struct device_node *node;
630-
631-
node = of_parse_phandle(adsp->dev->of_node, "memory-region", 0);
632-
if (node)
633-
rmem = of_reserved_mem_lookup(node);
634-
of_node_put(node);
628+
int ret;
629+
struct resource res;
635630

636-
if (!rmem) {
631+
ret = of_reserved_mem_region_to_resource(adsp->dev->of_node, 0, &res);
632+
if (ret) {
637633
dev_err(adsp->dev, "unable to resolve memory-region\n");
638-
return -EINVAL;
634+
return ret;
639635
}
640636

641-
adsp->mem_phys = adsp->mem_reloc = rmem->base;
642-
adsp->mem_size = rmem->size;
643-
adsp->mem_region = devm_ioremap_wc(adsp->dev,
644-
adsp->mem_phys, adsp->mem_size);
637+
adsp->mem_phys = adsp->mem_reloc = res.start;
638+
adsp->mem_size = resource_size(&res);
639+
adsp->mem_region = devm_ioremap_resource_wc(adsp->dev, &res);
645640
if (!adsp->mem_region) {
646-
dev_err(adsp->dev, "unable to map memory region: %pa+%zx\n",
647-
&rmem->base, adsp->mem_size);
641+
dev_err(adsp->dev, "unable to map memory region: %pR\n", &res);
648642
return -EBUSY;
649643
}
650644

drivers/remoteproc/qcom_q6v5_mss.c

Lines changed: 19 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1970,80 +1970,58 @@ static int q6v5_init_reset(struct q6v5 *qproc)
19701970
static int q6v5_alloc_memory_region(struct q6v5 *qproc)
19711971
{
19721972
struct device_node *child;
1973-
struct reserved_mem *rmem;
1974-
struct device_node *node;
1973+
struct resource res;
1974+
int ret;
19751975

19761976
/*
19771977
* In the absence of mba/mpss sub-child, extract the mba and mpss
19781978
* reserved memory regions from device's memory-region property.
19791979
*/
19801980
child = of_get_child_by_name(qproc->dev->of_node, "mba");
19811981
if (!child) {
1982-
node = of_parse_phandle(qproc->dev->of_node,
1983-
"memory-region", 0);
1982+
ret = of_reserved_mem_region_to_resource(qproc->dev->of_node, 0, &res);
19841983
} else {
1985-
node = of_parse_phandle(child, "memory-region", 0);
1984+
ret = of_reserved_mem_region_to_resource(child, 0, &res);
19861985
of_node_put(child);
19871986
}
19881987

1989-
if (!node) {
1990-
dev_err(qproc->dev, "no mba memory-region specified\n");
1991-
return -EINVAL;
1992-
}
1993-
1994-
rmem = of_reserved_mem_lookup(node);
1995-
of_node_put(node);
1996-
if (!rmem) {
1988+
if (ret) {
19971989
dev_err(qproc->dev, "unable to resolve mba region\n");
1998-
return -EINVAL;
1990+
return ret;
19991991
}
20001992

2001-
qproc->mba_phys = rmem->base;
2002-
qproc->mba_size = rmem->size;
1993+
qproc->mba_phys = res.start;
1994+
qproc->mba_size = resource_size(&res);
20031995

20041996
if (!child) {
2005-
node = of_parse_phandle(qproc->dev->of_node,
2006-
"memory-region", 1);
1997+
ret = of_reserved_mem_region_to_resource(qproc->dev->of_node, 1, &res);
20071998
} else {
20081999
child = of_get_child_by_name(qproc->dev->of_node, "mpss");
2009-
node = of_parse_phandle(child, "memory-region", 0);
2000+
ret = of_reserved_mem_region_to_resource(child, 0, &res);
20102001
of_node_put(child);
20112002
}
20122003

2013-
if (!node) {
2014-
dev_err(qproc->dev, "no mpss memory-region specified\n");
2015-
return -EINVAL;
2016-
}
2017-
2018-
rmem = of_reserved_mem_lookup(node);
2019-
of_node_put(node);
2020-
if (!rmem) {
2004+
if (ret) {
20212005
dev_err(qproc->dev, "unable to resolve mpss region\n");
2022-
return -EINVAL;
2006+
return ret;
20232007
}
20242008

2025-
qproc->mpss_phys = qproc->mpss_reloc = rmem->base;
2026-
qproc->mpss_size = rmem->size;
2009+
qproc->mpss_phys = qproc->mpss_reloc = res.start;
2010+
qproc->mpss_size = resource_size(&res);
20272011

20282012
if (!child) {
2029-
node = of_parse_phandle(qproc->dev->of_node, "memory-region", 2);
2013+
ret = of_reserved_mem_region_to_resource(qproc->dev->of_node, 2, &res);
20302014
} else {
20312015
child = of_get_child_by_name(qproc->dev->of_node, "metadata");
2032-
node = of_parse_phandle(child, "memory-region", 0);
2016+
ret = of_reserved_mem_region_to_resource(child, 0, &res);
20332017
of_node_put(child);
20342018
}
20352019

2036-
if (!node)
2020+
if (ret)
20372021
return 0;
20382022

2039-
rmem = of_reserved_mem_lookup(node);
2040-
if (!rmem) {
2041-
dev_err(qproc->dev, "unable to resolve metadata region\n");
2042-
return -EINVAL;
2043-
}
2044-
2045-
qproc->mdata_phys = rmem->base;
2046-
qproc->mdata_size = rmem->size;
2023+
qproc->mdata_phys = res.start;
2024+
qproc->mdata_size = resource_size(&res);
20472025

20482026
return 0;
20492027
}

drivers/remoteproc/qcom_q6v5_pas.c

Lines changed: 25 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -547,53 +547,37 @@ static void qcom_pas_pds_detach(struct qcom_pas *pas, struct device **pds, size_
547547

548548
static int qcom_pas_alloc_memory_region(struct qcom_pas *pas)
549549
{
550-
struct reserved_mem *rmem;
551-
struct device_node *node;
552-
553-
node = of_parse_phandle(pas->dev->of_node, "memory-region", 0);
554-
if (!node) {
555-
dev_err(pas->dev, "no memory-region specified\n");
556-
return -EINVAL;
557-
}
550+
struct resource res;
551+
int ret;
558552

559-
rmem = of_reserved_mem_lookup(node);
560-
of_node_put(node);
561-
if (!rmem) {
553+
ret = of_reserved_mem_region_to_resource(pas->dev->of_node, 0, &res);
554+
if (ret) {
562555
dev_err(pas->dev, "unable to resolve memory-region\n");
563-
return -EINVAL;
556+
return ret;
564557
}
565558

566-
pas->mem_phys = pas->mem_reloc = rmem->base;
567-
pas->mem_size = rmem->size;
568-
pas->mem_region = devm_ioremap_wc(pas->dev, pas->mem_phys, pas->mem_size);
559+
pas->mem_phys = pas->mem_reloc = res.start;
560+
pas->mem_size = resource_size(&res);
561+
pas->mem_region = devm_ioremap_resource_wc(pas->dev, &res);
569562
if (!pas->mem_region) {
570-
dev_err(pas->dev, "unable to map memory region: %pa+%zx\n",
571-
&rmem->base, pas->mem_size);
563+
dev_err(pas->dev, "unable to map memory region: %pR\n", &res);
572564
return -EBUSY;
573565
}
574566

575567
if (!pas->dtb_pas_id)
576568
return 0;
577569

578-
node = of_parse_phandle(pas->dev->of_node, "memory-region", 1);
579-
if (!node) {
580-
dev_err(pas->dev, "no dtb memory-region specified\n");
581-
return -EINVAL;
582-
}
583-
584-
rmem = of_reserved_mem_lookup(node);
585-
of_node_put(node);
586-
if (!rmem) {
570+
ret = of_reserved_mem_region_to_resource(pas->dev->of_node, 1, &res);
571+
if (ret) {
587572
dev_err(pas->dev, "unable to resolve dtb memory-region\n");
588-
return -EINVAL;
573+
return ret;
589574
}
590575

591-
pas->dtb_mem_phys = pas->dtb_mem_reloc = rmem->base;
592-
pas->dtb_mem_size = rmem->size;
593-
pas->dtb_mem_region = devm_ioremap_wc(pas->dev, pas->dtb_mem_phys, pas->dtb_mem_size);
576+
pas->dtb_mem_phys = pas->dtb_mem_reloc = res.start;
577+
pas->dtb_mem_size = resource_size(&res);
578+
pas->dtb_mem_region = devm_ioremap_resource_wc(pas->dev, &res);
594579
if (!pas->dtb_mem_region) {
595-
dev_err(pas->dev, "unable to map dtb memory region: %pa+%zx\n",
596-
&rmem->base, pas->dtb_mem_size);
580+
dev_err(pas->dev, "unable to map dtb memory region: %pR\n", &res);
597581
return -EBUSY;
598582
}
599583

@@ -603,7 +587,6 @@ static int qcom_pas_alloc_memory_region(struct qcom_pas *pas)
603587
static int qcom_pas_assign_memory_region(struct qcom_pas *pas)
604588
{
605589
struct qcom_scm_vmperm perm[MAX_ASSIGN_COUNT];
606-
struct device_node *node;
607590
unsigned int perm_size;
608591
int offset;
609592
int ret;
@@ -612,17 +595,15 @@ static int qcom_pas_assign_memory_region(struct qcom_pas *pas)
612595
return 0;
613596

614597
for (offset = 0; offset < pas->region_assign_count; ++offset) {
615-
struct reserved_mem *rmem = NULL;
616-
617-
node = of_parse_phandle(pas->dev->of_node, "memory-region",
618-
pas->region_assign_idx + offset);
619-
if (node)
620-
rmem = of_reserved_mem_lookup(node);
621-
of_node_put(node);
622-
if (!rmem) {
598+
struct resource res;
599+
600+
ret = of_reserved_mem_region_to_resource(pas->dev->of_node,
601+
pas->region_assign_idx + offset,
602+
&res);
603+
if (ret) {
623604
dev_err(pas->dev, "unable to resolve shareable memory-region index %d\n",
624605
offset);
625-
return -EINVAL;
606+
return ret;
626607
}
627608

628609
if (pas->region_assign_shared) {
@@ -637,8 +618,8 @@ static int qcom_pas_assign_memory_region(struct qcom_pas *pas)
637618
perm_size = 1;
638619
}
639620

640-
pas->region_assign_phys[offset] = rmem->base;
641-
pas->region_assign_size[offset] = rmem->size;
621+
pas->region_assign_phys[offset] = res.start;
622+
pas->region_assign_size[offset] = resource_size(&res);
642623
pas->region_assign_owners[offset] = BIT(QCOM_SCM_VMID_HLOS);
643624

644625
ret = qcom_scm_assign_mem(pas->region_assign_phys[offset],

drivers/remoteproc/qcom_q6v5_wcss.c

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -873,27 +873,22 @@ static int q6v5_wcss_init_mmio(struct q6v5_wcss *wcss,
873873

874874
static int q6v5_alloc_memory_region(struct q6v5_wcss *wcss)
875875
{
876-
struct reserved_mem *rmem = NULL;
877-
struct device_node *node;
878876
struct device *dev = wcss->dev;
877+
struct resource res;
878+
int ret;
879879

880-
node = of_parse_phandle(dev->of_node, "memory-region", 0);
881-
if (node)
882-
rmem = of_reserved_mem_lookup(node);
883-
of_node_put(node);
884-
885-
if (!rmem) {
880+
ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &res);
881+
if (ret) {
886882
dev_err(dev, "unable to acquire memory-region\n");
887-
return -EINVAL;
883+
return ret;
888884
}
889885

890-
wcss->mem_phys = rmem->base;
891-
wcss->mem_reloc = rmem->base;
892-
wcss->mem_size = rmem->size;
893-
wcss->mem_region = devm_ioremap_wc(dev, wcss->mem_phys, wcss->mem_size);
886+
wcss->mem_phys = res.start;
887+
wcss->mem_reloc = res.start;
888+
wcss->mem_size = resource_size(&res);
889+
wcss->mem_region = devm_ioremap_resource_wc(dev, &res);
894890
if (!wcss->mem_region) {
895-
dev_err(dev, "unable to map memory region: %pa+%pa\n",
896-
&rmem->base, &rmem->size);
891+
dev_err(dev, "unable to map memory region: %pR\n", &res);
897892
return -EBUSY;
898893
}
899894

drivers/remoteproc/qcom_wcnss.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -526,25 +526,20 @@ static int wcnss_request_irq(struct qcom_wcnss *wcnss,
526526

527527
static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss)
528528
{
529-
struct reserved_mem *rmem = NULL;
530-
struct device_node *node;
531-
532-
node = of_parse_phandle(wcnss->dev->of_node, "memory-region", 0);
533-
if (node)
534-
rmem = of_reserved_mem_lookup(node);
535-
of_node_put(node);
529+
struct resource res;
530+
int ret;
536531

537-
if (!rmem) {
532+
ret = of_reserved_mem_region_to_resource(wcnss->dev->of_node, 0, &res);
533+
if (ret) {
538534
dev_err(wcnss->dev, "unable to resolve memory-region\n");
539-
return -EINVAL;
535+
return ret;
540536
}
541537

542-
wcnss->mem_phys = wcnss->mem_reloc = rmem->base;
543-
wcnss->mem_size = rmem->size;
544-
wcnss->mem_region = devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);
538+
wcnss->mem_phys = wcnss->mem_reloc = res.start;
539+
wcnss->mem_size = resource_size(&res);
540+
wcnss->mem_region = devm_ioremap_resource_wc(wcnss->dev, &res);
545541
if (!wcnss->mem_region) {
546-
dev_err(wcnss->dev, "unable to map memory region: %pa+%zx\n",
547-
&rmem->base, wcnss->mem_size);
542+
dev_err(wcnss->dev, "unable to map memory region: %pR\n", &res);
548543
return -EBUSY;
549544
}
550545

0 commit comments

Comments
 (0)