finalized MMS (multihead) card support. Fixed system crashing with null pointer if 'secondary' mms card in system was used on it's non-primary heads while it's primary head was not in use. (hope this is readable :). In other words: rewrote copying ROMs for MMS cards. Kerneldriver now holds images for each card and head inside the kerneldriver independant of a card's driver being actually used or not. multihead cards can now be used as you wish: they nolonger need to be the 'primary' card in your system. hehe: 6 heads running here (two on a dualhead nvidia while 4 in a matrox mms. Test harness much in use, as all those cards still can't be used otherwise on BeOS.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15211 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<p><h2>Changes done for each driverversion:</h2></p>
|
<p><h2>Changes done for each driverversion:</h2></p>
|
||||||
<p><h1>head (SVN 0.25, Rudolf)</h1></p>
|
<p><h1>head (SVN 0.26, Rudolf)</h1></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>G200-G550:</strong>
|
<li><strong>G200-G550:</strong>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ struct device_info {
|
|||||||
vuint32 *regs; /* kernel's pointer to memory mapped registers */
|
vuint32 *regs; /* kernel's pointer to memory mapped registers */
|
||||||
pci_info pcii; /* a convenience copy of the pci info for this device */
|
pci_info pcii; /* a convenience copy of the pci info for this device */
|
||||||
char name[B_OS_NAME_LENGTH]; /* where we keep the name of the device for publishing and comparing */
|
char name[B_OS_NAME_LENGTH]; /* where we keep the name of the device for publishing and comparing */
|
||||||
|
uint8 rom_mirror[32768]; /* mirror of the ROM (is needed for MMS cards) */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -76,6 +77,7 @@ static status_t write_hook (void* dev, off_t pos, const void* buf, size_t* len);
|
|||||||
static status_t control_hook (void* dev, uint32 msg, void *buf, size_t len);
|
static status_t control_hook (void* dev, uint32 msg, void *buf, size_t len);
|
||||||
static status_t map_device(device_info *di);
|
static status_t map_device(device_info *di);
|
||||||
static void unmap_device(device_info *di);
|
static void unmap_device(device_info *di);
|
||||||
|
static void copy_rom(device_info *di);
|
||||||
static void probe_devices(void);
|
static void probe_devices(void);
|
||||||
static int32 gx00_interrupt(void *data);
|
static int32 gx00_interrupt(void *data);
|
||||||
|
|
||||||
@@ -416,8 +418,8 @@ static status_t map_device(device_info *di)
|
|||||||
}
|
}
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
/* make the copy from the primary VGA card */
|
/* make the copy from the primary VGA card on our bus */
|
||||||
memcpy (si->rom_mirror, pd->di[index].si->rom_mirror, 32768);
|
memcpy (si->rom_mirror, pd->di[index].rom_mirror, 32768);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -569,6 +571,62 @@ static void unmap_device(device_info *di) {
|
|||||||
di->regs = NULL;
|
di->regs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void copy_rom(device_info *di)
|
||||||
|
{
|
||||||
|
char buffer[B_OS_NAME_LENGTH];
|
||||||
|
uint8 *rom_temp;
|
||||||
|
area_id rom_area;
|
||||||
|
uint32 tmpUlong;
|
||||||
|
pci_info *pcii = &(di->pcii);
|
||||||
|
|
||||||
|
/* MIL1 has frame_buffer in [1], while MIL2 and later have frame_buffer in [0] */
|
||||||
|
int frame_buffer = 0;
|
||||||
|
/* correct layout for MIL1 */
|
||||||
|
//fixme: checkout Mystique 170 and 220...
|
||||||
|
if (di->pcii.device_id == 0x0519) frame_buffer = 1;
|
||||||
|
|
||||||
|
/* enable memory mapped IO, disable VGA I/O - this is standard*/
|
||||||
|
tmpUlong = get_pci(PCI_command, 4);
|
||||||
|
tmpUlong |= 0x00000002;
|
||||||
|
tmpUlong &= 0xfffffffe;
|
||||||
|
set_pci(PCI_command, 4, tmpUlong);
|
||||||
|
|
||||||
|
/* work out a name for the ROM mapping*/
|
||||||
|
sprintf(buffer, DEVICE_FORMAT " rom",
|
||||||
|
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);
|
||||||
|
|
||||||
|
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)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* if mapping ROM to vmem was successfull copy it */
|
||||||
|
if (rom_area >= 0)
|
||||||
|
{
|
||||||
|
/* copy ROM for future reference (MMS cards) */
|
||||||
|
memcpy (di->rom_mirror, rom_temp, 32768);
|
||||||
|
|
||||||
|
/* disable ROM and delete the area */
|
||||||
|
set_pci(PCI_rom_base, 4, 0);
|
||||||
|
delete_area(rom_area);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable memory mapped IO */
|
||||||
|
tmpUlong = get_pci(PCI_command, 4);
|
||||||
|
tmpUlong &= 0xfffffffc;
|
||||||
|
set_pci(PCI_command, 4, tmpUlong);
|
||||||
|
}
|
||||||
|
|
||||||
static void probe_devices(void)
|
static void probe_devices(void)
|
||||||
{
|
{
|
||||||
uint32 pci_index = 0;
|
uint32 pci_index = 0;
|
||||||
@@ -612,6 +670,10 @@ static void probe_devices(void)
|
|||||||
di->shared_area = -1;
|
di->shared_area = -1;
|
||||||
/* mark pointer to shared data as invalid */
|
/* mark pointer to shared data as invalid */
|
||||||
di->si = NULL;
|
di->si = NULL;
|
||||||
|
/* copy ROM for MMS (multihead with multiple GPU) cards:
|
||||||
|
* they might only have a ROM on the primary adaptor.
|
||||||
|
* (Confirmed G200MMS.) */
|
||||||
|
copy_rom(di);
|
||||||
/* inc pointer to device info */
|
/* inc pointer to device info */
|
||||||
di++;
|
di++;
|
||||||
/* inc count */
|
/* inc count */
|
||||||
|
|||||||
Reference in New Issue
Block a user