/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Definitions for LoongArch boot. * * Copyright (C) 2023 Loongson Technology Corporation Limited */ #ifndef HW_LOONGARCH_BOOT_H #define HW_LOONGARCH_BOOT_H /* UEFI 2.10 */ #define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 #define EFI_2_100_SYSTEM_TABLE_REVISION ((2<<16) | (100)) #define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION #define EFI_SYSTEM_TABLE_REVISION EFI_2_100_SYSTEM_TABLE_REVISION #define FW_VERSION 0x1 #define FW_PATCHLEVEL 0x0 typedef struct { uint8_t b[16]; } efi_guid_t QEMU_ALIGNED(8); #define EFI_GUID(a, b, c, d...) (efi_guid_t){ { \ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ (b) & 0xff, ((b) >> 8) & 0xff, \ (c) & 0xff, ((c) >> 8) & 0xff, d } } #define LINUX_EFI_BOOT_MEMMAP_GUID \ EFI_GUID(0x800f683f, 0xd08b, 0x423a, 0xa2, 0x93, \ 0x96, 0x5c, 0x3c, 0x6f, 0xe2, 0xb4) #define LINUX_EFI_INITRD_MEDIA_GUID \ EFI_GUID(0x5568e427, 0x68fc, 0x4f3d, 0xac, 0x74, \ 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68) #define DEVICE_TREE_GUID \ EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, \ 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0) struct efi_config_table { efi_guid_t guid; uint64_t *ptr; const char name[16]; }; typedef struct { uint64_t signature; uint32_t revision; uint32_t headersize; uint32_t crc32; uint32_t reserved; } efi_table_hdr_t; struct efi_configuration_table { efi_guid_t guid; void *table; }; struct efi_system_table { efi_table_hdr_t hdr; uint64_t fw_vendor; /* physical addr of CHAR16 vendor string */ uint32_t fw_revision; uint64_t con_in_handle; uint64_t *con_in; uint64_t con_out_handle; uint64_t *con_out; uint64_t stderr_handle; uint64_t stderr_placeholder; uint64_t *runtime; uint64_t *boottime; uint64_t nr_tables; struct efi_configuration_table *tables; }; typedef struct { uint32_t type; uint32_t pad; uint64_t phys_addr; uint64_t virt_addr; uint64_t num_pages; uint64_t attribute; } efi_memory_desc_t; struct efi_boot_memmap { uint64_t map_size; uint64_t desc_size; uint32_t desc_ver; uint64_t map_key; uint64_t buff_size; efi_memory_desc_t map[32]; }; struct efi_initrd { uint64_t base; uint64_t size; }; struct loongarch_boot_info { uint64_t ram_size; const char *kernel_filename; const char *kernel_cmdline; const char *initrd_filename; uint64_t a0, a1, a2; }; void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info); #endif /* HW_LOONGARCH_BOOT_H */