Subject: Re: Adding flag to disable native mode on aceride
To: Chris Gilbert <chris@dokein.co.uk>
From: Jason Thorpe <thorpej@shagadelic.org>
List: tech-kern
Date: 08/30/2007 15:57:04
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