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