mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 08:34:47 +10:00 
			
		
		
		
	x86, platforms: Remove SGI Visual Workstation
The SGI Visual Workstation seems to be dead; remove support so we don't have to continue maintaining it. Cc: Andrey Panin <pazke@donpac.ru> Cc: Michael Reed <mdr@sgi.com> Link: http://lkml.kernel.org/r/530CFD6C.7040705@zytor.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
		
							parent
							
								
									7cf6c94591
								
							
						
					
					
						commit
						c5f9ee3d66
					
				@ -401,8 +401,6 @@ serial-console.txt
 | 
			
		||||
	- how to set up Linux with a serial line console as the default.
 | 
			
		||||
sgi-ioc4.txt
 | 
			
		||||
	- description of the SGI IOC4 PCI (multi function) device.
 | 
			
		||||
sgi-visws.txt
 | 
			
		||||
	- short blurb on the SGI Visual Workstations.
 | 
			
		||||
sh/
 | 
			
		||||
	- directory with info on porting Linux to a new architecture.
 | 
			
		||||
smsc_ece1099.txt
 | 
			
		||||
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
 | 
			
		||||
The SGI Visual Workstations (models 320 and 540) are based around
 | 
			
		||||
the Cobalt, Lithium, and Arsenic ASICs.  The Cobalt ASIC is the
 | 
			
		||||
main system ASIC which interfaces the 1-4 IA32 cpus, the memory
 | 
			
		||||
system, and the I/O system in the Lithium ASIC.  The Cobalt ASIC
 | 
			
		||||
also contains the 3D gfx rendering engine which renders to main
 | 
			
		||||
system memory -- part of which is used as the frame buffer which
 | 
			
		||||
is DMA'ed to a video connector using the Arsenic ASIC.  A PIIX4
 | 
			
		||||
chip and NS87307 are used to provide legacy device support (IDE,
 | 
			
		||||
serial, floppy, and parallel).
 | 
			
		||||
 | 
			
		||||
The Visual Workstation chipset largely conforms to the PC architecture
 | 
			
		||||
with some notable exceptions such as interrupt handling.
 | 
			
		||||
@ -1,293 +0,0 @@
 | 
			
		||||
vwsnd - Sound driver for the Silicon Graphics 320 and 540 Visual
 | 
			
		||||
Workstations' onboard audio.
 | 
			
		||||
 | 
			
		||||
Copyright 1999 Silicon Graphics, Inc.  All rights reserved.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
At the time of this writing, March 1999, there are two models of
 | 
			
		||||
Visual Workstation, the 320 and the 540.  This document only describes
 | 
			
		||||
those models.  Future Visual Workstation models may have different
 | 
			
		||||
sound capabilities, and this driver will probably not work on those
 | 
			
		||||
boxes.
 | 
			
		||||
 | 
			
		||||
The Visual Workstation has an Analog Devices AD1843 "SoundComm" audio
 | 
			
		||||
codec chip.  The AD1843 is accessed through the Cobalt I/O ASIC, also
 | 
			
		||||
known as Lithium.  This driver programs both chips.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
QUICK CONFIGURATION
 | 
			
		||||
 | 
			
		||||
	# insmod soundcore
 | 
			
		||||
	# insmod vwsnd
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
I/O CONNECTIONS
 | 
			
		||||
 | 
			
		||||
On the Visual Workstation, only three of the AD1843 inputs are hooked
 | 
			
		||||
up.  The analog line in jacks are connected to the AD1843's AUX1
 | 
			
		||||
input.  The CD audio lines are connected to the AD1843's AUX2 input.
 | 
			
		||||
The microphone jack is connected to the AD1843's MIC input.  The mic
 | 
			
		||||
jack is mono, but the signal is delivered to both the left and right
 | 
			
		||||
MIC inputs.  You can record in stereo from the mic input, but you will
 | 
			
		||||
get the same signal on both channels (within the limits of A/D
 | 
			
		||||
accuracy).  Full scale on the Line input is +/- 2.0 V.  Full scale on
 | 
			
		||||
the MIC input is 20 dB less, or +/- 0.2 V.
 | 
			
		||||
 | 
			
		||||
The AD1843's LOUT1 outputs are connected to the Line Out jacks.  The
 | 
			
		||||
AD1843's HPOUT outputs are connected to the speaker/headphone jack.
 | 
			
		||||
LOUT2 is not connected.  Line out's maximum level is +/- 2.0 V peak to
 | 
			
		||||
peak.  The speaker/headphone out's maximum is +/- 4.0 V peak to peak.
 | 
			
		||||
 | 
			
		||||
The AD1843's PCM input channel and one of its output channels (DAC1)
 | 
			
		||||
are connected to Lithium.  The other output channel (DAC2) is not
 | 
			
		||||
connected.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
CAPABILITIES
 | 
			
		||||
 | 
			
		||||
The AD1843 has PCM input and output (Pulse Code Modulation, also known
 | 
			
		||||
as wavetable).  PCM input and output can be mono or stereo in any of
 | 
			
		||||
four formats.  The formats are 16 bit signed and 8 bit unsigned,
 | 
			
		||||
u-Law, and A-Law format.  Any sample rate from 4 KHz to 49 KHz is
 | 
			
		||||
available, in 1 Hz increments.
 | 
			
		||||
 | 
			
		||||
The AD1843 includes an analog mixer that can mix all three input
 | 
			
		||||
signals (line, mic and CD) into the analog outputs.  The mixer has a
 | 
			
		||||
separate gain control and mute switch for each input.
 | 
			
		||||
 | 
			
		||||
There are two outputs, line out and speaker/headphone out.  They
 | 
			
		||||
always produce the same signal, and the speaker always has 3 dB more
 | 
			
		||||
gain than the line out.  The speaker/headphone output can be muted,
 | 
			
		||||
but this driver does not export that function.
 | 
			
		||||
 | 
			
		||||
The hardware can sync audio to the video clock, but this driver does
 | 
			
		||||
not have a way to specify syncing to video.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
PROGRAMMING
 | 
			
		||||
 | 
			
		||||
This section explains the API supported by the driver.  Also see the
 | 
			
		||||
Open Sound Programming Guide at http://www.opensound.com/pguide/ .
 | 
			
		||||
This section assumes familiarity with that document.
 | 
			
		||||
 | 
			
		||||
The driver has two interfaces, an I/O interface and a mixer interface.
 | 
			
		||||
There is no MIDI or sequencer capability.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
PROGRAMMING PCM I/O
 | 
			
		||||
 | 
			
		||||
The I/O interface is usually accessed as /dev/audio or /dev/dsp.
 | 
			
		||||
Using the standard Open Sound System (OSS) ioctl calls, the sample
 | 
			
		||||
rate, number of channels, and sample format may be set within the
 | 
			
		||||
limitations described above.  The driver supports triggering.  It also
 | 
			
		||||
supports getting the input and output pointers with one-sample
 | 
			
		||||
accuracy.
 | 
			
		||||
 | 
			
		||||
The SNDCTL_DSP_GETCAP ioctl returns these capabilities.
 | 
			
		||||
 | 
			
		||||
	DSP_CAP_DUPLEX - driver supports full duplex.
 | 
			
		||||
 | 
			
		||||
	DSP_CAP_TRIGGER - driver supports triggering.
 | 
			
		||||
 | 
			
		||||
	DSP_CAP_REALTIME - values returned by SNDCTL_DSP_GETIPTR
 | 
			
		||||
	and SNDCTL_DSP_GETOPTR are accurate to a few samples.
 | 
			
		||||
 | 
			
		||||
Memory mapping (mmap) is not implemented.
 | 
			
		||||
 | 
			
		||||
The driver permits subdivided fragment sizes from 64 to 4096 bytes.
 | 
			
		||||
The number of fragments can be anything from 3 fragments to however
 | 
			
		||||
many fragments fit into 124 kilobytes.  It is up to the user to
 | 
			
		||||
determine how few/small fragments can be used without introducing
 | 
			
		||||
glitches with a given workload.  Linux is not realtime, so we can't
 | 
			
		||||
promise anything.  (sigh...)
 | 
			
		||||
 | 
			
		||||
When this driver is switched into or out of mu-Law or A-Law mode on
 | 
			
		||||
output, it may produce an audible click.  This is unavoidable.  To
 | 
			
		||||
prevent clicking, use signed 16-bit mode instead, and convert from
 | 
			
		||||
mu-Law or A-Law format in software.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
PROGRAMMING THE MIXER INTERFACE
 | 
			
		||||
 | 
			
		||||
The mixer interface is usually accessed as /dev/mixer.  It is accessed
 | 
			
		||||
through ioctls.  The mixer allows the application to control gain or
 | 
			
		||||
mute several audio signal paths, and also allows selection of the
 | 
			
		||||
recording source.
 | 
			
		||||
 | 
			
		||||
Each of the constants described here can be read using the
 | 
			
		||||
MIXER_READ(SOUND_MIXER_xxx) ioctl.  Those that are not read-only can
 | 
			
		||||
also be written using the MIXER_WRITE(SOUND_MIXER_xxx) ioctl.  In most
 | 
			
		||||
cases, <sys/soundcard.h> defines constants SOUND_MIXER_READ_xxx and
 | 
			
		||||
SOUND_MIXER_WRITE_xxx which work just as well.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_CAPS	Read-only
 | 
			
		||||
 | 
			
		||||
This is a mask of optional driver capabilities that are implemented.
 | 
			
		||||
This driver's only capability is SOUND_CAP_EXCL_INPUT, which means
 | 
			
		||||
that only one recording source can be active at a time.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_DEVMASK	Read-only
 | 
			
		||||
 | 
			
		||||
This is a mask of the sound channels.  This driver's channels are PCM,
 | 
			
		||||
LINE, MIC, CD, and RECLEV.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_STEREODEVS	Read-only
 | 
			
		||||
 | 
			
		||||
This is a mask of which sound channels are capable of stereo.  All
 | 
			
		||||
channels are capable of stereo.  (But see caveat on MIC input in I/O
 | 
			
		||||
CONNECTIONS section above).
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_OUTMASK	Read-only
 | 
			
		||||
 | 
			
		||||
This is a mask of channels that route inputs through to outputs.
 | 
			
		||||
Those are LINE, MIC, and CD.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_RECMASK	Read-only
 | 
			
		||||
 | 
			
		||||
This is a mask of channels that can be recording sources.  Those are
 | 
			
		||||
PCM, LINE, MIC, CD.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_PCM		Default: 0x5757 (0 dB)
 | 
			
		||||
 | 
			
		||||
This is the gain control for PCM output.  The left and right channel
 | 
			
		||||
gain are controlled independently.  This gain control has 64 levels,
 | 
			
		||||
which range from -82.5 dB to +12.0 dB in 1.5 dB steps.  Those 64
 | 
			
		||||
levels are mapped onto 100 levels at the ioctl, see below.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_LINE	Default: 0x4a4a (0 dB)
 | 
			
		||||
 | 
			
		||||
This is the gain control for mixing the Line In source into the
 | 
			
		||||
outputs.  The left and right channel gain are controlled
 | 
			
		||||
independently.  This gain control has 32 levels, which range from
 | 
			
		||||
-34.5 dB to +12.0 dB in 1.5 dB steps.  Those 32 levels are mapped onto
 | 
			
		||||
100 levels at the ioctl, see below.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_MIC		Default: 0x4a4a (0 dB)
 | 
			
		||||
 | 
			
		||||
This is the gain control for mixing the MIC source into the outputs.
 | 
			
		||||
The left and right channel gain are controlled independently.  This
 | 
			
		||||
gain control has 32 levels, which range from -34.5 dB to +12.0 dB in
 | 
			
		||||
1.5 dB steps.  Those 32 levels are mapped onto 100 levels at the
 | 
			
		||||
ioctl, see below.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_CD		Default: 0x4a4a (0 dB)
 | 
			
		||||
 | 
			
		||||
This is the gain control for mixing the CD audio source into the
 | 
			
		||||
outputs.  The left and right channel gain are controlled
 | 
			
		||||
independently.  This gain control has 32 levels, which range from
 | 
			
		||||
-34.5 dB to +12.0 dB in 1.5 dB steps.  Those 32 levels are mapped onto
 | 
			
		||||
100 levels at the ioctl, see below.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_RECLEV	 Default: 0 (0 dB)
 | 
			
		||||
 | 
			
		||||
This is the gain control for PCM input (RECording LEVel).  The left
 | 
			
		||||
and right channel gain are controlled independently.  This gain
 | 
			
		||||
control has 16 levels, which range from 0 dB to +22.5 dB in 1.5 dB
 | 
			
		||||
steps.  Those 16 levels are mapped onto 100 levels at the ioctl, see
 | 
			
		||||
below.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_RECSRC	 Default: SOUND_MASK_LINE
 | 
			
		||||
 | 
			
		||||
This is a mask of currently selected PCM input sources (RECording
 | 
			
		||||
SouRCes).  Because the AD1843 can only have a single recording source
 | 
			
		||||
at a time, only one bit at a time can be set in this mask.  The
 | 
			
		||||
allowable values are SOUND_MASK_PCM, SOUND_MASK_LINE, SOUND_MASK_MIC,
 | 
			
		||||
or SOUND_MASK_CD.  Selecting SOUND_MASK_PCM sets up internal
 | 
			
		||||
resampling which is useful for loopback testing and for hardware
 | 
			
		||||
sample rate conversion.  But software sample rate conversion is
 | 
			
		||||
probably faster, so I don't know how useful that is.
 | 
			
		||||
 | 
			
		||||
SOUND_MIXER_OUTSRC	DEFAULT: SOUND_MASK_LINE|SOUND_MASK_MIC|SOUND_MASK_CD
 | 
			
		||||
 | 
			
		||||
This is a mask of sources that are currently passed through to the
 | 
			
		||||
outputs.  Those sources whose bits are not set are muted.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
GAIN CONTROL
 | 
			
		||||
 | 
			
		||||
There are five gain controls listed above.  Each has 16, 32, or 64
 | 
			
		||||
steps.  Each control has 1.5 dB of gain per step.  Each control is
 | 
			
		||||
stereo.
 | 
			
		||||
 | 
			
		||||
The OSS defines the argument to a channel gain ioctl as having two
 | 
			
		||||
components, left and right, each of which ranges from 0 to 100.  The
 | 
			
		||||
two components are packed into the same word, with the left side gain
 | 
			
		||||
in the least significant byte, and the right side gain in the second
 | 
			
		||||
least significant byte.  In C, we would say this.
 | 
			
		||||
 | 
			
		||||
	#include <assert.h>
 | 
			
		||||
 | 
			
		||||
	...
 | 
			
		||||
 | 
			
		||||
	 	assert(leftgain >= 0 && leftgain <= 100);
 | 
			
		||||
		assert(rightgain >= 0 && rightgain <= 100);
 | 
			
		||||
		arg = leftgain | rightgain << 8;
 | 
			
		||||
 | 
			
		||||
So each OSS gain control has 101 steps.  But the hardware has 16, 32,
 | 
			
		||||
or 64 steps.  The hardware steps are spread across the 101 OSS steps
 | 
			
		||||
nearly evenly.  The conversion formulas are like this, given N equals
 | 
			
		||||
16, 32, or 64.
 | 
			
		||||
 | 
			
		||||
	int round = N/2 - 1;
 | 
			
		||||
	OSS_gain_steps = (hw_gain_steps * 100 + round) / (N - 1);
 | 
			
		||||
	hw_gain_steps = (OSS_gain_steps * (N - 1) + round) / 100;
 | 
			
		||||
 | 
			
		||||
Here is a snippet of C code that will return the left and right gain
 | 
			
		||||
of any channel in dB.  Pass it one of the predefined gain_desc_t
 | 
			
		||||
structures to access any of the five channels' gains.
 | 
			
		||||
 | 
			
		||||
	typedef struct gain_desc {
 | 
			
		||||
		float min_gain;
 | 
			
		||||
		float gain_step;
 | 
			
		||||
		int nbits;
 | 
			
		||||
		int chan;
 | 
			
		||||
	} gain_desc_t;
 | 
			
		||||
 | 
			
		||||
	const gain_desc_t gain_pcm    = { -82.5, 1.5, 6, SOUND_MIXER_PCM    };
 | 
			
		||||
	const gain_desc_t gain_line   = { -34.5, 1.5, 5, SOUND_MIXER_LINE   };
 | 
			
		||||
	const gain_desc_t gain_mic    = { -34.5, 1.5, 5, SOUND_MIXER_MIC    };
 | 
			
		||||
	const gain_desc_t gain_cd     = { -34.5, 1.5, 5, SOUND_MIXER_CD     };
 | 
			
		||||
	const gain_desc_t gain_reclev = {   0.0, 1.5, 4, SOUND_MIXER_RECLEV };
 | 
			
		||||
 | 
			
		||||
	int get_gain_dB(int fd, const gain_desc_t *gp,
 | 
			
		||||
			float *left, float *right)
 | 
			
		||||
	{
 | 
			
		||||
		int word;
 | 
			
		||||
		int lg, rg;
 | 
			
		||||
		int mask = (1 << gp->nbits) - 1;
 | 
			
		||||
 | 
			
		||||
		if (ioctl(fd, MIXER_READ(gp->chan), &word) != 0)
 | 
			
		||||
			return -1;	/* fail */
 | 
			
		||||
		lg = word & 0xFF;
 | 
			
		||||
		rg = word >> 8 & 0xFF;
 | 
			
		||||
		lg = (lg * mask + mask / 2) / 100;
 | 
			
		||||
		rg = (rg * mask + mask / 2) / 100;
 | 
			
		||||
		*left = gp->min_gain + gp->gain_step * lg;
 | 
			
		||||
		*right = gp->min_gain + gp->gain_step * rg;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}	
 | 
			
		||||
 | 
			
		||||
And here is the corresponding routine to set a channel's gain in dB.
 | 
			
		||||
 | 
			
		||||
	int set_gain_dB(int fd, const gain_desc_t *gp, float left, float right)
 | 
			
		||||
	{
 | 
			
		||||
		float max_gain =
 | 
			
		||||
			gp->min_gain + (1 << gp->nbits) * gp->gain_step;
 | 
			
		||||
		float round = gp->gain_step / 2;
 | 
			
		||||
		int mask = (1 << gp->nbits) - 1;
 | 
			
		||||
		int word;
 | 
			
		||||
		int lg, rg;
 | 
			
		||||
 | 
			
		||||
		if (left < gp->min_gain || right < gp->min_gain)
 | 
			
		||||
			return EINVAL;
 | 
			
		||||
		lg = (left - gp->min_gain + round) / gp->gain_step;
 | 
			
		||||
		rg = (right - gp->min_gain + round) / gp->gain_step;
 | 
			
		||||
		if (lg >= (1 << gp->nbits) || rg >= (1 << gp->nbits))
 | 
			
		||||
			return EINVAL;
 | 
			
		||||
		lg = (100 * lg + mask / 2) / mask;
 | 
			
		||||
		rg = (100 * rg + mask / 2) / mask;
 | 
			
		||||
		word = lg | rg << 8;
 | 
			
		||||
 | 
			
		||||
		return ioctl(fd, MIXER_WRITE(gp->chan), &word);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -7757,13 +7757,6 @@ F:	Documentation/ia64/serial.txt
 | 
			
		||||
F:	drivers/tty/serial/ioc?_serial.c
 | 
			
		||||
F:	include/linux/ioc?.h
 | 
			
		||||
 | 
			
		||||
SGI VISUAL WORKSTATION 320 AND 540
 | 
			
		||||
M:	Andrey Panin <pazke@donpac.ru>
 | 
			
		||||
L:	linux-visws-devel@lists.sf.net
 | 
			
		||||
W:	http://linux-visws.sf.net
 | 
			
		||||
S:	Maintained for 2.6.
 | 
			
		||||
F:	Documentation/sgi-visws.txt
 | 
			
		||||
 | 
			
		||||
SGI XP/XPC/XPNET DRIVER
 | 
			
		||||
M:	Cliff Whickman <cpw@sgi.com>
 | 
			
		||||
M:	Robin Holt <robinmholt@gmail.com>
 | 
			
		||||
 | 
			
		||||
@ -517,19 +517,6 @@ config X86_SUPPORTS_MEMORY_FAILURE
 | 
			
		||||
	depends on X86_64 || !SPARSEMEM
 | 
			
		||||
	select ARCH_SUPPORTS_MEMORY_FAILURE
 | 
			
		||||
 | 
			
		||||
config X86_VISWS
 | 
			
		||||
	bool "SGI 320/540 (Visual Workstation)"
 | 
			
		||||
	depends on X86_32 && PCI && X86_MPPARSE && PCI_GODIRECT
 | 
			
		||||
	depends on X86_32_NON_STANDARD
 | 
			
		||||
	---help---
 | 
			
		||||
	  The SGI Visual Workstation series is an IA32-based workstation
 | 
			
		||||
	  based on SGI systems chips with some legacy PC hardware attached.
 | 
			
		||||
 | 
			
		||||
	  Say Y here to create a kernel to run on the SGI 320 or 540.
 | 
			
		||||
 | 
			
		||||
	  A kernel compiled for the Visual Workstation will run on general
 | 
			
		||||
	  PCs as well. See <file:Documentation/sgi-visws.txt> for details.
 | 
			
		||||
 | 
			
		||||
config STA2X11
 | 
			
		||||
	bool "STA2X11 Companion Chip Support"
 | 
			
		||||
	depends on X86_32_NON_STANDARD && PCI
 | 
			
		||||
@ -860,10 +847,6 @@ config X86_IO_APIC
 | 
			
		||||
	def_bool y
 | 
			
		||||
	depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_IOAPIC || PCI_MSI
 | 
			
		||||
 | 
			
		||||
config X86_VISWS_APIC
 | 
			
		||||
	def_bool y
 | 
			
		||||
	depends on X86_32 && X86_VISWS
 | 
			
		||||
 | 
			
		||||
config X86_REROUTE_FOR_BROKEN_BOOT_IRQS
 | 
			
		||||
	bool "Reroute for broken boot IRQs"
 | 
			
		||||
	depends on X86_IO_APIC
 | 
			
		||||
 | 
			
		||||
@ -97,12 +97,6 @@ enum fixed_addresses {
 | 
			
		||||
#ifdef CONFIG_X86_IO_APIC
 | 
			
		||||
	FIX_IO_APIC_BASE_0,
 | 
			
		||||
	FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_X86_VISWS_APIC
 | 
			
		||||
	FIX_CO_CPU,	/* Cobalt timer */
 | 
			
		||||
	FIX_CO_APIC,	/* Cobalt APIC Redirection Table */
 | 
			
		||||
	FIX_LI_PCIA,	/* Lithium PCI Bridge A */
 | 
			
		||||
	FIX_LI_PCIB,	/* Lithium PCI Bridge B */
 | 
			
		||||
#endif
 | 
			
		||||
	FIX_RO_IDT,	/* Virtual mapping for read-only IDT */
 | 
			
		||||
#ifdef CONFIG_X86_32
 | 
			
		||||
 | 
			
		||||
@ -98,7 +98,6 @@ extern void trace_call_function_single_interrupt(void);
 | 
			
		||||
#define IO_APIC_IRQ(x) (((x) >= NR_IRQS_LEGACY) || ((1<<(x)) & io_apic_irqs))
 | 
			
		||||
extern unsigned long io_apic_irqs;
 | 
			
		||||
 | 
			
		||||
extern void init_VISWS_APIC_irqs(void);
 | 
			
		||||
extern void setup_IO_APIC(void);
 | 
			
		||||
extern void disable_IO_APIC(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -39,12 +39,6 @@ static inline void vsmp_init(void) { }
 | 
			
		||||
 | 
			
		||||
void setup_bios_corruption_check(void);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_VISWS
 | 
			
		||||
extern void visws_early_detect(void);
 | 
			
		||||
#else
 | 
			
		||||
static inline void visws_early_detect(void) { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern unsigned long saved_video_mode;
 | 
			
		||||
 | 
			
		||||
extern void reserve_standard_io_resources(void);
 | 
			
		||||
 | 
			
		||||
@ -1,127 +0,0 @@
 | 
			
		||||
#ifndef _ASM_X86_VISWS_COBALT_H
 | 
			
		||||
#define _ASM_X86_VISWS_COBALT_H
 | 
			
		||||
 | 
			
		||||
#include <asm/fixmap.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Cobalt SGI Visual Workstation system ASIC
 | 
			
		||||
 */ 
 | 
			
		||||
 | 
			
		||||
#define CO_CPU_NUM_PHYS 0x1e00
 | 
			
		||||
#define CO_CPU_TAB_PHYS (CO_CPU_NUM_PHYS + 2)
 | 
			
		||||
 | 
			
		||||
#define CO_CPU_MAX 4
 | 
			
		||||
 | 
			
		||||
#define	CO_CPU_PHYS		0xc2000000
 | 
			
		||||
#define	CO_APIC_PHYS		0xc4000000
 | 
			
		||||
 | 
			
		||||
/* see set_fixmap() and asm/fixmap.h */
 | 
			
		||||
#define	CO_CPU_VADDR		(fix_to_virt(FIX_CO_CPU))
 | 
			
		||||
#define	CO_APIC_VADDR		(fix_to_virt(FIX_CO_APIC))
 | 
			
		||||
 | 
			
		||||
/* Cobalt CPU registers -- relative to CO_CPU_VADDR, use co_cpu_*() */
 | 
			
		||||
#define	CO_CPU_REV		0x08
 | 
			
		||||
#define	CO_CPU_CTRL		0x10
 | 
			
		||||
#define	CO_CPU_STAT		0x20
 | 
			
		||||
#define	CO_CPU_TIMEVAL		0x30
 | 
			
		||||
 | 
			
		||||
/* CO_CPU_CTRL bits */
 | 
			
		||||
#define	CO_CTRL_TIMERUN		0x04		/* 0 == disabled */
 | 
			
		||||
#define	CO_CTRL_TIMEMASK	0x08		/* 0 == unmasked */
 | 
			
		||||
 | 
			
		||||
/* CO_CPU_STATUS bits */
 | 
			
		||||
#define	CO_STAT_TIMEINTR	0x02	/* (r) 1 == int pend, (w) 0 == clear */
 | 
			
		||||
 | 
			
		||||
/* CO_CPU_TIMEVAL value */
 | 
			
		||||
#define	CO_TIME_HZ		100000000	/* Cobalt core rate */
 | 
			
		||||
 | 
			
		||||
/* Cobalt APIC registers -- relative to CO_APIC_VADDR, use co_apic_*() */
 | 
			
		||||
#define	CO_APIC_HI(n)		(((n) * 0x10) + 4)
 | 
			
		||||
#define	CO_APIC_LO(n)		((n) * 0x10)
 | 
			
		||||
#define	CO_APIC_ID		0x0ffc
 | 
			
		||||
 | 
			
		||||
/* CO_APIC_ID bits */
 | 
			
		||||
#define	CO_APIC_ENABLE		0x00000100
 | 
			
		||||
 | 
			
		||||
/* CO_APIC_LO bits */
 | 
			
		||||
#define	CO_APIC_MASK		0x00010000	/* 0 = enabled */
 | 
			
		||||
#define	CO_APIC_LEVEL		0x00008000	/* 0 = edge */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Where things are physically wired to Cobalt
 | 
			
		||||
 * #defines with no board _<type>_<rev>_ are common to all (thus far)
 | 
			
		||||
 */
 | 
			
		||||
#define	CO_APIC_IDE0		4
 | 
			
		||||
#define CO_APIC_IDE1		2		/* Only on 320 */
 | 
			
		||||
 | 
			
		||||
#define	CO_APIC_8259		12		/* serial, floppy, par-l-l */
 | 
			
		||||
 | 
			
		||||
/* Lithium PCI Bridge A -- "the one with 82557 Ethernet" */
 | 
			
		||||
#define	CO_APIC_PCIA_BASE0	0 /* and 1 */	/* slot 0, line 0 */
 | 
			
		||||
#define	CO_APIC_PCIA_BASE123	5 /* and 6 */	/* slot 0, line 1 */
 | 
			
		||||
 | 
			
		||||
#define	CO_APIC_PIIX4_USB	7		/* this one is weird */
 | 
			
		||||
 | 
			
		||||
/* Lithium PCI Bridge B -- "the one with PIIX4" */
 | 
			
		||||
#define	CO_APIC_PCIB_BASE0	8 /* and 9-12 *//* slot 0, line 0 */
 | 
			
		||||
#define	CO_APIC_PCIB_BASE123	13 /* 14.15 */	/* slot 0, line 1 */
 | 
			
		||||
 | 
			
		||||
#define	CO_APIC_VIDOUT0		16
 | 
			
		||||
#define	CO_APIC_VIDOUT1		17
 | 
			
		||||
#define	CO_APIC_VIDIN0		18
 | 
			
		||||
#define	CO_APIC_VIDIN1		19
 | 
			
		||||
 | 
			
		||||
#define	CO_APIC_LI_AUDIO	22
 | 
			
		||||
 | 
			
		||||
#define	CO_APIC_AS		24
 | 
			
		||||
#define	CO_APIC_RE		25
 | 
			
		||||
 | 
			
		||||
#define CO_APIC_CPU		28		/* Timer and Cache interrupt */
 | 
			
		||||
#define	CO_APIC_NMI		29
 | 
			
		||||
#define	CO_APIC_LAST		CO_APIC_NMI
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is how irqs are assigned on the Visual Workstation.
 | 
			
		||||
 * Legacy devices get irq's 1-15 (system clock is 0 and is CO_APIC_CPU).
 | 
			
		||||
 * All other devices (including PCI) go to Cobalt and are irq's 16 on up.
 | 
			
		||||
 */
 | 
			
		||||
#define	CO_IRQ_APIC0	16			/* irq of apic entry 0 */
 | 
			
		||||
#define	IS_CO_APIC(irq)	((irq) >= CO_IRQ_APIC0)
 | 
			
		||||
#define	CO_IRQ(apic)	(CO_IRQ_APIC0 + (apic))	/* apic ent to irq */
 | 
			
		||||
#define	CO_APIC(irq)	((irq) - CO_IRQ_APIC0)	/* irq to apic ent */
 | 
			
		||||
#define CO_IRQ_IDE0	14			/* knowledge of... */
 | 
			
		||||
#define CO_IRQ_IDE1	15			/* ... ide driver defaults! */
 | 
			
		||||
#define	CO_IRQ_8259	CO_IRQ(CO_APIC_8259)
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_VISWS_APIC
 | 
			
		||||
static inline void co_cpu_write(unsigned long reg, unsigned long v)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned long *)(CO_CPU_VADDR+reg))=v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned long co_cpu_read(unsigned long reg)
 | 
			
		||||
{
 | 
			
		||||
	return *((volatile unsigned long *)(CO_CPU_VADDR+reg));
 | 
			
		||||
}            
 | 
			
		||||
             
 | 
			
		||||
static inline void co_apic_write(unsigned long reg, unsigned long v)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned long *)(CO_APIC_VADDR+reg))=v;
 | 
			
		||||
}            
 | 
			
		||||
             
 | 
			
		||||
static inline unsigned long co_apic_read(unsigned long reg)
 | 
			
		||||
{
 | 
			
		||||
	return *((volatile unsigned long *)(CO_APIC_VADDR+reg));
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern char visws_board_type;
 | 
			
		||||
 | 
			
		||||
#define	VISWS_320	0
 | 
			
		||||
#define	VISWS_540	1
 | 
			
		||||
 | 
			
		||||
extern char visws_board_rev;
 | 
			
		||||
 | 
			
		||||
extern int pci_visws_init(void);
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_X86_VISWS_COBALT_H */
 | 
			
		||||
@ -1,53 +0,0 @@
 | 
			
		||||
#ifndef _ASM_X86_VISWS_LITHIUM_H
 | 
			
		||||
#define _ASM_X86_VISWS_LITHIUM_H
 | 
			
		||||
 | 
			
		||||
#include <asm/fixmap.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Lithium is the SGI Visual Workstation I/O ASIC
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define	LI_PCI_A_PHYS		0xfc000000	/* Enet is dev 3 */
 | 
			
		||||
#define	LI_PCI_B_PHYS		0xfd000000	/* PIIX4 is here */
 | 
			
		||||
 | 
			
		||||
/* see set_fixmap() and asm/fixmap.h */
 | 
			
		||||
#define LI_PCIA_VADDR   (fix_to_virt(FIX_LI_PCIA))
 | 
			
		||||
#define LI_PCIB_VADDR   (fix_to_virt(FIX_LI_PCIB))
 | 
			
		||||
 | 
			
		||||
/* Not a standard PCI? (not in linux/pci.h) */
 | 
			
		||||
#define	LI_PCI_BUSNUM	0x44			/* lo8: primary, hi8: sub */
 | 
			
		||||
#define LI_PCI_INTEN    0x46
 | 
			
		||||
 | 
			
		||||
/* LI_PCI_INTENT bits */
 | 
			
		||||
#define	LI_INTA_0	0x0001
 | 
			
		||||
#define	LI_INTA_1	0x0002
 | 
			
		||||
#define	LI_INTA_2	0x0004
 | 
			
		||||
#define	LI_INTA_3	0x0008
 | 
			
		||||
#define	LI_INTA_4	0x0010
 | 
			
		||||
#define	LI_INTB		0x0020
 | 
			
		||||
#define	LI_INTC		0x0040
 | 
			
		||||
#define	LI_INTD		0x0080
 | 
			
		||||
 | 
			
		||||
/* More special purpose macros... */
 | 
			
		||||
static inline void li_pcia_write16(unsigned long reg, unsigned short v)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned short *)(LI_PCIA_VADDR+reg))=v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned short li_pcia_read16(unsigned long reg)
 | 
			
		||||
{
 | 
			
		||||
	 return *((volatile unsigned short *)(LI_PCIA_VADDR+reg));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void li_pcib_write16(unsigned long reg, unsigned short v)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned short *)(LI_PCIB_VADDR+reg))=v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned short li_pcib_read16(unsigned long reg)
 | 
			
		||||
{
 | 
			
		||||
	return *((volatile unsigned short *)(LI_PCIB_VADDR+reg));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_X86_VISWS_LITHIUM_H */
 | 
			
		||||
 | 
			
		||||
@ -1,107 +0,0 @@
 | 
			
		||||
#ifndef _ASM_X86_VISWS_PIIX4_H
 | 
			
		||||
#define _ASM_X86_VISWS_PIIX4_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PIIX4 as used on SGI Visual Workstations
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define	PIIX_PM_START		0x0F80
 | 
			
		||||
 | 
			
		||||
#define	SIO_GPIO_START		0x0FC0
 | 
			
		||||
 | 
			
		||||
#define	SIO_PM_START		0x0FC8
 | 
			
		||||
 | 
			
		||||
#define	PMBASE			PIIX_PM_START
 | 
			
		||||
#define	GPIREG0			(PMBASE+0x30)
 | 
			
		||||
#define	GPIREG(x)		(GPIREG0+((x)/8))
 | 
			
		||||
#define	GPIBIT(x)		(1 << ((x)%8))
 | 
			
		||||
 | 
			
		||||
#define	PIIX_GPI_BD_ID1		18
 | 
			
		||||
#define	PIIX_GPI_BD_ID2		19
 | 
			
		||||
#define	PIIX_GPI_BD_ID3		20
 | 
			
		||||
#define	PIIX_GPI_BD_ID4		21
 | 
			
		||||
#define	PIIX_GPI_BD_REG		GPIREG(PIIX_GPI_BD_ID1)
 | 
			
		||||
#define	PIIX_GPI_BD_MASK	(GPIBIT(PIIX_GPI_BD_ID1) | \
 | 
			
		||||
				GPIBIT(PIIX_GPI_BD_ID2) | \
 | 
			
		||||
				GPIBIT(PIIX_GPI_BD_ID3) | \
 | 
			
		||||
				GPIBIT(PIIX_GPI_BD_ID4) )
 | 
			
		||||
 | 
			
		||||
#define	PIIX_GPI_BD_SHIFT	(PIIX_GPI_BD_ID1 % 8)
 | 
			
		||||
 | 
			
		||||
#define	SIO_INDEX		0x2e
 | 
			
		||||
#define	SIO_DATA		0x2f
 | 
			
		||||
 | 
			
		||||
#define	SIO_DEV_SEL		0x7
 | 
			
		||||
#define	SIO_DEV_ENB		0x30
 | 
			
		||||
#define	SIO_DEV_MSB		0x60
 | 
			
		||||
#define	SIO_DEV_LSB		0x61
 | 
			
		||||
 | 
			
		||||
#define	SIO_GP_DEV		0x7
 | 
			
		||||
 | 
			
		||||
#define	SIO_GP_BASE		SIO_GPIO_START
 | 
			
		||||
#define	SIO_GP_MSB		(SIO_GP_BASE>>8)
 | 
			
		||||
#define	SIO_GP_LSB		(SIO_GP_BASE&0xff)
 | 
			
		||||
 | 
			
		||||
#define	SIO_GP_DATA1		(SIO_GP_BASE+0)
 | 
			
		||||
 | 
			
		||||
#define	SIO_PM_DEV		0x8
 | 
			
		||||
 | 
			
		||||
#define	SIO_PM_BASE		SIO_PM_START
 | 
			
		||||
#define	SIO_PM_MSB		(SIO_PM_BASE>>8)
 | 
			
		||||
#define	SIO_PM_LSB		(SIO_PM_BASE&0xff)
 | 
			
		||||
#define	SIO_PM_INDEX		(SIO_PM_BASE+0)
 | 
			
		||||
#define	SIO_PM_DATA		(SIO_PM_BASE+1)
 | 
			
		||||
 | 
			
		||||
#define	SIO_PM_FER2		0x1
 | 
			
		||||
 | 
			
		||||
#define	SIO_PM_GP_EN		0x80
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is the dev/reg where generating a config cycle will
 | 
			
		||||
 * result in a PCI special cycle.
 | 
			
		||||
 */
 | 
			
		||||
#define SPECIAL_DEV		0xff
 | 
			
		||||
#define SPECIAL_REG		0x00
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PIIX4 needs to see a special cycle with the following data
 | 
			
		||||
 * to be convinced the processor has gone into the stop grant
 | 
			
		||||
 * state.  PIIX4 insists on seeing this before it will power
 | 
			
		||||
 * down a system.
 | 
			
		||||
 */
 | 
			
		||||
#define PIIX_SPECIAL_STOP		0x00120002
 | 
			
		||||
 | 
			
		||||
#define PIIX4_RESET_PORT	0xcf9
 | 
			
		||||
#define PIIX4_RESET_VAL		0x6
 | 
			
		||||
 | 
			
		||||
#define PMSTS_PORT		0xf80	// 2 bytes	PM Status
 | 
			
		||||
#define PMEN_PORT		0xf82	// 2 bytes	PM Enable
 | 
			
		||||
#define	PMCNTRL_PORT		0xf84	// 2 bytes	PM Control
 | 
			
		||||
 | 
			
		||||
#define PM_SUSPEND_ENABLE	0x2000	// start sequence to suspend state
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PMSTS and PMEN I/O bit definitions.
 | 
			
		||||
 * (Bits are the same in both registers)
 | 
			
		||||
 */
 | 
			
		||||
#define PM_STS_RSM		(1<<15)	// Resume Status
 | 
			
		||||
#define PM_STS_PWRBTNOR		(1<<11)	// Power Button Override
 | 
			
		||||
#define PM_STS_RTC		(1<<10)	// RTC status
 | 
			
		||||
#define PM_STS_PWRBTN		(1<<8)	// Power Button Pressed?
 | 
			
		||||
#define PM_STS_GBL		(1<<5)	// Global Status
 | 
			
		||||
#define PM_STS_BM		(1<<4)	// Bus Master Status
 | 
			
		||||
#define PM_STS_TMROF		(1<<0)	// Timer Overflow Status.
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Stop clock GPI register
 | 
			
		||||
 */
 | 
			
		||||
#define PIIX_GPIREG0			(0xf80 + 0x30)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Stop clock GPI bit in GPIREG0
 | 
			
		||||
 */
 | 
			
		||||
#define	PIIX_GPI_STPCLK		0x4	// STPCLK signal routed back in
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_X86_VISWS_PIIX4_H */
 | 
			
		||||
@ -1,5 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Frame buffer position and size:
 | 
			
		||||
 */
 | 
			
		||||
extern unsigned long sgivwfb_mem_phys;
 | 
			
		||||
extern unsigned long sgivwfb_mem_size;
 | 
			
		||||
@ -2132,7 +2132,6 @@ int generic_processor_info(int apicid, int version)
 | 
			
		||||
	 *
 | 
			
		||||
	 * - arch/x86/kernel/mpparse.c: MP_processor_info()
 | 
			
		||||
	 * - arch/x86/mm/amdtopology.c: amd_numa_init()
 | 
			
		||||
	 * - arch/x86/platform/visws/visws_quirks.c: MP_processor_info()
 | 
			
		||||
	 *
 | 
			
		||||
	 * This function is executed with the modified
 | 
			
		||||
	 * boot_cpu_physical_apicid. So, disabled_cpu_apicid kernel
 | 
			
		||||
 | 
			
		||||
@ -869,7 +869,6 @@ void __init setup_arch(char **cmdline_p)
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_32
 | 
			
		||||
	memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
 | 
			
		||||
	visws_early_detect();
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * copy kernel address range established so far and switch
 | 
			
		||||
 | 
			
		||||
@ -13,8 +13,6 @@ obj-y				+= legacy.o irq.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_STA2X11)           += sta2x11-fixup.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_X86_VISWS)		+= visws.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_X86_NUMAQ)		+= numaq_32.o
 | 
			
		||||
obj-$(CONFIG_X86_NUMACHIP)	+= numachip.o
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -561,7 +561,6 @@ char * __init pcibios_setup(char *str)
 | 
			
		||||
		pci_probe |= PCI_PROBE_NOEARLY;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
#ifndef CONFIG_X86_VISWS
 | 
			
		||||
	else if (!strcmp(str, "usepirqmask")) {
 | 
			
		||||
		pci_probe |= PCI_USE_PIRQ_MASK;
 | 
			
		||||
		return NULL;
 | 
			
		||||
@ -571,9 +570,7 @@ char * __init pcibios_setup(char *str)
 | 
			
		||||
	} else if (!strncmp(str, "lastbus=", 8)) {
 | 
			
		||||
		pcibios_last_bus = simple_strtol(str+8, NULL, 0);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	else if (!strcmp(str, "rom")) {
 | 
			
		||||
	} else if (!strcmp(str, "rom")) {
 | 
			
		||||
		pci_probe |= PCI_ASSIGN_ROMS;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	} else if (!strcmp(str, "norom")) {
 | 
			
		||||
 | 
			
		||||
@ -1,87 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 *	Low-Level PCI Support for SGI Visual Workstation
 | 
			
		||||
 *
 | 
			
		||||
 *	(c) 1999--2000 Martin Mares <mj@ucw.cz>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/pci_x86.h>
 | 
			
		||||
#include <asm/visws/cobalt.h>
 | 
			
		||||
#include <asm/visws/lithium.h>
 | 
			
		||||
 | 
			
		||||
static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
 | 
			
		||||
static void pci_visws_disable_irq(struct pci_dev *dev) { }
 | 
			
		||||
 | 
			
		||||
/* int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq; */
 | 
			
		||||
/* void (*pcibios_disable_irq)(struct pci_dev *dev) = &pci_visws_disable_irq; */
 | 
			
		||||
 | 
			
		||||
/* void __init pcibios_penalize_isa_irq(int irq, int active) {} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unsigned int pci_bus0, pci_bus1;
 | 
			
		||||
 | 
			
		||||
static int __init visws_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	int irq, bus = dev->bus->number;
 | 
			
		||||
 | 
			
		||||
	pin--;
 | 
			
		||||
 | 
			
		||||
	/* Nothing useful at PIIX4 pin 1 */
 | 
			
		||||
	if (bus == pci_bus0 && slot == 4 && pin == 0)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	/* PIIX4 USB is on Bus 0, Slot 4, Line 3 */
 | 
			
		||||
	if (bus == pci_bus0 && slot == 4 && pin == 3) {
 | 
			
		||||
		irq = CO_IRQ(CO_APIC_PIIX4_USB);
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* First pin spread down 1 APIC entry per slot */
 | 
			
		||||
	if (pin == 0) {
 | 
			
		||||
		irq = CO_IRQ((bus == pci_bus0 ? CO_APIC_PCIB_BASE0 :
 | 
			
		||||
						CO_APIC_PCIA_BASE0) + slot);
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* lines 1,2,3 from any slot is shared in this twirly pattern */
 | 
			
		||||
	if (bus == pci_bus1) {
 | 
			
		||||
		/* lines 1-3 from devices 0 1 rotate over 2 apic entries */
 | 
			
		||||
		irq = CO_IRQ(CO_APIC_PCIA_BASE123 + ((slot + (pin - 1)) % 2));
 | 
			
		||||
	} else { /* bus == pci_bus0 */
 | 
			
		||||
		/* lines 1-3 from devices 0-3 rotate over 3 apic entries */
 | 
			
		||||
		if (slot == 0)
 | 
			
		||||
			slot = 3; /* same pattern */
 | 
			
		||||
		irq = CO_IRQ(CO_APIC_PCIA_BASE123 + ((3 - slot) + (pin - 1) % 3));
 | 
			
		||||
	}
 | 
			
		||||
out:
 | 
			
		||||
	printk(KERN_DEBUG "PCI: Bus %d Slot %d Line %d -> IRQ %d\n", bus, slot, pin, irq);
 | 
			
		||||
	return irq;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __init pci_visws_init(void)
 | 
			
		||||
{
 | 
			
		||||
	pcibios_enable_irq = &pci_visws_enable_irq;
 | 
			
		||||
	pcibios_disable_irq = &pci_visws_disable_irq;
 | 
			
		||||
 | 
			
		||||
	/* The VISWS supports configuration access type 1 only */
 | 
			
		||||
	pci_probe = (pci_probe | PCI_PROBE_CONF1) &
 | 
			
		||||
		    ~(PCI_PROBE_BIOS | PCI_PROBE_CONF2);
 | 
			
		||||
 | 
			
		||||
	pci_bus0 = li_pcib_read16(LI_PCI_BUSNUM) & 0xff;
 | 
			
		||||
	pci_bus1 = li_pcia_read16(LI_PCI_BUSNUM) & 0xff;
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "PCI: Lithium bridge A bus: %u, "
 | 
			
		||||
		"bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0);
 | 
			
		||||
 | 
			
		||||
	raw_pci_ops = &pci_direct_conf1;
 | 
			
		||||
	pci_scan_bus_with_sysdata(pci_bus0);
 | 
			
		||||
	pci_scan_bus_with_sysdata(pci_bus1);
 | 
			
		||||
	pci_fixup_irqs(pci_common_swizzle, visws_map_irq);
 | 
			
		||||
	pcibios_resource_survey();
 | 
			
		||||
	/* Request bus scan */
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
@ -9,5 +9,4 @@ obj-y	+= olpc/
 | 
			
		||||
obj-y	+= scx200/
 | 
			
		||||
obj-y	+= sfi/
 | 
			
		||||
obj-y	+= ts5500/
 | 
			
		||||
obj-y	+= visws/
 | 
			
		||||
obj-y	+= uv/
 | 
			
		||||
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
obj-$(CONFIG_X86_VISWS)	+= visws_quirks.o
 | 
			
		||||
@ -1,608 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  SGI Visual Workstation support and quirks, unmaintained.
 | 
			
		||||
 *
 | 
			
		||||
 *  Split out from setup.c by davej@suse.de
 | 
			
		||||
 *
 | 
			
		||||
 *	Copyright (C) 1999 Bent Hagemark, Ingo Molnar
 | 
			
		||||
 *
 | 
			
		||||
 *  SGI Visual Workstation interrupt controller
 | 
			
		||||
 *
 | 
			
		||||
 *  The Cobalt system ASIC in the Visual Workstation contains a "Cobalt" APIC
 | 
			
		||||
 *  which serves as the main interrupt controller in the system.  Non-legacy
 | 
			
		||||
 *  hardware in the system uses this controller directly.  Legacy devices
 | 
			
		||||
 *  are connected to the PIIX4 which in turn has its 8259(s) connected to
 | 
			
		||||
 *  a of the Cobalt APIC entry.
 | 
			
		||||
 *
 | 
			
		||||
 *  09/02/2000 - Updated for 2.4 by jbarnes@sgi.com
 | 
			
		||||
 *
 | 
			
		||||
 *  25/11/2002 - Updated for 2.5 by Andrey Panin <pazke@orbita1.ru>
 | 
			
		||||
 */
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/smp.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/visws/cobalt.h>
 | 
			
		||||
#include <asm/visws/piix4.h>
 | 
			
		||||
#include <asm/io_apic.h>
 | 
			
		||||
#include <asm/fixmap.h>
 | 
			
		||||
#include <asm/reboot.h>
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/apic.h>
 | 
			
		||||
#include <asm/e820.h>
 | 
			
		||||
#include <asm/time.h>
 | 
			
		||||
#include <asm/io.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/kernel_stat.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/i8259.h>
 | 
			
		||||
#include <asm/irq_vectors.h>
 | 
			
		||||
#include <asm/visws/lithium.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/pci_ids.h>
 | 
			
		||||
 | 
			
		||||
extern int no_broadcast;
 | 
			
		||||
 | 
			
		||||
char visws_board_type	= -1;
 | 
			
		||||
char visws_board_rev	= -1;
 | 
			
		||||
 | 
			
		||||
static void __init visws_time_init(void)
 | 
			
		||||
{
 | 
			
		||||
	printk(KERN_INFO "Starting Cobalt Timer system clock\n");
 | 
			
		||||
 | 
			
		||||
	/* Set the countdown value */
 | 
			
		||||
	co_cpu_write(CO_CPU_TIMEVAL, CO_TIME_HZ/HZ);
 | 
			
		||||
 | 
			
		||||
	/* Start the timer */
 | 
			
		||||
	co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) | CO_CTRL_TIMERUN);
 | 
			
		||||
 | 
			
		||||
	/* Enable (unmask) the timer interrupt */
 | 
			
		||||
	co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK);
 | 
			
		||||
 | 
			
		||||
	setup_default_timer_irq();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Replaces the default init_ISA_irqs in the generic setup */
 | 
			
		||||
static void __init visws_pre_intr_init(void);
 | 
			
		||||
 | 
			
		||||
/* Quirk for machine specific memory setup. */
 | 
			
		||||
 | 
			
		||||
#define MB (1024 * 1024)
 | 
			
		||||
 | 
			
		||||
unsigned long sgivwfb_mem_phys;
 | 
			
		||||
unsigned long sgivwfb_mem_size;
 | 
			
		||||
EXPORT_SYMBOL(sgivwfb_mem_phys);
 | 
			
		||||
EXPORT_SYMBOL(sgivwfb_mem_size);
 | 
			
		||||
 | 
			
		||||
long long mem_size __initdata = 0;
 | 
			
		||||
 | 
			
		||||
static char * __init visws_memory_setup(void)
 | 
			
		||||
{
 | 
			
		||||
	long long gfx_mem_size = 8 * MB;
 | 
			
		||||
 | 
			
		||||
	mem_size = boot_params.alt_mem_k;
 | 
			
		||||
 | 
			
		||||
	if (!mem_size) {
 | 
			
		||||
		printk(KERN_WARNING "Bootloader didn't set memory size, upgrade it !\n");
 | 
			
		||||
		mem_size = 128 * MB;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * this hardcodes the graphics memory to 8 MB
 | 
			
		||||
	 * it really should be sized dynamically (or at least
 | 
			
		||||
	 * set as a boot param)
 | 
			
		||||
	 */
 | 
			
		||||
	if (!sgivwfb_mem_size) {
 | 
			
		||||
		printk(KERN_WARNING "Defaulting to 8 MB framebuffer size\n");
 | 
			
		||||
		sgivwfb_mem_size = 8 * MB;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Trim to nearest MB
 | 
			
		||||
	 */
 | 
			
		||||
	sgivwfb_mem_size &= ~((1 << 20) - 1);
 | 
			
		||||
	sgivwfb_mem_phys = mem_size - gfx_mem_size;
 | 
			
		||||
 | 
			
		||||
	e820_add_region(0, LOWMEMSIZE(), E820_RAM);
 | 
			
		||||
	e820_add_region(HIGH_MEMORY, mem_size - sgivwfb_mem_size - HIGH_MEMORY, E820_RAM);
 | 
			
		||||
	e820_add_region(sgivwfb_mem_phys, sgivwfb_mem_size, E820_RESERVED);
 | 
			
		||||
 | 
			
		||||
	return "PROM";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void visws_machine_emergency_restart(void)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * Visual Workstations restart after this
 | 
			
		||||
	 * register is poked on the PIIX4
 | 
			
		||||
	 */
 | 
			
		||||
	outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void visws_machine_power_off(void)
 | 
			
		||||
{
 | 
			
		||||
	unsigned short pm_status;
 | 
			
		||||
/*	extern unsigned int pci_bus0; */
 | 
			
		||||
 | 
			
		||||
	while ((pm_status = inw(PMSTS_PORT)) & 0x100)
 | 
			
		||||
		outw(pm_status, PMSTS_PORT);
 | 
			
		||||
 | 
			
		||||
	outw(PM_SUSPEND_ENABLE, PMCNTRL_PORT);
 | 
			
		||||
 | 
			
		||||
	mdelay(10);
 | 
			
		||||
 | 
			
		||||
#define PCI_CONF1_ADDRESS(bus, devfn, reg) \
 | 
			
		||||
	(0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3))
 | 
			
		||||
 | 
			
		||||
/*	outl(PCI_CONF1_ADDRESS(pci_bus0, SPECIAL_DEV, SPECIAL_REG), 0xCF8); */
 | 
			
		||||
	outl(PIIX_SPECIAL_STOP, 0xCFC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init visws_get_smp_config(unsigned int early)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The Visual Workstation is Intel MP compliant in the hardware
 | 
			
		||||
 * sense, but it doesn't have a BIOS(-configuration table).
 | 
			
		||||
 * No problem for Linux.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void __init MP_processor_info(struct mpc_cpu *m)
 | 
			
		||||
{
 | 
			
		||||
	int ver, logical_apicid;
 | 
			
		||||
	physid_mask_t apic_cpus;
 | 
			
		||||
 | 
			
		||||
	if (!(m->cpuflag & CPU_ENABLED))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	logical_apicid = m->apicid;
 | 
			
		||||
	printk(KERN_INFO "%sCPU #%d %u:%u APIC version %d\n",
 | 
			
		||||
	       m->cpuflag & CPU_BOOTPROCESSOR ? "Bootup " : "",
 | 
			
		||||
	       m->apicid, (m->cpufeature & CPU_FAMILY_MASK) >> 8,
 | 
			
		||||
	       (m->cpufeature & CPU_MODEL_MASK) >> 4, m->apicver);
 | 
			
		||||
 | 
			
		||||
	if (m->cpuflag & CPU_BOOTPROCESSOR)
 | 
			
		||||
		boot_cpu_physical_apicid = m->apicid;
 | 
			
		||||
 | 
			
		||||
	ver = m->apicver;
 | 
			
		||||
	if ((ver >= 0x14 && m->apicid >= 0xff) || m->apicid >= 0xf) {
 | 
			
		||||
		printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
 | 
			
		||||
			m->apicid, MAX_LOCAL_APIC);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	apic->apicid_to_cpu_present(m->apicid, &apic_cpus);
 | 
			
		||||
	physids_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Validate version
 | 
			
		||||
	 */
 | 
			
		||||
	if (ver == 0x0) {
 | 
			
		||||
		printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! "
 | 
			
		||||
			"fixing up to 0x10. (tell your hw vendor)\n",
 | 
			
		||||
			m->apicid);
 | 
			
		||||
		ver = 0x10;
 | 
			
		||||
	}
 | 
			
		||||
	apic_version[m->apicid] = ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init visws_find_smp_config(void)
 | 
			
		||||
{
 | 
			
		||||
	struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS);
 | 
			
		||||
	unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS));
 | 
			
		||||
 | 
			
		||||
	if (ncpus > CO_CPU_MAX) {
 | 
			
		||||
		printk(KERN_WARNING "find_visws_smp: got cpu count of %d at %p\n",
 | 
			
		||||
			ncpus, mp);
 | 
			
		||||
 | 
			
		||||
		ncpus = CO_CPU_MAX;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ncpus > setup_max_cpus)
 | 
			
		||||
		ncpus = setup_max_cpus;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_LOCAL_APIC
 | 
			
		||||
	smp_found_config = 1;
 | 
			
		||||
#endif
 | 
			
		||||
	while (ncpus--)
 | 
			
		||||
		MP_processor_info(mp++);
 | 
			
		||||
 | 
			
		||||
	mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void visws_trap_init(void);
 | 
			
		||||
 | 
			
		||||
void __init visws_early_detect(void)
 | 
			
		||||
{
 | 
			
		||||
	int raw;
 | 
			
		||||
 | 
			
		||||
	visws_board_type = (char)(inb_p(PIIX_GPI_BD_REG) & PIIX_GPI_BD_REG)
 | 
			
		||||
							 >> PIIX_GPI_BD_SHIFT;
 | 
			
		||||
 | 
			
		||||
	if (visws_board_type < 0)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Override the default platform setup functions
 | 
			
		||||
	 */
 | 
			
		||||
	x86_init.resources.memory_setup = visws_memory_setup;
 | 
			
		||||
	x86_init.mpparse.get_smp_config = visws_get_smp_config;
 | 
			
		||||
	x86_init.mpparse.find_smp_config = visws_find_smp_config;
 | 
			
		||||
	x86_init.irqs.pre_vector_init = visws_pre_intr_init;
 | 
			
		||||
	x86_init.irqs.trap_init = visws_trap_init;
 | 
			
		||||
	x86_init.timers.timer_init = visws_time_init;
 | 
			
		||||
	x86_init.pci.init = pci_visws_init;
 | 
			
		||||
	x86_init.pci.init_irq = x86_init_noop;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Install reboot quirks:
 | 
			
		||||
	 */
 | 
			
		||||
	pm_power_off			= visws_machine_power_off;
 | 
			
		||||
	machine_ops.emergency_restart	= visws_machine_emergency_restart;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Do not use broadcast IPIs:
 | 
			
		||||
	 */
 | 
			
		||||
	no_broadcast = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_IO_APIC
 | 
			
		||||
	/*
 | 
			
		||||
	 * Turn off IO-APIC detection and initialization:
 | 
			
		||||
	 */
 | 
			
		||||
	skip_ioapic_setup		= 1;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Get Board rev.
 | 
			
		||||
	 * First, we have to initialize the 307 part to allow us access
 | 
			
		||||
	 * to the GPIO registers.  Let's map them at 0x0fc0 which is right
 | 
			
		||||
	 * after the PIIX4 PM section.
 | 
			
		||||
	 */
 | 
			
		||||
	outb_p(SIO_DEV_SEL, SIO_INDEX);
 | 
			
		||||
	outb_p(SIO_GP_DEV, SIO_DATA);	/* Talk to GPIO regs. */
 | 
			
		||||
 | 
			
		||||
	outb_p(SIO_DEV_MSB, SIO_INDEX);
 | 
			
		||||
	outb_p(SIO_GP_MSB, SIO_DATA);	/* MSB of GPIO base address */
 | 
			
		||||
 | 
			
		||||
	outb_p(SIO_DEV_LSB, SIO_INDEX);
 | 
			
		||||
	outb_p(SIO_GP_LSB, SIO_DATA);	/* LSB of GPIO base address */
 | 
			
		||||
 | 
			
		||||
	outb_p(SIO_DEV_ENB, SIO_INDEX);
 | 
			
		||||
	outb_p(1, SIO_DATA);		/* Enable GPIO registers. */
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Now, we have to map the power management section to write
 | 
			
		||||
	 * a bit which enables access to the GPIO registers.
 | 
			
		||||
	 * What lunatic came up with this shit?
 | 
			
		||||
	 */
 | 
			
		||||
	outb_p(SIO_DEV_SEL, SIO_INDEX);
 | 
			
		||||
	outb_p(SIO_PM_DEV, SIO_DATA);	/* Talk to GPIO regs. */
 | 
			
		||||
 | 
			
		||||
	outb_p(SIO_DEV_MSB, SIO_INDEX);
 | 
			
		||||
	outb_p(SIO_PM_MSB, SIO_DATA);	/* MSB of PM base address */
 | 
			
		||||
 | 
			
		||||
	outb_p(SIO_DEV_LSB, SIO_INDEX);
 | 
			
		||||
	outb_p(SIO_PM_LSB, SIO_DATA);	/* LSB of PM base address */
 | 
			
		||||
 | 
			
		||||
	outb_p(SIO_DEV_ENB, SIO_INDEX);
 | 
			
		||||
	outb_p(1, SIO_DATA);		/* Enable PM registers. */
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Now, write the PM register which enables the GPIO registers.
 | 
			
		||||
	 */
 | 
			
		||||
	outb_p(SIO_PM_FER2, SIO_PM_INDEX);
 | 
			
		||||
	outb_p(SIO_PM_GP_EN, SIO_PM_DATA);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Now, initialize the GPIO registers.
 | 
			
		||||
	 * We want them all to be inputs which is the
 | 
			
		||||
	 * power on default, so let's leave them alone.
 | 
			
		||||
	 * So, let's just read the board rev!
 | 
			
		||||
	 */
 | 
			
		||||
	raw = inb_p(SIO_GP_DATA1);
 | 
			
		||||
	raw &= 0x7f;	/* 7 bits of valid board revision ID. */
 | 
			
		||||
 | 
			
		||||
	if (visws_board_type == VISWS_320) {
 | 
			
		||||
		if (raw < 0x6) {
 | 
			
		||||
			visws_board_rev = 4;
 | 
			
		||||
		} else if (raw < 0xc) {
 | 
			
		||||
			visws_board_rev = 5;
 | 
			
		||||
		} else {
 | 
			
		||||
			visws_board_rev = 6;
 | 
			
		||||
		}
 | 
			
		||||
	} else if (visws_board_type == VISWS_540) {
 | 
			
		||||
			visws_board_rev = 2;
 | 
			
		||||
		} else {
 | 
			
		||||
			visws_board_rev = raw;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "Silicon Graphics Visual Workstation %s (rev %d) detected\n",
 | 
			
		||||
	       (visws_board_type == VISWS_320 ? "320" :
 | 
			
		||||
	       (visws_board_type == VISWS_540 ? "540" :
 | 
			
		||||
		"unknown")), visws_board_rev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define A01234 (LI_INTA_0 | LI_INTA_1 | LI_INTA_2 | LI_INTA_3 | LI_INTA_4)
 | 
			
		||||
#define BCD (LI_INTB | LI_INTC | LI_INTD)
 | 
			
		||||
#define ALLDEVS (A01234 | BCD)
 | 
			
		||||
 | 
			
		||||
static __init void lithium_init(void)
 | 
			
		||||
{
 | 
			
		||||
	set_fixmap(FIX_LI_PCIA, LI_PCI_A_PHYS);
 | 
			
		||||
	set_fixmap(FIX_LI_PCIB, LI_PCI_B_PHYS);
 | 
			
		||||
 | 
			
		||||
	if ((li_pcia_read16(PCI_VENDOR_ID) != PCI_VENDOR_ID_SGI) ||
 | 
			
		||||
	    (li_pcia_read16(PCI_DEVICE_ID) != PCI_DEVICE_ID_SGI_LITHIUM)) {
 | 
			
		||||
		printk(KERN_EMERG "Lithium hostbridge %c not found\n", 'A');
 | 
			
		||||
/*		panic("This machine is not SGI Visual Workstation 320/540"); */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ((li_pcib_read16(PCI_VENDOR_ID) != PCI_VENDOR_ID_SGI) ||
 | 
			
		||||
	    (li_pcib_read16(PCI_DEVICE_ID) != PCI_DEVICE_ID_SGI_LITHIUM)) {
 | 
			
		||||
		printk(KERN_EMERG "Lithium hostbridge %c not found\n", 'B');
 | 
			
		||||
/*		panic("This machine is not SGI Visual Workstation 320/540"); */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	li_pcia_write16(LI_PCI_INTEN, ALLDEVS);
 | 
			
		||||
	li_pcib_write16(LI_PCI_INTEN, ALLDEVS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __init void cobalt_init(void)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * On normal SMP PC this is used only with SMP, but we have to
 | 
			
		||||
	 * use it and set it up here to start the Cobalt clock
 | 
			
		||||
	 */
 | 
			
		||||
	set_fixmap(FIX_APIC_BASE, APIC_DEFAULT_PHYS_BASE);
 | 
			
		||||
	setup_local_APIC();
 | 
			
		||||
	printk(KERN_INFO "Local APIC Version %#x, ID %#x\n",
 | 
			
		||||
		(unsigned int)apic_read(APIC_LVR),
 | 
			
		||||
		(unsigned int)apic_read(APIC_ID));
 | 
			
		||||
 | 
			
		||||
	set_fixmap(FIX_CO_CPU, CO_CPU_PHYS);
 | 
			
		||||
	set_fixmap(FIX_CO_APIC, CO_APIC_PHYS);
 | 
			
		||||
	printk(KERN_INFO "Cobalt Revision %#lx, APIC ID %#lx\n",
 | 
			
		||||
		co_cpu_read(CO_CPU_REV), co_apic_read(CO_APIC_ID));
 | 
			
		||||
 | 
			
		||||
	/* Enable Cobalt APIC being careful to NOT change the ID! */
 | 
			
		||||
	co_apic_write(CO_APIC_ID, co_apic_read(CO_APIC_ID) | CO_APIC_ENABLE);
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "Cobalt APIC enabled: ID reg %#lx\n",
 | 
			
		||||
		co_apic_read(CO_APIC_ID));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init visws_trap_init(void)
 | 
			
		||||
{
 | 
			
		||||
	lithium_init();
 | 
			
		||||
	cobalt_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IRQ controller / APIC support:
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static DEFINE_SPINLOCK(cobalt_lock);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Set the given Cobalt APIC Redirection Table entry to point
 | 
			
		||||
 * to the given IDT vector/index.
 | 
			
		||||
 */
 | 
			
		||||
static inline void co_apic_set(int entry, int irq)
 | 
			
		||||
{
 | 
			
		||||
	co_apic_write(CO_APIC_LO(entry), CO_APIC_LEVEL | (irq + FIRST_EXTERNAL_VECTOR));
 | 
			
		||||
	co_apic_write(CO_APIC_HI(entry), 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Cobalt (IO)-APIC functions to handle PCI devices.
 | 
			
		||||
 */
 | 
			
		||||
static inline int co_apic_ide0_hack(void)
 | 
			
		||||
{
 | 
			
		||||
	extern char visws_board_type;
 | 
			
		||||
	extern char visws_board_rev;
 | 
			
		||||
 | 
			
		||||
	if (visws_board_type == VISWS_320 && visws_board_rev == 5)
 | 
			
		||||
		return 5;
 | 
			
		||||
	return CO_APIC_IDE0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int is_co_apic(unsigned int irq)
 | 
			
		||||
{
 | 
			
		||||
	if (IS_CO_APIC(irq))
 | 
			
		||||
		return CO_APIC(irq);
 | 
			
		||||
 | 
			
		||||
	switch (irq) {
 | 
			
		||||
		case 0: return CO_APIC_CPU;
 | 
			
		||||
		case CO_IRQ_IDE0: return co_apic_ide0_hack();
 | 
			
		||||
		case CO_IRQ_IDE1: return CO_APIC_IDE1;
 | 
			
		||||
		default: return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is the SGI Cobalt (IO-)APIC:
 | 
			
		||||
 */
 | 
			
		||||
static void enable_cobalt_irq(struct irq_data *data)
 | 
			
		||||
{
 | 
			
		||||
	co_apic_set(is_co_apic(data->irq), data->irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void disable_cobalt_irq(struct irq_data *data)
 | 
			
		||||
{
 | 
			
		||||
	int entry = is_co_apic(data->irq);
 | 
			
		||||
 | 
			
		||||
	co_apic_write(CO_APIC_LO(entry), CO_APIC_MASK);
 | 
			
		||||
	co_apic_read(CO_APIC_LO(entry));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ack_cobalt_irq(struct irq_data *data)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	spin_lock_irqsave(&cobalt_lock, flags);
 | 
			
		||||
	disable_cobalt_irq(data);
 | 
			
		||||
	apic_write(APIC_EOI, APIC_EOI_ACK);
 | 
			
		||||
	spin_unlock_irqrestore(&cobalt_lock, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip cobalt_irq_type = {
 | 
			
		||||
	.name		= "Cobalt-APIC",
 | 
			
		||||
	.irq_enable	= enable_cobalt_irq,
 | 
			
		||||
	.irq_disable	= disable_cobalt_irq,
 | 
			
		||||
	.irq_ack	= ack_cobalt_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is the PIIX4-based 8259 that is wired up indirectly to Cobalt
 | 
			
		||||
 * -- not the manner expected by the code in i8259.c.
 | 
			
		||||
 *
 | 
			
		||||
 * there is a 'master' physical interrupt source that gets sent to
 | 
			
		||||
 * the CPU. But in the chipset there are various 'virtual' interrupts
 | 
			
		||||
 * waiting to be handled. We represent this to Linux through a 'master'
 | 
			
		||||
 * interrupt controller type, and through a special virtual interrupt-
 | 
			
		||||
 * controller. Device drivers only see the virtual interrupt sources.
 | 
			
		||||
 */
 | 
			
		||||
static unsigned int startup_piix4_master_irq(struct irq_data *data)
 | 
			
		||||
{
 | 
			
		||||
	legacy_pic->init(0);
 | 
			
		||||
	enable_cobalt_irq(data);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip piix4_master_irq_type = {
 | 
			
		||||
	.name		= "PIIX4-master",
 | 
			
		||||
	.irq_startup	= startup_piix4_master_irq,
 | 
			
		||||
	.irq_ack	= ack_cobalt_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void pii4_mask(struct irq_data *data) { }
 | 
			
		||||
 | 
			
		||||
static struct irq_chip piix4_virtual_irq_type = {
 | 
			
		||||
	.name		= "PIIX4-virtual",
 | 
			
		||||
	.irq_mask	= pii4_mask,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PIIX4-8259 master/virtual functions to handle interrupt requests
 | 
			
		||||
 * from legacy devices: floppy, parallel, serial, rtc.
 | 
			
		||||
 *
 | 
			
		||||
 * None of these get Cobalt APIC entries, neither do they have IDT
 | 
			
		||||
 * entries. These interrupts are purely virtual and distributed from
 | 
			
		||||
 * the 'master' interrupt source: CO_IRQ_8259.
 | 
			
		||||
 *
 | 
			
		||||
 * When the 8259 interrupts its handler figures out which of these
 | 
			
		||||
 * devices is interrupting and dispatches to its handler.
 | 
			
		||||
 *
 | 
			
		||||
 * CAREFUL: devices see the 'virtual' interrupt only. Thus disable/
 | 
			
		||||
 * enable_irq gets the right irq. This 'master' irq is never directly
 | 
			
		||||
 * manipulated by any driver.
 | 
			
		||||
 */
 | 
			
		||||
static irqreturn_t piix4_master_intr(int irq, void *dev_id)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	int realirq;
 | 
			
		||||
 | 
			
		||||
	raw_spin_lock_irqsave(&i8259A_lock, flags);
 | 
			
		||||
 | 
			
		||||
	/* Find out what's interrupting in the PIIX4 master 8259 */
 | 
			
		||||
	outb(0x0c, 0x20);		/* OCW3 Poll command */
 | 
			
		||||
	realirq = inb(0x20);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Bit 7 == 0 means invalid/spurious
 | 
			
		||||
	 */
 | 
			
		||||
	if (unlikely(!(realirq & 0x80)))
 | 
			
		||||
		goto out_unlock;
 | 
			
		||||
 | 
			
		||||
	realirq &= 7;
 | 
			
		||||
 | 
			
		||||
	if (unlikely(realirq == 2)) {
 | 
			
		||||
		outb(0x0c, 0xa0);
 | 
			
		||||
		realirq = inb(0xa0);
 | 
			
		||||
 | 
			
		||||
		if (unlikely(!(realirq & 0x80)))
 | 
			
		||||
			goto out_unlock;
 | 
			
		||||
 | 
			
		||||
		realirq = (realirq & 7) + 8;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* mask and ack interrupt */
 | 
			
		||||
	cached_irq_mask |= 1 << realirq;
 | 
			
		||||
	if (unlikely(realirq > 7)) {
 | 
			
		||||
		inb(0xa1);
 | 
			
		||||
		outb(cached_slave_mask, 0xa1);
 | 
			
		||||
		outb(0x60 + (realirq & 7), 0xa0);
 | 
			
		||||
		outb(0x60 + 2, 0x20);
 | 
			
		||||
	} else {
 | 
			
		||||
		inb(0x21);
 | 
			
		||||
		outb(cached_master_mask, 0x21);
 | 
			
		||||
		outb(0x60 + realirq, 0x20);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	raw_spin_unlock_irqrestore(&i8259A_lock, flags);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * handle this 'virtual interrupt' as a Cobalt one now.
 | 
			
		||||
	 */
 | 
			
		||||
	generic_handle_irq(realirq);
 | 
			
		||||
 | 
			
		||||
	return IRQ_HANDLED;
 | 
			
		||||
 | 
			
		||||
out_unlock:
 | 
			
		||||
	raw_spin_unlock_irqrestore(&i8259A_lock, flags);
 | 
			
		||||
	return IRQ_NONE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irqaction master_action = {
 | 
			
		||||
	.handler =	piix4_master_intr,
 | 
			
		||||
	.name =		"PIIX4-8259",
 | 
			
		||||
	.flags =	IRQF_NO_THREAD,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct irqaction cascade_action = {
 | 
			
		||||
	.handler = 	no_action,
 | 
			
		||||
	.name =		"cascade",
 | 
			
		||||
	.flags =	IRQF_NO_THREAD,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline void set_piix4_virtual_irq_type(void)
 | 
			
		||||
{
 | 
			
		||||
	piix4_virtual_irq_type.irq_enable = i8259A_chip.irq_unmask;
 | 
			
		||||
	piix4_virtual_irq_type.irq_disable = i8259A_chip.irq_mask;
 | 
			
		||||
	piix4_virtual_irq_type.irq_unmask = i8259A_chip.irq_unmask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init visws_pre_intr_init(void)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	set_piix4_virtual_irq_type();
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < CO_IRQ_APIC0 + CO_APIC_LAST + 1; i++) {
 | 
			
		||||
		struct irq_chip *chip = NULL;
 | 
			
		||||
 | 
			
		||||
		if (i == 0)
 | 
			
		||||
			chip = &cobalt_irq_type;
 | 
			
		||||
		else if (i == CO_IRQ_IDE0)
 | 
			
		||||
			chip = &cobalt_irq_type;
 | 
			
		||||
		else if (i == CO_IRQ_IDE1)
 | 
			
		||||
			chip = &cobalt_irq_type;
 | 
			
		||||
		else if (i == CO_IRQ_8259)
 | 
			
		||||
			chip = &piix4_master_irq_type;
 | 
			
		||||
		else if (i < CO_IRQ_APIC0)
 | 
			
		||||
			chip = &piix4_virtual_irq_type;
 | 
			
		||||
		else if (IS_CO_APIC(i))
 | 
			
		||||
			chip = &cobalt_irq_type;
 | 
			
		||||
 | 
			
		||||
		if (chip)
 | 
			
		||||
			irq_set_chip(i, chip);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	setup_irq(CO_IRQ_8259, &master_action);
 | 
			
		||||
	setup_irq(2, &cascade_action);
 | 
			
		||||
}
 | 
			
		||||
@ -7,7 +7,7 @@ config XEN
 | 
			
		||||
	depends on PARAVIRT
 | 
			
		||||
	select PARAVIRT_CLOCK
 | 
			
		||||
	select XEN_HAVE_PVMMU
 | 
			
		||||
	depends on X86_64 || (X86_32 && X86_PAE && !X86_VISWS)
 | 
			
		||||
	depends on X86_64 || (X86_32 && X86_PAE)
 | 
			
		||||
	depends on X86_TSC
 | 
			
		||||
	help
 | 
			
		||||
	  This is the Linux Xen port.  Enabling this will allow the
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,6 @@ obj-$(CONFIG_SUPERH) += setup-bus.o setup-irq.o
 | 
			
		||||
obj-$(CONFIG_PPC) += setup-bus.o
 | 
			
		||||
obj-$(CONFIG_FRV) += setup-bus.o
 | 
			
		||||
obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o
 | 
			
		||||
obj-$(CONFIG_X86_VISWS) += setup-irq.o
 | 
			
		||||
obj-$(CONFIG_MN10300) += setup-bus.o
 | 
			
		||||
obj-$(CONFIG_MICROBLAZE) += setup-bus.o
 | 
			
		||||
obj-$(CONFIG_TILE) += setup-bus.o setup-irq.o
 | 
			
		||||
 | 
			
		||||
@ -379,14 +379,7 @@
 | 
			
		||||
#define  DEBUG_PRINT_NVRAM	0
 | 
			
		||||
#define  DEBUG_QLA1280		0
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The SGI VISWS is broken and doesn't support MMIO ;-(
 | 
			
		||||
 */
 | 
			
		||||
#ifdef CONFIG_X86_VISWS
 | 
			
		||||
#define	MEMORY_MAPPED_IO	0
 | 
			
		||||
#else
 | 
			
		||||
#define	MEMORY_MAPPED_IO	1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "qla1280.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -802,18 +802,9 @@ config FB_HGA
 | 
			
		||||
	  As this card technology is at least 25 years old,
 | 
			
		||||
	  most people will answer N here.
 | 
			
		||||
 | 
			
		||||
config FB_SGIVW
 | 
			
		||||
	tristate "SGI Visual Workstation framebuffer support"
 | 
			
		||||
	depends on FB && X86_VISWS
 | 
			
		||||
	select FB_CFB_FILLRECT
 | 
			
		||||
	select FB_CFB_COPYAREA
 | 
			
		||||
	select FB_CFB_IMAGEBLIT
 | 
			
		||||
	help
 | 
			
		||||
	  SGI Visual Workstation support for framebuffer graphics.
 | 
			
		||||
 | 
			
		||||
config FB_GBE
 | 
			
		||||
	bool "SGI Graphics Backend frame buffer support"
 | 
			
		||||
	depends on (FB = y) && (SGI_IP32 || X86_VISWS)
 | 
			
		||||
	depends on (FB = y) && SGI_IP32
 | 
			
		||||
	select FB_CFB_FILLRECT
 | 
			
		||||
	select FB_CFB_COPYAREA
 | 
			
		||||
	select FB_CFB_IMAGEBLIT
 | 
			
		||||
 | 
			
		||||
@ -75,7 +75,6 @@ obj-$(CONFIG_FB_CG14)             += cg14.o sbuslib.o
 | 
			
		||||
obj-$(CONFIG_FB_P9100)            += p9100.o sbuslib.o
 | 
			
		||||
obj-$(CONFIG_FB_TCX)              += tcx.o sbuslib.o
 | 
			
		||||
obj-$(CONFIG_FB_LEO)              += leo.o sbuslib.o
 | 
			
		||||
obj-$(CONFIG_FB_SGIVW)            += sgivwfb.o
 | 
			
		||||
obj-$(CONFIG_FB_ACORN)            += acornfb.o
 | 
			
		||||
obj-$(CONFIG_FB_ATARI)            += atafb.o c2p_iplan2.o atafb_mfb.o \
 | 
			
		||||
                                     atafb_iplan2p2.o atafb_iplan2p4.o atafb_iplan2p8.o
 | 
			
		||||
 | 
			
		||||
@ -45,10 +45,6 @@ struct gbefb_par {
 | 
			
		||||
#define GBE_BASE	0x16000000 /* SGI O2 */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_VISWS
 | 
			
		||||
#define GBE_BASE	0xd0000000 /* SGI Visual Workstation */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* macro for fastest write-though access to the framebuffer */
 | 
			
		||||
#ifdef CONFIG_MIPS
 | 
			
		||||
#ifdef CONFIG_CPU_R10000
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,7 @@ config LOGO_PARISC_CLUT224
 | 
			
		||||
 | 
			
		||||
config LOGO_SGI_CLUT224
 | 
			
		||||
	bool "224-color SGI Linux logo"
 | 
			
		||||
	depends on SGI_IP22 || SGI_IP27 || SGI_IP32 || X86_VISWS
 | 
			
		||||
	depends on SGI_IP22 || SGI_IP27 || SGI_IP32
 | 
			
		||||
	default y
 | 
			
		||||
 | 
			
		||||
config LOGO_SUN_CLUT224
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ const struct linux_logo * __init_refok fb_find_logo(int depth)
 | 
			
		||||
		logo = &logo_parisc_clut224;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_LOGO_SGI_CLUT224
 | 
			
		||||
		/* SGI Linux logo on MIPS/MIPS64 and VISWS */
 | 
			
		||||
		/* SGI Linux logo on MIPS/MIPS64 */
 | 
			
		||||
		logo = &logo_sgi_clut224;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_LOGO_SUN_CLUT224
 | 
			
		||||
 | 
			
		||||
@ -1,889 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  linux/drivers/video/sgivwfb.c -- SGI DBE frame buffer device
 | 
			
		||||
 *
 | 
			
		||||
 *	Copyright (C) 1999 Silicon Graphics, Inc.
 | 
			
		||||
 *      Jeffrey Newquist, newquist@engr.sgi.som
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is subject to the terms and conditions of the GNU General Public
 | 
			
		||||
 *  License. See the file COPYING in the main directory of this archive for
 | 
			
		||||
 *  more details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/errno.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/fb.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/platform_device.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/io.h>
 | 
			
		||||
#include <asm/mtrr.h>
 | 
			
		||||
#include <asm/visws/sgivw.h>
 | 
			
		||||
 | 
			
		||||
#define INCLUDE_TIMING_TABLE_DATA
 | 
			
		||||
#define DBE_REG_BASE par->regs
 | 
			
		||||
#include <video/sgivw.h>
 | 
			
		||||
 | 
			
		||||
struct sgivw_par {
 | 
			
		||||
	struct asregs *regs;
 | 
			
		||||
	u32 cmap_fifo;
 | 
			
		||||
	u_long timing_num;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define FLATPANEL_SGI_1600SW	5
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  RAM we reserve for the frame buffer. This defines the maximum screen
 | 
			
		||||
 *  size
 | 
			
		||||
 *
 | 
			
		||||
 *  The default can be overridden if the driver is compiled as a module
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static int ypan = 0;
 | 
			
		||||
static int ywrap = 0;
 | 
			
		||||
 | 
			
		||||
static int flatpanel_id = -1;
 | 
			
		||||
 | 
			
		||||
static struct fb_fix_screeninfo sgivwfb_fix = {
 | 
			
		||||
	.id		= "SGI Vis WS FB",
 | 
			
		||||
	.type		= FB_TYPE_PACKED_PIXELS,
 | 
			
		||||
        .visual		= FB_VISUAL_PSEUDOCOLOR,
 | 
			
		||||
	.mmio_start	= DBE_REG_PHYS,
 | 
			
		||||
	.mmio_len	= DBE_REG_SIZE,
 | 
			
		||||
        .accel		= FB_ACCEL_NONE,
 | 
			
		||||
	.line_length	= 640,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct fb_var_screeninfo sgivwfb_var = {
 | 
			
		||||
	/* 640x480, 8 bpp */
 | 
			
		||||
	.xres		= 640,
 | 
			
		||||
	.yres		= 480,
 | 
			
		||||
	.xres_virtual	= 640,
 | 
			
		||||
	.yres_virtual	= 480,
 | 
			
		||||
	.bits_per_pixel	= 8,
 | 
			
		||||
	.red		= { 0, 8, 0 },
 | 
			
		||||
	.green		= { 0, 8, 0 },
 | 
			
		||||
	.blue		= { 0, 8, 0 },
 | 
			
		||||
	.height		= -1,
 | 
			
		||||
	.width		= -1,
 | 
			
		||||
	.pixclock	= 20000,
 | 
			
		||||
	.left_margin	= 64,
 | 
			
		||||
	.right_margin	= 64,
 | 
			
		||||
	.upper_margin	= 32,
 | 
			
		||||
	.lower_margin	= 32,
 | 
			
		||||
	.hsync_len	= 64,
 | 
			
		||||
	.vsync_len	= 2,
 | 
			
		||||
	.vmode		= FB_VMODE_NONINTERLACED
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct fb_var_screeninfo sgivwfb_var1600sw = {
 | 
			
		||||
	/* 1600x1024, 8 bpp */
 | 
			
		||||
	.xres		= 1600,
 | 
			
		||||
	.yres		= 1024,
 | 
			
		||||
	.xres_virtual	= 1600,
 | 
			
		||||
	.yres_virtual	= 1024,
 | 
			
		||||
	.bits_per_pixel	= 8,
 | 
			
		||||
	.red		= { 0, 8, 0 },
 | 
			
		||||
	.green		= { 0, 8, 0 },
 | 
			
		||||
	.blue		= { 0, 8, 0 },
 | 
			
		||||
	.height		= -1,
 | 
			
		||||
	.width		= -1,
 | 
			
		||||
	.pixclock	= 9353,
 | 
			
		||||
	.left_margin	= 20,
 | 
			
		||||
	.right_margin	= 30,
 | 
			
		||||
	.upper_margin	= 37,
 | 
			
		||||
	.lower_margin	= 3,
 | 
			
		||||
	.hsync_len	= 20,
 | 
			
		||||
	.vsync_len	= 3,
 | 
			
		||||
	.vmode		= FB_VMODE_NONINTERLACED
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Interface used by the world
 | 
			
		||||
 */
 | 
			
		||||
int sgivwfb_init(void);
 | 
			
		||||
 | 
			
		||||
static int sgivwfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info);
 | 
			
		||||
static int sgivwfb_set_par(struct fb_info *info);
 | 
			
		||||
static int sgivwfb_setcolreg(u_int regno, u_int red, u_int green,
 | 
			
		||||
			     u_int blue, u_int transp,
 | 
			
		||||
			     struct fb_info *info);
 | 
			
		||||
static int sgivwfb_mmap(struct fb_info *info,
 | 
			
		||||
			struct vm_area_struct *vma);
 | 
			
		||||
 | 
			
		||||
static struct fb_ops sgivwfb_ops = {
 | 
			
		||||
	.owner		= THIS_MODULE,
 | 
			
		||||
	.fb_check_var	= sgivwfb_check_var,
 | 
			
		||||
	.fb_set_par	= sgivwfb_set_par,
 | 
			
		||||
	.fb_setcolreg	= sgivwfb_setcolreg,
 | 
			
		||||
	.fb_fillrect	= cfb_fillrect,
 | 
			
		||||
	.fb_copyarea	= cfb_copyarea,
 | 
			
		||||
	.fb_imageblit	= cfb_imageblit,
 | 
			
		||||
	.fb_mmap	= sgivwfb_mmap,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Internal routines
 | 
			
		||||
 */
 | 
			
		||||
static unsigned long bytes_per_pixel(int bpp)
 | 
			
		||||
{
 | 
			
		||||
	switch (bpp) {
 | 
			
		||||
		case 8:
 | 
			
		||||
			return 1;
 | 
			
		||||
		case 16:
 | 
			
		||||
			return 2;
 | 
			
		||||
		case 32:
 | 
			
		||||
			return 4;
 | 
			
		||||
		default:
 | 
			
		||||
			printk(KERN_INFO "sgivwfb: unsupported bpp %d\n", bpp);
 | 
			
		||||
			return 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned long get_line_length(int xres_virtual, int bpp)
 | 
			
		||||
{
 | 
			
		||||
	return (xres_virtual * bytes_per_pixel(bpp));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Function:	dbe_TurnOffDma
 | 
			
		||||
 * Parameters:	(None)
 | 
			
		||||
 * Description:	This should turn off the monitor and dbe.  This is used
 | 
			
		||||
 *              when switching between the serial console and the graphics
 | 
			
		||||
 *              console.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void dbe_TurnOffDma(struct sgivw_par *par)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int readVal;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	// Check to see if things are already turned off:
 | 
			
		||||
	// 1) Check to see if dbe is not using the internal dotclock.
 | 
			
		||||
	// 2) Check to see if the xy counter in dbe is already off.
 | 
			
		||||
 | 
			
		||||
	DBE_GETREG(ctrlstat, readVal);
 | 
			
		||||
	if (GET_DBE_FIELD(CTRLSTAT, PCLKSEL, readVal) < 2)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	DBE_GETREG(vt_xy, readVal);
 | 
			
		||||
	if (GET_DBE_FIELD(VT_XY, VT_FREEZE, readVal) == 1)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	// Otherwise, turn off dbe
 | 
			
		||||
 | 
			
		||||
	DBE_GETREG(ovr_control, readVal);
 | 
			
		||||
	SET_DBE_FIELD(OVR_CONTROL, OVR_DMA_ENABLE, readVal, 0);
 | 
			
		||||
	DBE_SETREG(ovr_control, readVal);
 | 
			
		||||
	udelay(1000);
 | 
			
		||||
	DBE_GETREG(frm_control, readVal);
 | 
			
		||||
	SET_DBE_FIELD(FRM_CONTROL, FRM_DMA_ENABLE, readVal, 0);
 | 
			
		||||
	DBE_SETREG(frm_control, readVal);
 | 
			
		||||
	udelay(1000);
 | 
			
		||||
	DBE_GETREG(did_control, readVal);
 | 
			
		||||
	SET_DBE_FIELD(DID_CONTROL, DID_DMA_ENABLE, readVal, 0);
 | 
			
		||||
	DBE_SETREG(did_control, readVal);
 | 
			
		||||
	udelay(1000);
 | 
			
		||||
 | 
			
		||||
	// XXX HACK:
 | 
			
		||||
	//
 | 
			
		||||
	//    This was necessary for GBE--we had to wait through two
 | 
			
		||||
	//    vertical retrace periods before the pixel DMA was
 | 
			
		||||
	//    turned off for sure.  I've left this in for now, in
 | 
			
		||||
	//    case dbe needs it.
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < 10000; i++) {
 | 
			
		||||
		DBE_GETREG(frm_inhwctrl, readVal);
 | 
			
		||||
		if (GET_DBE_FIELD(FRM_INHWCTRL, FRM_DMA_ENABLE, readVal) ==
 | 
			
		||||
		    0)
 | 
			
		||||
			udelay(10);
 | 
			
		||||
		else {
 | 
			
		||||
			DBE_GETREG(ovr_inhwctrl, readVal);
 | 
			
		||||
			if (GET_DBE_FIELD
 | 
			
		||||
			    (OVR_INHWCTRL, OVR_DMA_ENABLE, readVal) == 0)
 | 
			
		||||
				udelay(10);
 | 
			
		||||
			else {
 | 
			
		||||
				DBE_GETREG(did_inhwctrl, readVal);
 | 
			
		||||
				if (GET_DBE_FIELD
 | 
			
		||||
				    (DID_INHWCTRL, DID_DMA_ENABLE,
 | 
			
		||||
				     readVal) == 0)
 | 
			
		||||
					udelay(10);
 | 
			
		||||
				else
 | 
			
		||||
					break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Set the User Defined Part of the Display. Again if par use it to get
 | 
			
		||||
 *  real video mode.
 | 
			
		||||
 */
 | 
			
		||||
static int sgivwfb_check_var(struct fb_var_screeninfo *var, 
 | 
			
		||||
			     struct fb_info *info)
 | 
			
		||||
{
 | 
			
		||||
	struct sgivw_par *par = (struct sgivw_par *)info->par;
 | 
			
		||||
	struct dbe_timing_info *timing;
 | 
			
		||||
	u_long line_length;
 | 
			
		||||
	u_long min_mode;
 | 
			
		||||
	int req_dot;
 | 
			
		||||
	int test_mode;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 *  FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal!
 | 
			
		||||
	 *  as FB_VMODE_SMOOTH_XPAN is only used internally
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	if (var->vmode & FB_VMODE_CONUPDATE) {
 | 
			
		||||
		var->vmode |= FB_VMODE_YWRAP;
 | 
			
		||||
		var->xoffset = info->var.xoffset;
 | 
			
		||||
		var->yoffset = info->var.yoffset;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* XXX FIXME - forcing var's */
 | 
			
		||||
	var->xoffset = 0;
 | 
			
		||||
	var->yoffset = 0;
 | 
			
		||||
 | 
			
		||||
	/* Limit bpp to 8, 16, and 32 */
 | 
			
		||||
	if (var->bits_per_pixel <= 8)
 | 
			
		||||
		var->bits_per_pixel = 8;
 | 
			
		||||
	else if (var->bits_per_pixel <= 16)
 | 
			
		||||
		var->bits_per_pixel = 16;
 | 
			
		||||
	else if (var->bits_per_pixel <= 32)
 | 
			
		||||
		var->bits_per_pixel = 32;
 | 
			
		||||
	else
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	var->grayscale = 0;	/* No grayscale for now */
 | 
			
		||||
 | 
			
		||||
	/* determine valid resolution and timing */
 | 
			
		||||
	for (min_mode = 0; min_mode < ARRAY_SIZE(dbeVTimings); min_mode++) {
 | 
			
		||||
		if (dbeVTimings[min_mode].width >= var->xres &&
 | 
			
		||||
		    dbeVTimings[min_mode].height >= var->yres)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (min_mode == ARRAY_SIZE(dbeVTimings))
 | 
			
		||||
		return -EINVAL;	/* Resolution to high */
 | 
			
		||||
 | 
			
		||||
	/* XXX FIXME - should try to pick best refresh rate */
 | 
			
		||||
	/* for now, pick closest dot-clock within 3MHz */
 | 
			
		||||
	req_dot = PICOS2KHZ(var->pixclock);
 | 
			
		||||
	printk(KERN_INFO "sgivwfb: requested pixclock=%d ps (%d KHz)\n",
 | 
			
		||||
	       var->pixclock, req_dot);
 | 
			
		||||
	test_mode = min_mode;
 | 
			
		||||
	while (dbeVTimings[min_mode].width == dbeVTimings[test_mode].width) {
 | 
			
		||||
		if (dbeVTimings[test_mode].cfreq + 3000 > req_dot)
 | 
			
		||||
			break;
 | 
			
		||||
		test_mode++;
 | 
			
		||||
	}
 | 
			
		||||
	if (dbeVTimings[min_mode].width != dbeVTimings[test_mode].width)
 | 
			
		||||
		test_mode--;
 | 
			
		||||
	min_mode = test_mode;
 | 
			
		||||
	timing = &dbeVTimings[min_mode];
 | 
			
		||||
	printk(KERN_INFO "sgivwfb: granted dot-clock=%d KHz\n", timing->cfreq);
 | 
			
		||||
 | 
			
		||||
	/* Adjust virtual resolution, if necessary */
 | 
			
		||||
	if (var->xres > var->xres_virtual || (!ywrap && !ypan))
 | 
			
		||||
		var->xres_virtual = var->xres;
 | 
			
		||||
	if (var->yres > var->yres_virtual || (!ywrap && !ypan))
 | 
			
		||||
		var->yres_virtual = var->yres;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 *  Memory limit
 | 
			
		||||
	 */
 | 
			
		||||
	line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
 | 
			
		||||
	if (line_length * var->yres_virtual > sgivwfb_mem_size)
 | 
			
		||||
		return -ENOMEM;	/* Virtual resolution to high */
 | 
			
		||||
 | 
			
		||||
	info->fix.line_length = line_length;
 | 
			
		||||
 | 
			
		||||
	switch (var->bits_per_pixel) {
 | 
			
		||||
	case 8:
 | 
			
		||||
		var->red.offset = 0;
 | 
			
		||||
		var->red.length = 8;
 | 
			
		||||
		var->green.offset = 0;
 | 
			
		||||
		var->green.length = 8;
 | 
			
		||||
		var->blue.offset = 0;
 | 
			
		||||
		var->blue.length = 8;
 | 
			
		||||
		var->transp.offset = 0;
 | 
			
		||||
		var->transp.length = 0;
 | 
			
		||||
		break;
 | 
			
		||||
	case 16:		/* RGBA 5551 */
 | 
			
		||||
		var->red.offset = 11;
 | 
			
		||||
		var->red.length = 5;
 | 
			
		||||
		var->green.offset = 6;
 | 
			
		||||
		var->green.length = 5;
 | 
			
		||||
		var->blue.offset = 1;
 | 
			
		||||
		var->blue.length = 5;
 | 
			
		||||
		var->transp.offset = 0;
 | 
			
		||||
		var->transp.length = 0;
 | 
			
		||||
		break;
 | 
			
		||||
	case 32:		/* RGB 8888 */
 | 
			
		||||
		var->red.offset = 0;
 | 
			
		||||
		var->red.length = 8;
 | 
			
		||||
		var->green.offset = 8;
 | 
			
		||||
		var->green.length = 8;
 | 
			
		||||
		var->blue.offset = 16;
 | 
			
		||||
		var->blue.length = 8;
 | 
			
		||||
		var->transp.offset = 24;
 | 
			
		||||
		var->transp.length = 8;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	var->red.msb_right = 0;
 | 
			
		||||
	var->green.msb_right = 0;
 | 
			
		||||
	var->blue.msb_right = 0;
 | 
			
		||||
	var->transp.msb_right = 0;
 | 
			
		||||
 | 
			
		||||
	/* set video timing information */
 | 
			
		||||
	var->pixclock = KHZ2PICOS(timing->cfreq);
 | 
			
		||||
	var->left_margin = timing->htotal - timing->hsync_end;
 | 
			
		||||
	var->right_margin = timing->hsync_start - timing->width;
 | 
			
		||||
	var->upper_margin = timing->vtotal - timing->vsync_end;
 | 
			
		||||
	var->lower_margin = timing->vsync_start - timing->height;
 | 
			
		||||
	var->hsync_len = timing->hsync_end - timing->hsync_start;
 | 
			
		||||
	var->vsync_len = timing->vsync_end - timing->vsync_start;
 | 
			
		||||
 | 
			
		||||
	/* Ouch. This breaks the rules but timing_num is only important if you
 | 
			
		||||
	* change a video mode */
 | 
			
		||||
	par->timing_num = min_mode;
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "sgivwfb: new video mode xres=%d yres=%d bpp=%d\n",
 | 
			
		||||
		var->xres, var->yres, var->bits_per_pixel);
 | 
			
		||||
	printk(KERN_INFO "         vxres=%d vyres=%d\n", var->xres_virtual,
 | 
			
		||||
		var->yres_virtual);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Setup flatpanel related registers.
 | 
			
		||||
 */
 | 
			
		||||
static void sgivwfb_setup_flatpanel(struct sgivw_par *par, struct dbe_timing_info *currentTiming)
 | 
			
		||||
{
 | 
			
		||||
	int fp_wid, fp_hgt, fp_vbs, fp_vbe;
 | 
			
		||||
	u32 outputVal = 0;
 | 
			
		||||
 | 
			
		||||
	SET_DBE_FIELD(VT_FLAGS, HDRV_INVERT, outputVal, 
 | 
			
		||||
		(currentTiming->flags & FB_SYNC_HOR_HIGH_ACT) ? 0 : 1);
 | 
			
		||||
	SET_DBE_FIELD(VT_FLAGS, VDRV_INVERT, outputVal, 
 | 
			
		||||
		(currentTiming->flags & FB_SYNC_VERT_HIGH_ACT) ? 0 : 1);
 | 
			
		||||
	DBE_SETREG(vt_flags, outputVal);
 | 
			
		||||
 | 
			
		||||
	/* Turn on the flat panel */
 | 
			
		||||
	switch (flatpanel_id) {
 | 
			
		||||
		case FLATPANEL_SGI_1600SW:
 | 
			
		||||
			fp_wid = 1600;
 | 
			
		||||
			fp_hgt = 1024;
 | 
			
		||||
			fp_vbs = 0;
 | 
			
		||||
			fp_vbe = 1600;
 | 
			
		||||
			currentTiming->pll_m = 4;
 | 
			
		||||
			currentTiming->pll_n = 1;
 | 
			
		||||
			currentTiming->pll_p = 0;
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
      			fp_wid = fp_hgt = fp_vbs = fp_vbe = 0xfff;
 | 
			
		||||
  	}
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(FP_DE, FP_DE_ON, outputVal, fp_vbs);
 | 
			
		||||
	SET_DBE_FIELD(FP_DE, FP_DE_OFF, outputVal, fp_vbe);
 | 
			
		||||
	DBE_SETREG(fp_de, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(FP_HDRV, FP_HDRV_OFF, outputVal, fp_wid);
 | 
			
		||||
	DBE_SETREG(fp_hdrv, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(FP_VDRV, FP_VDRV_ON, outputVal, 1);
 | 
			
		||||
	SET_DBE_FIELD(FP_VDRV, FP_VDRV_OFF, outputVal, fp_hgt + 1);
 | 
			
		||||
	DBE_SETREG(fp_vdrv, outputVal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Set the hardware according to 'par'.
 | 
			
		||||
 */
 | 
			
		||||
static int sgivwfb_set_par(struct fb_info *info)
 | 
			
		||||
{
 | 
			
		||||
	struct sgivw_par *par = info->par;
 | 
			
		||||
	int i, j, htmp, temp;
 | 
			
		||||
	u32 readVal, outputVal;
 | 
			
		||||
	int wholeTilesX, maxPixelsPerTileX;
 | 
			
		||||
	int frmWrite1, frmWrite2, frmWrite3b;
 | 
			
		||||
	struct dbe_timing_info *currentTiming; /* Current Video Timing */
 | 
			
		||||
	int xpmax, ypmax;	// Monitor resolution
 | 
			
		||||
	int bytesPerPixel;	// Bytes per pixel
 | 
			
		||||
 | 
			
		||||
	currentTiming = &dbeVTimings[par->timing_num];
 | 
			
		||||
	bytesPerPixel = bytes_per_pixel(info->var.bits_per_pixel);
 | 
			
		||||
	xpmax = currentTiming->width;
 | 
			
		||||
	ypmax = currentTiming->height;
 | 
			
		||||
 | 
			
		||||
	/* dbe_InitGraphicsBase(); */
 | 
			
		||||
	/* Turn on dotclock PLL */
 | 
			
		||||
	DBE_SETREG(ctrlstat, 0x20000000);
 | 
			
		||||
 | 
			
		||||
	dbe_TurnOffDma(par);
 | 
			
		||||
 | 
			
		||||
	/* dbe_CalculateScreenParams(); */
 | 
			
		||||
	maxPixelsPerTileX = 512 / bytesPerPixel;
 | 
			
		||||
	wholeTilesX = xpmax / maxPixelsPerTileX;
 | 
			
		||||
	if (wholeTilesX * maxPixelsPerTileX < xpmax)
 | 
			
		||||
		wholeTilesX++;
 | 
			
		||||
 | 
			
		||||
	printk(KERN_DEBUG "sgivwfb: pixPerTile=%d wholeTilesX=%d\n",
 | 
			
		||||
	       maxPixelsPerTileX, wholeTilesX);
 | 
			
		||||
 | 
			
		||||
	/* dbe_InitGammaMap(); */
 | 
			
		||||
	udelay(10);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < 256; i++) {
 | 
			
		||||
		DBE_ISETREG(gmap, i, (i << 24) | (i << 16) | (i << 8));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* dbe_TurnOn(); */
 | 
			
		||||
	DBE_GETREG(vt_xy, readVal);
 | 
			
		||||
	if (GET_DBE_FIELD(VT_XY, VT_FREEZE, readVal) == 1) {
 | 
			
		||||
		DBE_SETREG(vt_xy, 0x00000000);
 | 
			
		||||
		udelay(1);
 | 
			
		||||
	} else
 | 
			
		||||
		dbe_TurnOffDma(par);
 | 
			
		||||
 | 
			
		||||
	/* dbe_Initdbe(); */
 | 
			
		||||
	for (i = 0; i < 256; i++) {
 | 
			
		||||
		for (j = 0; j < 100; j++) {
 | 
			
		||||
			DBE_GETREG(cm_fifo, readVal);
 | 
			
		||||
			if (readVal != 0x00000000)
 | 
			
		||||
				break;
 | 
			
		||||
			else
 | 
			
		||||
				udelay(10);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// DBE_ISETREG(cmap, i, 0x00000000);
 | 
			
		||||
		DBE_ISETREG(cmap, i, (i << 8) | (i << 16) | (i << 24));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* dbe_InitFramebuffer(); */
 | 
			
		||||
	frmWrite1 = 0;
 | 
			
		||||
	SET_DBE_FIELD(FRM_SIZE_TILE, FRM_WIDTH_TILE, frmWrite1,
 | 
			
		||||
		      wholeTilesX);
 | 
			
		||||
	SET_DBE_FIELD(FRM_SIZE_TILE, FRM_RHS, frmWrite1, 0);
 | 
			
		||||
 | 
			
		||||
	switch (bytesPerPixel) {
 | 
			
		||||
	case 1:
 | 
			
		||||
		SET_DBE_FIELD(FRM_SIZE_TILE, FRM_DEPTH, frmWrite1,
 | 
			
		||||
			      DBE_FRM_DEPTH_8);
 | 
			
		||||
		break;
 | 
			
		||||
	case 2:
 | 
			
		||||
		SET_DBE_FIELD(FRM_SIZE_TILE, FRM_DEPTH, frmWrite1,
 | 
			
		||||
			      DBE_FRM_DEPTH_16);
 | 
			
		||||
		break;
 | 
			
		||||
	case 4:
 | 
			
		||||
		SET_DBE_FIELD(FRM_SIZE_TILE, FRM_DEPTH, frmWrite1,
 | 
			
		||||
			      DBE_FRM_DEPTH_32);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	frmWrite2 = 0;
 | 
			
		||||
	SET_DBE_FIELD(FRM_SIZE_PIXEL, FB_HEIGHT_PIX, frmWrite2, ypmax);
 | 
			
		||||
 | 
			
		||||
	// Tell dbe about the framebuffer location and type
 | 
			
		||||
	// XXX What format is the FRM_TILE_PTR??  64K aligned address?
 | 
			
		||||
	frmWrite3b = 0;
 | 
			
		||||
	SET_DBE_FIELD(FRM_CONTROL, FRM_TILE_PTR, frmWrite3b,
 | 
			
		||||
		      sgivwfb_mem_phys >> 9);
 | 
			
		||||
	SET_DBE_FIELD(FRM_CONTROL, FRM_DMA_ENABLE, frmWrite3b, 1);
 | 
			
		||||
	SET_DBE_FIELD(FRM_CONTROL, FRM_LINEAR, frmWrite3b, 1);
 | 
			
		||||
 | 
			
		||||
	/* Initialize DIDs */
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	switch (bytesPerPixel) {
 | 
			
		||||
	case 1:
 | 
			
		||||
		SET_DBE_FIELD(WID, TYP, outputVal, DBE_CMODE_I8);
 | 
			
		||||
		break;
 | 
			
		||||
	case 2:
 | 
			
		||||
		SET_DBE_FIELD(WID, TYP, outputVal, DBE_CMODE_RGBA5);
 | 
			
		||||
		break;
 | 
			
		||||
	case 4:
 | 
			
		||||
		SET_DBE_FIELD(WID, TYP, outputVal, DBE_CMODE_RGB8);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	SET_DBE_FIELD(WID, BUF, outputVal, DBE_BMODE_BOTH);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < 32; i++) {
 | 
			
		||||
		DBE_ISETREG(mode_regs, i, outputVal);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* dbe_InitTiming(); */
 | 
			
		||||
	DBE_SETREG(vt_intr01, 0xffffffff);
 | 
			
		||||
	DBE_SETREG(vt_intr23, 0xffffffff);
 | 
			
		||||
 | 
			
		||||
	DBE_GETREG(dotclock, readVal);
 | 
			
		||||
	DBE_SETREG(dotclock, readVal & 0xffff);
 | 
			
		||||
 | 
			
		||||
	DBE_SETREG(vt_xymax, 0x00000000);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_VSYNC, VT_VSYNC_ON, outputVal,
 | 
			
		||||
		      currentTiming->vsync_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_VSYNC, VT_VSYNC_OFF, outputVal,
 | 
			
		||||
		      currentTiming->vsync_end);
 | 
			
		||||
	DBE_SETREG(vt_vsync, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_HSYNC, VT_HSYNC_ON, outputVal,
 | 
			
		||||
		      currentTiming->hsync_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_HSYNC, VT_HSYNC_OFF, outputVal,
 | 
			
		||||
		      currentTiming->hsync_end);
 | 
			
		||||
	DBE_SETREG(vt_hsync, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_VBLANK, VT_VBLANK_ON, outputVal,
 | 
			
		||||
		      currentTiming->vblank_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_VBLANK, VT_VBLANK_OFF, outputVal,
 | 
			
		||||
		      currentTiming->vblank_end);
 | 
			
		||||
	DBE_SETREG(vt_vblank, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_HBLANK, VT_HBLANK_ON, outputVal,
 | 
			
		||||
		      currentTiming->hblank_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_HBLANK, VT_HBLANK_OFF, outputVal,
 | 
			
		||||
		      currentTiming->hblank_end - 3);
 | 
			
		||||
	DBE_SETREG(vt_hblank, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_VCMAP, VT_VCMAP_ON, outputVal,
 | 
			
		||||
		      currentTiming->vblank_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_VCMAP, VT_VCMAP_OFF, outputVal,
 | 
			
		||||
		      currentTiming->vblank_end);
 | 
			
		||||
	DBE_SETREG(vt_vcmap, outputVal);
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_HCMAP, VT_HCMAP_ON, outputVal,
 | 
			
		||||
		      currentTiming->hblank_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_HCMAP, VT_HCMAP_OFF, outputVal,
 | 
			
		||||
		      currentTiming->hblank_end - 3);
 | 
			
		||||
	DBE_SETREG(vt_hcmap, outputVal);
 | 
			
		||||
 | 
			
		||||
	if (flatpanel_id != -1)
 | 
			
		||||
		sgivwfb_setup_flatpanel(par, currentTiming);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	temp = currentTiming->vblank_start - currentTiming->vblank_end - 1;
 | 
			
		||||
	if (temp > 0)
 | 
			
		||||
		temp = -temp;
 | 
			
		||||
 | 
			
		||||
	SET_DBE_FIELD(DID_START_XY, DID_STARTY, outputVal, (u32) temp);
 | 
			
		||||
	if (currentTiming->hblank_end >= 20)
 | 
			
		||||
		SET_DBE_FIELD(DID_START_XY, DID_STARTX, outputVal,
 | 
			
		||||
			      currentTiming->hblank_end - 20);
 | 
			
		||||
	else
 | 
			
		||||
		SET_DBE_FIELD(DID_START_XY, DID_STARTX, outputVal,
 | 
			
		||||
			      currentTiming->htotal - (20 -
 | 
			
		||||
						       currentTiming->
 | 
			
		||||
						       hblank_end));
 | 
			
		||||
	DBE_SETREG(did_start_xy, outputVal);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(CRS_START_XY, CRS_STARTY, outputVal,
 | 
			
		||||
		      (u32) (temp + 1));
 | 
			
		||||
	if (currentTiming->hblank_end >= DBE_CRS_MAGIC)
 | 
			
		||||
		SET_DBE_FIELD(CRS_START_XY, CRS_STARTX, outputVal,
 | 
			
		||||
			      currentTiming->hblank_end - DBE_CRS_MAGIC);
 | 
			
		||||
	else
 | 
			
		||||
		SET_DBE_FIELD(CRS_START_XY, CRS_STARTX, outputVal,
 | 
			
		||||
			      currentTiming->htotal - (DBE_CRS_MAGIC -
 | 
			
		||||
						       currentTiming->
 | 
			
		||||
						       hblank_end));
 | 
			
		||||
	DBE_SETREG(crs_start_xy, outputVal);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VC_START_XY, VC_STARTY, outputVal, (u32) temp);
 | 
			
		||||
	SET_DBE_FIELD(VC_START_XY, VC_STARTX, outputVal,
 | 
			
		||||
		      currentTiming->hblank_end - 4);
 | 
			
		||||
	DBE_SETREG(vc_start_xy, outputVal);
 | 
			
		||||
 | 
			
		||||
	DBE_SETREG(frm_size_tile, frmWrite1);
 | 
			
		||||
	DBE_SETREG(frm_size_pixel, frmWrite2);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(DOTCLK, M, outputVal, currentTiming->pll_m - 1);
 | 
			
		||||
	SET_DBE_FIELD(DOTCLK, N, outputVal, currentTiming->pll_n - 1);
 | 
			
		||||
	SET_DBE_FIELD(DOTCLK, P, outputVal, currentTiming->pll_p);
 | 
			
		||||
	SET_DBE_FIELD(DOTCLK, RUN, outputVal, 1);
 | 
			
		||||
	DBE_SETREG(dotclock, outputVal);
 | 
			
		||||
 | 
			
		||||
	udelay(11 * 1000);
 | 
			
		||||
 | 
			
		||||
	DBE_SETREG(vt_vpixen, 0xffffff);
 | 
			
		||||
	DBE_SETREG(vt_hpixen, 0xffffff);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_XYMAX, VT_MAXX, outputVal, currentTiming->htotal);
 | 
			
		||||
	SET_DBE_FIELD(VT_XYMAX, VT_MAXY, outputVal, currentTiming->vtotal);
 | 
			
		||||
	DBE_SETREG(vt_xymax, outputVal);
 | 
			
		||||
 | 
			
		||||
	outputVal = frmWrite1;
 | 
			
		||||
	SET_DBE_FIELD(FRM_SIZE_TILE, FRM_FIFO_RESET, outputVal, 1);
 | 
			
		||||
	DBE_SETREG(frm_size_tile, outputVal);
 | 
			
		||||
	DBE_SETREG(frm_size_tile, frmWrite1);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(OVR_WIDTH_TILE, OVR_FIFO_RESET, outputVal, 1);
 | 
			
		||||
	DBE_SETREG(ovr_width_tile, outputVal);
 | 
			
		||||
	DBE_SETREG(ovr_width_tile, 0);
 | 
			
		||||
 | 
			
		||||
	DBE_SETREG(frm_control, frmWrite3b);
 | 
			
		||||
	DBE_SETREG(did_control, 0);
 | 
			
		||||
 | 
			
		||||
	// Wait for dbe to take frame settings
 | 
			
		||||
	for (i = 0; i < 100000; i++) {
 | 
			
		||||
		DBE_GETREG(frm_inhwctrl, readVal);
 | 
			
		||||
		if (GET_DBE_FIELD(FRM_INHWCTRL, FRM_DMA_ENABLE, readVal) !=
 | 
			
		||||
		    0)
 | 
			
		||||
			break;
 | 
			
		||||
		else
 | 
			
		||||
			udelay(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (i == 100000)
 | 
			
		||||
		printk(KERN_INFO
 | 
			
		||||
		       "sgivwfb: timeout waiting for frame DMA enable.\n");
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	htmp = currentTiming->hblank_end - 19;
 | 
			
		||||
	if (htmp < 0)
 | 
			
		||||
		htmp += currentTiming->htotal;	/* allow blank to wrap around */
 | 
			
		||||
	SET_DBE_FIELD(VT_HPIXEN, VT_HPIXEN_ON, outputVal, htmp);
 | 
			
		||||
	SET_DBE_FIELD(VT_HPIXEN, VT_HPIXEN_OFF, outputVal,
 | 
			
		||||
		      ((htmp + currentTiming->width -
 | 
			
		||||
			2) % currentTiming->htotal));
 | 
			
		||||
	DBE_SETREG(vt_hpixen, outputVal);
 | 
			
		||||
 | 
			
		||||
	outputVal = 0;
 | 
			
		||||
	SET_DBE_FIELD(VT_VPIXEN, VT_VPIXEN_OFF, outputVal,
 | 
			
		||||
		      currentTiming->vblank_start);
 | 
			
		||||
	SET_DBE_FIELD(VT_VPIXEN, VT_VPIXEN_ON, outputVal,
 | 
			
		||||
		      currentTiming->vblank_end);
 | 
			
		||||
	DBE_SETREG(vt_vpixen, outputVal);
 | 
			
		||||
 | 
			
		||||
	// Turn off mouse cursor
 | 
			
		||||
	par->regs->crs_ctl = 0;
 | 
			
		||||
 | 
			
		||||
	// XXX What's this section for??
 | 
			
		||||
	DBE_GETREG(ctrlstat, readVal);
 | 
			
		||||
	readVal &= 0x02000000;
 | 
			
		||||
 | 
			
		||||
	if (readVal != 0) {
 | 
			
		||||
		DBE_SETREG(ctrlstat, 0x30000000);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Set a single color register. The values supplied are already
 | 
			
		||||
 *  rounded down to the hardware's capabilities (according to the
 | 
			
		||||
 *  entries in the var structure). Return != 0 for invalid regno.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static int sgivwfb_setcolreg(u_int regno, u_int red, u_int green,
 | 
			
		||||
			     u_int blue, u_int transp,
 | 
			
		||||
			     struct fb_info *info)
 | 
			
		||||
{
 | 
			
		||||
	struct sgivw_par *par = (struct sgivw_par *) info->par;
 | 
			
		||||
 | 
			
		||||
	if (regno > 255)
 | 
			
		||||
		return 1;
 | 
			
		||||
	red >>= 8;
 | 
			
		||||
	green >>= 8;
 | 
			
		||||
	blue >>= 8;
 | 
			
		||||
 | 
			
		||||
	/* wait for the color map FIFO to have a free entry */
 | 
			
		||||
	while (par->cmap_fifo == 0)
 | 
			
		||||
		par->cmap_fifo = par->regs->cm_fifo;
 | 
			
		||||
 | 
			
		||||
	par->regs->cmap[regno] = (red << 24) | (green << 16) | (blue << 8);
 | 
			
		||||
	par->cmap_fifo--;	/* assume FIFO is filling up */
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sgivwfb_mmap(struct fb_info *info,
 | 
			
		||||
			struct vm_area_struct *vma)
 | 
			
		||||
{
 | 
			
		||||
	int r;
 | 
			
		||||
 | 
			
		||||
	pgprot_val(vma->vm_page_prot) =
 | 
			
		||||
		pgprot_val(vma->vm_page_prot) | _PAGE_PCD;
 | 
			
		||||
 | 
			
		||||
	r = vm_iomap_memory(vma, sgivwfb_mem_phys, sgivwfb_mem_size);
 | 
			
		||||
 | 
			
		||||
	printk(KERN_DEBUG "sgivwfb: mmap framebuffer P(%lx)->V(%lx)\n",
 | 
			
		||||
		sgivwfb_mem_phys + (vma->vm_pgoff << PAGE_SHIFT), vma->vm_start);
 | 
			
		||||
 | 
			
		||||
	return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __init sgivwfb_setup(char *options)
 | 
			
		||||
{
 | 
			
		||||
	char *this_opt;
 | 
			
		||||
 | 
			
		||||
	if (!options || !*options)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	while ((this_opt = strsep(&options, ",")) != NULL) {
 | 
			
		||||
		if (!strncmp(this_opt, "monitor:", 8)) {
 | 
			
		||||
			if (!strncmp(this_opt + 8, "crt", 3))
 | 
			
		||||
				flatpanel_id = -1;
 | 
			
		||||
			else if (!strncmp(this_opt + 8, "1600sw", 6))
 | 
			
		||||
				flatpanel_id = FLATPANEL_SGI_1600SW;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *  Initialisation
 | 
			
		||||
 */
 | 
			
		||||
static int sgivwfb_probe(struct platform_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct sgivw_par *par;
 | 
			
		||||
	struct fb_info *info;
 | 
			
		||||
	char *monitor;
 | 
			
		||||
 | 
			
		||||
	info = framebuffer_alloc(sizeof(struct sgivw_par) + sizeof(u32) * 16, &dev->dev);
 | 
			
		||||
	if (!info)
 | 
			
		||||
		return -ENOMEM;
 | 
			
		||||
	par = info->par;
 | 
			
		||||
 | 
			
		||||
	if (!request_mem_region(DBE_REG_PHYS, DBE_REG_SIZE, "sgivwfb")) {
 | 
			
		||||
		printk(KERN_ERR "sgivwfb: couldn't reserve mmio region\n");
 | 
			
		||||
		framebuffer_release(info);
 | 
			
		||||
		return -EBUSY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	par->regs = (struct asregs *) ioremap_nocache(DBE_REG_PHYS, DBE_REG_SIZE);
 | 
			
		||||
	if (!par->regs) {
 | 
			
		||||
		printk(KERN_ERR "sgivwfb: couldn't ioremap registers\n");
 | 
			
		||||
		goto fail_ioremap_regs;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mtrr_add(sgivwfb_mem_phys, sgivwfb_mem_size, MTRR_TYPE_WRCOMB, 1);
 | 
			
		||||
 | 
			
		||||
	sgivwfb_fix.smem_start = sgivwfb_mem_phys;
 | 
			
		||||
	sgivwfb_fix.smem_len = sgivwfb_mem_size;
 | 
			
		||||
	sgivwfb_fix.ywrapstep = ywrap;
 | 
			
		||||
	sgivwfb_fix.ypanstep = ypan;
 | 
			
		||||
 | 
			
		||||
	info->fix = sgivwfb_fix;
 | 
			
		||||
 | 
			
		||||
	switch (flatpanel_id) {
 | 
			
		||||
		case FLATPANEL_SGI_1600SW:
 | 
			
		||||
			info->var = sgivwfb_var1600sw;
 | 
			
		||||
			monitor = "SGI 1600SW flatpanel";
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			info->var = sgivwfb_var;
 | 
			
		||||
			monitor = "CRT";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "sgivwfb: %s monitor selected\n", monitor);
 | 
			
		||||
 | 
			
		||||
	info->fbops = &sgivwfb_ops;
 | 
			
		||||
	info->pseudo_palette = (void *) (par + 1);
 | 
			
		||||
	info->flags = FBINFO_DEFAULT;
 | 
			
		||||
 | 
			
		||||
	info->screen_base = ioremap_nocache((unsigned long) sgivwfb_mem_phys, sgivwfb_mem_size);
 | 
			
		||||
	if (!info->screen_base) {
 | 
			
		||||
		printk(KERN_ERR "sgivwfb: couldn't ioremap screen_base\n");
 | 
			
		||||
		goto fail_ioremap_fbmem;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (fb_alloc_cmap(&info->cmap, 256, 0) < 0)
 | 
			
		||||
		goto fail_color_map;
 | 
			
		||||
 | 
			
		||||
	if (register_framebuffer(info) < 0) {
 | 
			
		||||
		printk(KERN_ERR "sgivwfb: couldn't register framebuffer\n");
 | 
			
		||||
		goto fail_register_framebuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	platform_set_drvdata(dev, info);
 | 
			
		||||
 | 
			
		||||
	fb_info(info, "SGI DBE frame buffer device, using %ldK of video memory at %#lx\n",
 | 
			
		||||
		sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
fail_register_framebuffer:
 | 
			
		||||
	fb_dealloc_cmap(&info->cmap);
 | 
			
		||||
fail_color_map:
 | 
			
		||||
	iounmap((char *) info->screen_base);
 | 
			
		||||
fail_ioremap_fbmem:
 | 
			
		||||
	iounmap(par->regs);
 | 
			
		||||
fail_ioremap_regs:
 | 
			
		||||
	release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
 | 
			
		||||
	framebuffer_release(info);
 | 
			
		||||
	return -ENXIO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sgivwfb_remove(struct platform_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct fb_info *info = platform_get_drvdata(dev);
 | 
			
		||||
 | 
			
		||||
	if (info) {
 | 
			
		||||
		struct sgivw_par *par = info->par;
 | 
			
		||||
 | 
			
		||||
		unregister_framebuffer(info);
 | 
			
		||||
		dbe_TurnOffDma(par);
 | 
			
		||||
		iounmap(par->regs);
 | 
			
		||||
		iounmap(info->screen_base);
 | 
			
		||||
		release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
 | 
			
		||||
		fb_dealloc_cmap(&info->cmap);
 | 
			
		||||
		framebuffer_release(info);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct platform_driver sgivwfb_driver = {
 | 
			
		||||
	.probe	= sgivwfb_probe,
 | 
			
		||||
	.remove	= sgivwfb_remove,
 | 
			
		||||
	.driver	= {
 | 
			
		||||
		.name	= "sgivwfb",
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device *sgivwfb_device;
 | 
			
		||||
 | 
			
		||||
int __init sgivwfb_init(void)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
#ifndef MODULE
 | 
			
		||||
	char *option = NULL;
 | 
			
		||||
 | 
			
		||||
	if (fb_get_options("sgivwfb", &option))
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
	sgivwfb_setup(option);
 | 
			
		||||
#endif
 | 
			
		||||
	ret = platform_driver_register(&sgivwfb_driver);
 | 
			
		||||
	if (!ret) {
 | 
			
		||||
		sgivwfb_device = platform_device_alloc("sgivwfb", 0);
 | 
			
		||||
		if (sgivwfb_device) {
 | 
			
		||||
			ret = platform_device_add(sgivwfb_device);
 | 
			
		||||
		} else
 | 
			
		||||
			ret = -ENOMEM;
 | 
			
		||||
		if (ret) {
 | 
			
		||||
			platform_driver_unregister(&sgivwfb_driver);
 | 
			
		||||
			platform_device_put(sgivwfb_device);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module_init(sgivwfb_init);
 | 
			
		||||
 | 
			
		||||
#ifdef MODULE
 | 
			
		||||
MODULE_LICENSE("GPL");
 | 
			
		||||
 | 
			
		||||
static void __exit sgivwfb_exit(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_device_unregister(sgivwfb_device);
 | 
			
		||||
	platform_driver_unregister(&sgivwfb_driver);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module_exit(sgivwfb_exit);
 | 
			
		||||
 | 
			
		||||
#endif				/* MODULE */
 | 
			
		||||
@ -1,681 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  linux/drivers/video/sgivw.h -- SGI DBE frame buffer device header
 | 
			
		||||
 *
 | 
			
		||||
 *      Copyright (C) 1999 Silicon Graphics, Inc.
 | 
			
		||||
 *      Jeffrey Newquist, newquist@engr.sgi.som
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is subject to the terms and conditions of the GNU General Public
 | 
			
		||||
 *  License. See the file COPYING in the main directory of this archive for
 | 
			
		||||
 *  more details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __SGIVWFB_H__
 | 
			
		||||
#define __SGIVWFB_H__
 | 
			
		||||
 | 
			
		||||
#define DBE_GETREG(reg, dest)		((dest) = DBE_REG_BASE->reg)
 | 
			
		||||
#define DBE_SETREG(reg, src)		DBE_REG_BASE->reg = (src)
 | 
			
		||||
#define DBE_IGETREG(reg, idx, dest)	((dest) = DBE_REG_BASE->reg[idx])
 | 
			
		||||
#define DBE_ISETREG(reg, idx, src)	(DBE_REG_BASE->reg[idx] = (src))
 | 
			
		||||
 | 
			
		||||
#define MASK(msb, lsb)          ( (((u32)1<<((msb)-(lsb)+1))-1) << (lsb) )
 | 
			
		||||
#define GET(v, msb, lsb)        ( ((u32)(v) & MASK(msb,lsb)) >> (lsb) )
 | 
			
		||||
#define SET(v, f, msb, lsb)     ( (v) = ((v)&~MASK(msb,lsb)) | (( (u32)(f)<<(lsb) ) & MASK(msb,lsb)) )
 | 
			
		||||
 | 
			
		||||
#define GET_DBE_FIELD(reg, field, v)        GET((v), DBE_##reg##_##field##_MSB, DBE_##reg##_##field##_LSB)
 | 
			
		||||
#define SET_DBE_FIELD(reg, field, v, f)     SET((v), (f), DBE_##reg##_##field##_MSB, DBE_##reg##_##field##_LSB)
 | 
			
		||||
 | 
			
		||||
/* NOTE: All loads/stores must be 32 bits and uncached */
 | 
			
		||||
 | 
			
		||||
#define DBE_REG_PHYS	0xd0000000
 | 
			
		||||
#define DBE_REG_SIZE        0x01000000
 | 
			
		||||
 | 
			
		||||
struct asregs {
 | 
			
		||||
  volatile u32 ctrlstat;     /* 0x000000 general control */
 | 
			
		||||
  volatile u32 dotclock;     /* 0x000004 dot clock PLL control */
 | 
			
		||||
  volatile u32 i2c;          /* 0x000008 crt I2C control */
 | 
			
		||||
  volatile u32 sysclk;       /* 0x00000c system clock PLL control */
 | 
			
		||||
  volatile u32 i2cfp;        /* 0x000010 flat panel I2C control */
 | 
			
		||||
  volatile u32 id;           /* 0x000014 device id/chip revision */
 | 
			
		||||
  volatile u32 config;       /* 0x000018 power on configuration */
 | 
			
		||||
  volatile u32 bist;         /* 0x00001c internal bist status */
 | 
			
		||||
 | 
			
		||||
  char _pad0[ 0x010000 - 0x000020 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 vt_xy;        /* 0x010000 current dot coords */
 | 
			
		||||
  volatile u32 vt_xymax;     /* 0x010004 maximum dot coords */
 | 
			
		||||
  volatile u32 vt_vsync;     /* 0x010008 vsync on/off */
 | 
			
		||||
  volatile u32 vt_hsync;     /* 0x01000c hsync on/off */
 | 
			
		||||
  volatile u32 vt_vblank;    /* 0x010010 vblank on/off */
 | 
			
		||||
  volatile u32 vt_hblank;    /* 0x010014 hblank on/off */
 | 
			
		||||
  volatile u32 vt_flags;     /* 0x010018 polarity of vt signals */
 | 
			
		||||
  volatile u32 vt_f2rf_lock; /* 0x01001c f2rf & framelck y coord */
 | 
			
		||||
  volatile u32 vt_intr01;    /* 0x010020 intr 0,1 y coords */
 | 
			
		||||
  volatile u32 vt_intr23;    /* 0x010024 intr 2,3 y coords */
 | 
			
		||||
  volatile u32 fp_hdrv;      /* 0x010028 flat panel hdrv on/off */
 | 
			
		||||
  volatile u32 fp_vdrv;      /* 0x01002c flat panel vdrv on/off */
 | 
			
		||||
  volatile u32 fp_de;        /* 0x010030 flat panel de on/off */
 | 
			
		||||
  volatile u32 vt_hpixen;    /* 0x010034 intrnl horiz pixel on/off*/
 | 
			
		||||
  volatile u32 vt_vpixen;    /* 0x010038 intrnl vert pixel on/off */
 | 
			
		||||
  volatile u32 vt_hcmap;     /* 0x01003c cmap write (horiz) */
 | 
			
		||||
  volatile u32 vt_vcmap;     /* 0x010040 cmap write (vert) */
 | 
			
		||||
  volatile u32 did_start_xy; /* 0x010044 eol/f did/xy reset val */
 | 
			
		||||
  volatile u32 crs_start_xy; /* 0x010048 eol/f crs/xy reset val */
 | 
			
		||||
  volatile u32 vc_start_xy;  /* 0x01004c eol/f vc/xy reset val */
 | 
			
		||||
 | 
			
		||||
  char _pad1[ 0x020000 - 0x010050 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 ovr_width_tile; /* 0x020000 overlay plane ctrl 0 */
 | 
			
		||||
  volatile u32 ovr_inhwctrl;   /* 0x020004 overlay plane ctrl 1 */
 | 
			
		||||
  volatile u32 ovr_control;    /* 0x020008 overlay plane ctrl 1 */
 | 
			
		||||
 | 
			
		||||
  char _pad2[ 0x030000 - 0x02000C ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 frm_size_tile;  /* 0x030000 normal plane ctrl 0 */
 | 
			
		||||
  volatile u32 frm_size_pixel; /* 0x030004 normal plane ctrl 1 */
 | 
			
		||||
  volatile u32 frm_inhwctrl;   /* 0x030008 normal plane ctrl 2 */
 | 
			
		||||
  volatile u32 frm_control;	   /* 0x03000C normal plane ctrl 3 */
 | 
			
		||||
 | 
			
		||||
  char _pad3[ 0x040000 - 0x030010 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 did_inhwctrl;   /* 0x040000 DID control */
 | 
			
		||||
  volatile u32 did_control;    /* 0x040004 DID shadow */
 | 
			
		||||
 | 
			
		||||
  char _pad4[ 0x048000 - 0x040008 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 mode_regs[32];  /* 0x048000 - 0x04807c WID table */
 | 
			
		||||
 | 
			
		||||
  char _pad5[ 0x050000 - 0x048080 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 cmap[6144];     /* 0x050000 - 0x055ffc color map */
 | 
			
		||||
 | 
			
		||||
  char _pad6[ 0x058000 - 0x056000 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 cm_fifo;        /* 0x058000 color map fifo status */
 | 
			
		||||
 | 
			
		||||
  char _pad7[ 0x060000 - 0x058004 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 gmap[256];      /* 0x060000 - 0x0603fc gamma map */
 | 
			
		||||
 | 
			
		||||
  char _pad8[ 0x068000 - 0x060400 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 gmap10[1024];   /* 0x068000 - 0x068ffc gamma map */
 | 
			
		||||
 | 
			
		||||
  char _pad9[ 0x070000 - 0x069000 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 crs_pos;        /* 0x070000 cusror control 0 */
 | 
			
		||||
  volatile u32 crs_ctl;        /* 0x070004 cusror control 1 */
 | 
			
		||||
  volatile u32 crs_cmap[3];    /* 0x070008 - 0x070010 crs cmap */
 | 
			
		||||
 | 
			
		||||
  char _pad10[ 0x078000 - 0x070014 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 crs_glyph[64];  /* 0x078000 - 0x0780fc crs glyph */
 | 
			
		||||
 | 
			
		||||
  char _pad11[ 0x080000 - 0x078100 ];
 | 
			
		||||
 | 
			
		||||
  volatile u32 vc_0;           /* 0x080000 video capture crtl 0 */
 | 
			
		||||
  volatile u32 vc_1;           /* 0x080004 video capture crtl 1 */
 | 
			
		||||
  volatile u32 vc_2;           /* 0x080008 video capture crtl 2 */
 | 
			
		||||
  volatile u32 vc_3;           /* 0x08000c video capture crtl 3 */
 | 
			
		||||
  volatile u32 vc_4;           /* 0x080010 video capture crtl 3 */
 | 
			
		||||
  volatile u32 vc_5;           /* 0x080014 video capture crtl 3 */
 | 
			
		||||
  volatile u32 vc_6;           /* 0x080018 video capture crtl 3 */
 | 
			
		||||
  volatile u32 vc_7;           /* 0x08001c video capture crtl 3 */
 | 
			
		||||
  volatile u32 vc_8;           /* 0x08000c video capture crtl 3 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Bit mask information */
 | 
			
		||||
 | 
			
		||||
#define DBE_CTRLSTAT_CHIPID_MSB     3
 | 
			
		||||
#define DBE_CTRLSTAT_CHIPID_LSB     0
 | 
			
		||||
#define DBE_CTRLSTAT_SENSE_N_MSB    4
 | 
			
		||||
#define DBE_CTRLSTAT_SENSE_N_LSB    4
 | 
			
		||||
#define DBE_CTRLSTAT_PCLKSEL_MSB    29
 | 
			
		||||
#define DBE_CTRLSTAT_PCLKSEL_LSB    28
 | 
			
		||||
 | 
			
		||||
#define DBE_DOTCLK_M_MSB            7
 | 
			
		||||
#define DBE_DOTCLK_M_LSB            0
 | 
			
		||||
#define DBE_DOTCLK_N_MSB            13
 | 
			
		||||
#define DBE_DOTCLK_N_LSB            8
 | 
			
		||||
#define DBE_DOTCLK_P_MSB            15
 | 
			
		||||
#define DBE_DOTCLK_P_LSB            14
 | 
			
		||||
#define DBE_DOTCLK_RUN_MSB          20
 | 
			
		||||
#define DBE_DOTCLK_RUN_LSB          20
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_XY_VT_FREEZE_MSB     31
 | 
			
		||||
#define DBE_VT_XY_VT_FREEZE_LSB     31
 | 
			
		||||
 | 
			
		||||
#define DBE_FP_VDRV_FP_VDRV_ON_MSB	23
 | 
			
		||||
#define DBE_FP_VDRV_FP_VDRV_ON_LSB	12
 | 
			
		||||
#define DBE_FP_VDRV_FP_VDRV_OFF_MSB	11
 | 
			
		||||
#define DBE_FP_VDRV_FP_VDRV_OFF_LSB	0
 | 
			
		||||
 | 
			
		||||
#define DBE_FP_HDRV_FP_HDRV_ON_MSB	23
 | 
			
		||||
#define DBE_FP_HDRV_FP_HDRV_ON_LSB	12
 | 
			
		||||
#define DBE_FP_HDRV_FP_HDRV_OFF_MSB	11
 | 
			
		||||
#define DBE_FP_HDRV_FP_HDRV_OFF_LSB	0
 | 
			
		||||
 | 
			
		||||
#define DBE_FP_DE_FP_DE_ON_MSB		23
 | 
			
		||||
#define DBE_FP_DE_FP_DE_ON_LSB		12
 | 
			
		||||
#define DBE_FP_DE_FP_DE_OFF_MSB		11
 | 
			
		||||
#define DBE_FP_DE_FP_DE_OFF_LSB		0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_VSYNC_VT_VSYNC_ON_MSB        23
 | 
			
		||||
#define DBE_VT_VSYNC_VT_VSYNC_ON_LSB        12
 | 
			
		||||
#define DBE_VT_VSYNC_VT_VSYNC_OFF_MSB       11
 | 
			
		||||
#define DBE_VT_VSYNC_VT_VSYNC_OFF_LSB       0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_HSYNC_VT_HSYNC_ON_MSB        23
 | 
			
		||||
#define DBE_VT_HSYNC_VT_HSYNC_ON_LSB        12
 | 
			
		||||
#define DBE_VT_HSYNC_VT_HSYNC_OFF_MSB       11
 | 
			
		||||
#define DBE_VT_HSYNC_VT_HSYNC_OFF_LSB       0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_VBLANK_VT_VBLANK_ON_MSB        23
 | 
			
		||||
#define DBE_VT_VBLANK_VT_VBLANK_ON_LSB        12
 | 
			
		||||
#define DBE_VT_VBLANK_VT_VBLANK_OFF_MSB       11
 | 
			
		||||
#define DBE_VT_VBLANK_VT_VBLANK_OFF_LSB       0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_HBLANK_VT_HBLANK_ON_MSB        23
 | 
			
		||||
#define DBE_VT_HBLANK_VT_HBLANK_ON_LSB        12
 | 
			
		||||
#define DBE_VT_HBLANK_VT_HBLANK_OFF_MSB       11
 | 
			
		||||
#define DBE_VT_HBLANK_VT_HBLANK_OFF_LSB       0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_FLAGS_VDRV_INVERT_MSB		0
 | 
			
		||||
#define DBE_VT_FLAGS_VDRV_INVERT_LSB		0
 | 
			
		||||
#define DBE_VT_FLAGS_HDRV_INVERT_MSB		2
 | 
			
		||||
#define DBE_VT_FLAGS_HDRV_INVERT_LSB		2
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_VCMAP_VT_VCMAP_ON_MSB        23
 | 
			
		||||
#define DBE_VT_VCMAP_VT_VCMAP_ON_LSB        12
 | 
			
		||||
#define DBE_VT_VCMAP_VT_VCMAP_OFF_MSB       11
 | 
			
		||||
#define DBE_VT_VCMAP_VT_VCMAP_OFF_LSB       0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_HCMAP_VT_HCMAP_ON_MSB        23
 | 
			
		||||
#define DBE_VT_HCMAP_VT_HCMAP_ON_LSB        12
 | 
			
		||||
#define DBE_VT_HCMAP_VT_HCMAP_OFF_MSB       11
 | 
			
		||||
#define DBE_VT_HCMAP_VT_HCMAP_OFF_LSB       0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_XYMAX_VT_MAXX_MSB    11
 | 
			
		||||
#define DBE_VT_XYMAX_VT_MAXX_LSB    0
 | 
			
		||||
#define DBE_VT_XYMAX_VT_MAXY_MSB    23
 | 
			
		||||
#define DBE_VT_XYMAX_VT_MAXY_LSB    12
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_HPIXEN_VT_HPIXEN_ON_MSB      23
 | 
			
		||||
#define DBE_VT_HPIXEN_VT_HPIXEN_ON_LSB      12
 | 
			
		||||
#define DBE_VT_HPIXEN_VT_HPIXEN_OFF_MSB     11
 | 
			
		||||
#define DBE_VT_HPIXEN_VT_HPIXEN_OFF_LSB     0
 | 
			
		||||
 | 
			
		||||
#define DBE_VT_VPIXEN_VT_VPIXEN_ON_MSB      23
 | 
			
		||||
#define DBE_VT_VPIXEN_VT_VPIXEN_ON_LSB      12
 | 
			
		||||
#define DBE_VT_VPIXEN_VT_VPIXEN_OFF_MSB     11
 | 
			
		||||
#define DBE_VT_VPIXEN_VT_VPIXEN_OFF_LSB     0
 | 
			
		||||
 | 
			
		||||
#define DBE_OVR_CONTROL_OVR_DMA_ENABLE_MSB  0
 | 
			
		||||
#define DBE_OVR_CONTROL_OVR_DMA_ENABLE_LSB  0
 | 
			
		||||
 | 
			
		||||
#define DBE_OVR_INHWCTRL_OVR_DMA_ENABLE_MSB 0
 | 
			
		||||
#define DBE_OVR_INHWCTRL_OVR_DMA_ENABLE_LSB 0
 | 
			
		||||
 | 
			
		||||
#define DBE_OVR_WIDTH_TILE_OVR_FIFO_RESET_MSB       13
 | 
			
		||||
#define DBE_OVR_WIDTH_TILE_OVR_FIFO_RESET_LSB       13
 | 
			
		||||
 | 
			
		||||
#define DBE_FRM_CONTROL_FRM_DMA_ENABLE_MSB  0
 | 
			
		||||
#define DBE_FRM_CONTROL_FRM_DMA_ENABLE_LSB  0
 | 
			
		||||
#define DBE_FRM_CONTROL_FRM_TILE_PTR_MSB    31
 | 
			
		||||
#define DBE_FRM_CONTROL_FRM_TILE_PTR_LSB    9
 | 
			
		||||
#define DBE_FRM_CONTROL_FRM_LINEAR_MSB      1
 | 
			
		||||
#define DBE_FRM_CONTROL_FRM_LINEAR_LSB      1
 | 
			
		||||
 | 
			
		||||
#define DBE_FRM_INHWCTRL_FRM_DMA_ENABLE_MSB 0
 | 
			
		||||
#define DBE_FRM_INHWCTRL_FRM_DMA_ENABLE_LSB 0
 | 
			
		||||
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_WIDTH_TILE_MSB        12
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_WIDTH_TILE_LSB        5
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_RHS_MSB       4
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_RHS_LSB       0
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_DEPTH_MSB     14
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_DEPTH_LSB     13
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_FIFO_RESET_MSB        15
 | 
			
		||||
#define DBE_FRM_SIZE_TILE_FRM_FIFO_RESET_LSB        15
 | 
			
		||||
 | 
			
		||||
#define DBE_FRM_SIZE_PIXEL_FB_HEIGHT_PIX_MSB        31
 | 
			
		||||
#define DBE_FRM_SIZE_PIXEL_FB_HEIGHT_PIX_LSB        16
 | 
			
		||||
 | 
			
		||||
#define DBE_DID_CONTROL_DID_DMA_ENABLE_MSB  0
 | 
			
		||||
#define DBE_DID_CONTROL_DID_DMA_ENABLE_LSB  0
 | 
			
		||||
#define DBE_DID_INHWCTRL_DID_DMA_ENABLE_MSB 0
 | 
			
		||||
#define DBE_DID_INHWCTRL_DID_DMA_ENABLE_LSB 0
 | 
			
		||||
 | 
			
		||||
#define DBE_DID_START_XY_DID_STARTY_MSB     23
 | 
			
		||||
#define DBE_DID_START_XY_DID_STARTY_LSB     12
 | 
			
		||||
#define DBE_DID_START_XY_DID_STARTX_MSB     11
 | 
			
		||||
#define DBE_DID_START_XY_DID_STARTX_LSB     0
 | 
			
		||||
 | 
			
		||||
#define DBE_CRS_START_XY_CRS_STARTY_MSB     23
 | 
			
		||||
#define DBE_CRS_START_XY_CRS_STARTY_LSB     12
 | 
			
		||||
#define DBE_CRS_START_XY_CRS_STARTX_MSB     11
 | 
			
		||||
#define DBE_CRS_START_XY_CRS_STARTX_LSB     0
 | 
			
		||||
 | 
			
		||||
#define DBE_WID_TYP_MSB     4
 | 
			
		||||
#define DBE_WID_TYP_LSB     2
 | 
			
		||||
#define DBE_WID_BUF_MSB     1
 | 
			
		||||
#define DBE_WID_BUF_LSB     0
 | 
			
		||||
 | 
			
		||||
#define DBE_VC_START_XY_VC_STARTY_MSB       23
 | 
			
		||||
#define DBE_VC_START_XY_VC_STARTY_LSB       12
 | 
			
		||||
#define DBE_VC_START_XY_VC_STARTX_MSB       11
 | 
			
		||||
#define DBE_VC_START_XY_VC_STARTX_LSB       0
 | 
			
		||||
 | 
			
		||||
/* Constants */
 | 
			
		||||
 | 
			
		||||
#define DBE_FRM_DEPTH_8     0
 | 
			
		||||
#define DBE_FRM_DEPTH_16    1
 | 
			
		||||
#define DBE_FRM_DEPTH_32    2
 | 
			
		||||
 | 
			
		||||
#define DBE_CMODE_I8        0
 | 
			
		||||
#define DBE_CMODE_I12       1
 | 
			
		||||
#define DBE_CMODE_RG3B2     2
 | 
			
		||||
#define DBE_CMODE_RGB4      3
 | 
			
		||||
#define DBE_CMODE_ARGB5     4
 | 
			
		||||
#define DBE_CMODE_RGB8      5
 | 
			
		||||
#define DBE_CMODE_RGBA5     6
 | 
			
		||||
#define DBE_CMODE_RGB10     7
 | 
			
		||||
 | 
			
		||||
#define DBE_BMODE_BOTH      3
 | 
			
		||||
 | 
			
		||||
#define DBE_CRS_MAGIC       54
 | 
			
		||||
 | 
			
		||||
#define DBE_CLOCK_REF_KHZ	27000
 | 
			
		||||
 | 
			
		||||
/* Config Register (DBE Only) Definitions */
 | 
			
		||||
 | 
			
		||||
#define DBE_CONFIG_VDAC_ENABLE       0x00000001
 | 
			
		||||
#define DBE_CONFIG_VDAC_GSYNC        0x00000002
 | 
			
		||||
#define DBE_CONFIG_VDAC_PBLANK       0x00000004
 | 
			
		||||
#define DBE_CONFIG_FPENABLE          0x00000008
 | 
			
		||||
#define DBE_CONFIG_LENDIAN           0x00000020
 | 
			
		||||
#define DBE_CONFIG_TILEHIST          0x00000040
 | 
			
		||||
#define DBE_CONFIG_EXT_ADDR          0x00000080
 | 
			
		||||
 | 
			
		||||
#define DBE_CONFIG_FBDEV        ( DBE_CONFIG_VDAC_ENABLE | \
 | 
			
		||||
                                      DBE_CONFIG_VDAC_GSYNC  | \
 | 
			
		||||
                                      DBE_CONFIG_VDAC_PBLANK | \
 | 
			
		||||
                                      DBE_CONFIG_LENDIAN     | \
 | 
			
		||||
                                      DBE_CONFIG_EXT_ADDR )
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Available Video Timings and Corresponding Indices
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  DBE_VT_640_480_60,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_800_600_60,
 | 
			
		||||
  DBE_VT_800_600_75,
 | 
			
		||||
  DBE_VT_800_600_120,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_1024_768_50,
 | 
			
		||||
  DBE_VT_1024_768_60,
 | 
			
		||||
  DBE_VT_1024_768_75,
 | 
			
		||||
  DBE_VT_1024_768_85,
 | 
			
		||||
  DBE_VT_1024_768_120,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_1280_1024_50,
 | 
			
		||||
  DBE_VT_1280_1024_60,
 | 
			
		||||
  DBE_VT_1280_1024_75,
 | 
			
		||||
  DBE_VT_1280_1024_85,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_1600_1024_53,
 | 
			
		||||
  DBE_VT_1600_1024_60,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_1600_1200_50,
 | 
			
		||||
  DBE_VT_1600_1200_60,
 | 
			
		||||
  DBE_VT_1600_1200_75,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_1920_1080_50,
 | 
			
		||||
  DBE_VT_1920_1080_60,
 | 
			
		||||
  DBE_VT_1920_1080_72,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_1920_1200_50,
 | 
			
		||||
  DBE_VT_1920_1200_60,
 | 
			
		||||
  DBE_VT_1920_1200_66,
 | 
			
		||||
 | 
			
		||||
  DBE_VT_UNKNOWN
 | 
			
		||||
} dbe_timing_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Crime Video Timing Data Structure
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
struct dbe_timing_info
 | 
			
		||||
{
 | 
			
		||||
  dbe_timing_t type;
 | 
			
		||||
  int flags;
 | 
			
		||||
  short width;		    /* Monitor resolution		*/
 | 
			
		||||
  short height;
 | 
			
		||||
  int fields_sec;	    /* fields/sec  (Hz -3 dec. places */
 | 
			
		||||
  int cfreq;		    /* pixel clock frequency (MHz -3 dec. places) */
 | 
			
		||||
  short htotal;		    /* Horizontal total pixels	*/
 | 
			
		||||
  short hblank_start;	    /* Horizontal blank start	*/
 | 
			
		||||
  short hblank_end;	    /* Horizontal blank end		*/
 | 
			
		||||
  short hsync_start;	    /* Horizontal sync start	*/
 | 
			
		||||
  short hsync_end;	    /* Horizontal sync end		*/
 | 
			
		||||
  short vtotal;		    /* Vertical total lines		*/
 | 
			
		||||
  short vblank_start;	    /* Vertical blank start		*/
 | 
			
		||||
  short vblank_end;	    /* Vertical blank end		*/
 | 
			
		||||
  short vsync_start;	    /* Vertical sync start		*/
 | 
			
		||||
  short vsync_end;	    /* Vertical sync end		*/
 | 
			
		||||
  short pll_m;		    /* PLL M parameter		*/
 | 
			
		||||
  short pll_n;		    /* PLL P parameter		*/
 | 
			
		||||
  short pll_p;		    /* PLL N parameter		*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Defines for dbe_vof_info_t flags */
 | 
			
		||||
 | 
			
		||||
#define DBE_VOF_UNKNOWNMON    1
 | 
			
		||||
#define DBE_VOF_STEREO        2
 | 
			
		||||
#define DBE_VOF_DO_GENSYNC    4          /* enable incoming sync */
 | 
			
		||||
#define DBE_VOF_SYNC_ON_GREEN 8          /* sync on green */
 | 
			
		||||
#define DBE_VOF_FLATPANEL     0x1000     /* FLATPANEL Timing */
 | 
			
		||||
#define DBE_VOF_MAGICKEY      0x2000     /* Backdoor key */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * DBE Timing Tables
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef INCLUDE_TIMING_TABLE_DATA
 | 
			
		||||
struct dbe_timing_info dbeVTimings[] = {
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_640_480_60,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	        640,			480,		59940,			25175,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    800,	640,		        800,		656,		752,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    525,	480,		        525,		490,		    492,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    15,	    2,				3
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_800_600_60,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    800,			600,		60317,			40000,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1056,	800,		    1056,		840,		    968,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    628,	600,		    628,		601,		    605,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    3,	    1,				1
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_800_600_75,
 | 
			
		||||
    /*	flags,	width,		    height,		fields_sec,	    cfreq */
 | 
			
		||||
    0,	    800,		    600,		75000,		    49500,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1056,	800,		    1056,		816,		    896,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    625,	600,		    625,		601,		    604,
 | 
			
		||||
    /*	pll_m,	pll_n,		    pll_p */
 | 
			
		||||
    11,	    3,		        1
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_800_600_120,
 | 
			
		||||
    /*	flags,					width,		height,			fields_sec,	    cfreq */
 | 
			
		||||
    DBE_VOF_STEREO,	    800,		600,			119800,		    82978,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1040,	800,		    1040,		856,		    976,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    666,	600,		    666,		637,		    643,
 | 
			
		||||
    /*	pll_m,	pll_n,		    pll_p */
 | 
			
		||||
    31,	    5,		        1
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1024_768_50,
 | 
			
		||||
    /*	flags,	width,		    height,		fields_sec,	    cfreq */
 | 
			
		||||
    0,	    1024,		    768,		50000,		    54163,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1344,	1024,		    1344,		1048,		    1184,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    806,	768,		    806,		771,		    777,
 | 
			
		||||
    /*	pll_m,	pll_n,		    pll_p */
 | 
			
		||||
    4,	    1,		        1
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1024_768_60,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    1024,			768,		60004,			65000,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1344,	1024,		    1344,		1048,		    1184,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    806,	768,		    806,		771,		    777,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    12,	    5,				0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1024_768_75,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    1024,			768,		75029,			78750,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1312,	1024,		    1312,		1040,		    1136,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    800,	768,		    800,		769,		    772,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    29,	    5,				1
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1024_768_85,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    1024,			768,		84997,			94500,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1376,	1024,		    1376,		1072,		    1168,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    808,	768,		    808,		769,		    772,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    7,	    2,				0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1024_768_120,
 | 
			
		||||
    /*	flags,					width,		height,			fields_sec,		cfreq */
 | 
			
		||||
    DBE_VOF_STEREO,	    1024,		768,			119800,			133195,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1376,	1024,		    1376,		1072,		    1168,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    808,	768,		    808,		769,		    772,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    5,	    1,				0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1280_1024_50,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    1280,			1024,		50000,			89460,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1680,	1280,		    1680,		1360,		    1480,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    1065,	1024,		    1065,		1027,		    1030,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    10,	    3,				0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1280_1024_60,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    1280,			1024,		60020,			108000,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1688,	1280,		    1688,		1328,		    1440,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    1066,	1024,		    1066,		1025,		    1028,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    4,	    1,			    0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1280_1024_75,
 | 
			
		||||
    /*	flags,	width,			height,		fields_sec,		cfreq */
 | 
			
		||||
    0,	    1280,			1024,		75025,			135000,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1688,	1280,		    1688,		1296,		    1440,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    1066,	1024,		    1066,		1025,		    1028,
 | 
			
		||||
    /*	pll_m,	pll_n,			pll_p */
 | 
			
		||||
    5,	    1,				0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1280_1024_85,
 | 
			
		||||
    /*	flags,	width,		    height,		fields_sec,	    cfreq */
 | 
			
		||||
    0,	    1280,		    1024,		85024,		    157500,
 | 
			
		||||
    /*	htotal,	hblank_start,	hblank_end,	hsync_start,	hsync_end */
 | 
			
		||||
    1728,	1280,		    1728,		1344,		    1504,
 | 
			
		||||
    /*	vtotal,	vblank_start,	vblank_end,	vsync_start,	vsync_end */
 | 
			
		||||
    1072,	1024,		    1072,		1025,		    1028,
 | 
			
		||||
    /*	pll_m,	pll_n,		    pll_p */
 | 
			
		||||
    29,	    5,		        0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1600_1024_53,
 | 
			
		||||
    /* flags,	width,			height,		fields_sec,     cfreq */
 | 
			
		||||
    DBE_VOF_FLATPANEL | DBE_VOF_MAGICKEY,
 | 
			
		||||
    1600,			1024,		53000,			107447,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    1900,   1600,           1900,           1630,           1730,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1067,   1024,           1067,           1027,           1030,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    4,      1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1600_1024_60,
 | 
			
		||||
    /* flags,					width,          height,			fields_sec,     cfreq */
 | 
			
		||||
    DBE_VOF_FLATPANEL,   1600,           1024,			60000,          106913,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    1670,   1600,           1670,           1630,           1650,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1067,   1024,           1067,           1027,           1030,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    4,      1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1600_1200_50,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1600,           1200,           50000,          130500,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2088,   1600,           2088,           1644,           1764,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1250,   1200,           1250,           1205,           1211,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    24,     5,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1600_1200_60,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1600,           1200,           59940,          162000,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2160,   1600,           2160,           1644,           1856,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1250,   1200,           1250,           1201,           1204,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    6,		1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1600_1200_75,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1600,           1200,           75000,          202500,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2160,   1600,           2160,           1644,           1856,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1250,   1200,           1250,           1201,           1204,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    15,		2,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1920_1080_50,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1920,           1080,           50000,          133200,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2368,   1920,           2368,           1952,           2096,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1125,   1080,           1125,           1083,           1086,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    5,      1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1920_1080_60,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1920,           1080,           59940,          159840,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2368,   1920,           2368,           1952,           2096,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1125,   1080,           1125,           1083,           1086,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    6,      1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1920_1080_72,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1920,           1080,           72000,          216023,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2560,   1920,           2560,           1968,           2184,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1172,   1080,           1172,           1083,           1086,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    8,      1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1920_1200_50,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1920,           1200,           50000,          161500,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2584,   1920,           2584,           1984,           2240,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1250,   1200,           1250,           1203,           1206,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    6,      1,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1920_1200_60,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1920,           1200,           59940,          193800,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2584,   1920,           2584,           1984,           2240,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1250,   1200,           1250,           1203,           1206,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    29,     4,              0
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    DBE_VT_1920_1200_66,
 | 
			
		||||
    /* flags,  width,          height,         fields_sec,     cfreq */
 | 
			
		||||
    0,      1920,           1200,           66000,          213180,
 | 
			
		||||
    /* htotal, hblank_start,   hblank_end,     hsync_start,    hsync_end */
 | 
			
		||||
    2584,   1920,           2584,           1984,           2240,
 | 
			
		||||
    /* vtotal, vblank_start,   vblank_end,     vsync_start,    vsync_end */
 | 
			
		||||
    1250,   1200,           1250,           1203,           1206,
 | 
			
		||||
    /* pll_m,  pll_n,          pll_p */
 | 
			
		||||
    8,      1,              0
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // INCLUDE_TIMING_TABLE_DATA
 | 
			
		||||
 | 
			
		||||
#endif // ! __SGIVWFB_H__
 | 
			
		||||
@ -13,15 +13,6 @@ config SOUND_BCM_CS4297A
 | 
			
		||||
	  note that CONFIG_KGDB should not be enabled at the same
 | 
			
		||||
	  time, since it also attempts to use this UART port.
 | 
			
		||||
 | 
			
		||||
config SOUND_VWSND
 | 
			
		||||
	tristate "SGI Visual Workstation Sound"
 | 
			
		||||
	depends on X86_VISWS
 | 
			
		||||
	help
 | 
			
		||||
	  Say Y or M if you have an SGI Visual Workstation and you want to be
 | 
			
		||||
	  able to use its on-board audio.  Read
 | 
			
		||||
	  <file:Documentation/sound/oss/vwsnd> for more info on this driver's
 | 
			
		||||
	  capabilities.
 | 
			
		||||
 | 
			
		||||
config SOUND_MSNDCLAS
 | 
			
		||||
	tristate "Support for Turtle Beach MultiSound Classic, Tahiti, Monterey"
 | 
			
		||||
	depends on (m || !STANDALONE) && ISA
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,6 @@ obj-$(CONFIG_SOUND_VIDC)	+= vidc_mod.o
 | 
			
		||||
obj-$(CONFIG_SOUND_WAVEARTIST)	+= waveartist.o
 | 
			
		||||
obj-$(CONFIG_SOUND_MSNDCLAS)	+= msnd.o msnd_classic.o
 | 
			
		||||
obj-$(CONFIG_SOUND_MSNDPIN)	+= msnd.o msnd_pinnacle.o
 | 
			
		||||
obj-$(CONFIG_SOUND_VWSND)	+= vwsnd.o
 | 
			
		||||
obj-$(CONFIG_SOUND_BCM_CS4297A)	+= swarm_cs4297a.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_DMASOUND)		+= dmasound/
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3506
									
								
								sound/oss/vwsnd.c
									
									
									
									
									
								
							
							
						
						
									
										3506
									
								
								sound/oss/vwsnd.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user