xref: /qemu/include/hw/loongarch/boot.h (revision 060685041ce6b98e5fb015b1d0318eb2f72944b5)
1d771ca1cSSong Gao /* SPDX-License-Identifier: GPL-2.0-or-later */
2d771ca1cSSong Gao /*
3d771ca1cSSong Gao  * Definitions for LoongArch boot.
4d771ca1cSSong Gao  *
5d771ca1cSSong Gao  * Copyright (C) 2023 Loongson Technology Corporation Limited
6d771ca1cSSong Gao  */
7d771ca1cSSong Gao 
8d771ca1cSSong Gao #ifndef HW_LOONGARCH_BOOT_H
9d771ca1cSSong Gao #define HW_LOONGARCH_BOOT_H
10d771ca1cSSong Gao 
114216baa9SSong Gao /* UEFI 2.10 */
124216baa9SSong Gao #define EFI_SYSTEM_TABLE_SIGNATURE       0x5453595320494249
134216baa9SSong Gao #define EFI_2_100_SYSTEM_TABLE_REVISION  ((2<<16) | (100))
144216baa9SSong Gao #define EFI_SPECIFICATION_VERSION        EFI_SYSTEM_TABLE_REVISION
154216baa9SSong Gao #define EFI_SYSTEM_TABLE_REVISION        EFI_2_100_SYSTEM_TABLE_REVISION
164216baa9SSong Gao 
174216baa9SSong Gao #define FW_VERSION 0x1
184216baa9SSong Gao #define FW_PATCHLEVEL 0x0
194216baa9SSong Gao 
204216baa9SSong Gao typedef struct {
214216baa9SSong Gao     uint8_t b[16];
224216baa9SSong Gao } efi_guid_t QEMU_ALIGNED(8);
234216baa9SSong Gao 
24252b8e68SSong Gao #define EFI_GUID(a, b, c, d...) (efi_guid_t){ {                                \
25252b8e68SSong Gao         (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
26252b8e68SSong Gao         (b) & 0xff, ((b) >> 8) & 0xff,                                         \
27252b8e68SSong Gao         (c) & 0xff, ((c) >> 8) & 0xff, d } }
28252b8e68SSong Gao 
29252b8e68SSong Gao #define LINUX_EFI_BOOT_MEMMAP_GUID \
30252b8e68SSong Gao         EFI_GUID(0x800f683f, 0xd08b, 0x423a,  0xa2, 0x93, \
31252b8e68SSong Gao                  0x96, 0x5c, 0x3c, 0x6f, 0xe2, 0xb4)
32252b8e68SSong Gao 
33*06068504SSong Gao #define LINUX_EFI_INITRD_MEDIA_GUID \
34*06068504SSong Gao         EFI_GUID(0x5568e427, 0x68fc, 0x4f3d,  0xac, 0x74, \
35*06068504SSong Gao                  0xca, 0x55, 0x52, 0x31, 0xcc, 0x68)
36*06068504SSong Gao 
374216baa9SSong Gao struct efi_config_table {
384216baa9SSong Gao     efi_guid_t guid;
394216baa9SSong Gao     uint64_t *ptr;
404216baa9SSong Gao     const char name[16];
414216baa9SSong Gao };
424216baa9SSong Gao 
434216baa9SSong Gao typedef struct {
444216baa9SSong Gao     uint64_t signature;
454216baa9SSong Gao     uint32_t revision;
464216baa9SSong Gao     uint32_t headersize;
474216baa9SSong Gao     uint32_t crc32;
484216baa9SSong Gao     uint32_t reserved;
494216baa9SSong Gao } efi_table_hdr_t;
504216baa9SSong Gao 
514216baa9SSong Gao struct efi_configuration_table {
524216baa9SSong Gao     efi_guid_t guid;
534216baa9SSong Gao     void *table;
544216baa9SSong Gao };
554216baa9SSong Gao 
564216baa9SSong Gao struct efi_system_table {
574216baa9SSong Gao     efi_table_hdr_t hdr;
584216baa9SSong Gao     uint64_t fw_vendor;        /* physical addr of CHAR16 vendor string */
594216baa9SSong Gao     uint32_t fw_revision;
604216baa9SSong Gao     uint64_t con_in_handle;
614216baa9SSong Gao     uint64_t *con_in;
624216baa9SSong Gao     uint64_t con_out_handle;
634216baa9SSong Gao     uint64_t *con_out;
644216baa9SSong Gao     uint64_t stderr_handle;
654216baa9SSong Gao     uint64_t stderr_placeholder;
664216baa9SSong Gao     uint64_t *runtime;
674216baa9SSong Gao     uint64_t *boottime;
684216baa9SSong Gao     uint64_t nr_tables;
694216baa9SSong Gao     struct efi_configuration_table *tables;
704216baa9SSong Gao };
714216baa9SSong Gao 
72252b8e68SSong Gao typedef struct {
73252b8e68SSong Gao     uint32_t type;
74252b8e68SSong Gao     uint32_t pad;
75252b8e68SSong Gao     uint64_t phys_addr;
76252b8e68SSong Gao     uint64_t virt_addr;
77252b8e68SSong Gao     uint64_t num_pages;
78252b8e68SSong Gao     uint64_t attribute;
79252b8e68SSong Gao } efi_memory_desc_t;
80252b8e68SSong Gao 
81252b8e68SSong Gao struct efi_boot_memmap {
82252b8e68SSong Gao     uint64_t map_size;
83252b8e68SSong Gao     uint64_t desc_size;
84252b8e68SSong Gao     uint32_t desc_ver;
85252b8e68SSong Gao     uint64_t map_key;
86252b8e68SSong Gao     uint64_t buff_size;
87252b8e68SSong Gao     efi_memory_desc_t map[32];
88252b8e68SSong Gao };
89252b8e68SSong Gao 
90*06068504SSong Gao struct efi_initrd {
91*06068504SSong Gao     uint64_t base;
92*06068504SSong Gao     uint64_t size;
93*06068504SSong Gao };
94*06068504SSong Gao 
95d771ca1cSSong Gao struct loongarch_boot_info {
96d771ca1cSSong Gao     uint64_t ram_size;
97d771ca1cSSong Gao     const char *kernel_filename;
98d771ca1cSSong Gao     const char *kernel_cmdline;
99d771ca1cSSong Gao     const char *initrd_filename;
100d771ca1cSSong Gao     uint64_t a0, a1, a2;
101d771ca1cSSong Gao };
102d771ca1cSSong Gao 
103d771ca1cSSong Gao void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info);
104d771ca1cSSong Gao 
105d771ca1cSSong Gao #endif /* HW_LOONGARCH_BOOT_H */
106