2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

remoteproc updates for v6.17

Make the Xilinx remoteproc driver support running on only a single core,
 disable still unsupported remoteproc features, and stop the remoteproc
 on shutdown to facilitate kexec.
 
 Conclude the renaming of the Qualcomm ADSP driver to "PAS" that was
 started many years ago.
 -----BEGIN PGP SIGNATURE-----
 
 iQJJBAABCAAzFiEEBd4DzF816k8JZtUlCx85Pw2ZrcUFAmiNGowVHGFuZGVyc3Nv
 bkBrZXJuZWwub3JnAAoJEAsfOT8Nma3FUYYQAKByyveRNeRaOKYcbHCLUsGwVZ5A
 4JIXqIrHcIjPgcPNLvCudhz8n+Bp5pNxNEu03yDaSu5QkHz2gDEYZ83ZIvFeKiax
 cd3r/DtdnlHKRArJlx6un9lhi3veXOwbyE7GA6lPZ/jKz4usqbSGX3aSAeAK0g2D
 DiMISRMfBeHUl9cXtawL5lQSKl7GELJq2gz2+mY1mUivhplzSIgcIrQuF6w1pFNt
 20Sad5jhgOm0ELMNuLY7YuWYKon56OUwjF5T0wZetpwHmvJ/vv18Z1CLwSm9iwaG
 T3IXLFL1ED28sdCT3cfpbxnp6S7pn1MhzNYVYN6RImlZmtAz9YW5zJrj4EwVu0Bk
 K4e+UC2BkechT7lOxjFL5qhsZpkUrQZXccTf3fARn0GeCBlyfjTRMp3He8wJLDx1
 FemCM7OXSc2OXnAm2231BxHu2T0MRY5Z3ozPJEeg0M3hj5oaWBflctp+puOoBwBe
 g4VcY8yQ3qAzfts7RgyB9gjRQ8KhJ6FABmZZv2RVTtdjsH3Sa1MLB3T+PzvNW2z4
 L9/t4cIvp4xMXKztJVzVsaHAPw2P/ZRIo+Xfg6AgIvZ0ebM9ZSTe2rGHX/2tE14o
 FWEUs7g58RE5NcJIqqyDaIfBrgvG8HQiLOf37uZDboCFV/Z4RP8Z6pHa8+YyiDvB
 8LtKweBQGD/MmgcC
 =yhyx
 -----END PGP SIGNATURE-----

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

Pull remoteproc updates from Bjorn Andersson:

 - Make the Xilinx remoteproc driver support running on only a single
   core, disable still unsupported remoteproc features, and stop the
   remoteproc on shutdown to facilitate kexec.

 - Conclude the renaming of the Qualcomm ADSP driver to "PAS" that was
   started many years ago.

* tag 'rproc-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux:
  remoteproc: xlnx: Fix kernel-doc warnings
  remoteproc: xlnx: Disable unsupported features
  remoteproc: xlnx: Add shutdown callback
  remoteproc: xlnx: Allow single core use in split mode
  dt-bindings: remoteproc: qcom,sa8775p-pas: Correct the interrupt number
  remoteproc: Don't use %pK through printk
  dt-bindings: remoteproc: qcom,sm8150-pas: Document QCS615 remoteproc
  remoteproc: qcom: pas: Conclude the rename from adsp
This commit is contained in:
Linus Torvalds 2025-08-01 15:02:25 -07:00
commit 111857421c
13 changed files with 418 additions and 367 deletions

View File

@ -144,8 +144,8 @@ examples:
interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
<&smp2p_adsp_in 0 IRQ_TYPE_EDGE_RISING>,
<&smp2p_adsp_in 2 IRQ_TYPE_EDGE_RISING>,
<&smp2p_adsp_in 1 IRQ_TYPE_EDGE_RISING>,
<&smp2p_adsp_in 2 IRQ_TYPE_EDGE_RISING>,
<&smp2p_adsp_in 3 IRQ_TYPE_EDGE_RISING>;
interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack";

View File

@ -15,7 +15,16 @@ description:
properties:
compatible:
enum:
oneOf:
- items:
- enum:
- qcom,qcs615-adsp-pas
- const: qcom,sm8150-adsp-pas
- items:
- enum:
- qcom,qcs615-cdsp-pas
- const: qcom,sm8150-cdsp-pas
- enum:
- qcom,sc8180x-adsp-pas
- qcom,sc8180x-cdsp-pas
- qcom,sc8180x-slpi-pas
@ -62,6 +71,7 @@ allOf:
- if:
properties:
compatible:
contains:
enum:
- qcom,sc8180x-adsp-pas
- qcom,sc8180x-cdsp-pas
@ -88,6 +98,7 @@ allOf:
- if:
properties:
compatible:
contains:
enum:
- qcom,sc8180x-adsp-pas
- qcom,sc8180x-cdsp-pas

View File

@ -214,7 +214,7 @@ config QCOM_Q6V5_MSS
handled by QCOM_Q6V5_PAS driver.
config QCOM_Q6V5_PAS
tristate "Qualcomm Hexagon v5 Peripheral Authentication Service support"
tristate "Qualcomm Peripheral Authentication Service support"
depends on OF && ARCH_QCOM
depends on QCOM_SMEM
depends on RPMSG_QCOM_SMD || RPMSG_QCOM_SMD=n
@ -229,11 +229,10 @@ config QCOM_Q6V5_PAS
select QCOM_RPROC_COMMON
select QCOM_SCM
help
Say y here to support the TrustZone based Peripheral Image Loader
for the Qualcomm Hexagon v5 based remote processors. This is commonly
used to control subsystems such as ADSP (Audio DSP),
CDSP (Compute DSP), MPSS (Modem Peripheral SubSystem), and
SLPI (Sensor Low Power Island).
Say y here to support the TrustZone based Peripheral Image Loader for
the Qualcomm remote processors. This is commonly used to control
subsystems such as ADSP (Audio DSP), CDSP (Compute DSP), MPSS (Modem
Peripheral SubSystem), and SLPI (Sensor Low Power Island).
config QCOM_Q6V5_WCSS
tristate "Qualcomm Hexagon based WCSS Peripheral Image Loader"

View File

@ -1211,7 +1211,7 @@ static int omap_rproc_of_get_internal_memories(struct platform_device *pdev,
oproc->mem[i].dev_addr = data->mems[i].dev_addr;
oproc->mem[i].size = resource_size(res);
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%x va %pK da 0x%x\n",
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%x va %p da 0x%x\n",
data->mems[i].name, &oproc->mem[i].bus_addr,
oproc->mem[i].size, oproc->mem[i].cpu_addr,
oproc->mem[i].dev_addr);

View File

@ -1055,7 +1055,7 @@ static int pru_rproc_probe(struct platform_device *pdev)
pru->mem_regions[i].pa = res->start;
pru->mem_regions[i].size = resource_size(res);
dev_dbg(dev, "memory %8s: pa %pa size 0x%zx va %pK\n",
dev_dbg(dev, "memory %8s: pa %pa size 0x%zx va %p\n",
mem_names[i], &pru->mem_regions[i].pa,
pru->mem_regions[i].size, pru->mem_regions[i].va);
}

File diff suppressed because it is too large Load Diff

View File

@ -699,7 +699,7 @@ static int rproc_alloc_carveout(struct rproc *rproc,
return -ENOMEM;
}
dev_dbg(dev, "carveout va %pK, dma %pad, len 0x%zx\n",
dev_dbg(dev, "carveout va %p, dma %pad, len 0x%zx\n",
va, &dma, mem->len);
if (mem->da != FW_RSC_ADDR_ANY && !rproc->domain) {

View File

@ -136,7 +136,7 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
size = vring_size(num, rvring->align);
memset(addr, 0, size);
dev_dbg(dev, "vring%d: va %pK qsz %d notifyid %d\n",
dev_dbg(dev, "vring%d: va %p qsz %d notifyid %d\n",
id, addr, num, rvring->notifyid);
/*

View File

@ -190,7 +190,7 @@ static void *slim_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *
}
}
dev_dbg(&rproc->dev, "da = 0x%llx len = 0x%zx va = 0x%pK\n",
dev_dbg(&rproc->dev, "da = 0x%llx len = 0x%zx va = 0x%p\n",
da, len, va);
return va;

View File

@ -450,7 +450,7 @@ int k3_rproc_of_get_memories(struct platform_device *pdev,
kproc->mem[i].dev_addr = data->mems[i].dev_addr;
kproc->mem[i].size = resource_size(res);
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %pK da 0x%x\n",
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %p da 0x%x\n",
data->mems[i].name, &kproc->mem[i].bus_addr,
kproc->mem[i].size, kproc->mem[i].cpu_addr,
kproc->mem[i].dev_addr);
@ -528,7 +528,7 @@ int k3_reserved_mem_init(struct k3_rproc *kproc)
return -ENOMEM;
}
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %p da 0x%x\n",
i + 1, &kproc->rmem[i].bus_addr,
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
kproc->rmem[i].dev_addr);

View File

@ -1007,7 +1007,7 @@ static int k3_r5_core_of_get_sram_memories(struct platform_device *pdev,
return -ENOMEM;
}
dev_dbg(dev, "memory sram%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
dev_dbg(dev, "memory sram%d: bus addr %pa size 0x%zx va %p da 0x%x\n",
i, &core->sram[i].bus_addr,
core->sram[i].size, core->sram[i].cpu_addr,
core->sram[i].dev_addr);

View File

@ -68,7 +68,7 @@ struct zynqmp_sram_bank {
};
/**
* struct mbox_info
* struct mbox_info - mailbox channel data
*
* @rx_mc_buf: to copy data from mailbox rx channel
* @tx_mc_buf: to copy data to mailbox tx channel
@ -89,7 +89,7 @@ struct mbox_info {
};
/**
* struct rsc_tbl_data
* struct rsc_tbl_data - resource table metadata
*
* Platform specific data structure used to sync resource table address.
* It's important to maintain order and size of each field on remote side.
@ -128,7 +128,7 @@ static const struct mem_bank_data zynqmp_tcm_banks_lockstep[] = {
};
/**
* struct zynqmp_r5_core
* struct zynqmp_r5_core - remoteproc core's internal data
*
* @rsc_tbl_va: resource table virtual address
* @sram: Array of sram memories assigned to this core
@ -157,7 +157,7 @@ struct zynqmp_r5_core {
};
/**
* struct zynqmp_r5_cluster
* struct zynqmp_r5_cluster - remoteproc cluster's internal data
*
* @dev: r5f subsystem cluster device node
* @mode: cluster mode of type zynqmp_r5_cluster_mode
@ -732,7 +732,7 @@ static int zynqmp_r5_parse_fw(struct rproc *rproc, const struct firmware *fw)
}
/**
* zynqmp_r5_rproc_prepare()
* zynqmp_r5_rproc_prepare() - prepare core to boot/attach
* adds carveouts for TCM bank and reserved memory regions
*
* @rproc: Device node of each rproc
@ -765,7 +765,7 @@ static int zynqmp_r5_rproc_prepare(struct rproc *rproc)
}
/**
* zynqmp_r5_rproc_unprepare()
* zynqmp_r5_rproc_unprepare() - programming sequence after stop/detach.
* Turns off TCM banks using power-domain id
*
* @rproc: Device node of each rproc
@ -908,7 +908,7 @@ static const struct rproc_ops zynqmp_r5_rproc_ops = {
};
/**
* zynqmp_r5_add_rproc_core()
* zynqmp_r5_add_rproc_core() - Add core data to framework.
* Allocate and add struct rproc object for each r5f core
* This is called for each individual r5f core
*
@ -938,6 +938,8 @@ static struct zynqmp_r5_core *zynqmp_r5_add_rproc_core(struct device *cdev)
rproc_coredump_set_elf_info(r5_rproc, ELFCLASS32, EM_ARM);
r5_rproc->recovery_disabled = true;
r5_rproc->has_iommu = false;
r5_rproc->auto_boot = false;
r5_core = r5_rproc->priv;
r5_core->dev = cdev;
@ -1142,7 +1144,7 @@ static int zynqmp_r5_get_tcm_node_from_dt(struct zynqmp_r5_cluster *cluster)
}
/**
* zynqmp_r5_get_tcm_node()
* zynqmp_r5_get_tcm_node() - Get TCM info
* Ideally this function should parse tcm node and store information
* in r5_core instance. For now, Hardcoded TCM information is used.
* This approach is used as TCM bindings for system-dt is being developed
@ -1329,19 +1331,23 @@ static int zynqmp_r5_cluster_init(struct zynqmp_r5_cluster *cluster)
/*
* Number of cores is decided by number of child nodes of
* r5f subsystem node in dts. If Split mode is used in dts
* 2 child nodes are expected.
* r5f subsystem node in dts.
* In split mode maximum two child nodes are expected.
* However, only single core can be enabled too.
* Driver can handle following configuration in split mode:
* 1) core0 enabled, core1 disabled
* 2) core0 disabled, core1 enabled
* 3) core0 and core1 both are enabled.
* For now, no more than two cores are expected per cluster
* in split mode.
* In lockstep mode if two child nodes are available,
* only use first child node and consider it as core0
* and ignore core1 dt node.
*/
core_count = of_get_available_child_count(dev_node);
if (core_count == 0) {
if (core_count == 0 || core_count > 2) {
dev_err(dev, "Invalid number of r5 cores %d", core_count);
return -EINVAL;
} else if (cluster_mode == SPLIT_MODE && core_count != 2) {
dev_err(dev, "Invalid number of r5 cores for split mode\n");
return -EINVAL;
} else if (cluster_mode == LOCKSTEP_MODE && core_count == 2) {
dev_warn(dev, "Only r5 core0 will be used\n");
core_count = 1;
@ -1463,6 +1469,45 @@ static void zynqmp_r5_cluster_exit(void *data)
platform_set_drvdata(pdev, NULL);
}
/*
* zynqmp_r5_remoteproc_shutdown()
* Follow shutdown sequence in case of kexec call.
*
* @pdev: domain platform device for cluster
*
* Return: None.
*/
static void zynqmp_r5_remoteproc_shutdown(struct platform_device *pdev)
{
const char *rproc_state_str = NULL;
struct zynqmp_r5_cluster *cluster;
struct zynqmp_r5_core *r5_core;
struct rproc *rproc;
int i, ret = 0;
cluster = platform_get_drvdata(pdev);
for (i = 0; i < cluster->core_count; i++) {
r5_core = cluster->r5_cores[i];
rproc = r5_core->rproc;
if (rproc->state == RPROC_RUNNING) {
ret = rproc_shutdown(rproc);
rproc_state_str = "shutdown";
} else if (rproc->state == RPROC_ATTACHED) {
ret = rproc_detach(rproc);
rproc_state_str = "detach";
} else {
ret = 0;
}
if (ret) {
dev_err(cluster->dev, "failed to %s rproc %d\n",
rproc_state_str, rproc->index);
}
}
}
/*
* zynqmp_r5_remoteproc_probe()
* parse device-tree, initialize hardware and allocate required resources
@ -1524,6 +1569,7 @@ static struct platform_driver zynqmp_r5_remoteproc_driver = {
.name = "zynqmp_r5_remoteproc",
.of_match_table = zynqmp_r5_remoteproc_match,
},
.shutdown = zynqmp_r5_remoteproc_shutdown,
};
module_platform_driver(zynqmp_r5_remoteproc_driver);

View File

@ -901,7 +901,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
goto vqs_del;
}
dev_dbg(&vdev->dev, "buffers: va %pK, dma %pad\n",
dev_dbg(&vdev->dev, "buffers: va %p, dma %pad\n",
bufs_va, &vrp->bufs_dma);
/* half of the buffers is dedicated for RX */