Re: Adding flag to disable native mode on aceride
Jason Thorpe <[email protected]> Thu, 30 Aug 2007 15:57:04 -0700
| Newsgroups | gmane.os.netbsd.devel.kernel,gmane.os.netbsd.ports.cats |
|---|---|
| Message-ID | <[email protected]> |
On Aug 29, 2007, at 2:08 AM, Chris Gilbert wrote: > Hi, > > I've been trying to work-around a bug with the ABLE BIOS for cats. > The > issue is that ABLE enables native mode on the aceride chipset. > However, > it fails to put in place any of the interrupt routing, IE it doesn't > setup the interrupts to route out onto the PCI bus or internally to > isa > interrupts. > > I've considered different way to workaround this, eg fix up the > routing, > detect broken routing and disable Native mode etc. However even with > fixed routing the secondary channel doesn't work as it's not on the > same > IRQ as the primary, and the IDE code assumes it will be. > > I think the best thing to do is to force the chipset back to compat > mode > with a flag. > > To this end I've taken the next spare flag for PCIIDE, and used it to > indicate that the aceride should be using compat mode. Don't do this. Instead, CATS' device_register() should detect that the device in question is the built-in ACER IDE interface, and set a property. Aceride can then consult the property and do the right thing. > > > This then allows control from the config file, so in cats config files > we can workaround the BIOS issue. > > Attached is a diff (including man page update) to use a flag to do > this. > The change to the config file is to just tag a flags value on the end: > aceride* at pci? dev ? function ? flags 0x0004 # Acer Lab IDE > controllers > > Does this look ok? I'd like to check in the chage in then next couple > of days. > > Thanks, > Chris > Index: share/man/man4/aceride.4 > =================================================================== > RCS file: /cvsroot/src/share/man/man4/aceride.4,v > retrieving revision 1.2 > diff -u -p -r1.2 aceride.4 > --- share/man/man4/aceride.4 8 Oct 2003 13:39:11 -0000 1.2 > +++ share/man/man4/aceride.4 29 Aug 2007 09:06:33 -0000 > @@ -49,6 +49,13 @@ driver to disable DMA on chipsets for wh > enabled. > This can be used as a debugging aid, or to work around > problems where the IDE controller is wired up to the system > incorrectly. > +.Pp > +The 0x0004 flag forces the > +.Nm > +driver to disable Native mode on chipsets for which Native mode would > +normally be enabled. > +This can be used to work around problems where the BIOS has not > configured > +mappings for the native interrupts. > .Sh SEE ALSO > .Xr ata 4 , > .Xr atapi 4 , > Index: sys/dev/pci/pciidevar.h > =================================================================== > RCS file: /cvsroot/src/sys/dev/pci/pciidevar.h,v > retrieving revision 1.35 > diff -u -p -r1.35 pciidevar.h > --- sys/dev/pci/pciidevar.h 17 Oct 2006 13:45:05 -0000 1.35 > +++ sys/dev/pci/pciidevar.h 29 Aug 2007 09:06:33 -0000 > @@ -47,6 +47,7 @@ > /* options passed via the 'flags' config keyword */ > #define PCIIDE_OPTIONS_DMA 0x01 > #define PCIIDE_OPTIONS_NODMA 0x02 > +#define PCIIDE_OPTIONS_FORCE_COMPAT 0x04 > > #ifndef ATADEBUG > #define ATADEBUG > Index: sys/dev/pci/aceride.c > =================================================================== > RCS file: /cvsroot/src/sys/dev/pci/aceride.c,v > retrieving revision 1.23 > diff -u -p -r1.23 aceride.c > --- sys/dev/pci/aceride.c 9 Feb 2007 21:55:27 -0000 1.23 > +++ sys/dev/pci/aceride.c 29 Aug 2007 09:06:33 -0000 > @@ -167,7 +167,14 @@ acer_chip_map(struct pciide_softc *sc, s > ~ACER_CHANSTATUSREGS_RO); > cr = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG); > cr |= (PCIIDE_CHANSTATUS_EN << PCI_INTERFACE_SHIFT); > + > + if (device_cfdata(&sc->sc_wdcdev.sc_atac.atac_dev)->cf_flags & > + PCIIDE_OPTIONS_FORCE_COMPAT) > + cr &= ~((PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1)) > + << PCI_INTERFACE_SHIFT); > + > pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG, cr); > + > /* Don't use cr, re-read the real register content instead */ > interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, > PCI_CLASS_REG)); -- thorpej