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