/*
 * Copyright (c) 1988-1989,1997-1998 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_SYS_CG6REG_H
#define	_SYS_CG6REG_H

#pragma ident	"@(#)cg6reg.h	1.8	98/01/06 SMI"

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * CG6 frame buffer hardware definitions.
 */


/* Physical frame buffer and color map addresses */
/*
 * The base address is defined in the configuration file, e.g. GENERIC.
 * These constants are the offset from that address.
 */

#define	CG6_P4BASE		0xFB000000L

#define	CG6_ADDR_ROM_SBUS	0L
#define	CG6_ADDR_ROM_P4		0x380000L


#define	CG6_ADDR_CMAP		0x200000L
#define	CG6_ADDR_DHC		0x240000L
#define	CG6_ADDR_ALT		0x280000L
#define	CG6_ADDR_FBC		0x700000L
#define	CG6_ADDR_TEC		0x701000L
#define	CG6_ADDR_P4REG		0x300000L
#define	CG6_ADDR_OVERLAY	0x400000L	/* FAKE */
#define	CG6_ADDR_FHC		0x300000L
#define	CG6_ADDR_THC		0x301000L
#define	CG6_ADDR_ENABLE		0x600000L
#define	CG6_ADDR_COLOR		0x800000L

#define	CG6_ADDR_FBCTEC		CG6_ADDR_FBC
#define	CG6_ADDR_FHCTHC		CG6_ADDR_FHC

#define	CG6_CMAP_SZ		8192
#define	CG6_FBCTEC_SZ		8192
#define	CG6_FHCTHC_SZ		8192
#define	CG6_ROM_SZ		(64*1024)
#define	CG6_FB_SZ		(1024*1024)
#define	CG6_DHC_SZ		8192
#define	CG6_ALT_SZ		8192

/*
 * Offsets of TEC/FHC into page
 */
#define	CG6_TEC_POFF		0x1000
#define	CG6_THC_POFF		0x1000

/*
 * Virtual (mmap offsets) addresses
 */
#define	CG6_VBASE		0x70000000L	/* nobody knows where */
						/* this comes from */
#define	CG6_VADDR(x)		(CG6_VBASE + (x) * 8192)

/*
 * CG6 Virtual object addresses
 */
#define	CG6_VADDR_FBC		CG6_VADDR(0)
#define	CG6_VADDR_TEC		(CG6_VADDR_FBC + CG6_TEC_POFF)
#define	CG6_VADDR_CMAP		CG6_VADDR(1)
#define	CG6_VADDR_FHC		CG6_VADDR(2)
#define	CG6_VADDR_THC		(CG6_VADDR_FHC + CG6_THC_POFF)
#define	CG6_VADDR_ROM		CG6_VADDR(3)
#define	CG6_VADDR_COLOR		(CG6_VADDR_ROM + CG6_ROM_SZ)
	/* KLUDGE: BIG gap here, to accomodate potential future framebuffers */
#define	CG6_VADDR_DHC		CG6_VADDR(16384)
#define	CG6_VADDR_ALT		CG6_VADDR(16385)
#define	CG6_VADDR_UART		CG6_VADDR(16386)
#define	CG6_VADDR_VRT		CG6_VADDR(16387) /* vertical retrace page */

#define	CG6_VADDR_FBCTEC	CG6_VADDR_FBC
#define	CG6_VADDR_FHCTHC	CG6_VADDR_FHC
/*
 * to map in all of lego, use mmapsize below, and offset CG6_VBASE
 */
#define	MMAPSIZE(dfbsize)	(CG6_VADDR_COLOR-CG6_VBASE+dfbsize)

/*
 * convert from address returned by pr_makefromfd (eg. mmap)
 * to CG6 register set.
 */
#define	CG6VA_TO_FBC(base) \
	((struct fbc *)(((char *)base)+(CG6_VADDR_FBC-CG6_VBASE)))
#define	CG6VA_TO_TEC(base)  \
	((struct tec *)(((char *)base)+(CG6_VADDR_TEC-CG6_VBASE)))
#define	CG6VA_TO_FHC(base)  \
	((uint_t *)(((char *)base)+(CG6_VADDR_FHC-CG6_VBASE)))
#define	CG6VA_TO_THC(base)  \
	((struct thc *)(((char *)base)+(CG6_VADDR_THC-CG6_VBASE)))
#define	CG6VA_TO_DFB(base)  \
	((short *)(((char *)base)+(CG6_VADDR_COLOR-CG6_VBASE)))
#define	CG6VA_TO_ROM(base)  \
	((uint_t *)(((char *)base)+(CG6_VADDR_ROM-CG6_VBASE)))
#define	CG6VA_TO_CMAP(base) \
	((struct cg6_cmap *)(((char *)base)+(CG6_VADDR_CMAP-CG6_VBASE)))


/* (Brooktree DAC) definitions */

/* number of colormap entries */
#define	CG6_CMAP_ENTRIES	256

struct cg6_cmap {
	uint32_t	addr;		/* address register */
	uint32_t	cmap;		/* color map data register */
	uint32_t	ctrl;		/* control register */
	uint32_t	omap;		/* overlay map data register */
};

#ifdef	__cplusplus
}
#endif

#endif /* _SYS_CG6REG_H */
