18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _UVESAFB_H
38c2ecf20Sopenharmony_ci#define _UVESAFB_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <uapi/video/uvesafb.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci/* VBE CRTC Info Block */
98c2ecf20Sopenharmony_cistruct vbe_crtc_ib {
108c2ecf20Sopenharmony_ci	u16 horiz_total;
118c2ecf20Sopenharmony_ci	u16 horiz_start;
128c2ecf20Sopenharmony_ci	u16 horiz_end;
138c2ecf20Sopenharmony_ci	u16 vert_total;
148c2ecf20Sopenharmony_ci	u16 vert_start;
158c2ecf20Sopenharmony_ci	u16 vert_end;
168c2ecf20Sopenharmony_ci	u8  flags;
178c2ecf20Sopenharmony_ci	u32 pixel_clock;
188c2ecf20Sopenharmony_ci	u16 refresh_rate;
198c2ecf20Sopenharmony_ci	u8  reserved[40];
208c2ecf20Sopenharmony_ci} __attribute__ ((packed));
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#define VBE_MODE_VGACOMPAT	0x20
238c2ecf20Sopenharmony_ci#define VBE_MODE_COLOR		0x08
248c2ecf20Sopenharmony_ci#define VBE_MODE_SUPPORTEDHW	0x01
258c2ecf20Sopenharmony_ci#define VBE_MODE_GRAPHICS	0x10
268c2ecf20Sopenharmony_ci#define VBE_MODE_LFB		0x80
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define VBE_MODE_MASK		(VBE_MODE_COLOR | VBE_MODE_SUPPORTEDHW | \
298c2ecf20Sopenharmony_ci				VBE_MODE_GRAPHICS | VBE_MODE_LFB)
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/* VBE Mode Info Block */
328c2ecf20Sopenharmony_cistruct vbe_mode_ib {
338c2ecf20Sopenharmony_ci	/* for all VBE revisions */
348c2ecf20Sopenharmony_ci	u16 mode_attr;
358c2ecf20Sopenharmony_ci	u8  winA_attr;
368c2ecf20Sopenharmony_ci	u8  winB_attr;
378c2ecf20Sopenharmony_ci	u16 win_granularity;
388c2ecf20Sopenharmony_ci	u16 win_size;
398c2ecf20Sopenharmony_ci	u16 winA_seg;
408c2ecf20Sopenharmony_ci	u16 winB_seg;
418c2ecf20Sopenharmony_ci	u32 win_func_ptr;
428c2ecf20Sopenharmony_ci	u16 bytes_per_scan_line;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	/* for VBE 1.2+ */
458c2ecf20Sopenharmony_ci	u16 x_res;
468c2ecf20Sopenharmony_ci	u16 y_res;
478c2ecf20Sopenharmony_ci	u8  x_char_size;
488c2ecf20Sopenharmony_ci	u8  y_char_size;
498c2ecf20Sopenharmony_ci	u8  planes;
508c2ecf20Sopenharmony_ci	u8  bits_per_pixel;
518c2ecf20Sopenharmony_ci	u8  banks;
528c2ecf20Sopenharmony_ci	u8  memory_model;
538c2ecf20Sopenharmony_ci	u8  bank_size;
548c2ecf20Sopenharmony_ci	u8  image_pages;
558c2ecf20Sopenharmony_ci	u8  reserved1;
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	/* Direct color fields for direct/6 and YUV/7 memory models. */
588c2ecf20Sopenharmony_ci	/* Offsets are bit positions of lsb in the mask. */
598c2ecf20Sopenharmony_ci	u8  red_len;
608c2ecf20Sopenharmony_ci	u8  red_off;
618c2ecf20Sopenharmony_ci	u8  green_len;
628c2ecf20Sopenharmony_ci	u8  green_off;
638c2ecf20Sopenharmony_ci	u8  blue_len;
648c2ecf20Sopenharmony_ci	u8  blue_off;
658c2ecf20Sopenharmony_ci	u8  rsvd_len;
668c2ecf20Sopenharmony_ci	u8  rsvd_off;
678c2ecf20Sopenharmony_ci	u8  direct_color_info;	/* direct color mode attributes */
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	/* for VBE 2.0+ */
708c2ecf20Sopenharmony_ci	u32 phys_base_ptr;
718c2ecf20Sopenharmony_ci	u8  reserved2[6];
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	/* for VBE 3.0+ */
748c2ecf20Sopenharmony_ci	u16 lin_bytes_per_scan_line;
758c2ecf20Sopenharmony_ci	u8  bnk_image_pages;
768c2ecf20Sopenharmony_ci	u8  lin_image_pages;
778c2ecf20Sopenharmony_ci	u8  lin_red_len;
788c2ecf20Sopenharmony_ci	u8  lin_red_off;
798c2ecf20Sopenharmony_ci	u8  lin_green_len;
808c2ecf20Sopenharmony_ci	u8  lin_green_off;
818c2ecf20Sopenharmony_ci	u8  lin_blue_len;
828c2ecf20Sopenharmony_ci	u8  lin_blue_off;
838c2ecf20Sopenharmony_ci	u8  lin_rsvd_len;
848c2ecf20Sopenharmony_ci	u8  lin_rsvd_off;
858c2ecf20Sopenharmony_ci	u32 max_pixel_clock;
868c2ecf20Sopenharmony_ci	u16 mode_id;
878c2ecf20Sopenharmony_ci	u8  depth;
888c2ecf20Sopenharmony_ci} __attribute__ ((packed));
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#define UVESAFB_DEFAULT_MODE "640x480-16"
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci/* How long to wait for a reply from userspace [ms] */
938c2ecf20Sopenharmony_ci#define UVESAFB_TIMEOUT 5000
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci/* Max number of concurrent tasks */
968c2ecf20Sopenharmony_ci#define UVESAFB_TASKS_MAX 16
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci#define dac_reg	(0x3c8)
998c2ecf20Sopenharmony_ci#define dac_val	(0x3c9)
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_cistruct uvesafb_pal_entry {
1028c2ecf20Sopenharmony_ci	u_char blue, green, red, pad;
1038c2ecf20Sopenharmony_ci} __attribute__ ((packed));
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistruct uvesafb_ktask {
1068c2ecf20Sopenharmony_ci	struct uvesafb_task t;
1078c2ecf20Sopenharmony_ci	void *buf;
1088c2ecf20Sopenharmony_ci	struct completion *done;
1098c2ecf20Sopenharmony_ci	u32 ack;
1108c2ecf20Sopenharmony_ci};
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_cistatic int uvesafb_exec(struct uvesafb_ktask *tsk);
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci#define UVESAFB_EXACT_RES	1
1158c2ecf20Sopenharmony_ci#define UVESAFB_EXACT_DEPTH	2
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_cistruct uvesafb_par {
1188c2ecf20Sopenharmony_ci	struct vbe_ib vbe_ib;		/* VBE Info Block */
1198c2ecf20Sopenharmony_ci	struct vbe_mode_ib *vbe_modes;	/* list of supported VBE modes */
1208c2ecf20Sopenharmony_ci	int vbe_modes_cnt;
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci	u8 nocrtc;
1238c2ecf20Sopenharmony_ci	u8 ypan;			/* 0 - nothing, 1 - ypan, 2 - ywrap */
1248c2ecf20Sopenharmony_ci	u8 pmi_setpal;			/* PMI for palette changes */
1258c2ecf20Sopenharmony_ci	u16 *pmi_base;			/* protected mode interface location */
1268c2ecf20Sopenharmony_ci	void *pmi_start;
1278c2ecf20Sopenharmony_ci	void *pmi_pal;
1288c2ecf20Sopenharmony_ci	u8 *vbe_state_orig;		/*
1298c2ecf20Sopenharmony_ci					 * original hardware state, before the
1308c2ecf20Sopenharmony_ci					 * driver was loaded
1318c2ecf20Sopenharmony_ci					 */
1328c2ecf20Sopenharmony_ci	u8 *vbe_state_saved;		/* state saved by fb_save_state */
1338c2ecf20Sopenharmony_ci	int vbe_state_size;
1348c2ecf20Sopenharmony_ci	atomic_t ref_count;
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	int mode_idx;
1378c2ecf20Sopenharmony_ci	struct vbe_crtc_ib crtc;
1388c2ecf20Sopenharmony_ci	int mtrr_handle;
1398c2ecf20Sopenharmony_ci};
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci#endif /* _UVESAFB_H */
142