Re: IDE broken on Pegasos PPC platform - Kernel

This is a discussion on Re: IDE broken on Pegasos PPC platform - Kernel ; Yeah I'll ack it if it matters, although I'd make a nit about the fixing of device tree entries in prom_init and have it moved to nvramrc or a Forth script or boot loader.. Pegasos IDE quirks have been "fixed" ...

+ Reply to Thread
Results 1 to 2 of 2

Thread: Re: IDE broken on Pegasos PPC platform

  1. Re: IDE broken on Pegasos PPC platform

    Yeah I'll ack it if it matters, although I'd make a nit about the
    fixing of device tree entries in prom_init and have it moved to
    nvramrc or a Forth script or boot loader..

    Pegasos IDE quirks have been "fixed" so many times now in Linux,
    this code's going to get reshuffled again in other changes, I
    think the device tree should be fixed at the firmware level and
    not in the kernel.

    --
    Matt Sealey
    Genesi, Manager, Developer Relations

    Chuck Ebbert wrote:
    > Without this patch, taken from a Suse 2.6.22 kernel, the Pegasos
    > PPC machines can't use their IDE interface. Is this the right fix?
    >
    > Bug:
    > https://bugzilla.redhat.com/show_bug.cgi?id=247602
    > Patch (also below):
    > https://bugzilla.redhat.com/attachment.cgi?id=167747
    >
    > ===============
    >
    > The built-in IDE controller is configured in legacy mode,
    > but the PCI registers advertise native mode.
    > Force the PCI class into legacy mode. This allows pata_via to access
    > two drives.
    > The Pegasos specific irq enforcement in the via82cxxx driver
    > must stay because there is aparently no generic way to setup irq per channel.
    >
    > Tested on Pegasos2 with firmware version 20040810, and two IDE disks.
    >
    > ---
    > arch/powerpc/kernel/prom_init.c | 11 ++++++++---
    > arch/powerpc/platforms/chrp/pci.c | 29 +++++++++++++++++++++++++++++
    > 2 files changed, 37 insertions(+), 3 deletions(-)
    >
    > --- a/arch/powerpc/kernel/prom_init.c
    > +++ b/arch/powerpc/kernel/prom_init.c
    > @@ -2044,6 +2044,7 @@ static void __init fixup_device_tree_map
    > /*
    > * Pegasos and BriQ lacks the "ranges" property in the isa node
    > * Pegasos needs decimal IRQ 14/15, not hexadecimal
    > + * Pegasos has the IDE configured in legacy mode, but advertised as native
    > */
    > static void __init fixup_device_tree_chrp(void)
    > {
    > @@ -2081,9 +2082,13 @@ static void __init fixup_device_tree_chr
    > prom_printf("Fixing up IDE interrupt on Pegasos...\n");
    > prop[0] = 14;
    > prop[1] = 0x0;
    > - prop[2] = 15;
    > - prop[3] = 0x0;
    > - prom_setprop(ph, name, "interrupts", prop, 4*sizeof(u32));
    > + prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
    > + prom_printf("Fixing up IDE class-code on Pegasos...\n");
    > + rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
    > + if (rc == sizeof(u32)) {
    > + prop[0] &= ~0x5;
    > + prom_setprop(ph, name, "class-code", prop, sizeof(u32));
    > + }
    > }
    > }
    > #else
    > --- a/arch/powerpc/platforms/chrp/pci.c
    > +++ b/arch/powerpc/platforms/chrp/pci.c
    > @@ -338,3 +338,32 @@ void chrp_pci_fixup_winbond_ata(struct p
    > }
    > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
    > chrp_pci_fixup_winbond_ata);
    > +
    > +/* Pegasos2 firmware version 20040810 configures the built-in IDE controller
    > + * in legacy mode, but sets the PCI registers to PCI native mode.
    > + * The chip can only operate in legacy mode, so force the PCI class into legacy
    > + * mode as well. The same fixup must be done to the class-code property in
    > + * the IDE node /pci@80000000/ide@C,1
    > + */
    > +static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
    > +{
    > + u8 progif;
    > + struct pci_dev *viaisa;
    > +
    > + if (!machine_is(chrp) || _chrp_type != _CHRP_Pegasos)
    > + return;
    > + if (viaide->irq != 14)
    > + return;
    > +
    > + viaisa = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
    > + if (!viaisa)
    > + return;
    > + printk("Fixing VIA IDE, force legacy mode on '%s'\n", viaide->dev.bus_id);
    > +
    > + pci_read_config_byte(viaide, PCI_CLASS_PROG, &progif);
    > + pci_write_config_byte(viaide, PCI_CLASS_PROG, progif & ~0x5);
    > + viaide->class &= ~0x5;
    > +
    > + pci_dev_put(viaisa);
    > +}
    > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata);
    > -
    > To unsubscribe from this list: send the line "unsubscribe linux-ide" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at http://vger.kernel.org/majordomo-info.html

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: IDE broken on Pegasos PPC platform


    On Mon, 2007-09-24 at 22:27 +0100, Matt Sealey wrote:
    > Yeah I'll ack it if it matters, although I'd make a nit about the
    > fixing of device tree entries in prom_init and have it moved to
    > nvramrc or a Forth script or boot loader..
    >
    > Pegasos IDE quirks have been "fixed" so many times now in Linux,
    > this code's going to get reshuffled again in other changes, I
    > think the device tree should be fixed at the firmware level and
    > not in the kernel.


    In that case though, OF contains correct values for the interrupts, it's
    more of an issue related to the device being in legacy mode and the
    pci_dev only carrying one interrupt anyway.

    Ben.


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread