1*fbe896c5Stsutsui /* $NetBSD: bus.h,v 1.13 2023/01/27 19:50:02 tsutsui 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 * 203f123214Stsutsui * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 213f123214Stsutsui * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 223f123214Stsutsui * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 233f123214Stsutsui * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 243f123214Stsutsui * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 253f123214Stsutsui * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 263f123214Stsutsui * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 273f123214Stsutsui * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 283f123214Stsutsui * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 293f123214Stsutsui * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 303f123214Stsutsui * POSSIBILITY OF SUCH DAMAGE. 313f123214Stsutsui */ 323f123214Stsutsui 333f123214Stsutsui /* 343f123214Stsutsui * Copyright (C) 1997 Scott Reynolds. All rights reserved. 353f123214Stsutsui * 363f123214Stsutsui * Redistribution and use in source and binary forms, with or without 373f123214Stsutsui * modification, are permitted provided that the following conditions 383f123214Stsutsui * are met: 393f123214Stsutsui * 1. Redistributions of source code must retain the above copyright 403f123214Stsutsui * notice, this list of conditions and the following disclaimer. 413f123214Stsutsui * 2. Redistributions in binary form must reproduce the above copyright 423f123214Stsutsui * notice, this list of conditions and the following disclaimer in the 433f123214Stsutsui * documentation and/or other materials provided with the distribution. 443f123214Stsutsui * 3. The name of the author may not be used to endorse or promote products 453f123214Stsutsui * derived from this software without specific prior written permission 463f123214Stsutsui * 473f123214Stsutsui * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 483f123214Stsutsui * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 493f123214Stsutsui * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 503f123214Stsutsui * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 513f123214Stsutsui * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 523f123214Stsutsui * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 533f123214Stsutsui * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 543f123214Stsutsui * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 553f123214Stsutsui * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 563f123214Stsutsui * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 573f123214Stsutsui */ 583f123214Stsutsui 593f123214Stsutsui /* bus_space(9) functions for news68k. Just taken from hp300. */ 603f123214Stsutsui 613f123214Stsutsui #ifndef _NEWS68K_BUS_H_ 623f123214Stsutsui #define _NEWS68K_BUS_H_ 633f123214Stsutsui 643f123214Stsutsui /* 653f123214Stsutsui * Values for the news68k bus space tag, not to be used directly by MI code. 663f123214Stsutsui */ 673f123214Stsutsui #define NEWS68K_BUS_SPACE_INTIO 0 /* space is intio space */ 683f123214Stsutsui #define NEWS68K_BUS_SPACE_EIO 1 /* space is eio space */ 693f123214Stsutsui 703f123214Stsutsui /* 713f123214Stsutsui * Bus address and size types 723f123214Stsutsui */ 733f123214Stsutsui typedef u_long bus_addr_t; 743f123214Stsutsui typedef u_long bus_size_t; 753f123214Stsutsui 76bf158e33Sskrll #define PRIxBUSADDR "lx" 77bf158e33Sskrll #define PRIxBUSSIZE "lx" 78bf158e33Sskrll #define PRIuBUSSIZE "lu" 79bf158e33Sskrll 803f123214Stsutsui /* 813f123214Stsutsui * Access methods for bus resources and address space. 823f123214Stsutsui */ 833f123214Stsutsui typedef int bus_space_tag_t; 843f123214Stsutsui typedef u_long bus_space_handle_t; 853f123214Stsutsui 86bf158e33Sskrll #define PRIxBSH "lx" 87bf158e33Sskrll 883f123214Stsutsui /* 892cac3aaeStsutsui * int bus_space_map(bus_space_tag_t t, bus_addr_t addr, 902cac3aaeStsutsui * bus_size_t size, int flags, bus_space_handle_t *bshp); 913f123214Stsutsui * 923f123214Stsutsui * Map a region of bus space. 933f123214Stsutsui */ 943f123214Stsutsui 953f123214Stsutsui #define BUS_SPACE_MAP_CACHEABLE 0x01 963f123214Stsutsui #define BUS_SPACE_MAP_LINEAR 0x02 973f123214Stsutsui #define BUS_SPACE_MAP_PREFETCHABLE 0x04 983f123214Stsutsui 992cac3aaeStsutsui int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, 1002cac3aaeStsutsui int, bus_space_handle_t *); 1013f123214Stsutsui 1023f123214Stsutsui /* 1032cac3aaeStsutsui * void bus_space_unmap(bus_space_tag_t t, 1042cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t size); 1053f123214Stsutsui * 1063f123214Stsutsui * Unmap a region of bus space. 1073f123214Stsutsui */ 1083f123214Stsutsui 1092cac3aaeStsutsui void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); 1103f123214Stsutsui 1113f123214Stsutsui /* 1122cac3aaeStsutsui * int bus_space_subregion(bus_space_tag_t t, 1133f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size, 1142cac3aaeStsutsui * bus_space_handle_t *nbshp); 1153f123214Stsutsui * 1163f123214Stsutsui * Get a new handle for a subregion of an already-mapped area of bus space. 1173f123214Stsutsui */ 1183f123214Stsutsui 1192cac3aaeStsutsui int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, 1202cac3aaeStsutsui bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp); 1213f123214Stsutsui 1223f123214Stsutsui /* 1232cac3aaeStsutsui * int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart, 1243f123214Stsutsui * bus_addr_t rend, bus_size_t size, bus_size_t align, 1253f123214Stsutsui * bus_size_t boundary, int flags, bus_addr_t *addrp, 1262cac3aaeStsutsui * bus_space_handle_t *bshp); 1273f123214Stsutsui * 1283f123214Stsutsui * Allocate a region of bus space. 1293f123214Stsutsui */ 1303f123214Stsutsui 1312cac3aaeStsutsui int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, 1323f123214Stsutsui bus_addr_t rend, bus_size_t size, bus_size_t align, 1333f123214Stsutsui bus_size_t boundary, int cacheable, bus_addr_t *addrp, 1342cac3aaeStsutsui bus_space_handle_t *bshp); 1353f123214Stsutsui 1363f123214Stsutsui /* 1372cac3aaeStsutsui * int bus_space_free(bus_space_tag_t t, 1382cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t size); 1393f123214Stsutsui * 1403f123214Stsutsui * Free a region of bus space. 1413f123214Stsutsui */ 1423f123214Stsutsui 1432cac3aaeStsutsui void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, 1442cac3aaeStsutsui bus_size_t size); 1453f123214Stsutsui 1463f123214Stsutsui /* 1472cac3aaeStsutsui * int news68k_bus_space_probe(bus_space_tag_t t, 1482cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t offset, int sz); 1493f123214Stsutsui * 1503f123214Stsutsui * Probe the bus at t/bsh/offset, using sz as the size of the load. 1513f123214Stsutsui * 1523f123214Stsutsui * This is a machine-dependent extension, and is not to be used by 1533f123214Stsutsui * machine-independent code. 1543f123214Stsutsui */ 1553f123214Stsutsui 1562cac3aaeStsutsui int news68k_bus_space_probe(bus_space_tag_t t, 1572cac3aaeStsutsui bus_space_handle_t bsh, bus_size_t offset, int sz); 1583f123214Stsutsui 1593f123214Stsutsui /* 1603725e983Stsutsui * uintN_t bus_space_read_N(bus_space_tag_t tag, 1612cac3aaeStsutsui * bus_space_handle_t bsh, bus_size_t offset); 1623f123214Stsutsui * 1633f123214Stsutsui * Read a 1, 2, 4, or 8 byte quantity from bus space 1643f123214Stsutsui * described by tag/handle/offset. 1653f123214Stsutsui */ 1663f123214Stsutsui 1673f123214Stsutsui #define bus_space_read_1(t, h, o) \ 1683725e983Stsutsui ((void) t, (*(volatile uint8_t *)((h) + (o)))) 1693f123214Stsutsui 1703f123214Stsutsui #define bus_space_read_2(t, h, o) \ 1713725e983Stsutsui ((void) t, (*(volatile uint16_t *)((h) + (o)))) 1723f123214Stsutsui 1733f123214Stsutsui #define bus_space_read_4(t, h, o) \ 1743725e983Stsutsui ((void) t, (*(volatile uint32_t *)((h) + (o)))) 1753f123214Stsutsui 1763f123214Stsutsui /* 1772cac3aaeStsutsui * void bus_space_read_multi_N(bus_space_tag_t tag, 1783f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 1793725e983Stsutsui * uintN_t *addr, size_t count); 1803f123214Stsutsui * 1813f123214Stsutsui * Read `count' 1, 2, 4, or 8 byte quantities from bus space 1823f123214Stsutsui * described by tag/handle/offset and copy into buffer provided. 1833f123214Stsutsui */ 1843f123214Stsutsui 1853f123214Stsutsui #define bus_space_read_multi_1(t, h, o, a, c) do { \ 1863f123214Stsutsui (void) t; \ 1875f1c88d7Sperry __asm volatile (" \ 1883f123214Stsutsui movl %0,%%a0 ; \ 1893f123214Stsutsui movl %1,%%a1 ; \ 1903f123214Stsutsui movl %2,%%d0 ; \ 1913f123214Stsutsui 1: movb %%a0@,%%a1@+ ; \ 1923f123214Stsutsui subql #1,%%d0 ; \ 1933f123214Stsutsui jne 1b" : \ 1943f123214Stsutsui : \ 1953f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 196*fbe896c5Stsutsui "a0","a1","d0","memory"); \ 1973f123214Stsutsui } while (0) 1983f123214Stsutsui 1993f123214Stsutsui #define bus_space_read_multi_2(t, h, o, a, c) do { \ 2003f123214Stsutsui (void) t; \ 2015f1c88d7Sperry __asm volatile (" \ 2023f123214Stsutsui movl %0,%%a0 ; \ 2033f123214Stsutsui movl %1,%%a1 ; \ 2043f123214Stsutsui movl %2,%%d0 ; \ 2053f123214Stsutsui 1: movw %%a0@,%%a1@+ ; \ 2063f123214Stsutsui subql #1,%%d0 ; \ 2073f123214Stsutsui jne 1b" : \ 2083f123214Stsutsui : \ 2093f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 210*fbe896c5Stsutsui "a0","a1","d0","memory"); \ 2113f123214Stsutsui } while (0) 2123f123214Stsutsui 2133f123214Stsutsui #define bus_space_read_multi_4(t, h, o, a, c) do { \ 2143f123214Stsutsui (void) t; \ 2155f1c88d7Sperry __asm volatile (" \ 2163f123214Stsutsui movl %0,%%a0 ; \ 2173f123214Stsutsui movl %1,%%a1 ; \ 2183f123214Stsutsui movl %2,%%d0 ; \ 2193f123214Stsutsui 1: movl %%a0@,%%a1@+ ; \ 2203f123214Stsutsui subql #1,%%d0 ; \ 2213f123214Stsutsui jne 1b" : \ 2223f123214Stsutsui : \ 2233f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 224*fbe896c5Stsutsui "a0","a1","d0","memory"); \ 2253f123214Stsutsui } while (0) 2263f123214Stsutsui 2273f123214Stsutsui /* 2282cac3aaeStsutsui * void bus_space_read_region_N(bus_space_tag_t tag, 2293f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 2303725e983Stsutsui * uintN_t *addr, size_t count); 2313f123214Stsutsui * 2323f123214Stsutsui * Read `count' 1, 2, 4, or 8 byte quantities from bus space 2333f123214Stsutsui * described by tag/handle and starting at `offset' and copy into 2343f123214Stsutsui * buffer provided. 2353f123214Stsutsui */ 2363f123214Stsutsui 2373f123214Stsutsui #define bus_space_read_region_1(t, h, o, a, c) do { \ 2383f123214Stsutsui (void) t; \ 2395f1c88d7Sperry __asm volatile (" \ 2403f123214Stsutsui movl %0,%%a0 ; \ 2413f123214Stsutsui movl %1,%%a1 ; \ 2423f123214Stsutsui movl %2,%%d0 ; \ 2433f123214Stsutsui 1: movb %%a0@+,%%a1@+ ; \ 2443f123214Stsutsui subql #1,%%d0 ; \ 2453f123214Stsutsui jne 1b" : \ 2463f123214Stsutsui : \ 2473f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 248*fbe896c5Stsutsui "a0","a1","d0","memory"); \ 2493f123214Stsutsui } while (0) 2503f123214Stsutsui 2513f123214Stsutsui #define bus_space_read_region_2(t, h, o, a, c) do { \ 2523f123214Stsutsui (void) t; \ 2535f1c88d7Sperry __asm volatile (" \ 2543f123214Stsutsui movl %0,%%a0 ; \ 2553f123214Stsutsui movl %1,%%a1 ; \ 2563f123214Stsutsui movl %2,%%d0 ; \ 2573f123214Stsutsui 1: movw %%a0@+,%%a1@+ ; \ 2583f123214Stsutsui subql #1,%%d0 ; \ 2593f123214Stsutsui jne 1b" : \ 2603f123214Stsutsui : \ 2613f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 262*fbe896c5Stsutsui "a0","a1","d0","memory"); \ 2633f123214Stsutsui } while (0) 2643f123214Stsutsui 2653f123214Stsutsui #define bus_space_read_region_4(t, h, o, a, c) do { \ 2663f123214Stsutsui (void) t; \ 2675f1c88d7Sperry __asm volatile (" \ 2683f123214Stsutsui movl %0,%%a0 ; \ 2693f123214Stsutsui movl %1,%%a1 ; \ 2703f123214Stsutsui movl %2,%%d0 ; \ 2713f123214Stsutsui 1: movl %%a0@+,%%a1@+ ; \ 2723f123214Stsutsui subql #1,%%d0 ; \ 2733f123214Stsutsui jne 1b" : \ 2743f123214Stsutsui : \ 2753f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 276*fbe896c5Stsutsui "a0","a1","d0","memory"); \ 2773f123214Stsutsui } while (0) 2783f123214Stsutsui 2793f123214Stsutsui /* 2802cac3aaeStsutsui * void bus_space_write_N(bus_space_tag_t tag, 2813f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 2823725e983Stsutsui * uintN_t value); 2833f123214Stsutsui * 2843f123214Stsutsui * Write the 1, 2, 4, or 8 byte value `value' to bus space 2853f123214Stsutsui * described by tag/handle/offset. 2863f123214Stsutsui */ 2873f123214Stsutsui 2883f123214Stsutsui #define bus_space_write_1(t, h, o, v) \ 2893725e983Stsutsui ((void) t, ((void)(*(volatile uint8_t *)((h) + (o)) = (v)))) 2903f123214Stsutsui 2913f123214Stsutsui #define bus_space_write_2(t, h, o, v) \ 2923725e983Stsutsui ((void) t, ((void)(*(volatile uint16_t *)((h) + (o)) = (v)))) 2933f123214Stsutsui 2943f123214Stsutsui #define bus_space_write_4(t, h, o, v) \ 2953725e983Stsutsui ((void) t, ((void)(*(volatile uint32_t *)((h) + (o)) = (v)))) 2963f123214Stsutsui 2973f123214Stsutsui /* 2982cac3aaeStsutsui * void bus_space_write_multi_N(bus_space_tag_t tag, 2993f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 3003725e983Stsutsui * const uintN_t *addr, size_t count); 3013f123214Stsutsui * 3023f123214Stsutsui * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 3033f123214Stsutsui * provided to bus space described by tag/handle/offset. 3043f123214Stsutsui */ 3053f123214Stsutsui 3063f123214Stsutsui #define bus_space_write_multi_1(t, h, o, a, c) do { \ 3073f123214Stsutsui (void) t; \ 3085f1c88d7Sperry __asm volatile (" \ 3093f123214Stsutsui movl %0,%%a0 ; \ 3103f123214Stsutsui movl %1,%%a1 ; \ 3113f123214Stsutsui movl %2,%%d0 ; \ 3123f123214Stsutsui 1: movb %%a1@+,%%a0@ ; \ 3133f123214Stsutsui subql #1,%%d0 ; \ 3143f123214Stsutsui jne 1b" : \ 3153f123214Stsutsui : \ 3163f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 317*fbe896c5Stsutsui "a0","a1","d0"); \ 3183f123214Stsutsui } while (0) 3193f123214Stsutsui 3203f123214Stsutsui #define bus_space_write_multi_2(t, h, o, a, c) do { \ 3213f123214Stsutsui (void) t; \ 3225f1c88d7Sperry __asm volatile (" \ 3233f123214Stsutsui movl %0,%%a0 ; \ 3243f123214Stsutsui movl %1,%%a1 ; \ 3253f123214Stsutsui movl %2,%%d0 ; \ 3263f123214Stsutsui 1: movw %%a1@+,%%a0@ ; \ 3273f123214Stsutsui subql #1,%%d0 ; \ 3283f123214Stsutsui jne 1b" : \ 3293f123214Stsutsui : \ 3303f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 331*fbe896c5Stsutsui "a0","a1","d0"); \ 3323f123214Stsutsui } while (0) 3333f123214Stsutsui 3343f123214Stsutsui #define bus_space_write_multi_4(t, h, o, a, c) do { \ 3353f123214Stsutsui (void) t; \ 3365f1c88d7Sperry __asm volatile (" \ 3373f123214Stsutsui movl %0,%%a0 ; \ 3383f123214Stsutsui movl %1,%%a1 ; \ 3393f123214Stsutsui movl %2,%%d0 ; \ 3403f123214Stsutsui 1: movl %%a1@+,%%a0@ ; \ 3413f123214Stsutsui subql #1,%%d0 ; \ 3423f123214Stsutsui jne 1b" : \ 3433f123214Stsutsui : \ 3443f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 345*fbe896c5Stsutsui "a0","a1","d0"); \ 3463f123214Stsutsui } while (0) 3473f123214Stsutsui 3483f123214Stsutsui /* 3492cac3aaeStsutsui * void bus_space_write_region_N(bus_space_tag_t tag, 3503f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 3513725e983Stsutsui * const uintN_t *addr, size_t count); 3523f123214Stsutsui * 3533f123214Stsutsui * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided 3543f123214Stsutsui * to bus space described by tag/handle starting at `offset'. 3553f123214Stsutsui */ 3563f123214Stsutsui 3573f123214Stsutsui #define bus_space_write_region_1(t, h, o, a, c) do { \ 3583f123214Stsutsui (void) t; \ 3595f1c88d7Sperry __asm volatile (" \ 3603f123214Stsutsui movl %0,%%a0 ; \ 3613f123214Stsutsui movl %1,%%a1 ; \ 3623f123214Stsutsui movl %2,%%d0 ; \ 3633f123214Stsutsui 1: movb %%a1@+,%%a0@+ ; \ 3643f123214Stsutsui subql #1,%%d0 ; \ 3653f123214Stsutsui jne 1b" : \ 3663f123214Stsutsui : \ 3673f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 368*fbe896c5Stsutsui "a0","a1","d0"); \ 3693f123214Stsutsui } while (0) 3703f123214Stsutsui 3713f123214Stsutsui #define bus_space_write_region_2(t, h, o, a, c) do { \ 3723f123214Stsutsui (void) t; \ 3735f1c88d7Sperry __asm volatile (" \ 3743f123214Stsutsui movl %0,%%a0 ; \ 3753f123214Stsutsui movl %1,%%a1 ; \ 3763f123214Stsutsui movl %2,%%d0 ; \ 3773f123214Stsutsui 1: movw %%a1@+,%%a0@+ ; \ 3783f123214Stsutsui subql #1,%%d0 ; \ 3793f123214Stsutsui jne 1b" : \ 3803f123214Stsutsui : \ 3813f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 382*fbe896c5Stsutsui "a0","a1","d0"); \ 3833f123214Stsutsui } while (0) 3843f123214Stsutsui 3853f123214Stsutsui #define bus_space_write_region_4(t, h, o, a, c) do { \ 3863f123214Stsutsui (void) t; \ 3875f1c88d7Sperry __asm volatile (" \ 3883f123214Stsutsui movl %0,%%a0 ; \ 3893f123214Stsutsui movl %1,%%a1 ; \ 3903f123214Stsutsui movl %2,%%d0 ; \ 3913f123214Stsutsui 1: movl %%a1@+,%%a0@+ ; \ 3923f123214Stsutsui subql #1,%%d0 ; \ 3933f123214Stsutsui jne 1b" : \ 3943f123214Stsutsui : \ 3953f123214Stsutsui "r" ((h) + (o)), "g" (a), "g" (c) : \ 396*fbe896c5Stsutsui "a0","a1","d0"); \ 3973f123214Stsutsui } while (0) 3983f123214Stsutsui 3993f123214Stsutsui /* 4002cac3aaeStsutsui * void bus_space_set_multi_N(bus_space_tag_t tag, 4013725e983Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 4022cac3aaeStsutsui * size_t count); 4033f123214Stsutsui * 4043f123214Stsutsui * Write the 1, 2, 4, or 8 byte value `val' to bus space described 4053f123214Stsutsui * by tag/handle/offset `count' times. 4063f123214Stsutsui */ 4073f123214Stsutsui 4083f123214Stsutsui #define bus_space_set_multi_1(t, h, o, val, c) do { \ 4093f123214Stsutsui (void) t; \ 4105f1c88d7Sperry __asm volatile (" \ 4113f123214Stsutsui movl %0,%%a0 ; \ 4123f123214Stsutsui movl %1,%%d1 ; \ 4133f123214Stsutsui movl %2,%%d0 ; \ 4143f123214Stsutsui 1: movb %%d1,%%a0@ ; \ 4153f123214Stsutsui subql #1,%%d0 ; \ 4163f123214Stsutsui jne 1b" : \ 4173f123214Stsutsui : \ 4183f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 419*fbe896c5Stsutsui "a0","d0","d1"); \ 4203f123214Stsutsui } while (0) 4213f123214Stsutsui 4223f123214Stsutsui #define bus_space_set_multi_2(t, h, o, val, c) do { \ 4233f123214Stsutsui (void) t; \ 4245f1c88d7Sperry __asm volatile (" \ 4253f123214Stsutsui movl %0,%%a0 ; \ 4263f123214Stsutsui movl %1,%%d1 ; \ 4273f123214Stsutsui movl %2,%%d0 ; \ 4283f123214Stsutsui 1: movw %%d1,%%a0@ ; \ 4293f123214Stsutsui subql #1,%%d0 ; \ 4303f123214Stsutsui jne 1b" : \ 4313f123214Stsutsui : \ 4323f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 433*fbe896c5Stsutsui "a0","d0","d1"); \ 4343f123214Stsutsui } while (0) 4353f123214Stsutsui 4363f123214Stsutsui #define bus_space_set_multi_4(t, h, o, val, c) do { \ 4373f123214Stsutsui (void) t; \ 4385f1c88d7Sperry __asm volatile (" \ 4393f123214Stsutsui movl %0,%%a0 ; \ 4403f123214Stsutsui movl %1,%%d1 ; \ 4413f123214Stsutsui movl %2,%%d0 ; \ 4423f123214Stsutsui 1: movl %%d1,%%a0@ ; \ 4433f123214Stsutsui subql #1,%%d0 ; \ 4443f123214Stsutsui jne 1b" : \ 4453f123214Stsutsui : \ 4463f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 447*fbe896c5Stsutsui "a0","d0","d1"); \ 4483f123214Stsutsui } while (0) 4493f123214Stsutsui 4503f123214Stsutsui /* 4512cac3aaeStsutsui * void bus_space_set_region_N(bus_space_tag_t tag, 4523725e983Stsutsui * bus_space_handle_t bsh, bus_size_t offset, uintN_t val, 4532cac3aaeStsutsui * size_t count); 4543f123214Stsutsui * 4553f123214Stsutsui * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 4563f123214Stsutsui * by tag/handle starting at `offset'. 4573f123214Stsutsui */ 4583f123214Stsutsui 4593f123214Stsutsui #define bus_space_set_region_1(t, h, o, val, c) do { \ 4603f123214Stsutsui (void) t; \ 4615f1c88d7Sperry __asm volatile (" \ 4623f123214Stsutsui movl %0,%%a0 ; \ 4633f123214Stsutsui movl %1,%%d1 ; \ 4643f123214Stsutsui movl %2,%%d0 ; \ 4653f123214Stsutsui 1: movb %%d1,%%a0@+ ; \ 4663f123214Stsutsui subql #1,%%d0 ; \ 4673f123214Stsutsui jne 1b" : \ 4683f123214Stsutsui : \ 4693f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 470*fbe896c5Stsutsui "a0","d0","d1"); \ 4713f123214Stsutsui } while (0) 4723f123214Stsutsui 4733f123214Stsutsui #define bus_space_set_region_2(t, h, o, val, c) do { \ 4743f123214Stsutsui (void) t; \ 4755f1c88d7Sperry __asm volatile (" \ 4763f123214Stsutsui movl %0,%%a0 ; \ 4773f123214Stsutsui movl %1,%%d1 ; \ 4783f123214Stsutsui movl %2,%%d0 ; \ 4793f123214Stsutsui 1: movw %%d1,%%a0@+ ; \ 4803f123214Stsutsui subql #1,%%d0 ; \ 4813f123214Stsutsui jne 1b" : \ 4823f123214Stsutsui : \ 4833f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 484*fbe896c5Stsutsui "a0","d0","d1"); \ 4853f123214Stsutsui } while (0) 4863f123214Stsutsui 4873f123214Stsutsui #define bus_space_set_region_4(t, h, o, val, c) do { \ 4883f123214Stsutsui (void) t; \ 4895f1c88d7Sperry __asm volatile (" \ 4903f123214Stsutsui movl %0,%%a0 ; \ 4913f123214Stsutsui movl %1,%%d1 ; \ 4923f123214Stsutsui movl %2,%%d0 ; \ 4933f123214Stsutsui 1: movl %%d1,%%a0@+ ; \ 4943f123214Stsutsui subql #1,%%d0 ; \ 4953f123214Stsutsui jne 1b" : \ 4963f123214Stsutsui : \ 4973f123214Stsutsui "r" ((h) + (o)), "g" (val), "g" (c) : \ 498*fbe896c5Stsutsui "a0","d0","d1"); \ 4993f123214Stsutsui } while (0) 5003f123214Stsutsui 5013f123214Stsutsui /* 5022cac3aaeStsutsui * void bus_space_copy_region_N(bus_space_tag_t tag, 5033f123214Stsutsui * bus_space_handle_t bsh1, bus_size_t off1, 5043f123214Stsutsui * bus_space_handle_t bsh2, bus_size_t off2, 5052cac3aaeStsutsui * bus_size_t count); 5063f123214Stsutsui * 5073f123214Stsutsui * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 5083f123214Stsutsui * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 5093f123214Stsutsui */ 5103f123214Stsutsui 5113f123214Stsutsui #define __NEWS68K_copy_region_N(BYTES) \ 512fbae48b9Sperry static __inline void __CONCAT(bus_space_copy_region_,BYTES) \ 5132cac3aaeStsutsui (bus_space_tag_t, \ 5143f123214Stsutsui bus_space_handle_t bsh1, bus_size_t off1, \ 5153f123214Stsutsui bus_space_handle_t bsh2, bus_size_t off2, \ 5162cac3aaeStsutsui bus_size_t count); \ 5173f123214Stsutsui \ 518fbae48b9Sperry static __inline void \ 51952b46dcfStsutsui __CONCAT(bus_space_copy_region_,BYTES)(bus_space_tag_t t, \ 52052b46dcfStsutsui bus_space_handle_t h1, bus_space_handle_t h2, \ 52152b46dcfStsutsui bus_size_t o1, bus_size_t o2, bus_size_t c) \ 5223f123214Stsutsui { \ 5233f123214Stsutsui bus_size_t o; \ 5243f123214Stsutsui \ 5253f123214Stsutsui if ((h1 + o1) >= (h2 + o2)) { \ 5263f123214Stsutsui /* src after dest: copy forward */ \ 5273f123214Stsutsui for (o = 0; c != 0; c--, o += BYTES) \ 5283f123214Stsutsui __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 5293f123214Stsutsui __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 5303f123214Stsutsui } else { \ 5313f123214Stsutsui /* dest after src: copy backwards */ \ 5323f123214Stsutsui for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \ 5333f123214Stsutsui __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \ 5343f123214Stsutsui __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \ 5353f123214Stsutsui } \ 5363f123214Stsutsui } 5373f123214Stsutsui __NEWS68K_copy_region_N(1) 5383f123214Stsutsui __NEWS68K_copy_region_N(2) 5393f123214Stsutsui __NEWS68K_copy_region_N(4) 5403f123214Stsutsui 5413f123214Stsutsui #undef __NEWS68K_copy_region_N 5423f123214Stsutsui 5433f123214Stsutsui /* 5443f123214Stsutsui * Bus read/write barrier methods. 5453f123214Stsutsui * 5462cac3aaeStsutsui * void bus_space_barrier(bus_space_tag_t tag, 5473f123214Stsutsui * bus_space_handle_t bsh, bus_size_t offset, 5482cac3aaeStsutsui * bus_size_t len, int flags); 5493f123214Stsutsui * 5503f123214Stsutsui * Note: the 680x0 does not currently require barriers, but we must 5513f123214Stsutsui * provide the flags to MI code. 5523f123214Stsutsui */ 5533f123214Stsutsui #define bus_space_barrier(t, h, o, l, f) \ 5543f123214Stsutsui ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f))) 5553f123214Stsutsui #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 5563f123214Stsutsui #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 5573f123214Stsutsui 5583f123214Stsutsui #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 5593f123214Stsutsui 560485e133aStsutsui /* 561485e133aStsutsui * There is no bus_dma(9)'fied bus drivers on this port. 562485e133aStsutsui */ 563485e133aStsutsui #define __HAVE_NO_BUS_DMA 564485e133aStsutsui 5653f123214Stsutsui #endif /* _NEWS68K_BUS_H_ */ 566