xref: /qemu/include/hw/loongarch/boot.h (revision 1a648f7ae4d3ac97ef0855baec46047ea21a400a)
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 
3306068504SSong Gao #define LINUX_EFI_INITRD_MEDIA_GUID \
3406068504SSong Gao         EFI_GUID(0x5568e427, 0x68fc, 0x4f3d,  0xac, 0x74, \
3506068504SSong Gao                  0xca, 0x55, 0x52, 0x31, 0xcc, 0x68)
3606068504SSong Gao 
3760423851SSong Gao #define DEVICE_TREE_GUID \
3860423851SSong Gao         EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5,  0x83, 0x0b, \
3960423851SSong Gao                  0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
4060423851SSong Gao 
414216baa9SSong Gao struct efi_config_table {
424216baa9SSong Gao     efi_guid_t guid;
434216baa9SSong Gao     uint64_t *ptr;
444216baa9SSong Gao     const char name[16];
454216baa9SSong Gao };
464216baa9SSong Gao 
474216baa9SSong Gao typedef struct {
484216baa9SSong Gao     uint64_t signature;
494216baa9SSong Gao     uint32_t revision;
504216baa9SSong Gao     uint32_t headersize;
514216baa9SSong Gao     uint32_t crc32;
524216baa9SSong Gao     uint32_t reserved;
534216baa9SSong Gao } efi_table_hdr_t;
544216baa9SSong Gao 
554216baa9SSong Gao struct efi_configuration_table {
564216baa9SSong Gao     efi_guid_t guid;
574216baa9SSong Gao     void *table;
584216baa9SSong Gao };
594216baa9SSong Gao 
604216baa9SSong Gao struct efi_system_table {
614216baa9SSong Gao     efi_table_hdr_t hdr;
624216baa9SSong Gao     uint64_t fw_vendor;        /* physical addr of CHAR16 vendor string */
634216baa9SSong Gao     uint32_t fw_revision;
644216baa9SSong Gao     uint64_t con_in_handle;
654216baa9SSong Gao     uint64_t *con_in;
664216baa9SSong Gao     uint64_t con_out_handle;
674216baa9SSong Gao     uint64_t *con_out;
684216baa9SSong Gao     uint64_t stderr_handle;
694216baa9SSong Gao     uint64_t stderr_placeholder;
704216baa9SSong Gao     uint64_t *runtime;
714216baa9SSong Gao     uint64_t *boottime;
724216baa9SSong Gao     uint64_t nr_tables;
734216baa9SSong Gao     struct efi_configuration_table *tables;
744216baa9SSong Gao };
754216baa9SSong Gao 
76252b8e68SSong Gao typedef struct {
77252b8e68SSong Gao     uint32_t type;
78252b8e68SSong Gao     uint32_t pad;
79252b8e68SSong Gao     uint64_t phys_addr;
80252b8e68SSong Gao     uint64_t virt_addr;
81252b8e68SSong Gao     uint64_t num_pages;
82252b8e68SSong Gao     uint64_t attribute;
83252b8e68SSong Gao } efi_memory_desc_t;
84252b8e68SSong Gao 
85252b8e68SSong Gao struct efi_boot_memmap {
86252b8e68SSong Gao     uint64_t map_size;
87252b8e68SSong Gao     uint64_t desc_size;
88252b8e68SSong Gao     uint32_t desc_ver;
89252b8e68SSong Gao     uint64_t map_key;
90252b8e68SSong Gao     uint64_t buff_size;
91252b8e68SSong Gao     efi_memory_desc_t map[32];
92252b8e68SSong Gao };
93252b8e68SSong Gao 
9406068504SSong Gao struct efi_initrd {
9506068504SSong Gao     uint64_t base;
9606068504SSong Gao     uint64_t size;
9706068504SSong Gao };
9806068504SSong Gao 
99d771ca1cSSong Gao struct loongarch_boot_info {
100d771ca1cSSong Gao     uint64_t ram_size;
101d771ca1cSSong Gao     const char *kernel_filename;
102d771ca1cSSong Gao     const char *kernel_cmdline;
103d771ca1cSSong Gao     const char *initrd_filename;
104d771ca1cSSong Gao     uint64_t a0, a1, a2;
105d771ca1cSSong Gao };
106d771ca1cSSong Gao 
107*72674db0SPaolo Bonzini extern struct memmap_entry *memmap_table;
108*72674db0SPaolo Bonzini extern unsigned memmap_entries;
109*72674db0SPaolo Bonzini 
110*72674db0SPaolo Bonzini struct memmap_entry {
111*72674db0SPaolo Bonzini     uint64_t address;
112*72674db0SPaolo Bonzini     uint64_t length;
113*72674db0SPaolo Bonzini     uint32_t type;
114*72674db0SPaolo Bonzini     uint32_t reserved;
115*72674db0SPaolo Bonzini };
116*72674db0SPaolo Bonzini 
117d771ca1cSSong Gao void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info);
118d771ca1cSSong Gao 
119d771ca1cSSong Gao #endif /* HW_LOONGARCH_BOOT_H */
120