~ubuntu-branches/ubuntu/trusty/xserver-xorg-video-geode-lts-utopic/trusty-proposed

« back to all changes in this revision

Viewing changes to src/durango.c

  • Committer: Package Import Robot
  • Author(s): Maarten Lankhorst
  • Date: 2015-01-06 10:39:17 UTC
  • Revision ID: package-import@ubuntu.com-20150106103917-bumwel1243pseqs6
Tags: upstream-2.11.16
ImportĀ upstreamĀ versionĀ 2.11.16

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 2003-2006 Advanced Micro Devices, Inc.
 
2
 *
 
3
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 
4
 * of this software and associated documentation files (the "Software"), to
 
5
 * deal in the Software without restriction, including without limitation the
 
6
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 
7
 * sell copies of the Software, and to permit persons to whom the Software is
 
8
 * furnished to do so, subject to the following conditions:
 
9
 *
 
10
 * The above copyright notice and this permission notice shall be included in
 
11
 * all copies or substantial portions of the Software.
 
12
 *
 
13
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
14
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
15
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
16
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
17
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
18
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 
19
 * IN THE SOFTWARE.
 
20
 *
 
21
 * Neither the name of the Advanced Micro Devices, Inc. nor the names of its
 
22
 * contributors may be used to endorse or promote products derived from this
 
23
 * software without specific prior written permission.
 
24
 * */
 
25
 
 
26
/* The previous version of this file was way more complex then it should have
 
27
   been - remove the unnessesary #defines and routines, and concentrate on
 
28
   Linux for now.
 
29
*/
 
30
 
 
31
#ifdef HAVE_CONFIG_H
 
32
#include "config.h"
 
33
#endif
 
34
 
 
35
#include <unistd.h>
 
36
#include <errno.h>
 
37
#include <compiler.h>
 
38
#include <os.h>                 /* ErrorF() */
 
39
 
 
40
/* Compiler options */
 
41
 
 
42
#define GFX_DISPLAY_GU1        0        /* 1st generation display controller */
 
43
#define GFX_DISPLAY_GU2        1        /* 2nd generation display controller */
 
44
 
 
45
#define GFX_INIT_DYNAMIC       0        /* runtime selection */
 
46
#define GFX_INIT_GU1           0        /* SC1200/GX1        */
 
47
#define GFX_INIT_GU2           1        /* GX                */
 
48
 
 
49
#define GFX_MSR_DYNAMIC        0        /* runtime selection */
 
50
#define GFX_MSR_REDCLOUD       1        /* GX */
 
51
 
 
52
#define GFX_2DACCEL_DYNAMIC    0        /* runtime selection                                */
 
53
#define GFX_2DACCEL_GU1        0        /* 1st generation 2D accelerator    */
 
54
#define GFX_2DACCEL_GU2        1        /* 2nd generation 2D accelerator    */
 
55
 
 
56
#define GFX_VIDEO_DYNAMIC      0        /* runtime selection  */
 
57
#define GFX_VIDEO_CS5530       0        /* support for CS5530 */
 
58
#define GFX_VIDEO_SC1200       0        /* support for SC1200 */
 
59
#define GFX_VIDEO_REDCLOUD     1        /* support for GX */
 
60
 
 
61
#define GFX_VIP_DYNAMIC        0        /* runtime selection  */
 
62
#define GFX_VIP_SC1200         0        /* support for SC1200 */
 
63
 
 
64
#define GFX_DECODER_DYNAMIC    0        /* runtime selection */
 
65
#define GFX_DECODER_SAA7114    0        /* Philips SAA7114 decoder */
 
66
 
 
67
#define GFX_TV_DYNAMIC         0        /* runtime selection */
 
68
#define GFX_TV_FS451           0        /* Focus Enhancements FS450  */
 
69
#define GFX_TV_SC1200          0        /* SC1200 integrated TV encoder */
 
70
 
 
71
#define GFX_I2C_DYNAMIC        0        /* runtime selection  */
 
72
#define GFX_I2C_ACCESS         0        /* support for ACCESS.BUS  */
 
73
#define GFX_I2C_GPIO           0        /* support for CS5530 GPIOs */
 
74
 
 
75
#define GFX_VGA_DYNAMIC        0        /* runtime selection */
 
76
#define GFX_VGA_GU1            0        /* 1st generation graphics unit */
 
77
 
 
78
#define FB4MB                  1        /* Set to use 4Mb vid ram for Pyramid */
 
79
 
 
80
#define GFX_NO_IO_IN_WAIT_MACROS    1   /* Set to remove I/O accesses in GP */
 
81
#define GFX_READ_ROUTINES  1
 
82
 
 
83
#include "gfx_rtns.h"
 
84
#include "gfx_priv.h"
 
85
#include "gfx_regs.h"
 
86
#include "gfx_defs.h"
 
87
 
 
88
unsigned char *gfx_virt_regptr = (unsigned char *) 0x40000000;
 
89
unsigned char *gfx_virt_fbptr = (unsigned char *) 0x40800000;
 
90
unsigned char *gfx_virt_vidptr = (unsigned char *) 0x40010000;
 
91
unsigned char *gfx_virt_vipptr = (unsigned char *) 0x40015000;
 
92
unsigned char *gfx_virt_spptr = (unsigned char *) 0x40000000;
 
93
unsigned char *gfx_virt_gpptr = (unsigned char *) 0x40000000;
 
94
 
 
95
unsigned char *gfx_phys_regptr = (unsigned char *) 0x40000000;
 
96
unsigned char *gfx_phys_fbptr = (unsigned char *) 0x40800000;
 
97
unsigned char *gfx_phys_vidptr = (unsigned char *) 0x40010000;
 
98
unsigned char *gfx_phys_vipptr = (unsigned char *) 0x40015000;
 
99
 
 
100
#define INB(port) inb(port)
 
101
#define INW(port) inw(port)
 
102
#define IND(port) inl(port)
 
103
#define OUTB(port,data) outb(port, data)
 
104
#define OUTW(port,data) outw(port, data)
 
105
#define OUTD(port,data) outl(port, data)
 
106
 
 
107
/* Squash warnings */
 
108
unsigned char gfx_inb(unsigned short);
 
109
unsigned short gfx_inw(unsigned short);
 
110
unsigned long gfx_ind(unsigned short);
 
111
 
 
112
void gfx_outb(unsigned short, unsigned char);
 
113
void gfx_outw(unsigned short, unsigned short);
 
114
void gfx_outd(unsigned short, unsigned long);
 
115
 
 
116
inline unsigned char
 
117
gfx_inb(unsigned short port)
 
118
{
 
119
    return inb(port);
 
120
}
 
121
 
 
122
inline unsigned short
 
123
gfx_inw(unsigned short port)
 
124
{
 
125
    return inw(port);
 
126
}
 
127
 
 
128
inline unsigned long
 
129
gfx_ind(unsigned short port)
 
130
{
 
131
    return inl(port);
 
132
}
 
133
 
 
134
inline void
 
135
gfx_outb(unsigned short port, unsigned char data)
 
136
{
 
137
    outb(port, data);
 
138
}
 
139
 
 
140
inline void
 
141
gfx_outw(unsigned short port, unsigned short data)
 
142
{
 
143
    outw(port, data);
 
144
}
 
145
 
 
146
inline void
 
147
gfx_outd(unsigned short port, unsigned long data)
 
148
{
 
149
    outl(port, data);
 
150
}
 
151
 
 
152
/* These routines use VSA to read the MSRs - these are a second resort to the Linux MSR method */
 
153
 
 
154
#define vsa_msr_read(msr,adr,high,low)      \
 
155
     __asm__ __volatile__(                      \
 
156
        " mov $0x0AC1C, %%edx\n"                \
 
157
        " mov $0xFC530007, %%eax\n"             \
 
158
        " out %%eax,%%dx\n"                     \
 
159
        " add $2,%%dl\n"                        \
 
160
        " in %%dx, %%ax"                        \
 
161
        : "=a" (*(low)), "=d" (*(high))         \
 
162
        : "c" (msr | adr))
 
163
 
 
164
#define vsa_msr_write(msr,adr,high,low) \
 
165
  { int d0, d1, d2, d3, d4;        \
 
166
  __asm__ __volatile__(            \
 
167
    " push %%ebx\n"                \
 
168
    " mov $0x0AC1C, %%edx\n"       \
 
169
    " mov $0xFC530007, %%eax\n"    \
 
170
    " out %%eax,%%dx\n"            \
 
171
    " add $2,%%dl\n"               \
 
172
    " mov %6, %%ebx\n"             \
 
173
    " mov %7, %0\n"                \
 
174
    " mov %5, %3\n"                \
 
175
    " xor %2, %2\n"                \
 
176
    " xor %1, %1\n"                \
 
177
    " out %%ax, %%dx\n"            \
 
178
    " pop %%ebx\n"                 \
 
179
    : "=a"(d0),"=&D"(d1),"=&S"(d2), \
 
180
      "=c"(d3),"=d"(d4)  \
 
181
    : "1"(msr | adr),"2"(*(high)),"3"(*(low))); \
 
182
  }
 
183
 
 
184
extern int GeodeWriteMSR(unsigned long, unsigned long, unsigned long);
 
185
extern int GeodeReadMSR(unsigned long, unsigned long *, unsigned long *);
 
186
 
 
187
void
 
188
gfx_msr_asm_write(unsigned short reg, unsigned long addr,
 
189
                  unsigned long *hi, unsigned long *lo)
 
190
{
 
191
    static int msr_method = 0;
 
192
 
 
193
    if (msr_method == 0) {
 
194
        if (!GeodeWriteMSR(addr | reg, *lo, *hi))
 
195
            return;
 
196
 
 
197
        msr_method = 1;
 
198
    }
 
199
 
 
200
    /* This is the fallback VSA method - not preferred */
 
201
    vsa_msr_write(reg, addr, hi, lo);
 
202
}
 
203
 
 
204
void
 
205
gfx_msr_asm_read(unsigned short reg, unsigned long addr,
 
206
                 unsigned long *hi, unsigned long *lo)
 
207
{
 
208
    static int msr_method = 0;
 
209
 
 
210
    if (msr_method == 0) {
 
211
        if (!GeodeReadMSR(addr | reg, lo, hi))
 
212
            return;
 
213
 
 
214
        ErrorF("Unable to read the MSR - reverting to the VSA method.\n");
 
215
        msr_method = 1;
 
216
    }
 
217
 
 
218
    /* This is the fallback VSA method - not preferred */
 
219
    vsa_msr_read(reg, addr, hi, lo);
 
220
}
 
221
 
 
222
#include "gfx_init.c"
 
223
#include "gfx_msr.c"
 
224
#include "gfx_rndr.c"
 
225
#include "gfx_mode.h"
 
226
#include "gfx_disp.c"
 
227
#include "gfx_vid.c"
 
228
#include "gfx_vip.c"
 
229
#include "gfx_dcdr.c"
 
230
#include "gfx_i2c.c"
 
231
#include "gfx_tv.c"
 
232
#include "gfx_vga.c"