From 1e4d5a6089a60f9569a16ecaf285b6b4a4e75259 Mon Sep 17 00:00:00 2001
From: Rudolf Cornelissen
Date: Tue, 2 Nov 2004 13:58:22 +0000
Subject: [PATCH] fixed VGA BIOS ROM dump to file option, updated docs, updated
default settings.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9738 a95241bf-73f2-0310-859d-f6bbb57e9c96
---
.../drivers/graphics/neomagic/UPDATE.html | 6 +-
.../kernel/drivers/graphics/neomagic/driver.c | 86 +++++++++++++------
.../drivers/graphics/neomagic/nm.settings | 2 +-
3 files changed, 67 insertions(+), 27 deletions(-)
diff --git a/src/add-ons/kernel/drivers/graphics/neomagic/UPDATE.html b/src/add-ons/kernel/drivers/graphics/neomagic/UPDATE.html
index 0fa88a7d6c..b94c38a4a0 100644
--- a/src/add-ons/kernel/drivers/graphics/neomagic/UPDATE.html
+++ b/src/add-ons/kernel/drivers/graphics/neomagic/UPDATE.html
@@ -4,13 +4,15 @@
Changes done for each driverversion:
-head 0.09 (Rudolf)
+head 0.10 (Rudolf)
- Added full 2D acceleration for all remaining cards that did not have that yet with this driver (still largely untested);
- Fixed a long standing problem with MagicMedia (all NM2200 and later) cards with overlay: buffer width is programmed correctly now. Can't believe I didn't see that before!
- Updated NM2200 and later cards workspace virtualsize restrictions for accelerated modes: it turns out these cards engines have the same restrictions as most older ones, being 1600x1024 resolution;
- Updated overlay scaling restrictions: officially the cards support upto and including 8x upscaling;
- Fixed error regarding calculating overlay engine register value for right-clipping video output: on NM2200 and later this was (probably) responsible for the big-time output distortions even without clipping!
+
- Fixed BIOS ROM dump (to file) option;
+
- Fixed GET_TIMING_CONSTRAINTS and GET_ACCELERANT_DEVICE_INFO accelerant hooks to return valid data; updated modeline checking and modification code (used by ProposeDisplayMode) to adhere to one more timing constraint.
nm_driver 0.06 (Rudolf)
@@ -61,7 +63,7 @@ Acceleration engine benchmarked and tested for errors with BeRoMeter V1.2.6.
Still todo:
- fix for trouble with booting into modes above 800x600 resolution on some cards (please report this behaviour!);
-
- MagicMedia series overlay update: still contains errors???.
+
- setup workarounds for MagicMedia series overlay engine and 2D acceleration engine hardware faults.
diff --git a/src/add-ons/kernel/drivers/graphics/neomagic/driver.c b/src/add-ons/kernel/drivers/graphics/neomagic/driver.c
index 9eb81d9c9a..bb61c5cd10 100644
--- a/src/add-ons/kernel/drivers/graphics/neomagic/driver.c
+++ b/src/add-ons/kernel/drivers/graphics/neomagic/driver.c
@@ -5,7 +5,7 @@
Other authors:
Mark Watson;
Apsed;
- Rudolf Cornelissen 5/2002-8/2004.
+ Rudolf Cornelissen 5/2002-11/2004.
*/
/* standard kernel driver stuff */
@@ -129,15 +129,22 @@ static settings current_settings = { // see comments in nm.settings
// for accelerant
0x00000000, // logmask
0, // memory
- false, // usebios
- false, // hardcursor
+ true, // usebios
+ true, // hardcursor
};
-static void dumprom (void *rom, size_t size)
+static void dumprom (void *rom, uint32 size)
{
- int fd = open ("/boot/home/" DRIVER_PREFIX ".rom", O_WRONLY | O_CREAT, 0666);
+ int fd;
+ uint32 cnt;
+
+ fd = open ("/boot/home/" DRIVER_PREFIX ".rom", O_WRONLY | O_CREAT, 0666);
if (fd < 0) return;
- write (fd, rom, size);
+
+ /* apparantly max. 32kb may be written at once;
+ * the ROM size is a multiple of that anyway. */
+ for (cnt = 0; (cnt < size); cnt += 32768)
+ write (fd, ((void *)(((uint8 *)rom) + cnt)), 32768);
close (fd);
}
@@ -317,8 +324,8 @@ static status_t map_device(device_info *di)
pci_info *pcii = &(di->pcii);
system_info sysinfo;
- /*variables for making copy of ROM*/
- char * rom_temp;
+ /* variables for making copy of ROM */
+ uint8* rom_temp;
area_id rom_area;
int frame_buffer = 0;
@@ -408,19 +415,46 @@ static status_t map_device(device_info *di)
di->pcii.vendor_id, di->pcii.device_id,
di->pcii.bus, di->pcii.device, di->pcii.function);
- /*place ROM over the fbspace (this is definately safe)*/
- tmpUlong = di->pcii.u.h0.base_registers[frame_buffer];
- tmpUlong |= 0x00000001;
- set_pci(PCI_rom_base, 4, tmpUlong);
+ /* get ROM memory mapped base adress - this is defined in the PCI standard */
+ tmpUlong = get_pci(PCI_rom_base, 4);
+ if (tmpUlong)
+ {
+ /* ROM was assigned an adress, so enable ROM decoding - see PCI standard */
+ tmpUlong |= 0x00000001;
+ set_pci(PCI_rom_base, 4, tmpUlong);
- rom_area = map_physical_memory(
- buffer,
- (void *)di->pcii.u.h0.base_registers[frame_buffer],
- 32768,
- B_ANY_KERNEL_ADDRESS,
- B_READ_AREA,
- (void **)&(rom_temp)
- );
+ rom_area = map_physical_memory(
+ buffer,
+ (void *)di->pcii.u.h0.rom_base_pci,
+ di->pcii.u.h0.rom_size,
+ B_ANY_KERNEL_ADDRESS,
+ B_READ_AREA,
+ (void **)&(rom_temp)
+ );
+
+ /* check if we got the BIOS signature (might fail on laptops..) */
+ if (rom_temp[0]!=0x55 || rom_temp[1]!=0xaa)
+ {
+ /* apparantly no ROM is mapped here */
+ delete_area(rom_area);
+ rom_area = -1;
+ /* force using ISA legacy map as fall-back */
+ tmpUlong = 0x00000000;
+ }
+ }
+
+ if (!tmpUlong)
+ {
+ /* ROM was not assigned an adress, fetch it from ISA legacy memory map! */
+ rom_area = map_physical_memory(
+ buffer,
+ (void *)0x000c0000,
+ 32768,
+ B_ANY_KERNEL_ADDRESS,
+ B_READ_AREA,
+ (void **)&(rom_temp)
+ );
+ }
/* if mapping ROM to vmem failed then clean up and pass on error */
if (rom_area < 0) {
@@ -437,12 +471,16 @@ static status_t map_device(device_info *di)
return rom_area;
}
- /* make a copy of ROM for future reference*/
- memcpy (si->rom_mirror, rom_temp, 32768);
+ /* dump ROM to file if selected in nm.settings
+ * (ROM should always fit in 32Kb) */
if (current_settings.dumprom) dumprom (rom_temp, 32768);
+ /* make a copy of ROM for future reference */
+ memcpy (si->rom_mirror, rom_temp, 32768);
- /*disable ROM and delete the area*/
- set_pci(PCI_rom_base,4,0);
+ /* disable ROM decoding - this is defined in the PCI standard, and delete the area */
+ tmpUlong = get_pci(PCI_rom_base, 4);
+ tmpUlong &= 0xfffffffe;
+ set_pci(PCI_rom_base, 4, tmpUlong);
delete_area(rom_area);
/* work out a name for the framebuffer mapping*/
diff --git a/src/add-ons/kernel/drivers/graphics/neomagic/nm.settings b/src/add-ons/kernel/drivers/graphics/neomagic/nm.settings
index 9c9f0334f0..6e973d87dc 100644
--- a/src/add-ons/kernel/drivers/graphics/neomagic/nm.settings
+++ b/src/add-ons/kernel/drivers/graphics/neomagic/nm.settings
@@ -8,7 +8,7 @@
# accelerant "nm.accelerant"
# nm.accelerant parameters
-usebios false # if true rely on bios to coldstart the card instead of driver
+usebios true # if true rely on bios to coldstart the card instead of driver
#memory 2048 # in Kb, override builtin memory size detection
hardcursor true # if true use on-chip cursor capabilities
#logmask 0x00000000 # nothing logged, except errors, is default