Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Apr 2013 20:08:35 -0500
From:      Brooks Davis <brooks@freebsd.org>
To:        freebsd-mips@freebsd.org
Subject:   [PATCH] partial 64-bit bus space generic implementation
Message-ID:  <20130417010835.GA17779@lor.one-eyed-alien.net>

next in thread | raw e-mail | index | archive | help

--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 <mips/sibyte/sb_bus_space.h>
 #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--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130417010835.GA17779>