more changes on original files
[linux-2.4.git] / include / asm-mips / pci.h
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  */
6 #ifndef _ASM_PCI_H
7 #define _ASM_PCI_H
8
9 #include <linux/config.h>
10
11 #ifdef __KERNEL__
12
13 /* Can be used to override the logic in pci_scan_bus for skipping
14    already-configured bus numbers - to be used for buggy BIOSes
15    or architectures with incomplete PCI setup by the loader */
16
17 #ifdef CONFIG_PCI
18 extern unsigned int pcibios_assign_all_busses(void);
19 #else
20 #define pcibios_assign_all_busses()     0
21 #endif
22 #define pcibios_scan_all_fns()          0
23
24 #define PCIBIOS_MIN_IO          0x1000
25 #define PCIBIOS_MIN_MEM         0x10000000
26
27 extern void pcibios_set_master(struct pci_dev *dev);
28
29 static inline void pcibios_penalize_isa_irq(int irq)
30 {
31         /* We don't do dynamic PCI IRQ allocation */
32 }
33
34 /*
35  * Dynamic DMA mapping stuff.
36  * MIPS has everything mapped statically.
37  */
38
39 #include <linux/types.h>
40 #include <linux/slab.h>
41 #include <asm/scatterlist.h>
42 #include <linux/string.h>
43 #include <asm/io.h>
44
45 #if (defined(CONFIG_DDB5074) || defined(CONFIG_DDB5476))
46 #undef PCIBIOS_MIN_IO
47 #undef PCIBIOS_MIN_MEM
48 #define PCIBIOS_MIN_IO          0x0100000
49 #define PCIBIOS_MIN_MEM         0x1000000
50 #endif
51
52 struct pci_dev;
53
54 /*
55  * The PCI address space does equal the physical memory address space.  The
56  * networking and block device layers use this boolean for bounce buffer
57  * decisions.
58  */
59 #define PCI_DMA_BUS_IS_PHYS     (1)
60
61 /*
62  * Allocate and map kernel buffer using consistent mode DMA for a device.
63  * hwdev should be valid struct pci_dev pointer for PCI devices,
64  * NULL for PCI-like buses (ISA, EISA).
65  * Returns non-NULL cpu-view pointer to the buffer if successful and
66  * sets *dma_addrp to the pci side dma address as well, else *dma_addrp
67  * is undefined.
68  */
69 extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
70                                   dma_addr_t *dma_handle);
71
72 /*
73  * Free and unmap a consistent DMA buffer.
74  * cpu_addr is what was returned from pci_alloc_consistent,
75  * size must be the same as what as passed into pci_alloc_consistent,
76  * and likewise dma_addr must be the same as what *dma_addrp was set to.
77  *
78  * References to the memory and mappings associated with cpu_addr/dma_addr
79  * past this call are illegal.
80  */
81 extern void pci_free_consistent(struct pci_dev *hwdev, size_t size,
82                                 void *vaddr, dma_addr_t dma_handle);
83
84 /*
85  * Map a single buffer of the indicated size for DMA in streaming mode.
86  * The 32-bit bus address to use is returned.
87  *
88  * Once the device is given the dma address, the device owns this memory
89  * until either pci_unmap_single or pci_dma_sync_single is performed.
90  */
91 static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
92                                         size_t size, int direction)
93 {
94         unsigned long addr = (unsigned long) ptr;
95
96         if (direction == PCI_DMA_NONE)
97                 out_of_line_bug();
98
99         dma_cache_wback_inv(addr, size);
100
101         return bus_to_baddr(hwdev->bus, __pa(ptr));
102 }
103
104 /*
105  * Unmap a single streaming mode DMA translation.  The dma_addr and size
106  * must match what was provided for in a previous pci_map_single call.  All
107  * other usages are undefined.
108  *
109  * After this call, reads by the cpu to the buffer are guarenteed to see
110  * whatever the device wrote there.
111  */
112 static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
113                                     size_t size, int direction)
114 {
115         if (direction == PCI_DMA_NONE)
116                 out_of_line_bug();
117
118         if (direction != PCI_DMA_TODEVICE) {
119                 unsigned long addr;
120
121                 addr = baddr_to_bus(hwdev->bus, dma_addr) + PAGE_OFFSET;
122                 dma_cache_wback_inv(addr, size);
123         }
124 }
125
126 /*
127  * pci_{map,unmap}_single_page maps a kernel page to a dma_addr_t. identical
128  * to pci_map_single, but takes a struct page instead of a virtual address
129  */
130 static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page,
131                                       unsigned long offset, size_t size,
132                                       int direction)
133 {
134         unsigned long addr;
135
136         if (direction == PCI_DMA_NONE)
137                 out_of_line_bug();
138
139         addr = (unsigned long) page_address(page) + offset;
140         dma_cache_wback_inv(addr, size);
141
142         return bus_to_baddr(hwdev->bus, page_to_phys(page) + offset);
143 }
144
145 static inline void pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
146                                   size_t size, int direction)
147 {
148         if (direction == PCI_DMA_NONE)
149                 out_of_line_bug();
150
151         if (direction != PCI_DMA_TODEVICE) {
152                 unsigned long addr;
153
154                 addr = baddr_to_bus(hwdev->bus, dma_address) + PAGE_OFFSET;
155                 dma_cache_wback_inv(addr, size);
156         }
157 }
158
159 /* pci_unmap_{page,single} is a nop so... */
160 #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
161 #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
162 #define pci_unmap_addr(PTR, ADDR_NAME)          (0)
163 #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
164 #define pci_unmap_len(PTR, LEN_NAME)            (0)
165 #define pci_unmap_len_set(PTR, LEN_NAME, VAL)   do { } while (0)
166
167 /*
168  * Map a set of buffers described by scatterlist in streaming
169  * mode for DMA.  This is the scather-gather version of the
170  * above pci_map_single interface.  Here the scatter gather list
171  * elements are each tagged with the appropriate dma address
172  * and length.  They are obtained via sg_dma_{address,length}(SG).
173  *
174  * NOTE: An implementation may be able to use a smaller number of
175  *       DMA address/length pairs than there are SG table elements.
176  *       (for example via virtual mapping capabilities)
177  *       The routine returns the number of addr/length pairs actually
178  *       used, at most nents.
179  *
180  * Device ownership issues as mentioned above for pci_map_single are
181  * the same here.
182  */
183 static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
184                              int nents, int direction)
185 {
186         int i;
187
188         if (direction == PCI_DMA_NONE)
189                 out_of_line_bug();
190
191         for (i = 0; i < nents; i++, sg++) {
192                 if (sg->address && sg->page)
193                         out_of_line_bug();
194                 else if (!sg->address && !sg->page)
195                         out_of_line_bug();
196
197                 if (sg->address) {
198                         dma_cache_wback_inv((unsigned long)sg->address,
199                                             sg->length);
200                         sg->dma_address = bus_to_baddr(hwdev->bus, __pa(sg->address));
201                 } else {
202                         sg->dma_address = page_to_bus(sg->page) +
203                                           sg->offset;
204                         dma_cache_wback_inv((unsigned long)
205                                 (page_address(sg->page) + sg->offset),
206                                 sg->length);
207                 }
208         }
209
210         return nents;
211 }
212
213 /*
214  * Unmap a set of streaming mode DMA translations.
215  * Again, cpu read rules concerning calls here are the same as for
216  * pci_unmap_single() above.
217  */
218 static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
219                                 int nents, int direction)
220 {
221         int i;
222
223         if (direction == PCI_DMA_NONE)
224                 out_of_line_bug();
225
226         if (direction == PCI_DMA_TODEVICE)
227                 return;
228
229         for (i = 0; i < nents; i++, sg++) {
230                 if (sg->address && sg->page)
231                         out_of_line_bug();
232                 else if (!sg->address && !sg->page)
233                         out_of_line_bug();
234
235                 if (!sg->address)
236                         continue;
237                 dma_cache_wback_inv((unsigned long)sg->address, sg->length);
238         }
239 }
240
241 /*
242  * Make physical memory consistent for a single
243  * streaming mode DMA translation after a transfer.
244  *
245  * If you perform a pci_map_single() but wish to interrogate the
246  * buffer using the cpu, yet do not wish to teardown the PCI dma
247  * mapping, you must call this function before doing so.  At the
248  * next point you give the PCI dma address back to the card, the
249  * device again owns the buffer.
250  */
251 static inline void pci_dma_sync_single(struct pci_dev *hwdev,
252                                        dma_addr_t dma_handle,
253                                        size_t size, int direction)
254 {
255         unsigned long addr;
256
257         if (direction == PCI_DMA_NONE)
258                 out_of_line_bug();
259
260         addr = baddr_to_bus(hwdev->bus, dma_handle) + PAGE_OFFSET;
261         dma_cache_wback_inv(addr, size);
262 }
263
264 /*
265  * Make physical memory consistent for a set of streaming
266  * mode DMA translations after a transfer.
267  *
268  * The same as pci_dma_sync_single but for a scatter-gather list,
269  * same rules and usage.
270  */
271 static inline void pci_dma_sync_sg(struct pci_dev *hwdev,
272                                    struct scatterlist *sg,
273                                    int nelems, int direction)
274 {
275 #ifdef CONFIG_NONCOHERENT_IO
276         int i;
277 #endif
278
279         if (direction == PCI_DMA_NONE)
280                 out_of_line_bug();
281
282         /* Make sure that gcc doesn't leave the empty loop body.  */
283 #ifdef CONFIG_NONCOHERENT_IO
284         for (i = 0; i < nelems; i++, sg++)
285                 dma_cache_wback_inv((unsigned long)sg->address, sg->length);
286 #endif
287 }
288
289 /*
290  * Return whether the given PCI device DMA address mask can
291  * be supported properly.  For example, if your device can
292  * only drive the low 24-bits during PCI bus mastering, then
293  * you would pass 0x00ffffff as the mask to this function.
294  */
295 static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
296 {
297         /*
298          * we fall back to GFP_DMA when the mask isn't all 1s,
299          * so we can't guarantee allocations that must be
300          * within a tighter range than GFP_DMA..
301          */
302 #ifdef CONFIG_ISA
303         if (mask < 0x00ffffff)
304                 return 0;
305 #endif
306
307         return 1;
308 }
309
310 /* This is always fine. */
311 #define pci_dac_dma_supported(pci_dev, mask)    (1)
312
313 static inline dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
314         struct page *page, unsigned long offset, int direction)
315 {
316         dma64_addr_t addr = page_to_phys(page) + offset;
317
318         return (dma64_addr_t) bus_to_baddr(pdev->bus, addr);
319 }
320
321 static inline struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
322         dma64_addr_t dma_addr)
323 {
324         unsigned long poff = baddr_to_bus(pdev->bus, dma_addr) >> PAGE_SHIFT;
325
326         return mem_map + poff;
327 }
328
329 static inline unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
330         dma64_addr_t dma_addr)
331 {
332         return dma_addr & ~PAGE_MASK;
333 }
334
335 static inline void pci_dac_dma_sync_single(struct pci_dev *pdev,
336         dma64_addr_t dma_addr, size_t len, int direction)
337 {
338         unsigned long addr;
339
340         if (direction == PCI_DMA_NONE)
341                 BUG();
342
343         addr = baddr_to_bus(pdev->bus, dma_addr) + PAGE_OFFSET;
344         dma_cache_wback_inv(addr, len);
345 }
346
347 /*
348  * Return the index of the PCI controller for device.
349  */
350 #define pci_controller_num(pdev)        ({ (void)(pdev); 0; })
351
352 /*
353  * These macros should be used after a pci_map_sg call has been done
354  * to get bus addresses of each of the SG entries and their lengths.
355  * You should only work with the number of sg entries pci_map_sg
356  * returns, or alternatively stop on the first sg_dma_len(sg) which
357  * is 0.
358  */
359 #define sg_dma_address(sg)      ((sg)->dma_address)
360 #define sg_dma_len(sg)          ((sg)->length)
361
362 #endif /* __KERNEL__ */
363
364 #endif /* _ASM_PCI_H */