Loading Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt +5 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,11 @@ a GLINK SPSS edge and a SPI based edge. Definition: reference to the "rpm_hlos" mailbox in APCS, as described in mailbox/mailbox.txt - cpu-affinity: Usage: optional Value type: <prop-encoded-array> Definition: cores to pin the irq to = GLINK SPSS The remote proc on a GLINK SPSS edge expects the descriptors and fifos to be allocated by this processor. The following bindings are required to inform the Loading arch/arm64/boot/dts/qcom/sm8150.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -2659,6 +2659,7 @@ label = "adsp"; qcom,glink-label = "lpass"; cpu-affinity = <1 2>; qcom,adsp_qrtr { qcom,glink-channels = "IPCRTR"; Loading drivers/rpmsg/qcom_glink_native.c +33 −1 Original line number Diff line number Diff line Loading @@ -1799,15 +1799,35 @@ static int qcom_glink_create_chrdev(struct qcom_glink *glink) return rpmsg_chrdev_register_device(rpdev); } static void qcom_glink_set_affinity(struct qcom_glink *glink, u32 *arr, size_t size) { struct cpumask cpumask; int i; cpumask_clear(&cpumask); for (i = 0; i < size; i++) { if (arr[i] < num_possible_cpus()) cpumask_set_cpu(arr[i], &cpumask); } if (irq_set_affinity(glink->irq, &cpumask)) dev_err(glink->dev, "failed to set irq affinity\n"); if (sched_setaffinity(glink->task->pid, &cpumask)) dev_err(glink->dev, "failed to set task affinity\n"); } struct qcom_glink *qcom_glink_native_probe(struct device *dev, unsigned long features, struct qcom_glink_pipe *rx, struct qcom_glink_pipe *tx, bool intentless) { struct qcom_glink *glink; u32 *arr; int size; int irq; int ret; struct qcom_glink *glink; glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL); if (!glink) Loading Loading @@ -1866,6 +1886,18 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev, glink->irq = irq; size = of_property_count_u32_elems(dev->of_node, "cpu-affinity"); if (size > 0) { arr = kmalloc_array(size, sizeof(u32), GFP_KERNEL); if (!arr) return ERR_PTR(-ENOMEM); ret = of_property_read_u32_array(dev->of_node, "cpu-affinity", arr, size); if (!ret) qcom_glink_set_affinity(glink, arr, size); kfree(arr); } ret = qcom_glink_send_version(glink); if (ret) { dev_err(dev, "failed to send version %d\n", ret); Loading Loading
Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt +5 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,11 @@ a GLINK SPSS edge and a SPI based edge. Definition: reference to the "rpm_hlos" mailbox in APCS, as described in mailbox/mailbox.txt - cpu-affinity: Usage: optional Value type: <prop-encoded-array> Definition: cores to pin the irq to = GLINK SPSS The remote proc on a GLINK SPSS edge expects the descriptors and fifos to be allocated by this processor. The following bindings are required to inform the Loading
arch/arm64/boot/dts/qcom/sm8150.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -2659,6 +2659,7 @@ label = "adsp"; qcom,glink-label = "lpass"; cpu-affinity = <1 2>; qcom,adsp_qrtr { qcom,glink-channels = "IPCRTR"; Loading
drivers/rpmsg/qcom_glink_native.c +33 −1 Original line number Diff line number Diff line Loading @@ -1799,15 +1799,35 @@ static int qcom_glink_create_chrdev(struct qcom_glink *glink) return rpmsg_chrdev_register_device(rpdev); } static void qcom_glink_set_affinity(struct qcom_glink *glink, u32 *arr, size_t size) { struct cpumask cpumask; int i; cpumask_clear(&cpumask); for (i = 0; i < size; i++) { if (arr[i] < num_possible_cpus()) cpumask_set_cpu(arr[i], &cpumask); } if (irq_set_affinity(glink->irq, &cpumask)) dev_err(glink->dev, "failed to set irq affinity\n"); if (sched_setaffinity(glink->task->pid, &cpumask)) dev_err(glink->dev, "failed to set task affinity\n"); } struct qcom_glink *qcom_glink_native_probe(struct device *dev, unsigned long features, struct qcom_glink_pipe *rx, struct qcom_glink_pipe *tx, bool intentless) { struct qcom_glink *glink; u32 *arr; int size; int irq; int ret; struct qcom_glink *glink; glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL); if (!glink) Loading Loading @@ -1866,6 +1886,18 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev, glink->irq = irq; size = of_property_count_u32_elems(dev->of_node, "cpu-affinity"); if (size > 0) { arr = kmalloc_array(size, sizeof(u32), GFP_KERNEL); if (!arr) return ERR_PTR(-ENOMEM); ret = of_property_read_u32_array(dev->of_node, "cpu-affinity", arr, size); if (!ret) qcom_glink_set_affinity(glink, arr, size); kfree(arr); } ret = qcom_glink_send_version(glink); if (ret) { dev_err(dev, "failed to send version %d\n", ret); Loading