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