aboutsummaryrefslogtreecommitdiff
path: root/applications/message_handler_openamp/remoteproc.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'applications/message_handler_openamp/remoteproc.hpp')
-rw-r--r--applications/message_handler_openamp/remoteproc.hpp85
1 files changed, 48 insertions, 37 deletions
diff --git a/applications/message_handler_openamp/remoteproc.hpp b/applications/message_handler_openamp/remoteproc.hpp
index eec7b44..090a3ea 100644
--- a/applications/message_handler_openamp/remoteproc.hpp
+++ b/applications/message_handler_openamp/remoteproc.hpp
@@ -1,6 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
- *
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
@@ -36,13 +35,47 @@
* Resource table
*****************************************************************************/
+static constexpr uint32_t RSC_MAPPING = RSC_VENDOR_START + 1;
+
+/**
+ * struct fw_rsc_map_range - memory map range
+ * @da: Start device address of the memory address range
+ * @pa: Start physical address of the memory address range
+ * @len: length of memory address range
+ *
+ * Memory range to translate between physical and device addresses.
+ */
+METAL_PACKED_BEGIN
+struct fw_rsc_map_range {
+ uint32_t da;
+ uint32_t pa;
+ uint32_t len;
+} METAL_PACKED_END;
+
+/**
+ * struct fw_rsc_mapping - memory map for address translation
+ * @type: RSC_MAPPING
+ * @num_ranges: Number of ranges in the memory map
+ * @range: Array of the ranges in the memory map
+ *
+ * This resource entry requests the host to provide information for how to
+ * translate between physical and device addresses.
+ */
+METAL_PACKED_BEGIN
+struct fw_rsc_mapping {
+ uint32_t type;
+ uint8_t num_ranges;
+ struct fw_rsc_map_range range[0];
+} METAL_PACKED_END;
+
struct ResourceTable {
static constexpr uint32_t VERSION = 1;
#if defined(REMOTEPROC_TRACE_BUFFER)
- static constexpr uint32_t NUM_RESOURCES = 3;
+ static constexpr uint32_t NUM_RESOURCES = 4;
#else
- static constexpr uint32_t NUM_RESOURCES = 2;
+ static constexpr uint32_t NUM_RESOURCES = 3;
#endif
+ static constexpr uint32_t NUM_RANGES = 2;
static constexpr uint32_t NUM_VRINGS = 2;
static constexpr uint32_t VRING_ALIGN = 0x100;
static constexpr uint32_t VRING_SIZE = 0x08;
@@ -50,6 +83,8 @@ struct ResourceTable {
resource_table table;
uint32_t offset[NUM_RESOURCES];
+ fw_rsc_mapping mapping;
+ fw_rsc_map_range range[NUM_RANGES];
#if defined(REMOTEPROC_TRACE_BUFFER)
fw_rsc_trace trace;
#endif
@@ -59,31 +94,12 @@ struct ResourceTable {
} __attribute__((packed));
/*****************************************************************************
- * MetalIO
- *****************************************************************************/
-
-class MetalIO {
-public:
- MetalIO();
-
- remoteproc_mem *operator&();
-
-private:
- static metal_phys_addr_t offsetToPhys(metal_io_region *io, unsigned long offset);
- static unsigned long physToOffset(metal_io_region *io, metal_phys_addr_t phys);
-
- metal_io_ops ops;
- metal_io_region region;
- remoteproc_mem mem;
-};
-
-/*****************************************************************************
* RProc
*****************************************************************************/
class RProc {
public:
- RProc(Mailbox::Mailbox &_mailbox, resource_table &table, size_t tableSize, MetalIO &_mem);
+ RProc(Mailbox::Mailbox &_mailbox, resource_table &table, size_t tableSize);
~RProc();
remoteproc *getRProc();
@@ -99,30 +115,25 @@ private:
// Remote proc ops
static struct remoteproc *init(remoteproc *rproc, const remoteproc_ops *ops, void *arg);
static void remove(remoteproc *rproc);
- static void *mmap(remoteproc *rproc,
- metal_phys_addr_t *pa,
- metal_phys_addr_t *da,
- size_t size,
- unsigned int attribute,
- metal_io_region **io);
+ static int handle_rsc(struct remoteproc *rproc, void *rsc, size_t len);
static int notify(remoteproc *rproc, uint32_t id);
- static struct remoteproc_mem *getMem(remoteproc *rproc,
- const char *name,
- metal_phys_addr_t pa,
- metal_phys_addr_t da,
- void *va,
- size_t size,
- remoteproc_mem *buf);
// IRQ notification
Mailbox::Mailbox &mailbox;
// Remoteproc
- MetalIO &mem;
remoteproc rproc;
remoteproc_ops ops;
virtio_device *vdev;
+ // Resource table memory region
+ remoteproc_mem rsc_mem;
+ metal_io_region rsc_region;
+
+ // Host provided memory regions
+ remoteproc_mem mems[ResourceTable::NUM_RANGES];
+ metal_io_region regions[ResourceTable::NUM_RANGES];
+
// FreeRTOS
SemaphoreHandle_t notifySemaphore;
TaskHandle_t notifyHandle;