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