xref: /freebsd/stand/common/gfx_fb.h (revision a96ef4501919d7ac08e94e98dc34b0bdd744802b)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright 2020 Toomas Soome
5  * Copyright 2020 RackTop Systems, Inc.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 #ifndef _GFX_FB_H
32 #define	_GFX_FB_H
33 
34 #include <sys/font.h>
35 #include <teken.h>
36 #include <stdbool.h>
37 #include <machine/metadata.h>
38 #include <pnglite.h>
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 #define	EDID_MAGIC	{ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }
45 
46 struct edid_header {
47 	uint8_t header[8];	/* fixed header pattern */
48 	uint16_t manufacturer_id;
49 	uint16_t product_code;
50 	uint32_t serial_number;
51 	uint8_t week_of_manufacture;
52 	uint8_t year_of_manufacture;
53 	uint8_t version;
54 	uint8_t revision;
55 };
56 
57 struct edid_basic_display_parameters {
58 	uint8_t video_input_parameters;
59 	uint8_t max_horizontal_image_size;
60 	uint8_t max_vertical_image_size;
61 	uint8_t display_gamma;
62 	uint8_t supported_features;
63 };
64 
65 struct edid_chromaticity_coordinates {
66 	uint8_t red_green_lo;
67 	uint8_t blue_white_lo;
68 	uint8_t red_x_hi;
69 	uint8_t red_y_hi;
70 	uint8_t green_x_hi;
71 	uint8_t green_y_hi;
72 	uint8_t blue_x_hi;
73 	uint8_t blue_y_hi;
74 	uint8_t white_x_hi;
75 	uint8_t white_y_hi;
76 };
77 
78 struct edid_detailed_timings {
79 	uint16_t pixel_clock;
80 	uint8_t horizontal_active_lo;
81 	uint8_t horizontal_blanking_lo;
82 	uint8_t horizontal_hi;
83 	uint8_t vertical_active_lo;
84 	uint8_t vertical_blanking_lo;
85 	uint8_t vertical_hi;
86 	uint8_t horizontal_sync_offset_lo;
87 	uint8_t horizontal_sync_pulse_width_lo;
88 	uint8_t vertical_sync_lo;
89 	uint8_t sync_hi;
90 	uint8_t horizontal_image_size_lo;
91 	uint8_t vertical_image_size_lo;
92 	uint8_t image_size_hi;
93 	uint8_t horizontal_border;
94 	uint8_t vertical_border;
95 	uint8_t features;
96 };
97 
98 struct vesa_edid_info {
99 	struct edid_header header;
100 	struct edid_basic_display_parameters display;
101 #define	EDID_FEATURE_PREFERRED_TIMING_MODE	(1 << 1)
102 	struct edid_chromaticity_coordinates chromaticity;
103 	uint8_t established_timings_1;
104 	uint8_t established_timings_2;
105 	uint8_t manufacturer_reserved_timings;
106 	uint16_t standard_timings[8];
107 	struct edid_detailed_timings detailed_timings[4];
108 	uint8_t number_of_extensions;
109 	uint8_t checksum;
110 } __packed;
111 
112 #define	STD_TIMINGS	8
113 #define	DET_TIMINGS	4
114 
115 #define	HSIZE(x)	(((x & 0xff) + 31) * 8)
116 #define	RATIO(x)	((x & 0xC000) >> 14)
117 #define	RATIO1_1	0
118 /* EDID Ver. 1.3 redefined this */
119 #define	RATIO16_10	RATIO1_1
120 #define	RATIO4_3	1
121 #define	RATIO5_4	2
122 #define	RATIO16_9	3
123 
124 /*
125  * Number of pixels and lines is 12-bit int, valid values 0-4095.
126  */
127 #define	EDID_MAX_PIXELS	4095
128 #define	EDID_MAX_LINES	4095
129 
130 #define	GET_EDID_INFO_WIDTH(edid_info, timings_num) \
131     ((edid_info)->detailed_timings[(timings_num)].horizontal_active_lo | \
132     (((uint32_t)(edid_info)->detailed_timings[(timings_num)].horizontal_hi & \
133     0xf0) << 4))
134 
135 #define	GET_EDID_INFO_HEIGHT(edid_info, timings_num) \
136     ((edid_info)->detailed_timings[(timings_num)].vertical_active_lo | \
137     (((uint32_t)(edid_info)->detailed_timings[(timings_num)].vertical_hi & \
138     0xf0) << 4))
139 
140 struct resolution {
141 	uint32_t width;
142 	uint32_t height;
143 	TAILQ_ENTRY(resolution) next;
144 };
145 
146 typedef TAILQ_HEAD(edid_resolution, resolution) edid_res_list_t;
147 
148 struct vesa_flat_panel_info {
149 	uint16_t HSize;			/* Horizontal Size in Pixels */
150 	uint16_t VSize;			/* Vertical Size in Lines */
151 	uint16_t FPType;		/* Flat Panel Type */
152 	uint8_t RedBPP;			/* Red Bits Per Primary */
153 	uint8_t GreenBPP;		/* Green Bits Per Primary */
154 	uint8_t BlueBPP;		/* Blue Bits Per Primary */
155 	uint8_t ReservedBPP;		/* Reserved Bits Per Primary */
156 	uint32_t RsvdOffScrnMemSize;	/* Size in KB of Offscreen Memory */
157 	uint32_t RsvdOffScrnMemPtr; /* Pointer to reserved offscreen memory */
158 	uint8_t Reserved[14];		/* remainder of FPInfo */
159 } __packed;
160 
161 #define	COLOR_FORMAT_VGA 0
162 #define	COLOR_FORMAT_RGB 1
163 #define	NCOLORS	16
164 #define	NCMAP	256
165 extern uint32_t cmap[NCMAP];
166 
167 /*
168  * VT_FB_MAX_WIDTH and VT_FB_MAX_HEIGHT are dimensions from where
169  * we will not auto select smaller font than 8x16.
170  * See also sys/dev/vt/vt.h
171  */
172 #ifndef VT_FB_MAX_WIDTH
173 #define	VT_FB_MAX_WIDTH		4096
174 #endif
175 #ifndef VT_FB_MAX_HEIGHT
176 #define	VT_FB_MAX_HEIGHT	2400
177 #endif
178 
179 enum FB_TYPE {
180 	FB_TEXT = -1,
181 	FB_GOP,
182 	FB_UGA,
183 	FB_VBE
184 };
185 
186 enum COLOR_TYPE {
187 	CT_INDEXED,
188 	CT_RGB
189 };
190 
191 struct gen_fb {
192 	uint64_t	fb_addr;
193 	uint64_t	fb_size;
194 	uint32_t	fb_height;
195 	uint32_t	fb_width;
196 	uint32_t	fb_stride;
197 	uint32_t	fb_mask_red;
198 	uint32_t	fb_mask_green;
199 	uint32_t	fb_mask_blue;
200 	uint32_t	fb_mask_reserved;
201 	uint32_t	fb_bpp;
202 };
203 
204 typedef struct teken_gfx {
205 	enum FB_TYPE	tg_fb_type;
206 	enum COLOR_TYPE tg_ctype;
207 	unsigned	tg_mode;
208 	teken_t		tg_teken;		/* Teken core */
209 	teken_pos_t	tg_cursor;		/* Where cursor was drawn */
210 	bool		tg_cursor_visible;
211 	teken_pos_t	tg_tp;			/* Terminal dimensions */
212 	teken_pos_t	tg_origin;		/* Point of origin in pixels */
213 	uint8_t		*tg_glyph;		/* Memory for glyph */
214 	size_t		tg_glyph_size;
215 	struct vt_font	tg_font;
216 	struct gen_fb	tg_fb;
217 	teken_funcs_t	*tg_functions;
218 	void		*tg_private;
219 	bool		tg_kernel_supported;	/* Loaded kernel is supported */
220 } teken_gfx_t;
221 
222 extern font_list_t fonts;
223 extern teken_gfx_t gfx_state;
224 
225 typedef enum {
226 	GfxFbBltVideoFill,
227 	GfxFbBltVideoToBltBuffer,
228 	GfxFbBltBufferToVideo,
229 	GfxFbBltVideoToVideo,
230 	GfxFbBltOperationMax,
231 } GFXFB_BLT_OPERATION;
232 
233 int gfxfb_blt(void *, GFXFB_BLT_OPERATION, uint32_t, uint32_t,
234     uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
235 
236 int generate_cons_palette(uint32_t *, int, uint32_t, int, uint32_t, int,
237     uint32_t, int);
238 bool console_update_mode(bool);
239 void setup_font(teken_gfx_t *, teken_unit_t, teken_unit_t);
240 uint8_t *font_lookup(const struct vt_font *, teken_char_t,
241     const teken_attr_t *);
242 void bios_text_font(bool);
243 
244 /* teken callbacks. */
245 tf_cursor_t gfx_fb_cursor;
246 tf_putchar_t gfx_fb_putchar;
247 tf_fill_t gfx_fb_fill;
248 tf_copy_t gfx_fb_copy;
249 tf_param_t gfx_fb_param;
250 
251 /* Screen buffer element */
252 struct text_pixel {
253 	teken_char_t c;
254 	teken_attr_t a;
255 };
256 
257 extern const int cons_to_vga_colors[NCOLORS];
258 
259 /* Screen buffer to track changes on the terminal screen. */
260 extern struct text_pixel *screen_buffer;
261 bool is_same_pixel(struct text_pixel *, struct text_pixel *);
262 
263 bool gfx_get_edid_resolution(struct vesa_edid_info *, edid_res_list_t *);
264 void gfx_framework_init(void);
265 void gfx_fb_cons_display(uint32_t, uint32_t, uint32_t, uint32_t, void *);
266 void gfx_fb_setpixel(uint32_t, uint32_t);
267 void gfx_fb_drawrect(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
268 void gfx_term_drawrect(uint32_t, uint32_t, uint32_t, uint32_t);
269 void gfx_fb_line(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
270 void gfx_fb_bezier(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t,
271 	uint32_t);
272 
273 #define	FL_PUTIMAGE_BORDER	0x1
274 #define	FL_PUTIMAGE_NOSCROLL	0x2
275 #define	FL_PUTIMAGE_DEBUG	0x80
276 
277 int gfx_fb_putimage(png_t *, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
278 bool gfx_parse_mode_str(char *, int *, int *, int *);
279 void term_image_display(teken_gfx_t *, const teken_rect_t *);
280 
281 void reset_font_flags(void);
282 
283 #ifdef __cplusplus
284 }
285 #endif
286 
287 #endif /* _GFX_FB_H */
288