⛏️ index : haiku.git

/*
 * Copyright 2012 Haiku, Inc.  All rights reserved.
 * Distributed under the terms of the MIT license.
 *
 * Authors:
 *		Gerald Zajac
 */

/*!
	Haiku Intel-810 video driver was adapted from the X.org intel driver which
	has the following copyright.

	Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
	All Rights Reserved.
 */
#ifndef __I810_REGS_H__
#define __I810_REGS_H__


// CRT Controller Registers.
#define START_ADDR_HI			0x0C
#define START_ADDR_LO			0x0D
#define VERT_SYNC_END			0x11
#define EXT_VERT_TOTAL			0x30
#define EXT_VERT_DISPLAY		0x31
#define EXT_VERT_SYNC_START		0x32
#define EXT_VERT_BLANK_START	0x33
#define EXT_HORIZ_TOTAL			0x35
#define EXT_HORIZ_BLANK			0x39
#define EXT_START_ADDR			0x40
#define EXT_START_ADDR_ENABLE	0x80
#define EXT_OFFSET				0x41
#define EXT_START_ADDR_HI		0x42
#define INTERLACE_CNTL			0x70
#define INTERLACE_ENABLE		0x80
#define INTERLACE_DISABLE		0x00

// CR80 - IO Control
#define IO_CTNL					0x80
#define EXTENDED_ATTR_CNTL		0x02
#define EXTENDED_CRTC_CNTL		0x01

// GR10 - Address mapping
#define ADDRESS_MAPPING			0x10
#define PAGE_TO_LOCAL_MEM_ENABLE 0x10
#define GTT_MEM_MAP_ENABLE		0x08
#define PACKED_MODE_ENABLE		0x04
#define LINEAR_MODE_ENABLE		0x02
#define PAGE_MAPPING_ENABLE		0x01

#define FENCE			0x2000

#define INST_DONE		0x2090

// General error reporting regs.
#define EIR				0x20B0
#define EMR				0x20B4
#define ESR				0x20B8

// FIFO Watermark and Burst Length Control Register.
#define FWATER_BLC			0x20d8
#define MM_BURST_LENGTH			0x00700000
#define MM_FIFO_WATERMARK		0x0001F000
#define LM_BURST_LENGTH			0x00000700
#define LM_FIFO_WATERMARK		0x0000001F

#define MEM_MODE			0x020DC

#define DRAM_ROW_CNTL_HI	0x3002
#define DRAM_REFRESH_RATE		0x18
#define DRAM_REFRESH_DISABLE	0x00
#define DRAM_REFRESH_60HZ		0x08

#define VCLK2_VCO_M			0x6008
#define VCLK2_VCO_N			0x600a
#define VCLK2_VCO_DIV_SEL	0x6012

#define PIXPIPE_CONFIG		0x70008
#define NO_BLANK_DELAY			0x100000
#define DISPLAY_8BPP_MODE		0x020000
#define DISPLAY_15BPP_MODE		0x040000
#define DISPLAY_16BPP_MODE		0x050000
#define DAC_8_BIT				0x008000
#define HIRES_MODE				0x000001

// Blitter control.
#define BITBLT_CNTL			0x7000c
#define COLEXP_MODE				0x30
#define COLEXP_8BPP				0x00
#define COLEXP_16BPP			0x10

// Color Palette Registers.
#define DAC_MASK		0x3C6
#define DAC_W_INDEX		0x3C8
#define DAC_DATA		0x3C9


#define MISC_OUT_R		0x3CC		// read
#define MISC_OUT_W		0x3C2		// write
#define SEQ_INDEX		0x3C4
#define SEQ_DATA		0x3C5
#define GRAPH_INDEX		0x3CE
#define GRAPH_DATA		0x3CF
#define CRTC_INDEX		0x3D4
#define CRTC_DATA		0x3D5


// Macros for memory mapped I/O.
//==============================

#define INREG8(addr)		(*((vuint8*)(gInfo.regs + (addr))))
#define INREG16(addr)		(*((vuint16*)(gInfo.regs + (addr))))
#define INREG32(addr)		(*((vuint32*)(gInfo.regs + (addr))))

#define OUTREG8(addr, val)	(*((vuint8*)(gInfo.regs + (addr))) = (val))
#define OUTREG16(addr, val)	(*((vuint16*)(gInfo.regs + (addr))) = (val))
#define OUTREG32(addr, val)	(*((vuint32*)(gInfo.regs + (addr))) = (val))

// Write a value to an 32-bit reg using a mask.  The mask selects the
// bits to be modified.
#define OUTREGM(addr, value, mask)	\
	(OUTREG(addr, (INREG(addr) & ~mask) | (value & mask)))


static inline uint8
ReadCrtcReg(uint8 index)
{
	OUTREG8(CRTC_INDEX, index);
	return INREG8(CRTC_DATA);
}


static inline void
WriteCrtcReg(uint8 index, uint8 value)
{
	OUTREG8(CRTC_INDEX, index);
	OUTREG8(CRTC_DATA, value);
}


static inline uint8
ReadGraphReg(uint8 index)
{
	OUTREG8(GRAPH_INDEX, index);
	return INREG8(GRAPH_DATA);
}


static inline void
WriteGraphReg(uint8 index, uint8 value)
{
	OUTREG8(GRAPH_INDEX, index);
	OUTREG8(GRAPH_DATA, value);
}


static inline uint8
ReadSeqReg(uint8 index)
{
	OUTREG8(SEQ_INDEX, index);
	return INREG8(SEQ_DATA);
}


static inline void
WriteSeqReg(uint8 index, uint8 value)
{
	OUTREG8(SEQ_INDEX, index);
	OUTREG8(SEQ_DATA, value);
}


#endif	// __I810_REGS_H__