IBM561ramdac.c revision 7706df26
17706df26Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tga/IBM561ramdac.c,v 1.3 2001/02/15 11:03:58 alanh Exp $ */
27706df26Smrg
37706df26Smrg#ifdef HAVE_CONFIG_H
47706df26Smrg#include "config.h"
57706df26Smrg#endif
67706df26Smrg
77706df26Smrg#include "xf86.h"
87706df26Smrg#include "xf86_OSproc.h"
97706df26Smrg
107706df26Smrg#include "xf86PciInfo.h"
117706df26Smrg#include "xf86Pci.h"
127706df26Smrg
137706df26Smrg#include "tga_regs.h"
147706df26Smrg#include "tga.h"
157706df26Smrg
167706df26Smrg/*
177706df26Smrg * useful defines for managing the IBM561 on the 24-plane TGA2s
187706df26Smrg */
197706df26Smrg
207706df26Smrg#define IBM561_HEAD_MASK                0x01
217706df26Smrg#define IBM561_READ                     0x02
227706df26Smrg#define IBM561_WRITE                    0x00
237706df26Smrg
247706df26Smrg#define RAMDAC_ONE_BYTE                    0x0E000
257706df26Smrg#define RAMDAC_TWO_BYTES                   0x0c000
267706df26Smrg#define RAMDAC_THREE_BYTES                 0x08000
277706df26Smrg#define RAMDAC_FOUR_BYTES                  0x00000
287706df26Smrg
297706df26Smrg#define IBM561_ADDR_LOW                 0x0000
307706df26Smrg#define IBM561_ADDR_HIGH                0x0100
317706df26Smrg#define IBM561_CMD_REGS                 0x0200
327706df26Smrg
337706df26Smrg#define IBM561_CMD_CURS_PIX             0x0200
347706df26Smrg#define IBM561_CMD_CURS_LUT             0x0300
357706df26Smrg#define IBM561_CMD_FB_WAT               0x0300
367706df26Smrg#define IBM561_CMD_AUXFB_WAT            0x0200
377706df26Smrg#define IBM561_CMD_OL_WAT               0x0300
387706df26Smrg#define IBM561_CMD_AUXOL_WAT            0x0200
397706df26Smrg#define IBM561_CMD_GAMMA                0x0300
407706df26Smrg#define IBM561_CMD_CMAP                 0x0300
417706df26Smrg
427706df26Smrg#define IBM561_ADDR_EPSR_SHIFT          0
437706df26Smrg#define IBM561_ADDR_EPDR_SHIFT          8
447706df26Smrg
457706df26Smrg#define IBM561_CONFIG_REG_1             0x0001
467706df26Smrg#define IBM561_CONFIG_REG_2             0x0002
477706df26Smrg#define IBM561_CONFIG_REG_1             0x0001
487706df26Smrg#define IBM561_CONFIG_REG_2             0x0002
497706df26Smrg#define IBM561_CONFIG_REG_3             0x0003
507706df26Smrg#define IBM561_CONFIG_REG_4             0x0004
517706df26Smrg#define IBM561_WAT_SEG_REG              0x0006
527706df26Smrg#define IBM561_OL_SEG_REG               0x0007
537706df26Smrg#define IBM561_CHROMA_KEY_REG0          0x0010
547706df26Smrg#define IBM561_CHROMA_KEY_REG1          0x0011
557706df26Smrg#define IBM561_CHROMA_MASK_REG0         0x0012
567706df26Smrg#define IBM561_CHROMA_MASK_REG1         0x0013
577706df26Smrg#define IBM561_SYNC_CONTROL             0x0020
587706df26Smrg#define IBM561_PLL_VCO_DIV_REG          0x0021
597706df26Smrg#define IBM561_PLL_REF_REG              0x0022
607706df26Smrg#define IBM561_CURSOR_CTRL_REG          0x0030
617706df26Smrg#define IBM561_CURSOR_HS_REG            0x0034
627706df26Smrg#define IBM561_VRAM_MASK_REG            0x0050
637706df26Smrg#define IBM561_DAC_CTRL                 0x005f
647706df26Smrg#define IBM561_DIV_DOT_CLK_REG          0x0082
657706df26Smrg
667706df26Smrg#define IBM561_READ_MASK                0x0205
677706df26Smrg#define IBM561_BLINK_MASK               0x0209
687706df26Smrg#define IBM561_FB_WINDOW_TYPE_TABLE     0x1000
697706df26Smrg#define IBM561_AUXFB_WINDOW_TYPE_TABLE  0x0E00
707706df26Smrg#define IBM561_OL_WINDOW_TYPE_TABLE     0x1400
717706df26Smrg#define IBM561_AUXOL_WINDOW_TYPE_TABLE  0x0F00
727706df26Smrg#define IBM561_RED_GAMMA_TABLE          0x3000
737706df26Smrg#define IBM561_GREEN_GAMMA_TABLE        0x3400
747706df26Smrg#define IBM561_BLUE_GAMMA_TABLE         0x3800
757706df26Smrg#define IBM561_COLOR_LOOKUP_TABLE       0x4000
767706df26Smrg#define IBM561_CURSOR_LOOKUP_TABLE      0x0a11
777706df26Smrg#define IBM561_CURSOR_BLINK_TABLE       0x0a15
787706df26Smrg#define IBM561_CROSS_LOOKUP_TABLE       0x0a19
797706df26Smrg#define IBM561_CROSS_BLINK_TABLE        0x0a1d
807706df26Smrg#define IBM561_CURSOR_PIXMAP            0x2000
817706df26Smrg#define IBM561_CURSOR_X_LOW             0x0036
827706df26Smrg#define IBM561_CURSOR_X_HIGH            0x0037
837706df26Smrg#define IBM561_CURSOR_Y_LOW             0x0038
847706df26Smrg#define IBM561_CURSOR_Y_HIGH            0x0039
857706df26Smrg
867706df26Smrg#define LO_ADDR		(IBM561_ADDR_LOW  | RAMDAC_ONE_BYTE)
877706df26Smrg#define HI_ADDR		(IBM561_ADDR_HIGH | RAMDAC_ONE_BYTE)
887706df26Smrg
897706df26Smrg#define REGS_ADDR	(IBM561_CMD_REGS  | RAMDAC_ONE_BYTE)
907706df26Smrg#define FBWAT_ADDR      (IBM561_CMD_FB_WAT  | RAMDAC_ONE_BYTE)
917706df26Smrg#define AUXFBWAT_ADDR	(IBM561_CMD_AUXFB_WAT | RAMDAC_ONE_BYTE)
927706df26Smrg#define OLWAT_ADDR	(IBM561_CMD_OL_WAT | RAMDAC_ONE_BYTE)
937706df26Smrg#define AUXOLWAT_ADDR	(IBM561_CMD_AUXOL_WAT | RAMDAC_ONE_BYTE)
947706df26Smrg#define CMAP_ADDR	(IBM561_CMD_CMAP  | RAMDAC_ONE_BYTE)
957706df26Smrg#define GAMMA_ADDR	(IBM561_CMD_GAMMA  | RAMDAC_ONE_BYTE)
967706df26Smrg
977706df26Smrg#define IBM561LoadAddr(reg) \
987706df26Smrgdo { \
997706df26Smrg  TGA2_WRITE_RAMDAC_REG((reg), LO_ADDR); \
1007706df26Smrg  TGA2_WRITE_RAMDAC_REG((reg) >> 8, HI_ADDR); \
1017706df26Smrg} while (0)
1027706df26Smrg
1037706df26Smrgunsigned char
1047706df26SmrgIBM561ReadReg(ScrnInfoPtr pScrn, CARD32 reg)
1057706df26Smrg{
1067706df26Smrg  TGAPtr pTga;
1077706df26Smrg  unsigned char ret;
1087706df26Smrg
1097706df26Smrg  pTga  = TGAPTR(pScrn);
1107706df26Smrg
1117706df26Smrg  TGA2_WRITE_RAMDAC_REG(reg, LO_ADDR);
1127706df26Smrg  TGA2_WRITE_RAMDAC_REG(reg >> 8, HI_ADDR);
1137706df26Smrg
1147706df26Smrg  ret = TGA2_READ_RAMDAC_REG(REGS_ADDR);
1157706df26Smrg
1167706df26Smrg#if 1
1177706df26Smrg  xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "IBM561ReadReg: reg 0x%lx data 0x%x\n",
1187706df26Smrg             (unsigned long)reg, ret);
1197706df26Smrg#endif
1207706df26Smrg  return (ret);
1217706df26Smrg}
1227706df26Smrg
1237706df26Smrgvoid
1247706df26SmrgIBM561WriteReg(ScrnInfoPtr pScrn, CARD32 reg,
1257706df26Smrg#if 0
1267706df26Smrg	       unsigned char mask, unsigned char data)
1277706df26Smrg#else
1287706df26Smrg	       unsigned char data)
1297706df26Smrg#endif
1307706df26Smrg{
1317706df26Smrg  TGAPtr pTga;
1327706df26Smrg  unsigned char tmp = 0x00;
1337706df26Smrg
1347706df26Smrg  pTga = TGAPTR(pScrn);
1357706df26Smrg
1367706df26Smrg#if 0
1377706df26Smrg  if (mask != 0x00) {
1387706df26Smrg    TGA2_WRITE_RAMDAC_REG(reg, LO_ADDR);
1397706df26Smrg    TGA2_WRITE_RAMDAC_REG(reg >> 8, HI_ADDR);
1407706df26Smrg    tmp = TGA2_READ_RAMDAC_REG(REGS_ADDR) & mask;
1417706df26Smrg  }
1427706df26Smrg#endif
1437706df26Smrg
1447706df26Smrg#if 1
1457706df26Smrg  xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "IBM561WriteReg: reg 0x%lx data 0x%x\n",
1467706df26Smrg             (unsigned long)reg, tmp | data);
1477706df26Smrg#endif
1487706df26Smrg
1497706df26Smrg  TGA2_WRITE_RAMDAC_REG(reg, LO_ADDR);
1507706df26Smrg  TGA2_WRITE_RAMDAC_REG(reg >> 8, HI_ADDR);
1517706df26Smrg  TGA2_WRITE_RAMDAC_REG ((tmp | data), REGS_ADDR);
1527706df26Smrg}
1537706df26Smrg
1547706df26Smrgvoid
1557706df26SmrgIBM561ramdacSave(ScrnInfoPtr pScrn, unsigned char *Ibm561)
1567706df26Smrg{
1577706df26Smrg#if 0
1587706df26Smrg  TGAPtr pTga = TGAPTR(pScrn);
1597706df26Smrg  int i, j;
1607706df26Smrg
1617706df26Smrg  /* ?? FIXME OR NOT this is from BT463ramdacSave ?? */
1627706df26Smrg  Ibm561[0] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_CMD_REG_0);
1637706df26Smrg  Ibm561[1] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_CMD_REG_1);
1647706df26Smrg  Ibm561[2] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_CMD_REG_2);
1657706df26Smrg
1667706df26Smrg  Ibm561[3] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_READ_MASK_0);
1677706df26Smrg  Ibm561[4] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_READ_MASK_1);
1687706df26Smrg  Ibm561[5] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_READ_MASK_2);
1697706df26Smrg  Ibm561[6] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_READ_MASK_3);
1707706df26Smrg
1717706df26Smrg  Ibm561[7] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_BLINK_MASK_0);
1727706df26Smrg  Ibm561[8] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_BLINK_MASK_1);
1737706df26Smrg  Ibm561[9] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_BLINK_MASK_2);
1747706df26Smrg  Ibm561[10] = IBM561_READ(pTga, IBM561_REG_ACC, IBM561_BLINK_MASK_3);
1757706df26Smrg
1767706df26Smrg  IBM561_LOAD_ADDR(IBM561_WINDOW_TYPE_BASE);
1777706df26Smrg  TGA_WRITE_REG((IBM561_REG_ACC<<2)|0x2, TGA_RAMDAC_SETUP_REG);
1787706df26Smrg
1797706df26Smrg  for (i = 0, j = 11; i < 16; i++) {
1807706df26Smrg    Ibm561[j++] = (TGA_READ_REG(TGA_RAMDAC_REG)>>16)&0xff;
1817706df26Smrg    Ibm561[j++] = (TGA_READ_REG(TGA_RAMDAC_REG)>>16)&0xff;
1827706df26Smrg    Ibm561[j++] = (TGA_READ_REG(TGA_RAMDAC_REG)>>16)&0xff;
1837706df26Smrg  }
1847706df26Smrg#endif
1857706df26Smrg
1867706df26Smrg/*
1877706df26Smrg  fprintf(stderr, "IBM561ramdacSave (%p)\n", Ibm561);
1887706df26Smrg  for (i=0; i<58; i++)
1897706df26Smrg    fprintf(stderr, "%2d: 0x%02x\n", i, (unsigned)Ibm561[i]);
1907706df26Smrg*/
1917706df26Smrg}
1927706df26Smrg
1937706df26Smrgstatic void
1947706df26SmrgIBM561WindowTagsInit(ScrnInfoPtr pScrn)
1957706df26Smrg{
1967706df26Smrg  TGAPtr pTga = TGAPTR(pScrn);
1977706df26Smrg  unsigned char low, high;
1987706df26Smrg  int i;
1997706df26Smrg
2007706df26Smrg/*
2017706df26Smrg  tga.h defines fb_wid_cell_t as a structure containing two bytes,
2027706df26Smrg  low and high in order.  The 561 has 10 bit window tags so only
2037706df26Smrg  part of the high byte is used (actually only 2 bits). Pixel C for
2047706df26Smrg  8-plane indexes uses 16bpp indexing per IBM's application notes
2057706df26Smrg  which describe quad bufering. Note, this array is arranged as
2067706df26Smrg  low byte followed by high byte which will apppear backwards
2077706df26Smrg  relative to the 561 spec( a value of 0x01 in the high byte
2087706df26Smrg  really represents a color table starting address of 256).
2097706df26Smrg  ex  (entry 4):
2107706df26Smrg    {0x28, 0x01},        *4 8-plane index (PIXEL C 561 H/W screw-up) *
2117706df26Smrg  low byte = 0x28
2127706df26Smrg  high byte = 0x01
2137706df26Smrg  wat entry = 0x0128
2147706df26Smrg
2157706df26Smrg   from the spec: 8 in the low nibble selects buffer 1
2167706df26Smrg                  2 in the next nibble selects pixformat of 16 bpp
2177706df26Smrg                  1 in the next nibble indicates a start addr of 256
2187706df26Smrg*/
2197706df26Smrgtypedef struct {
2207706df26Smrg    unsigned char       low_byte;
2217706df26Smrg    unsigned char       high_byte;
2227706df26Smrg}fb_wid_cell_t;
2237706df26Smrg
2247706df26Smrgtypedef struct {
2257706df26Smrg  unsigned char         aux_fbwat;
2267706df26Smrg} aux_fb_wid_cell_t;
2277706df26Smrg
2287706df26Smrgtypedef struct {
2297706df26Smrg    unsigned char       low_byte;
2307706df26Smrg    unsigned char       high_byte;
2317706df26Smrg} ol_wid_cell_t;
2327706df26Smrg
2337706df26Smrgtypedef struct {
2347706df26Smrg  unsigned char         aux_olwat;
2357706df26Smrg} aux_ol_wid_cell_t;
2367706df26Smrg
2377706df26Smrg/*
2387706df26Smrg * There are actually 256 window tag entries in the FB and OL WAT tables.
2397706df26Smrg * We will use only 16 for compatability with the BT463 and more importantly
2407706df26Smrg * to implement the virtual ramdac interface.  This requires us to only
2417706df26Smrg * report the smallest WAT table size, in this case its the auxillary wat
2427706df26Smrg * tables which are 16 entries.
2437706df26Smrg */
2447706df26Smrg
2457706df26Smrg#define TGA_RAMDAC_561_FB_WINDOW_TAG_COUNT      256
2467706df26Smrg#define TGA_RAMDAC_561_FB_WINDOW_TAG_MAX_COUNT  16
2477706df26Smrg#define TGA_RAMDAC_561_AUXFB_WINDOW_TAG_COUNT   16
2487706df26Smrg#define TGA_RAMDAC_561_OL_WINDOW_TAG_COUNT      256
2497706df26Smrg#define TGA_RAMDAC_561_OL_WINDOW_TAG_MAX_COUNT  16
2507706df26Smrg#define TGA_RAMDAC_561_AUXOL_WINDOW_TAG_COUNT   16
2517706df26Smrg#define TGA_RAMDAC_561_CMAP_ENTRY_COUNT         1024
2527706df26Smrg#define TGA_RAMDAC_561_GAM_ENTRY_COUNT          256
2537706df26Smrg
2547706df26Smrg  static fb_wid_cell_t
2557706df26Smrg    fb_wids_561[TGA_RAMDAC_561_FB_WINDOW_TAG_COUNT] = {
2567706df26Smrg#if 0
2577706df26Smrg    {0x28, 0x00},       /*0 8-plane index (PIXEL C 561 H/W screw-up) */
2587706df26Smrg#else
2597706df26Smrg    {0x36, 0x00},       /*c 24-plane true       */
2607706df26Smrg#endif
2617706df26Smrg    {0x08, 0x00},       /*1 8-plane index (PIXEL B) */
2627706df26Smrg    {0x00, 0x00},       /*2 8-plane index (PIXEL A) */
2637706df26Smrg    {0x34, 0x00},       /*3 24-plane direct, cmap 0 */
2647706df26Smrg    {0x28, 0x01},       /*4 8-plane index (PIXEL C 561 H/W screw-up) */
2657706df26Smrg    {0x08, 0x01},       /*5 8-plane index (PIXEL B) */
2667706df26Smrg    {0x00, 0x01},       /*6 8-plane index (PIXLE A) */
2677706df26Smrg    {0x34, 0x01},       /*7 24-plane direct, cmap 1 */
2687706df26Smrg    {0x1e, 0x00},       /*8 12-plane true       */
2697706df26Smrg    /*{0x16, 0x00},       9 12-plane true       */
2707706df26Smrg    {0x14, 0x00},       /*9 12-plane true(direct)       */
2717706df26Smrg    {0x1e, 0x01},       /*a 12-plane true       */
2727706df26Smrg    {0x16, 0x01},       /*b 12-plane true       */
2737706df26Smrg    {0x36, 0x00},       /*c 24-plane true       */
2747706df26Smrg    {0x36, 0x00},       /*d 24-plane true       */
2757706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2767706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2777706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2787706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2797706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2807706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2817706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2827706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2837706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2847706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2857706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2867706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2877706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2887706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2897706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2907706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2917706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2927706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2937706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2947706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
2957706df26Smrg    {0,0},{0,0}
2967706df26Smrg  };
2977706df26Smrg
2987706df26Smrg  static aux_fb_wid_cell_t
2997706df26Smrg    auxfb_wids_561[TGA_RAMDAC_561_AUXFB_WINDOW_TAG_COUNT] = {
3007706df26Smrg    {0x04},             /*0 GMA=bypass, XH=disable, PT=dc */
3017706df26Smrg    {0x04},             /*1 GMA=bypass, XH=disable, PT=dc */
3027706df26Smrg    {0x04},             /*2 GMA=bypass, XH=disable, PT=dc */
3037706df26Smrg    {0x04},             /*3 GMA=bypass, XH=disable, PT=dc */
3047706df26Smrg    {0x04},             /*4 GMA=bypass, XH=disable, PT=dc */
3057706df26Smrg    {0x04},             /*5 GMA=bypass, XH=disable, PT=dc */
3067706df26Smrg    {0x04},             /*6 GMA=bypass, XH=disable, PT=dc */
3077706df26Smrg    {0x04},             /*7 GMA=bypass, XH=disable, PT=dc */
3087706df26Smrg    {0x04},             /*8 GMA=bypass, XH=disable, PT=dc */
3097706df26Smrg    {0x04},             /*9 GMA=bypass, XH=disable, PT=dc */
3107706df26Smrg    {0x04},             /*a GMA=bypass, XH=disable, PT=dc */
3117706df26Smrg    {0x04},             /*b GMA=bypass, XH=disable, PT=dc */
3127706df26Smrg    {0x04},             /*c GMA=bypass, XH=disable, PT=dc */
3137706df26Smrg    {0x04},             /*d GMA=bypass, XH=disable, PT=dc */
3147706df26Smrg    {0x04},             /*e old cursor colors for 463 don't use*/
3157706df26Smrg    {0x04},             /*f old cursor colors for 463 don't use*/
3167706df26Smrg  };
3177706df26Smrg
3187706df26Smrg  static ol_wid_cell_t
3197706df26Smrg    ol_wids_561[TGA_RAMDAC_561_OL_WINDOW_TAG_COUNT] = {
3207706df26Smrg    {0x31, 0x02},       /*0 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3217706df26Smrg    {0x31, 0x02},       /*1 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3227706df26Smrg    {0x31, 0x02},       /*2 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3237706df26Smrg    {0x31, 0x02},       /*3 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3247706df26Smrg    {0x31, 0x02},       /*4 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3257706df26Smrg    {0x31, 0x02},       /*5 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3267706df26Smrg    {0x31, 0x02},       /*6 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3277706df26Smrg    {0x31, 0x02},       /*7 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3287706df26Smrg    {0x31, 0x02},       /*8 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3297706df26Smrg    {0x31, 0x02},       /*9 PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3307706df26Smrg    {0x31, 0x02},       /*a PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3317706df26Smrg    {0x31, 0x02},       /*b PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3327706df26Smrg    {0x31, 0x02},       /*c PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3337706df26Smrg    {0x31, 0x02},       /*d PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3347706df26Smrg    {0x31, 0x02},       /*e PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3357706df26Smrg    {0x31, 0x02},       /*f PX=4bpp, BS=0, MODE=index, TR=OPAQ    */
3367706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3377706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3387706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3397706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3407706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3417706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3427706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3437706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3447706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3457706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3467706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3477706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3487706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3497706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3507706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3517706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3527706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3537706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3547706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
3557706df26Smrg    {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}
3567706df26Smrg   };
3577706df26Smrg
3587706df26Smrg  static aux_ol_wid_cell_t
3597706df26Smrg    auxol_wids_561[TGA_RAMDAC_561_AUXOL_WINDOW_TAG_COUNT] = {
3607706df26Smrg    {0x0c},             /*0 CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3617706df26Smrg    {0x0c},             /*1 CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3627706df26Smrg    {0x0c},             /*2 CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3637706df26Smrg    {0x0c},             /*3 CK/OT=dc, UL=disabled, OL=enabled,  GB=use    */
3647706df26Smrg    {0x0c},             /*4 CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3657706df26Smrg    {0x0c},             /*5 CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3667706df26Smrg    {0x0c},             /*6 CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3677706df26Smrg    {0x0c},             /*7 CK/OT=dc, UL=disabled, OL=enabled,  GB=use    */
3687706df26Smrg    {0x0c},             /*8 CK/OT=dc, UL=disabled, OL=disabled, GB=use    */
3697706df26Smrg    {0x0c},             /*9 CK/OT=dc, UL=disabled, OL=enabled,  GB=use    */
3707706df26Smrg    {0x0c},             /*a CK/OT=dc, UL=disabled, OL=enabled,  GB=use    */
3717706df26Smrg    {0x0c},             /*b CK/OT=dc, UL=disabled, OL=enabled,  GB=use    */
3727706df26Smrg    {0x0c},             /*c CK/OT=dc, UL=disabled, OL=enabled,  GB=bypass */
3737706df26Smrg    {0x0c},             /*d CK/OT=dc, UL=disabled, OL=disabled, GB=bypass */
3747706df26Smrg    {0x0c},             /*e old cursor color for 463, don't use           */
3757706df26Smrg    {0x0c},             /*f old cursor color for 463, don't use           */
3767706df26Smrg  };
3777706df26Smrg
3787706df26Smrg  /* ibm561 so init the window tags's via interrupt.  It must be
3797706df26Smrg   * done either during the vsync interrupt or by blanking, We will
3807706df26Smrg   * actually do both. ???????
3817706df26Smrg   */
3827706df26Smrg
3837706df26Smrg  IBM561LoadAddr(IBM561_FB_WINDOW_TYPE_TABLE);
3847706df26Smrg  for ( i = 0; i < TGA_RAMDAC_561_FB_WINDOW_TAG_COUNT; i++ ) {
3857706df26Smrg    low = ((fb_wids_561[i].low_byte & 0xfc) >> 2);
3867706df26Smrg    high =((fb_wids_561[i].high_byte & 0x03) << 6) & 0xff;
3877706df26Smrg    TGA2_WRITE_RAMDAC_REG (low | high, FBWAT_ADDR);
3887706df26Smrg
3897706df26Smrg    low = (fb_wids_561[i].low_byte & 0x03) << 6;
3907706df26Smrg    TGA2_WRITE_RAMDAC_REG (low, FBWAT_ADDR);
3917706df26Smrg  }
3927706df26Smrg
3937706df26Smrg  IBM561LoadAddr(IBM561_AUXFB_WINDOW_TYPE_TABLE);
3947706df26Smrg  for ( i = 0; i < TGA_RAMDAC_561_AUXFB_WINDOW_TAG_COUNT; i++ ) {
3957706df26Smrg    TGA2_WRITE_RAMDAC_REG (auxfb_wids_561[i].aux_fbwat, AUXFBWAT_ADDR);
3967706df26Smrg  }
3977706df26Smrg
3987706df26Smrg
3997706df26Smrg  IBM561LoadAddr(IBM561_OL_WINDOW_TYPE_TABLE);
4007706df26Smrg  for ( i = 0; i < TGA_RAMDAC_561_OL_WINDOW_TAG_COUNT; i++ ) {
4017706df26Smrg    low = ((ol_wids_561[i].low_byte & 0xfc) >> 2);
4027706df26Smrg    high =((ol_wids_561[i].high_byte & 0x03) << 6) & 0xff;
4037706df26Smrg    TGA2_WRITE_RAMDAC_REG (low | high, OLWAT_ADDR);
4047706df26Smrg
4057706df26Smrg    low = (ol_wids_561[i].low_byte & 0x03) << 6;
4067706df26Smrg    TGA2_WRITE_RAMDAC_REG (low, OLWAT_ADDR);
4077706df26Smrg  }
4087706df26Smrg
4097706df26Smrg
4107706df26Smrg  IBM561LoadAddr(IBM561_AUXOL_WINDOW_TYPE_TABLE);
4117706df26Smrg  for ( i = 0; i < TGA_RAMDAC_561_AUXOL_WINDOW_TAG_COUNT; i++ ) {
4127706df26Smrg    TGA2_WRITE_RAMDAC_REG (auxol_wids_561[i].aux_olwat, AUXOLWAT_ADDR);
4137706df26Smrg  }
4147706df26Smrg}
4157706df26Smrg
4167706df26Smrg/*
4177706df26Smrg * ibm561_init_color_map
4187706df26Smrg *
4197706df26Smrg *      Initialize color map in 561. Note the entire
4207706df26Smrg *      color map is initialized, both the 8-bit and the 24-bit
4217706df26Smrg *      portions.
4227706df26Smrg */
4237706df26Smrgstatic int
4247706df26SmrgIBM561InitColormap(ScrnInfoPtr pScrn)
4257706df26Smrg{
4267706df26Smrg  TGAPtr pTga = TGAPTR(pScrn);
4277706df26Smrg#if 0
4287706df26Smrg  tga_ibm561_info_t *bti = (tga_ibm561_info_t *) closure;
4297706df26Smrg  tga_info_t *tgap = tga_softc[bti->unit];
4307706df26Smrg#endif
4317706df26Smrg  int i;
4327706df26Smrg
4337706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_COLOR_LOOKUP_TABLE, LO_ADDR);
4347706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_COLOR_LOOKUP_TABLE >> 8, HI_ADDR);
4357706df26Smrg
4367706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4377706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4387706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4397706df26Smrg
4407706df26Smrg  for ( i = 1; i <256; i++ ) {
4417706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4427706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4437706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4447706df26Smrg  }
4457706df26Smrg
4467706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4477706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4487706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4497706df26Smrg
4507706df26Smrg  for ( i = 1; i <256; i++ ) {
4517706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4527706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4537706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4547706df26Smrg  }
4557706df26Smrg
4567706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4577706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4587706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4597706df26Smrg
4607706df26Smrg  for ( i = 1; i <256; i++ ) {
4617706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4627706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4637706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4647706df26Smrg  }
4657706df26Smrg
4667706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4677706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4687706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, CMAP_ADDR);
4697706df26Smrg
4707706df26Smrg  for ( i = 1; i <256; i++ ) {
4717706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4727706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4737706df26Smrg    TGA2_WRITE_RAMDAC_REG (i, CMAP_ADDR);
4747706df26Smrg  }
4757706df26Smrg
4767706df26Smrg /*
4777706df26Smrg  * The ddx layer views the gamma table as an extension of the
4787706df26Smrg  * color pallettes, therefore the gamma table is initialized here.
4797706df26Smrg  * Note, each entry in the table is 10 bits, requiring two writes
4807706df26Smrg  * per entry!! The table are initialized the same way as color tables,
4817706df26Smrg  * a zero entry followed by mulitple ff's. NOTE, the gamma tables are
4827706df26Smrg  * loaded in a strange manner, DO NOT use this code as a guide (we are
4837706df26Smrg  * writing all zero's or all ones).  See the tga_ibm561_load_color_map
4847706df26Smrg  * _entry  code above.
4857706df26Smrg  */
4867706df26Smrg
4877706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_RED_GAMMA_TABLE, LO_ADDR);
4887706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_RED_GAMMA_TABLE >> 8, HI_ADDR);
4897706df26Smrg
4907706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, GAMMA_ADDR);
4917706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, GAMMA_ADDR);
4927706df26Smrg
4937706df26Smrg  for ( i = 1; i <256; i++ ) {
4947706df26Smrg    TGA2_WRITE_RAMDAC_REG (0xff, GAMMA_ADDR);
4957706df26Smrg    TGA2_WRITE_RAMDAC_REG (0xff, GAMMA_ADDR);
4967706df26Smrg  }
4977706df26Smrg
4987706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_GREEN_GAMMA_TABLE, LO_ADDR);
4997706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_GREEN_GAMMA_TABLE >> 8, HI_ADDR);
5007706df26Smrg
5017706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, GAMMA_ADDR);
5027706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, GAMMA_ADDR);
5037706df26Smrg
5047706df26Smrg  for ( i = 1; i <256; i++ ) {
5057706df26Smrg    TGA2_WRITE_RAMDAC_REG (0xff, GAMMA_ADDR);
5067706df26Smrg    TGA2_WRITE_RAMDAC_REG (0xff, GAMMA_ADDR);
5077706df26Smrg  }
5087706df26Smrg
5097706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_BLUE_GAMMA_TABLE, LO_ADDR);
5107706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_BLUE_GAMMA_TABLE >> 8, HI_ADDR);
5117706df26Smrg
5127706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, GAMMA_ADDR);
5137706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, GAMMA_ADDR);
5147706df26Smrg
5157706df26Smrg  for ( i = 1; i <256; i++ ) {
5167706df26Smrg    TGA2_WRITE_RAMDAC_REG (0xff, GAMMA_ADDR);
5177706df26Smrg    TGA2_WRITE_RAMDAC_REG (0xff, GAMMA_ADDR);
5187706df26Smrg  }
5197706df26Smrg
5207706df26Smrg
5217706df26Smrg#if 0
5227706df26Smrg  /* ?? no cursor support yet */
5237706df26Smrg  bti->cursor_fg.red = bti->cursor_fg.green = bti->cursor_fg.blue
5247706df26Smrg                = 0xffff;
5257706df26Smrg  bti->cursor_bg.red = bti->cursor_bg.green = bti->cursor_bg.blue
5267706df26Smrg                = 0x0000;
5277706df26Smrg  tga_ibm561_restore_cursor_color( closure, 0 );
5287706df26Smrg#endif
5297706df26Smrg
5307706df26Smrg  return 0;
5317706df26Smrg}
5327706df26Smrg
5337706df26Smrgvoid
5347706df26SmrgIBM561ramdacHWInit(ScrnInfoPtr pScrn)
5357706df26Smrg{
5367706df26Smrg  TGAPtr pTga = TGAPTR(pScrn);
5377706df26Smrg
5387706df26Smrg    unsigned int temp1[6] = {0,0,0,0,0,0};
5397706df26Smrg
5407706df26Smrg    /*
5417706df26Smrg     *  Set-up av9110 to 14.3 Mhz as reference for 561's PLL
5427706df26Smrg     */
5437706df26Smrg    temp1[0] = 0x00000101;
5447706df26Smrg    temp1[1] = 0x01000000;
5457706df26Smrg    temp1[2] = 0x00000001;
5467706df26Smrg    temp1[3] = 0x00010000;
5477706df26Smrg    temp1[4] = 0x01010100;
5487706df26Smrg    temp1[5] = 0x01000000;
5497706df26Smrg
5507706df26Smrg    write_av9110(pScrn, temp1);
5517706df26Smrg
5527706df26Smrg /*
5537706df26Smrg  *  Initialize  IBM561 RAMDAC
5547706df26Smrg  */
5557706df26Smrg  IBM561WriteReg(pScrn, IBM561_CONFIG_REG_1, 0x2a );
5567706df26Smrg  IBM561WriteReg(pScrn, IBM561_CONFIG_REG_3, 0x41 );
5577706df26Smrg  IBM561WriteReg(pScrn, IBM561_CONFIG_REG_4, 0x20 );
5587706df26Smrg
5597706df26Smrg/* IBM561WriteReg(pScrn, IBM561_PLL_VCO_DIV_REG, 0xc8 ); */
5607706df26Smrg  IBM561WriteReg(pScrn, IBM561_PLL_VCO_DIV_REG, tga_c_table->ibm561_vco_div);
5617706df26Smrg
5627706df26Smrg/* IBM561WriteReg(pScrn, IBM561_PLL_REF_REG, 0x08 ); */
5637706df26Smrg  IBM561WriteReg(pScrn, IBM561_PLL_REF_REG, tga_c_table->ibm561_ref );
5647706df26Smrg
5657706df26Smrg  IBM561WriteReg(pScrn, IBM561_DIV_DOT_CLK_REG, 0xb0 );
5667706df26Smrg
5677706df26Smrg  IBM561WriteReg(pScrn, IBM561_SYNC_CONTROL, 0x01 );
5687706df26Smrg
5697706df26Smrg  IBM561WriteReg(pScrn, IBM561_CONFIG_REG_2, 0x19 );
5707706df26Smrg
5717706df26Smrg  TGA_WRITE_REG(0xFFFFFFFF, TGA_PLANEMASK_REG);
5727706df26Smrg
5737706df26Smrg  /* Configure the RAMDAC, note registers not set either depend on the
5747706df26Smrg   * previous setting (ie what firmaware programmed to be) or what the
5757706df26Smrg   * X-server will set them to
5767706df26Smrg   */
5777706df26Smrg
5787706df26Smrg
5797706df26Smrg  /*
5807706df26Smrg   * Config Register 1: MUX=4:1 BASIC, OVLY=8 bits, WID=8 bits (bits 4-7 of the
5817706df26Smrg   * overlay and window ID's are tied to ground in the hardware).
5827706df26Smrg   */
5837706df26Smrg  IBM561WriteReg(pScrn, IBM561_CONFIG_REG_1, 0x2a );
5847706df26Smrg
5857706df26Smrg  /* SKIP Config Register 2-3 (use Diag settings at least for now) */
5867706df26Smrg
5877706df26Smrg  /*
5887706df26Smrg   * Config Register 4: FB_WID=4 bits, SWE=Common, AOW=LSB, AFW=LSB
5897706df26Smrg   */
5907706df26Smrg  IBM561WriteReg(pScrn, IBM561_CONFIG_REG_4, 0x20 );
5917706df26Smrg
5927706df26Smrg  /*
5937706df26Smrg   * SKIP Interleave Register (use Diag settings at least for now)
5947706df26Smrg   */
5957706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
5967706df26Smrg
5977706df26Smrg  /*
5987706df26Smrg   * WAT/OL Segement Registers
5997706df26Smrg   */
6007706df26Smrg  /* ?? we setup the address registers first, then stream the data out ?? */
6017706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_WAT_SEG_REG, LO_ADDR);
6027706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_WAT_SEG_REG >> 8, HI_ADDR);
6037706df26Smrg
6047706df26Smrg  /*  WAT Segment Register */
6057706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6067706df26Smrg
6077706df26Smrg  /*  OL Segment Register */
6087706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6097706df26Smrg
6107706df26Smrg  /*  AUX WAT Segment Register */
6117706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6127706df26Smrg
6137706df26Smrg  /*  AUX OL Segment Register */
6147706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6157706df26Smrg
6167706df26Smrg  /*
6177706df26Smrg   * Chroma Key Registers and Masks
6187706df26Smrg   */
6197706df26Smrg  /* ?? we setup the address registers first, then stream the data out ?? */
6207706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_CHROMA_KEY_REG0, LO_ADDR);
6217706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_CHROMA_KEY_REG0 >> 8, HI_ADDR);
6227706df26Smrg
6237706df26Smrg  /*  Chroma key register 0 */
6247706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6257706df26Smrg
6267706df26Smrg  /*  Chroma key register 1 */
6277706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6287706df26Smrg
6297706df26Smrg  /*  Chroma key mask register 0 */
6307706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6317706df26Smrg
6327706df26Smrg  /*  Chroma key mask register 1 */
6337706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6347706df26Smrg
6357706df26Smrg  /*
6367706df26Smrg   * Cursor Control Register
6377706df26Smrg   */
6387706df26Smrg  IBM561WriteReg(pScrn, IBM561_CURSOR_CTRL_REG, /*pScrn->cursor_on_off*/0);
6397706df26Smrg
6407706df26Smrg  /*
6417706df26Smrg   * Cursor Hot Spot X/Y Registers
6427706df26Smrg   */
6437706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_CURSOR_HS_REG, LO_ADDR);
6447706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_CURSOR_HS_REG >> 8, HI_ADDR);
6457706df26Smrg
6467706df26Smrg  /*  Cursor "x" Hot Spot Register */
6477706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6487706df26Smrg
6497706df26Smrg  /*  Cursor "y" Hot Spot Register */
6507706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6517706df26Smrg
6527706df26Smrg  /*  Cursor "x" Location Register (low byte) */
6537706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6547706df26Smrg
6557706df26Smrg  /*  Cursor "x" Location Register (high byte) */
6567706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6577706df26Smrg
6587706df26Smrg  /*  Cursor "y" Location Register (low byte) */
6597706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6607706df26Smrg
6617706df26Smrg  /*  Cursor "y" Location Register (high byte) */
6627706df26Smrg  TGA2_WRITE_RAMDAC_REG (0x00, REGS_ADDR);
6637706df26Smrg
6647706df26Smrg  /*
6657706df26Smrg   *  VRAM Mask regs (used for diag purposes, reset them just in case)
6667706df26Smrg   */
6677706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_VRAM_MASK_REG, LO_ADDR);
6687706df26Smrg  TGA2_WRITE_RAMDAC_REG(IBM561_VRAM_MASK_REG >> 8, HI_ADDR);
6697706df26Smrg
6707706df26Smrg  /*  VRAM mask register 1 */
6717706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6727706df26Smrg
6737706df26Smrg  /*  VRAM mask register 2 */
6747706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6757706df26Smrg
6767706df26Smrg  /*  VRAM mask register 3 */
6777706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6787706df26Smrg
6797706df26Smrg  /*  VRAM mask register 4 */
6807706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6817706df26Smrg
6827706df26Smrg  /*  VRAM mask register 5 */
6837706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6847706df26Smrg
6857706df26Smrg  /*  VRAM mask register 6 */
6867706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6877706df26Smrg
6887706df26Smrg  /*  VRAM mask register 7 */
6897706df26Smrg  TGA2_WRITE_RAMDAC_REG (0xff, REGS_ADDR);
6907706df26Smrg
6917706df26Smrg  /* Finally, do colormaps and windowtags */
6927706df26Smrg  IBM561InitColormap(pScrn);
6937706df26Smrg  IBM561WindowTagsInit(pScrn);
6947706df26Smrg}
6957706df26Smrg
6967706df26Smrgvoid
6977706df26SmrgIBM561ramdacRestore(ScrnInfoPtr pScrn, unsigned char *Ibm561)
6987706df26Smrg{
6997706df26Smrg#if 0
7007706df26Smrg  TGAPtr pTga = TGAPTR(pScrn);
7017706df26Smrg#endif
7027706df26Smrg
7037706df26Smrg#if 0
7047706df26Smrg  /* ?? finally the stock stuff ?? */
7057706df26Smrg  int i, j;
7067706df26Smrg  /* ?? FIXME OR NOT this is currently copied from the BT463 */
7077706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_CMD_REG_0, Ibm561[0]);
7087706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_CMD_REG_1, Ibm561[1]);
7097706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_CMD_REG_2, Ibm561[2]);
7107706df26Smrg
7117706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_READ_MASK_0, Ibm561[3]);
7127706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_READ_MASK_1, Ibm561[4]);
7137706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_READ_MASK_2, Ibm561[5]);
7147706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_READ_MASK_3, Ibm561[6]);
7157706df26Smrg
7167706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_BLINK_MASK_0, Ibm561[7]);
7177706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_BLINK_MASK_1, Ibm561[8]);
7187706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_BLINK_MASK_2, Ibm561[9]);
7197706df26Smrg  IBM561_WRITE(IBM561_REG_ACC, IBM561_BLINK_MASK_3, Ibm561[10]);
7207706df26Smrg
7217706df26Smrg  IBM561_LOAD_ADDR(IBM561_WINDOW_TYPE_BASE);
7227706df26Smrg  TGA_WRITE_REG((IBM561_REG_ACC<<2), TGA_RAMDAC_SETUP_REG);
7237706df26Smrg
7247706df26Smrg  for (i = 0, j = 11; i < 16; i++) {
7257706df26Smrg    TGA_WRITE_REG(Ibm561[j++]|(IBM561_REG_ACC<<10), TGA_RAMDAC_REG);
7267706df26Smrg    TGA_WRITE_REG(Ibm561[j++]|(IBM561_REG_ACC<<10), TGA_RAMDAC_REG);
7277706df26Smrg    TGA_WRITE_REG(Ibm561[j++]|(IBM561_REG_ACC<<10), TGA_RAMDAC_REG);
7287706df26Smrg  }
7297706df26Smrg#endif
7307706df26Smrg
7317706df26Smrg/*
7327706df26Smrg  fprintf(stderr, "IBM561ramdacRestore (%p)\n", Ibm561);
7337706df26Smrg  for (i=0; i<58; i++)
7347706df26Smrg    fprintf(stderr, "%2d: 0x%02x\n", i, (unsigned)Ibm561[i]);
7357706df26Smrg*/
7367706df26Smrg
7377706df26Smrg}
7387706df26Smrg
739