/** @file

  Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __LINUX_BZIMAGE_H__
#define __LINUX_BZIMAGE_H__

#define BOOTSIG    0x1FE
#define SETUP_HDR  0x53726448                   /* 0x53726448 == "HdrS" */

#define E820_RAM       1
#define E820_RESERVED  2
#define E820_ACPI      3
#define E820_NVS       4
#define E820_UNUSABLE  5

#pragma pack(1)

struct setup_header {
  UINT8     setup_secs;         /* Sectors for setup code */
  UINT16    root_flags;
  UINT32    sys_size;
  UINT16    ram_size;
  UINT16    video_mode;
  UINT16    root_dev;
  UINT16    signature;          /* Boot signature */
  UINT16    jump;
  UINT32    header;
  UINT16    version;
  UINT16    su_switch;
  UINT16    setup_seg;
  UINT16    start_sys;
  UINT16    kernel_ver;
  UINT8     loader_id;
  UINT8     load_flags;
  UINT16    movesize;
  UINT32    code32_start;       /* Start of code loaded high */
  UINT32    ramdisk_start;      /* Start of initial ramdisk */
  UINT32    ramdisk_len;        /* Length of initial ramdisk */
  UINT32    bootsect_kludge;
  UINT16    heap_end;
  UINT8     ext_loader_ver;     /* Extended boot loader version */
  UINT8     ext_loader_type;    /* Extended boot loader ID */
  UINT32    cmd_line_ptr;       /* 32-bit pointer to the kernel command line */
  UINT32    ramdisk_max;        /* Highest legal initrd address */
  UINT32    kernel_alignment;   /* Physical addr alignment required for kernel */
  UINT8     relocatable_kernel; /* Whether kernel is relocatable or not */
  UINT8     min_alignment;
  UINT16    xloadflags;
  UINT32    cmdline_size;
  UINT32    hardware_subarch;
  UINT64    hardware_subarch_data;
  UINT32    payload_offset;
  UINT32    payload_length;
  UINT64    setup_data;
  UINT64    pref_address;
  UINT32    init_size;
  UINT32    handover_offset;
};

struct efi_info {
  UINT32    efi_loader_signature;
  UINT32    efi_systab;
  UINT32    efi_memdesc_size;
  UINT32    efi_memdesc_version;
  UINT32    efi_memmap;
  UINT32    efi_memmap_size;
  UINT32    efi_systab_hi;
  UINT32    efi_memmap_hi;
};

struct e820_entry {
  UINT64    addr;               /* start of memory segment */
  UINT64    size;               /* size of memory segment */
  UINT32    type;               /* type of memory segment */
};

struct screen_info {
  UINT8     orig_x;              /* 0x00 */
  UINT8     orig_y;              /* 0x01 */
  UINT16    ext_mem_k;           /* 0x02 */
  UINT16    orig_video_page;     /* 0x04 */
  UINT8     orig_video_mode;     /* 0x06 */
  UINT8     orig_video_cols;     /* 0x07 */
  UINT8     flags;               /* 0x08 */
  UINT8     unused2;             /* 0x09 */
  UINT16    orig_video_ega_bx;   /* 0x0a */
  UINT16    unused3;             /* 0x0c */
  UINT8     orig_video_lines;    /* 0x0e */
  UINT8     orig_video_isVGA;    /* 0x0f */
  UINT16    orig_video_points;   /* 0x10 */

  /* VESA graphic mode -- linear frame buffer */
  UINT16    lfb_width;           /* 0x12 */
  UINT16    lfb_height;          /* 0x14 */
  UINT16    lfb_depth;           /* 0x16 */
  UINT32    lfb_base;            /* 0x18 */
  UINT32    lfb_size;            /* 0x1c */
  UINT16    cl_magic, cl_offset; /* 0x20 */
  UINT16    lfb_linelength;      /* 0x24 */
  UINT8     red_size;            /* 0x26 */
  UINT8     red_pos;             /* 0x27 */
  UINT8     green_size;          /* 0x28 */
  UINT8     green_pos;           /* 0x29 */
  UINT8     blue_size;           /* 0x2a */
  UINT8     blue_pos;            /* 0x2b */
  UINT8     rsvd_size;           /* 0x2c */
  UINT8     rsvd_pos;            /* 0x2d */
  UINT16    vesapm_seg;          /* 0x2e */
  UINT16    vesapm_off;          /* 0x30 */
  UINT16    pages;               /* 0x32 */
  UINT16    vesa_attributes;     /* 0x34 */
  UINT32    capabilities;        /* 0x36 */
  UINT8     _reserved[6];        /* 0x3a */
};

struct boot_params {
  struct screen_info     screen_info;
  UINT8                  apm_bios_info[0x14];
  UINT8                  _pad2[4];
  UINT64                 tboot_addr;
  UINT8                  ist_info[0x10];
  UINT8                  _pad3[16];
  UINT8                  hd0_info[16];
  UINT8                  hd1_info[16];
  UINT8                  sys_desc_table[0x10];
  UINT8                  olpc_ofw_header[0x10];
  UINT8                  _pad4[128];
  UINT8                  edid_info[0x80];
  struct efi_info        efi_info;
  UINT32                 alt_mem_k;
  UINT32                 scratch;
  UINT8                  e820_entries;
  UINT8                  eddbuf_entries;
  UINT8                  edd_mbr_sig_buf_entries;
  UINT8                  _pad6[6];
  struct setup_header    hdr;
  UINT8                  _pad7[0x290-0x1f1-sizeof (struct setup_header)];
  UINT32                 edd_mbr_sig_buffer[16];
  struct e820_entry      e820_map[128];
  UINT8                  _pad8[48];
  UINT8                  eddbuf[0x1ec];
  UINT8                  _pad9[276];
};

typedef struct {
  UINT16    limit;
  UINT64    *base;
} dt_addr_t;

#pragma pack()

extern EFI_STATUS
setup_graphics (
  struct boot_params  *buf
  );

#endif /* __LINUX_BZIMAGE_H__ */
