radeon_macros.h revision 209ff23f
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#if HAVE_BYTESWAP_H
55209ff23fSmrg#include <byteswap.h>
56209ff23fSmrg#elif defined(USE_SYS_ENDIAN_H)
57209ff23fSmrg#include <sys/endian.h>
58209ff23fSmrg#else
59209ff23fSmrg#define	bswap_16(value)  \
60209ff23fSmrg 	((((value) & 0xff) << 8) | ((value) >> 8))
61209ff23fSmrg
62209ff23fSmrg#define	bswap_32(value)	\
63209ff23fSmrg 	(((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \
64209ff23fSmrg 	(uint32_t)bswap_16((uint16_t)((value) >> 16)))
65209ff23fSmrg
66209ff23fSmrg#define	bswap_64(value)	\
67209ff23fSmrg 	(((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \
68209ff23fSmrg 	    << 32) | \
69209ff23fSmrg 	(uint64_t)bswap_32((uint32_t)((value) >> 32)))
70209ff23fSmrg#endif
71209ff23fSmrg
72209ff23fSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN
73209ff23fSmrg#define le32_to_cpu(x) bswap_32(x)
74209ff23fSmrg#define le16_to_cpu(x) bswap_16(x)
75209ff23fSmrg#else
76209ff23fSmrg#define le32_to_cpu(x) (x)
77209ff23fSmrg#define le16_to_cpu(x) (x)
78209ff23fSmrg#endif
79209ff23fSmrg
80209ff23fSmrg#define RADEON_BIOS8(v)  (info->VBIOS[v])
81209ff23fSmrg#define RADEON_BIOS16(v) (info->VBIOS[v] | \
82209ff23fSmrg                          (info->VBIOS[(v) + 1] << 8))
83209ff23fSmrg#define RADEON_BIOS32(v) (info->VBIOS[v] | \
84209ff23fSmrg                          (info->VBIOS[(v) + 1] << 8) | \
85209ff23fSmrg                          (info->VBIOS[(v) + 2] << 16) | \
86209ff23fSmrg                          (info->VBIOS[(v) + 3] << 24))
87209ff23fSmrg
88209ff23fSmrg				/* Memory mapped register access macros */
89209ff23fSmrg#define INREG8(addr)        MMIO_IN8(RADEONMMIO, addr)
90209ff23fSmrg#define INREG16(addr)       MMIO_IN16(RADEONMMIO, addr)
91209ff23fSmrg#define INREG(addr)         MMIO_IN32(RADEONMMIO, addr)
92209ff23fSmrg#define OUTREG8(addr, val)  MMIO_OUT8(RADEONMMIO, addr, val)
93209ff23fSmrg#define OUTREG16(addr, val) MMIO_OUT16(RADEONMMIO, addr, val)
94209ff23fSmrg#define OUTREG(addr, val)   MMIO_OUT32(RADEONMMIO, addr, val)
95209ff23fSmrg
96209ff23fSmrg#define ADDRREG(addr)       ((volatile uint32_t *)(pointer)(RADEONMMIO + (addr)))
97209ff23fSmrg
98209ff23fSmrg
99209ff23fSmrg#define OUTREGP(addr, val, mask)					\
100209ff23fSmrgdo {									\
101209ff23fSmrg    uint32_t tmp = INREG(addr);						\
102209ff23fSmrg    tmp &= (mask);							\
103209ff23fSmrg    tmp |= ((val) & ~(mask));						\
104209ff23fSmrg    OUTREG(addr, tmp);							\
105209ff23fSmrg} while (0)
106209ff23fSmrg
107209ff23fSmrg#define INPLL(pScrn, addr) RADEONINPLL(pScrn, addr)
108209ff23fSmrg
109209ff23fSmrg#define OUTPLL(pScrn, addr, val) RADEONOUTPLL(pScrn, addr, val)
110209ff23fSmrg
111209ff23fSmrg#define OUTPLLP(pScrn, addr, val, mask)					\
112209ff23fSmrgdo {									\
113209ff23fSmrg    uint32_t tmp_ = INPLL(pScrn, addr);					\
114209ff23fSmrg    tmp_ &= (mask);							\
115209ff23fSmrg    tmp_ |= ((val) & ~(mask));						\
116209ff23fSmrg    OUTPLL(pScrn, addr, tmp_);						\
117209ff23fSmrg} while (0)
118209ff23fSmrg
119209ff23fSmrg#define OUTPAL_START(idx)						\
120209ff23fSmrgdo {									\
121209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
122209ff23fSmrg        OUTREG8(AVIVO_DC_LUT_RW_INDEX, (idx));				\
123209ff23fSmrg    } else {                                                            \
124209ff23fSmrg        OUTREG8(RADEON_PALETTE_INDEX, (idx));				\
125209ff23fSmrg    }								        \
126209ff23fSmrg} while (0)
127209ff23fSmrg
128209ff23fSmrg#define OUTPAL_NEXT(r, g, b)						\
129209ff23fSmrgdo {									\
130209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
131209ff23fSmrg        OUTREG(AVIVO_DC_LUT_30_COLOR, ((r) << 22) | ((g) << 12) | ((b) << 2));	\
132209ff23fSmrg    } else {                                                               \
133209ff23fSmrg        OUTREG(RADEON_PALETTE_DATA, ((r) << 16) | ((g) << 8) | (b));	\
134209ff23fSmrg    }								        \
135209ff23fSmrg} while (0)
136209ff23fSmrg
137209ff23fSmrg#define OUTPAL_NEXT_uint32_t(v)						\
138209ff23fSmrgdo {									\
139209ff23fSmrg    OUTREG(RADEON_PALETTE_DATA, (v & 0x00ffffff));			\
140209ff23fSmrg} while (0)
141209ff23fSmrg
142209ff23fSmrg#define OUTPAL(idx, r, g, b)						\
143209ff23fSmrgdo {									\
144209ff23fSmrg    OUTPAL_START((idx));						\
145209ff23fSmrg    OUTPAL_NEXT((r), (g), (b));						\
146209ff23fSmrg} while (0)
147209ff23fSmrg
148209ff23fSmrg#define INPAL_START(idx)						\
149209ff23fSmrgdo {									\
150209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
151209ff23fSmrg        OUTREG8(AVIVO_DC_LUT_RW_INDEX, (idx));				\
152209ff23fSmrg    } else {                                                            \
153209ff23fSmrg        OUTREG(RADEON_PALETTE_INDEX, (idx) << 16);			\
154209ff23fSmrg    }								        \
155209ff23fSmrg} while (0)
156209ff23fSmrg
157209ff23fSmrg#define INPAL_NEXT()                                                    \
158209ff23fSmrgdo {									\
159209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
160209ff23fSmrg        INREG(AVIVO_DC_LUT_30_COLOR);                                   \
161209ff23fSmrg    } else {                                                            \
162209ff23fSmrg        INREG(RADEON_PALETTE_DATA);                                     \
163209ff23fSmrg    }								        \
164209ff23fSmrg} while (0)
165209ff23fSmrg
166209ff23fSmrg#define PAL_SELECT(idx)							\
167209ff23fSmrgdo {									\
168209ff23fSmrg    if (IS_AVIVO_VARIANT) {                                             \
169209ff23fSmrg        if (!idx) {							\
170209ff23fSmrg	    OUTREG(AVIVO_DC_LUT_RW_SELECT, 0);                          \
171209ff23fSmrg        } else {						        \
172209ff23fSmrg	    OUTREG(AVIVO_DC_LUT_RW_SELECT, 1);                          \
173209ff23fSmrg        }								\
174209ff23fSmrg    } else {                                                            \
175209ff23fSmrg        if (!idx) {							\
176209ff23fSmrg	    OUTREG(RADEON_DAC_CNTL2, INREG(RADEON_DAC_CNTL2) &		\
177209ff23fSmrg	           (uint32_t)~RADEON_DAC2_PALETTE_ACC_CTL);		\
178209ff23fSmrg        } else {							\
179209ff23fSmrg	    OUTREG(RADEON_DAC_CNTL2, INREG(RADEON_DAC_CNTL2) |		\
180209ff23fSmrg	           RADEON_DAC2_PALETTE_ACC_CTL);			\
181209ff23fSmrg        }								\
182209ff23fSmrg    }								        \
183209ff23fSmrg} while (0)
184209ff23fSmrg
185209ff23fSmrg#define INMC(pScrn, addr) RADEONINMC(pScrn, addr)
186209ff23fSmrg
187209ff23fSmrg#define OUTMC(pScrn, addr, val) RADEONOUTMC(pScrn, addr, val)
188209ff23fSmrg
189209ff23fSmrg#endif
190