s3_bios.c revision 340e3fbd
1340e3fbdSmrg/* 2340e3fbdSmrg * Copyright 2001 Ani Joshi <ajoshi@unixbox.com> 3340e3fbdSmrg * 4340e3fbdSmrg * XFree86 4.x driver for S3 chipsets 5340e3fbdSmrg * 6340e3fbdSmrg * 7340e3fbdSmrg * Permission to use, copy, modify, distribute, and sell this software and its 8340e3fbdSmrg * documentation for any purpose is hereby granted without fee, provided that 9340e3fbdSmrg * the above copyright notice appear in all copies and that both that copyright 10340e3fbdSmrg * notice and this permission notice appear in supporting documentation and 11340e3fbdSmrg * that the name of Ani Joshi not be used in advertising or 12340e3fbdSmrg * publicity pertaining to distribution of the software without specific, 13340e3fbdSmrg * written prior permission. Ani Joshi makes no representations 14340e3fbdSmrg * about the suitability of this software for any purpose. It is provided 15340e3fbdSmrg * "as-is" without express or implied warranty. 16340e3fbdSmrg * 17340e3fbdSmrg * ANI JOSHI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18340e3fbdSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19340e3fbdSmrg * EVENT SHALL ANI JOSHI BE LIABLE FOR ANY SPECIAL, INDIRECT OR 20340e3fbdSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21340e3fbdSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 22340e3fbdSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 23340e3fbdSmrg * PERFORMANCE OF THIS SOFTWARE. 24340e3fbdSmrg * 25340e3fbdSmrg * 26340e3fbdSmrg */ 27340e3fbdSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3/s3_bios.c,v 1.2 2001/07/11 07:45:35 alanh Exp $ */ 28340e3fbdSmrg 29340e3fbdSmrg#ifdef HAVE_CONFIG_H 30340e3fbdSmrg#include "config.h" 31340e3fbdSmrg#endif 32340e3fbdSmrg 33340e3fbdSmrg#include "xf86.h" 34340e3fbdSmrg#include "xf86_OSproc.h" 35340e3fbdSmrg#include "compiler.h" 36340e3fbdSmrg 37340e3fbdSmrg#include "s3.h" 38340e3fbdSmrg 39340e3fbdSmrg 40340e3fbdSmrgstatic unsigned char *find_bios_string(S3Ptr pS3, int BIOSbase, 41340e3fbdSmrg char *match1, char *match2) 42340e3fbdSmrg{ 43340e3fbdSmrg static unsigned char bios[BIOS_BSIZE]; 44340e3fbdSmrg static int init=0; 45340e3fbdSmrg int i, j, l1, l2; 46340e3fbdSmrg 47340e3fbdSmrg if (!init) { 48340e3fbdSmrg init = 1; 49340e3fbdSmrg if (xf86ReadDomainMemory(pS3->PciTag, BIOSbase, BIOS_BSIZE, bios) != BIOS_BSIZE) 50340e3fbdSmrg return NULL; 51340e3fbdSmrg if ((bios[0] != 0x55) || (bios[1] != 0xaa)) 52340e3fbdSmrg return NULL; 53340e3fbdSmrg } 54340e3fbdSmrg if (match1 == NULL) 55340e3fbdSmrg return NULL; 56340e3fbdSmrg 57340e3fbdSmrg l1 = strlen(match1); 58340e3fbdSmrg if (match2 != NULL) 59340e3fbdSmrg l2 = strlen(match2); 60340e3fbdSmrg else 61340e3fbdSmrg l2 = 0; 62340e3fbdSmrg 63340e3fbdSmrg for (i=0; i<BIOS_BSIZE; i++) 64340e3fbdSmrg if (bios[i] == match1[0] && !memcmp(&bios[i], match1, l1)) { 65340e3fbdSmrg if (match2 == NULL) 66340e3fbdSmrg return &bios[i+l1]; 67340e3fbdSmrg else 68340e3fbdSmrg for(j=i+l1; (j<BIOS_BSIZE-l2) && bios[j]; j++) 69340e3fbdSmrg if (bios[j] == match2[0] && 70340e3fbdSmrg !memcmp(&bios[j], match2, l2)) 71340e3fbdSmrg return &bios[j+l2]; 72340e3fbdSmrg } 73340e3fbdSmrg 74340e3fbdSmrg return NULL; 75340e3fbdSmrg} 76340e3fbdSmrg 77340e3fbdSmrg 78340e3fbdSmrgint S3GetRefClock(ScrnInfoPtr pScrn) 79340e3fbdSmrg{ 80340e3fbdSmrg S3Ptr pS3 = S3PTR(pScrn); 81340e3fbdSmrg int RefClock = 16000; /* default */ 82340e3fbdSmrg 83340e3fbdSmrg if (find_bios_string(pS3, BIOS_BASE, "Number Nine Visual Technology", 84340e3fbdSmrg "Motion 771") != NULL) 85340e3fbdSmrg RefClock = 16000; 86340e3fbdSmrg 87340e3fbdSmrg return RefClock; 88340e3fbdSmrg} 89