Make the test for ATA PCI legacy addressing mode more robust.
Add code (currently ifdef'd out) to allow ATA PCI native addressing. Fix the altio offset for ATA PCI devices.
This commit is contained in:
parent
111e172d35
commit
4ee3fbe86b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=128530
@ -2662,7 +2662,7 @@ ata_setup_interrupt(device_t dev)
|
||||
struct ata_pci_controller *ctlr = device_get_softc(dev);
|
||||
int rid = ATA_IRQ_RID;
|
||||
|
||||
if (!ATA_MASTERDEV(dev)) {
|
||||
if (!ata_legacy(dev)) {
|
||||
if (!(ctlr->r_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
||||
RF_SHAREABLE | RF_ACTIVE))) {
|
||||
device_printf(dev, "unable to map interrupt\n");
|
||||
|
@ -62,6 +62,15 @@ static int ata_pci_allocate(device_t, struct ata_channel *);
|
||||
static void ata_pci_dmainit(struct ata_channel *);
|
||||
static void ata_pci_locknoop(struct ata_channel *, int);
|
||||
|
||||
int
|
||||
ata_legacy(device_t dev)
|
||||
{
|
||||
return ((pci_read_config(dev, PCIR_PROGIF, 1)&PCIP_STORAGE_IDE_MASTERDEV) &&
|
||||
((pci_read_config(dev, PCIR_PROGIF, 1) &
|
||||
(PCIP_STORAGE_IDE_MODEPRIM | PCIP_STORAGE_IDE_MODESEC)) !=
|
||||
(PCIP_STORAGE_IDE_MODEPRIM | PCIP_STORAGE_IDE_MODESEC)));
|
||||
}
|
||||
|
||||
static int
|
||||
ata_pci_probe(device_t dev)
|
||||
{
|
||||
@ -155,10 +164,11 @@ ata_pci_attach(device_t dev)
|
||||
{
|
||||
struct ata_pci_controller *ctlr = device_get_softc(dev);
|
||||
u_int32_t cmd;
|
||||
int unit;
|
||||
u_int8_t progif;
|
||||
int unit, prisec = 0;
|
||||
|
||||
/* do chipset specific setups only needed once */
|
||||
if (ATA_MASTERDEV(dev) || pci_read_config(dev, 0x18, 4) & IOMASK)
|
||||
if (ata_legacy(dev) || pci_read_config(dev, 0x18, 4) & IOMASK)
|
||||
ctlr->channels = 2;
|
||||
else
|
||||
ctlr->channels = 1;
|
||||
@ -166,6 +176,26 @@ ata_pci_attach(device_t dev)
|
||||
ctlr->dmainit = ata_pci_dmainit;
|
||||
ctlr->locking = ata_pci_locknoop;
|
||||
|
||||
progif = pci_read_config(dev, PCIR_PROGIF, 1);
|
||||
if ((progif & 0x85) == 0x80)
|
||||
prisec = 1;
|
||||
|
||||
/* if this device supports PCI native addressing use it */
|
||||
#if 0
|
||||
if ((progif & 0x8a) == 0x8a) {
|
||||
if (pci_read_config(dev, PCIR_BAR(0), 4) &&
|
||||
pci_read_config(dev, PCIR_BAR(2), 4)) {
|
||||
device_printf(dev, "setting native PCI addressing mode ");
|
||||
pci_write_config(dev, PCIR_PROGIF, progif | 0x05, 1);
|
||||
if ((pci_read_config(dev, PCIR_PROGIF, 1) & 0x05) != 0x05) {
|
||||
pci_write_config(dev, PCIR_PROGIF, progif & ~0x05, 1);
|
||||
printf("failed, using compat method\n");
|
||||
}
|
||||
else
|
||||
printf("succeded\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* if needed try to enable busmastering */
|
||||
cmd = pci_read_config(dev, PCIR_COMMAND, 2);
|
||||
if (!(cmd & PCIM_CMD_BUSMASTEREN)) {
|
||||
@ -185,7 +215,7 @@ ata_pci_attach(device_t dev)
|
||||
|
||||
/* attach all channels on this controller */
|
||||
for (unit = 0; unit < ctlr->channels; unit++)
|
||||
device_add_child(dev, "ata", ATA_MASTERDEV(dev) ?
|
||||
device_add_child(dev, "ata", prisec ?
|
||||
unit : devclass_find_free_unit(ata_devclass, 2));
|
||||
|
||||
return bus_generic_attach(dev);
|
||||
@ -227,7 +257,7 @@ ata_pci_print_child(device_t dev, device_t child)
|
||||
retval += bus_print_child_header(dev, child);
|
||||
retval += printf(": at 0x%lx", rman_get_start(ch->r_io[ATA_IDX_ADDR].res));
|
||||
|
||||
if (ATA_MASTERDEV(dev))
|
||||
if (ata_legacy(dev))
|
||||
retval += printf(" irq %d", 14 + ch->unit);
|
||||
|
||||
retval += bus_print_child_footer(dev, child);
|
||||
@ -247,7 +277,7 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
|
||||
if (type == SYS_RES_IOPORT) {
|
||||
switch (*rid) {
|
||||
case ATA_IOADDR_RID:
|
||||
if (ATA_MASTERDEV(dev)) {
|
||||
if (ata_legacy(dev)) {
|
||||
start = (unit ? ATA_SECONDARY : ATA_PRIMARY);
|
||||
count = ATA_IOSIZE;
|
||||
end = start + count - 1;
|
||||
@ -259,7 +289,7 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
|
||||
break;
|
||||
|
||||
case ATA_ALTADDR_RID:
|
||||
if (ATA_MASTERDEV(dev)) {
|
||||
if (ata_legacy(dev)) {
|
||||
start = (unit ? ATA_SECONDARY : ATA_PRIMARY) + ATA_ALTOFFSET;
|
||||
count = ATA_ALTIOSIZE;
|
||||
end = start + count - 1;
|
||||
@ -274,7 +304,7 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
|
||||
}
|
||||
|
||||
if (type == SYS_RES_IRQ && *rid == ATA_IRQ_RID) {
|
||||
if (ATA_MASTERDEV(dev)) {
|
||||
if (ata_legacy(dev)) {
|
||||
#ifdef __alpha__
|
||||
return alpha_platform_alloc_ide_intr(unit);
|
||||
#else
|
||||
@ -316,7 +346,7 @@ ata_pci_release_resource(device_t dev, device_t child, int type, int rid,
|
||||
if (rid != ATA_IRQ_RID)
|
||||
return ENOENT;
|
||||
|
||||
if (ATA_MASTERDEV(dev)) {
|
||||
if (ata_legacy(dev)) {
|
||||
#ifdef __alpha__
|
||||
return alpha_platform_release_ide_intr(unit, r);
|
||||
#else
|
||||
@ -335,7 +365,7 @@ ata_pci_setup_intr(device_t dev, device_t child, struct resource *irq,
|
||||
int flags, driver_intr_t *function, void *argument,
|
||||
void **cookiep)
|
||||
{
|
||||
if (ATA_MASTERDEV(dev)) {
|
||||
if (ata_legacy(dev)) {
|
||||
#ifdef __alpha__
|
||||
return alpha_platform_setup_ide_intr(child, irq, function, argument,
|
||||
cookiep);
|
||||
@ -359,7 +389,7 @@ static int
|
||||
ata_pci_teardown_intr(device_t dev, device_t child, struct resource *irq,
|
||||
void *cookie)
|
||||
{
|
||||
if (ATA_MASTERDEV(dev)) {
|
||||
if (ata_legacy(dev)) {
|
||||
#ifdef __alpha__
|
||||
return alpha_platform_teardown_ide_intr(child, irq, cookie);
|
||||
#else
|
||||
@ -402,7 +432,7 @@ ata_pci_allocate(device_t dev, struct ata_channel *ch)
|
||||
ch->r_io[i].offset = i;
|
||||
}
|
||||
ch->r_io[ATA_ALTSTAT].res = altio;
|
||||
ch->r_io[ATA_ALTSTAT].offset = 0;
|
||||
ch->r_io[ATA_ALTSTAT].offset = ata_legacy(device_get_parent(dev)) ? 0 : 2;
|
||||
ch->r_io[ATA_IDX_ADDR].res = io;
|
||||
|
||||
if (ctlr->r_res1) {
|
||||
|
@ -63,9 +63,6 @@ struct ata_pci_controller {
|
||||
void *driver;
|
||||
};
|
||||
|
||||
#define ATA_MASTERDEV(dev) ((pci_get_progif(dev) & 0x80) && \
|
||||
(pci_get_progif(dev) & 0x05) != 0x05)
|
||||
|
||||
/* defines for known chipset PCI id's */
|
||||
#define ATA_ACARD_ID 0x1191
|
||||
#define ATA_ATP850 0x00021191
|
||||
@ -295,6 +292,8 @@ struct ata_pci_controller {
|
||||
#define VIABUG 0x10
|
||||
|
||||
/* global prototypes */
|
||||
int ata_legacy(device_t);
|
||||
|
||||
void ata_dmainit(struct ata_channel *);
|
||||
int ata_dmastart(struct ata_channel *, caddr_t, int32_t, int);
|
||||
int ata_dmastop(struct ata_channel *);
|
||||
|
Loading…
Reference in New Issue
Block a user