Path: blob/master/arch/powerpc/platforms/chrp/pegasos_eth.c
10820 views
/*1* Copyright (C) 2005 Sven Luther <[email protected]>2* Thanks to :3* Dale Farnsworth <[email protected]>4* Mark A. Greer <[email protected]>5* Nicolas DET <[email protected]>6* Benjamin Herrenschmidt <[email protected]>7* And anyone else who helped me on this.8*/910#include <linux/types.h>11#include <linux/init.h>12#include <linux/ioport.h>13#include <linux/device.h>14#include <linux/platform_device.h>15#include <linux/mv643xx.h>16#include <linux/pci.h>1718#define PEGASOS2_MARVELL_REGBASE (0xf1000000)19#define PEGASOS2_MARVELL_REGSIZE (0x00004000)20#define PEGASOS2_SRAM_BASE (0xf2000000)21#define PEGASOS2_SRAM_SIZE (256*1024)2223#define PEGASOS2_SRAM_BASE_ETH_PORT0 (PEGASOS2_SRAM_BASE)24#define PEGASOS2_SRAM_BASE_ETH_PORT1 (PEGASOS2_SRAM_BASE_ETH_PORT0 + (PEGASOS2_SRAM_SIZE / 2) )252627#define PEGASOS2_SRAM_RXRING_SIZE (PEGASOS2_SRAM_SIZE/4)28#define PEGASOS2_SRAM_TXRING_SIZE (PEGASOS2_SRAM_SIZE/4)2930#undef BE_VERBOSE3132static struct resource mv643xx_eth_shared_resources[] = {33[0] = {34.name = "ethernet shared base",35.start = 0xf1000000 + MV643XX_ETH_SHARED_REGS,36.end = 0xf1000000 + MV643XX_ETH_SHARED_REGS +37MV643XX_ETH_SHARED_REGS_SIZE - 1,38.flags = IORESOURCE_MEM,39},40};4142static struct platform_device mv643xx_eth_shared_device = {43.name = MV643XX_ETH_SHARED_NAME,44.id = 0,45.num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources),46.resource = mv643xx_eth_shared_resources,47};4849static struct resource mv643xx_eth_port1_resources[] = {50[0] = {51.name = "eth port1 irq",52.start = 9,53.end = 9,54.flags = IORESOURCE_IRQ,55},56};5758static struct mv643xx_eth_platform_data eth_port1_pd = {59.shared = &mv643xx_eth_shared_device,60.port_number = 1,61.phy_addr = MV643XX_ETH_PHY_ADDR(7),6263.tx_sram_addr = PEGASOS2_SRAM_BASE_ETH_PORT1,64.tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE,65.tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16,6667.rx_sram_addr = PEGASOS2_SRAM_BASE_ETH_PORT1 + PEGASOS2_SRAM_TXRING_SIZE,68.rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE,69.rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16,70};7172static struct platform_device eth_port1_device = {73.name = MV643XX_ETH_NAME,74.id = 1,75.num_resources = ARRAY_SIZE(mv643xx_eth_port1_resources),76.resource = mv643xx_eth_port1_resources,77.dev = {78.platform_data = ð_port1_pd,79},80};8182static struct platform_device *mv643xx_eth_pd_devs[] __initdata = {83&mv643xx_eth_shared_device,84ð_port1_device,85};8687/***********/88/***********/89#define MV_READ(offset,val) { val = readl(mv643xx_reg_base + offset); }90#define MV_WRITE(offset,data) writel(data, mv643xx_reg_base + offset)9192static void __iomem *mv643xx_reg_base;9394static int Enable_SRAM(void)95{96u32 ALong;9798if (mv643xx_reg_base == NULL)99mv643xx_reg_base = ioremap(PEGASOS2_MARVELL_REGBASE,100PEGASOS2_MARVELL_REGSIZE);101102if (mv643xx_reg_base == NULL)103return -ENOMEM;104105#ifdef BE_VERBOSE106printk("Pegasos II/Marvell MV64361: register remapped from %p to %p\n",107(void *)PEGASOS2_MARVELL_REGBASE, (void *)mv643xx_reg_base);108#endif109110MV_WRITE(MV64340_SRAM_CONFIG, 0);111112MV_WRITE(MV64340_INTEGRATED_SRAM_BASE_ADDR, PEGASOS2_SRAM_BASE >> 16);113114MV_READ(MV64340_BASE_ADDR_ENABLE, ALong);115ALong &= ~(1 << 19);116MV_WRITE(MV64340_BASE_ADDR_ENABLE, ALong);117118ALong = 0x02;119ALong |= PEGASOS2_SRAM_BASE & 0xffff0000;120MV_WRITE(MV643XX_ETH_BAR_4, ALong);121122MV_WRITE(MV643XX_ETH_SIZE_REG_4, (PEGASOS2_SRAM_SIZE-1) & 0xffff0000);123124MV_READ(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong);125ALong &= ~(1 << 4);126MV_WRITE(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong);127128#ifdef BE_VERBOSE129printk("Pegasos II/Marvell MV64361: register unmapped\n");130printk("Pegasos II/Marvell MV64361: SRAM at %p, size=%x\n", (void*) PEGASOS2_SRAM_BASE, PEGASOS2_SRAM_SIZE);131#endif132133iounmap(mv643xx_reg_base);134mv643xx_reg_base = NULL;135136return 1;137}138139140/***********/141/***********/142static int __init mv643xx_eth_add_pds(void)143{144int ret = 0;145static struct pci_device_id pci_marvell_mv64360[] = {146{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_MV64360) },147{ }148};149150#ifdef BE_VERBOSE151printk("Pegasos II/Marvell MV64361: init\n");152#endif153154if (pci_dev_present(pci_marvell_mv64360)) {155ret = platform_add_devices(mv643xx_eth_pd_devs,156ARRAY_SIZE(mv643xx_eth_pd_devs));157158if ( Enable_SRAM() < 0)159{160eth_port1_pd.tx_sram_addr = 0;161eth_port1_pd.tx_sram_size = 0;162eth_port1_pd.rx_sram_addr = 0;163eth_port1_pd.rx_sram_size = 0;164165#ifdef BE_VERBOSE166printk("Pegasos II/Marvell MV64361: Can't enable the "167"SRAM\n");168#endif169}170}171172#ifdef BE_VERBOSE173printk("Pegasos II/Marvell MV64361: init is over\n");174#endif175176return ret;177}178179device_initcall(mv643xx_eth_add_pds);180181182