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 2016 Toomas Soome <tsoome@me.com>
14  */
15 
16 #ifndef _GFXP_FB_H
17 #define	_GFXP_FB_H
18 
19 /*
20  * gfxp_fb interfaces.
21  */
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #include <sys/framebuffer.h>
28 #include <sys/vgareg.h>
29 #include <sys/vgasubr.h>
30 #include <sys/gfx_private.h>
31 
32 #define	GFXP_FLAG_CONSOLE	0x00000001
33 #define	GFXP_IS_CONSOLE(softc)	((softc)->flags & GFXP_FLAG_CONSOLE)
34 
35 struct gfxp_fb_softc;
36 
37 struct gfxp_ops {
38 	const struct vis_identifier *ident;
39 	int (*kdsetmode)(struct gfxp_fb_softc *softc, int mode);
40 	int (*devinit)(struct gfxp_fb_softc *, struct vis_devinit *data);
41 	void (*cons_copy)(struct gfxp_fb_softc *, struct vis_conscopy *);
42 	void (*cons_display)(struct gfxp_fb_softc *, struct vis_consdisplay *);
43 	void (*cons_cursor)(struct gfxp_fb_softc *, struct vis_conscursor *);
44 	int (*cons_clear)(struct gfxp_fb_softc *, struct vis_consclear *);
45 	int (*suspend)(struct gfxp_fb_softc *softc);
46 	void (*resume)(struct gfxp_fb_softc *softc);
47 	int (*devmap)(dev_t, devmap_cookie_t, offset_t, size_t, size_t *,
48 	    uint_t, void *);
49 };
50 
51 struct vgareg {
52 	unsigned char vga_misc;			/* Misc out reg */
53 	unsigned char vga_crtc[NUM_CRTC_REG];	/* Crtc controller */
54 	unsigned char vga_seq[NUM_SEQ_REG];	/* Video Sequencer */
55 	unsigned char vga_grc[NUM_GRC_REG];	/* Video Graphics */
56 	unsigned char vga_atr[NUM_ATR_REG];	/* Video Atribute */
57 };
58 
59 struct gfx_vga {
60 	struct vgaregmap regs;
61 	struct vgaregmap fb;
62 	off_t fb_size;
63 	int fb_regno;
64 	caddr_t	 text_base;	/* hardware text base */
65 	char shadow[VGA_TEXT_ROWS * VGA_TEXT_COLS * 2];
66 	caddr_t current_base;	/* hardware or shadow */
67 	char vga_fontslot;
68 	struct vgareg vga_reg;
69 	struct {
70 		boolean_t visible;
71 		int row;
72 		int col;
73 	} cursor;
74 	struct {
75 		unsigned char red;
76 		unsigned char green;
77 		unsigned char blue;
78 	} colormap[VGA8_CMAP_ENTRIES];
79 	unsigned char attrib_palette[VGA_ATR_NUM_PLT];
80 };
81 
82 union gfx_console {
83 	struct fb_info fb;
84 	struct gfx_vga vga;
85 };
86 
87 struct gfxp_fb_softc {
88 	dev_info_t		*devi;
89 	int mode;		/* KD_TEXT or KD_GRAPHICS */
90 	enum gfxp_type		fb_type;
91 	unsigned int		flags;
92 	kmutex_t		lock;
93 	char			silent;
94 	char			happyface_boot;
95 	struct vis_polledio	polledio;
96 	struct gfxp_ops		*gfxp_ops;
97 	struct gfxp_blt_ops	blt_ops;
98 	struct fbgattr		*fbgattr;
99 	union gfx_console	*console;
100 };
101 
102 /* function definitions */
103 int gfxp_bm_attach(dev_info_t *, struct gfxp_fb_softc *);
104 int gfxp_bm_detach(dev_info_t *, struct gfxp_fb_softc *);
105 
106 int gfxp_vga_attach(dev_info_t *, struct gfxp_fb_softc *);
107 int gfxp_vga_detach(dev_info_t *, struct gfxp_fb_softc *);
108 
109 #ifdef __cplusplus
110 }
111 #endif
112 
113 #endif /* _GFXP_FB_H */
114