Re: [BUG] linux-next: Tree for April 10 - kernel panic while loading ata driver on powermac

From: Bartlomiej Zolnierkiewicz
Date: Thu Apr 10 2008 - 15:01:22 EST


On Thursday 10 April 2008, Kamalesh Babulal wrote:
> Bartlomiej Zolnierkiewicz wrote:
> > On Thursday 10 April 2008, Bartlomiej Zolnierkiewicz wrote:
> >> Hi,
> >>
> >> On Thu, Apr 10, 2008 at 12:24 PM, Kamalesh Babulal
> >> <kamalesh@xxxxxxxxxxxxxxxxxx> wrote:
> >>> Hi Stephen,
> >>>
> >>> The next-20080410 kernel panics while bootup over the PowerMac G5 box, while
> >>> loading the ATA driver.
> >>>
> >>> [ 3.704000] Faulting instruction address: 0xc0000000000222a8
> >>> [ 3.704000] Oops: Kernel access of bad area, sig: 11 [#1]
> >>> [ 3.704000] SMP NR_CPUS=32 NUMA PowerMac
> >>> [ 3.704000] Modules linked in:
> >>> [ 3.704000] NIP: c0000000000222a8 LR: c00000000021cd10 CTR: 0000000000000100
> >>> [ 3.704000] REGS: c0000002760db070 TRAP: 0300 Not tainted (2.6.25-rc8-next-20080410-autokern1)
> >>> [ 3.704000] MSR: 9000000000009032 <EE,ME,IR,DR> CR: 44000042 XER: 20000000
> >>> [ 3.704000] DAR: a0001000822fa000, DSISR: 0000000040000000
> >>> [ 3.704000] TASK = c0000002760d7100[1] 'swapper' THREAD: c0000002760d8000 CPU: 0
> >>> [ 3.704000] GPR00: 0000000000000100 c0000002760db2f0 c000000000498310 a0001000822fa000
> >>> [ 3.704000] GPR04: c000000274806a00 0000000000000100 0000000000000201 c00000000000fed4
> >>> [ 3.704000] GPR08: c0000002760daf20 c0000000003ee0d8 c0000000004f1428 0000000000000000
> >>> [ 3.704000] GPR12: 0000000000000000 c0000000003fa700 0000000000000000 0000000000000000
> >>> [ 3.704000] GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
> >>> [ 3.704000] GPR20: 0000000000000001 0000000000000027 0000000000000027 0000000000000000
> >>> [ 3.704000] GPR24: c0000000004f1400 0000000000000000 0000000000000201 c0000000004f1490
> >>> [ 3.704000] GPR28: a0001000822fa000 0000000000000200 c00000000044cf50 c000000274806a00
> >>> [ 3.704000] NIP [c0000000000222a8] ._insw_ns+0x10/0x30
> >>> [ 3.704000] LR [c00000000021cd10] .ata_input_data+0x1f4/0x264
> >> Could you please add printk() for 'hwif->host_flags', 'mmio' and 'io_32bit'
> >> to ide-iops.c::ata_input_data() so we know more on what is going on?
> >
> > No longer needed - please test the hot-fix below instead:
> >
> > ---
> > thanks to Andrew for noticing me about the gcc warning
> >
> > drivers/ide/ppc/pmac.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > Index: b/drivers/ide/ppc/pmac.c
> > ===================================================================
> > --- a/drivers/ide/ppc/pmac.c
> > +++ b/drivers/ide/ppc/pmac.c
> > @@ -941,7 +941,7 @@ static const struct ide_port_info pmac_p
> > .port_ops = &pmac_ide_port_ops,
> > .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA |
> > IDE_HFLAG_POST_SET_MODE |
> > - IDE_HFLAG_UNMASK_IRQS,
> > + IDE_HFLAG_UNMASK_IRQS |
> > IDE_HFLAG_MMIO,
> > .pio_mask = ATA_PIO4,
> > .mwdma_mask = ATA_MWDMA2,
> >
> > --
> Thanks, the kernel panic is solved after applying the patch.
>
> Tested-by: Kamalesh Babulal <kamalesh@xxxxxxxxxxxxxxxxxx>

Thanks.

I integrated the fix with the guilty patch and pushed it to IDE tree
(Andrew, you may drop the revert-patch now).

From: Bartlomiej Zolnierkiewicz <bzolnier@xxxxxxxxx>
Subject: [PATCH] ide: add IDE_HFLAG_MMIO host flag (take 2)

* Add IDE_HFLAG_MMIO host flag and set it for hosts which use
default_hwif_mmiops().

v2:
* Fix kernel panic in pmac host driver (',' should be '|').

Thanks to Kamalesh for reporting it + testing the fix
and to Andrew for hinting me about the source of the issue.

Cc: Kamalesh Babulal <kamalesh@xxxxxxxxxxxxxxxxxx>
Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Cc: Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx>
Cc: Andy Whitcroft <apw@xxxxxxxxxxxx>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@xxxxxxxxx>
---
drivers/ide/arm/icside.c | 2 +-
drivers/ide/arm/palm_bk3710.c | 1 +
drivers/ide/arm/rapide.c | 1 +
drivers/ide/legacy/ide_platform.c | 4 +++-
drivers/ide/mips/swarm.c | 1 +
drivers/ide/pci/sgiioc4.c | 1 +
drivers/ide/pci/siimage.c | 1 +
drivers/ide/ppc/pmac.c | 1 +
include/linux/ide.h | 2 ++
9 files changed, 12 insertions(+), 2 deletions(-)

Index: b/drivers/ide/arm/icside.c
===================================================================
--- a/drivers/ide/arm/icside.c
+++ b/drivers/ide/arm/icside.c
@@ -481,7 +481,7 @@ static const struct ide_port_info icside
.init_dma = icside_dma_off_init,
.port_ops = &icside_v6_no_dma_port_ops,
.dma_ops = &icside_v6_dma_ops,
- .host_flags = IDE_HFLAG_SERIALIZE,
+ .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_MMIO,
.mwdma_mask = ATA_MWDMA2,
.swdma_mask = ATA_SWDMA2,
};
Index: b/drivers/ide/arm/palm_bk3710.c
===================================================================
--- a/drivers/ide/arm/palm_bk3710.c
+++ b/drivers/ide/arm/palm_bk3710.c
@@ -342,6 +342,7 @@ static const struct ide_port_ops palm_bk
static const struct ide_port_info __devinitdata palm_bk3710_port_info = {
.init_dma = palm_bk3710_init_dma,
.port_ops = &palm_bk3710_ports_ops,
+ .host_flags = IDE_HFLAG_MMIO,
.pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA4, /* (input clk 99MHz) */
.mwdma_mask = ATA_MWDMA2,
Index: b/drivers/ide/arm/rapide.c
===================================================================
--- a/drivers/ide/arm/rapide.c
+++ b/drivers/ide/arm/rapide.c
@@ -53,6 +53,7 @@ rapide_probe(struct expansion_card *ec,

ide_init_port_hw(hwif, &hw);

+ hwif->host_flags = IDE_HFLAG_MMIO;
default_hwif_mmiops(hwif);

idx[0] = hwif->index;
Index: b/drivers/ide/legacy/ide_platform.c
===================================================================
--- a/drivers/ide/legacy/ide_platform.c
+++ b/drivers/ide/legacy/ide_platform.c
@@ -101,8 +101,10 @@ static int __devinit plat_ide_probe(stru

ide_init_port_hw(hwif, &hw);

- if (mmio)
+ if (mmio) {
+ hwif->host_flags = IDE_HFLAG_MMIO;
default_hwif_mmiops(hwif);
+ }

idx[0] = hwif->index;

Index: b/drivers/ide/mips/swarm.c
===================================================================
--- a/drivers/ide/mips/swarm.c
+++ b/drivers/ide/mips/swarm.c
@@ -109,6 +109,7 @@ static int __devinit swarm_ide_probe(str
base = ioremap(offset, size);

/* Setup MMIO ops. */
+ hwif->host_flags = IDE_HFLAG_MMIO;
default_hwif_mmiops(hwif);

hwif->chipset = ide_generic;
Index: b/drivers/ide/pci/sgiioc4.c
===================================================================
--- a/drivers/ide/pci/sgiioc4.c
+++ b/drivers/ide/pci/sgiioc4.c
@@ -573,6 +573,7 @@ static const struct ide_port_info sgiioc
.init_dma = ide_dma_sgiioc4,
.port_ops = &sgiioc4_port_ops,
.dma_ops = &sgiioc4_dma_ops,
+ .host_flags = IDE_HFLAG_MMIO,
.mwdma_mask = ATA_MWDMA2_ONLY,
};

Index: b/drivers/ide/pci/siimage.c
===================================================================
--- a/drivers/ide/pci/siimage.c
+++ b/drivers/ide/pci/siimage.c
@@ -630,6 +630,7 @@ static void __devinit init_mmio_iops_sii
* Fill in the basic HWIF bits
*/

+ hwif->host_flags |= IDE_HFLAG_MMIO;
default_hwif_mmiops(hwif);
hwif->hwif_data = addr;

Index: b/drivers/ide/ppc/pmac.c
===================================================================
--- a/drivers/ide/ppc/pmac.c
+++ b/drivers/ide/ppc/pmac.c
@@ -941,6 +941,7 @@ static const struct ide_port_info pmac_p
.port_ops = &pmac_ide_port_ops,
.host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA |
IDE_HFLAG_POST_SET_MODE |
+ IDE_HFLAG_MMIO |
IDE_HFLAG_UNMASK_IRQS,
.pio_mask = ATA_PIO4,
.mwdma_mask = ATA_MWDMA2,
Index: b/include/linux/ide.h
===================================================================
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -1056,6 +1056,8 @@ enum {
IDE_HFLAG_NO_DMA = (1 << 14),
/* check if host is PCI IDE device before allowing DMA */
IDE_HFLAG_NO_AUTODMA = (1 << 15),
+ /* host uses MMIO */
+ IDE_HFLAG_MMIO = (1 << 16),
/* host is CS5510/CS5520 */
IDE_HFLAG_CS5520 = IDE_HFLAG_VDMA,
/* no LBA48 */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/