Cleaned up CS5536 ATA compat support

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2009-11-06 22:50:44 +01:00
parent 02602a7002
commit b0979f1191
3 changed files with 25 additions and 54 deletions

View file

@ -27,10 +27,8 @@
#include <grub/machine/machine.h> #include <grub/machine/machine.h>
/* At the moment, only two IDE ports are supported. */ /* At the moment, only two IDE ports are supported. */
static const grub_port_t grub_ata_ioaddress[] = { 0xbfd001f0}; static const grub_port_t grub_ata_ioaddress[] = { 0x1f0, 0x170 };
static const grub_port_t grub_ata_ioaddress2[] = { 0xbfd003f6}; static const grub_port_t grub_ata_ioaddress2[] = { 0x3f6, 0x376 };
//static const grub_port_t grub_ata_ioaddress[] = { 0x1f0, 0x170 };
//static const grub_port_t grub_ata_ioaddress2[] = { 0x3f6, 0x376 };
static struct grub_ata_device *grub_ata_devices; static struct grub_ata_device *grub_ata_devices;
@ -350,8 +348,8 @@ grub_ata_device_initialize (int port, int device, int addr, int addr2)
/* Setup the device information. */ /* Setup the device information. */
dev->port = port; dev->port = port;
dev->device = device; dev->device = device;
dev->ioaddress = addr; dev->ioaddress = addr + GRUB_MACHINE_PCI_IO_BASE;
dev->ioaddress2 = addr2; dev->ioaddress2 = addr2 + GRUB_MACHINE_PCI_IO_BASE;
dev->next = NULL; dev->next = NULL;
grub_ata_regset (dev, GRUB_ATA_REG_DISK, dev->device << 4); grub_ata_regset (dev, GRUB_ATA_REG_DISK, dev->device << 4);
@ -390,10 +388,9 @@ grub_ata_device_initialize (int port, int device, int addr, int addr2)
return 0; return 0;
} }
#if 0
static int NESTED_FUNC_ATTR static int NESTED_FUNC_ATTR
grub_ata_pciinit (grub_pci_device_t dev, grub_ata_pciinit (grub_pci_device_t dev,
grub_pci_id_t pciid __attribute__((unused))) grub_pci_id_t pciid)
{ {
static int compat_use[2] = { 0 }; static int compat_use[2] = { 0 };
grub_pci_address_t addr; grub_pci_address_t addr;
@ -404,19 +401,34 @@ grub_ata_pciinit (grub_pci_device_t dev,
int regb; int regb;
int i; int i;
static int controller = 0; static int controller = 0;
int cs5536 = 0;
int nports = 2;
/* Read class. */ /* Read class. */
addr = grub_pci_make_address (dev, 2); addr = grub_pci_make_address (dev, 2);
class = grub_pci_read (addr); class = grub_pci_read (addr);
/* AMD CS5536 Southbridge. */
if (pciid == 0x208f1022)
{
cs5536 = 1;
nports = 1;
}
/* Check if this class ID matches that of a PCI IDE Controller. */ /* Check if this class ID matches that of a PCI IDE Controller. */
if (class >> 16 != 0x0101) if (!cs5536 && (class >> 16 != 0x0101))
return 0; return 0;
for (i = 0; i < 2; i++) for (i = 0; i < nports; i++)
{ {
/* Set to 0 when the channel operated in compatibility mode. */ /* Set to 0 when the channel operated in compatibility mode. */
int compat = (class >> (8 + 2 * i)) & 1; int compat;
/* We don't support non-compatibility mode for CS5536. */
if (cs5536)
compat = 0;
else
compat = (class >> (8 + 2 * i)) & 1;
rega = 0; rega = 0;
regb = 0; regb = 0;
@ -488,49 +500,6 @@ grub_ata_initialize (void)
grub_pci_iterate (grub_ata_pciinit); grub_pci_iterate (grub_ata_pciinit);
return 0; return 0;
} }
#endif
static grub_err_t
grub_ata_initialize (void)
{
int rega;
int regb;
rega = grub_ata_ioaddress[0];
regb = grub_ata_ioaddress2[0];
grub_dprintf ("ata",
"rega=0x%x regb=0x%x\n",
rega, regb);
if (rega && regb)
{
grub_errno = GRUB_ERR_NONE;
grub_ata_device_initialize (0, 0, rega, regb);
/* Most errors raised by grub_ata_device_initialize() are harmless.
They just indicate this particular drive is not responding, most
likely because it doesn't exist. We might want to ignore specific
error types here, instead of printing them. */
if (grub_errno)
{
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
}
grub_ata_device_initialize (0, 1, rega, regb);
/* Likewise. */
if (grub_errno)
{
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
}
}
return 0;
}
static void static void
grub_ata_setlba (struct grub_ata_device *dev, grub_disk_addr_t sector, grub_ata_setlba (struct grub_ata_device *dev, grub_disk_addr_t sector,

View file

@ -22,6 +22,7 @@
#include <grub/types.h> #include <grub/types.h>
#include <grub/i386/io.h> #include <grub/i386/io.h>
#define GRUB_MACHINE_PCI_IO_BASE 0
#define GRUB_PCI_ADDR_REG 0xcf8 #define GRUB_PCI_ADDR_REG 0xcf8
#define GRUB_PCI_DATA_REG 0xcfc #define GRUB_PCI_DATA_REG 0xcfc
#define GRUB_PCI_NUM_BUS 256 #define GRUB_PCI_NUM_BUS 256

View file

@ -25,6 +25,7 @@
#define GRUB_PCI_NUM_BUS 1 #define GRUB_PCI_NUM_BUS 1
#define GRUB_PCI_NUM_DEVICES 16 #define GRUB_PCI_NUM_DEVICES 16
#define GRUB_MACHINE_PCI_IO_BASE 0xbfd00000
#define GRUB_MACHINE_PCI_CONFSPACE 0xbfe80000 #define GRUB_MACHINE_PCI_CONFSPACE 0xbfe80000
#define GRUB_MACHINE_PCI_CONF_CTRL_REG (*(volatile grub_uint32_t *) 0xbfe00118) #define GRUB_MACHINE_PCI_CONF_CTRL_REG (*(volatile grub_uint32_t *) 0xbfe00118)
#define GRUB_MACHINE_PCI_IO_CTRL_REG (*(volatile grub_uint32_t *) 0xbfe00110) #define GRUB_MACHINE_PCI_IO_CTRL_REG (*(volatile grub_uint32_t *) 0xbfe00110)