backported fixes from 256boss
[bootcensus] / src / vbe.h
1 #ifndef VBE_H_
2 #define VBE_H_
3
4 #include <inttypes.h>
5
6 #define VBE_ATTR_LFB    (1 << 7)
7 #define VBE_MODE_LFB    (1 << 14)
8
9 struct vbe_info {
10         uint8_t sig[4];
11         uint16_t version;
12         uint32_t oem_str_ptr;
13         uint8_t caps[4];                        /* capabilities */
14         uint32_t vid_mode_ptr;          /* vbefarptr to video mode list */
15         uint16_t total_mem;                     /* num of 64k mem blocks */
16         uint16_t oem_sw_rev;            /* VBE implementation software revision */
17         uint32_t oem_vendor_name_ptr;
18         uint32_t oem_product_name_ptr;
19         uint32_t oem_product_rev_ptr;
20         uint8_t reserved[222];
21         uint8_t oem_data[256];
22 } __attribute__((packed));
23
24 struct vbe_mode_info {
25         uint16_t mode_attr;
26         uint8_t wina_attr, winb_attr;
27         uint16_t win_gran, win_size;
28         uint16_t wina_seg, winb_seg;
29         uint32_t win_func;
30         uint16_t scanline_bytes;
31
32         /* VBE 1.2 and above */
33         uint16_t xres, yres;
34         uint8_t xcharsz, ycharsz;
35         uint8_t num_planes;
36         uint8_t bpp;
37         uint8_t num_banks;
38         uint8_t mem_model;
39         uint8_t bank_size;              /* bank size in KB */
40         uint8_t num_img_pages;
41         uint8_t reserved1;
42
43         /* direct color fields */
44         uint8_t rmask_size, rpos;
45         uint8_t gmask_size, gpos;
46         uint8_t bmask_size, bpos;
47         uint8_t xmask_size, xpos;
48         uint8_t cmode_info;             /* direct color mode attributes */
49
50         /* VBE 2.0 and above */
51         uint32_t fb_addr;               /* physical address of the linear framebuffer */
52         uint32_t reserved2;
53         uint16_t reserved3;
54
55         uint8_t reserved4[206];
56 } __attribute__((packed));
57
58 struct vbe_edid_chroma {
59         unsigned char redgreen_xy_lsb;
60         unsigned char bluewhite_xy_lsb;
61         unsigned char redx_msb, redy_msb;
62         unsigned char greenx_msb, greeny_msb;
63         unsigned char bluex_msb, bluey_msb;
64         unsigned char whitex_msb, whitey_msb;
65 } __attribute__((packed));
66
67 struct vbe_edid_timing {
68         uint16_t dotclock;
69         unsigned char hactive_lsb, hblank_lsb, hact_hblank_msb;
70         unsigned char vactive_lsb, vblank_lsb, vact_vblank_msb;
71         unsigned char hporch_lsb, hsync_lsb;
72         unsigned char vporch_vsync_lsb;
73         unsigned char hvporch_hvsync_msb;
74         unsigned char hsize_lsb, vsize_lsb;     /* mm */
75         unsigned char hsize_vsize_msb;
76         unsigned char hborder, vborder;
77         unsigned char features;
78 } __attribute__((packed));
79
80
81 #define VBE_EDID_MAGIC  "\0\xff\xff\xff\xff\xff\xff\0"
82
83 struct vbe_edid {
84         char magic[8];
85         uint16_t vendor;
86         uint16_t product;
87         uint32_t serial;
88         unsigned char week, year;
89         unsigned char ver_major, ver_minor;
90
91         unsigned char vidinp;
92         unsigned char hsize, vsize;
93         unsigned char gamma;
94         unsigned char features;
95
96         struct vbe_edid_chroma chroma;
97
98         uint16_t modes_std;
99         unsigned char modes_ext;
100         uint16_t timing_std;
101
102         struct vbe_edid_timing timing[4];
103         unsigned char num_ext, csum;
104
105 } __attribute__((packed));
106
107 struct vbe_info *vbe_get_info(void);
108 struct vbe_mode_info *vbe_get_mode_info(int mode);
109
110 int vbe_set_mode(int mode);
111
112 void print_mode_info(struct vbe_mode_info *modei);
113
114 int vbe_get_edid(struct vbe_edid *edid);
115 int edid_preferred_resolution(struct vbe_edid *edid, int *xres, int *yres);
116 void print_edid(struct vbe_edid *edid);
117
118 #endif  /* VBE_H_ */