Date: Fri, 24 Apr 2009 03:06:32 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r191447 - head/sys/powerpc/powerpc Message-ID: <200904240306.n3O36WRk006467@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Fri Apr 24 03:06:32 2009 New Revision: 191447 URL: http://svn.freebsd.org/changeset/base/191447 Log: Reimplement bs_be_rs_{1|2|4} and bs_le_rs_{1|2|4} by not calling the inline functions in <machine/pio.h> and do not add synchronization. Implement bs_gen_barrier() as eieio and sync. Modified: head/sys/powerpc/powerpc/bus_machdep.c Modified: head/sys/powerpc/powerpc/bus_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/bus_machdep.c Fri Apr 24 02:55:20 2009 (r191446) +++ head/sys/powerpc/powerpc/bus_machdep.c Fri Apr 24 03:06:32 2009 (r191447) @@ -39,9 +39,13 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#define KTR_BE_IO 0 +#define KTR_LE_IO 0 + #include <sys/param.h> #include <sys/systm.h> #include <sys/bus.h> +#include <sys/ktr.h> #include <vm/vm.h> #include <vm/pmap.h> @@ -141,7 +145,7 @@ static void bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused, bus_size_t size __unused, int flags __unused) { - __asm __volatile("" : : : "memory"); + __asm __volatile("eieio; sync" : : : "memory"); } /* @@ -150,19 +154,37 @@ bs_gen_barrier(bus_space_handle_t bsh __ static uint8_t bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs) { - return (in8(__ppc_ba(bsh, ofs))); + volatile uint8_t *addr; + uint8_t res; + + addr = __ppc_ba(bsh, ofs); + res = *addr; + CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); + return (res); } static uint16_t bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs) { - return (in16(__ppc_ba(bsh, ofs))); + volatile uint16_t *addr; + uint16_t res; + + addr = __ppc_ba(bsh, ofs); + res = *addr; + CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); + return (res); } static uint32_t bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs) { - return (in32(__ppc_ba(bsh, ofs))); + volatile uint32_t *addr; + uint32_t res; + + addr = __ppc_ba(bsh, ofs); + res = *addr; + CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); + return (res); } static uint64_t @@ -234,19 +256,31 @@ bs_be_rr_8(bus_space_handle_t bsh, bus_s static void bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val) { - out8(__ppc_ba(bsh, ofs), val); + volatile uint8_t *addr; + + addr = __ppc_ba(bsh, ofs); + *addr = val; + CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); } static void bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val) { - out16(__ppc_ba(bsh, ofs), val); + volatile uint16_t *addr; + + addr = __ppc_ba(bsh, ofs); + *addr = val; + CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); } static void bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val) { - out32(__ppc_ba(bsh, ofs), val); + volatile uint32_t *addr; + + addr = __ppc_ba(bsh, ofs); + *addr = val; + CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); } static void @@ -401,19 +435,37 @@ bs_be_sr_8(bus_space_handle_t bsh, bus_s static uint8_t bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs) { - return (in8(__ppc_ba(bsh, ofs))); + volatile uint8_t *addr; + uint8_t res; + + addr = __ppc_ba(bsh, ofs); + res = *addr; + CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); + return (res); } static uint16_t bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs) { - return (in16rb(__ppc_ba(bsh, ofs))); + volatile uint16_t *addr; + uint16_t res; + + addr = __ppc_ba(bsh, ofs); + __asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr)); + CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); + return (res); } static uint32_t bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs) { - return (in32rb(__ppc_ba(bsh, ofs))); + volatile uint32_t *addr; + uint32_t res; + + addr = __ppc_ba(bsh, ofs); + __asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr)); + CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res); + return (res); } static uint64_t @@ -485,19 +537,31 @@ bs_le_rr_8(bus_space_handle_t bsh, bus_s static void bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val) { - out8(__ppc_ba(bsh, ofs), val); + volatile uint8_t *addr; + + addr = __ppc_ba(bsh, ofs); + *addr = val; + CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); } static void bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val) { - out16rb(__ppc_ba(bsh, ofs), val); + volatile uint16_t *addr; + + addr = __ppc_ba(bsh, ofs); + __asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr)); + CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); } static void bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val) { - out32rb(__ppc_ba(bsh, ofs), val); + volatile uint32_t *addr; + + addr = __ppc_ba(bsh, ofs); + __asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr)); + CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val); } static void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904240306.n3O36WRk006467>