On 26/11/2021 13:20, Jan Kiszka wrote:
On 23.11.21 14:57, Stephane Viau wrote:
Inmate cell configurations all look alike - more or less.
Let's create a couple of header files to hide the fastidious stuff
(structure field names and so on) so that .c cell configuration files
look a bit less ugly.

Signed-off-by: Stephane Viau <[email protected]>
Signed-off-by: Stephane Viau <[email protected]>
---
  configs/arm64/cell-create.h   | 56 ++++++++++++++++++++++++++
  configs/arm64/cell-helper.h   | 76 +++++++++++++++++++++++++++++++++++
  configs/arm64/cell-template.c | 32 +++++++++++++++
  3 files changed, 164 insertions(+)
  create mode 100644 configs/arm64/cell-create.h
  create mode 100644 configs/arm64/cell-helper.h
  create mode 100644 configs/arm64/cell-template.c

diff --git a/configs/arm64/cell-create.h b/configs/arm64/cell-create.h
new file mode 100644
index 00000000..871784fc
--- /dev/null
+++ b/configs/arm64/cell-create.h
@@ -0,0 +1,56 @@
+/*
+ * Cell Configuration - Structure definition
+ *
+ * Copyright 2021 NXP
+ *
+ * Authors:
+ *  Stephane Viau <[email protected]>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <jailhouse/types.h>
+#include <jailhouse/cell-config.h>
+
+struct {
+       struct jailhouse_cell_desc cell;
+       __u64 cpus[1];
+       struct jailhouse_memory mem_regions[CONFIG_INMATE_REGIONS_NUM + 1];
+       struct jailhouse_irqchip irqchips[CONFIG_INMATE_IRQCHIPS_NUM];
+} __attribute__((packed)) config = {
+       .cell = {
+               .signature = JAILHOUSE_CELL_DESC_SIGNATURE,
+               .revision = JAILHOUSE_CONFIG_REVISION,
+               .name = CONFIG_INMATE_NAME,
+               .flags = JAILHOUSE_CELL_PASSIVE_COMMREG,
+
+               .cpu_set_size = sizeof(config.cpus),
+               .num_memory_regions = ARRAY_SIZE(config.mem_regions),
+               .num_irqchips = ARRAY_SIZE(config.irqchips),
+               .num_pci_devices = 0,
+               .cpu_reset_address = CONFIG_INMATE_BASE,
+       },
+
+       .cpus = {
+               /*
+                * bitmap of cores used by the inmate cell
+                */
+               CONFIG_INMATE_CORE_BITMAP,
+       },
+
+       .mem_regions = {
+               COMM_REGION_RW(0x80000000, KB(4)), /* communication region */
+               CONFIG_INMATE_REGIONS
+       },
+
+       .irqchips = {
+               {
+                       .address = CONFIG_INMATE_IRQCHIPS_ADDR,
+                       .pin_base = CONFIG_INMATE_IRQCHIPS_BASE,
+                       .pin_bitmap = {
+                               CONFIG_INMATE_IRQCHIPS_BITMAP
+                       }
+               }
+       },
+};
diff --git a/configs/arm64/cell-helper.h b/configs/arm64/cell-helper.h
new file mode 100644
index 00000000..d35bc0fb
--- /dev/null
+++ b/configs/arm64/cell-helper.h
@@ -0,0 +1,76 @@
+/*
+ * Cell Configuration - Generic definitions
+ *
+ * Copyright 2021 NXP
+ *
+ * Authors:
+ *  Stephane Viau <[email protected]>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef KB
+#define KB(bytes)      (1024 * (bytes))
+#define MB(bytes)      (1024 * KB(bytes))
+#endif
+
+#define REGION(phys, virt, bytes) \
+       .phys_start = (phys), \
+       .virt_start = (virt), \
+       .size = (bytes) \
+
+#define MEM_REGION_RW(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE, \
+       }
+
+#define COMM_REGION_RW(virt, bytes) \
+       { \
+               REGION(0x00000000, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | \
+                        JAILHOUSE_MEM_COMM_REGION, \
+       }
+
+#define MEM_REGION_RWX(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | \
+                        JAILHOUSE_MEM_EXECUTE, \
+               }
+
+#define MEM_REGION_RWXL(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | \
+                        JAILHOUSE_MEM_EXECUTE | JAILHOUSE_MEM_LOADABLE, \
+       }
+
+#define MMIO_REGION_RO(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_IO, \
+       }
+
+#define MMIO_REGION_ROS(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_IO | \
+                        JAILHOUSE_MEM_ROOTSHARED, \
+       }
+
+#define MMIO_REGION_RW(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | \
+                        JAILHOUSE_MEM_IO, \
+       }
+
+#define MMIO_REGION_RWS(phys, virt, bytes) \
+       { \
+               REGION(phys, virt, bytes), \
+               .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | \
+                        JAILHOUSE_MEM_IO | JAILHOUSE_MEM_ROOTSHARED, \
+       }

Nice, I guess that at least these macros really help. Sysconfigs would also benefit from it.

diff --git a/configs/arm64/cell-template.c b/configs/arm64/cell-template.c
new file mode 100644
index 00000000..bf731101
--- /dev/null
+++ b/configs/arm64/cell-template.c
@@ -0,0 +1,32 @@
+/*
+ * Cell Configuration - Structure definition
+ *
+ * Copyright 2021 NXP
+ *
+ * Authors:
+ *  Stephane Viau <[email protected]>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include "cell-helper.h"
+
+/* Name, cores, entry point */
+#define CONFIG_INMATE_NAME             "inmate-cell-name"
+#define CONFIG_INMATE_CORE_BITMAP      (0b1100) /* inmate uses cores 2 and 3 */
+#define CONFIG_INMATE_BASE             (0xc0000000) /* entry point in DDR */
+
+/* Memory & peripherals */
+#define CONFIG_INMATE_REGIONS_NUM      (1)
+#define CONFIG_INMATE_REGIONS          \
+       MEM_REGION_RWXL(0xc0000000, 0xc0000000, MB(16)),   /* RAM */    \
+
+/* GIC */
+#define CONFIG_INMATE_IRQCHIPS_NUM     (1)
+#define CONFIG_INMATE_IRQCHIPS_ADDR    (0x38800000) /* GIC DISTRIBUTOR BASE 
ADDR */
+#define CONFIG_INMATE_IRQCHIPS_BASE    (32)
+#define CONFIG_INMATE_IRQCHIPS_BITMAP  \
+       (1 << (29 + 32 - 32)) /* UART4 */

In case of the irqchips, I don't see that the definitions bring any help. It's about the same size as rolling out the structures directly.

+
+#include "cell-create.h"


Thanks for the proposal. Could you share some converted inmates as well
so that we can see the impact more clearly?

Do you also have any plans for system configurations? At least the MEM_REGION-macros could help to condense stuff there as well.

Thanks
  Ralf


Jan


--
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/db093dd2-fde8-a39c-3981-77e39c150b0d%40oth-regensburg.de.

Reply via email to