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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'rproc-v6.8' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux

Pull remoteproc updates from Bjorn Andersson:

- The i.MX DSP remoteproc driver adds support for providing a resource
table, in order to enable IPC with the core

- The TI K3 DSP driver is transitioned to remove_new, error messages
are changed to use symbolic error codes, and dev_err_probe() is used
where applicable

- Support for the Qualcomm SC7280 audio, compute and WiFi co-processors
are added to the Qualcomm TrustZone based remoteproc driver

* tag 'rproc-v6.8' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux:
remoteproc: qcom_q6v5_pas: Add SC7280 ADSP, CDSP & WPSS
dt-bindings: remoteproc: qcom: sc7180-pas: Add SC7280 compatibles
dt-bindings: remoteproc: qcom: sc7180-pas: Fix SC7280 MPSS PD-names
remoteproc: k3-dsp: Convert to platform remove callback returning void
remoteproc: k3-dsp: Use symbolic error codes in error messages
remoteproc: k3-dsp: Suppress duplicate error message in .remove()
arm64: dts: imx8mp: Add reserve-memory nodes for DSP
remoteproc: imx_dsp_rproc: Add mandatory find_loaded_rsc_table op

+101 -49
+21
Documentation/devicetree/bindings/remoteproc/qcom,sc7180-pas.yaml
··· 18 18 enum: 19 19 - qcom,sc7180-adsp-pas 20 20 - qcom,sc7180-mpss-pas 21 + - qcom,sc7280-adsp-pas 22 + - qcom,sc7280-cdsp-pas 21 23 - qcom,sc7280-mpss-pas 24 + - qcom,sc7280-wpss-pas 22 25 23 26 reg: 24 27 maxItems: 1 ··· 78 75 compatible: 79 76 enum: 80 77 - qcom,sc7180-adsp-pas 78 + - qcom,sc7280-adsp-pas 81 79 then: 82 80 properties: 83 81 power-domains: ··· 113 109 compatible: 114 110 enum: 115 111 - qcom,sc7280-mpss-pas 112 + then: 113 + properties: 114 + power-domains: 115 + items: 116 + - description: CX power domain 117 + - description: MSS power domain 118 + power-domain-names: 119 + items: 120 + - const: cx 121 + - const: mss 122 + 123 + - if: 124 + properties: 125 + compatible: 126 + enum: 127 + - qcom,sc7280-cdsp-pas 128 + - qcom,sc7280-wpss-pas 116 129 then: 117 130 properties: 118 131 power-domains:
+22
arch/arm64/boot/dts/freescale/imx8mp-evk.dts
··· 137 137 }; 138 138 139 139 }; 140 + 141 + reserved-memory { 142 + #address-cells = <2>; 143 + #size-cells = <2>; 144 + ranges; 145 + 146 + dsp_vdev0vring0: vdev0vring0@942f0000 { 147 + reg = <0 0x942f0000 0 0x8000>; 148 + no-map; 149 + }; 150 + 151 + dsp_vdev0vring1: vdev0vring1@942f8000 { 152 + reg = <0 0x942f8000 0 0x8000>; 153 + no-map; 154 + }; 155 + 156 + dsp_vdev0buffer: vdev0buffer@94300000 { 157 + compatible = "shared-dma-pool"; 158 + reg = <0 0x94300000 0 0x100000>; 159 + no-map; 160 + }; 161 + }; 140 162 }; 141 163 142 164 &flexspi {
+1
drivers/remoteproc/imx_dsp_rproc.c
··· 940 940 .kick = imx_dsp_rproc_kick, 941 941 .load = imx_dsp_rproc_elf_load_segments, 942 942 .parse_fw = imx_dsp_rproc_parse_fw, 943 + .find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table, 943 944 .sanity_check = rproc_elf_sanity_check, 944 945 .get_boot_addr = rproc_elf_get_boot_addr, 945 946 };
+19
drivers/remoteproc/qcom_q6v5_pas.c
··· 1165 1165 .region_assign_idx = 2, 1166 1166 }; 1167 1167 1168 + static const struct adsp_data sc7280_wpss_resource = { 1169 + .crash_reason_smem = 626, 1170 + .firmware_name = "wpss.mdt", 1171 + .pas_id = 6, 1172 + .auto_boot = true, 1173 + .proxy_pd_names = (char*[]){ 1174 + "cx", 1175 + "mx", 1176 + NULL 1177 + }, 1178 + .load_state = "wpss", 1179 + .ssr_name = "wpss", 1180 + .sysmon_name = "wpss", 1181 + .ssctl_id = 0x19, 1182 + }; 1183 + 1168 1184 static const struct of_device_id adsp_of_match[] = { 1169 1185 { .compatible = "qcom,msm8226-adsp-pil", .data = &adsp_resource_init}, 1170 1186 { .compatible = "qcom,msm8953-adsp-pil", .data = &msm8996_adsp_resource}, ··· 1194 1178 { .compatible = "qcom,qcs404-wcss-pas", .data = &wcss_resource_init }, 1195 1179 { .compatible = "qcom,sc7180-adsp-pas", .data = &sm8250_adsp_resource}, 1196 1180 { .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init}, 1181 + { .compatible = "qcom,sc7280-adsp-pas", .data = &sm8350_adsp_resource}, 1182 + { .compatible = "qcom,sc7280-cdsp-pas", .data = &sm6350_cdsp_resource}, 1197 1183 { .compatible = "qcom,sc7280-mpss-pas", .data = &mpss_resource_init}, 1184 + { .compatible = "qcom,sc7280-wpss-pas", .data = &sc7280_wpss_resource}, 1198 1185 { .compatible = "qcom,sc8180x-adsp-pas", .data = &sm8150_adsp_resource}, 1199 1186 { .compatible = "qcom,sc8180x-cdsp-pas", .data = &sm8150_cdsp_resource}, 1200 1187 { .compatible = "qcom,sc8180x-mpss-pas", .data = &sc8180x_mpss_resource},
+38 -49
drivers/remoteproc/ti_k3_dsp_remoteproc.c
··· 158 158 /* send the index of the triggered virtqueue in the mailbox payload */ 159 159 ret = mbox_send_message(kproc->mbox, (void *)msg); 160 160 if (ret < 0) 161 - dev_err(dev, "failed to send mailbox message, status = %d\n", 162 - ret); 161 + dev_err(dev, "failed to send mailbox message (%pe)\n", 162 + ERR_PTR(ret)); 163 163 } 164 164 165 165 /* Put the DSP processor into reset */ ··· 170 170 171 171 ret = reset_control_assert(kproc->reset); 172 172 if (ret) { 173 - dev_err(dev, "local-reset assert failed, ret = %d\n", ret); 173 + dev_err(dev, "local-reset assert failed (%pe)\n", ERR_PTR(ret)); 174 174 return ret; 175 175 } 176 176 ··· 180 180 ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, 181 181 kproc->ti_sci_id); 182 182 if (ret) { 183 - dev_err(dev, "module-reset assert failed, ret = %d\n", ret); 183 + dev_err(dev, "module-reset assert failed (%pe)\n", ERR_PTR(ret)); 184 184 if (reset_control_deassert(kproc->reset)) 185 185 dev_warn(dev, "local-reset deassert back failed\n"); 186 186 } ··· 200 200 ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci, 201 201 kproc->ti_sci_id); 202 202 if (ret) { 203 - dev_err(dev, "module-reset deassert failed, ret = %d\n", ret); 203 + dev_err(dev, "module-reset deassert failed (%pe)\n", ERR_PTR(ret)); 204 204 return ret; 205 205 } 206 206 207 207 lreset: 208 208 ret = reset_control_deassert(kproc->reset); 209 209 if (ret) { 210 - dev_err(dev, "local-reset deassert failed, ret = %d\n", ret); 210 + dev_err(dev, "local-reset deassert failed, (%pe)\n", ERR_PTR(ret)); 211 211 if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, 212 212 kproc->ti_sci_id)) 213 213 dev_warn(dev, "module-reset assert back failed\n"); ··· 246 246 */ 247 247 ret = mbox_send_message(kproc->mbox, (void *)RP_MBOX_ECHO_REQUEST); 248 248 if (ret < 0) { 249 - dev_err(dev, "mbox_send_message failed: %d\n", ret); 249 + dev_err(dev, "mbox_send_message failed (%pe)\n", ERR_PTR(ret)); 250 250 mbox_free_channel(kproc->mbox); 251 251 return ret; 252 252 } ··· 272 272 ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci, 273 273 kproc->ti_sci_id); 274 274 if (ret) 275 - dev_err(dev, "module-reset deassert failed, cannot enable internal RAM loading, ret = %d\n", 276 - ret); 275 + dev_err(dev, "module-reset deassert failed, cannot enable internal RAM loading (%pe)\n", 276 + ERR_PTR(ret)); 277 277 278 278 return ret; 279 279 } ··· 296 296 ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, 297 297 kproc->ti_sci_id); 298 298 if (ret) 299 - dev_err(dev, "module-reset assert failed, ret = %d\n", ret); 299 + dev_err(dev, "module-reset assert failed (%pe)\n", ERR_PTR(ret)); 300 300 301 301 return ret; 302 302 } ··· 561 561 562 562 num_rmems = of_property_count_elems_of_size(np, "memory-region", 563 563 sizeof(phandle)); 564 - if (num_rmems <= 0) { 565 - dev_err(dev, "device does not reserved memory regions, ret = %d\n", 566 - num_rmems); 564 + if (num_rmems < 0) { 565 + dev_err(dev, "device does not reserved memory regions (%pe)\n", 566 + ERR_PTR(num_rmems)); 567 567 return -EINVAL; 568 568 } 569 569 if (num_rmems < 2) { ··· 575 575 /* use reserved memory region 0 for vring DMA allocations */ 576 576 ret = of_reserved_mem_device_init_by_idx(dev, np, 0); 577 577 if (ret) { 578 - dev_err(dev, "device cannot initialize DMA pool, ret = %d\n", 579 - ret); 578 + dev_err(dev, "device cannot initialize DMA pool (%pe)\n", 579 + ERR_PTR(ret)); 580 580 return ret; 581 581 } 582 582 ··· 687 687 return -ENODEV; 688 688 689 689 ret = rproc_of_parse_firmware(dev, 0, &fw_name); 690 - if (ret) { 691 - dev_err(dev, "failed to parse firmware-name property, ret = %d\n", 692 - ret); 693 - return ret; 694 - } 690 + if (ret) 691 + return dev_err_probe(dev, ret, "failed to parse firmware-name property\n"); 695 692 696 693 rproc = rproc_alloc(dev, dev_name(dev), &k3_dsp_rproc_ops, fw_name, 697 694 sizeof(*kproc)); ··· 708 711 709 712 kproc->ti_sci = ti_sci_get_by_phandle(np, "ti,sci"); 710 713 if (IS_ERR(kproc->ti_sci)) { 711 - ret = PTR_ERR(kproc->ti_sci); 712 - if (ret != -EPROBE_DEFER) { 713 - dev_err(dev, "failed to get ti-sci handle, ret = %d\n", 714 - ret); 715 - } 714 + ret = dev_err_probe(dev, PTR_ERR(kproc->ti_sci), 715 + "failed to get ti-sci handle\n"); 716 716 kproc->ti_sci = NULL; 717 717 goto free_rproc; 718 718 } 719 719 720 720 ret = of_property_read_u32(np, "ti,sci-dev-id", &kproc->ti_sci_id); 721 721 if (ret) { 722 - dev_err(dev, "missing 'ti,sci-dev-id' property\n"); 722 + dev_err_probe(dev, ret, "missing 'ti,sci-dev-id' property\n"); 723 723 goto put_sci; 724 724 } 725 725 726 726 kproc->reset = devm_reset_control_get_exclusive(dev, NULL); 727 727 if (IS_ERR(kproc->reset)) { 728 - ret = PTR_ERR(kproc->reset); 729 - dev_err(dev, "failed to get reset, status = %d\n", ret); 728 + ret = dev_err_probe(dev, PTR_ERR(kproc->reset), 729 + "failed to get reset\n"); 730 730 goto put_sci; 731 731 } 732 732 733 733 kproc->tsp = k3_dsp_rproc_of_get_tsp(dev, kproc->ti_sci); 734 734 if (IS_ERR(kproc->tsp)) { 735 - dev_err(dev, "failed to construct ti-sci proc control, ret = %d\n", 736 - ret); 737 - ret = PTR_ERR(kproc->tsp); 735 + ret = dev_err_probe(dev, PTR_ERR(kproc->tsp), 736 + "failed to construct ti-sci proc control\n"); 738 737 goto put_sci; 739 738 } 740 739 741 740 ret = ti_sci_proc_request(kproc->tsp); 742 741 if (ret < 0) { 743 - dev_err(dev, "ti_sci_proc_request failed, ret = %d\n", ret); 742 + dev_err_probe(dev, ret, "ti_sci_proc_request failed\n"); 744 743 goto free_tsp; 745 744 } 746 745 ··· 746 753 747 754 ret = k3_dsp_reserved_mem_init(kproc); 748 755 if (ret) { 749 - dev_err(dev, "reserved memory init failed, ret = %d\n", ret); 756 + dev_err_probe(dev, ret, "reserved memory init failed\n"); 750 757 goto release_tsp; 751 758 } 752 759 753 760 ret = kproc->ti_sci->ops.dev_ops.is_on(kproc->ti_sci, kproc->ti_sci_id, 754 761 NULL, &p_state); 755 762 if (ret) { 756 - dev_err(dev, "failed to get initial state, mode cannot be determined, ret = %d\n", 757 - ret); 763 + dev_err_probe(dev, ret, "failed to get initial state, mode cannot be determined\n"); 758 764 goto release_mem; 759 765 } 760 766 ··· 779 787 if (data->uses_lreset) { 780 788 ret = reset_control_status(kproc->reset); 781 789 if (ret < 0) { 782 - dev_err(dev, "failed to get reset status, status = %d\n", 783 - ret); 790 + dev_err_probe(dev, ret, "failed to get reset status\n"); 784 791 goto release_mem; 785 792 } else if (ret == 0) { 786 793 dev_warn(dev, "local reset is deasserted for device\n"); ··· 790 799 791 800 ret = rproc_add(rproc); 792 801 if (ret) { 793 - dev_err(dev, "failed to add register device with remoteproc core, status = %d\n", 794 - ret); 802 + dev_err_probe(dev, ret, "failed to add register device with remoteproc core\n"); 795 803 goto release_mem; 796 804 } 797 805 ··· 803 813 release_tsp: 804 814 ret1 = ti_sci_proc_release(kproc->tsp); 805 815 if (ret1) 806 - dev_err(dev, "failed to release proc, ret = %d\n", ret1); 816 + dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret1)); 807 817 free_tsp: 808 818 kfree(kproc->tsp); 809 819 put_sci: 810 820 ret1 = ti_sci_put_handle(kproc->ti_sci); 811 821 if (ret1) 812 - dev_err(dev, "failed to put ti_sci handle, ret = %d\n", ret1); 822 + dev_err(dev, "failed to put ti_sci handle (%pe)\n", ERR_PTR(ret1)); 813 823 free_rproc: 814 824 rproc_free(rproc); 815 825 return ret; 816 826 } 817 827 818 - static int k3_dsp_rproc_remove(struct platform_device *pdev) 828 + static void k3_dsp_rproc_remove(struct platform_device *pdev) 819 829 { 820 830 struct k3_dsp_rproc *kproc = platform_get_drvdata(pdev); 821 831 struct rproc *rproc = kproc->rproc; ··· 825 835 if (rproc->state == RPROC_ATTACHED) { 826 836 ret = rproc_detach(rproc); 827 837 if (ret) { 828 - dev_err(dev, "failed to detach proc, ret = %d\n", ret); 829 - return ret; 838 + /* Note this error path leaks resources */ 839 + dev_err(dev, "failed to detach proc (%pe)\n", ERR_PTR(ret)); 840 + return; 830 841 } 831 842 } 832 843 ··· 835 844 836 845 ret = ti_sci_proc_release(kproc->tsp); 837 846 if (ret) 838 - dev_err(dev, "failed to release proc, ret = %d\n", ret); 847 + dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret)); 839 848 840 849 kfree(kproc->tsp); 841 850 842 851 ret = ti_sci_put_handle(kproc->ti_sci); 843 852 if (ret) 844 - dev_err(dev, "failed to put ti_sci handle, ret = %d\n", ret); 853 + dev_err(dev, "failed to put ti_sci handle (%pe)\n", ERR_PTR(ret)); 845 854 846 855 k3_dsp_reserved_mem_exit(kproc); 847 856 rproc_free(kproc->rproc); 848 - 849 - return 0; 850 857 } 851 858 852 859 static const struct k3_dsp_mem_data c66_mems[] = { ··· 895 906 896 907 static struct platform_driver k3_dsp_rproc_driver = { 897 908 .probe = k3_dsp_rproc_probe, 898 - .remove = k3_dsp_rproc_remove, 909 + .remove_new = k3_dsp_rproc_remove, 899 910 .driver = { 900 911 .name = "k3-dsp-rproc", 901 912 .of_match_table = k3_dsp_of_match,