Skip to content

Commit

Permalink
apps: zynqmp_r5: support for demos without IPI
Browse files Browse the repository at this point in the history
Update remote(r5) of OpenAMP demos so that it can fully support running
with notification mechanism of IPI and Shared memory with polling

Signed-off-by: Ben Levinsky <ben.levinsky@xilinx.com>
  • Loading branch information
Ben Levinsky authored and arnopo committed Oct 20, 2020
1 parent e802f4c commit 0b69670
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 33 deletions.
21 changes: 10 additions & 11 deletions apps/machine/zynqmp_r5/platform_info.c
Expand Up @@ -28,8 +28,8 @@
#include "platform_info.h"
#include "rsc_table.h"

#define IPI_DEV_NAME "ipi_dev"
#define IPI_BUS_NAME "generic"
#define KICK_DEV_NAME "poll_dev"
#define KICK_BUS_NAME "generic"

/* Cortex R5 memory attributes */
#define DEVICE_SHARED 0x00000001U /* device, shareable */
Expand All @@ -53,7 +53,7 @@
/* Polling information used by remoteproc operations.
*/
static metal_phys_addr_t poll_phys_addr = POLL_BASE_ADDR;
struct metal_device poll_device = {
struct metal_device kick_device = {
.name = "poll_dev",
.bus = NULL,
.num_regions = 1,
Expand All @@ -76,8 +76,8 @@ struct metal_device poll_device = {
};

static struct remoteproc_priv rproc_priv = {
.poll_dev_name = IPI_DEV_NAME,
.poll_dev_bus_name = IPI_BUS_NAME,
.kick_dev_name = KICK_DEV_NAME,
.kick_dev_bus_name = KICK_BUS_NAME,
#ifndef RPMSG_NO_IPI
.ipi_chn_mask = IPI_CHN_BITMASK,
#endif /* !RPMSG_NO_IPI */
Expand Down Expand Up @@ -106,12 +106,10 @@ platform_create_proc(int proc_index, int rsc_index)

(void) proc_index;
rsc_table = get_resource_table(rsc_index, &rsc_size);
#ifndef RPMSG_NO_IPI

/* Register IPI device */
ret = metal_register_generic_device(&ipi_device);
if (ret)
return ret;
#endif /* !RPMSG_NO_IPI */
if (metal_register_generic_device(&kick_device))
return NULL;

/* Initialize remoteproc instance */
if (!remoteproc_init(&rproc_inst, &zynqmp_r5_a53_proc_ops, &rproc_priv))
Expand Down Expand Up @@ -241,13 +239,14 @@ int platform_poll(void *priv)
prproc = rproc->priv;
while(1) {
#ifdef RPMSG_NO_IPI
if (metal_io_read32(prproc->poll_io, 0)) {
if (metal_io_read32(prproc->kick_io, 0)) {
ret = remoteproc_get_notification(rproc,
RSC_NOTIFY_ID_ANY);
if (ret)
return ret;
break;
}
(void)flags;
#else /* !RPMSG_NO_IPI */
flags = metal_irq_save_disable();
if (!(atomic_flag_test_and_set(&prproc->ipi_nokick))) {
Expand Down
8 changes: 4 additions & 4 deletions apps/machine/zynqmp_r5/platform_info.h
Expand Up @@ -35,10 +35,10 @@ extern "C" {
#endif /* RPMSG_NO_IPI */

struct remoteproc_priv {
const char *poll_dev_name;
const char *poll_dev_bus_name;
struct metal_device *poll_dev;
struct metal_io_region *poll_io;
const char *kick_dev_name;
const char *kick_dev_bus_name;
struct metal_device *kick_dev;
struct metal_io_region *kick_io;
#ifndef RPMSG_NO_IPI
unsigned int ipi_chn_mask; /**< IPI channel mask */
atomic_int ipi_nokick;
Expand Down
39 changes: 21 additions & 18 deletions apps/machine/zynqmp_r5/zynqmp_r5_a53_rproc.c
Expand Up @@ -44,11 +44,11 @@ static int zynqmp_r5_a53_proc_irq_handler(int vect_id, void *data)
if (!rproc)
return METAL_IRQ_NOT_HANDLED;
prproc = rproc->priv;
ipi_intr_status = (unsigned int)metal_io_read32(prproc->poll_io,
ipi_intr_status = (unsigned int)metal_io_read32(prproc->kick_io,
IPI_ISR_OFFSET);
if (ipi_intr_status & prproc->ipi_chn_mask) {
atomic_flag_clear(&prproc->ipi_nokick);
metal_io_write32(prproc->poll_io, IPI_ISR_OFFSET,
metal_io_write32(prproc->kick_io, IPI_ISR_OFFSET,
prproc->ipi_chn_mask);
return METAL_IRQ_HANDLED;
}
Expand All @@ -61,40 +61,41 @@ zynqmp_r5_a53_proc_init(struct remoteproc *rproc,
struct remoteproc_ops *ops, void *arg)
{
struct remoteproc_priv *prproc = arg;
struct metal_device *poll_dev;
struct metal_device *kick_dev;
unsigned int irq_vect;
int ret;

if (!rproc || !prproc || !ops)
return NULL;
ret = metal_device_open(prproc->poll_dev_bus_name,
prproc->poll_dev_name,
&poll_dev);
ret = metal_device_open(prproc->kick_dev_bus_name,
prproc->kick_dev_name,
&kick_dev);
if (ret) {
xil_printf("failed to open polling device: %d.\r\n", ret);
return NULL;
}
rproc->priv = prproc;
prproc->poll_dev = poll_dev;
prproc->poll_io = metal_device_io_region(poll_dev, 0);
if (!prproc->poll_io)
prproc->kick_dev = kick_dev;
prproc->kick_io = metal_device_io_region(kick_dev, 0);
if (!prproc->kick_io)
goto err1;
#ifndef RPMSG_NO_IPI
atomic_store(&prproc->ipi_nokick, 1);
/* Register interrupt handler and enable interrupt */
irq_vect = (uintptr_t)ipi_dev->irq_info;
irq_vect = (uintptr_t)kick_dev->irq_info;
metal_irq_register(irq_vect, zynqmp_r5_a53_proc_irq_handler, rproc);
metal_irq_enable(irq_vect);
metal_io_write32(prproc->poll_io, IPI_IER_OFFSET,
metal_io_write32(prproc->kick_io, IPI_IER_OFFSET,
prproc->ipi_chn_mask);
#else
metal_io_write32(prproc->poll_io, 0, !POLL_STOP);
(void)irq_vect;
metal_io_write32(prproc->kick_io, 0, !POLL_STOP);
#endif /* !RPMSG_NO_IPI */
rproc->ops = ops;

return rproc;
err1:
metal_device_close(poll_dev);
metal_device_close(kick_dev);
return NULL;
}

Expand All @@ -107,15 +108,17 @@ static void zynqmp_r5_a53_proc_remove(struct remoteproc *rproc)
return;
prproc = rproc->priv;
#ifndef RPMSG_NO_IPI
metal_io_write32(prproc->poll_io, IPI_IDR_OFFSET,
metal_io_write32(prproc->kick_io, IPI_IDR_OFFSET,
prproc->ipi_chn_mask);
dev = prproc->poll_dev;
dev = prproc->kick_dev;
if (dev) {
metal_irq_disable((uintptr_t)dev->irq_info);
metal_irq_unregister((uintptr_t)dev->irq_info);
}
#else /* RPMSG_NO_IPI */
(void)dev;
#endif /* !RPMSG_NO_IPI */
metal_device_close(prproc->poll_dev);
metal_device_close(prproc->kick_dev);
}

static void *
Expand Down Expand Up @@ -169,9 +172,9 @@ static int zynqmp_r5_a53_proc_notify(struct remoteproc *rproc, uint32_t id)
prproc = rproc->priv;

#ifdef RPMSG_NO_IPI
metal_io_write32(prproc->poll_io, 0, POLL_STOP);
metal_io_write32(prproc->kick_io, 0, POLL_STOP);
#else
metal_io_write32(prproc->poll_io, IPI_TRIG_OFFSET,
metal_io_write32(prproc->kick_io, IPI_TRIG_OFFSET,
prproc->ipi_chn_mask);
#endif /* RPMSG_NO_IPI */
return 0;
Expand Down

0 comments on commit 0b69670

Please sign in to comment.