mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
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:
@@ -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";
|
||||
|
||||
|
||||
@@ -15,17 +15,26 @@ description:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sc8180x-adsp-pas
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sc8180x-slpi-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-mpss-pas
|
||||
- qcom,sm8150-slpi-pas
|
||||
- qcom,sm8250-adsp-pas
|
||||
- qcom,sm8250-cdsp-pas
|
||||
- qcom,sm8250-slpi-pas
|
||||
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
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-mpss-pas
|
||||
- qcom,sm8150-slpi-pas
|
||||
- qcom,sm8250-adsp-pas
|
||||
- qcom,sm8250-cdsp-pas
|
||||
- qcom,sm8250-slpi-pas
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@@ -62,16 +71,17 @@ allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sc8180x-adsp-pas
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sc8180x-slpi-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-slpi-pas
|
||||
- qcom,sm8250-adsp-pas
|
||||
- qcom,sm8250-cdsp-pas
|
||||
- qcom,sm8250-slpi-pas
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sc8180x-adsp-pas
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sc8180x-slpi-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-slpi-pas
|
||||
- qcom,sm8250-adsp-pas
|
||||
- qcom,sm8250-cdsp-pas
|
||||
- qcom,sm8250-slpi-pas
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
@@ -88,12 +98,13 @@ allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sc8180x-adsp-pas
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8250-cdsp-pas
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sc8180x-adsp-pas
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8250-cdsp-pas
|
||||
then:
|
||||
properties:
|
||||
power-domains:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
/*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user