Merge branch 'topic/ca0106' into for-linus
[linux-2.6] / arch / sparc / include / asm / pci_32.h
1 #ifndef __SPARC_PCI_H
2 #define __SPARC_PCI_H
3
4 #ifdef __KERNEL__
5
6 #include <linux/dma-mapping.h>
7
8 /* Can be used to override the logic in pci_scan_bus for skipping
9  * already-configured bus numbers - to be used for buggy BIOSes
10  * or architectures with incomplete PCI setup by the loader.
11  */
12 #define pcibios_assign_all_busses()     0
13 #define pcibios_scan_all_fns(a, b)      0
14
15 #define PCIBIOS_MIN_IO          0UL
16 #define PCIBIOS_MIN_MEM         0UL
17
18 #define PCI_IRQ_NONE            0xffffffff
19
20 static inline void pcibios_set_master(struct pci_dev *dev)
21 {
22         /* No special bus mastering setup handling */
23 }
24
25 static inline void pcibios_penalize_isa_irq(int irq, int active)
26 {
27         /* We don't do dynamic PCI IRQ allocation */
28 }
29
30 /* Dynamic DMA mapping stuff.
31  */
32 #define PCI_DMA_BUS_IS_PHYS     (0)
33
34 #include <asm/scatterlist.h>
35
36 struct pci_dev;
37
38 /* Allocate and map kernel buffer using consistent mode DMA for a device.
39  * hwdev should be valid struct pci_dev pointer for PCI devices.
40  */
41 extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle);
42
43 /* Free and unmap a consistent DMA buffer.
44  * cpu_addr is what was returned from pci_alloc_consistent,
45  * size must be the same as what as passed into pci_alloc_consistent,
46  * and likewise dma_addr must be the same as what *dma_addrp was set to.
47  *
48  * References to the memory and mappings assosciated with cpu_addr/dma_addr
49  * past this call are illegal.
50  */
51 extern void pci_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle);
52
53 /* Map a single buffer of the indicated size for DMA in streaming mode.
54  * The 32-bit bus address to use is returned.
55  *
56  * Once the device is given the dma address, the device owns this memory
57  * until either pci_unmap_single or pci_dma_sync_single_for_cpu is performed.
58  */
59 extern dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction);
60
61 /* Unmap a single streaming mode DMA translation.  The dma_addr and size
62  * must match what was provided for in a previous pci_map_single call.  All
63  * other usages are undefined.
64  *
65  * After this call, reads by the cpu to the buffer are guaranteed to see
66  * whatever the device wrote there.
67  */
68 extern void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, int direction);
69
70 /* pci_unmap_{single,page} is not a nop, thus... */
71 #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)       \
72         dma_addr_t ADDR_NAME;
73 #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)         \
74         __u32 LEN_NAME;
75 #define pci_unmap_addr(PTR, ADDR_NAME)                  \
76         ((PTR)->ADDR_NAME)
77 #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)         \
78         (((PTR)->ADDR_NAME) = (VAL))
79 #define pci_unmap_len(PTR, LEN_NAME)                    \
80         ((PTR)->LEN_NAME)
81 #define pci_unmap_len_set(PTR, LEN_NAME, VAL)           \
82         (((PTR)->LEN_NAME) = (VAL))
83
84 /*
85  * Same as above, only with pages instead of mapped addresses.
86  */
87 extern dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page,
88                         unsigned long offset, size_t size, int direction);
89 extern void pci_unmap_page(struct pci_dev *hwdev,
90                         dma_addr_t dma_address, size_t size, int direction);
91
92 /* Map a set of buffers described by scatterlist in streaming
93  * mode for DMA.  This is the scather-gather version of the
94  * above pci_map_single interface.  Here the scatter gather list
95  * elements are each tagged with the appropriate dma address
96  * and length.  They are obtained via sg_dma_{address,length}(SG).
97  *
98  * NOTE: An implementation may be able to use a smaller number of
99  *       DMA address/length pairs than there are SG table elements.
100  *       (for example via virtual mapping capabilities)
101  *       The routine returns the number of addr/length pairs actually
102  *       used, at most nents.
103  *
104  * Device ownership issues as mentioned above for pci_map_single are
105  * the same here.
106  */
107 extern int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction);
108
109 /* Unmap a set of streaming mode DMA translations.
110  * Again, cpu read rules concerning calls here are the same as for
111  * pci_unmap_single() above.
112  */
113 extern void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nhwents, int direction);
114
115 /* Make physical memory consistent for a single
116  * streaming mode DMA translation after a transfer.
117  *
118  * If you perform a pci_map_single() but wish to interrogate the
119  * buffer using the cpu, yet do not wish to teardown the PCI dma
120  * mapping, you must call this function before doing so.  At the
121  * next point you give the PCI dma address back to the card, you
122  * must first perform a pci_dma_sync_for_device, and then the device
123  * again owns the buffer.
124  */
125 extern void pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction);
126 extern void pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction);
127
128 /* Make physical memory consistent for a set of streaming
129  * mode DMA translations after a transfer.
130  *
131  * The same as pci_dma_sync_single_* but for a scatter-gather list,
132  * same rules and usage.
133  */
134 extern void pci_dma_sync_sg_for_cpu(struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction);
135 extern void pci_dma_sync_sg_for_device(struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction);
136
137 /* Return whether the given PCI device DMA address mask can
138  * be supported properly.  For example, if your device can
139  * only drive the low 24-bits during PCI bus mastering, then
140  * you would pass 0x00ffffff as the mask to this function.
141  */
142 static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
143 {
144         return 1;
145 }
146
147 #ifdef CONFIG_PCI
148 static inline void pci_dma_burst_advice(struct pci_dev *pdev,
149                                         enum pci_dma_burst_strategy *strat,
150                                         unsigned long *strategy_parameter)
151 {
152         *strat = PCI_DMA_BURST_INFINITY;
153         *strategy_parameter = ~0UL;
154 }
155 #endif
156
157 #define PCI_DMA_ERROR_CODE      (~(dma_addr_t)0x0)
158
159 static inline int pci_dma_mapping_error(struct pci_dev *pdev,
160                                         dma_addr_t dma_addr)
161 {
162         return (dma_addr == PCI_DMA_ERROR_CODE);
163 }
164
165 struct device_node;
166 extern struct device_node *pci_device_to_OF_node(struct pci_dev *pdev);
167
168 #endif /* __KERNEL__ */
169
170 /* generic pci stuff */
171 #include <asm-generic/pci.h>
172
173 #endif /* __SPARC_PCI_H */