summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 82fcc35)
raw | patch | inline | side by side (parent: 82fcc35)
author | Wendy Liang <jliang@xilinx.com> | |
Thu, 4 Aug 2016 16:56:15 +0000 (09:56 -0700) | ||
committer | Wendy Liang <jliang@xilinx.com> | |
Thu, 13 Oct 2016 05:01:46 +0000 (22:01 -0700) |
Use libmetal device in the platform initialization data
Signed-off-by: Wendy Liang <jliang@xilinx.com>
Signed-off-by: Wendy Liang <jliang@xilinx.com>
apps/machine/zynqmp_r5/platform_info.c | patch | blob | history | |
apps/machine/zynqmp_r5/platform_info.h | [new file with mode: 0644] | patch | blob |
apps/system/generic/machine/zynqmp_r5/CMakeLists.txt | patch | blob | history | |
apps/system/generic/machine/zynqmp_r5/helper.c | patch | blob | history | |
apps/system/generic/machine/zynqmp_r5/sys_init.c | [new file with mode: 0644] | patch | blob |
index 388c5043943d3b2659c85dece2fd6034a2a6ec11..bbca0ee7ba53d98f5c92c3df7f6afa893cd957be 100755 (executable)
* DESCRIPTION
*
* This file implements APIs to get platform specific
- * information for OpenAMP.
+ * information for OpenAMP.
*
**************************************************************************/
#include "openamp/hil.h"
+#include "openamp/remoteproc_plat.h"
+#include "platform_info.h"
-/* IPC Device parameters */
-#define SHM_ADDR (void *)0x3ED08000
-#define SHM_SIZE 0x00200000
-#define IPI_BASEADDR 0xff310000
#define IPI_CHN_BITMASK 0x01000000 /* IPI channel bit mask APU<->RPU0 */
-#define VRING0_IPI_INTR_VECT 0xFFFFFFFF
-#define VRING1_IPI_INTR_VECT 65
-#define MASTER_CPU_ID 0
-#define REMOTE_CPU_ID 1
+#define REMOTE_CPU_ID 0
/* -- FIX ME: ipi info is to be defined -- */
struct ipi_info {
- uint32_t ipi_base_addr;
uint32_t ipi_chn_mask;
+ int need_reg;
};
/* Reference implementation that show cases platform_get_cpu_info and
platform_get_for_firmware API implementation for Bare metal environment */
extern struct hil_platform_ops zynqmp_r5_a53_proc_ops;
-static struct ipi_info chn_ipi_info = { IPI_BASEADDR, IPI_CHN_BITMASK };
-
-/**
- * This array provdes defnition of CPU nodes for master and remote
- * context. It contains two nodes beacuse the same file is intended
- * to use with both master and remote configurations. On zynq platform
- * only one node defintion is required for master/remote as there
- * are only two cores present in the platform.
- *
- * Only platform specific info is populated here. Rest of information
- * is obtained during resource table parsing.The platform specific
- * information includes;
- *
- * -CPU ID
- * -Shared Memory
- * -Interrupts
- * -Channel info.
- *
- * Although the channel info is not platform specific information
- * but it is conveneient to keep it in HIL so that user can easily
- * provide it without modifying the generic part.
- *
- * It is good idea to define hil_proc structure with platform
- * specific fields populated as this can be easily copied to hil_proc
- * structure passed as parameter in platform_get_processor_info. The
- * other option is to populate the required structures individually
- * and copy them one by one to hil_proc structure in platform_get_processor_info
- * function. The first option is adopted here.
- *
- *
- * 1) First node in the array is intended for the remote contexts and it
- * defines Master CPU ID, shared memory, interrupts info, number of channels
- * and there names. This node defines only one channel
- * "rpmsg-openamp-demo-channel".
- *
- * 2)Second node is required by the master and it defines remote CPU ID,
- * shared memory and interrupts info. In general no channel info is required by the
- * Master node, however in baremetal master and linux remote case the linux
- * rpmsg bus driver behaves as master so the rpmsg driver on linux side still needs
- * channel info. This information is not required by the masters for baremetal
- * remotes.
- *
- */
-
-struct hil_proc proc_table[] = {
+static struct ipi_info chn_ipi_info[] = {
+ { IPI_CHN_BITMASK, 0},
+ { IPI_CHN_BITMASK, 1},
+};
- /* CPU node for remote context */
+struct rproc_info_plat_local proc_table = {
{
- /* CPU ID of master */
- MASTER_CPU_ID,
-
- /* HIL platform ops table. */
- &zynqmp_r5_a53_proc_ops,
-
- /* Shared memory info - Last field is not used currently */
- {
- SHM_ADDR, SHM_SIZE, 0x00},
-
- /* VirtIO device info */
- {
- /* Leave these three fields empty as these are obtained from rsc
- * table.
- */
- 0, 0, 0,
+ /* CPU ID of master */
+ REMOTE_CPU_ID,
- /* Vring info */
- {
-
- {
- /* Provide only vring interrupts info here. Other fields are
- * obtained from the resource table so leave them empty.
- */
- NULL, NULL, 0, 0,
- {
- VRING0_IPI_INTR_VECT, 0x1006, 1, (void *)(&chn_ipi_info),
- }
- },
- {
- NULL, NULL, 0, 0,
- {
- VRING1_IPI_INTR_VECT, 0x1006, 1, (void *)(&chn_ipi_info),
- }
- }
- }
- },
-
- /* Number of RPMSG channels */
- 1,
-
- /* RPMSG channel info - Only channel name is expected currently */
- {
- {"rpmsg-openamp-demo-channel"}
- },
+ /* HIL platform ops table. */
+ &zynqmp_r5_a53_proc_ops,
+ },
+ /* vring0 ipi device and vring descriptors memory device */
+ {
+ PLAT_RSC_VRING,
+ "generic",
+ "ff310000.ipi",
+ &chn_ipi_info[0],
+ "generic",
+ "vrings",
+ },
+ /* vring0 ipi device and vring descriptors memory device */
+ {
+ PLAT_RSC_VRING,
+ "generic",
+ "ff310000.ipi",
+ &chn_ipi_info[1],
+ "generic",
+ "vrings",
+ },
+ /* Shared memory device */
+ {
+ PLAT_RSC_SHM,
+ "shm",
+ 0, /* UNDEFINED */
+ },
+ /* Shared memory device */
+ {
+ PLAT_RSC_RPMSG_CHANNEL,
+ "rpmsg-openamp-demo-channel",
+ },
+ PLAT_RSC_LAST,
+};
- /* Next three fields are for future use only */
- 0,
+const struct firmware_info fw_table[] =
+{
+ {"unknown",
0,
- NULL,
- {NULL, NULL}
- },
+ 0}
};
+int fw_table_size = sizeof(fw_table)/sizeof(struct firmware_info);
diff --git a/apps/machine/zynqmp_r5/platform_info.h b/apps/machine/zynqmp_r5/platform_info.h
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016 Xilinx, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of Mentor Graphics Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* This file populates resource table for BM remote
+ * for use by the Linux Master */
+
+#include "openamp/hil.h"
+#include "openamp/remoteproc_plat.h"
+
+/* remoteproc platform data structure */
+struct rproc_info_plat_local {
+ struct proc_info_hdr proc_hdr; /**< hil proc header */
+ struct plat_vring vring0; /**< vring0 data */
+ struct plat_vring vring1; /**< vring1 data */
+ struct plat_shm shm; /**< shared memory data */
+ struct plat_rpmsg_chnl rpmsg_chnl; /**< RPMSG channel data */
+ unsigned int last_type;
+};
diff --git a/apps/system/generic/machine/zynqmp_r5/CMakeLists.txt b/apps/system/generic/machine/zynqmp_r5/CMakeLists.txt
index 210ac56935d3e91f34fd9ae2e9630cd6b4923b5d..0a7222383caa925e52ce254ee6de4200f05f4bfe 100644 (file)
collect (APP_COMMON_SOURCES helper.c)
+collect (APP_COMMON_SOURCES sys_init.c)
if (WITH_REMOTEPROC_MASTER)
message(FATAL_ERROR "Remoteproc master is not currently supported on ${MACHINE}/${SYSTEM}.")
diff --git a/apps/system/generic/machine/zynqmp_r5/helper.c b/apps/system/generic/machine/zynqmp_r5/helper.c
index e2c8a966a9cf951fb3984a878f2418c1d8012b4b..d0d72dc3035c9132503d3f17c545f0190bd502aa 100644 (file)
XScuGic InterruptController;
extern void bm_env_isr(int vector);
+extern int platform_register_metal_device(void);
void zynqmp_r5_irq_isr()
{
void init_system()
{
+ struct metal_init_params metal_param = METAL_INIT_DEFAULTS;
+
+ metal_init(&metal_param);
zynqmp_r5_gic_initialize();
+ platform_register_metal_device();
}
void cleanup_system()
diff --git a/apps/system/generic/machine/zynqmp_r5/sys_init.c b/apps/system/generic/machine/zynqmp_r5/sys_init.c
--- /dev/null
@@ -0,0 +1,142 @@
+
+/*
+ * Copyright (c) 2014, Mentor Graphics Corporation
+ * All rights reserved.
+ *
+ * Copyright (c) 2015 Xilinx, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <string.h>
+#include "xparameters.h"
+#include "xil_exception.h"
+#include "xscugic.h"
+#include "metal/sys.h"
+#include "metal/device.h"
+#include "metal/io.h"
+#include "metal/shmem.h"
+
+/** Device base address */
+#define IPI_BASE_ADDR 0xFF310000
+#define UNDEFINE_BASE_ADDR 0x0
+
+#define UNDEFINE_MEM_SIZE 0xFFFFFFFF
+
+/** IPI IRQ ID */
+#define IPI_IRQ_VECT_ID 65
+
+#define IPI_DEV_NAME "ff310000.ipi"
+#define VRING_DEV_NAME "vrings"
+#define SHM_NAME "shm"
+
+const metal_phys_addr_t ipi_base_addr = IPI_BASE_ADDR;
+const metal_phys_addr_t undefine_mem_addr = UNDEFINE_BASE_ADDR;
+
+struct metal_device metal_dev_table[] = {
+ {
+ /* IPI device */
+ IPI_DEV_NAME,
+ NULL,
+ 1,
+ {
+ {
+ (void *)IPI_BASE_ADDR,
+ &ipi_base_addr,
+ 0x1000,
+ (sizeof(metal_phys_addr_t) << 3),
+ (unsigned long)(-1),
+ METAL_UNCACHED,
+ {NULL},
+ }
+ },
+ {NULL},
+ 1,
+ (void *)IPI_IRQ_VECT_ID,
+
+ },
+ {
+ /* Shared memory management device */
+ VRING_DEV_NAME,
+ NULL,
+ 1,
+ {
+ {
+ (void *)UNDEFINE_BASE_ADDR,
+ &undefine_mem_addr,
+ UNDEFINE_MEM_SIZE,
+ (sizeof(metal_phys_addr_t) << 3),
+ (unsigned long)(-1),
+ METAL_UNCACHED | METAL_SHARED_MEM,
+ {NULL},
+ }
+ },
+ {NULL},
+ 0,
+ NULL,
+
+ },
+};
+
+struct metal_generic_shmem shm = {
+ SHM_NAME,
+ {
+ (void *)UNDEFINE_BASE_ADDR,
+ &undefine_mem_addr,
+ UNDEFINE_MEM_SIZE,
+ (sizeof(metal_phys_addr_t) << 3),
+ (unsigned long)(-1),
+ 0,
+ {NULL},
+ },
+ {NULL, NULL},
+};
+
+/**
+ * This funciton is to install baremeta/RTOS libmetal devices.
+ */
+extern char RPROC_DEBUG[];
+int platform_register_metal_device(void)
+{
+ int i;
+ int ret;
+ struct metal_device *dev;
+
+ /* Register device */
+ metal_bus_register(&metal_generic_bus);
+ for (i = 0;
+ i < (int)(sizeof(metal_dev_table)/sizeof(struct metal_device));
+ i++) {
+ dev = &metal_dev_table[i];
+ ret = metal_register_generic_device(dev);
+ if (ret)
+ return ret;
+ }
+
+ /* Register shared memory */
+ metal_shmem_register_generic(&shm);
+
+ return 0;
+}
+