142421Syokota/*-
242421Syokota * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
342421Syokota * All rights reserved.
442421Syokota *
542421Syokota * Redistribution and use in source and binary forms, with or without
642421Syokota * modification, are permitted provided that the following conditions
742421Syokota * are met:
842421Syokota * 1. Redistributions of source code must retain the above copyright
942421Syokota *    notice, this list of conditions and the following disclaimer as
1042421Syokota *    the first lines of this file unmodified.
1142421Syokota * 2. Redistributions in binary form must reproduce the above copyright
1242421Syokota *    notice, this list of conditions and the following disclaimer in the
1342421Syokota *    documentation and/or other materials provided with the distribution.
1442421Syokota *
1542421Syokota * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1642421Syokota * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1742421Syokota * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1842421Syokota * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1942421Syokota * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2042421Syokota * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2142421Syokota * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2242421Syokota * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2342421Syokota * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2442421Syokota * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2542421Syokota *
2650477Speter * $FreeBSD$
2742421Syokota */
2842421Syokota
2942421Syokota#ifndef _DEV_FB_FBREG_H_
3042421Syokota#define _DEV_FB_FBREG_H_
3142421Syokota
3255205Speter#ifdef _KERNEL
3342421Syokota
3442421Syokota#define V_MAX_ADAPTERS		8		/* XXX */
3542421Syokota
3642421Syokota/* some macros */
37209460Skib#if defined(__amd64__) || defined(__i386__)
38237203Sphk
39237203Sphkstatic __inline void
40237203Sphkcopyw(uint16_t *src, uint16_t *dst, size_t size)
41237203Sphk{
42237223Sphk	size >>= 1;
43237203Sphk	while (size--)
44237203Sphk		*dst++ = *src++;
45237203Sphk}
46237203Sphk#define bcopy_io(s, d, c)	copyw((void*)(s), (void*)(d), (c))
47237203Sphk#define bcopy_toio(s, d, c)	copyw((void*)(s), (void*)(d), (c))
48237203Sphk#define bcopy_fromio(s, d, c)	copyw((void*)(s), (void*)(d), (c))
49114383Speter#define bzero_io(d, c)		bzero((void *)(d), (c))
50114383Speter#define fill_io(p, d, c)	fill((p), (void *)(d), (c))
51114383Speter#define fillw_io(p, d, c)	fillw((p), (void *)(d), (c))
52268351Smarcel#elif defined(__sparc64__)
53114199Smarcelstatic __inline void
54114199Smarcelfillw(int val, uint16_t *buf, size_t size)
55114199Smarcel{
56114199Smarcel	while (size--)
57114199Smarcel		*buf++ = val;
58114199Smarcel}
59153165Sru#elif defined(__powerpc__)
60124770Sgrehan
61124770Sgrehan#define bcopy_io(s, d, c)	ofwfb_bcopy((void *)(s), (void *)(d), (c))
62124770Sgrehan#define bcopy_toio(s, d, c)	ofwfb_bcopy((void *)(s), (void *)(d), (c))
63124770Sgrehan#define bcopy_fromio(s, d, c)	ofwfb_bcopy((void *)(s), (void *)(d), (c))
64124770Sgrehan#define bzero_io(d, c)		ofwfb_bzero((void *)(d), (c))
65124770Sgrehan#define fillw(p, d, c)		ofwfb_fillw((p), (void *)(d), (c))
66124770Sgrehan#define fillw_io(p, d, c)	ofwfb_fillw((p), (void *)(d), (c))
67124770Sgrehan#define	readw(a)		ofwfb_readw((u_int16_t *)(a))
68124770Sgrehan#define	writew(a, v)		ofwfb_writew((u_int16_t *)(a), (v))
69124770Sgrehanvoid ofwfb_bcopy(const void *s, void *d, size_t c);
70124770Sgrehanvoid ofwfb_bzero(void *d, size_t c);
71124770Sgrehanvoid ofwfb_fillw(int pat, void *base, size_t cnt);
72124770Sgrehanu_int16_t ofwfb_readw(u_int16_t *addr);
73124770Sgrehanvoid ofwfb_writew(u_int16_t *addr, u_int16_t val);
74124770Sgrehan
75239696Sgonzo#elif defined(__mips__) || defined(__arm__)
76239670Srwatson
77239670Srwatson/*
78239670Srwatson * Use amd64/i386-like settings under the assumption that MIPS-based display
79239670Srwatson * drivers will have to add a level of indirection between a syscons-managed
80239670Srwatson * frame buffer and the actual video hardware.  We are forced to do this
81239670Srwatson * because syscons doesn't carry around required busspace handles and tags to
82239670Srwatson * use here.  This is only really a problem for true VGA devices hooked up to
83239670Srwatson * MIPS, as others will be performing a translation anyway.
84239670Srwatson */
85239670Srwatson#define bcopy_io(s, d, c)	memcpy((void *)(d), (void *)(s), (c))
86239670Srwatson#define bcopy_toio(s, d, c)	memcpy((void *)(d), (void *)(s), (c))
87239670Srwatson#define bcopy_fromio(s, d, c)	memcpy((void *)(d), (void *)(s), (c))
88239670Srwatson#define bzero_io(d, c)		memset((void *)(d), 0, (c))
89239670Srwatson#define fill_io(p, d, c)	memset((void *)(d), (p), (c))
90239670Srwatsonstatic __inline void
91239670Srwatsonfillw(int val, uint16_t *buf, size_t size)
92239670Srwatson{
93239670Srwatson	while (size--)
94239670Srwatson		*buf++ = val;
95239670Srwatson}
96239670Srwatson#define fillw_io(p, d, c)	fillw((p), (void *)(d), (c))
97239670Srwatson
98239696Sgonzo#if defined(__arm__)
99239696Sgonzo#define	readw(a)		(*(uint16_t*)(a))
100239696Sgonzo#define	writew(a, v)		(*(uint16_t*)(a) = (v))
101239696Sgonzo#endif
102239696Sgonzo
103268351Smarcel#else /* !__i386__ && !__amd64__ && !__sparc64__ && !__powerpc__ */
10448104Syokota#define bcopy_io(s, d, c)	memcpy_io((d), (s), (c))
10548104Syokota#define bcopy_toio(s, d, c)	memcpy_toio((d), (void *)(s), (c))
10648104Syokota#define bcopy_fromio(s, d, c)	memcpy_fromio((void *)(d), (s), (c))
10748104Syokota#define bzero_io(d, c)		memset_io((d), 0, (c))
10848104Syokota#define fill_io(p, d, c)	memset_io((d), (p), (c))
10948104Syokota#define fillw(p, d, c)		memsetw((d), (p), (c))
11048104Syokota#define fillw_io(p, d, c)	memsetw_io((d), (p), (c))
11142421Syokota#endif /* !__i386__ */
11242421Syokota
11342421Syokota/* video function table */
11442421Syokotatypedef int vi_probe_t(int unit, video_adapter_t **adpp, void *arg, int flags);
11542421Syokotatypedef int vi_init_t(int unit, video_adapter_t *adp, int flags);
11642421Syokotatypedef int vi_get_info_t(video_adapter_t *adp, int mode, video_info_t *info);
11742421Syokotatypedef int vi_query_mode_t(video_adapter_t *adp, video_info_t *info);
11842421Syokotatypedef int vi_set_mode_t(video_adapter_t *adp, int mode);
119150686Smariustypedef int vi_save_font_t(video_adapter_t *adp, int page, int size, int width,
12042421Syokota			   u_char *data, int c, int count);
121150686Smariustypedef int vi_load_font_t(video_adapter_t *adp, int page, int size, int width,
12242421Syokota			   u_char *data, int c, int count);
12342421Syokotatypedef int vi_show_font_t(video_adapter_t *adp, int page);
12442421Syokotatypedef int vi_save_palette_t(video_adapter_t *adp, u_char *palette);
12542421Syokotatypedef int vi_load_palette_t(video_adapter_t *adp, u_char *palette);
12642421Syokotatypedef int vi_set_border_t(video_adapter_t *adp, int border);
12742421Syokotatypedef int vi_save_state_t(video_adapter_t *adp, void *p, size_t size);
12842421Syokotatypedef int vi_load_state_t(video_adapter_t *adp, void *p);
12942421Syokotatypedef int vi_set_win_org_t(video_adapter_t *adp, off_t offset);
13042421Syokotatypedef int vi_read_hw_cursor_t(video_adapter_t *adp, int *col, int *row);
13142421Syokotatypedef int vi_set_hw_cursor_t(video_adapter_t *adp, int col, int row);
13242421Syokotatypedef int vi_set_hw_cursor_shape_t(video_adapter_t *adp, int base,
13342421Syokota				     int height, int celsize, int blink);
13442421Syokotatypedef int vi_blank_display_t(video_adapter_t *adp, int mode);
13581038Syokota/* defined in sys/fbio.h
13648104Syokota#define V_DISPLAY_ON		0
13748104Syokota#define V_DISPLAY_BLANK		1
13848104Syokota#define V_DISPLAY_STAND_BY	2
13948104Syokota#define V_DISPLAY_SUSPEND	3
14081038Syokota*/
141201223Srnolandtypedef int vi_mmap_t(video_adapter_t *adp, vm_ooffset_t offset,
142201223Srnoland		      vm_paddr_t *paddr, int prot, vm_memattr_t *memattr);
14348104Syokotatypedef int vi_ioctl_t(video_adapter_t *adp, u_long cmd, caddr_t data);
14448104Syokotatypedef int vi_clear_t(video_adapter_t *adp);
14548104Syokotatypedef int vi_fill_rect_t(video_adapter_t *adp, int val, int x, int y,
14648104Syokota			   int cx, int cy);
14794617Sobrientypedef int vi_bitblt_t(video_adapter_t *adp, ...);
14842421Syokotatypedef int vi_diag_t(video_adapter_t *adp, int level);
14994617Sobrientypedef int vi_save_cursor_palette_t(video_adapter_t *adp, u_char *palette);
15094617Sobrientypedef int vi_load_cursor_palette_t(video_adapter_t *adp, u_char *palette);
15194617Sobrientypedef int vi_copy_t(video_adapter_t *adp, vm_offset_t src, vm_offset_t dst,
15294617Sobrien		      int n);
15394617Sobrientypedef int vi_putp_t(video_adapter_t *adp, vm_offset_t off, u_int32_t p,
15494617Sobrien		       u_int32_t a, int size, int bpp, int bit_ltor,
15594617Sobrien		       int byte_ltor);
15694617Sobrientypedef int vi_putc_t(video_adapter_t *adp, vm_offset_t off, u_int8_t c,
15794617Sobrien		      u_int8_t a);
15894617Sobrientypedef int vi_puts_t(video_adapter_t *adp, vm_offset_t off, u_int16_t *s,
15994617Sobrien		       int len);
160150686Smariustypedef int vi_putm_t(video_adapter_t *adp, int x, int y, u_int8_t *pixel_image,
161150686Smarius		      u_int32_t pixel_mask, int size, int width);
16242421Syokota
16342421Syokotatypedef struct video_switch {
16442421Syokota    vi_probe_t		*probe;
16542421Syokota    vi_init_t		*init;
16642421Syokota    vi_get_info_t	*get_info;
16742421Syokota    vi_query_mode_t	*query_mode;
16842421Syokota    vi_set_mode_t	*set_mode;
16942421Syokota    vi_save_font_t	*save_font;
17042421Syokota    vi_load_font_t	*load_font;
17142421Syokota    vi_show_font_t	*show_font;
17242421Syokota    vi_save_palette_t	*save_palette;
17342421Syokota    vi_load_palette_t	*load_palette;
17442421Syokota    vi_set_border_t	*set_border;
17542421Syokota    vi_save_state_t	*save_state;
17642421Syokota    vi_load_state_t	*load_state;
17742421Syokota    vi_set_win_org_t	*set_win_org;
17842421Syokota    vi_read_hw_cursor_t	*read_hw_cursor;
17942421Syokota    vi_set_hw_cursor_t	*set_hw_cursor;
18042421Syokota    vi_set_hw_cursor_shape_t *set_hw_cursor_shape;
18142421Syokota    vi_blank_display_t	*blank_display;
18242421Syokota    vi_mmap_t		*mmap;
18348104Syokota    vi_ioctl_t		*ioctl;
18448104Syokota    vi_clear_t		*clear;
18548104Syokota    vi_fill_rect_t	*fill_rect;
18648104Syokota    vi_bitblt_t		*bitblt;
18748104Syokota    int			(*reserved1)(void);
18848104Syokota    int			(*reserved2)(void);
18942421Syokota    vi_diag_t		*diag;
19094617Sobrien    vi_save_cursor_palette_t	*save_cursor_palette;
19194617Sobrien    vi_load_cursor_palette_t	*load_cursor_palette;
19294617Sobrien    vi_copy_t		*copy;
19394617Sobrien    vi_putp_t		*putp;
19494617Sobrien    vi_putc_t		*putc;
19594617Sobrien    vi_puts_t		*puts;
19694617Sobrien    vi_putm_t		*putm;
19742421Syokota} video_switch_t;
19842421Syokota
199174985Swkoszek#define vidd_probe(unit, adpp, arg, flags)				\
200174985Swkoszek	(*vidsw[(adp)->va_index]->probe)((unit), (adpp), (arg), (flags))
201174985Swkoszek#define vidd_init(unit, adp, flags)					\
202174985Swkoszek	(*vidsw[(adp)->va_index]->init)((unit), (adp), (flags))
203174985Swkoszek#define vidd_get_info(adp, mode, info)					\
204174985Swkoszek	(*vidsw[(adp)->va_index]->get_info)((adp), (mode), (info))
205174985Swkoszek#define vidd_query_mode(adp, mode)					\
206174985Swkoszek	(*vidsw[(adp)->va_index]->query_mode)((adp), (mode))
207174985Swkoszek#define vidd_set_mode(adp, mode)					\
20845616Sdes	(*vidsw[(adp)->va_index]->set_mode)((adp), (mode))
209174985Swkoszek#define vidd_save_font(adp, page, size, width, data, c, count)		\
210174985Swkoszek	(*vidsw[(adp)->va_index]->save_font)((adp), (page), (size),	\
211174985Swkoszek	    (width), (data), (c), (count))
212174985Swkoszek#define vidd_load_font(adp, page, size, width, data, c, count)		\
213174985Swkoszek	(*vidsw[(adp)->va_index]->load_font)((adp), (page), (size),	\
214174985Swkoszek	    (width), (data), (c), (count))
215174985Swkoszek#define vidd_show_font(adp, page)					\
216174985Swkoszek	(*vidsw[(adp)->va_index]->show_font)((adp), (page))
217174985Swkoszek#define vidd_save_palette(adp, pallete)					\
218174985Swkoszek	(*vidsw[(adp)->va_index]->save_palette)((adp), (pallete))
219174985Swkoszek#define vidd_load_palette(adp, pallete)					\
220174985Swkoszek	(*vidsw[(adp)->va_index]->load_palette)((adp), (pallete))
221174985Swkoszek#define vidd_set_border(adp, border)					\
22245616Sdes	(*vidsw[(adp)->va_index]->set_border)((adp), (border))
223174985Swkoszek#define vidd_save_state(adp, p, size)					\
224174985Swkoszek	(*vidsw[(adp)->va_index]->save_state)((adp), (p), (size))
225174985Swkoszek#define vidd_load_state(adp, p)						\
226174985Swkoszek	(*vidsw[(adp)->va_index]->load_state)((adp), (p))
227174985Swkoszek#define vidd_set_win_org(adp, offset)					\
228174985Swkoszek	(*vidsw[(adp)->va_index]->set_win_org)((adp), (offset))
229174985Swkoszek#define vidd_read_hw_cursor(adp, col, row)				\
230174985Swkoszek	(*vidsw[(adp)->va_index]->read_hw_cursor)((adp), (col), (row))
231174985Swkoszek#define vidd_set_hw_cursor(adp, col, row)				\
232174985Swkoszek	(*vidsw[(adp)->va_index]->set_hw_cursor)((adp), (col), (row))
233174985Swkoszek#define vidd_set_hw_cursor_shape(adp, base, height, celsize, blink)	\
234174985Swkoszek	(*vidsw[(adp)->va_index]->set_hw_cursor_shape)((adp), (base),	\
235174985Swkoszek	    (height), (celsize), (blink))
236174985Swkoszek#define vidd_blank_display(adp, mode)					\
237174985Swkoszek	(*vidsw[(adp)->va_index]->blank_display)((adp), (mode))
238201223Srnoland#define vidd_mmap(adp, offset, paddr, prot, memattr)			\
239201223Srnoland	(*vidsw[(adp)->va_index]->mmap)((adp), (offset), (paddr),	\
240201223Srnoland	    (prot), (memattr))
241174985Swkoszek#define vidd_ioctl(adp, cmd, data)					\
242174985Swkoszek	(*vidsw[(adp)->va_index]->ioctl)((adp), (cmd), (data))
243174985Swkoszek#define vidd_clear(adp)							\
244174985Swkoszek	(*vidsw[(adp)->va_index]->clear)((adp))
245174985Swkoszek#define vidd_fill_rect(adp, val, x, y, cx, cy)				\
246174985Swkoszek	(*vidsw[(adp)->va_index]->fill_rect)((adp), (val), (x), (y),	\
247174985Swkoszek	    (cx), (cy))
248174985Swkoszek#define vidd_bitblt(adp, ...)						\
249174985Swkoszek	(*vidsw[(adp)->va_index]->bitblt)(adp, __VA_ARGS__)
250174985Swkoszek#define vidd_diag(adp, level)						\
251174985Swkoszek	(*vidsw[(adp)->va_index]->diag)((adp), (level))
252174985Swkoszek#define vidd_save_cursor_palette(adp, palette)				\
253174985Swkoszek	(*vidsw[(adp)->va_index]->save_cursor_palette)((adp), (palette))
254174985Swkoszek#define vidd_load_cursor_palette(adp, palette)				\
255174985Swkoszek	(*vidsw[(adp)->va_index]->load_cursor_palette)((adp), (palette))
256174985Swkoszek#define vidd_copy(adp, src, dst, n)					\
257174985Swkoszek	(*vidsw[(adp)->va_index]->copy)((adp), (src), (dst), (n))
258174985Swkoszek#define vidd_putp(adp, offset, p, a, size, bpp, bit_ltor1, byte_ltor2)	\
259174985Swkoszek	(*vidsw[(adp)->va_index]->putp)((adp), (offset), (p), (a), 	\
260174985Swkoszek	    (size), (bpp), (bit_ltor1), (bit_ltor2))
261174985Swkoszek#define vidd_putc(adp, offset, c, a)					\
262174985Swkoszek	(*vidsw[(adp)->va_index]->putc)((adp), (offset), (c), (a))
263174985Swkoszek#define vidd_puts(adp, offset, s, len)					\
264174985Swkoszek	(*vidsw[(adp)->va_index]->puts)((adp), (offset), (s), (len))
265174985Swkoszek#define vidd_putm(adp, x, y, pixel_image, pixel_mask, size, width)	\
266174985Swkoszek	(*vidsw[(adp)->va_index]->putm)((adp), (x), (y), (pixel_image),	\
267174985Swkoszek	    (pixel_mask), (size), (width))
26845616Sdes
26942421Syokota/* video driver */
27042421Syokotatypedef struct video_driver {
27142421Syokota    char		*name;
27242421Syokota    video_switch_t	*vidsw;
27342421Syokota    int			(*configure)(int); /* backdoor for the console driver */
27442421Syokota} video_driver_t;
27542421Syokota
27642421Syokota#define VIDEO_DRIVER(name, sw, config)			\
27742421Syokota	static struct video_driver name##_driver = {	\
27842421Syokota		#name, &sw, config			\
27942421Syokota	};						\
28042421Syokota	DATA_SET(videodriver_set, name##_driver);
28142421Syokota
28242421Syokota/* global variables */
28342421Syokotaextern struct video_switch **vidsw;
28442421Syokota
28542421Syokota/* functions for the video card driver */
28642421Syokotaint		vid_register(video_adapter_t *adp);
28742421Syokotaint		vid_unregister(video_adapter_t *adp);
28842421Syokotavideo_switch_t	*vid_get_switch(char *name);
28942421Syokotavoid		vid_init_struct(video_adapter_t *adp, char *name, int type,
29042421Syokota				int unit);
29142421Syokota
29242421Syokota/* functions for the video card client */
29342421Syokotaint		vid_allocate(char *driver, int unit, void *id);
29442421Syokotaint		vid_release(video_adapter_t *adp, void *id);
29542421Syokotaint		vid_find_adapter(char *driver, int unit);
29642421Syokotavideo_adapter_t	*vid_get_adapter(int index);
29742421Syokota
29842421Syokota/* a backdoor for the console driver to tickle the video driver XXX */
29942421Syokotaint		vid_configure(int flags);
30042421Syokota#define VIO_PROBE_ONLY	(1 << 0)	/* probe only, don't initialize */
30142421Syokota
30242421Syokota#ifdef FB_INSTALL_CDEV
30342421Syokota
30442421Syokota/* virtual frame buffer driver functions */
305120465Sphkint		fb_attach(int unit, video_adapter_t *adp,
30642421Syokota			  struct cdevsw *cdevsw);
307120465Sphkint		fb_detach(int unit, video_adapter_t *adp,
30842421Syokota			  struct cdevsw *cdevsw);
30942421Syokota
31048104Syokota/* generic frame buffer cdev driver functions */
31148104Syokota
31248104Syokotatypedef struct genfb_softc {
31348104Syokota	int		gfb_flags;	/* flag/status bits */
31448104Syokota#define FB_OPEN		(1 << 0)
31548104Syokota} genfb_softc_t;
31648104Syokota
31748104Syokotaint		genfbopen(genfb_softc_t *sc, video_adapter_t *adp,
31883366Sjulian			  int flag, int mode, struct thread *td);
31948104Syokotaint		genfbclose(genfb_softc_t *sc, video_adapter_t *adp,
32083366Sjulian			   int flag, int mode, struct thread *td);
32148104Syokotaint		genfbread(genfb_softc_t *sc, video_adapter_t *adp,
32248104Syokota			  struct uio *uio, int flag);
32348104Syokotaint		genfbwrite(genfb_softc_t *sc, video_adapter_t *adp,
32448104Syokota			   struct uio *uio, int flag);
32548104Syokotaint		genfbioctl(genfb_softc_t *sc, video_adapter_t *adp,
32683366Sjulian			   u_long cmd, caddr_t arg, int flag, struct thread *td);
32748104Syokotaint		genfbmmap(genfb_softc_t *sc, video_adapter_t *adp,
328201223Srnoland			  vm_ooffset_t offset, vm_offset_t *paddr,
329201223Srnoland			  int prot, vm_memattr_t *memattr);
33048104Syokota
33142421Syokota#endif /* FB_INSTALL_CDEV */
33242421Syokota
33342421Syokota/* generic low-level driver functions */
33442421Syokota
33542421Syokotavoid		fb_dump_adp_info(char *driver, video_adapter_t *adp, int level);
33642421Syokotavoid		fb_dump_mode_info(char *driver, video_adapter_t *adp,
33742421Syokota				  video_info_t *info, int level);
33848104Syokotaint		fb_type(int adp_type);
33948104Syokotaint		fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg);
34042421Syokota
34155205Speter#endif /* _KERNEL */
34242421Syokota
34342421Syokota#endif /* !_DEV_FB_FBREG_H_ */
344