From owner-freebsd-mips@FreeBSD.ORG Wed Apr 17 01:08:38 2013 Return-Path: Delivered-To: freebsd-mips@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 4DCB12CF for ; Wed, 17 Apr 2013 01:08:38 +0000 (UTC) (envelope-from brooks@lor.one-eyed-alien.net) Received: from lor.one-eyed-alien.net (lor.one-eyed-alien.net [69.66.77.232]) by mx1.freebsd.org (Postfix) with ESMTP id 8A170194 for ; Wed, 17 Apr 2013 01:08:36 +0000 (UTC) Received: from lor.one-eyed-alien.net (localhost [127.0.0.1]) by lor.one-eyed-alien.net (8.14.5/8.14.5) with ESMTP id r3H18ZhO017810 for ; Tue, 16 Apr 2013 20:08:35 -0500 (CDT) (envelope-from brooks@lor.one-eyed-alien.net) Received: (from brooks@localhost) by lor.one-eyed-alien.net (8.14.5/8.14.5/Submit) id r3H18ZBI017809 for freebsd-mips@freebsd.org; Tue, 16 Apr 2013 20:08:35 -0500 (CDT) (envelope-from brooks) Date: Tue, 16 Apr 2013 20:08:35 -0500 From: Brooks Davis To: freebsd-mips@freebsd.org Subject: [PATCH] partial 64-bit bus space generic implementation Message-ID: <20130417010835.GA17779@lor.one-eyed-alien.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="FCuugMFkClbJLl1L" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Apr 2013 01:08:38 -0000 --FCuugMFkClbJLl1L Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I've implemented generic_bs_*_8() for a subset of MIPS platforms (!sibyte and !o32 ABI) based on the mips3_ld and mips3_sd code in cpufunc.h. I've verified that simple reads and writes work for our MIPS64 ISA CPU. The patch passes make universe, but I've not tested it on any mips32 systems. Any reviews or objections to this patch? -- Brooks http://people.freebsd.org/~brooks/patches/mips-bs8.diff MFP4 223084: Partially implement generic_bs_*_8() for MIPS platforms. This is known to work with TARGET_ARCH=3Dmips64 with FreeBSD/BERI. Assuming that other definitions in cpufunc.h are correct it will work on non-o64 ABI systems except sibyte. On sibyte and o32 systems generic_bs_*_8() will remain panic() implementations. Index: sys/mips/mips/bus_space_generic.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/mips/mips/bus_space_generic.c (revision 249555) +++ sys/mips/mips/bus_space_generic.c (working copy) @@ -202,9 +202,11 @@ #define rd8(a) cvmx_read64_uint8(a) #define rd16(a) cvmx_read64_uint16(a) #define rd32(a) cvmx_read64_uint32(a) +#define rd64(a) cvmx_read64_uint64(a) #define wr8(a, v) cvmx_write64_uint8(a, v) #define wr16(a, v) cvmx_write64_uint16(a, v) #define wr32(a, v) cvmx_write64_uint32(a, v) +#define wr64(a, v) cvmx_write64_uint64(a, v) #elif defined(CPU_SB1) && _BYTE_ORDER =3D=3D _BIG_ENDIAN #include #define rd8(a) sb_big_endian_read8(a) @@ -217,10 +219,16 @@ #define rd8(a) readb(a) #define rd16(a) readw(a) #define rd32(a) readl(a) +#ifdef readd +#define rd64(a) readd((a)) +#endif #define wr8(a, v) writeb(a, v) #define wr16(a, v) writew(a, v) #define wr32(a, v) writel(a, v) +#ifdef writed +#define wr64(a, v) writed((uint64_t *)(a), v) #endif +#endif =20 /* generic bus_space tag */ bus_space_tag_t mips_bus_space_generic =3D &generic_space; @@ -297,7 +305,11 @@ generic_bs_r_8(void *t, bus_space_handle_t handle, bus_size_t offset) { =20 +#ifdef rd64 + return(rd64(handle + offset)); +#else panic("%s: not implemented", __func__); +#endif } =20 void @@ -333,8 +345,14 @@ generic_bs_rm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr =3D bsh + offset; =20 + while (count--) + *addr++ =3D rd64(baddr); +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -382,8 +400,16 @@ generic_bs_rr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr =3D bsh + offset; =20 + while (count--) { + *addr++ =3D rd64(baddr); + baddr +=3D 8; + } +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -419,7 +445,11 @@ uint64_t value) { =20 +#ifdef wr64 + wr64(bsh + offset, value); +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -460,8 +490,14 @@ generic_bs_wm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef wr64 + bus_addr_t baddr =3D bsh + offset; =20 + while (count--) + wr64(baddr, *addr++); +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -508,8 +544,16 @@ generic_bs_wr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef wr64 + bus_addr_t baddr =3D bsh + offset; =20 + while (count--) { + wr64(baddr, *addr++); + baddr +=3D 8; + } +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -550,8 +594,14 @@ generic_bs_sm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef wr64 + bus_addr_t addr =3D bsh + offset; =20 + while (count--) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -592,8 +642,14 @@ generic_bs_sr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef wr64 + bus_addr_t addr =3D bsh + offset; =20 + for (; count !=3D 0; count--, addr +=3D 8) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } =20 /* @@ -664,8 +720,23 @@ generic_bs_c_8(void *t, bus_space_handle_t bsh1, bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, size_t count) { +#if defined(rd64) && defined(wr64) + bus_addr_t addr1 =3D bsh1 + off1; + bus_addr_t addr2 =3D bsh2 + off2; =20 + if (addr1 >=3D addr2) { + /* src after dest: copy forward */ + for (; count !=3D 0; count--, addr1 +=3D 8, addr2 +=3D 8) + wr64(addr2, rd64(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 +=3D 8 * (count - 1), addr2 +=3D 8 * (count - 1); + count !=3D 0; count--, addr1 -=3D 8, addr2 -=3D 8) + wr64(addr2, rd64(addr1)); + } +#else panic("%s: not implemented", __func__); +#endif } =20 void Index: sys/mips/include/cpufunc.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sys/mips/include/cpufunc.h (revision 249555) +++ sys/mips/include/cpufunc.h (working copy) @@ -354,9 +354,15 @@ #define readb(va) (*(volatile uint8_t *) (va)) #define readw(va) (*(volatile uint16_t *) (va)) #define readl(va) (*(volatile uint32_t *) (va)) +#if defined(__GNUC__) && !defined(__mips_o32) +#define readd(a) (*(volatile uint64_t *)(a)) +#endif =20 #define writeb(va, d) (*(volatile uint8_t *) (va) =3D (d)) #define writew(va, d) (*(volatile uint16_t *) (va) =3D (d)) #define writel(va, d) (*(volatile uint32_t *) (va) =3D (d)) +#if defined(__GNUC__) && !defined(__mips_o32) +#define writed(va, d) (*(volatile uint64_t *) (va) =3D (d)) +#endif =20 #endif /* !_MACHINE_CPUFUNC_H_ */ --FCuugMFkClbJLl1L Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (FreeBSD) iD8DBQFRbfYTXY6L6fI4GtQRAobWAJ0WwExxaMbms4GhBaQ30FisqriMFQCdELPP WvY+zFQuESY6k5E1zJ8uJTI= =gADO -----END PGP SIGNATURE----- --FCuugMFkClbJLl1L--