home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / mesa-1.2.8 / mondello / clgd547x.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  7KB  |  269 lines

  1.     /*
  2.    file: clgd547x.c
  3.    auth: Peter McDermott
  4.    date: Mon Feb 12 14:40:26 CST 1996
  5. */
  6.  
  7. #include <sys/types.h> /* open(), mmap() */
  8. #include <sys/stat.h>  /* open() */
  9. #include <fcntl.h>     /* open() */
  10. #include <sys/mman.h>  /* mmap() */
  11. #include <string.h>
  12. #include <unistd.h>
  13. #include <math.h>
  14.  
  15. #include "mondello/clgd547x.h"
  16. #include "mondello/clgd5471.h"  /* int clgd5471VGAIOBase */
  17. #include "mondello/graphics.h"
  18.  
  19. /*-------------------------------------------------------------------------------------------*/
  20.  
  21. #define clgd5470_PCI_ID 0x00b41013
  22. #define clgd5470_VGA_ID 0x00b4
  23. #define clgd547x_PATCHLEVEL "0"
  24.  
  25. int clgd547xPCISlot=-1;        /* PCI slot the card is in */
  26.  
  27. char *clgd547xPhysicalBase;    /* physical linear memory detected via PCI */
  28. char *clgd547xLogicalBase;     /* logical linear memory (phys. mapped here) */
  29. char *clgd547xLogicalBase2;   
  30. char *clgd547xSecondMegBase;   /* logical base of frame buffer mem (2nd meg) */
  31. int clgd547xLogicalSize=0;
  32.  
  33. int clgd547xProbed=0;
  34. int clgd547xInMondelloMode=0;     /* card is in or not in extended mode */
  35. int clgd547xAlreadyInited=0;      /* whether or not the card has been inited */
  36.  
  37. clgd547xState *clgd547xStateInfo=0;        /* global state information */
  38.  
  39. #include "modes.h" /* the modes structure for setting a given mode */
  40.  
  41. /*-------------------------------------------------------------------------------------------*/
  42. clgd547xState *clgd547xCreateState()
  43. {
  44.   clgd547xState *state=(clgd547xState*)malloc(sizeof(clgd547xState));
  45.   state->inMondelloMode=0;
  46.   state->s5471=clgd5471CreateState();
  47.   state->s5472=clgd5472CreateState();
  48.   state->hostMem=(BYTE*)malloc(1024*1024);
  49.   return state;
  50. }
  51.  
  52. /*-------------------------------------------------------------------------------------------*/
  53. void clgd547xDeleteState(clgd547xState *state)
  54. {
  55.   clgd5471DeleteState(state->s5471);
  56.   clgd5472DeleteState(state->s5472);
  57.   free(state->hostMem);
  58.   free(state);
  59. }
  60.  
  61. /*-------------------------------------------------------------------------------------------*/
  62. void clgd547xSaveState(clgd547xState *state)
  63. {
  64.   clgd5471SaveState(state->s5471);
  65.   clgd5472SaveState(state->s5472);
  66. }
  67.  
  68. /*-------------------------------------------------------------------------------------------*/
  69. void clgd547xRestoreState(clgd547xState *state)
  70. {
  71.   if(state->inMondelloMode) {
  72.     memcpy(clgd547xLogicalBase,state->hostMem,1024*1024);
  73.   }
  74.   clgd5472RestoreState(state->s5472);
  75.   clgd5471RestoreState(state->s5471);
  76.   state->inMondelloMode=0;
  77.  
  78.   /* force back to textMode--let's try to stay sane! */
  79.   textMode();
  80. }
  81.  
  82. /*-------------------------------------------------------------------------------------------*/
  83. /* tests 1 meg of memory */
  84.  
  85. int clgd547xTestMegabyte(unsigned int *ptr) 
  86. {
  87.   int i,j;
  88.   int errors=0;
  89.   static unsigned int pattern[4]= 
  90.     { 0x00000000, 0xAAAAAAAA, 0x55555555, 0xffffffff };
  91.   
  92.   for(j=0; j<4; j++)
  93.   {
  94.     for(i=0;i<1024*1024/4;i++)
  95.       ptr[i]=pattern[j];
  96.       
  97.     for(i=0;i<1024*1024/4;i++)
  98.       if(ptr[i]!=pattern[j]) {
  99.         errors++;
  100.       }
  101.   }
  102.   return errors;  
  103. }
  104.  
  105.  
  106. /*----------------------------------------------------------------------------
  107.   probe - check to see if the chipset is there.
  108. -----------------------------------------------------------------------------*/
  109. int clgd547xProbe()
  110. {
  111.   int i;
  112.   char outstr[128];
  113.  
  114.   if (getuid()) {
  115.     printf("This program must be run as root to directly access video hardware\n");
  116.     exit(1);
  117.   }
  118.  
  119.   printf("probe entered\n");
  120.   iopl(3);  /* allow access to all IO ports for now */
  121.  
  122.   /* locate the card on the bus (code taken from XF86's scanpci.c) */
  123.     
  124.   PCIUnlock();
  125.   printf("Probe: sweeping for card ");
  126.   for (i=0; i < 0x20; i++) {
  127.     printf(".");
  128.     if (PCIIn(i,0)==clgd5470_PCI_ID) {
  129.       clgd547xPCISlot=i;
  130.       clgd547xPhysicalBase=(char*)(PCIIn(i,0x10) & 0xfffffff0);
  131.       break;
  132.     }
  133.   }
  134.   PCILock();
  135.   printf("\n");
  136.  
  137.   if (clgd547xPCISlot==-1) {
  138.     printf("Probe: clgd5470 not found on PCI bus\n");
  139.     return(-1);
  140.   }
  141.   else {
  142.     printf("Probe: card found on PCI bus, slot %d\n",i);
  143.     printf("Probe: card base address 0x%x\n",clgd547xPhysicalBase);
  144.   }
  145.   
  146.   clgd547xProbed=1;
  147.   return(1);
  148. }
  149.  
  150. /*-------------------------------------------------------------------------------------------*/
  151. int clgd547xInit()
  152. {
  153.   int i;
  154.  
  155.   if (!clgd547xProbed) {
  156.     if(clgd547xProbe()<0) {
  157.       printf("clgd547xInit() - probe failed, exiting\n");
  158.       exit(1);
  159.     }
  160.   }
  161.       
  162.   clgd5471Init();
  163.  
  164.   iopl(3);   
  165.  
  166.   /* Maps clgd547x linear address space into video memory */
  167.  
  168.   printf("Init: mapping in linear memory\n");
  169.     
  170.   if ((i=open("/dev/mem",O_RDWR))<0) {
  171.     printf("init: can't open /dev/mem for mmap\n");
  172.     return -1;
  173.   }
  174.  
  175.   clgd547xLogicalSize=4*1024*1024;  /* assume a 4 meg window for now */  
  176.   clgd547xLogicalBase=(caddr_t)mmap((caddr_t)0,clgd547xLogicalSize,PROT_READ|PROT_WRITE,
  177.                   MAP_SHARED,i,(off_t)clgd547xPhysicalBase);
  178.   close(i);
  179.                             
  180.   if ((int)clgd547xLogicalBase==-1) {
  181.     printf("init: mmap failed\n");
  182.     return -1;
  183.   }
  184.   
  185.   printf("Leaving init...\n");
  186.  
  187.   iopl(0);
  188.   return 0;
  189. }
  190.  
  191.  
  192. /*-------------------------------------------------------------------------------------------*/
  193.  
  194. void clgd547xSetMode(mode *m)
  195. {
  196.   clgd5472SetMode(m);
  197.   
  198.   if (!clgd547xStateInfo->inMondelloMode) {
  199.     /* copy host memory */
  200.     memcpy(clgd547xStateInfo->hostMem,clgd547xLogicalBase,1024*1024);
  201.   }    
  202.  
  203.   clgd5470Init(m->bitsPerPixel);
  204.  
  205.   clgd547xStateInfo->inMondelloMode=1;  
  206.   clgd547xStateInfo->width=m->CrtcHDisplay;
  207.   clgd547xStateInfo->height=m->CrtcVDisplay;
  208. }
  209.  
  210. /*-------------------------------------------------------------------------------------------*/
  211.  
  212. int currentMode=0;
  213.  
  214. int clgd547x_getxdim()
  215. {
  216.   return modes[currentMode].CrtcHDisplay;
  217. }
  218.  
  219. int clgd547x_getydim()
  220. {
  221.   return modes[currentMode].CrtcVDisplay;
  222. }
  223.  
  224. int clgd547x_getdepth()
  225. {
  226.   return modes[currentMode].bitsPerPixel;
  227. }
  228.  
  229. int clgd547x_getcolors()
  230. {
  231.   return (1<<modes[currentMode].bitsPerPixel);
  232. }
  233.  
  234. void clgd547x_setcolorindex(uint index, uint red, uint green, uint blue)
  235. {
  236.   clgd5472WriteIndex(index, red, green, blue);
  237. }
  238.  
  239. void clgd547x_clear()
  240. {
  241.   clearArea8_2c(0,0,clgd547x_getxdim(),clgd547x_getydim(),0);
  242. }
  243.  
  244. void clgd547x_init()
  245. {  
  246.   char ch;
  247.   int done=0;
  248.   currentMode=0;
  249.   
  250.   if(clgd547xProbe()<0) {
  251.     printf("Cirrus Logic GD 547x not found, exiting.\n");
  252.     exit(255);
  253.   }
  254.  
  255.   clgd547xInit();
  256.   
  257.   clgd547xStateInfo=clgd547xCreateState();
  258.   clgd547xSaveState(clgd547xStateInfo);
  259.   clgd547xSetMode(&modes[currentMode]);
  260.   clgd5472InitLUT(); 
  261. }
  262.  
  263. void clgd547x_done()
  264. {
  265.   clgd547xRestoreState(clgd547xStateInfo);  
  266.   clgd547xDeleteState(clgd547xStateInfo);
  267. }
  268.  
  269.