ppc: Update PPC440SPe support
PATCH 1/3 ppc: Update PPC440SPe support
ppc: Update PPC440SPe support
This patch updates the AMCC 440SPe support in arch/ppc. It's done in preparation for the support of the new AMCC 440SPe eval board katmai.
Signed-off-by Stefan Roese <[email protected]>
---
commit c268079210504e5c5a2ae94aa449aa244545ba22
tree ff46ca68445236f1d359be13e814ea1046acb083
parent 2e175a90047a2dbc76fde169c990164895b25dfc
author Stefan Roese <[email protected]> Mon, 02 Apr 2007 10:44:13 +0200 committer Stefan Roese <[email protected]> Mon, 02 Apr 2007 10:44:13 +0200
arch/ppc/platforms/4xx/ppc440spe.c | 242 ++++++++++++++++ arch/ppc/platforms/4xx/ppc440spe.h | 29 +- arch/ppc/syslib/Makefile | 6 arch/ppc/syslib/ppc440spe_pcie.c | 549 ++++++++++++++++++++++++++++-------- arch/ppc/syslib/ppc440spe_pcie.h | 16 + include/asm-ppc/ibm44x.h | 11 + 6 files changed, 709 insertions(+), 144 deletions(-)
arch/ppc/platforms/4xx/ppc440spe.c +239 -3
@@ -22,6 +22,13 @@#include <asm/ocp.h> #include <asm/ppc4xx_pic.h> +#if defined(CONFIG_AMCC_PPC440SPE_ADMA ) +#include <syslib/ppc440spe_pcie.h> +#include <linux/async_tx.h> +#include <linux/platform_device.h> +#include <asm/ppc440spe_adma.h> +#endif +static struct ocp_func_emac_data ppc440spe_emac0_def = { .rgmii_idx =-1 ,/* No RGMII */ .rgmii_mux =-1 ,/* No RGMII */
@@ -129,18 +136,247 @@ struct ocp_def core_ocp[] = {struct ppc4xx_uic_settings ppc4xx_core_uic_cfg[]__initdata = { { .polarity =0xffffffff , .triggering =0x010f0004 , - .ext_irq_mask =0x00000000 , + .ext_irq_mask =0x00402000 ,/* IRQ15, IRQ14 */ }, { .polarity =0xffffffff , .triggering =0x001f8040 , - .ext_irq_mask =0x00007c30 ,/* IRQ6 - IRQ7, IRQ8 - IRQ12 */ + .ext_irq_mask =0x80007c30 ,/* IRQ13, IRQ12 - IRQ8, IRQ7 - IRQ6 */ }, { .polarity =0xffffffff , .triggering =0x00000000 , - .ext_irq_mask =0x000000fc ,/* IRQ0 - IRQ5 */ + .ext_irq_mask =0x000000fc ,/* IRQ5 - IRQ0 */ }, { .polarity =0xffffffff , .triggering =0x00000000 , .ext_irq_mask =0x00000000 , }, }; + +#if defined(CONFIG_AMCC_PPC440SPE_ADMA ) + +static u64 ppc440spe_adma_dmamask =DMA_32BIT_MASK ; + +/* DMA and XOR platform devices' resources */ +static struct resource ppc440spe_dma_0_resources[] = { + { + .flags =IORESOURCE_MEM , + }, + { + .start =DMA0_CS_FIFO_NEED_SERVICE , + .end =DMA0_CS_FIFO_NEED_SERVICE , + .flags =IORESOURCE_IRQ + } +}; + +static struct resource ppc440spe_dma_1_resources[] = { + { + .flags =IORESOURCE_MEM , + }, + { + .start =DMA1_CS_FIFO_NEED_SERVICE , + .end =DMA1_CS_FIFO_NEED_SERVICE , + .flags =IORESOURCE_IRQ + } +}; + +static struct resource ppc440spe_xor_resources[] = { + { + .flags =IORESOURCE_MEM , + }, + { + .start =XOR_INTERRUPT , + .end =XOR_INTERRUPT , + .flags =IORESOURCE_IRQ + } +}; + +/* DMA and XOR platform devices' data */ +static struct ppc440spe_adma_platform_data ppc440spe_dma_0_data = { + .hw_id =PPC440SPE_DMA0_ID , + .capabilities =DMA_CAP_MEMCPY |DMA_CAP_INTERRUPT , + .pool_size =PAGE_SIZE , +}; + +static struct ppc440spe_adma_platform_data ppc440spe_dma_1_data = { + .hw_id =PPC440SPE_DMA1_ID , + .capabilities =DMA_CAP_MEMCPY |DMA_CAP_INTERRUPT , + .pool_size =PAGE_SIZE , +}; + +static struct ppc440spe_adma_platform_data ppc440spe_xor_data = { + .hw_id =PPC440SPE_XOR_ID , + .capabilities =DMA_CAP_XOR |DMA_CAP_INTERRUPT , + .pool_size =PAGE_SIZE , +}; + +/* DMA and XOR platform devices definitions */ +static struct platform_device ppc440spe_dma_0_channel = { + .name ="PPC440SPE-ADMA" , + .id =PPC440SPE_DMA0_ID , + .num_resources =ARRAY_SIZE (ppc440spe_dma_0_resources), + .resource = ppc440spe_dma_0_resources, + .dev = { + .dma_mask = &ppc440spe_adma_dmamask, + .coherent_dma_mask =DMA_64BIT_MASK , + .platform_data = (void *) &ppc440spe_dma_0_data, + }, +}; + +static struct platform_device ppc440spe_dma_1_channel = { + .name ="PPC440SPE-ADMA" , + .id =PPC440SPE_DMA1_ID , + .num_resources =ARRAY_SIZE (ppc440spe_dma_1_resources), + .resource = ppc440spe_dma_1_resources, + .dev = { + .dma_mask = &ppc440spe_adma_dmamask, + .coherent_dma_mask =DMA_64BIT_MASK , + .platform_data = (void *) &ppc440spe_dma_1_data, + }, +}; + +static struct platform_device ppc440spe_xor_channel = { + .name ="PPC440SPE-ADMA" , + .id =PPC440SPE_XOR_ID , + .num_resources =ARRAY_SIZE (ppc440spe_xor_resources), + .resource = ppc440spe_xor_resources, + .dev = { + .dma_mask = &ppc440spe_adma_dmamask, + .coherent_dma_mask =DMA_64BIT_MASK , + .platform_data = (void *) &ppc440spe_xor_data, + }, +}; + +/* +* Init DMA0/1 and XOR engines; allocate memory for DMAx FIFOs; set platform_device +* memory resources addresses +*/ +static void ppc440spe_configure_raid_devices (void ) +{ +void *fifo_buf; +i2o_regs_t *i2o_reg; +dma_regs_t *dma_reg0, *dma_reg1; +xor_regs_t *xor_reg; +u32 mask; + +/* +* Map registers and allocate fifo buffer +*/ +if (!(i2o_reg =ioremap (I2O_MMAP_BASE ,I2O_MMAP_SIZE ))) { +printk (KERN_ERR "I2O registers mapping failed.\n" ); +return ; + } +if (!(dma_reg0 =ioremap (DMA0_MMAP_BASE ,DMA_MMAP_SIZE ))) { +printk (KERN_ERR "DMA0 registers mapping failed.\n" ); + goto err1; + } +if (!(dma_reg1 =ioremap (DMA1_MMAP_BASE ,DMA_MMAP_SIZE ))) { +printk (KERN_ERR "DMA1 registers mapping failed.\n" ); + goto err2; + } +if (!(xor_reg =ioremap (XOR_MMAP_BASE ,XOR_MMAP_SIZE ))) { +printk (KERN_ERR "XOR registers mapping failed.\n" ); + goto err3; + } + +/* Provide memory regions for DMA's FIFOs: I2O, DMA0 and DMA1 share +* the base address of FIFO memory space. +* Actually we need twice more physical memory than programmed in the +* <fsiz> register (because there are two FIFOs foreach DMA: CP and CS) +*/ + fifo_buf =kmalloc ((DMA0_FIFO_SIZE +DMA1_FIFO_SIZE )<<1 ,GFP_KERNEL ); +if (!fifo_buf) { +printk (KERN_ERR "DMA FIFO buffer allocating failed.\n" ); + goto err4; + } + +/* +* Configure h/w +*/ +/* Reset I2O/DMA */ +SDR_WRITE (DCRN_SDR_SRST ,DCRN_SDR_SRST_I2ODMA ); +SDR_WRITE (DCRN_SDR_SRST ,0 ); + +/* Reset XOR */ +out_be32 (&xor_reg->crsr,XOR_CRSR_XASR_BIT ); +out_be32 (&xor_reg->crrr,XOR_CRSR_64BA_BIT ); + +/* Setup the base address of mmaped registers */ +mtdcr (DCRN_I2O0_IBAH , (u32)(I2O_MMAP_BASE >>32 )); +mtdcr (DCRN_I2O0_IBAL , (u32)(I2O_MMAP_BASE ) |I2O_REG_ENABLE ); + +/* SetUp FIFO memory space base address */ +out_le32 (&i2o_reg->ifbah,0 ); +out_le32 (&i2o_reg->ifbal, ((u32 )__pa (fifo_buf))); + +/* set zero FIFO size for I2O, so the whole fifo_buf is used by DMAs. +* DMA0_FIFO_SIZE is defined in bytes, <fsiz> - in number of CDB pointers (8byte). +* DMA FIFO Length = CSlength + CPlength, where +* CSlength = CPlength = (fsiz + 1) * 8. +*/ +out_le32 (&i2o_reg->ifsiz,0 ); +out_le32 (&dma_reg0->fsiz,DMA_FIFO_ENABLE | ((DMA0_FIFO_SIZE >>3 ) -2 )); +out_le32 (&dma_reg1->fsiz,DMA_FIFO_ENABLE | ((DMA1_FIFO_SIZE >>3 ) -2 )); + +/* Configure DMA engine */ +out_le32 (&dma_reg0->cfg,DMA_CFG_DXEPR_HP |DMA_CFG_DFMPP_HP |DMA_CFG_FALGN ); +out_le32 (&dma_reg1->cfg,DMA_CFG_DXEPR_HP |DMA_CFG_DFMPP_HP |DMA_CFG_FALGN ); + +/* Clear Status */ +out_le32 (&dma_reg0->dsts, ~0 ); +out_le32 (&dma_reg1->dsts, ~0 ); + +/* Unmask 'CS FIFO Attention' interrupts */ + mask =in_le32 (&i2o_reg->iopim) & ~(I2O_IOPIM_P0SNE |I2O_IOPIM_P1SNE ); +out_le32 (&i2o_reg->iopim, mask); + +/* enable XOR engine interrupt */ +out_be32 (&xor_reg->ier,XOR_IE_CBCIE_BIT ); + +/* +* Unmap I2O registers +*/ +iounmap (i2o_reg); + +/* +* Set resource addresses +*/ + ppc440spe_dma_0_channel.resource[0 ].start = (resource_size_t)(dma_reg0); + ppc440spe_dma_0_channel.resource[0 ].end = + ppc440spe_dma_0_channel.resource[0 ].start+DMA_MMAP_SIZE ; + + ppc440spe_dma_1_channel.resource[0 ].start = (resource_size_t)(dma_reg1); + ppc440spe_dma_1_channel.resource[0 ].end = + ppc440spe_dma_1_channel.resource[0 ].start+DMA_MMAP_SIZE ; + + ppc440spe_xor_channel.resource[0 ].start = (resource_size_t)(xor_reg); + ppc440spe_xor_channel.resource[0 ].end = + ppc440spe_xor_channel.resource[0 ].start+XOR_MMAP_SIZE ; + +return ; +err4: +iounmap (xor_reg); +err3: +iounmap (dma_reg1); +err2: +iounmap (dma_reg0); +err1: +iounmap (i2o_reg); +return ; +} + +static struct platform_device *ppc440spe_devs[]__initdata = { + &ppc440spe_dma_0_channel, + &ppc440spe_dma_1_channel, + &ppc440spe_xor_channel, +}; + +static int __init ppc440spe_register_raid_devices (void ) +{ +ppc440spe_configure_raid_devices (); +platform_add_devices (ppc440spe_devs,ARRAY_SIZE (ppc440spe_devs)); + +return 0 ; +} + +arch_initcall (ppc440spe_register_raid_devices); +#endif /* CONFIG_AMCC_PPC440SPE_ADMA */
arch/ppc/platforms/4xx/ppc440spe.h +17 -12
@@ -17,7 +17,6 @@#ifndef __PPC_PLATFORMS_PPC440SPE_H#define __PPC_PLATFORMS_PPC440SPE_H -#include <asm/ibm44x.h> /* UART */
@@ -28,23 +27,28 @@#define UART1_INT 1#define UART2_INT 37 +/* GPIO macro register defines */ +#define GPIO_BASE 0x00000004f0000700ULL +#define GPIO0_OR_OFFS 0x0 +#define GPIO0_IR_OFFS 0x1C +/* Clock and Power Management */ #define IBM_CPM_IIC0 0x80000000/* IIC interface */ #define IBM_CPM_IIC1 0x40000000/* IIC interface */ #define IBM_CPM_PCI 0x20000000/* PCI bridge */ -#define IBM_CPM_CPU 0x02000000/* processor core */ -#define IBM_CPM_DMA 0x01000000/* DMA controller */ -#define IBM_CPM_BGO 0x00800000/* PLB to OPB bus arbiter */ -#define IBM_CPM_BGI 0x00400000/* OPB to PLB bridge */ -#define IBM_CPM_EBC 0x00200000/* External Bux Controller */ -#define IBM_CPM_EBM 0x00100000/* Ext Bus Master Interface */ -#define IBM_CPM_DMC 0x00080000/* SDRAM peripheral controller */ -#define IBM_CPM_PLB 0x00040000/* PLB bus arbiter */ +#define IBM_CPM_CPU 0x02000000/* processor core */ +#define IBM_CPM_DMA 0x01000000/* DMA controller */ +#define IBM_CPM_BGO 0x00800000/* PLB to OPB bus arbiter */ +#define IBM_CPM_BGI 0x00400000/* OPB to PLB bridge */ +#define IBM_CPM_EBC 0x00200000/* External Bux Controller */ +#define IBM_CPM_EBM 0x00100000/* Ext Bus Master Interface */ +#define IBM_CPM_DMC 0x00080000/* SDRAM peripheral controller */ +#define IBM_CPM_PLB 0x00040000/* PLB bus arbiter */ #define IBM_CPM_SRAM 0x00020000/* SRAM memory controller */ -#define IBM_CPM_PPM 0x00002000/* PLB Performance Monitor */ +#define IBM_CPM_PPM 0x00002000/* PLB Performance Monitor */ #define IBM_CPM_UIC1 0x00001000/* Universal Interrupt Controller */ #define IBM_CPM_GPIO0 0x00000800/* General Purpose IO (??) */ -#define IBM_CPM_GPT 0x00000400/* General Purpose Timers */ +#define IBM_CPM_GPT 0x00000400/* General Purpose Timers */ #define IBM_CPM_UART0 0x00000200/* serial port 0 */ #define IBM_CPM_UART1 0x00000100/* serial port 1 */ #define IBM_CPM_UART2 0x00000100/* serial port 1 */
@@ -59,5 +63,6 @@ | IBM_CPM_TAHOE0 | IBM_CPM_TAHOE1 \ | IBM_CPM_EMAC0 | IBM_CPM_EMAC1 \ | IBM_CPM_EMAC2 | IBM_CPM_EMAC3 ) -#endif /* __PPC_PLATFORMS_PPC440SP_H */ + +#endif /* __PPC_PLATFORMS_PPC440SPE_H */ #endif /* __KERNEL__ */
arch/ppc/syslib/Makefile +3 -3
@@ -28,7 +28,6 @@ endif endif obj-$(CONFIG_44x) += ppc4xx_pic.o obj-$(CONFIG_40x) += ppc4xx_setup.o -obj-$(CONFIG_GEN_RTC) += todc_time.o obj-$(CONFIG_PPC4xx_DMA) += ppc4xx_dma.o obj-$(CONFIG_PPC4xx_EDMA) += ppc4xx_sgdma.o ifeq ($(CONFIG_40x),y)
@@ -48,9 +47,9 @@ obj-$(CONFIG_CHESTNUT) += mv64360_pic.o pci_auto.o obj-$(CONFIG_GT64260) += gt64260_pic.o obj-$(CONFIG_LOPEC) += pci_auto.o todc_time.o obj-$(CONFIG_HDPU) += pci_auto.o -obj-$(CONFIG_LUAN) += pci_auto.o todc_time.o -obj-$(CONFIG_YUCCA) += pci_auto.o todc_time.o obj-$(CONFIG_KATANA) += pci_auto.o +obj-$(CONFIG_KATMAI) += pci_auto.o +obj-$(CONFIG_LUAN) += pci_auto.o todc_time.o obj-$(CONFIG_MV64360) += mv64360_pic.o obj-$(CONFIG_MV64X60) += mv64x60.o mv64x60_win.o obj-$(CONFIG_MVME5100) += open_pic.o todc_time.o \
@@ -70,6 +69,7 @@ obj-$(CONFIG_SBC82xx) += todc_time.o obj-$(CONFIG_SPRUCE) += cpc700_pic.o pci_auto.o \ todc_time.o obj-$(CONFIG_TAISHAN) += pci_auto.o +obj-$(CONFIG_YUCCA) += pci_auto.o todc_time.o obj-$(CONFIG_8260) += m8260_setup.o pq2_devices.o pq2_sys.o \ ppc_sys.o obj-$(CONFIG_PCI_8260) += m82xx_pci.o pci_auto.o
arch/ppc/syslib/ppc440spe_pcie.c +429 -120
775 lines not on this page · raw message
arch/ppc/syslib/ppc440spe_pcie.h +12 -4
@@ -13,6 +13,8 @@#define DCRN_SDR0_CFGADDR 0x00e#define DCRN_SDR0_CFGDATA 0x00f +#define DCRN_I2O0_IBAL 0x066 +#define DCRN_I2O0_IBAH 0x067#define DCRN_PCIE0_BASE 0x100#define DCRN_PCIE1_BASE 0x120
@@ -136,14 +138,20 @@*/ #define PECFG_BAR0LMPA 0x210#define PECFG_BAR0HMPA 0x214 -#define PECFG_PIMEN 0x33c +#define PECFG_BAR1MPA 0x218 +#define PECFG_BAR2MPA 0x220 +#define PECFG_PIMEN 0x33c#define PECFG_PIM0LAL 0x340#define PECFG_PIM0LAH 0x344 +#define PECFG_PIM1LAL 0x348 +#define PECFG_PIM1LAH 0x34c +#define PECFG_PIM01SAL 0x350 +#define PECFG_PIM01SAH 0x354#define PECFG_POM0LAL 0x380#define PECFG_POM0LAH 0x384 -int ppc440spe_init_pcie (void ); -int ppc440spe_init_pcie_rootport (int port); -void ppc440spe_setup_pcie (struct pci_controller *hose,int port); +int ppc440spe_revB (void ); +int ppc440spe_init_pcie_root_or_endport (u32 port); +int ppc440spe_setup_pcie (struct pci_controller *hose,u32 port);#endif /* __PPC_SYSLIB_PPC440SPE_PCIE_H */
include/asm-ppc/ibm44x.h +9 -2
@@ -85,7 +85,7 @@*/ #if defined(CONFIG_440SP ) || defined(CONFIG_440SPE )#define PPC44x_IO_LO 0xf0000000UL -#define PPC44x_IO_HI 0xf0000fffUL +#define PPC44x_IO_HI 0xffffffffUL/* used not only for PCI-IO but for EBC too */ #define PPC44x_PCI0CFG_LO 0x0ec00000UL#define PPC44x_PCI0CFG_HI 0x0ec00007UL#define PPC44x_PCI1CFG_LO 0x1ec00000UL
@@ -556,12 +556,19 @@#define PCIX1_CFGD 0x1ec00004UL#define PCIX2_CFGD 0x2ec00004UL +#if defined (CONFIG_440SPE ) +#define PCIX0_IO_BASE 0x0000000C08000000ULL +#else #define PCIX0_IO_BASE 0x0000000908000000ULL#define PCIX1_IO_BASE 0x0000000908000000ULL#define PCIX2_IO_BASE 0x0000000908000000ULL +#endif +#define PCIX_IO_SIZE 0x00010000 -#ifdef CONFIG_440SP +#if defined (CONFIG_440SPE ) +#define PCIX0_REG_BASE 0x0000000c0ec80000ULL +#elif defined(CONFIG_440SP )#define PCIX0_REG_BASE 0x000000090ec80000ULL#else #define PCIX0_REG_BASE 0x000000020ec80000ULL