Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Rob Herring (Arm) and committed by
Bjorn Andersson
c70b9d5f a1f2c2d5

+71 -128
+9 -15
drivers/remoteproc/qcom_q6v5_adsp.c
··· 625 625 626 626 static int adsp_alloc_memory_region(struct qcom_adsp *adsp) 627 627 { 628 - struct reserved_mem *rmem = NULL; 629 - struct device_node *node; 628 + int ret; 629 + struct resource res; 630 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); 635 - 636 - if (!rmem) { 631 + ret = of_reserved_mem_region_to_resource(adsp->dev->of_node, 0, &res); 632 + if (ret) { 637 633 dev_err(adsp->dev, "unable to resolve memory-region\n"); 638 - return -EINVAL; 634 + return ret; 639 635 } 640 636 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); 645 640 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); 648 642 return -EBUSY; 649 643 } 650 644
+19 -41
drivers/remoteproc/qcom_q6v5_mss.c
··· 1970 1970 static int q6v5_alloc_memory_region(struct q6v5 *qproc) 1971 1971 { 1972 1972 struct device_node *child; 1973 - struct reserved_mem *rmem; 1974 - struct device_node *node; 1973 + struct resource res; 1974 + int ret; 1975 1975 1976 1976 /* 1977 1977 * In the absence of mba/mpss sub-child, extract the mba and mpss ··· 1979 1979 */ 1980 1980 child = of_get_child_by_name(qproc->dev->of_node, "mba"); 1981 1981 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); 1984 1983 } else { 1985 - node = of_parse_phandle(child, "memory-region", 0); 1984 + ret = of_reserved_mem_region_to_resource(child, 0, &res); 1986 1985 of_node_put(child); 1987 1986 } 1988 1987 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) { 1997 1989 dev_err(qproc->dev, "unable to resolve mba region\n"); 1998 - return -EINVAL; 1990 + return ret; 1999 1991 } 2000 1992 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); 2003 1995 2004 1996 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); 2007 1998 } else { 2008 1999 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); 2010 2001 of_node_put(child); 2011 2002 } 2012 2003 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) { 2021 2005 dev_err(qproc->dev, "unable to resolve mpss region\n"); 2022 - return -EINVAL; 2006 + return ret; 2023 2007 } 2024 2008 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); 2027 2011 2028 2012 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); 2030 2014 } else { 2031 2015 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); 2033 2017 of_node_put(child); 2034 2018 } 2035 2019 2036 - if (!node) 2020 + if (ret) 2037 2021 return 0; 2038 2022 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); 2047 2025 2048 2026 return 0; 2049 2027 }
+24 -43
drivers/remoteproc/qcom_q6v5_pas.c
··· 547 547 548 548 static int qcom_pas_alloc_memory_region(struct qcom_pas *pas) 549 549 { 550 - struct reserved_mem *rmem; 551 - struct device_node *node; 550 + struct resource res; 551 + int ret; 552 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 - } 558 - 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) { 562 555 dev_err(pas->dev, "unable to resolve memory-region\n"); 563 - return -EINVAL; 556 + return ret; 564 557 } 565 558 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); 569 562 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); 572 564 return -EBUSY; 573 565 } 574 566 575 567 if (!pas->dtb_pas_id) 576 568 return 0; 577 569 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) { 587 572 dev_err(pas->dev, "unable to resolve dtb memory-region\n"); 588 - return -EINVAL; 573 + return ret; 589 574 } 590 575 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); 594 579 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); 597 581 return -EBUSY; 598 582 } 599 583 ··· 587 603 static int qcom_pas_assign_memory_region(struct qcom_pas *pas) 588 604 { 589 605 struct qcom_scm_vmperm perm[MAX_ASSIGN_COUNT]; 590 - struct device_node *node; 591 606 unsigned int perm_size; 592 607 int offset; 593 608 int ret; ··· 595 612 return 0; 596 613 597 614 for (offset = 0; offset < pas->region_assign_count; ++offset) { 598 - struct reserved_mem *rmem = NULL; 615 + struct resource res; 599 616 600 - node = of_parse_phandle(pas->dev->of_node, "memory-region", 601 - pas->region_assign_idx + offset); 602 - if (node) 603 - rmem = of_reserved_mem_lookup(node); 604 - of_node_put(node); 605 - if (!rmem) { 617 + ret = of_reserved_mem_region_to_resource(pas->dev->of_node, 618 + pas->region_assign_idx + offset, 619 + &res); 620 + if (ret) { 606 621 dev_err(pas->dev, "unable to resolve shareable memory-region index %d\n", 607 622 offset); 608 - return -EINVAL; 623 + return ret; 609 624 } 610 625 611 626 if (pas->region_assign_shared) { ··· 618 637 perm_size = 1; 619 638 } 620 639 621 - pas->region_assign_phys[offset] = rmem->base; 622 - pas->region_assign_size[offset] = rmem->size; 640 + pas->region_assign_phys[offset] = res.start; 641 + pas->region_assign_size[offset] = resource_size(&res); 623 642 pas->region_assign_owners[offset] = BIT(QCOM_SCM_VMID_HLOS); 624 643 625 644 ret = qcom_scm_assign_mem(pas->region_assign_phys[offset],
+10 -15
drivers/remoteproc/qcom_q6v5_wcss.c
··· 873 873 874 874 static int q6v5_alloc_memory_region(struct q6v5_wcss *wcss) 875 875 { 876 - struct reserved_mem *rmem = NULL; 877 - struct device_node *node; 878 876 struct device *dev = wcss->dev; 877 + struct resource res; 878 + int ret; 879 879 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) { 886 882 dev_err(dev, "unable to acquire memory-region\n"); 887 - return -EINVAL; 883 + return ret; 888 884 } 889 885 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); 894 890 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); 897 892 return -EBUSY; 898 893 } 899 894
+9 -14
drivers/remoteproc/qcom_wcnss.c
··· 526 526 527 527 static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss) 528 528 { 529 - struct reserved_mem *rmem = NULL; 530 - struct device_node *node; 529 + struct resource res; 530 + int ret; 531 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); 536 - 537 - if (!rmem) { 532 + ret = of_reserved_mem_region_to_resource(wcnss->dev->of_node, 0, &res); 533 + if (ret) { 538 534 dev_err(wcnss->dev, "unable to resolve memory-region\n"); 539 - return -EINVAL; 535 + return ret; 540 536 } 541 537 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); 545 541 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); 548 543 return -EBUSY; 549 544 } 550 545