Index: sys/i386/include/bus.h =================================================================== --- sys/i386/include/bus.h (revision 241737) +++ sys/i386/include/bus.h (working copy) @@ -3,4 +3,28 @@ */ /* $FreeBSD$ */ +#ifndef _MACHINE_BUS_H_ +#define _MACHINE_BUS_H_ + #include + +/* + * The functions: + * bus_space_read_8 + * bus_space_read_region_8 + * bus_space_write_8 + * bus_space_write_multi_8 + * bus_space_write_region_8 + * bus_space_set_multi_8 + * bus_space_set_region_8 + * bus_space_copy_region_8 + * bus_space_read_multi_8 + * are unimplemented for i386 because there is no way to do a 64-bit move in + * this architecture. It is possible to do two 32-bit moves, but this is + * not atomic and may have hardware dependencies that should be fully + * understood. + */ + + +#endif /*_MACHINE_BUS_H_*/ + Index: sys/amd64/include/bus.h =================================================================== --- sys/amd64/include/bus.h (revision 241737) +++ sys/amd64/include/bus.h (working copy) @@ -1,6 +1,154 @@ /*- - * This file is in the public domain. + * Copyright (c) 2012 Intel Corporation + * Copyright (c) 2009 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ */ -/* $FreeBSD$ */ +#ifndef _MACHINE_BUS_H_ +#define _MACHINE_BUS_H_ + +#include #include + +#define KASSERT_BUS_SPACE_MEM_ONLY() \ + KASSERT(tag == X86_BUS_SPACE_MEM, \ + ("%s: can only handle mem space", __func__)) + +static __inline uint64_t +bus_space_read_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs) +{ + + KASSERT_BUS_SPACE_MEM_ONLY(); + + return (*(uint64_t volatile *)(bsh + ofs)); +} + +static __inline void +bus_space_write_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t val) +{ + + KASSERT_BUS_SPACE_MEM_ONLY(); + + *(uint64_t volatile *)(bsh + ofs) = val; +} + +static __inline void +bus_space_read_region_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t *bufp, size_t count) +{ + uint64_t volatile *bsp; + + KASSERT_BUS_SPACE_MEM_ONLY(); + + bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bufp++ = *bsp++; +} + +static __inline void +bus_space_write_region_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t const *bufp, size_t count) +{ + uint64_t volatile *bsp; + + KASSERT_BUS_SPACE_MEM_ONLY(); + + bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bsp++ = *bufp++; +} + +static __inline void +bus_space_set_region_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t val, size_t count) +{ + uint64_t volatile *bsp; + + KASSERT_BUS_SPACE_MEM_ONLY(); + + bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bsp++ = val; +} + +static __inline void +bus_space_copy_region_8(bus_space_tag_t tag, bus_space_handle_t sbsh, + bus_size_t sofs, bus_space_handle_t dbsh, bus_size_t dofs, size_t count) +{ + uint64_t volatile *dst, *src; + + KASSERT_BUS_SPACE_MEM_ONLY(); + + src = (void *)(sbsh + sofs); + dst = (void *)(dbsh + dofs); + if (src < dst) { + src += count - 1; + dst += count - 1; + while (count-- > 0) + *dst-- = *src--; + } else { + while (count-- > 0) + *dst++ = *src++; + } +} + +static __inline void +bus_space_read_multi_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t *bufp, size_t count) +{ + + KASSERT_BUS_SPACE_MEM_ONLY(); + + while (count-- > 0) + *bufp++ = *(uint64_t volatile *)(bsh + ofs); +} + +static __inline void +bus_space_write_multi_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t const *bufp, size_t count) +{ + + KASSERT_BUS_SPACE_MEM_ONLY(); + + while (count-- > 0) + *(uint64_t volatile *)(bsh + ofs) = *bufp++; +} + +static __inline void +bus_space_set_multi_8(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t ofs, uint64_t val, size_t count) +{ + + KASSERT_BUS_SPACE_MEM_ONLY(); + + while (count-- > 0) + *(uint64_t volatile *)(bsh + ofs) = val; +} + +#endif /*_MACHINE_BUS_H_*/ + Index: sys/x86/include/bus.h =================================================================== --- sys/x86/include/bus.h (revision 241737) +++ sys/x86/include/bus.h (working copy) @@ -251,10 +251,6 @@ return (*(volatile u_int32_t *)(handle + offset)); } -#if 0 /* Cause a link error for bus_space_read_8 */ -#define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!! -#endif - /* * Read `count' 1, 2, 4, or 8 byte quantities from bus space * described by tag/handle/offset and copy into buffer provided. @@ -337,10 +333,6 @@ } } -#if 0 /* Cause a link error for bus_space_read_multi_8 */ -#define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! -#endif - /* * Read `count' 1, 2, 4, or 8 byte quantities from bus space * described by tag/handle and starting at `offset' and copy into @@ -458,10 +450,6 @@ } } -#if 0 /* Cause a link error for bus_space_read_region_8 */ -#define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! -#endif - /* * Write the 1, 2, 4, or 8 byte value `value' to bus space * described by tag/handle/offset. @@ -512,10 +500,6 @@ *(volatile u_int32_t *)(bsh + offset) = value; } -#if 0 /* Cause a link error for bus_space_write_8 */ -#define bus_space_write_8 !!! bus_space_write_8 not implemented !!! -#endif - /* * Write `count' 1, 2, 4, or 8 byte quantities from the buffer * provided to bus space described by tag/handle/offset. @@ -601,11 +585,6 @@ } } -#if 0 /* Cause a link error for bus_space_write_multi_8 */ -#define bus_space_write_multi_8(t, h, o, a, c) \ - !!! bus_space_write_multi_8 unimplemented !!! -#endif - /* * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided * to bus space described by tag/handle starting at `offset'. @@ -723,11 +702,6 @@ } } -#if 0 /* Cause a link error for bus_space_write_region_8 */ -#define bus_space_write_region_8 \ - !!! bus_space_write_region_8 unimplemented !!! -#endif - /* * Write the 1, 2, 4, or 8 byte value `val' to bus space described * by tag/handle/offset `count' times. @@ -788,10 +762,6 @@ *(volatile u_int32_t *)(addr) = value; } -#if 0 /* Cause a link error for bus_space_set_multi_8 */ -#define bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!! -#endif - /* * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described * by tag/handle starting at `offset'. @@ -852,10 +822,6 @@ *(volatile u_int32_t *)(addr) = value; } -#if 0 /* Cause a link error for bus_space_set_region_8 */ -#define bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!! -#endif - /* * Copy `count' 1, 2, 4, or 8 byte values from bus space starting * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. @@ -984,10 +950,6 @@ } } -#if 0 /* Cause a link error for bus_space_copy_8 */ -#define bus_space_copy_region_8 !!! bus_space_copy_region_8 unimplemented !!! -#endif - /* * Bus read/write barrier methods. *