Second version of MPC10x OCP
RFC PATCH 1/1 Second version of MPC10x OCP
Here's the second version of OCP-ifying the mpc10x. I've removed the hardcoded positions in the core_ocp array, and I've added the DMA devices in case anybody needs them. I haven't yet tested the I2C driver from 2.4, but I've put in the flags field for it.
- Adrian Cox
Humboldt Solutions Ltd.
# This is a BitKeeper generated diff -Nru style patch. #
# ChangeSet
# 2004/06/20 16:25:45+01:00 [email protected]
# Add OCP code for MPC10x, and a common Openpic setup routine.
#
# include/asm-ppc/mpc10x.h # 2004/06/20 16:25:10+01:00 [email protected] +3 -0 # Add Openpic setup routine. # # arch/ppc/syslib/mpc10x_common.c # 2004/06/20 16:25:10+01:00 [email protected] +79 -2 # Add MPC10x OCP code, and a standard Openpic setup routine. # # arch/ppc/syslib/Makefile # 2004/06/20 16:25:10+01:00 [email protected] +4 -4 # Add common MPC10x openpic config option. # # arch/ppc/platforms/sandpoint.c # 2004/06/20 16:25:10+01:00 [email protected] +1 -11 # Use common Openpic setup. # # arch/ppc/platforms/powerpmc250.c # 2004/06/20 16:25:10+01:00 [email protected] +1 -1 # Use common Openpic setup. # # arch/ppc/platforms/lopec_setup.c # 2004/06/20 16:25:10+01:00 [email protected] +1 -14 # Use common Openpic setup. # # arch/ppc/Kconfig # 2004/06/20 16:25:10+01:00 [email protected] +10 -0 # Add OCP and common Openpic code for MPC10x boards. # diff -Nru a/arch/ppc/Kconfig b/arch/ppc/Kconfig --- a/arch/ppc/Kconfig Sun Jun 20 16:40:17 2004 +++ b/arch/ppc/Kconfig Sun Jun 20 16:40:17 2004 @@ -685,6 +685,16 @@ depends on PCORE || POWERPMC250 || LOPEC || SANDPOINT default y
+config FSL_OCP
+ bool
+ depends on MPC10X_BRIDGE
+ default y
+
+config MPC10X_OPENPIC
+ bool
+ depends on POWERPMC250 || LOPEC || SANDPOINT
+ default y
+
config MPC10X_STORE_GATHERING
bool "Enable MPC10x store gathering"
depends on MPC10X_BRIDGE
arch/ppc/platforms/lopec_setup.c +1 -14
@@ -193,21 +193,8 @@ OpenPIC_InitSenses = lopec_openpic_initsenses; OpenPIC_NumInitSenses =sizeof (lopec_openpic_initsenses); -/* -* We need to tell openpic_set_sources where things actually are. -* mpc10x_common will setup OpenPIC_Addr at ioremap(EUMB phys base + -* EPIC offset (0x40000)); The EPIC IRQ Register Address Map - -* Interrupt Source Configuration Registers gives these numbers -* as offsets starting at 0x50200, we need to adjust occordinly. -*/ -/* Map serial interrupts 0-15 */ -openpic_set_sources (0 ,16 , OpenPIC_Addr +0x10200 ); -/* Skip reserved space and map i2c and DMA Ch[01] */ -openpic_set_sources (16 ,3 , OpenPIC_Addr +0x11020 ); -/* Skip reserved space and map Message Unit Interrupt (I2O) */ -openpic_set_sources (19 ,1 , OpenPIC_Addr +0x110C0 ); +mpc10x_set_openpic (); -openpic_init (NUM_8259_INTERRUPTS );/* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */ openpic_hookup_cascade (NUM_8259_INTERRUPTS ,"82c59 cascade" , &i8259_irq);
arch/ppc/platforms/powerpmc250.c +1 -1
@@ -197,7 +197,7 @@ OpenPIC_InitSenses = powerpmc250_openpic_initsenses; OpenPIC_NumInitSenses =sizeof (powerpmc250_openpic_initsenses); -openpic_init (1 ,0 ,0 ,-1 ); +mpc10x_set_openpic (); }/*
arch/ppc/platforms/sandpoint.c +1 -11
@@ -433,17 +433,7 @@ OpenPIC_InitSenses = sandpoint_openpic_initsenses; OpenPIC_NumInitSenses =sizeof (sandpoint_openpic_initsenses); -/* -* We need to tell openpic_set_sources where things actually are. -* mpc10x_common will setup OpenPIC_Addr at ioremap(EUMB phys base + -* EPIC offset (0x40000)); The EPIC IRQ Register Address Map - -* Interrupt Source Configuration Registers gives these numbers -* as offsets starting at 0x50200, we need to adjust occordinly. -*/ -/* Map serial interrupts 0-15 */ -openpic_set_sources (0 ,16 , OpenPIC_Addr +0x10200 ); - -openpic_init (NUM_8259_INTERRUPTS ); +mpc10x_set_openpic ();openpic_hookup_cascade (NUM_8259_INTERRUPTS ,"82c59 cascade" , i8259_irq);
arch/ppc/syslib/Makefile +4 -3
@@ -51,7 +51,7 @@ obj-$(CONFIG_GEMINI) += open_pic.o indirect_pci.o obj-$(CONFIG_K2) += i8259.o indirect_pci.o todc_time.o \ pci_auto.o -obj-$(CONFIG_LOPEC) += pci_auto.o open_pic.o i8259.o todc_time.o +obj-$(CONFIG_LOPEC) += i8259.o pci_auto.o todc_time.o obj-$(CONFIG_MCPN765) += todc_time.o indirect_pci.o pci_auto.o \ open_pic.o i8259.o hawk_common.o obj-$(CONFIG_MENF1) += todc_time.o i8259.o mpc10x_common.o \
@@ -61,15 +61,14 @@ obj-$(CONFIG_OCOTEA) += indirect_pci.o pci_auto.o todc_time.o obj-$(CONFIG_PAL4) += cpc700_pic.o obj-$(CONFIG_PCORE) += todc_time.o i8259.o pci_auto.o -obj-$(CONFIG_POWERPMC250) += open_pic.o pci_auto.o +obj-$(CONFIG_POWERPMC250) += pci_auto.o obj-$(CONFIG_PPLUS) += hawk_common.o open_pic.o i8259.o \ indirect_pci.o todc_time.o pci_auto.o obj-$(CONFIG_PRPMC750) += open_pic.o indirect_pci.o pci_auto.o \ hawk_common.o obj-$(CONFIG_HARRIER) += harrier.o obj-$(CONFIG_PRPMC800) += open_pic.o indirect_pci.o pci_auto.o -obj-$(CONFIG_SANDPOINT) += i8259.o open_pic.o pci_auto.o todc_time.o +obj-$(CONFIG_SANDPOINT) += i8259.o pci_auto.o todc_time.o obj-$(CONFIG_SBC82xx) += todc_time.o obj-$(CONFIG_SPRUCE) += cpc700_pic.o indirect_pci.o pci_auto.o \ todc_time.o
@@ -80,6 +79,7 @@ endif obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_MPC10X_BRIDGE) += mpc10x_common.o indirect_pci.o +obj-$(CONFIG_MPC10X_OPENPIC) += open_pic.o obj-$(CONFIG_40x) += dcr.o obj-$(CONFIG_BOOKE) += dcr.o obj-$(CONFIG_85xx) += open_pic.o ppc85xx_common.o ppc85xx_setup.o
arch/ppc/syslib/mpc10x_common.c +79 -2
100 lines not on this page · raw message
include/asm-ppc/mpc10x.h +3 -0
@@ -164,4 +164,7 @@int mpc10x_enable_store_gathering (struct pci_controller *hose);int mpc10x_disable_store_gathering (struct pci_controller *hose); +/* For MPC107 boards that use the built-in openpic */ +void mpc10x_set_openpic (void ); +#endif /* __PPC_KERNEL_MPC10X_H */
Quoted 6 lines · Adrian Cox
Here's the second version of OCP-ifying the mpc10x. I've removed the hardcoded positions in the
core_ocparray, and I've added the DMA devices in case anybody needs them. I haven't yet tested the I2C driver from 2.4, but I've put in the flags field for it.
Adrian,
Sorry for the delay, I've been out the last few days. FWIW, your patch looks fine to me.
Mark
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
Quoted 191 lines · Adrian Cox
Here's the second version of OCP-ifying the mpc10x. I've removed the hardcoded positions in the
core_ocparray, and I've added the DMA devices in case anybody needs them. I haven't yet tested the I2C driver from 2.4, but I've put in the flags field for it.
- Adrian Cox
Humboldt Solutions Ltd.# This is a BitKeeper generated diff -Nru style patch. #
# ChangeSet
# 2004/06/20 16:25:45+01:00 [email protected]
# Add OCP code for MPC10x, and a common Openpic setup routine.
## include/asm-ppc/mpc10x.h # 2004/06/20 16:25:10+01:00 [email protected] +3 -0 # Add Openpic setup routine. # # arch/ppc/syslib/mpc10x_common.c # 2004/06/20 16:25:10+01:00 [email protected] +79 -2 # Add MPC10x OCP code, and a standard Openpic setup routine. # # arch/ppc/syslib/Makefile # 2004/06/20 16:25:10+01:00 [email protected] +4 -4 # Add common MPC10x openpic config option. # # arch/ppc/platforms/sandpoint.c # 2004/06/20 16:25:10+01:00 [email protected] +1 -11 # Use common Openpic setup. # # arch/ppc/platforms/powerpmc250.c # 2004/06/20 16:25:10+01:00 [email protected] +1 -1 # Use common Openpic setup. # # arch/ppc/platforms/lopec_setup.c # 2004/06/20 16:25:10+01:00 [email protected] +1 -14 # Use common Openpic setup. # # arch/ppc/Kconfig # 2004/06/20 16:25:10+01:00 [email protected] +10 -0 # Add OCP and common Openpic code for MPC10x boards. # diff -Nru a/arch/ppc/Kconfig b/arch/ppc/Kconfigarch/ppc/Kconfig +10
-0@@ -685,6 +685,16 @@ depends on PCORE || POWERPMC250 || LOPEC || SANDPOINT default y +config FSL_OCP + bool + depends on MPC10X_BRIDGE + default y + +config MPC10X_OPENPIC + bool + depends on POWERPMC250 || LOPEC || SANDPOINT + default y + config MPC10X_STORE_GATHERING bool "Enable MPC10x store gathering" depends on MPC10X_BRIDGEdiff -Nru
a/arch/ppc/platforms/lopec_setup.cb/arch/ppc/platforms/lopec_setup.carch/ppc/platforms/lopec_setup.c +1
-14@@ -193,21 +193,8 @@ OpenPIC_InitSenses = lopec_openpic_initsenses; OpenPIC_NumInitSenses =sizeof (lopec_openpic_initsenses); -/* -* We need to tell openpic_set_sources where things actually are. -* mpc10x_common will setup OpenPIC_Addr at ioremap(EUMB phys base + -* EPIC offset (0x40000)); The EPIC IRQ Register Address Map - -* Interrupt Source Configuration Registers gives these numbers -* as offsets starting at 0x50200, we need to adjust occordinly. -*/ -/* Map serial interrupts 0-15 */ -openpic_set_sources (0 ,16 , OpenPIC_Addr +0x10200 ); -/* Skip reserved space and map i2c and DMA Ch[01] */ -openpic_set_sources (16 ,3 , OpenPIC_Addr +0x11020 ); -/* Skip reserved space and map Message Unit Interrupt (I2O) */ -openpic_set_sources (19 ,1 , OpenPIC_Addr +0x110C0 ); +mpc10x_set_openpic (); -openpic_init (NUM_8259_INTERRUPTS );/* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */ openpic_hookup_cascade (NUM_8259_INTERRUPTS ,"82c59 cascade" , &i8259_irq);diff -Nru
a/arch/ppc/platforms/powerpmc250.cb/arch/ppc/platforms/powerpmc250.carch/ppc/platforms/powerpmc250.c +1
-1@@ -197,7 +197,7 @@ OpenPIC_InitSenses = powerpmc250_openpic_initsenses; OpenPIC_NumInitSenses =sizeof (powerpmc250_openpic_initsenses); -openpic_init (1 ,0 ,0 ,-1 ); +mpc10x_set_openpic (); }/* diff -Nru
a/arch/ppc/platforms/sandpoint.cb/arch/ppc/platforms/sandpoint.carch/ppc/platforms/sandpoint.c +1
-11@@ -433,17 +433,7 @@ OpenPIC_InitSenses = sandpoint_openpic_initsenses; OpenPIC_NumInitSenses =sizeof (sandpoint_openpic_initsenses); -/* -* We need to tell openpic_set_sources where things actually are. -* mpc10x_common will setup OpenPIC_Addr at ioremap(EUMB phys base + -* EPIC offset (0x40000)); The EPIC IRQ Register Address Map - -* Interrupt Source Configuration Registers gives these numbers -* as offsets starting at 0x50200, we need to adjust occordinly. -*/ -/* Map serial interrupts 0-15 */ -openpic_set_sources (0 ,16 , OpenPIC_Addr +0x10200 ); - -openpic_init (NUM_8259_INTERRUPTS ); +mpc10x_set_openpic ();openpic_hookup_cascade (NUM_8259_INTERRUPTS ,"82c59 cascade" , i8259_irq);diff -Nru a/arch/ppc/syslib/Makefile b/arch/ppc/syslib/Makefile
arch/ppc/syslib/Makefile +4
-3@@ -51,7 +51,7 @@ obj-$(CONFIG_GEMINI) += open_pic.o indirect_pci.o obj-$(CONFIG_K2) += i8259.o indirect_pci.o todc_time.o \ pci_auto.o -obj-$(CONFIG_LOPEC) += pci_auto.o open_pic.o i8259.o todc_time.o +obj-$(CONFIG_LOPEC) += i8259.o pci_auto.o todc_time.o obj-$(CONFIG_MCPN765) += todc_time.o indirect_pci.o pci_auto.o \ open_pic.o i8259.o hawk_common.o obj-$(CONFIG_MENF1) += todc_time.o i8259.o mpc10x_common.o \@@ -61,15 +61,14 @@ obj-$(CONFIG_OCOTEA) += indirect_pci.o pci_auto.o todc_time.o obj-$(CONFIG_PAL4) += cpc700_pic.o obj-$(CONFIG_PCORE) += todc_time.o i8259.o pci_auto.o -obj-$(CONFIG_POWERPMC250) += open_pic.o pci_auto.o +obj-$(CONFIG_POWERPMC250) += pci_auto.o obj-$(CONFIG_PPLUS) += hawk_common.o open_pic.o i8259.o \ indirect_pci.o todc_time.o pci_auto.o obj-$(CONFIG_PRPMC750) += open_pic.o indirect_pci.o pci_auto.o \ hawk_common.o obj-$(CONFIG_HARRIER) += harrier.o obj-$(CONFIG_PRPMC800) += open_pic.o indirect_pci.o pci_auto.o -obj-$(CONFIG_SANDPOINT) += i8259.o open_pic.o pci_auto.o todc_time.o +obj-$(CONFIG_SANDPOINT) += i8259.o pci_auto.o todc_time.o obj-$(CONFIG_SBC82xx) += todc_time.o obj-$(CONFIG_SPRUCE) += cpc700_pic.o indirect_pci.o pci_auto.o \ todc_time.o@@ -80,6 +79,7 @@ endif obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_MPC10X_BRIDGE) += mpc10x_common.o indirect_pci.o +obj-$(CONFIG_MPC10X_OPENPIC) += open_pic.o obj-$(CONFIG_40x) += dcr.o obj-$(CONFIG_BOOKE) += dcr.o obj-$(CONFIG_85xx) += open_pic.o ppc85xx_common.o ppc85xx_setup.odiff -Nru
a/arch/ppc/syslib/mpc10x_common.cb/arch/ppc/syslib/mpc10x_common.carch/ppc/syslib/mpc10x_common.c +21
-0@@ -30,7 +30,60 @@#include <asm/pci-bridge.h> #include <asm/open_pic.h> #include <asm/mpc10x.h> +#include <asm/ocp.h> +/* The OCP structure is fixed by code below, before OCP initialises. +paddr depends on where the board places the EUMB. +- fixed in mpc10x_bridge_init(). +irq depends on two things: +> does the board use the EPIC at all? (PCORE does not). +> is the EPIC in serial or parallel mode? +- fixed in mpc10x_set_openpic(). +*/ + +#ifdef CONFIG_MPC10X_OPENPIC +#ifdef CONFIG_EPIC_SERIAL_MODE +#define EPIC_IRQ_BASE 16 +#else +#define EPIC_IRQ_BASE 5 +#endif +#define MPC10X_I2C_IRQ (EPIC_IRQ_BASE + NUM_8259_INTERRUPTS) +#define MPC10X_DMA0_IRQ (EPIC_IRQ_BASE + 1 + NUM_8259_INTERRUPTS) +#define MPC10X_DMA1_IRQ (EPIC_IRQ_BASE + 2 + NUM_8259_INTERRUPTS) +#else +#define MPC10X_I2C_IRQ OCP_IRQ_NA
arch/ppc/syslib/mpc10x_common.c line 64
Quoted 10 lines
arch/ppc/syslib/mpc10x_common.c +10
-0+#define MPC10X_DMA0_IRQ OCP_IRQ_NA +#define MPC10X_DMA1_IRQ OCP_IRQ_NA +#endif + + +struct ocp_def core_ocp[] = { + { .vendor =OCP_VENDOR_INVALID + } +}; +
In 85xx we would put paddr in the structs and have them as offsets from EUMBAR. Then we can fixup all the devices in a simple loop.
arch/ppc/syslib/mpc10x_common.c line 75
Quoted 11 lines
arch/ppc/syslib/mpc10x_common.c +11
-0+static struct ocp_fs_i2c_data mpc10x_i2c_data = { + .flags =FS_I2C_32BIT +}; +static struct ocp_def mpc10x_i2c_ocp = { + .vendor =OCP_VENDOR_MOTOROLA , + .function =OCP_FUNC_IIC , + .index =0 , + .irq =MPC10X_I2C_IRQ , + .additions = &mpc10x_i2c_data +}; +
Interesting, you went and made each channel a device. I dont have a 'real' driver for DMA on 85xx and only made a single device hmm, I think I like the idea of make each channel its own 'device'.
Quoted 17 lines
arch/ppc/syslib/mpc10x_common.c +11
-0+static struct ocp_def mpc10x_dma_ocp[2 ] = { +{ .vendor =OCP_VENDOR_MOTOROLA , + .function =OCP_FUNC_DMA , + .index =0 , + .irq =MPC10X_DMA0_IRQ +}, +{ .vendor =OCP_VENDOR_MOTOROLA , + .function =OCP_FUNC_DMA , + .index =1 , + .irq =MPC10X_DMA1_IRQ } +};/* Set resources to match bridge memory map */ void __init @@ -231,11 +284,21 @@PCI_DEVFN (0 ,0 ), MPC10X_CFG_EUMBBAR,
arch/ppc/syslib/mpc10x_common.c line 293
Quoted 10 lines
arch/ppc/syslib/mpc10x_common.c +4
-2phys_eumb_base); - -/* Map EPIC register part of EUMB into vitual memory */ +#ifdef CONFIG_MPC10X_OPENPIC +/* Map EPIC register part of EUMB into vitual memory - PCORE +uses an i8259 instead of EPIC. */ OpenPIC_Addr =ioremap (phys_eumb_base +MPC10X_EUMB_EPIC_OFFSET ,MPC10X_EUMB_EPIC_SIZE ); +#endif
I'm confused are we adding the OCP struct for every 10x device? Did we get closure on the question if 105, 106 & 8240 would also work? If so I would suggest doing the following:
struct ocp_def core_ocp[] = {
{ .vendor = OCP_VENDOR_MOTOROLA,
.function = OCP_FUNC_IIC,
.index = 0,
.irq = MPC10X_I2C_IRQ,
.additions = &mpc10x_i2c_data,
.paddr = MPC10X_EUMB_I2C_OFFSET
},
{ .vendor = OCP_VENDOR_MOTOROLA,
.function = OCP_FUNC_DMA,
.index = 0,
.irq = MPC10X_DMA0_IRQ,
.paddr = MPC10X_EUMB_DMA_OFFSET + 0x100
},
{ .vendor = OCP_VENDOR_MOTOROLA,
.function = OCP_FUNC_DMA,
.index = 1,
.irq = MPC10X_DMA1_IRQ,
.paddr = MPC10X_EUMB_DMA_OFFSET + 0x200 },
};
Quoted 33 lines
arch/ppc/syslib/mpc10x_common.c +22
-0+ mpc10x_i2c_ocp.paddr = phys_eumb_base +MPC10X_EUMB_I2C_OFFSET ; +ocp_add_one_device (&mpc10x_i2c_ocp); + mpc10x_dma_ocp[0 ].paddr = phys_eumb_base + +MPC10X_EUMB_DMA_OFFSET +0x100 ; +ocp_add_one_device (&mpc10x_dma_ocp[0 ]); + mpc10x_dma_ocp[1 ].paddr = phys_eumb_base + +MPC10X_EUMB_DMA_OFFSET +0x200 ; +ocp_add_one_device (&mpc10x_dma_ocp[1 ]); }#ifdef CONFIG_MPC10X_STORE_GATHERING @@ -397,3 +460,17 @@return 0 ; } + +#ifdef CONFIG_MPC10X_OPENPIC +void __init mpc10x_set_openpic (void ) +{ +/* Map external IRQs */ +openpic_set_sources (0 ,EPIC_IRQ_BASE , OpenPIC_Addr +0x10200 ); +/* Skip reserved space and map i2c and DMA Ch[01] */ +openpic_set_sources (EPIC_IRQ_BASE ,3 , OpenPIC_Addr +0x11020 ); +/* Skip reserved space and map Message Unit Interrupt (I2O) */ +openpic_set_sources (EPIC_IRQ_BASE +3 ,1 , OpenPIC_Addr +0x110C0 ); + +openpic_init (NUM_8259_INTERRUPTS ); +} +#endif diff -Nru
a/include/asm-ppc/mpc10x.hb/include/asm-ppc/mpc10x.h
include/asm-ppc/mpc10x.h line 170
Quoted 7 lines
include/asm-ppc/mpc10x.h +3
-0@@ -164,4 +164,7 @@int mpc10x_enable_store_gathering (struct pci_controller *hose);int mpc10x_disable_store_gathering (struct pci_controller *hose); +/* For MPC107 boards that use the built-in openpic */ +void mpc10x_set_openpic (void ); +#endif /* __PPC_KERNEL_MPC10X_H */
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
Quoted 2 lines · Kumar Gala
I'm confused are we adding the OCP struct for every 10x device? Did we get closure on the question if 105, 106 & 8240 would also work?
According to the chip manuals:
107, 8240, and 8245 have the internal peripherals and should work. 105 and 106 don't have internal peripherals.
mpc10x_common.c supports 106, 107, 8240, and 8245, but does not support 105.
The code only adds the OCP devices if the device is not 106.
My patch is slightly broken where I edited out a local board variant by hand. I'll produce a cleaned up patch based on my Sandpoint tree once I've tested it together with the 85xx I2C driver.
- Adrian Cox
Humboldt Solutions Ltd.
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
Quoted 9 lines · Adrian Cox
Quoted 3 lines · Kumar Gala
I'm confused are we adding the OCP struct for every 10x device? Did we
get closure on the question if 105, 106 & 8240 would also work?According to the chip manuals:
107, 8240, and 8245 have the internal peripherals and should work. 105 and 106 don't have internal peripherals.
Quoted 8 lines
mpc10x_common.csupports 106, 107, 8240, and 8245, but does not support 105.The code only adds the OCP devices if the device is not 106.
My patch is slightly broken where I edited out a local board variant by hand. I'll produce a cleaned up patch based on my Sandpoint tree once I've tested it together with the 85xx I2C driver.
Ok, I think the 1st patch had this code, and 2nd seemed to lose it (or I did not see it).
- kumar
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/