1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2017 Toomas Soome <tsoome@me.com> 14 * Copyright 2020 RackTop Systems, Inc. 15 */ 16 17 #ifndef _GFX_FB_H 18 #define _GFX_FB_H 19 20 #include <stdbool.h> 21 #include <sys/visual_io.h> 22 #include <sys/multiboot2.h> 23 #include <sys/queue.h> 24 #include <pnglite.h> 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 #define EDID_MAGIC { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 } 31 32 struct edid_header { 33 uint8_t header[8]; /* fixed header pattern */ 34 uint16_t manufacturer_id; 35 uint16_t product_code; 36 uint32_t serial_number; 37 uint8_t week_of_manufacture; 38 uint8_t year_of_manufacture; 39 uint8_t version; 40 uint8_t revision; 41 }; 42 43 struct edid_basic_display_parameters { 44 uint8_t video_input_parameters; 45 uint8_t max_horizontal_image_size; 46 uint8_t max_vertical_image_size; 47 uint8_t display_gamma; 48 uint8_t supported_features; 49 }; 50 51 struct edid_chromaticity_coordinates { 52 uint8_t red_green_lo; 53 uint8_t blue_white_lo; 54 uint8_t red_x_hi; 55 uint8_t red_y_hi; 56 uint8_t green_x_hi; 57 uint8_t green_y_hi; 58 uint8_t blue_x_hi; 59 uint8_t blue_y_hi; 60 uint8_t white_x_hi; 61 uint8_t white_y_hi; 62 }; 63 64 struct edid_detailed_timings { 65 uint16_t pixel_clock; 66 uint8_t horizontal_active_lo; 67 uint8_t horizontal_blanking_lo; 68 uint8_t horizontal_hi; 69 uint8_t vertical_active_lo; 70 uint8_t vertical_blanking_lo; 71 uint8_t vertical_hi; 72 uint8_t horizontal_sync_offset_lo; 73 uint8_t horizontal_sync_pulse_width_lo; 74 uint8_t vertical_sync_lo; 75 uint8_t sync_hi; 76 uint8_t horizontal_image_size_lo; 77 uint8_t vertical_image_size_lo; 78 uint8_t image_size_hi; 79 uint8_t horizontal_border; 80 uint8_t vertical_border; 81 uint8_t features; 82 }; 83 84 struct vesa_edid_info { 85 struct edid_header header; 86 struct edid_basic_display_parameters display; 87 #define EDID_FEATURE_PREFERRED_TIMING_MODE (1 << 1) 88 struct edid_chromaticity_coordinates chromaticity; 89 uint8_t established_timings_1; 90 uint8_t established_timings_2; 91 uint8_t manufacturer_reserved_timings; 92 uint16_t standard_timings[8]; 93 struct edid_detailed_timings detailed_timings[4]; 94 uint8_t number_of_extensions; 95 uint8_t checksum; 96 } __packed; 97 98 extern struct vesa_edid_info *edid_info; 99 100 #define STD_TIMINGS 8 101 #define DET_TIMINGS 4 102 103 #define HSIZE(x) (((x & 0xff) + 31) * 8) 104 #define RATIO(x) ((x & 0xC000) >> 14) 105 #define RATIO1_1 0 106 /* EDID Ver. 1.3 redefined this */ 107 #define RATIO16_10 RATIO1_1 108 #define RATIO4_3 1 109 #define RATIO5_4 2 110 #define RATIO16_9 3 111 112 /* 113 * Number of pixels and lines is 12-bit int, valid values 0-4095. 114 */ 115 #define EDID_MAX_PIXELS 4095 116 #define EDID_MAX_LINES 4095 117 118 #define GET_EDID_INFO_WIDTH(edid_info, timings_num) \ 119 ((edid_info)->detailed_timings[(timings_num)].horizontal_active_lo | \ 120 (((uint_t)(edid_info)->detailed_timings[(timings_num)].horizontal_hi & \ 121 0xf0) << 4)) 122 123 #define GET_EDID_INFO_HEIGHT(edid_info, timings_num) \ 124 ((edid_info)->detailed_timings[(timings_num)].vertical_active_lo | \ 125 (((uint_t)(edid_info)->detailed_timings[(timings_num)].vertical_hi & \ 126 0xf0) << 4)) 127 128 struct resolution { 129 uint32_t width; 130 uint32_t height; 131 TAILQ_ENTRY(resolution) next; 132 }; 133 134 typedef TAILQ_HEAD(edid_resolution, resolution) edid_res_list_t; 135 136 extern multiboot_tag_framebuffer_t gfx_fb; 137 138 typedef enum { 139 GfxFbBltVideoFill, 140 GfxFbBltVideoToBltBuffer, 141 GfxFbBltBufferToVideo, 142 GfxFbBltVideoToVideo, 143 GfxFbBltOperationMax, 144 } GFXFB_BLT_OPERATION; 145 146 int gfxfb_blt(void *, GFXFB_BLT_OPERATION, uint32_t, uint32_t, 147 uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); 148 149 void bios_text_font(bool); 150 bool gfx_get_edid_resolution(struct vesa_edid_info *, edid_res_list_t *); 151 void gfx_framework_init(void); 152 uint32_t gfx_fb_color_map(uint8_t); 153 int gfx_fb_cons_clear(struct vis_consclear *); 154 void gfx_fb_cons_copy(struct vis_conscopy *); 155 void gfx_fb_cons_display(struct vis_consdisplay *); 156 void gfx_fb_display_cursor(struct vis_conscursor *); 157 void gfx_fb_setpixel(uint32_t, uint32_t); 158 void gfx_fb_drawrect(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); 159 void gfx_term_drawrect(uint32_t, uint32_t, uint32_t, uint32_t); 160 void gfx_fb_line(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); 161 void gfx_fb_bezier(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, 162 uint32_t); 163 void plat_cons_update_mode(int); 164 165 #define FL_PUTIMAGE_BORDER 0x1 166 #define FL_PUTIMAGE_NOSCROLL 0x2 167 #define FL_PUTIMAGE_DEBUG 0x80 168 169 int gfx_fb_putimage(png_t *, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); 170 171 bool gfx_parse_mode_str(char *, int *, int *, int *); 172 #ifdef __cplusplus 173 } 174 #endif 175 176 #endif /* _GFX_FB_H */ 177