root/src/add-ons/accelerants/intel_810/i810_regs.h
/*
 * 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__