Cleaned up CS5536 ATA compat support
This commit is contained in:
parent
02602a7002
commit
b0979f1191
3 changed files with 25 additions and 54 deletions
77
disk/ata.c
77
disk/ata.c
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue