ppc-linux EPIC (OpenPIC) and Interrupts on MPC8240

James F Dougherty jfd at GigabitNetworks.COM
Sat Jul 7 07:39:27 EST 2001


Hi,

I am porting a custom designed MPC8240 board to linuxpcc,
have spent about a month or so getting ppcboot running
on it, and am now in the low-level details of getting
linux setup and running. Here's the details of my hardware
configuration:

200Mhz MPC8240 (Embedded MPC107, EPIC, I2C, I2O) + 64MB SDRAM
512K PLCC (Bootrom)
4MB FLASH mapped via PLD to PortX I/O Bus in range:
NS16550  mapped via PLD to PortX I/O bus starting at 0xffe08080
DEC 21143 Ethernet on MPC107 PCI Bus
ALI 1535 Southbridge
PCI Connector

The board is essentially a Motorola Sandpoint design variant, so
I have started with the MontaVista Sandpoint port of linux-2.3.1
and have had gotten into the sandpoint_setup code. I believe the
interrupt controller driver and serial port are currently broken
however.

IRQ mapping on this system is different then the standard PPC/Linux
configurations I have seen so far as it uses the internal OpenPIC
interrupt controller for all interrupts and does not use the 8259
serial port cascade (Winbond and others).

Vector(s)	Assignment
---------	-------------------
0-15		External (and unused serial interrupts)
16-19		Global timers
20		I2C
21-22		DMA
23		I2O message


Also, the MPC8240 EPIC (OpenPIC) has two modes: serial and discrete
interrupt mode. I need to use Discrete interrupt mode, which allows
for my hardwired interrupt mapping :

#define IRQ_ENET	1	/* Hardwired external EPIC Vector 1*/
#define IRQ_PCI		3	/* Hardwired external EPIC Vector 3*/
#define IRQ_UART	4	/* Hardwired external EPIC Vector 4*/

I have several questions:

1) How do the internal linux IRQ numbers map to EPIC interrupts?
2) What is the procedure by which the interrupt controller will invoke
   a linux interrupt? I know doIRQ is called and ppc_md.cannonicalize_irq()
   will re-number interrupts if need be, but I am not sure what interrupt
   numbers these should map to on the EPIC.
3) How should I handle the serial port? The drivers/char/serial.c
   allows for :

	static struct serial_state rs_table[] = {
		{ 0, 9600, 0xffe08080, 4, STD_COM_FLAGS }, /* ttyS0 */
	};

   however I am not sure this will work since I get no console output
   but I do know that my PIO version of the serial driver works (since
   I have written a ppc_md.progress routine and it spits out text indicating
   where I am)

4) Should I add a new interrupt controller driver? I am sure the open_pic.c
   driver works since it works for sandpoint, however, it only handles routing
   the interrupt to the 8259 cascade (which does the SIO interrupt) which is
   not what I am using (I need the 8240 EPIC in discrete mode EXT4 = COM1).

Here is where I am at bootup:

Initializing...
  CPU:   MPC8240 Revision 1.1 at 302 MHz: 16 kB I-Cache 16 kB D-Cache
  Board:   VOOHA MOUSSE MPC8240/KAHLUA - CHRP (MAP B)
  PLD Revision 1
  Local Bus at 2105 MHz
  DRAM:  64 MB
  FLASH: 16 MB
  Scanning function 0 of each PCI device on bus 0
  bus dev fn venID devID class  rev MBAR0    MBAR1    IPIN ILINE
  00  00  00 1057  0003  060000 11  00000008 00000000 01   00
  00  0d  00 1011  0019  020000 41  00810001 00010000 01   01
  In:    serial
  Out:   serial
  Err:   serial

mousse>boot
DC21143 Ethernet adapter(bus=0, device=13, func=0)
DEC Ethernet iobase=0x80000000 eth0: online
ARP broadcast 1
TFTP from server 192.168.1.133; our IP address is 192.168.1.138
Filename 'vmlinux.img'.
Load address: 0x100000
Loading:
################################################################################
#################
done
Bytes transferred = 492694 (78496 hex)
eth_halt
## Booting image at 00100000 ...
   Image Name:   vmlinux.bin.gz
   Image Type:   PowerPC Linux Kernel Image (gzip compressed)
   Data Size:    492630 Bytes = 481 kB = 0 MB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK
arch: exitinit IRQ
openpic enterOpenPIC v1.2
openpic timeropenpic ipisandpoint irq
openpic spuriousopenpic exitdo_IRQ:irq:00000063

 irq_cannon:00000004
                    irq_cannon:00000000
                                       irq_cannon:00000001
                                                          irq_cannon:00000002

irq_cannon:00000003
                irq_cannon:00000004
                                   irq_cannon:00000003
                                                      irq_cannon:00000004

irq_cannon:00000003


I am pretty sure it is mapping the OpenPIC correctly (I get 1.2 in my VxWorks
driver so that looks good). I am not sure why do_IRQ() is called with IRQ=0x63
though, perhaps this is in need of re-mapping? I wrote the irq_cannonicalize
routine to return the IRQ number, and in a desperate hack attempt to get the
serial port to work, I added the same rs_table entry for IRQ 0-4


I am sure someone out there has had to deal with this issue before, so any
pointers in the right direction would be greatly appreciated.

Many thanks in advance.

					-James
James Dougherty
jfd at gigabitnetworks.com
408-776-6634

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





More information about the Linuxppc-embedded mailing list