pm2ramdac.c revision c35d236e
1c35d236eSmrg/*
2c35d236eSmrg * Copyright 1998 by Alan Hourihane, Wigan, England.
3c35d236eSmrg *
4c35d236eSmrg * Permission to use, copy, modify, distribute, and sell this software and its
5c35d236eSmrg * documentation for any purpose is hereby granted without fee, provided that
6c35d236eSmrg * the above copyright notice appear in all copies and that both that
7c35d236eSmrg * copyright notice and this permission notice appear in supporting
8c35d236eSmrg * documentation, and that the name of Alan Hourihane not be used in
9c35d236eSmrg * advertising or publicity pertaining to distribution of the software without
10c35d236eSmrg * specific, written prior permission.  Alan Hourihane makes no representations
11c35d236eSmrg * about the suitability of this software for any purpose.  It is provided
12c35d236eSmrg * "as is" without express or implied warranty.
13c35d236eSmrg *
14c35d236eSmrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15c35d236eSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16c35d236eSmrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17c35d236eSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18c35d236eSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19c35d236eSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20c35d236eSmrg * PERFORMANCE OF THIS SOFTWARE.
21c35d236eSmrg *
22c35d236eSmrg * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
23c35d236eSmrg *
24c35d236eSmrg * Permedia2OutIndReg() and Permedia2InIndReg() are used to access
25c35d236eSmrg * the indirect Permedia2 RAMDAC registers only.
26c35d236eSmrg */
27c35d236eSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm2ramdac.c,v 1.10 1999/07/18 03:26:57 dawes Exp $ */
28c35d236eSmrg
29c35d236eSmrg#ifdef HAVE_CONFIG_H
30c35d236eSmrg#include "config.h"
31c35d236eSmrg#endif
32c35d236eSmrg
33c35d236eSmrg#include "xf86.h"
34c35d236eSmrg#include "xf86_OSproc.h"
35c35d236eSmrg
36c35d236eSmrg#include "xf86PciInfo.h"
37c35d236eSmrg#include "xf86Pci.h"
38c35d236eSmrg
39c35d236eSmrg#include "glint_regs.h"
40c35d236eSmrg#include "glint.h"
41c35d236eSmrg
42c35d236eSmrgvoid
43c35d236eSmrgPermedia2OutIndReg(ScrnInfoPtr pScrn,
44c35d236eSmrg		     CARD32 reg, unsigned char mask, unsigned char data)
45c35d236eSmrg{
46c35d236eSmrg  GLINTPtr pGlint = GLINTPTR(pScrn);
47c35d236eSmrg  unsigned char tmp = 0x00;
48c35d236eSmrg
49c35d236eSmrg  GLINT_SLOW_WRITE_REG (reg, PM2DACIndexReg);
50c35d236eSmrg
51c35d236eSmrg  if (mask != 0x00)
52c35d236eSmrg    tmp = GLINT_READ_REG (PM2DACIndexData) & mask;
53c35d236eSmrg
54c35d236eSmrg  GLINT_SLOW_WRITE_REG (tmp | data, PM2DACIndexData);
55c35d236eSmrg}
56c35d236eSmrg
57c35d236eSmrgunsigned char
58c35d236eSmrgPermedia2InIndReg (ScrnInfoPtr pScrn, CARD32 reg)
59c35d236eSmrg{
60c35d236eSmrg  GLINTPtr pGlint = GLINTPTR(pScrn);
61c35d236eSmrg  unsigned char ret;
62c35d236eSmrg
63c35d236eSmrg  GLINT_SLOW_WRITE_REG (reg, PM2DACIndexReg);
64c35d236eSmrg  GLINTDACDelay(5);
65c35d236eSmrg  ret = GLINT_READ_REG (PM2DACIndexData);
66c35d236eSmrg
67c35d236eSmrg  return (ret);
68c35d236eSmrg}
69c35d236eSmrg
70c35d236eSmrgvoid
71c35d236eSmrgPermedia2WriteAddress (ScrnInfoPtr pScrn, CARD32 index)
72c35d236eSmrg{
73c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
74c35d236eSmrg
75c35d236eSmrg    GLINT_SLOW_WRITE_REG(index, PM2DACWriteAddress);
76c35d236eSmrg}
77c35d236eSmrg
78c35d236eSmrgvoid
79c35d236eSmrgPermedia2WriteData (ScrnInfoPtr pScrn, unsigned char data)
80c35d236eSmrg{
81c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
82c35d236eSmrg
83c35d236eSmrg    GLINT_SLOW_WRITE_REG(data, PM2DACData);
84c35d236eSmrg}
85c35d236eSmrg
86c35d236eSmrgvoid
87c35d236eSmrgPermedia2ReadAddress (ScrnInfoPtr pScrn, CARD32 index)
88c35d236eSmrg{
89c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
90c35d236eSmrg
91c35d236eSmrg    GLINT_SLOW_WRITE_REG(0xFF, PM2DACReadMask);
92c35d236eSmrg    GLINT_SLOW_WRITE_REG(index, PM2DACReadAddress);
93c35d236eSmrg}
94c35d236eSmrg
95c35d236eSmrgunsigned char
96c35d236eSmrgPermedia2ReadData (ScrnInfoPtr pScrn)
97c35d236eSmrg{
98c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
99c35d236eSmrg    GLINTDACDelay(5);
100c35d236eSmrg    return(GLINT_READ_REG(PM2DACData));
101c35d236eSmrg}
102c35d236eSmrg
103c35d236eSmrgvoid Permedia2LoadPalette(
104c35d236eSmrg    ScrnInfoPtr pScrn,
105c35d236eSmrg    int numColors,
106c35d236eSmrg    int *indices,
107c35d236eSmrg    LOCO *colors,
108c35d236eSmrg    VisualPtr pVisual
109c35d236eSmrg){
110c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
111c35d236eSmrg    int i, index, shift = 0, j, repeat = 1;
112c35d236eSmrg
113c35d236eSmrg    if (pScrn->depth == 15) {
114c35d236eSmrg	repeat = 8;
115c35d236eSmrg	shift = 3;
116c35d236eSmrg    }
117c35d236eSmrg
118c35d236eSmrg    for(i = 0; i < numColors; i++) {
119c35d236eSmrg	index = indices[i];
120c35d236eSmrg	for (j = 0; j < repeat; j++) {
121c35d236eSmrg	    Permedia2WriteAddress(pScrn, (index << shift)+j);
122c35d236eSmrg	    Permedia2WriteData(pScrn, colors[index].red);
123c35d236eSmrg	    Permedia2WriteData(pScrn, colors[index].green);
124c35d236eSmrg	    Permedia2WriteData(pScrn, colors[index].blue);
125c35d236eSmrg	}
126c35d236eSmrg	/* for video i/o */
127c35d236eSmrg        GLINT_SLOW_WRITE_REG(index, TexelLUTIndex);
128c35d236eSmrg	GLINT_SLOW_WRITE_REG((colors[index].red & 0xFF) |
129c35d236eSmrg			     ((colors[index].green & 0xFF) << 8) |
130c35d236eSmrg			     ((colors[index].blue & 0xFF) << 16),
131c35d236eSmrg			     TexelLUTData);
132c35d236eSmrg    }
133c35d236eSmrg}
134c35d236eSmrg
135c35d236eSmrg/* special one for 565 mode */
136c35d236eSmrgvoid Permedia2LoadPalette16(
137c35d236eSmrg    ScrnInfoPtr pScrn,
138c35d236eSmrg    int numColors,
139c35d236eSmrg    int *indices,
140c35d236eSmrg    LOCO *colors,
141c35d236eSmrg    VisualPtr pVisual
142c35d236eSmrg){
143c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
144c35d236eSmrg    int i, index, j;
145c35d236eSmrg
146c35d236eSmrg    for(i = 0; i < numColors; i++) {
147c35d236eSmrg	index = indices[i];
148c35d236eSmrg	for (j = 0; j < 4; j++) {
149c35d236eSmrg	    Permedia2WriteAddress(pScrn, (index << 2)+j);
150c35d236eSmrg	    Permedia2WriteData(pScrn, colors[index >> 1].red);
151c35d236eSmrg	    Permedia2WriteData(pScrn, colors[index].green);
152c35d236eSmrg	    Permedia2WriteData(pScrn, colors[index >> 1].blue);
153c35d236eSmrg	}
154c35d236eSmrg        GLINT_SLOW_WRITE_REG(index, TexelLUTIndex);
155c35d236eSmrg	GLINT_SLOW_WRITE_REG((colors[index].red & 0xFF) |
156c35d236eSmrg			     ((colors[index].green & 0xFF) << 8) |
157c35d236eSmrg			     ((colors[index].blue & 0xFF) << 16),
158c35d236eSmrg			     TexelLUTData);
159c35d236eSmrg
160c35d236eSmrg	if(index <= 31) {
161c35d236eSmrg	    for (j = 0; j < 4; j++) {
162c35d236eSmrg	    	Permedia2WriteAddress(pScrn, (index << 3)+j);
163c35d236eSmrg	    	Permedia2WriteData(pScrn, colors[index].red);
164c35d236eSmrg	    	Permedia2WriteData(pScrn, colors[(index << 1) + 1].green);
165c35d236eSmrg	    	Permedia2WriteData(pScrn, colors[index].blue);
166c35d236eSmrg	    }
167c35d236eSmrg	}
168c35d236eSmrg    }
169c35d236eSmrg}
170