radeon_macros.h revision b7e1c893
1209ff23fSmrg/*
2209ff23fSmrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
3209ff23fSmrg *                VA Linux Systems Inc., Fremont, California.
4209ff23fSmrg *
5209ff23fSmrg * All Rights Reserved.
6209ff23fSmrg *
7209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining
8209ff23fSmrg * a copy of this software and associated documentation files (the
9209ff23fSmrg * "Software"), to deal in the Software without restriction, including
10209ff23fSmrg * without limitation on the rights to use, copy, modify, merge,
11209ff23fSmrg * publish, distribute, sublicense, and/or sell copies of the Software,
12209ff23fSmrg * and to permit persons to whom the Software is furnished to do so,
13209ff23fSmrg * subject to the following conditions:
14209ff23fSmrg *
15209ff23fSmrg * The above copyright notice and this permission notice (including the
16209ff23fSmrg * next paragraph) shall be included in all copies or substantial
17209ff23fSmrg * portions of the Software.
18209ff23fSmrg *
19209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20209ff23fSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21209ff23fSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22209ff23fSmrg * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
23209ff23fSmrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24209ff23fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25209ff23fSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26209ff23fSmrg * DEALINGS IN THE SOFTWARE.
27209ff23fSmrg */
28209ff23fSmrg
29209ff23fSmrg/*
30209ff23fSmrg * Authors:
31209ff23fSmrg *   Kevin E. Martin <martin@xfree86.org>
32209ff23fSmrg *   Rickard E. Faith <faith@valinux.com>
33209ff23fSmrg *   Alan Hourihane <alanh@fairlite.demon.co.uk>
34209ff23fSmrg *
35209ff23fSmrg * References:
36209ff23fSmrg *
37209ff23fSmrg * !!!! FIXME !!!!
38209ff23fSmrg *   RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical
39209ff23fSmrg *   Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April
40209ff23fSmrg *   1999.
41209ff23fSmrg *
42209ff23fSmrg * !!!! FIXME !!!!
43209ff23fSmrg *   RAGE 128 Software Development Manual (Technical Reference Manual P/N
44209ff23fSmrg *   SDK-G04000 Rev. 0.01), ATI Technologies: June 1999.
45209ff23fSmrg *
46209ff23fSmrg */
47209ff23fSmrg
48209ff23fSmrg
49209ff23fSmrg#ifndef _RADEON_MACROS_H_
50209ff23fSmrg#define _RADEON_MACROS_H_
51209ff23fSmrg
52209ff23fSmrg#include "compiler.h"
53209ff23fSmrg
54209ff23fSmrg#define RADEON_BIOS8(v)  (info->VBIOS[v])
55209ff23fSmrg#define RADEON_BIOS16(v) (info->VBIOS[v] | \
56209ff23fSmrg                          (info->VBIOS[(v) + 1] << 8))
57209ff23fSmrg#define RADEON_BIOS32(v) (info->VBIOS[v] | \
58209ff23fSmrg                          (info->VBIOS[(v) + 1] << 8) | \
59209ff23fSmrg                          (info->VBIOS[(v) + 2] << 16) | \
60209ff23fSmrg                          (info->VBIOS[(v) + 3] << 24))
61209ff23fSmrg
62209ff23fSmrg				/* Memory mapped register access macros */
63209ff23fSmrg#define INREG8(addr)        MMIO_IN8(RADEONMMIO, addr)
64209ff23fSmrg#define INREG16(addr)       MMIO_IN16(RADEONMMIO, addr)
65209ff23fSmrg#define INREG(addr)         MMIO_IN32(RADEONMMIO, addr)
66209ff23fSmrg#define OUTREG8(addr, val)  MMIO_OUT8(RADEONMMIO, addr, val)
67209ff23fSmrg#define OUTREG16(addr, val) MMIO_OUT16(RADEONMMIO, addr, val)
68209ff23fSmrg#define OUTREG(addr, val)   MMIO_OUT32(RADEONMMIO, addr, val)
69209ff23fSmrg
70209ff23fSmrg#define ADDRREG(addr)       ((volatile uint32_t *)(pointer)(RADEONMMIO + (addr)))
71209ff23fSmrg
72209ff23fSmrg
73209ff23fSmrg#define OUTREGP(addr, val, mask)					\
74209ff23fSmrgdo {									\
75209ff23fSmrg    uint32_t tmp = INREG(addr);						\
76209ff23fSmrg    tmp &= (mask);							\
77209ff23fSmrg    tmp |= ((val) & ~(mask));						\
78209ff23fSmrg    OUTREG(addr, tmp);							\
79209ff23fSmrg} while (0)
80209ff23fSmrg
81209ff23fSmrg#define INPLL(pScrn, addr) RADEONINPLL(pScrn, addr)
82209ff23fSmrg
83209ff23fSmrg#define OUTPLL(pScrn, addr, val) RADEONOUTPLL(pScrn, addr, val)
84209ff23fSmrg
85209ff23fSmrg#define OUTPLLP(pScrn, addr, val, mask)					\
86209ff23fSmrgdo {									\
87209ff23fSmrg    uint32_t tmp_ = INPLL(pScrn, addr);					\
88209ff23fSmrg    tmp_ &= (mask);							\
89209ff23fSmrg    tmp_ |= ((val) & ~(mask));						\
90209ff23fSmrg    OUTPLL(pScrn, addr, tmp_);						\
91209ff23fSmrg} while (0)
92209ff23fSmrg
93209ff23fSmrg#define OUTPAL_START(idx)						\
94209ff23fSmrgdo {									\
95209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
96209ff23fSmrg        OUTREG8(AVIVO_DC_LUT_RW_INDEX, (idx));				\
97209ff23fSmrg    } else {                                                            \
98209ff23fSmrg        OUTREG8(RADEON_PALETTE_INDEX, (idx));				\
99209ff23fSmrg    }								        \
100209ff23fSmrg} while (0)
101209ff23fSmrg
102209ff23fSmrg#define OUTPAL_NEXT(r, g, b)						\
103209ff23fSmrgdo {									\
104209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
105b7e1c893Smrg        OUTREG(AVIVO_DC_LUT_30_COLOR, ((r) << 20) | ((g) << 10) | (b));	\
106b7e1c893Smrg    } else {                                                            \
107b7e1c893Smrg        OUTREG(RADEON_PALETTE_30_DATA, ((r) << 20) | ((g) << 10) | (b)); \
108209ff23fSmrg    }								        \
109209ff23fSmrg} while (0)
110209ff23fSmrg
111209ff23fSmrg#define OUTPAL(idx, r, g, b)						\
112209ff23fSmrgdo {									\
113209ff23fSmrg    OUTPAL_START((idx));						\
114209ff23fSmrg    OUTPAL_NEXT((r), (g), (b));						\
115209ff23fSmrg} while (0)
116209ff23fSmrg
117209ff23fSmrg#define INPAL_START(idx)						\
118209ff23fSmrgdo {									\
119209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
120209ff23fSmrg        OUTREG8(AVIVO_DC_LUT_RW_INDEX, (idx));				\
121209ff23fSmrg    } else {                                                            \
122209ff23fSmrg        OUTREG(RADEON_PALETTE_INDEX, (idx) << 16);			\
123209ff23fSmrg    }								        \
124209ff23fSmrg} while (0)
125209ff23fSmrg
126209ff23fSmrg#define INPAL_NEXT()                                                    \
127209ff23fSmrgdo {									\
128209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
129209ff23fSmrg        INREG(AVIVO_DC_LUT_30_COLOR);                                   \
130209ff23fSmrg    } else {                                                            \
131b7e1c893Smrg        INREG(RADEON_PALETTE_30_DATA);                                  \
132209ff23fSmrg    }								        \
133209ff23fSmrg} while (0)
134209ff23fSmrg
135209ff23fSmrg#define PAL_SELECT(idx)							\
136209ff23fSmrgdo {									\
137209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
138209ff23fSmrg        if (!idx) {							\
139209ff23fSmrg	    OUTREG(AVIVO_DC_LUT_RW_SELECT, 0);                          \
140209ff23fSmrg        } else {						        \
141209ff23fSmrg	    OUTREG(AVIVO_DC_LUT_RW_SELECT, 1);                          \
142209ff23fSmrg        }								\
143209ff23fSmrg    } else {                                                            \
144209ff23fSmrg        if (!idx) {							\
145209ff23fSmrg	    OUTREG(RADEON_DAC_CNTL2, INREG(RADEON_DAC_CNTL2) &		\
146209ff23fSmrg	           (uint32_t)~RADEON_DAC2_PALETTE_ACC_CTL);		\
147209ff23fSmrg        } else {							\
148209ff23fSmrg	    OUTREG(RADEON_DAC_CNTL2, INREG(RADEON_DAC_CNTL2) |		\
149209ff23fSmrg	           RADEON_DAC2_PALETTE_ACC_CTL);			\
150209ff23fSmrg        }								\
151209ff23fSmrg    }								        \
152209ff23fSmrg} while (0)
153209ff23fSmrg
154209ff23fSmrg#define INMC(pScrn, addr) RADEONINMC(pScrn, addr)
155209ff23fSmrg#define OUTMC(pScrn, addr, val) RADEONOUTMC(pScrn, addr, val)
156209ff23fSmrg
157b7e1c893Smrg#define INPCIE(pScrn, addr) RADEONINPCIE(pScrn, addr)
158b7e1c893Smrg#define OUTPCIE(pScrn, addr, val) RADEONOUTPCIE(pScrn, addr, val)
159b7e1c893Smrg
160209ff23fSmrg#endif
161