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