/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1986,1997-1998 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _SYS_FBIO_H
#define	_SYS_FBIO_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SunOS4.1.2 5.49 */

#include <sys/types.h>

#ifdef	__cplusplus
extern "C" {
#endif

#ifndef ASM
/*
 * Frame buffer descriptor.
 * Returned by FBIOGTYPE ioctl on frame buffer devices.
 */
struct	fbtype {
	int	fb_type;	/* as defined below */
	int	fb_height;	/* in pixels */
	int	fb_width;	/* in pixels */
	int	fb_depth;	/* bits per pixel */
	int	fb_cmsize;	/* size of color map (entries) */
	int	fb_size;	/* total size in bytes */
};

#define	FIOC		('F'<<8)
#define	FBIOGTYPE	(FIOC|0)

#ifdef	_KERNEL
struct	fbpixrect {
	struct	pixrect *fbpr_pixrect;	/* Pixrect of dev returned here */
};

#define	FBIOGPIXRECT	(FIOC|1)
#endif /* _KERNEL */

/*
 * General purpose structure for passing info in and out of frame buffers
 * (used for gp1)
 */
struct	fbinfo {
	int		fb_physaddr;	/* physical frame buffer address */
	int		fb_hwwidth;	/* fb board width */
	int		fb_hwheight;	/* fb board height */
	int		fb_addrdelta;	/* phys addr diff between boards */
	unsigned char	*fb_ropaddr;	/* fb va thru kernelmap */
	int		fb_unit;	/* minor devnum of fb */
};

#define	FBIOGINFO	(FIOC|2)

/*
 * Color map I/O.  See also fbcmap_i below.
 */
struct	fbcmap {
	int		index;		/* first element (0 origin) */
	int		count;		/* number of elements */
	unsigned char	*red;		/* red color map elements */
	unsigned char	*green;		/* green color map elements */
	unsigned char	*blue;		/* blue color map elements */
};

#ifdef _SYSCALL32

struct	fbcmap32 {
	int32_t		index;		/* first element (0 origin) */
	int32_t		count;		/* number of elements */
	caddr32_t 	red;		/* red color map elements */
	caddr32_t 	green;		/* green color map elements */
	caddr32_t 	blue;		/* blue color map elements */
};

#endif	/* _SYSCALL32 */

#define	FBIOPUTCMAP	(FIOC|3)
#define	FBIOGETCMAP	(FIOC|4)

/*
 * Set/Get attributes
 */
#define	FB_ATTR_NDEVSPECIFIC	8	/* no. of device specific values */
#define	FB_ATTR_NEMUTYPES	4	/* no. of emulation types */

struct fbsattr {
	int	flags;			/* misc flags */
#define	FB_ATTR_AUTOINIT	1	/* emulation auto init flag */
#define	FB_ATTR_DEVSPECIFIC	2	/* dev. specific stuff valid flag */
	int	emu_type;		/* emulation type (-1 if unused) */
	int	dev_specific[FB_ATTR_NDEVSPECIFIC];	/* catchall */
};

struct fbgattr {
	int	real_type;		/* real device type */
	int	owner;			/* PID of owner, 0 if myself */
	struct fbtype fbtype;		/* fbtype info for real device */
	struct fbsattr sattr;		/* see above */
	int	emu_types[FB_ATTR_NEMUTYPES];	/* possible emulations */
						/* (-1 if unused) */
};

#define	FBIOSATTR	(FIOC|5)
#define	FBIOGATTR	(FIOC|6)


/*
 * Video control
 * (the unused bits are reserved for future use)
 */
#define	FBVIDEO_OFF	0
#define	FBVIDEO_ON	1

#define	FBIOSVIDEO	(FIOC|7)
#define	FBIOGVIDEO	(FIOC|8)

/* Vertical retrace support. */
#define	FBIOVERTICAL	(FIOC|9)
#define	GRABPAGEALLOC	(FIOC|10)
#define	GRABPAGEFREE	(FIOC|11)
#define	GRABATTACH	(FIOC|12)

#define	FBIOGPLNGRP	(FIOC|13)
#define	FBIOGCMSIZE	(FIOC|14)
#define	FBIOSCMSIZE	(FIOC|15)
#define	FBIOSCMS	(FIOC|16)
#define	FBIOAVAILPLNGRP (FIOC|17)


/*
 * Structure to pass double buffering state back and forth the device.
 */

/* used in devstate */
#define	FBDBL_AVAIL	0x80000000
#define	FBDBL_DONT_BLOCK 0x40000000
#define	FBDBL_AVAIL_PG	0x20000000

/* used in read/write/display */
#define	FBDBL_A	 0x1
#define	FBDBL_B	 0x2
#define	FBDBL_BOTH	(FBDBL_A | FBDBL_B)
#define	FBDBL_NONE	0x4

struct fbdblinfo {
	unsigned int	dbl_devstate;
	unsigned int	dbl_read;
	unsigned int	dbl_write;
	unsigned int	dbl_display;
	int		dbl_depth;
	char		dbl_wid;
};

#define	FBIODBLGINFO	(FIOC|18)
#define	FBIODBLSINFO	(FIOC|19)

/* 8-bit emulation in 24-bit ioctls */

#define	FBIOSWINFD	(FIOC|20)
#define	FBIOSAVWINFD	(FIOC|21)
#define	FBIORESWINFD	(FIOC|22)
#define	FBIOSRWINFD	(FIOC|23)

/*
 * hardware cursor control
 */

struct fbcurpos {
	short x, y;
};

struct fbcursor {
	short set;		/* what to set */
#define	FB_CUR_SETCUR	0x01
#define	FB_CUR_SETPOS	0x02
#define	FB_CUR_SETHOT	0x04
#define	FB_CUR_SETCMAP	0x08
#define	FB_CUR_SETSHAPE 0x10
#define	FB_CUR_SETALL	0x1F
	short enable;		/* cursor on/off */
	struct fbcurpos pos;	/* cursor position */
	struct fbcurpos hot;	/* cursor hot spot */
	struct fbcmap cmap;	/* color map info */
	struct fbcurpos size;	/* cursor bit map size */
	char *image;		/* cursor image bits */
	char *mask;		/* cursor mask bits */
};

#ifdef _SYSCALL32
struct fbcursor32 {
	short set;		/* what to set */
	short enable;		/* cursor on/off */
	struct fbcurpos pos;	/* cursor position */
	struct fbcurpos hot;	/* cursor hot spot */
	struct fbcmap32 cmap;	/* color map info */
	struct fbcurpos size;	/* cursor bit map size */
	caddr32_t image;	/* cursor image bits */
	caddr32_t mask;		/* cursor mask bits */
};
#endif	/* _SYSCALL32 */

/* set/get cursor attributes/shape */
#define	FBIOSCURSOR	(FIOC|24)
#define	FBIOGCURSOR	(FIOC|25)

/* set/get cursor position */
#define	FBIOSCURPOS	(FIOC|26)
#define	FBIOGCURPOS	(FIOC|27)

/* get max cursor size */
#define	FBIOGCURMAX	(FIOC|28)

/* Window Grabber info ioctl */
#define	GRABLOCKINFO	(FIOC|29)

/*
 * Window Identification (wid) defines, structures, and ioctls.
 *
 * Some wids need to be unique when used for things such as double
 * buffering or rendering clipping.  Some wids can be shared when
 * used for display attributes only.  What can be shared and how
 * may be device dependent.  The fb_wid_alloc.wa_type and fb_wid_item
 * structure members will be left to device specific interpretation.
 */

#define	FB_WID_SHARED_8		0
#define	FB_WID_SHARED_24	1
#define	FB_WID_DBL_8		2
#define	FB_WID_DBL_24		3

struct fb_wid_alloc {
	unsigned int	wa_type;	/* special attributes		*/
	int		wa_index;	/* base wid returned		*/
	unsigned int	wa_count;	/* how many contiguous wids	*/
};

struct fb_wid_item {
	unsigned int	wi_type;	/* special attributes		*/
	int		wi_index;	/* which lut			*/
	unsigned int	wi_attrs;	/* which attributes		*/
	unsigned int	wi_values[NBBY*sizeof (int)]; /* the attr values */
};

struct fb_wid_list {
	unsigned int	wl_flags;
	unsigned int	wl_count;
	struct fb_wid_item	*wl_list;
};

#ifdef _SYSCALL32

struct fb_wid_list32 {
	uint32_t	wl_flags;
	uint32_t	wl_count;
	caddr32_t	wl_list;
};

#endif /* _SYSCALL32 */

struct fb_wid_dbl_info {
	struct fb_wid_alloc dbl_wid;
	char		dbl_fore;
	char		dbl_back;
	char		dbl_read_state;
	char		dbl_write_state;
};

#define	FBIO_WID_ALLOC	(FIOC|30)
#define	FBIO_WID_FREE	(FIOC|31)
#define	FBIO_WID_PUT	(FIOC|32)
#define	FBIO_WID_GET	(FIOC|33)

#define	FBIO_DEVID	(FIOC|34)
#define	FBIO_U_RST	(FIOC|35)
#define	FBIO_FULLSCREEN_ELIMINATION_GROUPS	(FIOC|36)
#define	FBIO_WID_DBL_SET	(FIOC|37)
#define	FBIOVRTOFFSET	(FIOC|38)

struct cg6_info {
	ushort_t  accessible_width;	/* accessible bytes in scanline */
	ushort_t  accessible_height;	/* number of accessible scanlines */
	ushort_t  line_bytes;		/* number of bytes/scanline */
	ushort_t  hdb_capable;		/* can this thing hardware db? */
	ushort_t  vmsize;		/* this is Mb of video memory */
	uchar_t	  boardrev;		/* board revision # */
	uchar_t	  slot;			/* sbus slot # */
	uint_t	  pad1;			/* expansion */
};

struct s3_info {
	ushort_t  accessible_width;	/* accessible bytes in scanline */
	ushort_t  accessible_height;	/* number of accessible scanlines */
	ushort_t  line_bytes;		/* number of bytes/scanline */
	ushort_t  hdb_capable;		/* can this thing hardware db? */
	ushort_t  vmsize;		/* this is Mb of video memory */
	uchar_t	  boardrev;		/* board revision # */
	uchar_t	  slot;			/* sbus slot # */
	uint_t	  pad1;			/* expansion */
};

struct p9000_info {
	ushort_t  accessible_width;	/* accessible bytes in scanline */
	ushort_t  accessible_height;	/* number of accessible scanlines */
	ushort_t  line_bytes;		/* number of bytes/scanline */
	ushort_t  hdb_capable;		/* can this thing hardware db? */
	ushort_t  vmsize;		/* this is Mb of video memory */
	uchar_t	  boardrev;		/* board revision # */
	uchar_t	  slot;			/* sbus slot # */
	uint_t	  pad1;			/* expansion */
};

struct p9100_info {
	ushort_t  accessible_width;	/* accessible bytes in scanline */
	ushort_t  accessible_height;	/* number of accessible scanlines */
	ushort_t  line_bytes;		/* number of bytes/scanline */
	ushort_t  hdb_capable;		/* can this thing hardware db? */
	ushort_t  vmsize;		/* this is Mb of video memory */
	uchar_t	  boardrev;		/* board revision # */
	uchar_t	  slot;			/* sbus slot # */
	uint_t	  pad1;			/* expansion */
};

struct wd90c24a2_info {
	ushort_t  accessible_width;	/* accessible bytes in scanline */
	ushort_t  accessible_height;	/* number of accessible scanlines */
	ushort_t  line_bytes;		/* number of bytes/scanline */
	ushort_t  hdb_capable;		/* can this thing hardware db? */
	ushort_t  vmsize;		/* this is Mb of video memory */
	uchar_t	  boardrev;		/* board revision # */
	uchar_t	  slot;			/* sbus slot # */
	uint_t	  pad1;			/* expansion */
};

#define	MON_TYPE_STEREO		0x8	/* stereo display */
#define	MON_TYPE_0_OFFSET	0x4	/* black level 0 ire instead of 7.5 */
#define	MON_TYPE_OVERSCAN	0x2	/* overscan */
#define	MON_TYPE_GRAY		0x1	/* greyscale monitor */

struct mon_info {
	uint_t	  mon_type;		/* bit array: defined above */
	uint_t	  pixfreq;		/* pixel frequency in Hz */
	uint_t	  hfreq;		/* horizontal freq in Hz */
	uint_t	  vfreq;		/* vertical freq in Hz */
	uint_t	  vsync;		/* vertical sync in scanlines */
	uint_t	  hsync;		/* horizontal sync in pixels */
					/* these are in pixel units */
	ushort_t  hfporch;		/* horizontal front porch */
	ushort_t  hbporch;		/* horizontal back porch */
	ushort_t  vfporch;		/* vertical front porch */
	ushort_t  vbporch;		/* vertical back porch */
};


#define	FBIOGXINFO	(FIOC|39)
#define	FBIOMONINFO	(FIOC|40)

/*
 * Color map I/O.
 */
struct	fbcmap_i {
	unsigned int	flags;		/* see below */
	int		id;		/* colormap id for multiple cmaps */
	int		index;		/* first element (0 origin) */
	int		count;		/* number of elements */
	unsigned char	*red;		/* red color map elements */
	unsigned char	*green;		/* green color map elements */
	unsigned char	*blue;		/* blue color map elements */
};

#ifdef _SYSCALL32

struct	fbcmap_i32 {
	uint32_t	flags;		/* see below */
	int32_t		id;		/* colormap id for multiple cmaps */
	int32_t		index;		/* first element (0 origin) */
	int32_t		count;		/* number of elements */
	caddr32_t	red;		/* red color map elements */
	caddr32_t	green;		/* green color map elements */
	caddr32_t	blue;		/* blue color map elements */
};

#endif	/* _SYSCALL32 */

#define	FB_CMAP_BLOCK	0x1	/* wait for vrt before returning */
#define	FB_CMAP_KERNEL	0x2	/* called within kernel */

#define	FBIOPUTCMAPI	(FIOC|41)
#define	FBIOGETCMAPI	(FIOC|42)

/* assigning a given window id to a pixrect - special for PHIGS */
#define	FBIO_ASSIGNWID	(FIOC|43)

/* assigning a given window to be stereo */
#define	FBIO_STEREO	(FIOC|44)
#define	FB_WIN_STEREO	    0x2

#endif	/* !ASM */

/* frame buffer type codes */
#define	FBTYPE_NOTYPE		(-1)	/* for backwards compatibility */
#define	FBTYPE_SUN1BW		0	/* Multibus mono */
#define	FBTYPE_SUN1COLOR	1	/* Multibus color */
#define	FBTYPE_SUN2BW		2	/* memory mono */
#define	FBTYPE_SUN2COLOR	3	/* color w/rasterop chips */
#define	FBTYPE_SUN2GP		4	/* GP1/GP2 */
#define	FBTYPE_SUN5COLOR	5	/* RoadRunner accelerator */
#define	FBTYPE_SUN3COLOR	6	/* memory color */
#define	FBTYPE_MEMCOLOR		7	/* memory 24-bit */
#define	FBTYPE_SUN4COLOR	8	/* memory color w/overlay */

#define	FBTYPE_NOTSUN1		9	/* reserved for customer */
#define	FBTYPE_NOTSUN2		10	/* reserved for customer */
#define	FBTYPE_NOTSUN3		11	/* reserved for customer */

#define	FBTYPE_SUNFAST_COLOR	12	/* accelerated 8bit */
#define	FBTYPE_SUNROP_COLOR	13	/* MEMCOLOR with rop h/w */
#define	FBTYPE_SUNFB_VIDEO	14	/* Simple video mixing */
#define	FBTYPE_SUNGIFB		15	/* medical image */
#define	FBTYPE_SUNGPLAS		16	/* plasma panel */
#define	FBTYPE_SUNGP3		17	/* cg12 running gpsi microcode */
#define	FBTYPE_SUNGT		18	/* gt graphics accelerator */
#define	FBTYPE_SUNLEO		19	/* zx graphics accelerator */
#define	FBTYPE_MDICOLOR		20	/* cgfourteen framebuffer */

#define	FBTYPE_LASTPLUSONE	21	/* max number of fbs (change as add) */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_FBIO_H */