BXE: fp memory allocation (faked)
[akaros.git] / kern / drivers / net / bxe / bsd_bus.h
1 /* Various parts of FreeBSD x86/include/bus.h
2  *
3  * Copyright (c) KATO Takenori, 1999.
4  *
5  * All rights reserved.  Unpublished rights reserved under the copyright
6  * laws of Japan.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer as
14  *    the first lines of this file unmodified.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD: head/sys/x86/include/bus.h 263289 2014-03-18 01:40:25Z emaste $
33  */
34
35 /*      $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $    */
36
37 /*-
38  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
39  * All rights reserved.
40  *
41  * This code is derived from software contributed to The NetBSD Foundation
42  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
43  * NASA Ames Research Center.
44  *
45  * Redistribution and use in source and binary forms, with or without
46  * modification, are permitted provided that the following conditions
47  * are met:
48  * 1. Redistributions of source code must retain the above copyright
49  *    notice, this list of conditions and the following disclaimer.
50  * 2. Redistributions in binary form must reproduce the above copyright
51  *    notice, this list of conditions and the following disclaimer in the
52  *    documentation and/or other materials provided with the distribution.
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
55  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
56  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
57  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
58  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
59  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
60  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
61  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
62  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
63  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
64  * POSSIBILITY OF SUCH DAMAGE.
65  */
66
67 /*-
68  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
69  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
70  *
71  * Redistribution and use in source and binary forms, with or without
72  * modification, are permitted provided that the following conditions
73  * are met:
74  * 1. Redistributions of source code must retain the above copyright
75  *    notice, this list of conditions and the following disclaimer.
76  * 2. Redistributions in binary form must reproduce the above copyright
77  *    notice, this list of conditions and the following disclaimer in the
78  *    documentation and/or other materials provided with the distribution.
79  * 3. All advertising materials mentioning features or use of this software
80  *    must display the following acknowledgement:
81  *      This product includes software developed by Christopher G. Demetriou
82  *      for the NetBSD Project.
83  * 4. The name of the author may not be used to endorse or promote products
84  *    derived from this software without specific prior written permission
85  *
86  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
87  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
88  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
89  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
90  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
91  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
92  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
93  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
94  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
95  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
96  */
97
98 /* Modified for Akaros */
99
100 #ifndef ROS_BSD_BUS_H
101 #define ROS_BSD_BUS_H
102
103 typedef uintptr_t bus_addr_t;
104 typedef uintptr_t bus_size_t;
105 typedef uintptr_t bus_space_handle_t;
106 typedef void *bus_dma_tag_t;
107 typedef void *bus_dmamap_t;
108 typedef uintptr_t bus_dma_segment_t;
109 typedef uintptr_t bus_space_tag_t;
110
111 /* ret is the location of the tag we create, which is just the size */
112 #define bus_get_dma_tag(pcidev) (0)
113 #define bus_dma_tag_create(_tag, _align, _bound, _low, _hi, _fil, _filarg,     \
114                            _size, _num, _size2, _flag2, _lock, _lockarg, _ret) \
115 ({                                                                             \
116         *(size_t*)(_ret) = (size_t)(_size);                                        \
117         0;                                                                         \
118 })
119 #define bus_dma_tag_destroy(...)
120 #define bus_dmamem_alloc(_tag, _vaddraddr, _flags, _map)                       \
121 ({                                                                             \
122         size_t order = LOG2_UP(nr_pages((size_t)(_tag)));                          \
123         int ret = -ENOMEM;                                                         \
124         void *vaddr = get_cont_pages(order, 0);                                    \
125         if (vaddr) {                                                               \
126                 memset(vaddr, 0, (size_t)(_tag));                                      \
127                 ret = 0;                                                               \
128                 *(_vaddraddr) = vaddr;                                                 \
129         }                                                                          \
130         ret;                                                                       \
131 })
132 #define bus_dmamem_free(_tag, _vaddr, _map)                                    \
133 ({                                                                             \
134         size_t order = LOG2_UP(nr_pages((size_t)(_tag)));                          \
135         free_cont_pages((_vaddr), order);                                          \
136 })
137 #define bus_dmamap_sync(...)
138 /* bxe_dma_map_addr is actually a callback tht does the paddr assignment */
139 #define bus_dmamap_load(_tag, _map, _vaddr, _size, _map_addr, _dma, _flag)     \
140 ({                                                                             \
141         (_dma)->paddr = PADDR((_dma)->vaddr);                                      \
142         0;                                                                         \
143 })
144 #define bus_dmamap_unload(...)
145 #define bus_dmamap_create(...) (0)
146 #define bus_dmamap_destroy(...)
147
148 /* We should be fine with irq = 0.  When we use BusPCI, it is ignored.  We
149  * might need to deal with the filter too. */
150 #define bus_setup_intr(pci, res, flags, filter, handler, arg, tag)             \
151         register_irq(0, (handler), (arg),                                          \
152                  MKBUS(BusPCI, (pci)->bus, (pci)->dev, (pci)->func))
153 #define bus_teardown_intr(...)
154 #define bus_describe_intr(...)
155 #define bus_bind_intr(...)
156
157 /* This is supposed to be an mbuf chain.  Just give them a blob for now */
158 #define m_getjcl(ign1, ign2, ign3, _size) kzmalloc((_size), KMALLOC_WAIT)
159 #define m_freem(m) kfree(m)
160 #define m_free(m) kfree(m)
161 #define bus_dmamap_load_mbuf_sg(_tag, _map, _mbuf, _segs, _nsegs, _flag)       \
162 ({                                                                             \
163         (_segs)[0] = PADDR((_mbuf));                                               \
164         *(_nsegs) = 1;                                                             \
165         0;                                                                         \
166 })
167
168 /* Bus read/write barrier methods.
169  *
170  *      void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
171  *                             bus_size_t offset, bus_size_t len, int flags);
172  *
173  *
174  * Note that BUS_SPACE_BARRIER_WRITE doesn't do anything other than
175  * prevent reordering by the compiler; all Intel x86 processors currently
176  * retire operations outside the CPU in program order.
177  */
178 #define BUS_SPACE_BARRIER_READ  0x01    /* force read barrier */
179 #define BUS_SPACE_BARRIER_WRITE 0x02    /* force write barrier */
180
181 static inline void bus_space_barrier(bus_space_tag_t tag,
182                                                                          bus_space_handle_t bsh, bus_size_t offset,
183                                                                          bus_size_t len, int flags)
184 {
185         if (flags & BUS_SPACE_BARRIER_READ)
186                 bus_rmb();
187         else
188                 bus_wmb();
189 }
190
191 /*
192  * Values for the x86 bus space tag, not to be used directly by MI code.
193  */
194 #define X86_BUS_SPACE_IO        0       /* space is i/o space */
195 #define X86_BUS_SPACE_MEM       1       /* space is mem space */
196
197 #define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF
198 #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
199 #define BUS_SPACE_MAXSIZE       0xFFFFFFFF
200 #define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF
201 #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
202 #if defined(__amd64__) || defined(PAE)
203 #define BUS_SPACE_MAXADDR       0xFFFFFFFFFFFFFFFFULL
204 #else
205 #define BUS_SPACE_MAXADDR       0xFFFFFFFF
206 #endif
207
208 #define BUS_SPACE_INVALID_DATA  (~0)
209 #define BUS_SPACE_UNRESTRICTED  (~0)
210
211 static inline uint8_t bus_space_read_1(bus_space_tag_t tag,
212                                                                            bus_space_handle_t handle,
213                                                                            bus_size_t offset)
214 {
215         if (tag == X86_BUS_SPACE_IO)
216                 return (inb(handle + offset));
217         return (*(volatile uint8_t *)(handle + offset));
218 }
219
220 static inline uint16_t bus_space_read_2(bus_space_tag_t tag,
221                                                                                 bus_space_handle_t handle,
222                                                                                 bus_size_t offset)
223 {
224         if (tag == X86_BUS_SPACE_IO)
225                 return (inw(handle + offset));
226         return (*(volatile uint16_t *)(handle + offset));
227 }
228
229 static inline uint32_t bus_space_read_4(bus_space_tag_t tag,
230                                                                                 bus_space_handle_t handle,
231                                                                                 bus_size_t offset)
232 {
233         if (tag == X86_BUS_SPACE_IO)
234                 return (inl(handle + offset));
235         return (*(volatile uint32_t *)(handle + offset));
236 }
237
238 static inline void bus_space_write_1(bus_space_tag_t tag,
239                                                                          bus_space_handle_t bsh, bus_size_t offset,
240                                                                          uint8_t value)
241 {
242         if (tag == X86_BUS_SPACE_IO)
243                 outb(bsh + offset, value);
244         else
245                 *(volatile uint8_t *)(bsh + offset) = value;
246 }
247
248 static inline void bus_space_write_2(bus_space_tag_t tag,
249                                                                          bus_space_handle_t bsh, bus_size_t offset,
250                                                                          uint16_t value)
251 {
252         if (tag == X86_BUS_SPACE_IO)
253                 outw(bsh + offset, value);
254         else
255                 *(volatile uint16_t *)(bsh + offset) = value;
256 }
257
258 static inline void bus_space_write_4(bus_space_tag_t tag,
259                                                                          bus_space_handle_t bsh, bus_size_t offset,
260                                                                          uint32_t value)
261 {
262         if (tag == X86_BUS_SPACE_IO)
263                 outl(bsh + offset, value);
264         else
265                 *(volatile uint32_t *)(bsh + offset) = value;
266 }
267
268 #endif /* ROS_BSD_BUS_H */