Subject: CAROLINA_IRQ_EDGE_MASK_HI, Segment Register 8 instead of BATs on 601

From: Sven Dickert <[email-masked]>
Date: Thu, 26 Jul 2001 10:18:19 +0200

Hello,
> >   At the moment I'm working on sound support. I changed
> > -#define CAROLINA_IRQ_EDGE_MASK_HI   0xA4  /* IRQ's 8-15 [10,13,15] */
> > +#define CAROLINA_IRQ_EDGE_MASK_HI   0xA0  /* IRQ's 8-15 [10,13,15] */
> > in arch/ppc/kernel/prep_pci.c
> > I found this 'patch' at http://penguinppc.org/dev/prep/tp850.diff
>
> Neither the 40P nor the Thinkpad 850 are Carolina systems, so those constants
> should remain how they are and new ones for other systems introduced. That
> will mean slight changes to the IBM section of prep_route_pci_interrupts(),
> but nothing major.

  O.k. it's better done this way:
-------------------------------------------------- 8< ------------------------
diff -rwu linux-2.4.7/arch/ppc/kernel/prep_pci.c linux-2.4.7.40p/arch/ppc/kernel/prep_pci.c
--- linux-2.4.7/arch/ppc/kernel/prep_pci.c  Wed Jul  4 18:11:52 2001
+++ linux-2.4.7.40p/arch/ppc/kernel/prep_pci.c  Thu Jul 26 10:01:51 2001
@@ -564,6 +565,10 @@
  */
 #define CAROLINA_IRQ_EDGE_MASK_LO   0x00  /* IRQ's 0-7  */
 #define CAROLINA_IRQ_EDGE_MASK_HI   0xA4  /* IRQ's 8-15 [10,13,15] */
+#define IBM6015_IRQ_EDGE_MASK_LO   0x00  /* IRQ's 0-7  */
+#define IBM6015_IRQ_EDGE_MASK_HI   0xA0  /* IRQ's 8-15 [13,15] */
+#define NOBIS_IRQ_EDGE_MASK_LO     0x00  /* IRQ's 0-7  */
+#define NOBIS_IRQ_EDGE_MASK_HI     0xA0  /* IRQ's 8-15 [13,15] */

 /*
  * 8259 edge/level control definitions
@@ -839,6 +845,7 @@
  } else if ( _prep_type == _PREP_IBM )
  {
    unsigned char pl_id;
+   unsigned char irq_edge_mask_lo,irq_edge_mask_hi;
    /*
     * my carolina is 0xf0
     * 6015 has 0xfc
@@ -851,27 +858,33 @@
      Motherboard_map_name = "IBM 850/860 Portable\n";
      Motherboard_map = Nobis_pci_IRQ_map;
      Motherboard_routes = Nobis_pci_IRQ_routes;
+     irq_edge_mask_lo=NOBIS_IRQ_EDGE_MASK_LO;
+     irq_edge_mask_hi=NOBIS_IRQ_EDGE_MASK_HI;
      break;
    case 0xfc:
-     Motherboard_map_name = "IBM 6015";
+     Motherboard_map_name = "IBM 6015/7020 (Sandalfoot/Sandalbow)";
      Motherboard_map = ibm6015_pci_IRQ_map;
      Motherboard_routes = ibm6015_pci_IRQ_routes;
+     irq_edge_mask_lo=IBM6015_IRQ_EDGE_MASK_LO;
+     irq_edge_mask_hi=IBM6015_IRQ_EDGE_MASK_HI;
      break;
    default:
      Motherboard_map_name = "IBM 8xx (Carolina)";
      Motherboard_map = ibm8xx_pci_IRQ_map;
      Motherboard_routes = ibm8xx_pci_IRQ_routes;
+     irq_edge_mask_lo=CAROLINA_IRQ_EDGE_MASK_LO;
+     irq_edge_mask_hi=CAROLINA_IRQ_EDGE_MASK_HI;
      break;
    }

    /*printk("Changing IRQ mode\n");*/
    pl_id=inb(0x04d0);
    /*printk("Low mask is %#0x\n", pl_id);*/
-   outb(pl_id|CAROLINA_IRQ_EDGE_MASK_LO, 0x04d0);
+   outb(pl_id|irq_edge_mask_lo, 0x04d0);

    pl_id=inb(0x04d1);
    /*printk("Hi mask is  %#0x\n", pl_id);*/
-   outb(pl_id|CAROLINA_IRQ_EDGE_MASK_HI, 0x04d1);
+   outb(pl_id|irq_edge_mask_hi, 0x04d1);
    pl_id=inb(0x04d1);
    /*printk("Hi mask now %#0x\n", pl_id);*/
  }
-------------------------------------------------- 8< ------------------------

> In your patch you're using a segment register because 601 BAT's are only 8MB
> (and we need more for IO space). Someone suggested using ioremap in the driver
> (the one causing the page fault), but I suspect the whole reason those BAT
> regions are there is to support legacy IO and not have to get everything to
> ioremap?

  I think so, too. It's not just one driver that makes problems. Kernel
shows bad memory access even at "PCI: Probing PCI hardware"

>          Is there an equivalent to ioremap that allows the virtual address to
> be specified (want to map 0x80000000 physical to 0x80000000 virtual [NOT
> n+io_base] for IO ports)?

  When I get to know about this, I would no longer use SR8 :)

Bye,	Sven

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/