1f9bac91bSBenno Rice /*- 2f9bac91bSBenno Rice * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 3f9bac91bSBenno Rice * All rights reserved. 4f9bac91bSBenno Rice * 5f9bac91bSBenno Rice * This code is derived from software contributed to The NetBSD Foundation 6f9bac91bSBenno Rice * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 7f9bac91bSBenno Rice * NASA Ames Research Center. 8f9bac91bSBenno Rice * 9f9bac91bSBenno Rice * Redistribution and use in source and binary forms, with or without 10f9bac91bSBenno Rice * modification, are permitted provided that the following conditions 11f9bac91bSBenno Rice * are met: 12f9bac91bSBenno Rice * 1. Redistributions of source code must retain the above copyright 13f9bac91bSBenno Rice * notice, this list of conditions and the following disclaimer. 14f9bac91bSBenno Rice * 2. Redistributions in binary form must reproduce the above copyright 15f9bac91bSBenno Rice * notice, this list of conditions and the following disclaimer in the 16f9bac91bSBenno Rice * documentation and/or other materials provided with the distribution. 17f9bac91bSBenno Rice * 3. All advertising materials mentioning features or use of this software 18f9bac91bSBenno Rice * must display the following acknowledgement: 19f9bac91bSBenno Rice * This product includes software developed by the NetBSD 20f9bac91bSBenno Rice * Foundation, Inc. and its contributors. 21f9bac91bSBenno Rice * 4. Neither the name of The NetBSD Foundation nor the names of its 22f9bac91bSBenno Rice * contributors may be used to endorse or promote products derived 23f9bac91bSBenno Rice * from this software without specific prior written permission. 24f9bac91bSBenno Rice * 25f9bac91bSBenno Rice * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 26f9bac91bSBenno Rice * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27f9bac91bSBenno Rice * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28f9bac91bSBenno Rice * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 29f9bac91bSBenno Rice * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30f9bac91bSBenno Rice * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31f9bac91bSBenno Rice * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32f9bac91bSBenno Rice * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33f9bac91bSBenno Rice * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34f9bac91bSBenno Rice * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35f9bac91bSBenno Rice * POSSIBILITY OF SUCH DAMAGE. 36f9bac91bSBenno Rice */ 37f9bac91bSBenno Rice 38f9bac91bSBenno Rice /* 39f9bac91bSBenno Rice * Copyright (c) 1996 Charles M. Hannum. All rights reserved. 40f9bac91bSBenno Rice * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 41f9bac91bSBenno Rice * 42f9bac91bSBenno Rice * Redistribution and use in source and binary forms, with or without 43f9bac91bSBenno Rice * modification, are permitted provided that the following conditions 44f9bac91bSBenno Rice * are met: 45f9bac91bSBenno Rice * 1. Redistributions of source code must retain the above copyright 46f9bac91bSBenno Rice * notice, this list of conditions and the following disclaimer. 47f9bac91bSBenno Rice * 2. Redistributions in binary form must reproduce the above copyright 48f9bac91bSBenno Rice * notice, this list of conditions and the following disclaimer in the 49f9bac91bSBenno Rice * documentation and/or other materials provided with the distribution. 50f9bac91bSBenno Rice * 3. All advertising materials mentioning features or use of this software 51f9bac91bSBenno Rice * must display the following acknowledgement: 52f9bac91bSBenno Rice * This product includes software developed by Christopher G. Demetriou 53f9bac91bSBenno Rice * for the NetBSD Project. 54f9bac91bSBenno Rice * 4. The name of the author may not be used to endorse or promote products 55f9bac91bSBenno Rice * derived from this software without specific prior written permission 56f9bac91bSBenno Rice * 57f9bac91bSBenno Rice * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 58f9bac91bSBenno Rice * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 59f9bac91bSBenno Rice * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 60f9bac91bSBenno Rice * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 61f9bac91bSBenno Rice * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 62f9bac91bSBenno Rice * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 63f9bac91bSBenno Rice * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 64f9bac91bSBenno Rice * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 65f9bac91bSBenno Rice * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 66f9bac91bSBenno Rice * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 67f9bac91bSBenno Rice * 68f9bac91bSBenno Rice * $NetBSD: bus.h,v 1.9.4.1 2000/06/30 16:27:30 simonb Exp $ 69f9bac91bSBenno Rice * $FreeBSD$ 70f9bac91bSBenno Rice */ 71f9bac91bSBenno Rice 72f9bac91bSBenno Rice #ifndef _MACPPC_BUS_H_ 73f9bac91bSBenno Rice #define _MACPPC_BUS_H_ 74f9bac91bSBenno Rice 75f9bac91bSBenno Rice #include <machine/pio.h> 76f9bac91bSBenno Rice 77f9bac91bSBenno Rice /* 78f9bac91bSBenno Rice * Values for the macppc bus space tag, not to be used directly by MI code. 79f9bac91bSBenno Rice */ 80f9bac91bSBenno Rice 81f9bac91bSBenno Rice #define __BUS_SPACE_HAS_STREAM_METHODS 82f9bac91bSBenno Rice 83f9bac91bSBenno Rice #define MACPPC_BUS_ADDR_MASK 0xfffff000 84f9bac91bSBenno Rice #define MACPPC_BUS_STRIDE_MASK 0x0000000f 85f9bac91bSBenno Rice 86f9bac91bSBenno Rice #define macppc_make_bus_space_tag(addr, stride) \ 87f9bac91bSBenno Rice (((addr) & MACPPC_BUS_ADDR_MASK) | (stride)) 88f9bac91bSBenno Rice #define __BA(t, h, o) ((void *)((h) + ((o) << ((t) & MACPPC_BUS_STRIDE_MASK)))) 89f9bac91bSBenno Rice 90f9bac91bSBenno Rice /* 91f9bac91bSBenno Rice * Bus address and size types 92f9bac91bSBenno Rice */ 93f9bac91bSBenno Rice typedef u_int32_t bus_addr_t; 94f9bac91bSBenno Rice typedef u_int32_t bus_size_t; 95f9bac91bSBenno Rice 96f9bac91bSBenno Rice /* 97f9bac91bSBenno Rice * Access methods for bus resources and address space. 98f9bac91bSBenno Rice */ 99f9bac91bSBenno Rice typedef u_int32_t bus_space_tag_t; 100f9bac91bSBenno Rice typedef u_int32_t bus_space_handle_t; 101f9bac91bSBenno Rice 102f9bac91bSBenno Rice /* 103f9bac91bSBenno Rice * int bus_space_map __P((bus_space_tag_t t, bus_addr_t addr, 104f9bac91bSBenno Rice * bus_size_t size, int flags, bus_space_handle_t *bshp)); 105f9bac91bSBenno Rice * 106f9bac91bSBenno Rice * Map a region of bus space. 107f9bac91bSBenno Rice */ 108f9bac91bSBenno Rice 109f9bac91bSBenno Rice #define BUS_SPACE_MAP_CACHEABLE 0x01 110f9bac91bSBenno Rice #define BUS_SPACE_MAP_LINEAR 0x02 111f9bac91bSBenno Rice #define BUS_SPACE_MAP_PREFETCHABLE 0x04 112f9bac91bSBenno Rice 113f9bac91bSBenno Rice extern void *mapiodev(vm_offset_t, vm_size_t); 114f9bac91bSBenno Rice 115f9bac91bSBenno Rice static __inline int 116f9bac91bSBenno Rice bus_space_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size, int flags, 117f9bac91bSBenno Rice bus_space_handle_t *bshp) 118f9bac91bSBenno Rice { 119f9bac91bSBenno Rice vm_offset_t base = t & MACPPC_BUS_ADDR_MASK; 120f9bac91bSBenno Rice int stride = t & MACPPC_BUS_STRIDE_MASK; 121f9bac91bSBenno Rice 122f9bac91bSBenno Rice *bshp = (bus_space_handle_t) 123f9bac91bSBenno Rice mapiodev(base + (addr << stride), size << stride); 124f9bac91bSBenno Rice return 0; 125f9bac91bSBenno Rice } 126f9bac91bSBenno Rice 127f9bac91bSBenno Rice /* 128f9bac91bSBenno Rice * int bus_space_unmap __P((bus_space_tag_t t, 129f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t size)); 130f9bac91bSBenno Rice * 131f9bac91bSBenno Rice * Unmap a region of bus space. 132f9bac91bSBenno Rice */ 133f9bac91bSBenno Rice 134f9bac91bSBenno Rice #define bus_space_unmap(t, bsh, size) 135f9bac91bSBenno Rice 136f9bac91bSBenno Rice /* 137f9bac91bSBenno Rice * int bus_space_subregion __P((bus_space_tag_t t, 138f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size, 139f9bac91bSBenno Rice * bus_space_handle_t *nbshp)); 140f9bac91bSBenno Rice * 141f9bac91bSBenno Rice * Get a new handle for a subregion of an already-mapped area of bus space. 142f9bac91bSBenno Rice */ 143f9bac91bSBenno Rice 144f9bac91bSBenno Rice #define bus_space_subregion(t, bsh, offset, size, bshp) \ 145f9bac91bSBenno Rice ((*(bshp) = (bus_space_handle_t)__BA(t, bsh, offset)), 0) 146f9bac91bSBenno Rice 147f9bac91bSBenno Rice /* 148f9bac91bSBenno Rice * int bus_space_alloc __P((bus_space_tag_t t, bus_addr_t rstart, 149f9bac91bSBenno Rice * bus_addr_t rend, bus_size_t size, bus_size_t align, 150f9bac91bSBenno Rice * bus_size_t boundary, int flags, bus_addr_t *addrp, 151f9bac91bSBenno Rice * bus_space_handle_t *bshp)); 152f9bac91bSBenno Rice * 153f9bac91bSBenno Rice * Allocate a region of bus space. 154f9bac91bSBenno Rice */ 155f9bac91bSBenno Rice 156f9bac91bSBenno Rice #if 0 157f9bac91bSBenno Rice #define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp) !!! unimplemented !!! 158f9bac91bSBenno Rice #endif 159f9bac91bSBenno Rice 160f9bac91bSBenno Rice /* 161f9bac91bSBenno Rice * int bus_space_free __P((bus_space_tag_t t, 162f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t size)); 163f9bac91bSBenno Rice * 164f9bac91bSBenno Rice * Free a region of bus space. 165f9bac91bSBenno Rice */ 166f9bac91bSBenno Rice #if 0 167f9bac91bSBenno Rice #define bus_space_free(t, h, s) !!! unimplemented !!! 168f9bac91bSBenno Rice #endif 169f9bac91bSBenno Rice 170f9bac91bSBenno Rice /* 171f9bac91bSBenno Rice * u_intN_t bus_space_read_N __P((bus_space_tag_t tag, 172f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset)); 173f9bac91bSBenno Rice * 174f9bac91bSBenno Rice * Read a 1, 2, 4, or 8 byte quantity from bus space 175f9bac91bSBenno Rice * described by tag/handle/offset. 176f9bac91bSBenno Rice */ 177f9bac91bSBenno Rice 178f9bac91bSBenno Rice #define bus_space_read_1(t, h, o) (in8(__BA(t, h, o))) 179f9bac91bSBenno Rice #define bus_space_read_2(t, h, o) (in16rb(__BA(t, h, o))) 180f9bac91bSBenno Rice #define bus_space_read_4(t, h, o) (in32rb(__BA(t, h, o))) 181f9bac91bSBenno Rice #if 0 /* Cause a link error for bus_space_read_8 */ 182f9bac91bSBenno Rice #define bus_space_read_8(t, h, o) !!! unimplemented !!! 183f9bac91bSBenno Rice #endif 184f9bac91bSBenno Rice 185f9bac91bSBenno Rice #define bus_space_read_stream_1(t, h, o) (in8(__BA(t, h, o))) 186f9bac91bSBenno Rice #define bus_space_read_stream_2(t, h, o) (in16(__BA(t, h, o))) 187f9bac91bSBenno Rice #define bus_space_read_stream_4(t, h, o) (in32(__BA(t, h, o))) 188f9bac91bSBenno Rice #if 0 /* Cause a link error for bus_space_read_stream_8 */ 189f9bac91bSBenno Rice #define bus_space_read_8(t, h, o) !!! unimplemented !!! 190f9bac91bSBenno Rice #endif 191f9bac91bSBenno Rice 192f9bac91bSBenno Rice /* 193f9bac91bSBenno Rice * void bus_space_read_multi_N __P((bus_space_tag_t tag, 194f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, 195f9bac91bSBenno Rice * u_intN_t *addr, size_t count)); 196f9bac91bSBenno Rice * 197f9bac91bSBenno Rice * Read `count' 1, 2, 4, or 8 byte quantities from bus space 198f9bac91bSBenno Rice * described by tag/handle/offset and copy into buffer provided. 199f9bac91bSBenno Rice */ 200f9bac91bSBenno Rice 201f9bac91bSBenno Rice #define bus_space_read_multi_1(t, h, o, a, c) do { \ 202f9bac91bSBenno Rice ins8(__BA(t, h, o), (a), (c)); \ 203f9bac91bSBenno Rice } while (0) 204f9bac91bSBenno Rice 205f9bac91bSBenno Rice #define bus_space_read_multi_2(t, h, o, a, c) do { \ 206f9bac91bSBenno Rice ins16rb(__BA(t, h, o), (a), (c)); \ 207f9bac91bSBenno Rice } while (0) 208f9bac91bSBenno Rice 209f9bac91bSBenno Rice #define bus_space_read_multi_4(t, h, o, a, c) do { \ 210f9bac91bSBenno Rice ins32rb(__BA(t, h, o), (a), (c)); \ 211f9bac91bSBenno Rice } while (0) 212f9bac91bSBenno Rice 213f9bac91bSBenno Rice #if 0 /* Cause a link error for bus_space_read_multi_8 */ 214f9bac91bSBenno Rice #define bus_space_read_multi_8 !!! unimplemented !!! 215f9bac91bSBenno Rice #endif 216f9bac91bSBenno Rice 217f9bac91bSBenno Rice #define bus_space_read_multi_stream_1(t, h, o, a, c) do { \ 218f9bac91bSBenno Rice ins8(__BA(t, h, o), (a), (c)); \ 219f9bac91bSBenno Rice } while (0) 220f9bac91bSBenno Rice 221f9bac91bSBenno Rice #define bus_space_read_multi_stream_2(t, h, o, a, c) do { \ 222f9bac91bSBenno Rice ins16(__BA(t, h, o), (a), (c)); \ 223f9bac91bSBenno Rice } while (0) 224f9bac91bSBenno Rice 225f9bac91bSBenno Rice #define bus_space_read_multi_stream_4(t, h, o, a, c) do { \ 226f9bac91bSBenno Rice ins32(__BA(t, h, o), (a), (c)); \ 227f9bac91bSBenno Rice } while (0) 228f9bac91bSBenno Rice 229f9bac91bSBenno Rice #if 0 /* Cause a link error for bus_space_read_multi_stream_8 */ 230f9bac91bSBenno Rice #define bus_space_read_multi_stream_8 !!! unimplemented !!! 231f9bac91bSBenno Rice #endif 232f9bac91bSBenno Rice 233f9bac91bSBenno Rice /* 234f9bac91bSBenno Rice * void bus_space_read_region_N __P((bus_space_tag_t tag, 235f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, 236f9bac91bSBenno Rice * u_intN_t *addr, size_t count)); 237f9bac91bSBenno Rice * 238f9bac91bSBenno Rice * Read `count' 1, 2, 4, or 8 byte quantities from bus space 239f9bac91bSBenno Rice * described by tag/handle and starting at `offset' and copy into 240f9bac91bSBenno Rice * buffer provided. 241f9bac91bSBenno Rice */ 242f9bac91bSBenno Rice 243f9bac91bSBenno Rice static __inline void 244f9bac91bSBenno Rice bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 245f9bac91bSBenno Rice bus_size_t offset, u_int8_t *addr, size_t count) 246f9bac91bSBenno Rice { 247f9bac91bSBenno Rice volatile u_int8_t *s = __BA(tag, bsh, offset); 248f9bac91bSBenno Rice 249f9bac91bSBenno Rice while (count--) 250f9bac91bSBenno Rice *addr++ = *s++; 251f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 252f9bac91bSBenno Rice } 253f9bac91bSBenno Rice 254f9bac91bSBenno Rice static __inline void 255f9bac91bSBenno Rice bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 256f9bac91bSBenno Rice bus_size_t offset, u_int16_t *addr, size_t count) 257f9bac91bSBenno Rice { 258f9bac91bSBenno Rice volatile u_int16_t *s = __BA(tag, bsh, offset); 259f9bac91bSBenno Rice 260f9bac91bSBenno Rice while (count--) 261f9bac91bSBenno Rice __asm __volatile("lhbrx %0, 0, %1" : 262f9bac91bSBenno Rice "=r"(*addr++) : "r"(s++)); 263f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 264f9bac91bSBenno Rice } 265f9bac91bSBenno Rice 266f9bac91bSBenno Rice static __inline void 267f9bac91bSBenno Rice bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 268f9bac91bSBenno Rice bus_size_t offset, u_int32_t *addr, size_t count) 269f9bac91bSBenno Rice { 270f9bac91bSBenno Rice volatile u_int32_t *s = __BA(tag, bsh, offset); 271f9bac91bSBenno Rice 272f9bac91bSBenno Rice while (count--) 273f9bac91bSBenno Rice __asm __volatile("lwbrx %0, 0, %1" : 274f9bac91bSBenno Rice "=r"(*addr++) : "r"(s++)); 275f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 276f9bac91bSBenno Rice } 277f9bac91bSBenno Rice 278f9bac91bSBenno Rice #if 0 /* Cause a link error for bus_space_read_region_8 */ 279f9bac91bSBenno Rice #define bus_space_read_region_8 !!! unimplemented !!! 280f9bac91bSBenno Rice #endif 281f9bac91bSBenno Rice 282f9bac91bSBenno Rice static __inline void 283f9bac91bSBenno Rice bus_space_read_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 284f9bac91bSBenno Rice bus_size_t offset, u_int16_t *addr, size_t count) 285f9bac91bSBenno Rice { 286f9bac91bSBenno Rice volatile u_int16_t *s = __BA(tag, bsh, offset); 287f9bac91bSBenno Rice 288f9bac91bSBenno Rice while (count--) 289f9bac91bSBenno Rice *addr++ = *s++; 290f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 291f9bac91bSBenno Rice } 292f9bac91bSBenno Rice 293f9bac91bSBenno Rice static __inline void 294f9bac91bSBenno Rice bus_space_read_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 295f9bac91bSBenno Rice bus_size_t offset, u_int32_t *addr, size_t count) 296f9bac91bSBenno Rice { 297f9bac91bSBenno Rice volatile u_int32_t *s = __BA(tag, bsh, offset); 298f9bac91bSBenno Rice 299f9bac91bSBenno Rice while (count--) 300f9bac91bSBenno Rice *addr++ = *s++; 301f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 302f9bac91bSBenno Rice } 303f9bac91bSBenno Rice 304f9bac91bSBenno Rice #if 0 /* Cause a link error */ 305f9bac91bSBenno Rice #define bus_space_read_region_stream_8 !!! unimplemented !!! 306f9bac91bSBenno Rice #endif 307f9bac91bSBenno Rice 308f9bac91bSBenno Rice /* 309f9bac91bSBenno Rice * void bus_space_write_N __P((bus_space_tag_t tag, 310f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, 311f9bac91bSBenno Rice * u_intN_t value)); 312f9bac91bSBenno Rice * 313f9bac91bSBenno Rice * Write the 1, 2, 4, or 8 byte value `value' to bus space 314f9bac91bSBenno Rice * described by tag/handle/offset. 315f9bac91bSBenno Rice */ 316f9bac91bSBenno Rice 317f9bac91bSBenno Rice #define bus_space_write_1(t, h, o, v) out8(__BA(t, h, o), (v)) 318f9bac91bSBenno Rice #define bus_space_write_2(t, h, o, v) out16rb(__BA(t, h, o), (v)) 319f9bac91bSBenno Rice #define bus_space_write_4(t, h, o, v) out32rb(__BA(t, h, o), (v)) 320f9bac91bSBenno Rice 321f9bac91bSBenno Rice #define bus_space_write_stream_1(t, h, o, v) out8(__BA(t, h, o), (v)) 322f9bac91bSBenno Rice #define bus_space_write_stream_2(t, h, o, v) out16(__BA(t, h, o), (v)) 323f9bac91bSBenno Rice #define bus_space_write_stream_4(t, h, o, v) out32(__BA(t, h, o), (v)) 324f9bac91bSBenno Rice 325f9bac91bSBenno Rice #if 0 /* Cause a link error for bus_space_write_8 */ 326f9bac91bSBenno Rice #define bus_space_write_8 !!! unimplemented !!! 327f9bac91bSBenno Rice #endif 328f9bac91bSBenno Rice 329f9bac91bSBenno Rice /* 330f9bac91bSBenno Rice * void bus_space_write_multi_N __P((bus_space_tag_t tag, 331f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, 332f9bac91bSBenno Rice * const u_intN_t *addr, size_t count)); 333f9bac91bSBenno Rice * 334f9bac91bSBenno Rice * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 335f9bac91bSBenno Rice * provided to bus space described by tag/handle/offset. 336f9bac91bSBenno Rice */ 337f9bac91bSBenno Rice 338f9bac91bSBenno Rice #define bus_space_write_multi_1(t, h, o, a, c) do { \ 339f9bac91bSBenno Rice outsb(__BA(t, h, o), (a), (c)); \ 340f9bac91bSBenno Rice } while (0) 341f9bac91bSBenno Rice 342f9bac91bSBenno Rice #define bus_space_write_multi_2(t, h, o, a, c) do { \ 343f9bac91bSBenno Rice outsw(__BA(t, h, o), (a), (c)); \ 344f9bac91bSBenno Rice } while (0) 345f9bac91bSBenno Rice 346f9bac91bSBenno Rice #define bus_space_write_multi_4(t, h, o, a, c) do { \ 347f9bac91bSBenno Rice outsl(__BA(t, h, o), (a), (c)); \ 348f9bac91bSBenno Rice } while (0) 349f9bac91bSBenno Rice 350f9bac91bSBenno Rice #if 0 351f9bac91bSBenno Rice #define bus_space_write_multi_8 !!! unimplemented !!! 352f9bac91bSBenno Rice #endif 353f9bac91bSBenno Rice 354f9bac91bSBenno Rice #define bus_space_write_multi_stream_2(t, h, o, a, c) do { \ 355f9bac91bSBenno Rice outsw(__BA(t, h, o), (a), (c)); \ 356f9bac91bSBenno Rice } while (0) 357f9bac91bSBenno Rice 358f9bac91bSBenno Rice #define bus_space_write_multi_stream_4(t, h, o, a, c) do { \ 359f9bac91bSBenno Rice outsl(__BA(t, h, o), (a), (c)); \ 360f9bac91bSBenno Rice } while (0) 361f9bac91bSBenno Rice 362f9bac91bSBenno Rice #if 0 363f9bac91bSBenno Rice #define bus_space_write_multi_stream_8 !!! unimplemented !!! 364f9bac91bSBenno Rice #endif 365f9bac91bSBenno Rice 366f9bac91bSBenno Rice /* 367f9bac91bSBenno Rice * void bus_space_write_region_N __P((bus_space_tag_t tag, 368f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, 369f9bac91bSBenno Rice * const u_intN_t *addr, size_t count)); 370f9bac91bSBenno Rice * 371f9bac91bSBenno Rice * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 372f9bac91bSBenno Rice * to bus space described by tag/handle starting at `offset'. 373f9bac91bSBenno Rice */ 374f9bac91bSBenno Rice 375f9bac91bSBenno Rice static __inline void 376f9bac91bSBenno Rice bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 377f9bac91bSBenno Rice bus_size_t offset, const u_int8_t *addr, size_t count) 378f9bac91bSBenno Rice { 379f9bac91bSBenno Rice volatile u_int8_t *d = __BA(tag, bsh, offset); 380f9bac91bSBenno Rice 381f9bac91bSBenno Rice while (count--) 382f9bac91bSBenno Rice *d++ = *addr++; 383f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 384f9bac91bSBenno Rice } 385f9bac91bSBenno Rice 386f9bac91bSBenno Rice static __inline void 387f9bac91bSBenno Rice bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 388f9bac91bSBenno Rice bus_size_t offset, const u_int16_t *addr, size_t count) 389f9bac91bSBenno Rice { 390f9bac91bSBenno Rice volatile u_int16_t *d = __BA(tag, bsh, offset); 391f9bac91bSBenno Rice 392f9bac91bSBenno Rice while (count--) 393f9bac91bSBenno Rice __asm __volatile("sthbrx %0, 0, %1" :: 394f9bac91bSBenno Rice "r"(*addr++), "r"(d++)); 395f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 396f9bac91bSBenno Rice } 397f9bac91bSBenno Rice 398f9bac91bSBenno Rice static __inline void 399f9bac91bSBenno Rice bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 400f9bac91bSBenno Rice bus_size_t offset, const u_int32_t *addr, size_t count) 401f9bac91bSBenno Rice { 402f9bac91bSBenno Rice volatile u_int32_t *d = __BA(tag, bsh, offset); 403f9bac91bSBenno Rice 404f9bac91bSBenno Rice while (count--) 405f9bac91bSBenno Rice __asm __volatile("stwbrx %0, 0, %1" :: 406f9bac91bSBenno Rice "r"(*addr++), "r"(d++)); 407f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 408f9bac91bSBenno Rice } 409f9bac91bSBenno Rice 410f9bac91bSBenno Rice #if 0 411f9bac91bSBenno Rice #define bus_space_write_region_8 !!! bus_space_write_region_8 unimplemented !!! 412f9bac91bSBenno Rice #endif 413f9bac91bSBenno Rice 414f9bac91bSBenno Rice static __inline void 415f9bac91bSBenno Rice bus_space_write_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 416f9bac91bSBenno Rice bus_size_t offset, const u_int16_t *addr, size_t count) 417f9bac91bSBenno Rice { 418f9bac91bSBenno Rice volatile u_int16_t *d = __BA(tag, bsh, offset); 419f9bac91bSBenno Rice 420f9bac91bSBenno Rice while (count--) 421f9bac91bSBenno Rice *d++ = *addr++; 422f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 423f9bac91bSBenno Rice } 424f9bac91bSBenno Rice 425f9bac91bSBenno Rice static __inline void 426f9bac91bSBenno Rice bus_space_write_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 427f9bac91bSBenno Rice bus_size_t offset, const u_int32_t *addr, size_t count) 428f9bac91bSBenno Rice { 429f9bac91bSBenno Rice volatile u_int32_t *d = __BA(tag, bsh, offset); 430f9bac91bSBenno Rice 431f9bac91bSBenno Rice while (count--) 432f9bac91bSBenno Rice *d++ = *addr++; 433f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 434f9bac91bSBenno Rice } 435f9bac91bSBenno Rice 436f9bac91bSBenno Rice #if 0 437f9bac91bSBenno Rice #define bus_space_write_region_stream_8 !!! unimplemented !!! 438f9bac91bSBenno Rice #endif 439f9bac91bSBenno Rice 440f9bac91bSBenno Rice /* 441f9bac91bSBenno Rice * void bus_space_set_multi_N __P((bus_space_tag_t tag, 442f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 443f9bac91bSBenno Rice * size_t count)); 444f9bac91bSBenno Rice * 445f9bac91bSBenno Rice * Write the 1, 2, 4, or 8 byte value `val' to bus space described 446f9bac91bSBenno Rice * by tag/handle/offset `count' times. 447f9bac91bSBenno Rice */ 448f9bac91bSBenno Rice 449f9bac91bSBenno Rice static __inline void 450f9bac91bSBenno Rice bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 451f9bac91bSBenno Rice bus_size_t offset, u_int8_t val, size_t count) 452f9bac91bSBenno Rice { 453f9bac91bSBenno Rice volatile u_int8_t *d = __BA(tag, bsh, offset); 454f9bac91bSBenno Rice 455f9bac91bSBenno Rice while (count--) 456f9bac91bSBenno Rice *d = val; 457f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 458f9bac91bSBenno Rice } 459f9bac91bSBenno Rice 460f9bac91bSBenno Rice static __inline void 461f9bac91bSBenno Rice bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 462f9bac91bSBenno Rice bus_size_t offset, u_int16_t val, size_t count) 463f9bac91bSBenno Rice { 464f9bac91bSBenno Rice volatile u_int16_t *d = __BA(tag, bsh, offset); 465f9bac91bSBenno Rice 466f9bac91bSBenno Rice while (count--) 467f9bac91bSBenno Rice __asm __volatile("sthbrx %0, 0, %1" :: 468f9bac91bSBenno Rice "r"(val), "r"(d)); 469f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 470f9bac91bSBenno Rice } 471f9bac91bSBenno Rice 472f9bac91bSBenno Rice static __inline void 473f9bac91bSBenno Rice bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 474f9bac91bSBenno Rice bus_size_t offset, u_int32_t val, size_t count) 475f9bac91bSBenno Rice { 476f9bac91bSBenno Rice volatile u_int32_t *d = __BA(tag, bsh, offset); 477f9bac91bSBenno Rice 478f9bac91bSBenno Rice while (count--) 479f9bac91bSBenno Rice __asm __volatile("stwbrx %0, 0, %1" :: 480f9bac91bSBenno Rice "r"(val), "r"(d)); 481f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 482f9bac91bSBenno Rice } 483f9bac91bSBenno Rice 484f9bac91bSBenno Rice #if 0 485f9bac91bSBenno Rice #define bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!! 486f9bac91bSBenno Rice #endif 487f9bac91bSBenno Rice 488f9bac91bSBenno Rice static __inline void 489f9bac91bSBenno Rice bus_space_set_multi_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 490f9bac91bSBenno Rice bus_size_t offset, u_int16_t val, size_t count) 491f9bac91bSBenno Rice { 492f9bac91bSBenno Rice volatile u_int16_t *d = __BA(tag, bsh, offset); 493f9bac91bSBenno Rice 494f9bac91bSBenno Rice while (count--) 495f9bac91bSBenno Rice *d = val; 496f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 497f9bac91bSBenno Rice } 498f9bac91bSBenno Rice 499f9bac91bSBenno Rice static __inline void 500f9bac91bSBenno Rice bus_space_set_multi_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 501f9bac91bSBenno Rice bus_size_t offset, u_int32_t val, size_t count) 502f9bac91bSBenno Rice { 503f9bac91bSBenno Rice volatile u_int32_t *d = __BA(tag, bsh, offset); 504f9bac91bSBenno Rice 505f9bac91bSBenno Rice while (count--) 506f9bac91bSBenno Rice *d = val; 507f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 508f9bac91bSBenno Rice } 509f9bac91bSBenno Rice 510f9bac91bSBenno Rice #if 0 511f9bac91bSBenno Rice #define bus_space_set_multi_stream_8 !!! unimplemented !!! 512f9bac91bSBenno Rice #endif 513f9bac91bSBenno Rice 514f9bac91bSBenno Rice /* 515f9bac91bSBenno Rice * void bus_space_set_region_N __P((bus_space_tag_t tag, 516f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val, 517f9bac91bSBenno Rice * size_t count)); 518f9bac91bSBenno Rice * 519f9bac91bSBenno Rice * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 520f9bac91bSBenno Rice * by tag/handle starting at `offset'. 521f9bac91bSBenno Rice */ 522f9bac91bSBenno Rice 523f9bac91bSBenno Rice static __inline void 524f9bac91bSBenno Rice bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 525f9bac91bSBenno Rice bus_size_t offset, u_int8_t val, size_t count) 526f9bac91bSBenno Rice { 527f9bac91bSBenno Rice volatile u_int8_t *d = __BA(tag, bsh, offset); 528f9bac91bSBenno Rice 529f9bac91bSBenno Rice while (count--) 530f9bac91bSBenno Rice *d++ = val; 531f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 532f9bac91bSBenno Rice } 533f9bac91bSBenno Rice 534f9bac91bSBenno Rice static __inline void 535f9bac91bSBenno Rice bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 536f9bac91bSBenno Rice bus_size_t offset, u_int16_t val, size_t count) 537f9bac91bSBenno Rice { 538f9bac91bSBenno Rice volatile u_int16_t *d = __BA(tag, bsh, offset); 539f9bac91bSBenno Rice 540f9bac91bSBenno Rice while (count--) 541f9bac91bSBenno Rice __asm __volatile("sthbrx %0, 0, %1" :: 542f9bac91bSBenno Rice "r"(val), "r"(d++)); 543f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 544f9bac91bSBenno Rice } 545f9bac91bSBenno Rice 546f9bac91bSBenno Rice static __inline void 547f9bac91bSBenno Rice bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 548f9bac91bSBenno Rice bus_size_t offset, u_int32_t val, size_t count) 549f9bac91bSBenno Rice { 550f9bac91bSBenno Rice volatile u_int32_t *d = __BA(tag, bsh, offset); 551f9bac91bSBenno Rice 552f9bac91bSBenno Rice while (count--) 553f9bac91bSBenno Rice __asm __volatile("stwbrx %0, 0, %1" :: 554f9bac91bSBenno Rice "r"(val), "r"(d++)); 555f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 556f9bac91bSBenno Rice } 557f9bac91bSBenno Rice 558f9bac91bSBenno Rice #if 0 559f9bac91bSBenno Rice #define bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!! 560f9bac91bSBenno Rice #endif 561f9bac91bSBenno Rice 562f9bac91bSBenno Rice static __inline void 563f9bac91bSBenno Rice bus_space_set_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh, 564f9bac91bSBenno Rice bus_size_t offset, u_int16_t val, size_t count) 565f9bac91bSBenno Rice { 566f9bac91bSBenno Rice volatile u_int16_t *d = __BA(tag, bsh, offset); 567f9bac91bSBenno Rice 568f9bac91bSBenno Rice while (count--) 569f9bac91bSBenno Rice *d++ = val; 570f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 571f9bac91bSBenno Rice } 572f9bac91bSBenno Rice 573f9bac91bSBenno Rice static __inline void 574f9bac91bSBenno Rice bus_space_set_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh, 575f9bac91bSBenno Rice bus_size_t offset, u_int32_t val, size_t count) 576f9bac91bSBenno Rice { 577f9bac91bSBenno Rice volatile u_int32_t *d = __BA(tag, bsh, offset); 578f9bac91bSBenno Rice 579f9bac91bSBenno Rice while (count--) 580f9bac91bSBenno Rice *d++ = val; 581f9bac91bSBenno Rice __asm __volatile("eieio; sync"); 582f9bac91bSBenno Rice } 583f9bac91bSBenno Rice 584f9bac91bSBenno Rice #if 0 585f9bac91bSBenno Rice #define bus_space_set_region_stream_8 !!! unimplemented !!! 586f9bac91bSBenno Rice #endif 587f9bac91bSBenno Rice 588f9bac91bSBenno Rice /* 589f9bac91bSBenno Rice * void bus_space_copy_region_N __P((bus_space_tag_t tag, 590f9bac91bSBenno Rice * bus_space_handle_t bsh1, bus_size_t off1, 591f9bac91bSBenno Rice * bus_space_handle_t bsh2, bus_size_t off2, 592f9bac91bSBenno Rice * size_t count)); 593f9bac91bSBenno Rice * 594f9bac91bSBenno Rice * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 595f9bac91bSBenno Rice * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 596f9bac91bSBenno Rice */ 597f9bac91bSBenno Rice 598f9bac91bSBenno Rice /* XXX IMPLEMENT bus_space_copy_N() XXX */ 599f9bac91bSBenno Rice 600f9bac91bSBenno Rice /* 601f9bac91bSBenno Rice * Bus read/write barrier methods. 602f9bac91bSBenno Rice * 603f9bac91bSBenno Rice * void bus_space_barrier __P((bus_space_tag_t tag, 604f9bac91bSBenno Rice * bus_space_handle_t bsh, bus_size_t offset, 605f9bac91bSBenno Rice * bus_size_t len, int flags)); 606f9bac91bSBenno Rice * 607f9bac91bSBenno Rice * Note: the macppc does not currently require barriers, but we must 608f9bac91bSBenno Rice * provide the flags to MI code. 609f9bac91bSBenno Rice */ 610f9bac91bSBenno Rice 611f9bac91bSBenno Rice #define bus_space_barrier(t, h, o, l, f) \ 612f9bac91bSBenno Rice ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 613f9bac91bSBenno Rice #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 614f9bac91bSBenno Rice #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 615f9bac91bSBenno Rice 616f9bac91bSBenno Rice #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 617f9bac91bSBenno Rice 618f9bac91bSBenno Rice /* 619f9bac91bSBenno Rice * Bus DMA methods. 620f9bac91bSBenno Rice */ 621f9bac91bSBenno Rice 622f9bac91bSBenno Rice /* 623f9bac91bSBenno Rice * Flags used in various bus DMA methods. 624f9bac91bSBenno Rice */ 625f9bac91bSBenno Rice #define BUS_DMA_WAITOK 0x00 /* safe to sleep (pseudo-flag) */ 626f9bac91bSBenno Rice #define BUS_DMA_NOWAIT 0x01 /* not safe to sleep */ 627f9bac91bSBenno Rice #define BUS_DMA_ALLOCNOW 0x02 /* perform resource allocation now */ 628f9bac91bSBenno Rice #define BUS_DMA_COHERENT 0x04 /* hint: map memory DMA coherent */ 629f9bac91bSBenno Rice #define BUS_DMA_BUS1 0x10 /* placeholders for bus functions... */ 630f9bac91bSBenno Rice #define BUS_DMA_BUS2 0x20 631f9bac91bSBenno Rice #define BUS_DMA_BUS3 0x40 632f9bac91bSBenno Rice #define BUS_DMA_BUS4 0x80 633f9bac91bSBenno Rice 634f9bac91bSBenno Rice /* Forwards needed by prototypes below. */ 635f9bac91bSBenno Rice struct mbuf; 636f9bac91bSBenno Rice struct uio; 637f9bac91bSBenno Rice 638f9bac91bSBenno Rice /* 639f9bac91bSBenno Rice * Operations performed by bus_dmamap_sync(). 640f9bac91bSBenno Rice */ 641f9bac91bSBenno Rice #define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */ 642f9bac91bSBenno Rice #define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */ 643f9bac91bSBenno Rice #define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */ 644f9bac91bSBenno Rice #define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */ 645f9bac91bSBenno Rice 646f9bac91bSBenno Rice typedef struct macppc_bus_dma_tag *bus_dma_tag_t; 647f9bac91bSBenno Rice typedef struct macppc_bus_dmamap *bus_dmamap_t; 648f9bac91bSBenno Rice 649f9bac91bSBenno Rice /* 650f9bac91bSBenno Rice * bus_dma_segment_t 651f9bac91bSBenno Rice * 652f9bac91bSBenno Rice * Describes a single contiguous DMA transaction. Values 653f9bac91bSBenno Rice * are suitable for programming into DMA registers. 654f9bac91bSBenno Rice */ 655f9bac91bSBenno Rice struct macppc_bus_dma_segment { 656f9bac91bSBenno Rice bus_addr_t ds_addr; /* DMA address */ 657f9bac91bSBenno Rice bus_size_t ds_len; /* length of transfer */ 658f9bac91bSBenno Rice }; 659f9bac91bSBenno Rice typedef struct macppc_bus_dma_segment bus_dma_segment_t; 660f9bac91bSBenno Rice 661f9bac91bSBenno Rice /* 662f9bac91bSBenno Rice * bus_dma_tag_t 663f9bac91bSBenno Rice * 664f9bac91bSBenno Rice * A machine-dependent opaque type describing the implementation of 665f9bac91bSBenno Rice * DMA for a given bus. 666f9bac91bSBenno Rice */ 667f9bac91bSBenno Rice 668f9bac91bSBenno Rice struct macppc_bus_dma_tag { 669f9bac91bSBenno Rice /* 670f9bac91bSBenno Rice * The `bounce threshold' is checked while we are loading 671f9bac91bSBenno Rice * the DMA map. If the physical address of the segment 672f9bac91bSBenno Rice * exceeds the threshold, an error will be returned. The 673f9bac91bSBenno Rice * caller can then take whatever action is necessary to 674f9bac91bSBenno Rice * bounce the transfer. If this value is 0, it will be 675f9bac91bSBenno Rice * ignored. 676f9bac91bSBenno Rice */ 677f9bac91bSBenno Rice bus_addr_t _bounce_thresh; 678f9bac91bSBenno Rice 679f9bac91bSBenno Rice /* 680f9bac91bSBenno Rice * DMA mapping methods. 681f9bac91bSBenno Rice */ 682f9bac91bSBenno Rice int (*_dmamap_create) __P((bus_dma_tag_t, bus_size_t, int, 683f9bac91bSBenno Rice bus_size_t, bus_size_t, int, bus_dmamap_t *)); 684f9bac91bSBenno Rice void (*_dmamap_destroy) __P((bus_dma_tag_t, bus_dmamap_t)); 685f9bac91bSBenno Rice int (*_dmamap_load) __P((bus_dma_tag_t, bus_dmamap_t, void *, 686f9bac91bSBenno Rice bus_size_t, struct proc *, int)); 687f9bac91bSBenno Rice int (*_dmamap_load_mbuf) __P((bus_dma_tag_t, bus_dmamap_t, 688f9bac91bSBenno Rice struct mbuf *, int)); 689f9bac91bSBenno Rice int (*_dmamap_load_uio) __P((bus_dma_tag_t, bus_dmamap_t, 690f9bac91bSBenno Rice struct uio *, int)); 691f9bac91bSBenno Rice int (*_dmamap_load_raw) __P((bus_dma_tag_t, bus_dmamap_t, 692f9bac91bSBenno Rice bus_dma_segment_t *, int, bus_size_t, int)); 693f9bac91bSBenno Rice void (*_dmamap_unload) __P((bus_dma_tag_t, bus_dmamap_t)); 694f9bac91bSBenno Rice void (*_dmamap_sync) __P((bus_dma_tag_t, bus_dmamap_t, 695f9bac91bSBenno Rice bus_addr_t, bus_size_t, int)); 696f9bac91bSBenno Rice 697f9bac91bSBenno Rice /* 698f9bac91bSBenno Rice * DMA memory utility functions. 699f9bac91bSBenno Rice */ 700f9bac91bSBenno Rice int (*_dmamem_alloc) __P((bus_dma_tag_t, bus_size_t, bus_size_t, 701f9bac91bSBenno Rice bus_size_t, bus_dma_segment_t *, int, int *, int)); 702f9bac91bSBenno Rice void (*_dmamem_free) __P((bus_dma_tag_t, 703f9bac91bSBenno Rice bus_dma_segment_t *, int)); 704f9bac91bSBenno Rice int (*_dmamem_map) __P((bus_dma_tag_t, bus_dma_segment_t *, 705f9bac91bSBenno Rice int, size_t, caddr_t *, int)); 706f9bac91bSBenno Rice void (*_dmamem_unmap) __P((bus_dma_tag_t, caddr_t, size_t)); 707f9bac91bSBenno Rice vm_offset_t (*_dmamem_mmap) __P((bus_dma_tag_t, bus_dma_segment_t *, 708f9bac91bSBenno Rice int, off_t, int, int)); 709f9bac91bSBenno Rice }; 710f9bac91bSBenno Rice 711f9bac91bSBenno Rice #define bus_dmamap_create(t, s, n, m, b, f, p) \ 712f9bac91bSBenno Rice (*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p)) 713f9bac91bSBenno Rice #define bus_dmamap_destroy(t, p) \ 714f9bac91bSBenno Rice (*(t)->_dmamap_destroy)((t), (p)) 715f9bac91bSBenno Rice #define bus_dmamap_load(t, m, b, s, p, f) \ 716f9bac91bSBenno Rice (*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f)) 717f9bac91bSBenno Rice #define bus_dmamap_load_mbuf(t, m, b, f) \ 718f9bac91bSBenno Rice (*(t)->_dmamap_load_mbuf)((t), (m), (b), (f)) 719f9bac91bSBenno Rice #define bus_dmamap_load_uio(t, m, u, f) \ 720f9bac91bSBenno Rice (*(t)->_dmamap_load_uio)((t), (m), (u), (f)) 721f9bac91bSBenno Rice #define bus_dmamap_load_raw(t, m, sg, n, s, f) \ 722f9bac91bSBenno Rice (*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f)) 723f9bac91bSBenno Rice #define bus_dmamap_unload(t, p) \ 724f9bac91bSBenno Rice (*(t)->_dmamap_unload)((t), (p)) 725f9bac91bSBenno Rice #define bus_dmamap_sync(t, p, o, l, ops) \ 726f9bac91bSBenno Rice (void)((t)->_dmamap_sync ? \ 727f9bac91bSBenno Rice (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0) 728f9bac91bSBenno Rice 729f9bac91bSBenno Rice #define bus_dmamem_alloc(t, s, a, b, sg, n, r, f) \ 730f9bac91bSBenno Rice (*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f)) 731f9bac91bSBenno Rice #define bus_dmamem_free(t, sg, n) \ 732f9bac91bSBenno Rice (*(t)->_dmamem_free)((t), (sg), (n)) 733f9bac91bSBenno Rice #define bus_dmamem_map(t, sg, n, s, k, f) \ 734f9bac91bSBenno Rice (*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f)) 735f9bac91bSBenno Rice #define bus_dmamem_unmap(t, k, s) \ 736f9bac91bSBenno Rice (*(t)->_dmamem_unmap)((t), (k), (s)) 737f9bac91bSBenno Rice #define bus_dmamem_mmap(t, sg, n, o, p, f) \ 738f9bac91bSBenno Rice (*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f)) 739f9bac91bSBenno Rice 740f9bac91bSBenno Rice /* 741f9bac91bSBenno Rice * bus_dmamap_t 742f9bac91bSBenno Rice * 743f9bac91bSBenno Rice * Describes a DMA mapping. 744f9bac91bSBenno Rice */ 745f9bac91bSBenno Rice struct macppc_bus_dmamap { 746f9bac91bSBenno Rice /* 747f9bac91bSBenno Rice * PRIVATE MEMBERS: not for use my machine-independent code. 748f9bac91bSBenno Rice */ 749f9bac91bSBenno Rice bus_size_t _dm_size; /* largest DMA transfer mappable */ 750f9bac91bSBenno Rice int _dm_segcnt; /* number of segs this map can map */ 751f9bac91bSBenno Rice bus_size_t _dm_maxsegsz; /* largest possible segment */ 752f9bac91bSBenno Rice bus_size_t _dm_boundary; /* don't cross this */ 753f9bac91bSBenno Rice bus_addr_t _dm_bounce_thresh; /* bounce threshold; see tag */ 754f9bac91bSBenno Rice int _dm_flags; /* misc. flags */ 755f9bac91bSBenno Rice 756f9bac91bSBenno Rice void *_dm_cookie; /* cookie for bus-specific functions */ 757f9bac91bSBenno Rice 758f9bac91bSBenno Rice /* 759f9bac91bSBenno Rice * PUBLIC MEMBERS: these are used by machine-independent code. 760f9bac91bSBenno Rice */ 761f9bac91bSBenno Rice bus_size_t dm_mapsize; /* size of the mapping */ 762f9bac91bSBenno Rice int dm_nsegs; /* # valid segments in mapping */ 763f9bac91bSBenno Rice bus_dma_segment_t dm_segs[1]; /* segments; variable length */ 764f9bac91bSBenno Rice }; 765f9bac91bSBenno Rice 766f9bac91bSBenno Rice #ifdef _MACPPC_BUS_DMA_PRIVATE 767f9bac91bSBenno Rice int _bus_dmamap_create __P((bus_dma_tag_t, bus_size_t, int, bus_size_t, 768f9bac91bSBenno Rice bus_size_t, int, bus_dmamap_t *)); 769f9bac91bSBenno Rice void _bus_dmamap_destroy __P((bus_dma_tag_t, bus_dmamap_t)); 770f9bac91bSBenno Rice int _bus_dmamap_load __P((bus_dma_tag_t, bus_dmamap_t, void *, 771f9bac91bSBenno Rice bus_size_t, struct proc *, int)); 772f9bac91bSBenno Rice int _bus_dmamap_load_mbuf __P((bus_dma_tag_t, bus_dmamap_t, 773f9bac91bSBenno Rice struct mbuf *, int)); 774f9bac91bSBenno Rice int _bus_dmamap_load_uio __P((bus_dma_tag_t, bus_dmamap_t, 775f9bac91bSBenno Rice struct uio *, int)); 776f9bac91bSBenno Rice int _bus_dmamap_load_raw __P((bus_dma_tag_t, bus_dmamap_t, 777f9bac91bSBenno Rice bus_dma_segment_t *, int, bus_size_t, int)); 778f9bac91bSBenno Rice void _bus_dmamap_unload __P((bus_dma_tag_t, bus_dmamap_t)); 779f9bac91bSBenno Rice void _bus_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t, 780f9bac91bSBenno Rice bus_size_t, int)); 781f9bac91bSBenno Rice 782f9bac91bSBenno Rice int _bus_dmamem_alloc __P((bus_dma_tag_t tag, bus_size_t size, 783f9bac91bSBenno Rice bus_size_t alignment, bus_size_t boundary, 784f9bac91bSBenno Rice bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags)); 785f9bac91bSBenno Rice void _bus_dmamem_free __P((bus_dma_tag_t tag, bus_dma_segment_t *segs, 786f9bac91bSBenno Rice int nsegs)); 787f9bac91bSBenno Rice int _bus_dmamem_map __P((bus_dma_tag_t tag, bus_dma_segment_t *segs, 788f9bac91bSBenno Rice int nsegs, size_t size, caddr_t *kvap, int flags)); 789f9bac91bSBenno Rice void _bus_dmamem_unmap __P((bus_dma_tag_t tag, caddr_t kva, 790f9bac91bSBenno Rice size_t size)); 791f9bac91bSBenno Rice vm_offset_t _bus_dmamem_mmap __P((bus_dma_tag_t tag, 792f9bac91bSBenno Rice bus_dma_segment_t *segs, 793f9bac91bSBenno Rice int nsegs, off_t off, int prot, int flags)); 794f9bac91bSBenno Rice 795f9bac91bSBenno Rice int _bus_dmamem_alloc_range __P((bus_dma_tag_t tag, bus_size_t size, 796f9bac91bSBenno Rice bus_size_t alignment, bus_size_t boundary, 797f9bac91bSBenno Rice bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags, 798f9bac91bSBenno Rice vm_offset_t low, vm_offset_t high)); 799f9bac91bSBenno Rice 800f9bac91bSBenno Rice #endif /* _MACPPC_BUS_DMA_PRIVATE */ 801f9bac91bSBenno Rice 802f9bac91bSBenno Rice #endif /* _MACPPC_BUS_H_ */ 803