|  | /* | 
|  | * Copyright (c) 2019 Intel Corporation | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_INCLUDE_ARCH_X86_MULTIBOOT_H_ | 
|  | #define ZEPHYR_INCLUDE_ARCH_X86_MULTIBOOT_H_ | 
|  |  | 
|  | #ifndef _ASMLANGUAGE | 
|  |  | 
|  | /* | 
|  | * Multiboot (version 1) boot information structure. | 
|  | * | 
|  | * Only fields/values of interest to Zephyr are enumerated: at | 
|  | * present, that means only those pertaining to the framebuffer. | 
|  | */ | 
|  |  | 
|  | struct multiboot_info { | 
|  | uint32_t flags; | 
|  | uint32_t mem_lower; | 
|  | uint32_t mem_upper; | 
|  | uint32_t unused0[8]; | 
|  | uint32_t mmap_length; | 
|  | uint32_t mmap_addr; | 
|  | uint32_t unused1[9]; | 
|  | uint32_t fb_addr_lo; | 
|  | uint32_t fb_addr_hi; | 
|  | uint32_t fb_pitch; | 
|  | uint32_t fb_width; | 
|  | uint32_t fb_height; | 
|  | uint8_t  fb_bpp; | 
|  | uint8_t  fb_type; | 
|  | uint8_t  fb_color_info[6]; | 
|  | }; | 
|  |  | 
|  | extern struct multiboot_info multiboot_info; | 
|  |  | 
|  | extern void z_multiboot_init(struct multiboot_info *info_pa); | 
|  |  | 
|  | /* | 
|  | * the mmap_addr field points to a series of entries of the following form. | 
|  | */ | 
|  |  | 
|  | struct multiboot_mmap { | 
|  | uint32_t size; | 
|  | uint64_t base; | 
|  | uint64_t length; | 
|  | uint32_t type; | 
|  | } __packed; | 
|  |  | 
|  | #endif /* _ASMLANGUAGE */ | 
|  |  | 
|  | /* | 
|  | * Possible values for multiboot_mmap.type field. | 
|  | * Other values should be assumed to be unusable ranges. | 
|  | */ | 
|  |  | 
|  | #define MULTIBOOT_MMAP_RAM		1	/* available RAM */ | 
|  | #define MULTIBOOT_MMAP_ACPI		3	/* reserved for ACPI */ | 
|  | #define MULTIBOOT_MMAP_NVS		4	/* ACPI non-volatile */ | 
|  | #define MULTIBOOT_MMAP_DEFECTIVE	5	/* defective RAM module */ | 
|  |  | 
|  | /* | 
|  | * Magic numbers: the kernel multiboot header (see crt0.S) begins with | 
|  | * MULTIBOOT_HEADER_MAGIC to signal to the booter that it supports | 
|  | * multiboot. On kernel entry, EAX is set to MULTIBOOT_EAX_MAGIC to | 
|  | * signal that the boot loader is multiboot compliant. | 
|  | */ | 
|  |  | 
|  | #define MULTIBOOT_HEADER_MAGIC		0x1BADB002 | 
|  | #define MULTIBOOT_EAX_MAGIC		0x2BADB002 | 
|  |  | 
|  | /* | 
|  | * Typically, we put no flags in the multiboot header, as it exists solely | 
|  | * to reassure the loader that we're a valid binary. The exception to this | 
|  | * is when we want the loader to configure the framebuffer for us. | 
|  | */ | 
|  |  | 
|  | #define MULTIBOOT_HEADER_FLAG_MEM	BIT(1)	/* want mem_/mmap_* info */ | 
|  | #define MULTIBOOT_HEADER_FLAG_FB	BIT(2)	/* want fb_* info */ | 
|  |  | 
|  | #ifdef CONFIG_MULTIBOOT_FRAMEBUF | 
|  | #define MULTIBOOT_HEADER_FLAGS \ | 
|  | (MULTIBOOT_HEADER_FLAG_FB | MULTIBOOT_HEADER_FLAG_MEM) | 
|  | #else | 
|  | #define MULTIBOOT_HEADER_FLAGS MULTIBOOT_HEADER_FLAG_MEM | 
|  | #endif | 
|  |  | 
|  | /* The flags in the boot info structure tell us which fields are valid. */ | 
|  |  | 
|  | #define MULTIBOOT_INFO_FLAGS_MEM	(1 << 0)	/* mem_* valid */ | 
|  | #define MULTIBOOT_INFO_FLAGS_MMAP	(1 << 6)	/* mmap_* valid */ | 
|  | #define MULTIBOOT_INFO_FLAGS_FB		(1 << 12)	/* fb_* valid */ | 
|  |  | 
|  | /* The only fb_type we support is RGB. No text modes and no color palettes. */ | 
|  |  | 
|  | #define MULTIBOOT_INFO_FB_TYPE_RGB	1 | 
|  |  | 
|  | #endif /* ZEPHYR_INCLUDE_ARCH_X86_MULTIBOOT_H_ */ |