1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
/*
* include/asm-ppc/mv64x60.h
*
* Prototypes, etc. for the Marvell/Galileo MV64x60 host bridge routines.
*
* Author: Mark A. Greer <mgreer@mvista.com>
*
* 2001-2002 (c) MontaVista, Software, Inc. This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*/
#ifndef __ASMPPC_MV64x60_H
#define __ASMPPC_MV64x60_H
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/config.h>
#include <asm/byteorder.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/machdep.h>
#include <asm/pci-bridge.h>
#include <asm/mv64x60_defs.h>
extern u8 mv64x60_pci_exclude_bridge;
extern spinlock_t mv64x60_lock;
/* 32-bit Window table entry defines */
#define MV64x60_CPU2MEM_0_WIN 0
#define MV64x60_CPU2MEM_1_WIN 1
#define MV64x60_CPU2MEM_2_WIN 2
#define MV64x60_CPU2MEM_3_WIN 3
#define MV64x60_CPU2DEV_0_WIN 4
#define MV64x60_CPU2DEV_1_WIN 5
#define MV64x60_CPU2DEV_2_WIN 6
#define MV64x60_CPU2DEV_3_WIN 7
#define MV64x60_CPU2BOOT_WIN 8
#define MV64x60_CPU2PCI0_IO_WIN 9
#define MV64x60_CPU2PCI0_MEM_0_WIN 10
#define MV64x60_CPU2PCI0_MEM_1_WIN 11
#define MV64x60_CPU2PCI0_MEM_2_WIN 12
#define MV64x60_CPU2PCI0_MEM_3_WIN 13
#define MV64x60_CPU2PCI1_IO_WIN 14
#define MV64x60_CPU2PCI1_MEM_0_WIN 15
#define MV64x60_CPU2PCI1_MEM_1_WIN 16
#define MV64x60_CPU2PCI1_MEM_2_WIN 17
#define MV64x60_CPU2PCI1_MEM_3_WIN 18
#define MV64x60_CPU2SRAM_WIN 19
#define MV64x60_CPU2PCI0_IO_REMAP_WIN 20
#define MV64x60_CPU2PCI1_IO_REMAP_WIN 21
#define MV64x60_CPU_PROT_0_WIN 22
#define MV64x60_CPU_PROT_1_WIN 23
#define MV64x60_CPU_PROT_2_WIN 24
#define MV64x60_CPU_PROT_3_WIN 25
#define MV64x60_CPU_SNOOP_0_WIN 26
#define MV64x60_CPU_SNOOP_1_WIN 27
#define MV64x60_CPU_SNOOP_2_WIN 28
#define MV64x60_CPU_SNOOP_3_WIN 29
#define MV64x60_PCI02MEM_REMAP_0_WIN 30
#define MV64x60_PCI02MEM_REMAP_1_WIN 31
#define MV64x60_PCI02MEM_REMAP_2_WIN 32
#define MV64x60_PCI02MEM_REMAP_3_WIN 33
#define MV64x60_PCI12MEM_REMAP_0_WIN 34
#define MV64x60_PCI12MEM_REMAP_1_WIN 35
#define MV64x60_PCI12MEM_REMAP_2_WIN 36
#define MV64x60_PCI12MEM_REMAP_3_WIN 37
#define MV64x60_ENET2MEM_0_WIN 38
#define MV64x60_ENET2MEM_1_WIN 39
#define MV64x60_ENET2MEM_2_WIN 40
#define MV64x60_ENET2MEM_3_WIN 41
#define MV64x60_ENET2MEM_4_WIN 42
#define MV64x60_ENET2MEM_5_WIN 43
#define MV64x60_MPSC2MEM_0_WIN 44
#define MV64x60_MPSC2MEM_1_WIN 45
#define MV64x60_MPSC2MEM_2_WIN 46
#define MV64x60_MPSC2MEM_3_WIN 47
#define MV64x60_IDMA2MEM_0_WIN 48
#define MV64x60_IDMA2MEM_1_WIN 49
#define MV64x60_IDMA2MEM_2_WIN 50
#define MV64x60_IDMA2MEM_3_WIN 51
#define MV64x60_IDMA2MEM_4_WIN 52
#define MV64x60_IDMA2MEM_5_WIN 53
#define MV64x60_IDMA2MEM_6_WIN 54
#define MV64x60_IDMA2MEM_7_WIN 55
#define MV64x60_32BIT_WIN_COUNT 56
/* 64-bit Window table entry defines */
#define MV64x60_CPU2PCI0_MEM_0_REMAP_WIN 0
#define MV64x60_CPU2PCI0_MEM_1_REMAP_WIN 1
#define MV64x60_CPU2PCI0_MEM_2_REMAP_WIN 2
#define MV64x60_CPU2PCI0_MEM_3_REMAP_WIN 3
#define MV64x60_CPU2PCI1_MEM_0_REMAP_WIN 4
#define MV64x60_CPU2PCI1_MEM_1_REMAP_WIN 5
#define MV64x60_CPU2PCI1_MEM_2_REMAP_WIN 6
#define MV64x60_CPU2PCI1_MEM_3_REMAP_WIN 7
#define MV64x60_PCI02MEM_ACC_CNTL_0_WIN 8
#define MV64x60_PCI02MEM_ACC_CNTL_1_WIN 9
#define MV64x60_PCI02MEM_ACC_CNTL_2_WIN 10
#define MV64x60_PCI02MEM_ACC_CNTL_3_WIN 11
#define MV64x60_PCI12MEM_ACC_CNTL_0_WIN 12
#define MV64x60_PCI12MEM_ACC_CNTL_1_WIN 13
#define MV64x60_PCI12MEM_ACC_CNTL_2_WIN 14
#define MV64x60_PCI12MEM_ACC_CNTL_3_WIN 15
#define MV64x60_PCI02MEM_SNOOP_0_WIN 16
#define MV64x60_PCI02MEM_SNOOP_1_WIN 17
#define MV64x60_PCI02MEM_SNOOP_2_WIN 18
#define MV64x60_PCI02MEM_SNOOP_3_WIN 19
#define MV64x60_PCI12MEM_SNOOP_0_WIN 20
#define MV64x60_PCI12MEM_SNOOP_1_WIN 21
#define MV64x60_PCI12MEM_SNOOP_2_WIN 22
#define MV64x60_PCI12MEM_SNOOP_3_WIN 23
#define MV64x60_64BIT_WIN_COUNT 24
/*
* Define a structure that's used to pass in config information to the
* core routines.
*/
struct mv64x60_pci_window {
u32 cpu_base;
u32 pci_base_hi;
u32 pci_base_lo;
u32 size;
u32 swap;
};
struct mv64x60_pci_info {
u8 enable_bus; /* allow access to this PCI bus? */
struct mv64x60_pci_window pci_io;
struct mv64x60_pci_window pci_mem[3];
u32 acc_cntl_options[MV64x60_CPU2MEM_WINDOWS];
u32 snoop_options[MV64x60_CPU2MEM_WINDOWS];
u16 pci_cmd_bits;
u16 latency_timer;
};
struct mv64x60_setup_info {
u32 phys_reg_base;
u32 window_preserve_mask_32_hi;
u32 window_preserve_mask_32_lo;
u32 window_preserve_mask_64;
u32 cpu_prot_options[MV64x60_CPU2MEM_WINDOWS];
u32 cpu_snoop_options[MV64x60_CPU2MEM_WINDOWS];
u32 enet_options[MV64x60_CPU2MEM_WINDOWS];
u32 mpsc_options[MV64x60_CPU2MEM_WINDOWS];
u32 idma_options[MV64x60_CPU2MEM_WINDOWS];
struct mv64x60_pci_info pci_0;
struct mv64x60_pci_info pci_1;
};
/* Define what the top bits in the extra member of a window entry means. */
#define MV64x60_EXTRA_INVALID 0x00000000
#define MV64x60_EXTRA_CPUWIN_ENAB 0x10000000
#define MV64x60_EXTRA_CPUPROT_ENAB 0x20000000
#define MV64x60_EXTRA_ENET_ENAB 0x30000000
#define MV64x60_EXTRA_MPSC_ENAB 0x40000000
#define MV64x60_EXTRA_IDMA_ENAB 0x50000000
#define MV64x60_EXTRA_PCIACC_ENAB 0x60000000
#define MV64x60_EXTRA_MASK 0xf0000000
/*
* Define the 'handle' struct that will be passed between the 64x60 core
* code and the platform-specific code that will use it. The handle
* will contain pointers to chip-specific routines & information.
*/
struct mv64x60_32bit_window {
u32 base_reg;
u32 size_reg;
u8 base_bits;
u8 size_bits;
u32 (*get_from_field)(u32 val, u32 num_bits);
u32 (*map_to_field)(u32 val, u32 num_bits);
u32 extra;
};
struct mv64x60_64bit_window {
u32 base_hi_reg;
u32 base_lo_reg;
u32 size_reg;
u8 base_lo_bits;
u8 size_bits;
u32 (*get_from_field)(u32 val, u32 num_bits);
u32 (*map_to_field)(u32 val, u32 num_bits);
u32 extra;
};
typedef struct mv64x60_handle mv64x60_handle_t;
struct mv64x60_chip_info {
u32 (*translate_size)(u32 base, u32 size, u32 num_bits);
u32 (*untranslate_size)(u32 base, u32 size, u32 num_bits);
void (*set_pci2mem_window)(struct pci_controller *hose, u32 bus,
u32 window, u32 base);
void (*set_pci2regs_window)(struct mv64x60_handle *bh,
struct pci_controller *hose, u32 bus, u32 base);
u32 (*is_enabled_32bit)(mv64x60_handle_t *bh, u32 window);
void (*enable_window_32bit)(mv64x60_handle_t *bh, u32 window);
void (*disable_window_32bit)(mv64x60_handle_t *bh, u32 window);
void (*enable_window_64bit)(mv64x60_handle_t *bh, u32 window);
void (*disable_window_64bit)(mv64x60_handle_t *bh, u32 window);
void (*disable_all_windows)(mv64x60_handle_t *bh,
struct mv64x60_setup_info *si);
void (*config_io2mem_windows)(mv64x60_handle_t *bh,
struct mv64x60_setup_info *si,
u32 mem_windows[MV64x60_CPU2MEM_WINDOWS][2]);
void (*set_mpsc2regs_window)(struct mv64x60_handle *bh, u32 base);
void (*chip_specific_init)(mv64x60_handle_t *bh,
struct mv64x60_setup_info *si);
struct mv64x60_32bit_window *window_tab_32bit;
struct mv64x60_64bit_window *window_tab_64bit;
};
struct mv64x60_handle {
u32 type; /* type of bridge */
u32 rev; /* revision of bridge */
void *v_base; /* virtual base addr of bridge regs */
phys_addr_t p_base; /* physical base addr of bridge regs */
u32 pci_mode_a; /* pci 0 mode: conventional pci, pci-x*/
u32 pci_mode_b; /* pci 1 mode: conventional pci, pci-x*/
u32 io_base_a; /* vaddr of pci 0's I/O space */
u32 io_base_b; /* vaddr of pci 1's I/O space */
struct pci_controller *hose_a;
struct pci_controller *hose_b;
struct mv64x60_chip_info *ci; /* chip/bridge-specific info */
};
/* Define I/O routines for accessing registers on the 64x60 bridge. */
extern inline void
mv64x60_write(struct mv64x60_handle *bh, u32 offset, u32 val) {
ulong flags;
spin_lock_irqsave(&mv64x60_lock, flags);
out_le32(bh->v_base + offset, val);
spin_unlock_irqrestore(&mv64x60_lock, flags);
}
extern inline u32
mv64x60_read(struct mv64x60_handle *bh, u32 offset) {
ulong flags;
u32 reg;
spin_lock_irqsave(&mv64x60_lock, flags);
reg = in_le32(bh->v_base + offset);
spin_unlock_irqrestore(&mv64x60_lock, flags);
return reg;
}
extern inline void
mv64x60_modify(struct mv64x60_handle *bh, u32 offs, u32 data, u32 mask)
{
u32 reg;
ulong flags;
spin_lock_irqsave(&mv64x60_lock, flags);
reg = in_le32(bh->v_base + offs) & (~mask);
reg |= data & mask;
out_le32(bh->v_base + offs, reg);
spin_unlock_irqrestore(&mv64x60_lock, flags);
}
#define mv64x60_set_bits(bh, offs, bits) mv64x60_modify(bh, offs, ~0, bits)
#define mv64x60_clr_bits(bh, offs, bits) mv64x60_modify(bh, offs, 0, bits)
/* Externally visible function prototypes */
int mv64x60_init(struct mv64x60_handle *bh, struct mv64x60_setup_info *si);
u32 mv64x60_get_mem_size(u32 bridge_base, u32 chip_type);
void mv64x60_early_init(struct mv64x60_handle *bh,
struct mv64x60_setup_info *si);
void mv64x60_alloc_hose(struct mv64x60_handle *bh, u32 cfg_addr,
u32 cfg_data, struct pci_controller **hose);
int mv64x60_get_type(struct mv64x60_handle *bh);
int mv64x60_setup_for_chip(struct mv64x60_handle *bh);
void *mv64x60_get_bridge_vbase(void);
u32 mv64x60_get_bridge_type(void);
u32 mv64x60_get_bridge_rev(void);
void mv64x60_get_mem_windows(struct mv64x60_handle *bh,
u32 mem_windows[MV64x60_CPU2MEM_WINDOWS][2]);
void mv64x60_config_cpu2mem_windows(struct mv64x60_handle *bh,
struct mv64x60_setup_info *si,
u32 mem_windows[MV64x60_CPU2MEM_WINDOWS][2]);
void mv64x60_config_cpu2pci_windows(struct mv64x60_handle *bh,
struct mv64x60_pci_info *pi, u32 bus);
void mv64x60_config_pci2mem_windows(struct mv64x60_handle *bh,
struct pci_controller *hose, struct mv64x60_pci_info *pi, u32 bus,
u32 mem_windows[MV64x60_CPU2MEM_WINDOWS][2]);
void mv64x60_config_resources(struct pci_controller *hose,
struct mv64x60_pci_info *pi, u32 io_base);
void mv64x60_config_pci_params(struct pci_controller *hose,
struct mv64x60_pci_info *pi);
void mv64x60_pd_fixup(struct mv64x60_handle *bh,
struct platform_device *pd_devs[], u32 entries);
void mv64x60_get_32bit_window(struct mv64x60_handle *bh, u32 window,
u32 *base, u32 *size);
void mv64x60_set_32bit_window(struct mv64x60_handle *bh, u32 window, u32 base,
u32 size, u32 other_bits);
void mv64x60_get_64bit_window(struct mv64x60_handle *bh, u32 window,
u32 *base_hi, u32 *base_lo, u32 *size);
void mv64x60_set_64bit_window(struct mv64x60_handle *bh, u32 window,
u32 base_hi, u32 base_lo, u32 size, u32 other_bits);
void mv64x60_set_bus(struct mv64x60_handle *bh, u32 bus, u32 child_bus);
int mv64x60_pci_exclude_device(u8 bus, u8 devfn);
void gt64260_init_irq(void);
int gt64260_get_irq(struct pt_regs *regs);
void mv64360_init_irq(void);
int mv64360_get_irq(struct pt_regs *regs);
u32 mv64x60_mask(u32 val, u32 num_bits);
u32 mv64x60_shift_left(u32 val, u32 num_bits);
u32 mv64x60_shift_right(u32 val, u32 num_bits);
u32 mv64x60_calc_mem_size(struct mv64x60_handle *bh,
u32 mem_windows[MV64x60_CPU2MEM_WINDOWS][2]);
void mv64x60_progress_init(u32 base);
void mv64x60_mpsc_progress(char *s, unsigned short hex);
extern struct mv64x60_32bit_window
gt64260_32bit_windows[MV64x60_32BIT_WIN_COUNT];
extern struct mv64x60_64bit_window
gt64260_64bit_windows[MV64x60_64BIT_WIN_COUNT];
extern struct mv64x60_32bit_window
mv64360_32bit_windows[MV64x60_32BIT_WIN_COUNT];
extern struct mv64x60_64bit_window
mv64360_64bit_windows[MV64x60_64BIT_WIN_COUNT];
#endif /* __ASMPPC_MV64x60_H */
|