aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@codeaurora.org>2015-10-08 14:34:09 -0400
committerAndy Gross <agross@codeaurora.org>2015-10-14 15:51:40 -0400
commitd0bfd7c9b162612de55ca2d204403b90dc278db6 (patch)
treef3bb0e4ca2aadceab29f0578857683d1ef02633b
parenta8ddd1b998bdad9489876a3068cc45917bee5441 (diff)
soc: qcom: smem: Move RPM message ram out of smem DT node
SMEM is a software construct built on top of a DDR reserved region and sometimes a device memory region called RPM message ram. Having the RPM message ram in the smem DT node's reg property leads to the smem node being located in different places depending on if the message ram is being used or not. Let's add a qcom specific property, qcom,rpm-msg-ram, and point to the device memory from the SMEM node via a phandle. As SMEM is a software construct, it really needs to reside at the root of the DT regardless of whether it's using the message ram or not. Cc: Bjorn Andersson <bjorn.andersson@sonymobile.com> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Andy Gross <agross@codeaurora.org>
-rw-r--r--arch/arm/boot/dts/qcom-msm8974.dtsi17
-rw-r--r--drivers/soc/qcom/smem.c73
2 files changed, 41 insertions, 49 deletions
diff --git a/arch/arm/boot/dts/qcom-msm8974.dtsi b/arch/arm/boot/dts/qcom-msm8974.dtsi
index ab8e57250468..93e315053bdd 100644
--- a/arch/arm/boot/dts/qcom-msm8974.dtsi
+++ b/arch/arm/boot/dts/qcom-msm8974.dtsi
@@ -100,6 +100,15 @@
100 clock-frequency = <19200000>; 100 clock-frequency = <19200000>;
101 }; 101 };
102 102
103 smem {
104 compatible = "qcom,smem";
105
106 memory-region = <&smem_region>;
107 qcom,rpm-msg-ram = <&rpm_msg_ram>;
108
109 hwlocks = <&tcsr_mutex 3>;
110 };
111
103 soc: soc { 112 soc: soc {
104 #address-cells = <1>; 113 #address-cells = <1>;
105 #size-cells = <1>; 114 #size-cells = <1>;
@@ -250,13 +259,9 @@
250 #hwlock-cells = <1>; 259 #hwlock-cells = <1>;
251 }; 260 };
252 261
253 smem@fa00000 { 262 rpm_msg_ram: memory@fc428000 {
254 compatible = "qcom,smem"; 263 compatible = "qcom,rpm-msg-ram";
255
256 memory-region = <&smem_region>;
257 reg = <0xfc428000 0x4000>; 264 reg = <0xfc428000 0x4000>;
258
259 hwlocks = <&tcsr_mutex 3>;
260 }; 265 };
261 266
262 blsp1_uart2: serial@f991e000 { 267 blsp1_uart2: serial@f991e000 {
diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c
index 74017114ce6e..19019aa092e8 100644
--- a/drivers/soc/qcom/smem.c
+++ b/drivers/soc/qcom/smem.c
@@ -664,37 +664,47 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem,
664 return 0; 664 return 0;
665} 665}
666 666
667static int qcom_smem_count_mem_regions(struct platform_device *pdev) 667static int qcom_smem_map_memory(struct qcom_smem *smem, struct device *dev,
668 const char *name, int i)
668{ 669{
669 struct resource *res; 670 struct device_node *np;
670 int num_regions = 0; 671 struct resource r;
671 int i; 672 int ret;
672
673 for (i = 0; i < pdev->num_resources; i++) {
674 res = &pdev->resource[i];
675 673
676 if (resource_type(res) == IORESOURCE_MEM) 674 np = of_parse_phandle(dev->of_node, name, 0);
677 num_regions++; 675 if (!np) {
676 dev_err(dev, "No %s specified\n", name);
677 return -EINVAL;
678 } 678 }
679 679
680 return num_regions; 680 ret = of_address_to_resource(np, 0, &r);
681 of_node_put(np);
682 if (ret)
683 return ret;
684
685 smem->regions[i].aux_base = (u32)r.start;
686 smem->regions[i].size = resource_size(&r);
687 smem->regions[i].virt_base = devm_ioremap_nocache(dev, r.start,
688 resource_size(&r));
689 if (!smem->regions[i].virt_base)
690 return -ENOMEM;
691
692 return 0;
681} 693}
682 694
683static int qcom_smem_probe(struct platform_device *pdev) 695static int qcom_smem_probe(struct platform_device *pdev)
684{ 696{
685 struct smem_header *header; 697 struct smem_header *header;
686 struct device_node *np;
687 struct qcom_smem *smem; 698 struct qcom_smem *smem;
688 struct resource *res;
689 struct resource r;
690 size_t array_size; 699 size_t array_size;
691 int num_regions = 0; 700 int num_regions;
692 int hwlock_id; 701 int hwlock_id;
693 u32 version; 702 u32 version;
694 int ret; 703 int ret;
695 int i;
696 704
697 num_regions = qcom_smem_count_mem_regions(pdev) + 1; 705 num_regions = 1;
706 if (of_find_property(pdev->dev.of_node, "qcom,rpm-msg-ram", NULL))
707 num_regions++;
698 708
699 array_size = num_regions * sizeof(struct smem_region); 709 array_size = num_regions * sizeof(struct smem_region);
700 smem = devm_kzalloc(&pdev->dev, sizeof(*smem) + array_size, GFP_KERNEL); 710 smem = devm_kzalloc(&pdev->dev, sizeof(*smem) + array_size, GFP_KERNEL);
@@ -704,36 +714,13 @@ static int qcom_smem_probe(struct platform_device *pdev)
704 smem->dev = &pdev->dev; 714 smem->dev = &pdev->dev;
705 smem->num_regions = num_regions; 715 smem->num_regions = num_regions;
706 716
707 np = of_parse_phandle(pdev->dev.of_node, "memory-region", 0); 717 ret = qcom_smem_map_memory(smem, &pdev->dev, "memory-region", 0);
708 if (!np) {
709 dev_err(&pdev->dev, "No memory-region specified\n");
710 return -EINVAL;
711 }
712
713 ret = of_address_to_resource(np, 0, &r);
714 of_node_put(np);
715 if (ret) 718 if (ret)
716 return ret; 719 return ret;
717 720
718 smem->regions[0].aux_base = (u32)r.start; 721 if (num_regions > 1 && (ret = qcom_smem_map_memory(smem, &pdev->dev,
719 smem->regions[0].size = resource_size(&r); 722 "qcom,rpm-msg-ram", 1)))
720 smem->regions[0].virt_base = devm_ioremap_nocache(&pdev->dev, 723 return ret;
721 r.start,
722 resource_size(&r));
723 if (!smem->regions[0].virt_base)
724 return -ENOMEM;
725
726 for (i = 1; i < num_regions; i++) {
727 res = platform_get_resource(pdev, IORESOURCE_MEM, i - 1);
728
729 smem->regions[i].aux_base = (u32)res->start;
730 smem->regions[i].size = resource_size(res);
731 smem->regions[i].virt_base = devm_ioremap_nocache(&pdev->dev,
732 res->start,
733 resource_size(res));
734 if (!smem->regions[i].virt_base)
735 return -ENOMEM;
736 }
737 724
738 header = smem->regions[0].virt_base; 725 header = smem->regions[0].virt_base;
739 if (le32_to_cpu(header->initialized) != 1 || 726 if (le32_to_cpu(header->initialized) != 1 ||