diff --git a/lib/remoteproc/drivers/zynqmp_remoteproc_a53.c b/lib/remoteproc/drivers/zynqmp_remoteproc_a53.c
index 92a7fa1b7bebb7fc6069767eb8ff06c10ab74c64..c36840fadf179a74de29c1be45e985a1a4fd3c03 100644 (file)
struct metal_io_region *io;
metal_phys_addr_t paddr;
uint32_t ipi_chn_mask;
- int need_reg;
+ int registered;
atomic_int sync;
};
/*--------------------------- Declare Functions ------------------------ */
-static int _enable_interrupt(struct proc_vring *vring_hw);
+static int _enable_interrupt(struct proc_intr *intr);
static void _notify(struct hil_proc *proc, struct proc_intr *intr_info);
static int _boot_cpu(struct hil_proc *proc, unsigned int load_addr);
static void _shutdown_cpu(struct hil_proc *proc);
int _ipi_handler(int vect_id, void *data)
{
- (void) vect_id;
- struct proc_vring *vring_hw = (struct proc_vring *)(data);
- struct ipi_info *ipi =
- (struct ipi_info *)(vring_hw->intr_info.data);
+ struct proc_intr *intr = data;
+ struct ipi_info *ipi = intr->data;
struct metal_io_region *io = ipi->io;
unsigned int ipi_intr_status =
(unsigned int)metal_io_read32(io, IPI_ISR_OFFSET);
+
+ (void) vect_id;
+
if (ipi_intr_status & ipi->ipi_chn_mask) {
atomic_flag_clear(&ipi->sync);
metal_io_write32(io, IPI_ISR_OFFSET,
return -1;
}
-static int _enable_interrupt(struct proc_vring *vring_hw)
+static int _enable_interrupt(struct proc_intr *intr)
{
struct ipi_info *ipi =
- (struct ipi_info *)(vring_hw->intr_info.data);
+ (struct ipi_info *)(intr->data);
struct metal_io_region *io = ipi->io;
- if (!ipi->need_reg) {
+ if (ipi->registered) {
return 0;
}
/* Register ISR */
- metal_irq_register(vring_hw->intr_info.vect_id, _ipi_handler,
- vring_hw->intr_info.dev, vring_hw);
+ metal_irq_register(intr->vect_id, _ipi_handler,
+ intr->dev, intr);
/* Enable IPI interrupt */
- metal_irq_enable(vring_hw->intr_info.vect_id);
+ metal_irq_enable(intr->vect_id);
metal_io_write32(io, IPI_IER_OFFSET, ipi->ipi_chn_mask);
+ ipi->registered = 1;
return 0;
}
int ret;
struct proc_intr *intr_info;
struct ipi_info *ipi;
- unsigned int ipi_intr_status;
- int i;
if (!proc)
return -1;
- for (i = 0; i < HIL_MAX_NUM_VRINGS; i++) {
- intr_info = &(proc->vdev.vring_info[i].intr_info);
- ipi = intr_info->data;
-
- if (ipi && ipi->name && ipi->bus_name) {
- ret = metal_device_open(ipi->bus_name, ipi->name,
- &ipi->dev);
- if (ret)
- return -ENODEV;
- ipi->io = metal_device_io_region(ipi->dev, 0);
- } else if (ipi->paddr) {
- ipi->io = metal_allocate_memory(
- sizeof(struct metal_io_region));
- if (!ipi->io)
- goto error;
- metal_io_init(ipi->io, (void *)ipi->paddr,
- &ipi->paddr, 0x1000,
- (unsigned)(-1),
- METAL_UNCACHED | METAL_IO_MAPPED,
- NULL);
- }
+ intr_info = &(proc->vdev.intr_info);
+ ipi = intr_info->data;
+
+ if (ipi && ipi->name && ipi->bus_name) {
+ ret = metal_device_open(ipi->bus_name, ipi->name,
+ &ipi->dev);
+ if (ret)
+ return -ENODEV;
+ ipi->io = metal_device_io_region(ipi->dev, 0);
+ } else if (ipi->paddr) {
+ ipi->io = metal_allocate_memory(
+ sizeof(struct metal_io_region));
+ if (!ipi->io)
+ goto error;
+ metal_io_init(ipi->io, (void *)ipi->paddr,
+ &ipi->paddr, 0x1000,
+ (unsigned)(-1),
+ METAL_UNCACHED | METAL_IO_MAPPED,
+ NULL);
+ }
- if (ipi->io) {
- ipi_intr_status = (unsigned int)metal_io_read32(
- ipi->io, IPI_ISR_OFFSET);
- if (ipi_intr_status & ipi->ipi_chn_mask)
- metal_io_write32(ipi->io, IPI_ISR_OFFSET,
- ipi->ipi_chn_mask);
- metal_io_write32(ipi->io, IPI_IDR_OFFSET,
- ipi->ipi_chn_mask);
- atomic_store(&ipi->sync, 1);
- }
+ if (ipi->io) {
+ metal_io_write32(ipi->io, IPI_IDR_OFFSET,
+ ipi->ipi_chn_mask);
+ atomic_store(&ipi->sync, 1);
}
+ ipi->registered = 0;
return 0;
error:
static void _release(struct hil_proc *proc)
{
- int i;
struct proc_intr *intr_info;
struct ipi_info *ipi;
if (!proc)
return;
- for (i = 0; i < HIL_MAX_NUM_VRINGS; i++) {
- intr_info = &(proc->vdev.vring_info[1].intr_info);
- ipi = (struct ipi_info *)(intr_info->data);
- if (ipi) {
- if (ipi->io) {
- metal_io_write32(ipi->io, IPI_IDR_OFFSET,
- ipi->ipi_chn_mask);
- if (ipi->dev) {
- metal_device_close(ipi->dev);
- ipi->dev = NULL;
- } else {
- metal_free_memory(ipi->io);
- }
- ipi->io = NULL;
+ intr_info = &(proc->vdev.intr_info);
+ ipi = (struct ipi_info *)(intr_info->data);
+ if (ipi) {
+ if (ipi->io) {
+ metal_io_write32(ipi->io, IPI_IDR_OFFSET,
+ ipi->ipi_chn_mask);
+ if (ipi->dev) {
+ metal_device_close(ipi->dev);
+ ipi->dev = NULL;
+ } else {
+ metal_free_memory(ipi->io);
}
+ ipi->io = NULL;
}
-
}
+
}