This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / asm-ppc / mv64x60.h
1 /*
2  * include/asm-ppc/mv64x60.h
3  * 
4  * Prototypes, etc. for the Marvell/Galileo MV64x60 host bridge routines.
5  *
6  * Author: Mark A. Greer <mgreer@mvista.com>
7  *
8  * 2001-2002 (c) MontaVista, Software, Inc.  This file is licensed under
9  * the terms of the GNU General Public License version 2.  This program
10  * is licensed "as is" without any warranty of any kind, whether express
11  * or implied.
12  */
13 #ifndef __ASMPPC_MV64x60_H
14 #define __ASMPPC_MV64x60_H
15
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/pci.h>
19 #include <linux/slab.h>
20 #include <linux/config.h>
21
22 #include <asm/byteorder.h>
23 #include <asm/io.h>
24 #include <asm/irq.h>
25 #include <asm/uaccess.h>
26 #include <asm/machdep.h>
27 #include <asm/pci-bridge.h>
28 #include <asm/mv64x60_defs.h>
29
30 extern u8      mv64x60_pci_exclude_bridge;
31
32 extern spinlock_t mv64x60_lock;
33 extern spinlock_t mv64x60_rmw_lock;
34
35 #ifndef TRUE
36 #define TRUE    1
37 #endif
38
39 #ifndef FALSE
40 #define FALSE   0
41 #endif
42
43 /* 32-bit Window table entry defines */
44 #define MV64x60_CPU2MEM_0_WIN                   0
45 #define MV64x60_CPU2MEM_1_WIN                   1
46 #define MV64x60_CPU2MEM_2_WIN                   2
47 #define MV64x60_CPU2MEM_3_WIN                   3
48 #define MV64x60_CPU2DEV_0_WIN                   4
49 #define MV64x60_CPU2DEV_1_WIN                   5
50 #define MV64x60_CPU2DEV_2_WIN                   6
51 #define MV64x60_CPU2DEV_3_WIN                   7
52 #define MV64x60_CPU2BOOT_WIN                    8
53 #define MV64x60_CPU2PCI0_IO_WIN                 9
54 #define MV64x60_CPU2PCI0_MEM_0_WIN              10
55 #define MV64x60_CPU2PCI0_MEM_1_WIN              11
56 #define MV64x60_CPU2PCI0_MEM_2_WIN              12
57 #define MV64x60_CPU2PCI0_MEM_3_WIN              13
58 #define MV64x60_CPU2PCI1_IO_WIN                 14
59 #define MV64x60_CPU2PCI1_MEM_0_WIN              15
60 #define MV64x60_CPU2PCI1_MEM_1_WIN              16
61 #define MV64x60_CPU2PCI1_MEM_2_WIN              17
62 #define MV64x60_CPU2PCI1_MEM_3_WIN              18
63 #define MV64x60_CPU2SRAM_WIN                    19
64 #define MV64x60_CPU2PCI0_IO_REMAP_WIN           20
65 #define MV64x60_CPU2PCI1_IO_REMAP_WIN           21
66 #define MV64x60_CPU_PROT_0_WIN                  22
67 #define MV64x60_CPU_PROT_1_WIN                  23
68 #define MV64x60_CPU_PROT_2_WIN                  24
69 #define MV64x60_CPU_PROT_3_WIN                  25
70 #define MV64x60_CPU_SNOOP_0_WIN                 26
71 #define MV64x60_CPU_SNOOP_1_WIN                 27
72 #define MV64x60_CPU_SNOOP_2_WIN                 28
73 #define MV64x60_CPU_SNOOP_3_WIN                 29
74 #define MV64x60_PCI02MEM_REMAP_0_WIN            30
75 #define MV64x60_PCI02MEM_REMAP_1_WIN            31
76 #define MV64x60_PCI02MEM_REMAP_2_WIN            32
77 #define MV64x60_PCI02MEM_REMAP_3_WIN            33
78 #define MV64x60_PCI12MEM_REMAP_0_WIN            34
79 #define MV64x60_PCI12MEM_REMAP_1_WIN            35
80 #define MV64x60_PCI12MEM_REMAP_2_WIN            36
81 #define MV64x60_PCI12MEM_REMAP_3_WIN            37
82
83 #define MV64x60_32BIT_WIN_COUNT                 38
84
85 /* 64-bit Window table entry defines */
86 #define MV64x60_CPU2PCI0_MEM_0_REMAP_WIN        0
87 #define MV64x60_CPU2PCI0_MEM_1_REMAP_WIN        1
88 #define MV64x60_CPU2PCI0_MEM_2_REMAP_WIN        2
89 #define MV64x60_CPU2PCI0_MEM_3_REMAP_WIN        3
90 #define MV64x60_CPU2PCI1_MEM_0_REMAP_WIN        4
91 #define MV64x60_CPU2PCI1_MEM_1_REMAP_WIN        5
92 #define MV64x60_CPU2PCI1_MEM_2_REMAP_WIN        6
93 #define MV64x60_CPU2PCI1_MEM_3_REMAP_WIN        7
94 #define MV64x60_PCI02MEM_ACC_CNTL_0_WIN         8
95 #define MV64x60_PCI02MEM_ACC_CNTL_1_WIN         9
96 #define MV64x60_PCI02MEM_ACC_CNTL_2_WIN         10
97 #define MV64x60_PCI02MEM_ACC_CNTL_3_WIN         11
98 #define MV64x60_PCI12MEM_ACC_CNTL_0_WIN         12
99 #define MV64x60_PCI12MEM_ACC_CNTL_1_WIN         13
100 #define MV64x60_PCI12MEM_ACC_CNTL_2_WIN         14
101 #define MV64x60_PCI12MEM_ACC_CNTL_3_WIN         15
102 #define MV64x60_PCI02MEM_SNOOP_0_WIN            16
103 #define MV64x60_PCI02MEM_SNOOP_1_WIN            17
104 #define MV64x60_PCI02MEM_SNOOP_2_WIN            18
105 #define MV64x60_PCI02MEM_SNOOP_3_WIN            19
106 #define MV64x60_PCI12MEM_SNOOP_0_WIN            20
107 #define MV64x60_PCI12MEM_SNOOP_1_WIN            21
108 #define MV64x60_PCI12MEM_SNOOP_2_WIN            22
109 #define MV64x60_PCI12MEM_SNOOP_3_WIN            23
110
111 #define MV64x60_64BIT_WIN_COUNT                 24
112
113
114 /*
115  * Define a structure that's used to pass in config information to the
116  * core routines.
117  */
118 typedef struct {
119         u32     cpu_base;
120         u32     pci_base_hi;
121         u32     pci_base_lo;
122         u32     size;
123         u32     swap;
124 } mv64x60_pci_window_t;
125
126 typedef struct {
127         u8      enable_bus;     /* allow access to this PCI bus? */
128         u8      enumerate_bus;  /* enumerate devices on this bus? */
129
130         mv64x60_pci_window_t    pci_io;
131         mv64x60_pci_window_t    pci_mem[3];
132
133         u32     acc_cntl_options[MV64x60_CPU2MEM_WINDOWS];
134         u32     snoop_options[MV64x60_CPU2MEM_WINDOWS];
135         u16     pci_cmd_bits;
136         u16     latency_timer;
137 } mv64x60_pci_info_t;
138
139 typedef struct {
140         u32     phys_reg_base;
141
142         u32     window_preserve_mask_32;
143         u32     window_preserve_mask_64;
144
145         u32     base_irq;       /* Starting irq # for this intr ctlr */
146         int     ((*map_irq)(struct pci_dev *, unsigned char, unsigned char));
147
148         u32     cpu_prot_options[MV64x60_CPU2MEM_WINDOWS];
149         u32     cpu_snoop_options[MV64x60_CPU2MEM_WINDOWS];
150
151         mv64x60_pci_info_t      pci_0;
152         mv64x60_pci_info_t      pci_1;
153 } mv64x60_setup_info_t;
154
155 /*
156  * Define the 'handle' struct that will be passed between the 64x60 core
157  * code and the platform-specific code that will use it.  The handle
158  * will contain pointers to chip-specific routines & information.
159  */
160 typedef struct {
161         u32     base_reg;
162         u32     size_reg;
163         u8      base_bits;
164         u8      size_bits;
165         u32     (*get_from_field)(u32 val, u32 num_bits);
166         u32     (*map_to_field)(u32 val, u32 num_bits);
167         u32     extra;
168 } mv64x60_32bit_window_t;
169
170 typedef struct {
171         u32     base_hi_reg;
172         u32     base_lo_reg;
173         u32     size_reg;
174         u8      base_lo_bits;
175         u8      size_bits;
176         u32     (*get_from_field)(u32 val, u32 num_bits);
177         u32     (*map_to_field)(u32 val, u32 num_bits);
178         u32     extra;
179 } mv64x60_64bit_window_t;
180
181 typedef struct mv64x60_handle   mv64x60_handle_t;
182
183 typedef struct {
184         u32     (*translate_size)(u32 base, u32 size, u32 num_bits);
185         u32     (*untranslate_size)(u32 base, u32 size, u32 num_bits);
186         void    (*set_pci2mem_window)(struct pci_controller *hose, u32 window,
187                         u32 base);
188         u32     (*is_enabled_32bit)(mv64x60_handle_t *bh, u32 window);
189         void    (*enable_window_32bit)(mv64x60_handle_t *bh, u32 window);
190         void    (*disable_window_32bit)(mv64x60_handle_t *bh, u32 window);
191         void    (*enable_window_64bit)(mv64x60_handle_t *bh, u32 window);
192         void    (*disable_window_64bit)(mv64x60_handle_t *bh, u32 window);
193         void    (*disable_all_windows)(mv64x60_handle_t *bh,
194                                        mv64x60_setup_info_t *si);
195         void    (*chip_specific_init)(mv64x60_handle_t *bh,
196                                       mv64x60_setup_info_t *si);
197
198         mv64x60_32bit_window_t  *window_tab_32bit;
199         mv64x60_64bit_window_t  *window_tab_64bit;
200 } mv64x60_chip_info_t;
201
202 struct mv64x60_handle {
203         u32     type;           /* type of bridge */
204         u32     v_base;         /* virtual base addr of bridge regs */
205         u32     p_base;         /* physical base addr of bridge regs */
206         u32     base_irq;       /* Base irq # for intrs on this intr cltr */
207
208         u32     io_base_a;      /* vaddr of pci 0's I/O space */
209         u32     io_base_b;      /* vaddr of pci 1's I/O space */
210
211         struct pci_controller   *hose_a;
212         struct pci_controller   *hose_b;
213
214         mv64x60_chip_info_t     *ci;    /* chip/bridge-specific info */
215 };
216
217
218 /* Define I/O routines for accessing registers on the 64x60 bridge. */
219 extern inline void
220 mv64x60_write(mv64x60_handle_t *bh, u32 offset, u32 val) {
221         out_le32((volatile u32 *)(bh->v_base + offset), val);
222 }
223
224 extern inline u32
225 mv64x60_read(mv64x60_handle_t *bh, u32 offset) {
226         return in_le32((volatile u32 *)(bh->v_base + offset));
227 }
228
229 extern inline void
230 mv64x60_modify(mv64x60_handle_t *bh, u32 offs, u32 data, u32 mask)
231 {
232         uint32_t reg;
233         unsigned long flags;
234
235         spin_lock_irqsave(&mv64x60_rmw_lock, flags);
236         reg = mv64x60_read(bh, offs) & (~mask); /* zero any bits we care about*/
237         reg |= data & mask; /* set bits from the data */
238         mv64x60_write(bh, offs, reg);
239         spin_unlock_irqrestore(&mv64x60_rmw_lock, flags);
240 }
241
242 #define mv64x60_set_bits(bh, offs, bits) mv64x60_modify(bh, offs, ~0, bits) 
243 #define mv64x60_clr_bits(bh, offs, bits) mv64x60_modify(bh, offs, 0, bits)
244
245
246 /* Externally visible function prototypes */
247 int mv64x60_init(mv64x60_handle_t *bh, mv64x60_setup_info_t *si);
248 u32 mv64x60_get_mem_size(u32 bridge_base, u32 chip_type);
249 void mv64x60_get_32bit_window(mv64x60_handle_t *bh, u32 window,
250                                         u32 *base, u32 *size);
251 void mv64x60_set_32bit_window(mv64x60_handle_t *bh, u32 window, u32 base,
252                                         u32 size, u32 other_bits);
253 void mv64x60_get_64bit_window(mv64x60_handle_t *bh, u32 window, u32 *base_hi,
254                                         u32 *base_lo, u32 *size);
255 void mv64x60_set_64bit_window(mv64x60_handle_t *bh, u32 window, u32 base_hi,
256                                         u32 base_lo, u32 size, u32 other_bits);
257
258
259 void gt64260_init_irq(void);
260 int gt64260_get_irq(struct pt_regs *regs);
261
262 /*
263  * OCP Related Definitions
264  */
265 typedef struct {
266         u8      mirror_regs;
267         u8      cache_mgmt;
268         u8      max_idle;
269         int     default_baud;
270         int     default_bits;
271         int     default_parity;
272         int     default_flow;
273         u32     chr_1_val;
274         u32     chr_2_val;
275         u32     chr_10_val;
276         u32     mpcr_val;
277         u32     mrr_val;
278         u32     rcrr_val;
279         u32     tcrr_val;
280         u32     intr_mask_val;
281         u32     bcr_val;
282         u32     sdma_irq;
283         u8      brg_can_tune;
284         u8      brg_clk_src;
285         u32     brg_clk_freq;
286 } mv64x60_ocp_mpsc_data_t;
287
288 #define MV64x60_OCP_SYSFS_MPSC_DATA()                                   \
289 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, mirror_regs)     \
290 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, cache_mgmt)      \
291 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, max_idle)        \
292 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, default_baud)    \
293 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, default_bits)    \
294 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%c\n", mpsc, default_parity)  \
295 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%c\n", mpsc, default_flow)    \
296 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, chr_1_val)     \
297 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, chr_2_val)     \
298 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, chr_10_val)    \
299 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, mpcr_val)      \
300 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, mrr_val)       \
301 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, rcrr_val)      \
302 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, tcrr_val)      \
303 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, intr_mask_val) \
304 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "0x%x\n", mpsc, bcr_val)       \
305 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, sdma_irq)        \
306 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, brg_can_tune)    \
307 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, brg_clk_src)     \
308 OCP_SYSFS_ADDTL(mv64x60_ocp_mpsc_data_t, "%d\n", mpsc, brg_clk_freq)    \
309                                                                         \
310 void                                                                    \
311 mv64x60_ocp_show_mpsc(struct device *dev)                               \
312 {                                                                       \
313         device_create_file(dev, &dev_attr_mpsc_mirror_regs);            \
314         device_create_file(dev, &dev_attr_mpsc_cache_mgmt);             \
315         device_create_file(dev, &dev_attr_mpsc_max_idle);               \
316         device_create_file(dev, &dev_attr_mpsc_default_baud);           \
317         device_create_file(dev, &dev_attr_mpsc_default_bits);           \
318         device_create_file(dev, &dev_attr_mpsc_default_parity);         \
319         device_create_file(dev, &dev_attr_mpsc_default_flow);           \
320         device_create_file(dev, &dev_attr_mpsc_chr_1_val);              \
321         device_create_file(dev, &dev_attr_mpsc_chr_2_val);              \
322         device_create_file(dev, &dev_attr_mpsc_chr_10_val);             \
323         device_create_file(dev, &dev_attr_mpsc_mpcr_val);               \
324         device_create_file(dev, &dev_attr_mpsc_mrr_val);                \
325         device_create_file(dev, &dev_attr_mpsc_rcrr_val);               \
326         device_create_file(dev, &dev_attr_mpsc_tcrr_val);               \
327         device_create_file(dev, &dev_attr_mpsc_intr_mask_val);          \
328         device_create_file(dev, &dev_attr_mpsc_bcr_val);                \
329         device_create_file(dev, &dev_attr_mpsc_sdma_irq);               \
330         device_create_file(dev, &dev_attr_mpsc_brg_can_tune);           \
331         device_create_file(dev, &dev_attr_mpsc_brg_clk_src);            \
332         device_create_file(dev, &dev_attr_mpsc_brg_clk_freq);           \
333 }
334
335 #endif /* __ASMPPC_MV64x60_H */