[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 06/17] hw/loongarch: Init efi_boot_memmap table
From: |
Song Gao |
Subject: |
[PATCH v3 06/17] hw/loongarch: Init efi_boot_memmap table |
Date: |
Wed, 27 Dec 2023 16:08:10 +0800 |
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
hw/loongarch/boot.c | 40 +++++++++++++++++++++++++++++++++++++
hw/loongarch/virt.c | 11 ++--------
include/hw/loongarch/boot.h | 27 +++++++++++++++++++++++++
include/hw/loongarch/virt.h | 11 ++++++++++
4 files changed, 80 insertions(+), 9 deletions(-)
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
index b8b44d41f9..4103fb2781 100644
--- a/hw/loongarch/boot.c
+++ b/hw/loongarch/boot.c
@@ -63,8 +63,43 @@ static unsigned int slave_boot_code[] = {
0x4c000020, /* jirl $r0,$r1,0 */
};
+static inline void *guidcpy(void *dst, const void *src)
+{
+ return memcpy(dst, src, sizeof(efi_guid_t));
+}
+
+static void init_efi_boot_memmap(struct efi_system_table *systab,
+ void *p, void *start)
+{
+ unsigned i;
+ struct efi_boot_memmap *boot_memmap = p;
+ efi_guid_t tbl_guid = LINUX_EFI_BOOT_MEMMAP_GUID;
+
+ /* efi_configuration_table 1 */
+ guidcpy(&systab->tables[0].guid, &tbl_guid);
+ systab->tables[0].table = (struct efi_configuration_table *)(p - start);
+ systab->nr_tables = 1;
+
+ boot_memmap->desc_size = sizeof(efi_memory_desc_t);
+ boot_memmap->desc_ver = 1;
+ boot_memmap->map_size = 0;
+
+ efi_memory_desc_t *map = p + sizeof(struct efi_boot_memmap);
+ for (i = 0; i < memmap_entries; i++) {
+ map = (void *)boot_memmap + sizeof(*map);
+ map[i].type = memmap_table[i].type;
+ map[i].phys_addr = memmap_table[i].address;
+ map[i].num_pages = memmap_table[i].length >> 16; /* 64KB align*/
+ p += sizeof(efi_memory_desc_t);
+ }
+
+ p += ROUND_UP(sizeof(struct efi_boot_memmap) +
+ sizeof(efi_memory_desc_t) * memmap_entries, 64);
+}
+
static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
{
+ void *bp_tables_start;
struct efi_system_table *systab = p;
info->a2 = (uint64_t)p - (uint64_t)start;
@@ -80,6 +115,11 @@ static void init_systab(struct loongarch_boot_info *info,
void *p, void *start)
p += ROUND_UP(sizeof(struct efi_system_table), 64);
systab->tables = p;
+ bp_tables_start = p;
+
+ init_efi_boot_memmap(systab, p, start);
+
+ systab->tables = (struct efi_configuration_table *)(bp_tables_start -
start);
}
static void init_cmdline(struct loongarch_boot_info *info, void *p, void
*start)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 4794af4825..795c2cd95c 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -342,15 +342,8 @@ static void virt_powerdown_req(Notifier *notifier, void
*opaque)
acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
}
-struct memmap_entry {
- uint64_t address;
- uint64_t length;
- uint32_t type;
- uint32_t reserved;
-};
-
-static struct memmap_entry *memmap_table;
-static unsigned memmap_entries;
+struct memmap_entry *memmap_table;
+unsigned memmap_entries;
static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
{
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
index aa12a60ffb..7ad25080c5 100644
--- a/include/hw/loongarch/boot.h
+++ b/include/hw/loongarch/boot.h
@@ -21,6 +21,15 @@ typedef struct {
uint8_t b[16];
} efi_guid_t __attribute__((aligned(8)));
+#define EFI_GUID(a, b, c, d...) (efi_guid_t){ {
\
+ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff,
\
+ (b) & 0xff, ((b) >> 8) & 0xff,
\
+ (c) & 0xff, ((c) >> 8) & 0xff, d } }
+
+#define LINUX_EFI_BOOT_MEMMAP_GUID \
+ EFI_GUID(0x800f683f, 0xd08b, 0x423a, 0xa2, 0x93, \
+ 0x96, 0x5c, 0x3c, 0x6f, 0xe2, 0xb4)
+
struct efi_config_table {
efi_guid_t guid;
uint64_t *ptr;
@@ -56,6 +65,24 @@ struct efi_system_table {
struct efi_configuration_table *tables;
};
+typedef struct {
+ uint32_t type;
+ uint32_t pad;
+ uint64_t phys_addr;
+ uint64_t virt_addr;
+ uint64_t num_pages;
+ uint64_t attribute;
+} efi_memory_desc_t;
+
+struct efi_boot_memmap {
+ uint64_t map_size;
+ uint64_t desc_size;
+ uint32_t desc_ver;
+ uint64_t map_key;
+ uint64_t buff_size;
+ efi_memory_desc_t map[32];
+};
+
struct loongarch_boot_info {
uint64_t ram_size;
const char *kernel_filename;
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
index 90cccd9aa1..3e8728f1af 100644
--- a/include/hw/loongarch/virt.h
+++ b/include/hw/loongarch/virt.h
@@ -31,6 +31,17 @@
#define VIRT_GED_MEM_ADDR (VIRT_GED_EVT_ADDR + ACPI_GED_EVT_SEL_LEN)
#define VIRT_GED_REG_ADDR (VIRT_GED_MEM_ADDR + MEMORY_HOTPLUG_IO_LEN)
+
+extern struct memmap_entry *memmap_table;
+extern unsigned memmap_entries;
+
+struct memmap_entry {
+ uint64_t address;
+ uint64_t length;
+ uint32_t type;
+ uint32_t reserved;
+};
+
struct LoongArchMachineState {
/*< private >*/
MachineState parent_obj;
--
2.25.1
- [PATCH v3 00/17] Add boot LoongArch elf kernel with FDT, Song Gao, 2023/12/27
- [PATCH v3 04/17] hw/loongarch: Add init_cmdline, Song Gao, 2023/12/27
- [PATCH v3 08/17] hw/loongarch: Init efi_fdt table, Song Gao, 2023/12/27
- [PATCH v3 02/17] hw/loongarch: Add load initrd, Song Gao, 2023/12/27
- [PATCH v3 10/17] hw/loongarch: fdt adds cpu interrupt controller node, Song Gao, 2023/12/27
- [PATCH v3 06/17] hw/loongarch: Init efi_boot_memmap table,
Song Gao <=
- [PATCH v3 05/17] hw/loongarch: Init efi_system_table, Song Gao, 2023/12/27
- [PATCH v3 07/17] hw/loongarch: Init efi_initrd table, Song Gao, 2023/12/27
- [PATCH v3 09/17] hw/loongarch: Fix fdt memory node wrong 'reg', Song Gao, 2023/12/27
- [PATCH v3 11/17] hw/loongarch: fdt adds Extend I/O Interrupt Controller, Song Gao, 2023/12/27
- [PATCH v3 01/17] hw/loongarch: Move boot fucntions to boot.c, Song Gao, 2023/12/27
- [PATCH v3 03/17] hw/loongarch: Add slave cpu boot_code, Song Gao, 2023/12/27