vboard.c revision bdcaa8d0
1bdcaa8d0Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/rendition/vboard.c,v 1.18tsi Exp $ */
2bdcaa8d0Smrg/*
3bdcaa8d0Smrg * includes
4bdcaa8d0Smrg */
5bdcaa8d0Smrg
6bdcaa8d0Smrg#ifdef HAVE_CONFIG_H
7bdcaa8d0Smrg#include "config.h"
8bdcaa8d0Smrg#endif
9bdcaa8d0Smrg
10bdcaa8d0Smrg#include "rendition.h"
11bdcaa8d0Smrg#include "v1krisc.h"
12bdcaa8d0Smrg#include "vboard.h"
13bdcaa8d0Smrg#include "vloaduc.h"
14bdcaa8d0Smrg#include "vos.h"
15bdcaa8d0Smrg
16bdcaa8d0Smrg#if !defined(PATH_MAX)
17bdcaa8d0Smrg#define PATH_MAX 1024
18bdcaa8d0Smrg#endif
19bdcaa8d0Smrg
20bdcaa8d0Smrg/*
21bdcaa8d0Smrg * global data
22bdcaa8d0Smrg */
23bdcaa8d0Smrg
24bdcaa8d0Smrg#include "cscode.h"
25bdcaa8d0Smrg
26bdcaa8d0Smrg/* Global imported during compile-time */
27bdcaa8d0Smrgstatic char MICROCODE_DIR [PATH_MAX] = MODULEDIR;
28bdcaa8d0Smrg
29bdcaa8d0Smrg/*
30bdcaa8d0Smrg * local function prototypes
31bdcaa8d0Smrg */
32bdcaa8d0Smrg
33bdcaa8d0Smrg
34bdcaa8d0Smrg/*
35bdcaa8d0Smrg * functions
36bdcaa8d0Smrg */
37bdcaa8d0Smrgint
38bdcaa8d0Smrgverite_initboard(ScrnInfoPtr pScreenInfo)
39bdcaa8d0Smrg{
40bdcaa8d0Smrg    renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
41bdcaa8d0Smrg
42bdcaa8d0Smrg    IOADDRESS iob=pRendition->board.io_base;
43bdcaa8d0Smrg    vu8 *vmb;
44bdcaa8d0Smrg    vu32 offset;
45bdcaa8d0Smrg    vu8 memendian;
46bdcaa8d0Smrg    int c,pc;
47bdcaa8d0Smrg
48bdcaa8d0Smrg    /* write "monitor" program to memory */
49bdcaa8d0Smrg    v1k_stop(pScreenInfo);
50bdcaa8d0Smrg    pRendition->board.csucode_base=0x800;
51bdcaa8d0Smrg    memendian=verite_in8(iob+MEMENDIAN);
52bdcaa8d0Smrg    verite_out8(iob+MEMENDIAN, MEMENDIAN_NO);
53bdcaa8d0Smrg
54bdcaa8d0Smrg    /* Note that CS ucode must wait on address in csucode_base
55bdcaa8d0Smrg     * when initialized for later context switch code to work. */
56bdcaa8d0Smrg
57bdcaa8d0Smrg    ErrorF("Loading csucode @ %p + 0x800\n", pRendition->board.vmem_base);
58bdcaa8d0Smrg    vmb=pRendition->board.vmem_base;
59bdcaa8d0Smrg    offset=pRendition->board.csucode_base;
60bdcaa8d0Smrg    for (c=0; c<sizeof(csrisc)/sizeof(vu32); c++, offset+=sizeof(vu32))
61bdcaa8d0Smrg	verite_write_memory32(vmb, offset, csrisc[c]);
62bdcaa8d0Smrg
63bdcaa8d0Smrg    /* Initialize the CS flip semaphore */
64bdcaa8d0Smrg    verite_write_memory32(vmb, 0x7f8, 0);
65bdcaa8d0Smrg    verite_write_memory32(vmb, 0x7fc, 0);
66bdcaa8d0Smrg
67bdcaa8d0Smrg    /* Run the code we just transfered to the boards memory */
68bdcaa8d0Smrg    /* ... and start accelerator */
69bdcaa8d0Smrg    v1k_flushicache(pScreenInfo);
70bdcaa8d0Smrg
71bdcaa8d0Smrg    verite_out8(iob + STATEINDEX, STATEINDEX_PC);
72bdcaa8d0Smrg    pc = verite_in32(iob + STATEDATA);
73bdcaa8d0Smrg    v1k_start(pScreenInfo, pRendition->board.csucode_base);
74bdcaa8d0Smrg
75bdcaa8d0Smrg    /* Get on loading the ucode */
76bdcaa8d0Smrg    verite_out8(iob + STATEINDEX, STATEINDEX_PC);
77bdcaa8d0Smrg
78bdcaa8d0Smrg    for (c = 0; c < 0xffffffL; c++){
79bdcaa8d0Smrg	v1k_stop(pScreenInfo);
80bdcaa8d0Smrg	pc = verite_in32(iob + STATEDATA);
81bdcaa8d0Smrg	v1k_continue(pScreenInfo);
82bdcaa8d0Smrg	if (pc == pRendition->board.csucode_base)
83bdcaa8d0Smrg	    break;
84bdcaa8d0Smrg    }
85bdcaa8d0Smrg    if (pc != pRendition->board.csucode_base){
86bdcaa8d0Smrg	xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,
87bdcaa8d0Smrg		   ("VERITE_INITBOARD -- PC != CSUCODEBASE\n"));
88bdcaa8d0Smrg	ErrorF ("RENDITION: PC == 0x%x   --  CSU == 0x%lx\n",
89bdcaa8d0Smrg		pc,(unsigned long)pRendition->board.csucode_base);
90bdcaa8d0Smrg    }
91bdcaa8d0Smrg
92bdcaa8d0Smrg    /* reset memory endian */
93bdcaa8d0Smrg    verite_out8(iob+MEMENDIAN, memendian);
94bdcaa8d0Smrg
95bdcaa8d0Smrg    if (V1000_DEVICE == pRendition->board.chip){
96bdcaa8d0Smrg	c=verite_load_ucfile(pScreenInfo, strcat ((char *)MICROCODE_DIR,"v10002d.uc"));
97bdcaa8d0Smrg    }
98bdcaa8d0Smrg    else {
99bdcaa8d0Smrg	/* V2x00 chip */
100bdcaa8d0Smrg	c=verite_load_ucfile(pScreenInfo, strcat ((char *)MICROCODE_DIR,"v20002d.uc"));
101bdcaa8d0Smrg    }
102bdcaa8d0Smrg
103bdcaa8d0Smrg    if (c == -1) {
104bdcaa8d0Smrg	xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,
105bdcaa8d0Smrg		   ("Microcode loading failed !!!\n"));
106bdcaa8d0Smrg	return 1;
107bdcaa8d0Smrg    }
108bdcaa8d0Smrg
109bdcaa8d0Smrg    pRendition->board.ucode_entry=c;
110bdcaa8d0Smrg
111bdcaa8d0Smrg#ifdef DEBUG
112bdcaa8d0Smrg    ErrorF("UCode_Entry == 0x%x\n",pRendition->board.ucode_entry);
113bdcaa8d0Smrg#endif
114bdcaa8d0Smrg
115bdcaa8d0Smrg    /* Everything's OK */
116bdcaa8d0Smrg    return 0;
117bdcaa8d0Smrg}
118bdcaa8d0Smrg
119bdcaa8d0Smrg
120bdcaa8d0Smrgint
121bdcaa8d0Smrgverite_resetboard(ScrnInfoPtr pScreenInfo)
122bdcaa8d0Smrg{
123bdcaa8d0Smrg    renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
124bdcaa8d0Smrg    vu16 iob=pRendition->board.io_base;
125bdcaa8d0Smrg    vu8 memendian=verite_in8(iob+MEMENDIAN);
126bdcaa8d0Smrg    vu32 crtcctl = verite_in32(iob+CRTCCTL);
127bdcaa8d0Smrg
128bdcaa8d0Smrg    v1k_softreset(pScreenInfo);
129bdcaa8d0Smrg    verite_out8(iob+MEMENDIAN, memendian);
130bdcaa8d0Smrg    verite_out32(iob+CRTCCTL, crtcctl);
131bdcaa8d0Smrg
132bdcaa8d0Smrg    return 0;
133bdcaa8d0Smrg}
134bdcaa8d0Smrg
135bdcaa8d0Smrgint
136bdcaa8d0Smrgverite_getmemorysize(ScrnInfoPtr pScreenInfo)
137bdcaa8d0Smrg{
138bdcaa8d0Smrg    renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
139bdcaa8d0Smrg
140bdcaa8d0Smrg#define PATTERN  0xf5faaf5f
141bdcaa8d0Smrg#define START    0x12345678
142bdcaa8d0Smrg#define ONEMEG   (1024L*1024L)
143bdcaa8d0Smrg    vu32 offset;
144bdcaa8d0Smrg    vu32 pattern;
145bdcaa8d0Smrg    vu32 start;
146bdcaa8d0Smrg    vu8 memendian;
147bdcaa8d0Smrg#ifdef XSERVER
148bdcaa8d0Smrg    vu8 modereg;
149bdcaa8d0Smrg
150bdcaa8d0Smrg    modereg=verite_in8(pRendition->board.io_base+MODEREG);
151bdcaa8d0Smrg    verite_out8(pRendition->board.io_base+MODEREG, NATIVE_MODE);
152bdcaa8d0Smrg#endif
153bdcaa8d0Smrg
154bdcaa8d0Smrg    /* no byte swapping */
155bdcaa8d0Smrg    memendian=verite_in8(pRendition->board.io_base+MEMENDIAN);
156bdcaa8d0Smrg    verite_out8(pRendition->board.io_base+MEMENDIAN, MEMENDIAN_NO);
157bdcaa8d0Smrg
158bdcaa8d0Smrg    /* it looks like the v1000 wraps the memory; but for I'm not sure,
159bdcaa8d0Smrg     * let's test also for non-writable offsets */
160bdcaa8d0Smrg    start=verite_read_memory32(pRendition->board.vmem_base, 0);
161bdcaa8d0Smrg    verite_write_memory32(pRendition->board.vmem_base, 0, START);
162bdcaa8d0Smrg    for (offset=ONEMEG; offset<16*ONEMEG; offset+=ONEMEG) {
163bdcaa8d0Smrg#ifdef DEBUG
164bdcaa8d0Smrg        ErrorF( "Testing %d MB: ", offset/ONEMEG);
165bdcaa8d0Smrg#endif
166bdcaa8d0Smrg        pattern=verite_read_memory32(pRendition->board.vmem_base, offset);
167bdcaa8d0Smrg        if (START == pattern) {
168bdcaa8d0Smrg#ifdef DEBUG
169bdcaa8d0Smrg            ErrorF( "Back at the beginning\n");
170bdcaa8d0Smrg#endif
171bdcaa8d0Smrg            break;
172bdcaa8d0Smrg        }
173bdcaa8d0Smrg
174bdcaa8d0Smrg        pattern^=PATTERN;
175bdcaa8d0Smrg        verite_write_memory32(pRendition->board.vmem_base, offset, pattern);
176bdcaa8d0Smrg
177bdcaa8d0Smrg#ifdef DEBUG
178bdcaa8d0Smrg        ErrorF( "%x <-> %x\n", (int)pattern,
179bdcaa8d0Smrg                    (int)verite_read_memory32(pRendition->board.vmem_base, offset));
180bdcaa8d0Smrg#endif
181bdcaa8d0Smrg
182bdcaa8d0Smrg        if (pattern != verite_read_memory32(pRendition->board.vmem_base, offset)) {
183bdcaa8d0Smrg            offset-=ONEMEG;
184bdcaa8d0Smrg            break;
185bdcaa8d0Smrg        }
186bdcaa8d0Smrg        verite_write_memory32(pRendition->board.vmem_base, offset, pattern^PATTERN);
187bdcaa8d0Smrg    }
188bdcaa8d0Smrg    verite_write_memory32(pRendition->board.vmem_base, 0, start);
189bdcaa8d0Smrg
190bdcaa8d0Smrg    if (16*ONEMEG <= offset)
191bdcaa8d0Smrg        pRendition->board.mem_size=4*ONEMEG;
192bdcaa8d0Smrg    else
193bdcaa8d0Smrg	    pRendition->board.mem_size=offset;
194bdcaa8d0Smrg
195bdcaa8d0Smrg    /* restore default byte swapping */
196bdcaa8d0Smrg    verite_out8(pRendition->board.io_base+MEMENDIAN, memendian);
197bdcaa8d0Smrg
198bdcaa8d0Smrg#ifdef XSERVER
199bdcaa8d0Smrg    verite_out8(pRendition->board.io_base+MODEREG, modereg);
200bdcaa8d0Smrg#endif
201bdcaa8d0Smrg
202bdcaa8d0Smrg    return pRendition->board.mem_size;
203bdcaa8d0Smrg#undef PATTERN
204bdcaa8d0Smrg#undef ONEMEG
205bdcaa8d0Smrg}
206bdcaa8d0Smrg
207bdcaa8d0Smrgvoid
208bdcaa8d0Smrgverite_check_csucode(ScrnInfoPtr pScreenInfo)
209bdcaa8d0Smrg{
210bdcaa8d0Smrg  renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
211bdcaa8d0Smrg  IOADDRESS iob=pRendition->board.io_base;
212bdcaa8d0Smrg  vu8 *vmb;
213bdcaa8d0Smrg  vu32 offset;
214bdcaa8d0Smrg  int c;
215bdcaa8d0Smrg  int memend;
216bdcaa8d0Smrg  int mismatches=0;
217bdcaa8d0Smrg
218bdcaa8d0Smrg  memend=verite_in8(iob+MEMENDIAN);
219bdcaa8d0Smrg  verite_out8(iob+MEMENDIAN, MEMENDIAN_NO);
220bdcaa8d0Smrg
221bdcaa8d0Smrg#ifdef DEBUG
222bdcaa8d0Smrg  ErrorF("Checking presence of csucode @ 0x%x + 0x800\n",
223bdcaa8d0Smrg	 pRendition->board.vmem_base);
224bdcaa8d0Smrg
225bdcaa8d0Smrg  if (0x800 != pRendition->board.csucode_base)
226bdcaa8d0Smrg    ErrorF("pRendition->board.csucode_base == 0x%x\n",
227bdcaa8d0Smrg	   pRendition->board.csucode_base);
228bdcaa8d0Smrg#endif
229bdcaa8d0Smrg
230bdcaa8d0Smrg  /* compare word by word */
231bdcaa8d0Smrg  vmb=pRendition->board.vmem_base;
232bdcaa8d0Smrg  offset=pRendition->board.csucode_base;
233bdcaa8d0Smrg  for (c=0; c<sizeof(csrisc)/sizeof(vu32); c++, offset+=sizeof(vu32))
234bdcaa8d0Smrg    if (csrisc[c] != verite_read_memory32(vmb, offset)) {
235bdcaa8d0Smrg      ErrorF("csucode mismatch in word %02d: 0x%08lx should be 0x%08lx\n",
236bdcaa8d0Smrg	     c,
237bdcaa8d0Smrg	     (unsigned long)verite_read_memory32(vmb, offset),
238bdcaa8d0Smrg	     (unsigned long)csrisc[c]);
239bdcaa8d0Smrg      mismatches++;
240bdcaa8d0Smrg    }
241bdcaa8d0Smrg#ifdef DEBUG
242bdcaa8d0Smrg  ErrorF("Encountered %d out of %d possible mismatches\n",
243bdcaa8d0Smrg	 mismatches,
244bdcaa8d0Smrg	 sizeof(csrisc)/sizeof(vu32));
245bdcaa8d0Smrg#endif
246bdcaa8d0Smrg
247bdcaa8d0Smrg  verite_out8(iob+MEMENDIAN, memend);
248bdcaa8d0Smrg}
249bdcaa8d0Smrg
250bdcaa8d0Smrg/*
251bdcaa8d0Smrg * end of file vboard.c
252bdcaa8d0Smrg */
253