BTramdac.c revision 479f40c1
1/*
2 * Copyright 1998 by Alan Hourihane, Wigan, England.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Alan Hourihane not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Alan Hourihane makes no representations
11 * about the suitability of this software for any purpose.  It is provided
12 * "as is" without express or implied warranty.
13 *
14 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 *
22 * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
23 *
24 * tgaBTOutIndReg() and tgaBTInIndReg() are used to access
25 * the indirect TGA BT RAMDAC registers only.
26 */
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include "xorg-server.h"
33#include "xf86.h"
34#include "xf86_OSproc.h"
35
36#include "xf86PciInfo.h"
37#include "xf86Pci.h"
38
39#include "tga_regs.h"
40#include "BT.h"
41#include "tga.h"
42
43void
44tgaBTOutIndReg(ScrnInfoPtr pScrn,
45		     CARD32 reg, unsigned char mask, unsigned char data)
46{
47  TGAPtr pTga;
48  unsigned char tmp = 0x00;
49
50  pTga = TGAPTR(pScrn);
51
52  TGA_WRITE_REG(reg << 1 | BT485_READ_BIT, TGA_RAMDAC_SETUP_REG);
53
54  if (mask != 0x00)
55    tmp = (TGA_READ_REG(TGA_RAMDAC_REG)>>16) & mask;
56
57  TGA_WRITE_REG(reg << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
58
59  TGA_WRITE_REG ((tmp | data) | (reg<<9), TGA_RAMDAC_REG);
60}
61
62unsigned char
63tgaBTInIndReg (ScrnInfoPtr pScrn, CARD32 reg)
64{
65  TGAPtr pTga;
66  unsigned char ret;
67
68  pTga  = TGAPTR(pScrn);
69
70  TGA_WRITE_REG(reg << 1 | BT485_READ_BIT, TGA_RAMDAC_SETUP_REG);
71  ret = TGA_READ_REG (TGA_RAMDAC_REG)>>16;
72
73  return (ret);
74}
75
76void
77tgaBTWriteAddress (ScrnInfoPtr pScrn, CARD32 index)
78{
79    TGAPtr pTga;
80
81    pTga = TGAPTR(pScrn);
82
83    TGA_WRITE_REG(BT_WRITE_ADDR << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
84    TGA_WRITE_REG(index | (BT_WRITE_ADDR<<9), TGA_RAMDAC_REG);
85    TGA_WRITE_REG(BT_RAMDAC_DATA << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
86}
87
88void
89tgaBTWriteData (ScrnInfoPtr pScrn, unsigned char data)
90{
91    TGAPtr pTga;
92
93    pTga = TGAPTR(pScrn);
94
95    TGA_WRITE_REG(data | (BT_RAMDAC_DATA << 9), TGA_RAMDAC_REG);
96}
97
98void
99tgaBTReadAddress (ScrnInfoPtr pScrn, CARD32 index)
100{
101    TGAPtr pTga;
102
103    pTga = TGAPTR(pScrn);
104
105    TGA_WRITE_REG(BT_PIXEL_MASK << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
106    TGA_WRITE_REG(0xFF | (BT_PIXEL_MASK<<9), TGA_RAMDAC_REG);
107    TGA_WRITE_REG(BT_READ_ADDR << 1 | BT485_WRITE_BIT, TGA_RAMDAC_SETUP_REG);
108    TGA_WRITE_REG(index | (BT_READ_ADDR<<9), TGA_RAMDAC_REG);
109    TGA_WRITE_REG(BT_RAMDAC_DATA << 1 | BT485_READ_BIT, TGA_RAMDAC_SETUP_REG);
110}
111
112unsigned char
113tgaBTReadData (ScrnInfoPtr pScrn)
114{
115    TGAPtr pTga;
116
117    pTga = TGAPTR(pScrn);
118
119    return(TGA_READ_REG(TGA_RAMDAC_REG)>>16);
120}
121
122/********************* TGA2 stuff below here ********************/
123
124void
125tga2BTOutIndReg(ScrnInfoPtr pScrn,
126		     CARD32 reg, unsigned char mask, unsigned char data)
127{
128  TGAPtr pTga;
129  unsigned char tmp = 0x00;
130  unsigned int addr = 0xe000U | (reg << 8);
131
132  pTga = TGAPTR(pScrn);
133
134  if (mask != 0x00)
135    tmp = TGA2_READ_RAMDAC_REG(addr) & mask;
136
137#if 0
138  xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "tga2OutIndReg: reg 0x%x data 0x%x\n",
139	     reg, tmp|data);
140#endif
141  TGA2_WRITE_RAMDAC_REG ((tmp | data), addr);
142}
143
144unsigned char
145tga2BTInIndReg (ScrnInfoPtr pScrn, CARD32 reg)
146{
147  TGAPtr pTga;
148  unsigned char ret;
149  unsigned int addr = 0xe000U | (reg << 8);
150
151  pTga  = TGAPTR(pScrn);
152
153  ret = TGA2_READ_RAMDAC_REG(addr);
154
155  return (ret);
156}
157
158void
159tga2BTWriteAddress (ScrnInfoPtr pScrn, CARD32 index)
160{
161    tga2BTOutIndReg(pScrn, BT_WRITE_ADDR, 0, index);
162}
163
164void
165tga2BTWriteData (ScrnInfoPtr pScrn, unsigned char data)
166{
167    tga2BTOutIndReg(pScrn, BT_RAMDAC_DATA, 0, data);
168}
169
170void
171tga2BTReadAddress (ScrnInfoPtr pScrn, CARD32 index)
172{
173    tga2BTOutIndReg(pScrn, BT_PIXEL_MASK, 0, 0xff);
174    tga2BTOutIndReg(pScrn, BT_READ_ADDR, 0, index);
175}
176
177unsigned char
178tga2BTReadData (ScrnInfoPtr pScrn)
179{
180    return tga2BTInIndReg(pScrn, BT_RAMDAC_DATA);
181}
182