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