diff options
author | Nicolas DET <nd@bplan-gmbh.de> | 2005-10-28 20:46:25 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-10-29 00:41:08 -0400 |
commit | dd03d25fac90ee6f394874fb4e6995866304e4ba (patch) | |
tree | 41de23fde9f9e8f983825b846c335856d489b73c /arch | |
parent | 8c9795ba01d02b043ce2d9eeb0fa908c07e5fb42 (diff) |
[PATCH] chrp_pegasos_eth: Added Marvell Discovery II SRAM support
Add proper entry to support the Marvell MV64361 (Marvell Discovery II)
SRAM.
This feature may be used by the mv643xx_eth driver.
Signed-off-by: Nicolas DET <det.nicolas@free.fr>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/platforms/chrp/pegasos_eth.c | 124 | ||||
-rw-r--r-- | arch/ppc/platforms/chrp_pegasos_eth.c | 124 |
2 files changed, 236 insertions, 12 deletions
diff --git a/arch/powerpc/platforms/chrp/pegasos_eth.c b/arch/powerpc/platforms/chrp/pegasos_eth.c index cad5bfa153b2..a9052305c35d 100644 --- a/arch/powerpc/platforms/chrp/pegasos_eth.c +++ b/arch/powerpc/platforms/chrp/pegasos_eth.c | |||
@@ -17,7 +17,20 @@ | |||
17 | #include <linux/mv643xx.h> | 17 | #include <linux/mv643xx.h> |
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | 19 | ||
20 | /* Pegasos 2 specific Marvell MV 64361 gigabit ethernet port setup */ | 20 | #define PEGASOS2_MARVELL_REGBASE (0xf1000000) |
21 | #define PEGASOS2_MARVELL_REGSIZE (0x00004000) | ||
22 | #define PEGASOS2_SRAM_BASE (0xf2000000) | ||
23 | #define PEGASOS2_SRAM_SIZE (256*1024) | ||
24 | |||
25 | #define PEGASOS2_SRAM_BASE_ETH0 (PEGASOS2_SRAM_BASE) | ||
26 | #define PEGASOS2_SRAM_BASE_ETH1 (PEGASOS2_SRAM_BASE_ETH0 + (PEGASOS2_SRAM_SIZE / 2) ) | ||
27 | |||
28 | |||
29 | #define PEGASOS2_SRAM_RXRING_SIZE (PEGASOS2_SRAM_SIZE/4) | ||
30 | #define PEGASOS2_SRAM_TXRING_SIZE (PEGASOS2_SRAM_SIZE/4) | ||
31 | |||
32 | #undef BE_VERBOSE | ||
33 | |||
21 | static struct resource mv643xx_eth_shared_resources[] = { | 34 | static struct resource mv643xx_eth_shared_resources[] = { |
22 | [0] = { | 35 | [0] = { |
23 | .name = "ethernet shared base", | 36 | .name = "ethernet shared base", |
@@ -44,7 +57,16 @@ static struct resource mv643xx_eth0_resources[] = { | |||
44 | }, | 57 | }, |
45 | }; | 58 | }; |
46 | 59 | ||
47 | static struct mv643xx_eth_platform_data eth0_pd; | 60 | |
61 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
62 | .tx_sram_addr = PEGASOS2_SRAM_BASE_ETH0, | ||
63 | .tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE, | ||
64 | .tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16, | ||
65 | |||
66 | .rx_sram_addr = PEGASOS2_SRAM_BASE_ETH0 + PEGASOS2_SRAM_TXRING_SIZE, | ||
67 | .rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE, | ||
68 | .rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16, | ||
69 | }; | ||
48 | 70 | ||
49 | static struct platform_device eth0_device = { | 71 | static struct platform_device eth0_device = { |
50 | .name = MV643XX_ETH_NAME, | 72 | .name = MV643XX_ETH_NAME, |
@@ -65,7 +87,15 @@ static struct resource mv643xx_eth1_resources[] = { | |||
65 | }, | 87 | }, |
66 | }; | 88 | }; |
67 | 89 | ||
68 | static struct mv643xx_eth_platform_data eth1_pd; | 90 | static struct mv643xx_eth_platform_data eth1_pd = { |
91 | .tx_sram_addr = PEGASOS2_SRAM_BASE_ETH1, | ||
92 | .tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE, | ||
93 | .tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16, | ||
94 | |||
95 | .rx_sram_addr = PEGASOS2_SRAM_BASE_ETH1 + PEGASOS2_SRAM_TXRING_SIZE, | ||
96 | .rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE, | ||
97 | .rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16, | ||
98 | }; | ||
69 | 99 | ||
70 | static struct platform_device eth1_device = { | 100 | static struct platform_device eth1_device = { |
71 | .name = MV643XX_ETH_NAME, | 101 | .name = MV643XX_ETH_NAME, |
@@ -83,9 +113,62 @@ static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | |||
83 | ð1_device, | 113 | ð1_device, |
84 | }; | 114 | }; |
85 | 115 | ||
116 | /***********/ | ||
117 | /***********/ | ||
118 | #define MV_READ(offset,val) { val = readl(mv643xx_reg_base + offset); } | ||
119 | #define MV_WRITE(offset,data) writel(data, mv643xx_reg_base + offset) | ||
120 | |||
121 | static void __iomem *mv643xx_reg_base; | ||
122 | |||
123 | static int Enable_SRAM(void) | ||
124 | { | ||
125 | u32 ALong; | ||
126 | |||
127 | if (mv643xx_reg_base == NULL) | ||
128 | mv643xx_reg_base = ioremap(PEGASOS2_MARVELL_REGBASE, | ||
129 | PEGASOS2_MARVELL_REGSIZE); | ||
130 | |||
131 | if (mv643xx_reg_base == NULL) | ||
132 | return -ENOMEM; | ||
133 | |||
134 | #ifdef BE_VERBOSE | ||
135 | printk("Pegasos II/Marvell MV64361: register remapped from %p to %p\n", | ||
136 | (void *)PEGASOS2_MARVELL_REGBASE, (void *)mv643xx_reg_base); | ||
137 | #endif | ||
138 | |||
139 | MV_WRITE(MV64340_SRAM_CONFIG, 0); | ||
86 | 140 | ||
87 | int | 141 | MV_WRITE(MV64340_INTEGRATED_SRAM_BASE_ADDR, PEGASOS2_SRAM_BASE >> 16); |
88 | mv643xx_eth_add_pds(void) | 142 | |
143 | MV_READ(MV64340_BASE_ADDR_ENABLE, ALong); | ||
144 | ALong &= ~(1 << 19); | ||
145 | MV_WRITE(MV64340_BASE_ADDR_ENABLE, ALong); | ||
146 | |||
147 | ALong = 0x02; | ||
148 | ALong |= PEGASOS2_SRAM_BASE & 0xffff0000; | ||
149 | MV_WRITE(MV643XX_ETH_BAR_4, ALong); | ||
150 | |||
151 | MV_WRITE(MV643XX_ETH_SIZE_REG_4, (PEGASOS2_SRAM_SIZE-1) & 0xffff0000); | ||
152 | |||
153 | MV_READ(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong); | ||
154 | ALong &= ~(1 << 4); | ||
155 | MV_WRITE(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong); | ||
156 | |||
157 | #ifdef BE_VERBOSE | ||
158 | printk("Pegasos II/Marvell MV64361: register unmapped\n"); | ||
159 | printk("Pegasos II/Marvell MV64361: SRAM at %p, size=%x\n", (void*) PEGASOS2_SRAM_BASE, PEGASOS2_SRAM_SIZE); | ||
160 | #endif | ||
161 | |||
162 | iounmap(mv643xx_reg_base); | ||
163 | mv643xx_reg_base = NULL; | ||
164 | |||
165 | return 1; | ||
166 | } | ||
167 | |||
168 | |||
169 | /***********/ | ||
170 | /***********/ | ||
171 | int mv643xx_eth_add_pds(void) | ||
89 | { | 172 | { |
90 | int ret = 0; | 173 | int ret = 0; |
91 | static struct pci_device_id pci_marvell_mv64360[] = { | 174 | static struct pci_device_id pci_marvell_mv64360[] = { |
@@ -93,9 +176,38 @@ mv643xx_eth_add_pds(void) | |||
93 | { } | 176 | { } |
94 | }; | 177 | }; |
95 | 178 | ||
179 | #ifdef BE_VERBOSE | ||
180 | printk("Pegasos II/Marvell MV64361: init\n"); | ||
181 | #endif | ||
182 | |||
96 | if (pci_dev_present(pci_marvell_mv64360)) { | 183 | if (pci_dev_present(pci_marvell_mv64360)) { |
97 | ret = platform_add_devices(mv643xx_eth_pd_devs, ARRAY_SIZE(mv643xx_eth_pd_devs)); | 184 | ret = platform_add_devices(mv643xx_eth_pd_devs, |
185 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
186 | |||
187 | if ( Enable_SRAM() < 0) | ||
188 | { | ||
189 | eth0_pd.tx_sram_addr = 0; | ||
190 | eth0_pd.tx_sram_size = 0; | ||
191 | eth0_pd.rx_sram_addr = 0; | ||
192 | eth0_pd.rx_sram_size = 0; | ||
193 | |||
194 | eth1_pd.tx_sram_addr = 0; | ||
195 | eth1_pd.tx_sram_size = 0; | ||
196 | eth1_pd.rx_sram_addr = 0; | ||
197 | eth1_pd.rx_sram_size = 0; | ||
198 | |||
199 | #ifdef BE_VERBOSE | ||
200 | printk("Pegasos II/Marvell MV64361: Can't enable the " | ||
201 | "SRAM\n"); | ||
202 | #endif | ||
203 | } | ||
98 | } | 204 | } |
205 | |||
206 | #ifdef BE_VERBOSE | ||
207 | printk("Pegasos II/Marvell MV64361: init is over\n"); | ||
208 | #endif | ||
209 | |||
99 | return ret; | 210 | return ret; |
100 | } | 211 | } |
212 | |||
101 | device_initcall(mv643xx_eth_add_pds); | 213 | device_initcall(mv643xx_eth_add_pds); |
diff --git a/arch/ppc/platforms/chrp_pegasos_eth.c b/arch/ppc/platforms/chrp_pegasos_eth.c index cad5bfa153b2..a9052305c35d 100644 --- a/arch/ppc/platforms/chrp_pegasos_eth.c +++ b/arch/ppc/platforms/chrp_pegasos_eth.c | |||
@@ -17,7 +17,20 @@ | |||
17 | #include <linux/mv643xx.h> | 17 | #include <linux/mv643xx.h> |
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | 19 | ||
20 | /* Pegasos 2 specific Marvell MV 64361 gigabit ethernet port setup */ | 20 | #define PEGASOS2_MARVELL_REGBASE (0xf1000000) |
21 | #define PEGASOS2_MARVELL_REGSIZE (0x00004000) | ||
22 | #define PEGASOS2_SRAM_BASE (0xf2000000) | ||
23 | #define PEGASOS2_SRAM_SIZE (256*1024) | ||
24 | |||
25 | #define PEGASOS2_SRAM_BASE_ETH0 (PEGASOS2_SRAM_BASE) | ||
26 | #define PEGASOS2_SRAM_BASE_ETH1 (PEGASOS2_SRAM_BASE_ETH0 + (PEGASOS2_SRAM_SIZE / 2) ) | ||
27 | |||
28 | |||
29 | #define PEGASOS2_SRAM_RXRING_SIZE (PEGASOS2_SRAM_SIZE/4) | ||
30 | #define PEGASOS2_SRAM_TXRING_SIZE (PEGASOS2_SRAM_SIZE/4) | ||
31 | |||
32 | #undef BE_VERBOSE | ||
33 | |||
21 | static struct resource mv643xx_eth_shared_resources[] = { | 34 | static struct resource mv643xx_eth_shared_resources[] = { |
22 | [0] = { | 35 | [0] = { |
23 | .name = "ethernet shared base", | 36 | .name = "ethernet shared base", |
@@ -44,7 +57,16 @@ static struct resource mv643xx_eth0_resources[] = { | |||
44 | }, | 57 | }, |
45 | }; | 58 | }; |
46 | 59 | ||
47 | static struct mv643xx_eth_platform_data eth0_pd; | 60 | |
61 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
62 | .tx_sram_addr = PEGASOS2_SRAM_BASE_ETH0, | ||
63 | .tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE, | ||
64 | .tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16, | ||
65 | |||
66 | .rx_sram_addr = PEGASOS2_SRAM_BASE_ETH0 + PEGASOS2_SRAM_TXRING_SIZE, | ||
67 | .rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE, | ||
68 | .rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16, | ||
69 | }; | ||
48 | 70 | ||
49 | static struct platform_device eth0_device = { | 71 | static struct platform_device eth0_device = { |
50 | .name = MV643XX_ETH_NAME, | 72 | .name = MV643XX_ETH_NAME, |
@@ -65,7 +87,15 @@ static struct resource mv643xx_eth1_resources[] = { | |||
65 | }, | 87 | }, |
66 | }; | 88 | }; |
67 | 89 | ||
68 | static struct mv643xx_eth_platform_data eth1_pd; | 90 | static struct mv643xx_eth_platform_data eth1_pd = { |
91 | .tx_sram_addr = PEGASOS2_SRAM_BASE_ETH1, | ||
92 | .tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE, | ||
93 | .tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16, | ||
94 | |||
95 | .rx_sram_addr = PEGASOS2_SRAM_BASE_ETH1 + PEGASOS2_SRAM_TXRING_SIZE, | ||
96 | .rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE, | ||
97 | .rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16, | ||
98 | }; | ||
69 | 99 | ||
70 | static struct platform_device eth1_device = { | 100 | static struct platform_device eth1_device = { |
71 | .name = MV643XX_ETH_NAME, | 101 | .name = MV643XX_ETH_NAME, |
@@ -83,9 +113,62 @@ static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | |||
83 | ð1_device, | 113 | ð1_device, |
84 | }; | 114 | }; |
85 | 115 | ||
116 | /***********/ | ||
117 | /***********/ | ||
118 | #define MV_READ(offset,val) { val = readl(mv643xx_reg_base + offset); } | ||
119 | #define MV_WRITE(offset,data) writel(data, mv643xx_reg_base + offset) | ||
120 | |||
121 | static void __iomem *mv643xx_reg_base; | ||
122 | |||
123 | static int Enable_SRAM(void) | ||
124 | { | ||
125 | u32 ALong; | ||
126 | |||
127 | if (mv643xx_reg_base == NULL) | ||
128 | mv643xx_reg_base = ioremap(PEGASOS2_MARVELL_REGBASE, | ||
129 | PEGASOS2_MARVELL_REGSIZE); | ||
130 | |||
131 | if (mv643xx_reg_base == NULL) | ||
132 | return -ENOMEM; | ||
133 | |||
134 | #ifdef BE_VERBOSE | ||
135 | printk("Pegasos II/Marvell MV64361: register remapped from %p to %p\n", | ||
136 | (void *)PEGASOS2_MARVELL_REGBASE, (void *)mv643xx_reg_base); | ||
137 | #endif | ||
138 | |||
139 | MV_WRITE(MV64340_SRAM_CONFIG, 0); | ||
86 | 140 | ||
87 | int | 141 | MV_WRITE(MV64340_INTEGRATED_SRAM_BASE_ADDR, PEGASOS2_SRAM_BASE >> 16); |
88 | mv643xx_eth_add_pds(void) | 142 | |
143 | MV_READ(MV64340_BASE_ADDR_ENABLE, ALong); | ||
144 | ALong &= ~(1 << 19); | ||
145 | MV_WRITE(MV64340_BASE_ADDR_ENABLE, ALong); | ||
146 | |||
147 | ALong = 0x02; | ||
148 | ALong |= PEGASOS2_SRAM_BASE & 0xffff0000; | ||
149 | MV_WRITE(MV643XX_ETH_BAR_4, ALong); | ||
150 | |||
151 | MV_WRITE(MV643XX_ETH_SIZE_REG_4, (PEGASOS2_SRAM_SIZE-1) & 0xffff0000); | ||
152 | |||
153 | MV_READ(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong); | ||
154 | ALong &= ~(1 << 4); | ||
155 | MV_WRITE(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong); | ||
156 | |||
157 | #ifdef BE_VERBOSE | ||
158 | printk("Pegasos II/Marvell MV64361: register unmapped\n"); | ||
159 | printk("Pegasos II/Marvell MV64361: SRAM at %p, size=%x\n", (void*) PEGASOS2_SRAM_BASE, PEGASOS2_SRAM_SIZE); | ||
160 | #endif | ||
161 | |||
162 | iounmap(mv643xx_reg_base); | ||
163 | mv643xx_reg_base = NULL; | ||
164 | |||
165 | return 1; | ||
166 | } | ||
167 | |||
168 | |||
169 | /***********/ | ||
170 | /***********/ | ||
171 | int mv643xx_eth_add_pds(void) | ||
89 | { | 172 | { |
90 | int ret = 0; | 173 | int ret = 0; |
91 | static struct pci_device_id pci_marvell_mv64360[] = { | 174 | static struct pci_device_id pci_marvell_mv64360[] = { |
@@ -93,9 +176,38 @@ mv643xx_eth_add_pds(void) | |||
93 | { } | 176 | { } |
94 | }; | 177 | }; |
95 | 178 | ||
179 | #ifdef BE_VERBOSE | ||
180 | printk("Pegasos II/Marvell MV64361: init\n"); | ||
181 | #endif | ||
182 | |||
96 | if (pci_dev_present(pci_marvell_mv64360)) { | 183 | if (pci_dev_present(pci_marvell_mv64360)) { |
97 | ret = platform_add_devices(mv643xx_eth_pd_devs, ARRAY_SIZE(mv643xx_eth_pd_devs)); | 184 | ret = platform_add_devices(mv643xx_eth_pd_devs, |
185 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
186 | |||
187 | if ( Enable_SRAM() < 0) | ||
188 | { | ||
189 | eth0_pd.tx_sram_addr = 0; | ||
190 | eth0_pd.tx_sram_size = 0; | ||
191 | eth0_pd.rx_sram_addr = 0; | ||
192 | eth0_pd.rx_sram_size = 0; | ||
193 | |||
194 | eth1_pd.tx_sram_addr = 0; | ||
195 | eth1_pd.tx_sram_size = 0; | ||
196 | eth1_pd.rx_sram_addr = 0; | ||
197 | eth1_pd.rx_sram_size = 0; | ||
198 | |||
199 | #ifdef BE_VERBOSE | ||
200 | printk("Pegasos II/Marvell MV64361: Can't enable the " | ||
201 | "SRAM\n"); | ||
202 | #endif | ||
203 | } | ||
98 | } | 204 | } |
205 | |||
206 | #ifdef BE_VERBOSE | ||
207 | printk("Pegasos II/Marvell MV64361: init is over\n"); | ||
208 | #endif | ||
209 | |||
99 | return ret; | 210 | return ret; |
100 | } | 211 | } |
212 | |||
101 | device_initcall(mv643xx_eth_add_pds); | 213 | device_initcall(mv643xx_eth_add_pds); |