Annotation of sys/dev/ic/p9000.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: p9000.h,v 1.4 2007/05/22 04:14:03 jsg Exp $ */
! 2: /*
! 3: * Copyright (c) 2003, Miodrag Vallat.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: *
! 14: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 15: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
! 16: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
! 17: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
! 18: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 19: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 20: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 22: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
! 23: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 24: * POSSIBILITY OF SUCH DAMAGE.
! 25: */
! 26:
! 27: /*
! 28: * Weitek Power9000 and Power9100 definitions.
! 29: *
! 30: * Although the datasheet is not available anymore, a good source of
! 31: * documentation is several code examples in XFree86 3.x (vga256/p9x00) and the
! 32: * {Net,Open}BSD source trees.
! 33: */
! 34:
! 35: /*
! 36: * Frame buffer control registers
! 37: *
! 38: * Offsets below are relative to the following locations:
! 39: * P9000 at 0x00100000, P9100 at 0x000000
! 40: */
! 41:
! 42: /*
! 43: * System control registers
! 44: */
! 45:
! 46: /* System configuration register */
! 47: #define P9000_SYSTEM_CONFIG 0x00000004
! 48:
! 49: #define SCR_PIXEL_MASK 0x1c000000
! 50: #define SCR_PIXEL_8BPP 0x08000000
! 51: #define SCR_PIXEL_16BPP 0x0c000000
! 52: #define SCR_PIXEL_24BPP 0x1c000000
! 53: #define SCR_PIXEL_32BPP 0x14000000
! 54: #define SCR_SWAP_WORDS 0x00002000
! 55: #define SCR_SWAP_BYTES 0x00001000
! 56: #define SCR_SWAP_BITS 0x00000800
! 57: #define SCR_READ_BUFFER_MASK 0x00000400
! 58: #define SCR_WRITE_BUFFER_MASK 0x00000200
! 59: #define SCR_ID_MASK 0x00000007
! 60: #define SCR_SC(sc0, sc1, sc2, sc3) \
! 61: (((sc0) << 14) | ((sc1) << 17) | ((sc2) << 20) | ((sc3) << 29))
! 62:
! 63: /* Interrupt status register */
! 64: #define P9000_INTERRUPT 0x00000008
! 65:
! 66: /* Interrupt enable register */
! 67: #define P9000_INTERRUPT_ENABLE 0x0000000c
! 68:
! 69: #define IER_MASTER_ENABLE 0x00000080
! 70: #define IER_MASTER_INTERRUPT 0x00000040
! 71: #define IER_VBLANK_ENABLE 0x00000020
! 72: #define IER_VBLANK_INTERRUPT 0x00000010
! 73: #define IER_PICK_ENABLE 0x00000008
! 74: #define IER_PICK_INTERRUPT 0x00000004
! 75: #define IER_IDLE_ENABLE 0x00000002
! 76: #define IER_IDLE_INTERRUPT 0x00000001
! 77:
! 78: /* Alternate read bank register (bits 16-22) */
! 79: #define P9000_ALTBANK_READ 0x00000010
! 80:
! 81: /* Alternate write bank register (bits 16-22) */
! 82: #define P9000_ALTBANK_WRITE 0x00000014
! 83:
! 84: /*
! 85: * Video control registers
! 86: */
! 87:
! 88: /* Horizontal counter */
! 89: #define P9000_HCR 0x00000104
! 90: /* Horizontal total */
! 91: #define P9000_HTR 0x00000108
! 92: /* Horizontal sync rising edge */
! 93: #define P9000_HSRE 0x0000010c
! 94: /* Horizontal blank rising edge */
! 95: #define P9000_HBRE 0x00000110
! 96: /* Horizontal blank falling edge */
! 97: #define P9000_HBFE 0x00000114
! 98: /* Horizontal counter preload */
! 99: #define P9000_HCP 0x00000118
! 100:
! 101: /* Vertical counter */
! 102: #define P9000_VCR 0x0000011c
! 103: /* Vertical length */
! 104: #define P9000_VL 0x00000120
! 105: /* Vertical sync rising edge */
! 106: #define P9000_VSRE 0x00000124
! 107: /* Vertical blank rising edge */
! 108: #define P9000_VBRE 0x00000128
! 109: /* Vertical blank falling edge */
! 110: #define P9000_VBFE 0x0000012c
! 111: /* Vertical counter preload */
! 112: #define P9000_VCP 0x00000130
! 113:
! 114: /* Screen repaint address */
! 115: #define P9000_SRA 0x00000134
! 116: /* Screen repaint timing control #1 */
! 117: #define P9000_SRTC1 0x00000138
! 118:
! 119: #define SRTC1_VSYNC_INTERNAL 0x00000100
! 120: #define SRTC1_HSYNC_INTERNAL 0x00000080
! 121: #define SRTC1_VIDEN 0x00000020
! 122: #define SRTC1_RESTRICTED 0x00000010
! 123: #define SRTC1_BUFFER1 0x00000008
! 124:
! 125: /* QSF counter. Film at 11 */
! 126: #define P9000_QSF 0x0000013c
! 127: /* Screen repaint timing control #2 */
! 128: #define P9000_SRTC2 0x00000140
! 129:
! 130: /*
! 131: * VRAM control registers
! 132: */
! 133:
! 134: /* Memory configuration */
! 135: #define P9000_MCR 0x00000184
! 136: /* Refresh period */
! 137: #define P9000_REFRESH_PERIOD 0x00000188
! 138: /* Refresh count */
! 139: #define P9000_REFRESH_COUNT 0x0000018c
! 140: /* RAS low maximum */
! 141: #define P9000_RASLOW_MAXIMUM 0x00000190
! 142: /* RAS low current */
! 143: #define P9000_RASLOW_CURRENT 0x00000194
! 144: /* RAMDAC free FIFO (P9100 only, bits 12-15) and power-up configuration */
! 145: #define P9000_POWERUP_CONFIG 0x00000198
! 146: #define P9100_FREE_FIFO 0x00000198
! 147:
! 148: /*
! 149: * RAMDAC registers (P9100 only)
! 150: */
! 151:
! 152: #define P9100_RAMDAC_REGISTER(index) (0x00000200 + ((index) << 2))
! 153:
! 154:
! 155: /*
! 156: * Accelerated features
! 157: *
! 158: * Offsets below are relative to the following locations:
! 159: * P9000 at 0x00180000, P9100 at 0x002000
! 160: */
! 161:
! 162: /*
! 163: * Parameter engine
! 164: */
! 165:
! 166: /* Status register */
! 167: #define P9000_PE_STATUS 0x00000000
! 168: #define STATUS_QUAD_BUSY 0x80000000
! 169: #define STATUS_BLIT_BUSY 0x40000000
! 170: #define STATUS_PICK_DETECTED 0x00000080
! 171: #define STATUS_PIXEL_ERROR 0x00000040
! 172: #define STATUS_BLIT_ERROR 0x00000020
! 173: #define STATUS_QUAD_ERROR 0x00000010
! 174: #define STATUS_QUAD_CONCAVE 0x00000008
! 175: #define STATUS_QUAD_OUTSIDE 0x00000004
! 176: #define STATUS_QUAD_INSIDE 0x00000002
! 177: #define STATUS_QUAD_STRADDLE 0x00000001
! 178:
! 179: /* Engine arguments / operation triggers */
! 180: #define P9000_PE_BLIT 0x00000004
! 181: #define P9000_PE_QUAD 0x00000008
! 182: #define P9000_PE_PIXEL8 0x0000000c
! 183: #define P9000_PE_NEXTPIXELS 0x00000014
! 184: #define P9000_PE_PIXEL1(index) (0x00000080 + ((index) << 2))
! 185:
! 186: /* Control and conditions registers */
! 187:
! 188: /* Out of range */
! 189: #define P9000_PE_OOR 0x00000184
! 190: /* Index register (0-3, for meta coordinates) */
! 191: #define P9000_PE_INDEX 0x0000018c
! 192: /* Window offset (16x16)*/
! 193: #define P9000_PE_WINOFFSET 0x00000190
! 194: /* Clipping window */
! 195: #define P9000_PE_WINMIN 0x00000194
! 196: #define P9000_PE_WINMAX 0x00000198
! 197: /* X Clip register */
! 198: #define P9000_X_CLIPPING 0x000001a0
! 199: /* Y Clip register */
! 200: #define P9000_Y_CLIPPING 0x000001a4
! 201: /* X Edge Less Than register */
! 202: #define P9000_X_EDGE_LESS 0x000001a8
! 203: /* X Edge Greater Than register */
! 204: #define P9000_X_EDGE_GREATER 0x000001ac
! 205: /* Y Edge Less Than register */
! 206: #define P9000_Y_EDGE_LESS 0x000001b0
! 207: /* Y Edge Greater Than register */
! 208: #define P9000_Y_EDGE_GREATER 0x000001b4
! 209:
! 210: /*
! 211: * Drawing engine
! 212: */
! 213:
! 214: /* Colors - 8 bit for P9000, 32 bit for P9100 */
! 215: #define P9000_DE_FG_COLOR 0x00000200
! 216: #define P9000_DE_BG_COLOR 0x00000204
! 217: #define P9100_DE_COLOR0 0x00000200
! 218: #define P9100_DE_COLOR1 0x00000204
! 219: #define P9100_DE_COLOR2 0x00000238
! 220: #define P9100_DE_COLOR3 0x0000023c
! 221:
! 222: /* How to encode a colors in 8 and 16 bit mode, for the P9100 */
! 223: #define P9100_COLOR8(c) ((c) | ((c) << 8) | ((c) << 16) | ((c) << 24))
! 224: #define P9100_COLOR16(c) ((c) | ((c) << 16))
! 225:
! 226: /* Plane mask (8 bits on P9000, 32 bits on P9100) */
! 227: #define P9000_DE_PLANEMASK 0x00000208
! 228:
! 229: /* Drawing mode */
! 230: #define P9000_DE_DRAWMODE 0x0000020c
! 231: #define DM_PICK_CONTROL 0x00000008
! 232: #define DM_PICK_ENABLE 0x00000004
! 233: #define DM_BUFFER_CONTROL 0x00000002
! 234: #define DM_BUFFER_ENABLE0 0x00000000
! 235: #define DM_BUFFER_ENABLE1 0x00000001
! 236:
! 237: /* Pattern Origin (4 bit x 4 bit offset) */
! 238: #define P9000_DE_PATTERN_ORIGIN_X 0x00000210
! 239: #define P9000_DE_PATTERN_ORIGIN_Y 0x00000214
! 240:
! 241: /* Raster operation */
! 242: #define P9000_DE_RASTER 0x00000218
! 243: #define P9100_RASTER_NO_SOLID 0x00002000
! 244: #define P9100_RASTER_PATTERN_4COLOR 0x00004000
! 245: #define P9100_RASTER_PIXEL1_TRANSPARENT 0x00008000
! 246: #define P9000_RASTER_QUAD_OVERSIZE 0x00010000
! 247: #define P9000_RASTER_QUAD_PATTERN 0x00020000
! 248:
! 249: /* Raster minterms */
! 250: #define P9000_RASTER_SRC 0xcccc
! 251: #define P9000_RASTER_DST 0xaaaa
! 252: #define P9000_RASTER_PATTERN 0xff00
! 253: #define P9000_RASTER_MASK 0xffff
! 254: #define P9100_RASTER_SRC 0x00cc
! 255: #define P9100_RASTER_DST 0x00aa
! 256: #define P9100_RASTER_PATTERN 0x00f0
! 257: #define P9100_RASTER_MASK 0x00ff
! 258:
! 259: /* Pixel8 excess storage */
! 260: #define P9000_DE_PIXEL8 0x0000021c
! 261:
! 262: /* Clipping window - same as in PE */
! 263: #define P9000_DE_WINMIN 0x00000220
! 264: #define P9000_DE_WINMAX 0x00000224
! 265:
! 266: /* Quad pattern - up to 4 items on P9000, 8 on P9100 */
! 267: #define P9000_DE_PATTERN(index) (0x00000280 + ((index) << 2))
! 268:
! 269: /* User pattern - up to 4 items */
! 270: #define P9000_DE_USER(index) (0x00000290 + ((index) << 2))
! 271:
! 272: /* Byte clipping window */
! 273: #define P9100_DE_B_WINMIN 0x000002a0
! 274: #define P9100_DE_B_WINMAX 0x000002a4
! 275:
! 276: /*
! 277: * Coordinates
! 278: */
! 279:
! 280: /* 32 bit X value */
! 281: #define P9000_COORD_X 0x00000008
! 282: /* 32 bit Y value */
! 283: #define P9000_COORD_Y 0x00000010
! 284: /* 16 bit X, 16 bit Y values packed */
! 285: #define P9000_COORD_XY 0x00000018
! 286:
! 287: /* Absolute (screen) coordinates */
! 288: #define P9000_COORD_ABS 0x00000000
! 289: /* Relative (in-window) coordinates */
! 290: #define P9000_COORD_REL 0x00000020
! 291:
! 292: /* How to pack a x16y16 value - note that they are in fact 12 bit values */
! 293: #define P9000_COORDS(x,y) ((((x) & 0x0fff) << 16) | ((y) & 0x0fff))
! 294:
! 295: /* Device coordinates - 4 edges */
! 296: #define P9000_DC_COORD(index) (0x00001000 + ((index) * 0x40))
! 297:
! 298: /* Load coordinates */
! 299: #define P9000_LC_POINT 0x00001200
! 300: #define P9000_LC_LINE 0x00001240
! 301: #define P9000_LC_TRI 0x00001280
! 302: #define P9000_LC_QUAD 0x000012c0
! 303: #define P9000_LC_RECT 0x00001300
CVSweb