xref: /qemu/include/hw/loongarch/boot.h (revision 252b8e68994aa48508cf1c7d365967e3850b70bb)
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 
24*252b8e68SSong Gao #define EFI_GUID(a, b, c, d...) (efi_guid_t){ {                                \
25*252b8e68SSong Gao         (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
26*252b8e68SSong Gao         (b) & 0xff, ((b) >> 8) & 0xff,                                         \
27*252b8e68SSong Gao         (c) & 0xff, ((c) >> 8) & 0xff, d } }
28*252b8e68SSong Gao 
29*252b8e68SSong Gao #define LINUX_EFI_BOOT_MEMMAP_GUID \
30*252b8e68SSong Gao         EFI_GUID(0x800f683f, 0xd08b, 0x423a,  0xa2, 0x93, \
31*252b8e68SSong Gao                  0x96, 0x5c, 0x3c, 0x6f, 0xe2, 0xb4)
32*252b8e68SSong Gao 
334216baa9SSong Gao struct efi_config_table {
344216baa9SSong Gao     efi_guid_t guid;
354216baa9SSong Gao     uint64_t *ptr;
364216baa9SSong Gao     const char name[16];
374216baa9SSong Gao };
384216baa9SSong Gao 
394216baa9SSong Gao typedef struct {
404216baa9SSong Gao     uint64_t signature;
414216baa9SSong Gao     uint32_t revision;
424216baa9SSong Gao     uint32_t headersize;
434216baa9SSong Gao     uint32_t crc32;
444216baa9SSong Gao     uint32_t reserved;
454216baa9SSong Gao } efi_table_hdr_t;
464216baa9SSong Gao 
474216baa9SSong Gao struct efi_configuration_table {
484216baa9SSong Gao     efi_guid_t guid;
494216baa9SSong Gao     void *table;
504216baa9SSong Gao };
514216baa9SSong Gao 
524216baa9SSong Gao struct efi_system_table {
534216baa9SSong Gao     efi_table_hdr_t hdr;
544216baa9SSong Gao     uint64_t fw_vendor;        /* physical addr of CHAR16 vendor string */
554216baa9SSong Gao     uint32_t fw_revision;
564216baa9SSong Gao     uint64_t con_in_handle;
574216baa9SSong Gao     uint64_t *con_in;
584216baa9SSong Gao     uint64_t con_out_handle;
594216baa9SSong Gao     uint64_t *con_out;
604216baa9SSong Gao     uint64_t stderr_handle;
614216baa9SSong Gao     uint64_t stderr_placeholder;
624216baa9SSong Gao     uint64_t *runtime;
634216baa9SSong Gao     uint64_t *boottime;
644216baa9SSong Gao     uint64_t nr_tables;
654216baa9SSong Gao     struct efi_configuration_table *tables;
664216baa9SSong Gao };
674216baa9SSong Gao 
68*252b8e68SSong Gao typedef struct {
69*252b8e68SSong Gao     uint32_t type;
70*252b8e68SSong Gao     uint32_t pad;
71*252b8e68SSong Gao     uint64_t phys_addr;
72*252b8e68SSong Gao     uint64_t virt_addr;
73*252b8e68SSong Gao     uint64_t num_pages;
74*252b8e68SSong Gao     uint64_t attribute;
75*252b8e68SSong Gao } efi_memory_desc_t;
76*252b8e68SSong Gao 
77*252b8e68SSong Gao struct efi_boot_memmap {
78*252b8e68SSong Gao     uint64_t map_size;
79*252b8e68SSong Gao     uint64_t desc_size;
80*252b8e68SSong Gao     uint32_t desc_ver;
81*252b8e68SSong Gao     uint64_t map_key;
82*252b8e68SSong Gao     uint64_t buff_size;
83*252b8e68SSong Gao     efi_memory_desc_t map[32];
84*252b8e68SSong Gao };
85*252b8e68SSong Gao 
86d771ca1cSSong Gao struct loongarch_boot_info {
87d771ca1cSSong Gao     uint64_t ram_size;
88d771ca1cSSong Gao     const char *kernel_filename;
89d771ca1cSSong Gao     const char *kernel_cmdline;
90d771ca1cSSong Gao     const char *initrd_filename;
91d771ca1cSSong Gao     uint64_t a0, a1, a2;
92d771ca1cSSong Gao };
93d771ca1cSSong Gao 
94d771ca1cSSong Gao void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info);
95d771ca1cSSong Gao 
96d771ca1cSSong Gao #endif /* HW_LOONGARCH_BOOT_H */
97