1*fbae48b9Sperry /* $NetBSD: bus.h,v 1.7 2006/02/16 20:17:14 perry Exp $ */ 23f123214Stsutsui 33f123214Stsutsui /*- 43f123214Stsutsui * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 53f123214Stsutsui * All rights reserved. 63f123214Stsutsui * 73f123214Stsutsui * This code is derived from software contributed to The NetBSD Foundation 83f123214Stsutsui * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 93f123214Stsutsui * NASA Ames Research Center. 103f123214Stsutsui * 113f123214Stsutsui * Redistribution and use in source and binary forms, with or without 123f123214Stsutsui * modification, are permitted provided that the following conditions 133f123214Stsutsui * are met: 143f123214Stsutsui * 1. Redistributions of source code must retain the above copyright 153f123214Stsutsui * notice, this list of conditions and the following disclaimer. 163f123214Stsutsui * 2. Redistributions in binary form must reproduce the above copyright 173f123214Stsutsui * notice, this list of conditions and the following disclaimer in the 183f123214Stsutsui * documentation and/or other materials provided with the distribution. 193f123214Stsutsui * 3. All advertising materials mentioning features or use of this software 203f123214Stsutsui * must display the following acknowledgement: 213f123214Stsutsui * This product includes software developed by the NetBSD 223f123214Stsutsui * Foundation, Inc. and its contributors. 233f123214Stsutsui * 4. Neither the name of The NetBSD Foundation nor the names of its 243f123214Stsutsui * contributors may be used to endorse or promote products derived 253f123214Stsutsui * from this software without specific prior written permission. 263f123214Stsutsui * 273f123214Stsutsui * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 283f123214Stsutsui * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 293f123214Stsutsui * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 303f123214Stsutsui * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 313f123214Stsutsui * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 323f123214Stsutsui * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 333f123214Stsutsui * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 343f123214Stsutsui * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 353f123214Stsutsui * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 363f123214Stsutsui * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 373f123214Stsutsui * POSSIBILITY OF SUCH DAMAGE. 383f123214Stsutsui */ 393f123214Stsutsui 403f123214Stsutsui /* 413f123214Stsutsui * Copyright (C) 1997 Scott Reynolds. All rights reserved. 423f123214Stsutsui * 433f123214Stsutsui * Redistribution and use in source and binary forms, with or without 443f123214Stsutsui * modification, are permitted provided that the following conditions 453f123214Stsutsui * are met: 463f123214Stsutsui * 1. Redistributions of source code must retain the above copyright 473f123214Stsutsui * notice, this list of conditions and the following disclaimer. 483f123214Stsutsui * 2. Redistributions in binary form must reproduce the above copyright 493f123214Stsutsui * notice, this list of conditions and the following disclaimer in the 503f123214Stsutsui * documentation and/or other materials provided with the distribution. 513f123214Stsutsui * 3. The name of the author may not be used to endorse or promote products 523f123214Stsutsui * derived from this software without specific prior written permission 533f123214Stsutsui * 543f123214Stsutsui * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 553f123214Stsutsui * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 563f123214Stsutsui * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 573f123214Stsutsui * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 583f123214Stsutsui * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 593f123214Stsutsui * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 603f123214Stsutsui * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 613f123214Stsutsui * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 623f123214Stsutsui * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 633f123214Stsutsui * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 643f123214Stsutsui */ 653f123214Stsutsui 663f123214Stsutsui /* bus_space(9) functions for news68k. Just taken from hp300. */ 673f123214Stsutsui 683f123214Stsutsui #ifndef _NEWS68K_BUS_H_ 693f123214Stsutsui #define _NEWS68K_BUS_H_ 703f123214Stsutsui 713f123214Stsutsui /* 723f123214Stsutsui * Values for the news68k bus space tag, not to be used directly by MI code. 733f123214Stsutsui */ 743f123214Stsutsui #define NEWS68K_BUS_SPACE_INTIO 0 /* space is intio space */ 753f123214Stsutsui #define NEWS68K_BUS_SPACE_EIO 1 /* space is eio space */ 763f123214Stsutsui 773f123214Stsutsui /* 783f123214Stsutsui * Bus address and size types 793f123214Stsutsui */ 803f123214Stsutsui typedef u_long bus_addr_t; 813f123214Stsutsui typedef u_long bus_size_t; 823f123214Stsutsui 833f123214Stsutsui /* 843f123214Stsutsui * Access methods for bus resources and address space. 853f123214Stsutsui */ 863f123214Stsutsui typedef int bus_space_tag_t; 873f123214Stsutsui typedef u_long bus_space_handle_t; 883f123214Stsutsui 893f123214Stsutsui /* 902cac3aaeStsutsui * int bus_space_map(bus_space_tag_t t, bus_addr_t addr, 912cac3aaeStsutsui * bus_size_t size, int flags, bus_space_handle_t *bshp); 923f123214Stsutsui * 933f123214Stsutsui * Map a region of bus space. 943f123214Stsutsui */ 953f123214Stsutsui 963f123214Stsutsui #define BUS_SPACE_MAP_CACHEABLE 0x01 973f123214Stsutsui #define BUS_SPACE_MAP_LINEAR 0x02 983f123214Stsutsui #define BUS_SPACE_MAP_PREFETCHABLE 0x04 993f123214Stsutsui 1002cac3aaeStsutsui int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, 1012cac3aaeStsutsui int, bus_space_handle_t *); 1023f123214Stsutsui 1033f123214Stsutsui /* 1042cac3aaeStsutsui * void bus_space_unmap(bus_space_tag_t t, 1052cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t size); 1063f123214Stsutsui * 1073f123214Stsutsui * Unmap a region of bus space. 1083f123214Stsutsui */ 1093f123214Stsutsui 1102cac3aaeStsutsui void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); 1113f123214Stsutsui 1123f123214Stsutsui /* 1132cac3aaeStsutsui * int bus_space_subregion(bus_space_tag_t t, 1143f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size, 1152cac3aaeStsutsui * bus_space_handle_t *nbshp); 1163f123214Stsutsui * 1173f123214Stsutsui * Get a new handle for a subregion of an already-mapped area of bus space. 1183f123214Stsutsui */ 1193f123214Stsutsui 1202cac3aaeStsutsui int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, 1212cac3aaeStsutsui bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp); 1223f123214Stsutsui 1233f123214Stsutsui /* 1242cac3aaeStsutsui * int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart, 1253f123214Stsutsui * bus_addr_t rend, bus_size_t size, bus_size_t align, 1263f123214Stsutsui * bus_size_t boundary, int flags, bus_addr_t *addrp, 1272cac3aaeStsutsui * bus_space_handle_t *bshp); 1283f123214Stsutsui * 1293f123214Stsutsui * Allocate a region of bus space. 1303f123214Stsutsui */ 1313f123214Stsutsui 1322cac3aaeStsutsui int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, 1333f123214Stsutsui bus_addr_t rend, bus_size_t size, bus_size_t align, 1343f123214Stsutsui bus_size_t boundary, int cacheable, bus_addr_t *addrp, 1352cac3aaeStsutsui bus_space_handle_t *bshp); 1363f123214Stsutsui 1373f123214Stsutsui /* 1382cac3aaeStsutsui * int bus_space_free(bus_space_tag_t t, 1392cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t size); 1403f123214Stsutsui * 1413f123214Stsutsui * Free a region of bus space. 1423f123214Stsutsui */ 1433f123214Stsutsui 1442cac3aaeStsutsui void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, 1452cac3aaeStsutsui bus_size_t size); 1463f123214Stsutsui 1473f123214Stsutsui /* 1482cac3aaeStsutsui * int news68k_bus_space_probe(bus_space_tag_t t, 1492cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t offset, int sz); 1503f123214Stsutsui * 1513f123214Stsutsui * Probe the bus at t/bsh/offset, using sz as the size of the load. 1523f123214Stsutsui * 1533f123214Stsutsui * This is a machine-dependent extension, and is not to be used by 1543f123214Stsutsui * machine-independent code. 1553f123214Stsutsui */ 1563f123214Stsutsui 1572cac3aaeStsutsui int news68k_bus_space_probe(bus_space_tag_t t, 1582cac3aaeStsutsui bus_space_handle_t bsh, bus_size_t offset, int sz); 1593f123214Stsutsui 1603f123214Stsutsui /* 1613725e983Stsutsui * uintN_t bus_space_read_N(bus_space_tag_t tag, 1622cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t offset); 1633f123214Stsutsui * 1643f123214Stsutsui * Read a 1, 2, 4, or 8 byte quantity from bus space 1653f123214Stsutsui * described by tag/handle/offset. 1663f123214Stsutsui */ 1673f123214Stsutsui 1683f123214Stsutsui #define bus_space_read_1(t, h, o) \ 1693725e983Stsutsui ((void) t, (*(volatile uint8_t *)((h) + (o)))) 1703f123214Stsutsui 1713f123214Stsutsui #define bus_space_read_2(t, h, o) \ 1723725e983Stsutsui ((void) t, (*(volatile uint16_t *)((h) + (o)))) 1733f123214Stsutsui 1743f123214Stsutsui #define bus_space_read_4(t, h, o) \ 1753725e983Stsutsui ((void) t, (*(volatile uint32_t *)((h) + (o)))) 1763f123214Stsutsui 1773f123214Stsutsui #if 0 /* Cause a link error for bus_space_read_8 */ 1783f123214Stsutsui #define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!! 1793f123214Stsutsui #endif 1803f123214Stsutsui 1813f123214Stsutsui /* 1822cac3aaeStsutsui * void bus_space_read_multi_N(bus_space_tag_t tag, 1833f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 1843725e983Stsutsui * uintN_t *addr, size_t count); 1853f123214Stsutsui * 1863f123214Stsutsui * Read `count' 1, 2, 4, or 8 byte quantities from bus space 1873f123214Stsutsui * described by tag/handle/offset and copy into buffer provided. 1883f123214Stsutsui */ 1893f123214Stsutsui 1903f123214Stsutsui #define bus_space_read_multi_1(t, h, o, a, c) do { \ 1913f123214Stsutsui (void) t; \ 1925f1c88d7Sperry __asm volatile (" \ 1933f123214Stsutsui movl %0,%%a0 ; \ 1943f123214Stsutsui movl %1,%%a1 ; \ 1953f123214Stsutsui movl %2,%%d0 ; \ 1963f123214Stsutsui 1: movb %%a0@,%%a1@+ ; \ 1973f123214Stsutsui subql #1,%%d0 ; \ 1983f123214Stsutsui jne 1b" : \ 1993f123214Stsutsui : \ 2003f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 2013f123214Stsutsui "%a0","%a1","%d0"); \ 2023f123214Stsutsui } while (0) 2033f123214Stsutsui 2043f123214Stsutsui #define bus_space_read_multi_2(t, h, o, a, c) do { \ 2053f123214Stsutsui (void) t; \ 2065f1c88d7Sperry __asm volatile (" \ 2073f123214Stsutsui movl %0,%%a0 ; \ 2083f123214Stsutsui movl %1,%%a1 ; \ 2093f123214Stsutsui movl %2,%%d0 ; \ 2103f123214Stsutsui 1: movw %%a0@,%%a1@+ ; \ 2113f123214Stsutsui subql #1,%%d0 ; \ 2123f123214Stsutsui jne 1b" : \ 2133f123214Stsutsui : \ 2143f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 2153f123214Stsutsui "%a0","%a1","%d0"); \ 2163f123214Stsutsui } while (0) 2173f123214Stsutsui 2183f123214Stsutsui #define bus_space_read_multi_4(t, h, o, a, c) do { \ 2193f123214Stsutsui (void) t; \ 2205f1c88d7Sperry __asm volatile (" \ 2213f123214Stsutsui movl %0,%%a0 ; \ 2223f123214Stsutsui movl %1,%%a1 ; \ 2233f123214Stsutsui movl %2,%%d0 ; \ 2243f123214Stsutsui 1: movl %%a0@,%%a1@+ ; \ 2253f123214Stsutsui subql #1,%%d0 ; \ 2263f123214Stsutsui jne 1b" : \ 2273f123214Stsutsui : \ 2283f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 2293f123214Stsutsui "%a0","%a1","%d0"); \ 2303f123214Stsutsui } while (0) 2313f123214Stsutsui 2323f123214Stsutsui #if 0 /* Cause a link error for bus_space_read_multi_8 */ 2333f123214Stsutsui #define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! 2343f123214Stsutsui #endif 2353f123214Stsutsui 2363f123214Stsutsui /* 2372cac3aaeStsutsui * void bus_space_read_region_N(bus_space_tag_t tag, 2383f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 2393725e983Stsutsui * uintN_t *addr, size_t count); 2403f123214Stsutsui * 2413f123214Stsutsui * Read `count' 1, 2, 4, or 8 byte quantities from bus space 2423f123214Stsutsui * described by tag/handle and starting at `offset' and copy into 2433f123214Stsutsui * buffer provided. 2443f123214Stsutsui */ 2453f123214Stsutsui 2463f123214Stsutsui #define bus_space_read_region_1(t, h, o, a, c) do { \ 2473f123214Stsutsui (void) t; \ 2485f1c88d7Sperry __asm volatile (" \ 2493f123214Stsutsui movl %0,%%a0 ; \ 2503f123214Stsutsui movl %1,%%a1 ; \ 2513f123214Stsutsui movl %2,%%d0 ; \ 2523f123214Stsutsui 1: movb %%a0@+,%%a1@+ ; \ 2533f123214Stsutsui subql #1,%%d0 ; \ 2543f123214Stsutsui jne 1b" : \ 2553f123214Stsutsui : \ 2563f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 2573f123214Stsutsui "%a0","%a1","%d0"); \ 2583f123214Stsutsui } while (0) 2593f123214Stsutsui 2603f123214Stsutsui #define bus_space_read_region_2(t, h, o, a, c) do { \ 2613f123214Stsutsui (void) t; \ 2625f1c88d7Sperry __asm volatile (" \ 2633f123214Stsutsui movl %0,%%a0 ; \ 2643f123214Stsutsui movl %1,%%a1 ; \ 2653f123214Stsutsui movl %2,%%d0 ; \ 2663f123214Stsutsui 1: movw %%a0@+,%%a1@+ ; \ 2673f123214Stsutsui subql #1,%%d0 ; \ 2683f123214Stsutsui jne 1b" : \ 2693f123214Stsutsui : \ 2703f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 2713f123214Stsutsui "%a0","%a1","%d0"); \ 2723f123214Stsutsui } while (0) 2733f123214Stsutsui 2743f123214Stsutsui #define bus_space_read_region_4(t, h, o, a, c) do { \ 2753f123214Stsutsui (void) t; \ 2765f1c88d7Sperry __asm volatile (" \ 2773f123214Stsutsui movl %0,%%a0 ; \ 2783f123214Stsutsui movl %1,%%a1 ; \ 2793f123214Stsutsui movl %2,%%d0 ; \ 2803f123214Stsutsui 1: movl %%a0@+,%%a1@+ ; \ 2813f123214Stsutsui subql #1,%%d0 ; \ 2823f123214Stsutsui jne 1b" : \ 2833f123214Stsutsui : \ 2843f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 2853f123214Stsutsui "%a0","%a1","%d0"); \ 2863f123214Stsutsui } while (0) 2873f123214Stsutsui 2883f123214Stsutsui #if 0 /* Cause a link error for bus_space_read_region_8 */ 2893f123214Stsutsui #define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! 2903f123214Stsutsui #endif 2913f123214Stsutsui 2923f123214Stsutsui /* 2932cac3aaeStsutsui * void bus_space_write_N(bus_space_tag_t tag, 2943f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 2953725e983Stsutsui * uintN_t value); 2963f123214Stsutsui * 2973f123214Stsutsui * Write the 1, 2, 4, or 8 byte value `value' to bus space 2983f123214Stsutsui * described by tag/handle/offset. 2993f123214Stsutsui */ 3003f123214Stsutsui 3013f123214Stsutsui #define bus_space_write_1(t, h, o, v) \ 3023725e983Stsutsui ((void) t, ((void)(*(volatile uint8_t *)((h) + (o)) = (v)))) 3033f123214Stsutsui 3043f123214Stsutsui #define bus_space_write_2(t, h, o, v) \ 3053725e983Stsutsui ((void) t, ((void)(*(volatile uint16_t *)((h) + (o)) = (v)))) 3063f123214Stsutsui 3073f123214Stsutsui #define bus_space_write_4(t, h, o, v) \ 3083725e983Stsutsui ((void) t, ((void)(*(volatile uint32_t *)((h) + (o)) = (v)))) 3093f123214Stsutsui 3103f123214Stsutsui #if 0 /* Cause a link error for bus_space_write_8 */ 3113f123214Stsutsui #define bus_space_write_8 !!! bus_space_write_8 not implemented !!! 3123f123214Stsutsui #endif 3133f123214Stsutsui 3143f123214Stsutsui /* 3152cac3aaeStsutsui * void bus_space_write_multi_N(bus_space_tag_t tag, 3163f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 3173725e983Stsutsui * const uintN_t *addr, size_t count); 3183f123214Stsutsui * 3193f123214Stsutsui * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 3203f123214Stsutsui * provided to bus space described by tag/handle/offset. 3213f123214Stsutsui */ 3223f123214Stsutsui 3233f123214Stsutsui #define bus_space_write_multi_1(t, h, o, a, c) do { \ 3243f123214Stsutsui (void) t; \ 3255f1c88d7Sperry __asm volatile (" \ 3263f123214Stsutsui movl %0,%%a0 ; \ 3273f123214Stsutsui movl %1,%%a1 ; \ 3283f123214Stsutsui movl %2,%%d0 ; \ 3293f123214Stsutsui 1: movb %%a1@+,%%a0@ ; \ 3303f123214Stsutsui subql #1,%%d0 ; \ 3313f123214Stsutsui jne 1b" : \ 3323f123214Stsutsui : \ 3333f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 3343f123214Stsutsui "%a0","%a1","%d0"); \ 3353f123214Stsutsui } while (0) 3363f123214Stsutsui 3373f123214Stsutsui #define bus_space_write_multi_2(t, h, o, a, c) do { \ 3383f123214Stsutsui (void) t; \ 3395f1c88d7Sperry __asm volatile (" \ 3403f123214Stsutsui movl %0,%%a0 ; \ 3413f123214Stsutsui movl %1,%%a1 ; \ 3423f123214Stsutsui movl %2,%%d0 ; \ 3433f123214Stsutsui 1: movw %%a1@+,%%a0@ ; \ 3443f123214Stsutsui subql #1,%%d0 ; \ 3453f123214Stsutsui jne 1b" : \ 3463f123214Stsutsui : \ 3473f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 3483f123214Stsutsui "%a0","%a1","%d0"); \ 3493f123214Stsutsui } while (0) 3503f123214Stsutsui 3513f123214Stsutsui #define bus_space_write_multi_4(t, h, o, a, c) do { \ 3523f123214Stsutsui (void) t; \ 3535f1c88d7Sperry __asm volatile (" \ 3543f123214Stsutsui movl %0,%%a0 ; \ 3553f123214Stsutsui movl %1,%%a1 ; \ 3563f123214Stsutsui movl %2,%%d0 ; \ 3573f123214Stsutsui 1: movl %%a1@+,%%a0@ ; \ 3583f123214Stsutsui subql #1,%%d0 ; \ 3593f123214Stsutsui jne 1b" : \ 3603f123214Stsutsui : \ 3613f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 3623f123214Stsutsui "%a0","%a1","%d0"); \ 3633f123214Stsutsui } while (0) 3643f123214Stsutsui 3653f123214Stsutsui #if 0 /* Cause a link error for bus_space_write_8 */ 3663f123214Stsutsui #define bus_space_write_multi_8(t, h, o, a, c) \ 3673f123214Stsutsui !!! bus_space_write_multi_8 unimplimented !!! 3683f123214Stsutsui #endif 3693f123214Stsutsui 3703f123214Stsutsui /* 3712cac3aaeStsutsui * void bus_space_write_region_N(bus_space_tag_t tag, 3723f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 3733725e983Stsutsui * const uintN_t *addr, size_t count); 3743f123214Stsutsui * 3753f123214Stsutsui * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 3763f123214Stsutsui * to bus space described by tag/handle starting at `offset'. 3773f123214Stsutsui */ 3783f123214Stsutsui 3793f123214Stsutsui #define bus_space_write_region_1(t, h, o, a, c) do { \ 3803f123214Stsutsui (void) t; \ 3815f1c88d7Sperry __asm volatile (" \ 3823f123214Stsutsui movl %0,%%a0 ; \ 3833f123214Stsutsui movl %1,%%a1 ; \ 3843f123214Stsutsui movl %2,%%d0 ; \ 3853f123214Stsutsui 1: movb %%a1@+,%%a0@+ ; \ 3863f123214Stsutsui subql #1,%%d0 ; \ 3873f123214Stsutsui jne 1b" : \ 3883f123214Stsutsui : \ 3893f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 3903f123214Stsutsui "%a0","%a1","%d0"); \ 3913f123214Stsutsui } while (0) 3923f123214Stsutsui 3933f123214Stsutsui #define bus_space_write_region_2(t, h, o, a, c) do { \ 3943f123214Stsutsui (void) t; \ 3955f1c88d7Sperry __asm volatile (" \ 3963f123214Stsutsui movl %0,%%a0 ; \ 3973f123214Stsutsui movl %1,%%a1 ; \ 3983f123214Stsutsui movl %2,%%d0 ; \ 3993f123214Stsutsui 1: movw %%a1@+,%%a0@+ ; \ 4003f123214Stsutsui subql #1,%%d0 ; \ 4013f123214Stsutsui jne 1b" : \ 4023f123214Stsutsui : \ 4033f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 4043f123214Stsutsui "%a0","%a1","%d0"); \ 4053f123214Stsutsui } while (0) 4063f123214Stsutsui 4073f123214Stsutsui #define bus_space_write_region_4(t, h, o, a, c) do { \ 4083f123214Stsutsui (void) t; \ 4095f1c88d7Sperry __asm volatile (" \ 4103f123214Stsutsui movl %0,%%a0 ; \ 4113f123214Stsutsui movl %1,%%a1 ; \ 4123f123214Stsutsui movl %2,%%d0 ; \ 4133f123214Stsutsui 1: movl %%a1@+,%%a0@+ ; \ 4143f123214Stsutsui subql #1,%%d0 ; \ 4153f123214Stsutsui jne 1b" : \ 4163f123214Stsutsui : \ 4173f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 4183f123214Stsutsui "%a0","%a1","%d0"); \ 4193f123214Stsutsui } while (0) 4203f123214Stsutsui 4213f123214Stsutsui #if 0 /* Cause a link error for bus_space_write_region_8 */ 4223f123214Stsutsui #define bus_space_write_region_8 \ 4233f123214Stsutsui !!! bus_space_write_region_8 unimplemented !!! 4243f123214Stsutsui #endif 4253f123214Stsutsui 4263f123214Stsutsui /* 4272cac3aaeStsutsui * void bus_space_set_multi_N(bus_space_tag_t tag, 4283725e983Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 4292cac3aaeStsutsui * size_t count); 4303f123214Stsutsui * 4313f123214Stsutsui * Write the 1, 2, 4, or 8 byte value `val' to bus space described 4323f123214Stsutsui * by tag/handle/offset `count' times. 4333f123214Stsutsui */ 4343f123214Stsutsui 4353f123214Stsutsui #define bus_space_set_multi_1(t, h, o, val, c) do { \ 4363f123214Stsutsui (void) t; \ 4375f1c88d7Sperry __asm volatile (" \ 4383f123214Stsutsui movl %0,%%a0 ; \ 4393f123214Stsutsui movl %1,%%d1 ; \ 4403f123214Stsutsui movl %2,%%d0 ; \ 4413f123214Stsutsui 1: movb %%d1,%%a0@ ; \ 4423f123214Stsutsui subql #1,%%d0 ; \ 4433f123214Stsutsui jne 1b" : \ 4443f123214Stsutsui : \ 4453f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 4463f123214Stsutsui "%a0","%d0","%d1"); \ 4473f123214Stsutsui } while (0) 4483f123214Stsutsui 4493f123214Stsutsui #define bus_space_set_multi_2(t, h, o, val, c) do { \ 4503f123214Stsutsui (void) t; \ 4515f1c88d7Sperry __asm volatile (" \ 4523f123214Stsutsui movl %0,%%a0 ; \ 4533f123214Stsutsui movl %1,%%d1 ; \ 4543f123214Stsutsui movl %2,%%d0 ; \ 4553f123214Stsutsui 1: movw %%d1,%%a0@ ; \ 4563f123214Stsutsui subql #1,%%d0 ; \ 4573f123214Stsutsui jne 1b" : \ 4583f123214Stsutsui : \ 4593f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 4603f123214Stsutsui "%a0","%d0","%d1"); \ 4613f123214Stsutsui } while (0) 4623f123214Stsutsui 4633f123214Stsutsui #define bus_space_set_multi_4(t, h, o, val, c) do { \ 4643f123214Stsutsui (void) t; \ 4655f1c88d7Sperry __asm volatile (" \ 4663f123214Stsutsui movl %0,%%a0 ; \ 4673f123214Stsutsui movl %1,%%d1 ; \ 4683f123214Stsutsui movl %2,%%d0 ; \ 4693f123214Stsutsui 1: movl %%d1,%%a0@ ; \ 4703f123214Stsutsui subql #1,%%d0 ; \ 4713f123214Stsutsui jne 1b" : \ 4723f123214Stsutsui : \ 4733f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 4743f123214Stsutsui "%a0","%d0","%d1"); \ 4753f123214Stsutsui } while (0) 4763f123214Stsutsui 4773f123214Stsutsui #if 0 /* Cause a link error for bus_space_set_multi_8 */ 4783f123214Stsutsui #define bus_space_set_multi_8 \ 4793f123214Stsutsui !!! bus_space_set_multi_8 unimplemented !!! 4803f123214Stsutsui #endif 4813f123214Stsutsui 4823f123214Stsutsui /* 4832cac3aaeStsutsui * void bus_space_set_region_N(bus_space_tag_t tag, 4843725e983Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 4852cac3aaeStsutsui * size_t count); 4863f123214Stsutsui * 4873f123214Stsutsui * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 4883f123214Stsutsui * by tag/handle starting at `offset'. 4893f123214Stsutsui */ 4903f123214Stsutsui 4913f123214Stsutsui #define bus_space_set_region_1(t, h, o, val, c) do { \ 4923f123214Stsutsui (void) t; \ 4935f1c88d7Sperry __asm volatile (" \ 4943f123214Stsutsui movl %0,%%a0 ; \ 4953f123214Stsutsui movl %1,%%d1 ; \ 4963f123214Stsutsui movl %2,%%d0 ; \ 4973f123214Stsutsui 1: movb %%d1,%%a0@+ ; \ 4983f123214Stsutsui subql #1,%%d0 ; \ 4993f123214Stsutsui jne 1b" : \ 5003f123214Stsutsui : \ 5013f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 5023f123214Stsutsui "%a0","%d0","%d1"); \ 5033f123214Stsutsui } while (0) 5043f123214Stsutsui 5053f123214Stsutsui #define bus_space_set_region_2(t, h, o, val, c) do { \ 5063f123214Stsutsui (void) t; \ 5075f1c88d7Sperry __asm volatile (" \ 5083f123214Stsutsui movl %0,%%a0 ; \ 5093f123214Stsutsui movl %1,%%d1 ; \ 5103f123214Stsutsui movl %2,%%d0 ; \ 5113f123214Stsutsui 1: movw %%d1,%%a0@+ ; \ 5123f123214Stsutsui subql #1,%%d0 ; \ 5133f123214Stsutsui jne 1b" : \ 5143f123214Stsutsui : \ 5153f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 5163f123214Stsutsui "%a0","%d0","%d1"); \ 5173f123214Stsutsui } while (0) 5183f123214Stsutsui 5193f123214Stsutsui #define bus_space_set_region_4(t, h, o, val, c) do { \ 5203f123214Stsutsui (void) t; \ 5215f1c88d7Sperry __asm volatile (" \ 5223f123214Stsutsui movl %0,%%a0 ; \ 5233f123214Stsutsui movl %1,%%d1 ; \ 5243f123214Stsutsui movl %2,%%d0 ; \ 5253f123214Stsutsui 1: movl %%d1,%%a0@+ ; \ 5263f123214Stsutsui subql #1,%%d0 ; \ 5273f123214Stsutsui jne 1b" : \ 5283f123214Stsutsui : \ 5293f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 5303f123214Stsutsui "%a0","%d0","%d1"); \ 5313f123214Stsutsui } while (0) 5323f123214Stsutsui 5333f123214Stsutsui #if 0 /* Cause a link error for bus_space_set_region_8 */ 5343f123214Stsutsui #define bus_space_set_region_8 \ 5353f123214Stsutsui !!! bus_space_set_region_8 unimplemented !!! 5363f123214Stsutsui #endif 5373f123214Stsutsui 5383f123214Stsutsui /* 5392cac3aaeStsutsui * void bus_space_copy_region_N(bus_space_tag_t tag, 5403f123214Stsutsui * bus_space_handle_t bsh1, bus_size_t off1, 5413f123214Stsutsui * bus_space_handle_t bsh2, bus_size_t off2, 5422cac3aaeStsutsui * bus_size_t count); 5433f123214Stsutsui * 5443f123214Stsutsui * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 5453f123214Stsutsui * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 5463f123214Stsutsui */ 5473f123214Stsutsui 5483f123214Stsutsui #define __NEWS68K_copy_region_N(BYTES) \ 549*fbae48b9Sperry static __inline void __CONCAT(bus_space_copy_region_,BYTES) \ 5502cac3aaeStsutsui (bus_space_tag_t, \ 5513f123214Stsutsui bus_space_handle_t bsh1, bus_size_t off1, \ 5523f123214Stsutsui bus_space_handle_t bsh2, bus_size_t off2, \ 5532cac3aaeStsutsui bus_size_t count); \ 5543f123214Stsutsui \ 555*fbae48b9Sperry static __inline void \ 55652b46dcfStsutsui __CONCAT(bus_space_copy_region_,BYTES)(bus_space_tag_t t, \ 55752b46dcfStsutsui bus_space_handle_t h1, bus_space_handle_t h2, \ 55852b46dcfStsutsui bus_size_t o1, bus_size_t o2, bus_size_t c) \ 5593f123214Stsutsui { \ 5603f123214Stsutsui bus_size_t o; \ 5613f123214Stsutsui \ 5623f123214Stsutsui if ((h1 + o1) >= (h2 + o2)) { \ 5633f123214Stsutsui /* src after dest: copy forward */ \ 5643f123214Stsutsui for (o = 0; c != 0; c--, o += BYTES) \ 5653f123214Stsutsui __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 5663f123214Stsutsui __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 5673f123214Stsutsui } else { \ 5683f123214Stsutsui /* dest after src: copy backwards */ \ 5693f123214Stsutsui for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \ 5703f123214Stsutsui __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 5713f123214Stsutsui __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 5723f123214Stsutsui } \ 5733f123214Stsutsui } 5743f123214Stsutsui __NEWS68K_copy_region_N(1) 5753f123214Stsutsui __NEWS68K_copy_region_N(2) 5763f123214Stsutsui __NEWS68K_copy_region_N(4) 5773f123214Stsutsui #if 0 /* Cause a link error for bus_space_copy_region_8 */ 5783f123214Stsutsui #define bus_space_copy_region_8 \ 5793f123214Stsutsui !!! bus_space_copy_region_8 unimplemented !!! 5803f123214Stsutsui #endif 5813f123214Stsutsui 5823f123214Stsutsui #undef __NEWS68K_copy_region_N 5833f123214Stsutsui 5843f123214Stsutsui /* 5853f123214Stsutsui * Bus read/write barrier methods. 5863f123214Stsutsui * 5872cac3aaeStsutsui * void bus_space_barrier(bus_space_tag_t tag, 5883f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 5892cac3aaeStsutsui * bus_size_t len, int flags); 5903f123214Stsutsui * 5913f123214Stsutsui * Note: the 680x0 does not currently require barriers, but we must 5923f123214Stsutsui * provide the flags to MI code. 5933f123214Stsutsui */ 5943f123214Stsutsui #define bus_space_barrier(t, h, o, l, f) \ 5953f123214Stsutsui ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 5963f123214Stsutsui #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 5973f123214Stsutsui #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 5983f123214Stsutsui 5993f123214Stsutsui #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 6003f123214Stsutsui 6013f123214Stsutsui #endif /* _NEWS68K_BUS_H_ */ 602