1
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/rendition/vboard.c,v 1.16 2002/12/11 17:23:33 dawes Exp $ */
12
#if defined(SCO) || defined(SCO325)
22
/* Global imported during compile-time */
23
static char MICROCODE_DIR [PATH_MAX] = MODULEDIR;
26
* local function prototypes
34
verite_initboard(ScrnInfoPtr pScreenInfo)
36
renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
38
IOADDRESS iob=pRendition->board.io_base;
44
/* write "monitor" program to memory */
45
v1k_stop(pScreenInfo);
46
pRendition->board.csucode_base=0x800;
47
memendian=verite_in8(iob+MEMENDIAN);
48
verite_out8(iob+MEMENDIAN, MEMENDIAN_NO);
50
/* Note that CS ucode must wait on address in csucode_base
51
* when initialized for later context switch code to work. */
53
ErrorF("Loading csucode @ 0x%x + 0x800\n", pRendition->board.vmem_base);
54
vmb=pRendition->board.vmem_base;
55
offset=pRendition->board.csucode_base;
56
for (c=0; c<sizeof(csrisc)/sizeof(vu32); c++, offset+=sizeof(vu32))
57
verite_write_memory32(vmb, offset, csrisc[c]);
59
/* Initialize the CS flip semaphore */
60
verite_write_memory32(vmb, 0x7f8, 0);
61
verite_write_memory32(vmb, 0x7fc, 0);
63
/* Run the code we just transfered to the boards memory */
64
/* ... and start accelerator */
65
v1k_flushicache(pScreenInfo);
67
verite_out8(iob + STATEINDEX, STATEINDEX_PC);
68
pc = verite_in32(iob + STATEDATA);
69
v1k_start(pScreenInfo, pRendition->board.csucode_base);
71
/* Get on loading the ucode */
72
verite_out8(iob + STATEINDEX, STATEINDEX_PC);
74
for (c = 0; c < 0xffffffL; c++){
75
v1k_stop(pScreenInfo);
76
pc = verite_in32(iob + STATEDATA);
77
v1k_continue(pScreenInfo);
78
if (pc == pRendition->board.csucode_base)
81
if (pc != pRendition->board.csucode_base){
82
xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,
83
("VERITE_INITBOARD -- PC != CSUCODEBASE\n"));
84
ErrorF ("RENDITION: PC == 0x%x -- CSU == 0x%x\n",
85
pc,pRendition->board.csucode_base);
88
/* reset memory endian */
89
verite_out8(iob+MEMENDIAN, memendian);
91
if (V1000_DEVICE == pRendition->board.chip){
92
c=verite_load_ucfile(pScreenInfo, strcat ((char *)MICROCODE_DIR,"v10002d.uc"));
96
c=verite_load_ucfile(pScreenInfo, strcat ((char *)MICROCODE_DIR,"v20002d.uc"));
100
xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,
101
("Microcode loading failed !!!\n"));
105
pRendition->board.ucode_entry=c;
108
ErrorF("UCode_Entry == 0x%x\n",pRendition->board.ucode_entry); */
111
/* Everything's OK */
117
verite_resetboard(ScrnInfoPtr pScreenInfo)
119
renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
120
vu16 iob=pRendition->board.io_base;
121
vu8 memendian=verite_in8(iob+MEMENDIAN);
122
vu32 crtcctl = verite_in32(iob+CRTCCTL);
124
v1k_softreset(pScreenInfo);
125
verite_out8(iob+MEMENDIAN, memendian);
126
verite_out32(iob+CRTCCTL, crtcctl);
132
verite_getmemorysize(ScrnInfoPtr pScreenInfo)
134
renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
136
#define PATTERN 0xf5faaf5f
137
#define START 0x12345678
138
#define ONEMEG (1024L*1024L)
146
modereg=verite_in8(pRendition->board.io_base+MODEREG);
147
verite_out8(pRendition->board.io_base+MODEREG, NATIVE_MODE);
150
/* no byte swapping */
151
memendian=verite_in8(pRendition->board.io_base+MEMENDIAN);
152
verite_out8(pRendition->board.io_base+MEMENDIAN, MEMENDIAN_NO);
154
/* it looks like the v1000 wraps the memory; but for I'm not sure,
155
* let's test also for non-writable offsets */
156
start=verite_read_memory32(pRendition->board.vmem_base, 0);
157
verite_write_memory32(pRendition->board.vmem_base, 0, START);
158
for (offset=ONEMEG; offset<16*ONEMEG; offset+=ONEMEG) {
160
ErrorF( "Testing %d MB: ", offset/ONEMEG);
162
pattern=verite_read_memory32(pRendition->board.vmem_base, offset);
163
if (START == pattern) {
165
ErrorF( "Back at the beginning\n");
171
verite_write_memory32(pRendition->board.vmem_base, offset, pattern);
174
ErrorF( "%x <-> %x\n", (int)pattern,
175
(int)verite_read_memory32(pRendition->board.vmem_base, offset));
178
if (pattern != verite_read_memory32(pRendition->board.vmem_base, offset)) {
182
verite_write_memory32(pRendition->board.vmem_base, offset, pattern^PATTERN);
184
verite_write_memory32(pRendition->board.vmem_base, 0, start);
186
if (16*ONEMEG <= offset)
187
pRendition->board.mem_size=4*ONEMEG;
189
pRendition->board.mem_size=offset;
191
/* restore default byte swapping */
192
verite_out8(pRendition->board.io_base+MEMENDIAN, memendian);
195
verite_out8(pRendition->board.io_base+MODEREG, modereg);
198
return pRendition->board.mem_size;
204
verite_check_csucode(ScrnInfoPtr pScreenInfo)
206
renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
207
IOADDRESS iob=pRendition->board.io_base;
214
memend=verite_in8(iob+MEMENDIAN);
215
verite_out8(iob+MEMENDIAN, MEMENDIAN_NO);
218
ErrorF("Checking presence of csucode @ 0x%x + 0x800\n",
219
pRendition->board.vmem_base);
221
if (0x800 != pRendition->board.csucode_base)
222
ErrorF("pRendition->board.csucode_base == 0x%x\n",
223
pRendition->board.csucode_base);
226
/* compare word by word */
227
vmb=pRendition->board.vmem_base;
228
offset=pRendition->board.csucode_base;
229
for (c=0; c<sizeof(csrisc)/sizeof(vu32); c++, offset+=sizeof(vu32))
230
if (csrisc[c] != verite_read_memory32(vmb, offset)) {
231
ErrorF("csucode mismatch in word %02d: 0x%08x should be 0x%08x\n",
233
verite_read_memory32(vmb, offset),
238
ErrorF("Encountered %d out of %d possible mismatches\n",
240
sizeof(csrisc)/sizeof(vu32));
243
verite_out8(iob+MEMENDIAN, memend);
247
* end of file vboard.c