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:
commit
111857421c
@ -144,8 +144,8 @@ examples:
|
|||||||
|
|
||||||
interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
|
interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
|
||||||
<&smp2p_adsp_in 0 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 1 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<&smp2p_adsp_in 2 IRQ_TYPE_EDGE_RISING>,
|
||||||
<&smp2p_adsp_in 3 IRQ_TYPE_EDGE_RISING>;
|
<&smp2p_adsp_in 3 IRQ_TYPE_EDGE_RISING>;
|
||||||
interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack";
|
interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack";
|
||||||
|
|
||||||
|
@ -15,17 +15,26 @@ description:
|
|||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
oneOf:
|
||||||
- qcom,sc8180x-adsp-pas
|
- items:
|
||||||
- qcom,sc8180x-cdsp-pas
|
- enum:
|
||||||
- qcom,sc8180x-slpi-pas
|
- qcom,qcs615-adsp-pas
|
||||||
- qcom,sm8150-adsp-pas
|
- const: qcom,sm8150-adsp-pas
|
||||||
- qcom,sm8150-cdsp-pas
|
- items:
|
||||||
- qcom,sm8150-mpss-pas
|
- enum:
|
||||||
- qcom,sm8150-slpi-pas
|
- qcom,qcs615-cdsp-pas
|
||||||
- qcom,sm8250-adsp-pas
|
- const: qcom,sm8150-cdsp-pas
|
||||||
- qcom,sm8250-cdsp-pas
|
- enum:
|
||||||
- qcom,sm8250-slpi-pas
|
- 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:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
@ -62,16 +71,17 @@ allOf:
|
|||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
contains:
|
||||||
- qcom,sc8180x-adsp-pas
|
enum:
|
||||||
- qcom,sc8180x-cdsp-pas
|
- qcom,sc8180x-adsp-pas
|
||||||
- qcom,sc8180x-slpi-pas
|
- qcom,sc8180x-cdsp-pas
|
||||||
- qcom,sm8150-adsp-pas
|
- qcom,sc8180x-slpi-pas
|
||||||
- qcom,sm8150-cdsp-pas
|
- qcom,sm8150-adsp-pas
|
||||||
- qcom,sm8150-slpi-pas
|
- qcom,sm8150-cdsp-pas
|
||||||
- qcom,sm8250-adsp-pas
|
- qcom,sm8150-slpi-pas
|
||||||
- qcom,sm8250-cdsp-pas
|
- qcom,sm8250-adsp-pas
|
||||||
- qcom,sm8250-slpi-pas
|
- qcom,sm8250-cdsp-pas
|
||||||
|
- qcom,sm8250-slpi-pas
|
||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
@ -88,12 +98,13 @@ allOf:
|
|||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
contains:
|
||||||
- qcom,sc8180x-adsp-pas
|
enum:
|
||||||
- qcom,sc8180x-cdsp-pas
|
- qcom,sc8180x-adsp-pas
|
||||||
- qcom,sm8150-adsp-pas
|
- qcom,sc8180x-cdsp-pas
|
||||||
- qcom,sm8150-cdsp-pas
|
- qcom,sm8150-adsp-pas
|
||||||
- qcom,sm8250-cdsp-pas
|
- qcom,sm8150-cdsp-pas
|
||||||
|
- qcom,sm8250-cdsp-pas
|
||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
power-domains:
|
power-domains:
|
||||||
|
@ -214,7 +214,7 @@ config QCOM_Q6V5_MSS
|
|||||||
handled by QCOM_Q6V5_PAS driver.
|
handled by QCOM_Q6V5_PAS driver.
|
||||||
|
|
||||||
config QCOM_Q6V5_PAS
|
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 OF && ARCH_QCOM
|
||||||
depends on QCOM_SMEM
|
depends on QCOM_SMEM
|
||||||
depends on RPMSG_QCOM_SMD || RPMSG_QCOM_SMD=n
|
depends on RPMSG_QCOM_SMD || RPMSG_QCOM_SMD=n
|
||||||
@ -229,11 +229,10 @@ config QCOM_Q6V5_PAS
|
|||||||
select QCOM_RPROC_COMMON
|
select QCOM_RPROC_COMMON
|
||||||
select QCOM_SCM
|
select QCOM_SCM
|
||||||
help
|
help
|
||||||
Say y here to support the TrustZone based Peripheral Image Loader
|
Say y here to support the TrustZone based Peripheral Image Loader for
|
||||||
for the Qualcomm Hexagon v5 based remote processors. This is commonly
|
the Qualcomm remote processors. This is commonly used to control
|
||||||
used to control subsystems such as ADSP (Audio DSP),
|
subsystems such as ADSP (Audio DSP), CDSP (Compute DSP), MPSS (Modem
|
||||||
CDSP (Compute DSP), MPSS (Modem Peripheral SubSystem), and
|
Peripheral SubSystem), and SLPI (Sensor Low Power Island).
|
||||||
SLPI (Sensor Low Power Island).
|
|
||||||
|
|
||||||
config QCOM_Q6V5_WCSS
|
config QCOM_Q6V5_WCSS
|
||||||
tristate "Qualcomm Hexagon based WCSS Peripheral Image Loader"
|
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].dev_addr = data->mems[i].dev_addr;
|
||||||
oproc->mem[i].size = resource_size(res);
|
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,
|
data->mems[i].name, &oproc->mem[i].bus_addr,
|
||||||
oproc->mem[i].size, oproc->mem[i].cpu_addr,
|
oproc->mem[i].size, oproc->mem[i].cpu_addr,
|
||||||
oproc->mem[i].dev_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].pa = res->start;
|
||||||
pru->mem_regions[i].size = resource_size(res);
|
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,
|
mem_names[i], &pru->mem_regions[i].pa,
|
||||||
pru->mem_regions[i].size, pru->mem_regions[i].va);
|
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;
|
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);
|
va, &dma, mem->len);
|
||||||
|
|
||||||
if (mem->da != FW_RSC_ADDR_ANY && !rproc->domain) {
|
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);
|
size = vring_size(num, rvring->align);
|
||||||
memset(addr, 0, size);
|
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);
|
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);
|
da, len, va);
|
||||||
|
|
||||||
return 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].dev_addr = data->mems[i].dev_addr;
|
||||||
kproc->mem[i].size = resource_size(res);
|
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,
|
data->mems[i].name, &kproc->mem[i].bus_addr,
|
||||||
kproc->mem[i].size, kproc->mem[i].cpu_addr,
|
kproc->mem[i].size, kproc->mem[i].cpu_addr,
|
||||||
kproc->mem[i].dev_addr);
|
kproc->mem[i].dev_addr);
|
||||||
@ -528,7 +528,7 @@ int k3_reserved_mem_init(struct k3_rproc *kproc)
|
|||||||
return -ENOMEM;
|
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,
|
i + 1, &kproc->rmem[i].bus_addr,
|
||||||
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
|
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
|
||||||
kproc->rmem[i].dev_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;
|
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,
|
i, &core->sram[i].bus_addr,
|
||||||
core->sram[i].size, core->sram[i].cpu_addr,
|
core->sram[i].size, core->sram[i].cpu_addr,
|
||||||
core->sram[i].dev_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
|
* @rx_mc_buf: to copy data from mailbox rx channel
|
||||||
* @tx_mc_buf: to copy data to mailbox tx 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.
|
* Platform specific data structure used to sync resource table address.
|
||||||
* It's important to maintain order and size of each field on remote side.
|
* 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
|
* @rsc_tbl_va: resource table virtual address
|
||||||
* @sram: Array of sram memories assigned to this core
|
* @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
|
* @dev: r5f subsystem cluster device node
|
||||||
* @mode: cluster mode of type zynqmp_r5_cluster_mode
|
* @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
|
* adds carveouts for TCM bank and reserved memory regions
|
||||||
*
|
*
|
||||||
* @rproc: Device node of each rproc
|
* @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
|
* Turns off TCM banks using power-domain id
|
||||||
*
|
*
|
||||||
* @rproc: Device node of each rproc
|
* @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
|
* Allocate and add struct rproc object for each r5f core
|
||||||
* This is called for each individual 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);
|
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_rproc->auto_boot = false;
|
||||||
r5_core = r5_rproc->priv;
|
r5_core = r5_rproc->priv;
|
||||||
r5_core->dev = cdev;
|
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
|
* Ideally this function should parse tcm node and store information
|
||||||
* in r5_core instance. For now, Hardcoded TCM information is used.
|
* in r5_core instance. For now, Hardcoded TCM information is used.
|
||||||
* This approach is used as TCM bindings for system-dt is being developed
|
* 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
|
* Number of cores is decided by number of child nodes of
|
||||||
* r5f subsystem node in dts. If Split mode is used in dts
|
* r5f subsystem node in dts.
|
||||||
* 2 child nodes are expected.
|
* 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,
|
* In lockstep mode if two child nodes are available,
|
||||||
* only use first child node and consider it as core0
|
* only use first child node and consider it as core0
|
||||||
* and ignore core1 dt node.
|
* and ignore core1 dt node.
|
||||||
*/
|
*/
|
||||||
core_count = of_get_available_child_count(dev_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);
|
dev_err(dev, "Invalid number of r5 cores %d", core_count);
|
||||||
return -EINVAL;
|
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) {
|
} else if (cluster_mode == LOCKSTEP_MODE && core_count == 2) {
|
||||||
dev_warn(dev, "Only r5 core0 will be used\n");
|
dev_warn(dev, "Only r5 core0 will be used\n");
|
||||||
core_count = 1;
|
core_count = 1;
|
||||||
@ -1463,6 +1469,45 @@ static void zynqmp_r5_cluster_exit(void *data)
|
|||||||
platform_set_drvdata(pdev, NULL);
|
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()
|
* zynqmp_r5_remoteproc_probe()
|
||||||
* parse device-tree, initialize hardware and allocate required resources
|
* 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",
|
.name = "zynqmp_r5_remoteproc",
|
||||||
.of_match_table = zynqmp_r5_remoteproc_match,
|
.of_match_table = zynqmp_r5_remoteproc_match,
|
||||||
},
|
},
|
||||||
|
.shutdown = zynqmp_r5_remoteproc_shutdown,
|
||||||
};
|
};
|
||||||
module_platform_driver(zynqmp_r5_remoteproc_driver);
|
module_platform_driver(zynqmp_r5_remoteproc_driver);
|
||||||
|
|
||||||
|
@ -901,7 +901,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
|
|||||||
goto vqs_del;
|
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);
|
bufs_va, &vrp->bufs_dma);
|
||||||
|
|
||||||
/* half of the buffers is dedicated for RX */
|
/* half of the buffers is dedicated for RX */
|
||||||
|
Loading…
Reference in New Issue
Block a user