Date: Mon, 27 Feb 2012 13:57:14 +0000 (UTC) From: "Jayachandran C." <jchandra@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r232210 - user/jchandra/xlp-merge/sys/dev/cfi Message-ID: <201202271357.q1RDvEbh020615@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jchandra Date: Mon Feb 27 13:57:14 2012 New Revision: 232210 URL: http://svn.freebsd.org/changeset/base/232210 Log: CFI fixes for big endian architectures. The commands and responses are little-endian which has to be bswapped, while raw read of data need not be. Make the default cfi_read and cfi_write do 'htole', and provide a cfi_read_raw which is used for reading data. Modified: user/jchandra/xlp-merge/sys/dev/cfi/cfi_core.c user/jchandra/xlp-merge/sys/dev/cfi/cfi_dev.c user/jchandra/xlp-merge/sys/dev/cfi/cfi_disk.c user/jchandra/xlp-merge/sys/dev/cfi/cfi_var.h Modified: user/jchandra/xlp-merge/sys/dev/cfi/cfi_core.c ============================================================================== --- user/jchandra/xlp-merge/sys/dev/cfi/cfi_core.c Mon Feb 27 13:38:52 2012 (r232209) +++ user/jchandra/xlp-merge/sys/dev/cfi/cfi_core.c Mon Feb 27 13:57:14 2012 (r232210) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/bus.h> #include <sys/conf.h> +#include <sys/endian.h> #include <sys/kernel.h> #include <sys/malloc.h> #include <sys/module.h> @@ -54,7 +55,7 @@ devclass_t cfi_devclass; devclass_t cfi_diskclass; uint32_t -cfi_read(struct cfi_softc *sc, u_int ofs) +cfi_read_raw(struct cfi_softc *sc, u_int ofs) { uint32_t val; @@ -76,6 +77,29 @@ cfi_read(struct cfi_softc *sc, u_int ofs return (val); } +uint32_t +cfi_read(struct cfi_softc *sc, u_int ofs) +{ + uint32_t val; + + ofs &= ~(sc->sc_width - 1); + switch (sc->sc_width) { + case 1: + val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); + break; + case 2: + val = le16toh(bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs)); + break; + case 4: + val = le32toh(bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs)); + break; + default: + val = ~0; + break; + } + return (val); +} + static void cfi_write(struct cfi_softc *sc, u_int ofs, u_int val) { @@ -86,10 +110,10 @@ cfi_write(struct cfi_softc *sc, u_int of bus_space_write_1(sc->sc_tag, sc->sc_handle, ofs, val); break; case 2: - bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, val); + bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, htole16(val)); break; case 4: - bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, val); + bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, htole32(val)); break; } } Modified: user/jchandra/xlp-merge/sys/dev/cfi/cfi_dev.c ============================================================================== --- user/jchandra/xlp-merge/sys/dev/cfi/cfi_dev.c Mon Feb 27 13:38:52 2012 (r232209) +++ user/jchandra/xlp-merge/sys/dev/cfi/cfi_dev.c Mon Feb 27 13:57:14 2012 (r232210) @@ -103,7 +103,7 @@ cfi_block_start(struct cfi_softc *sc, u_ /* Read the block from flash for byte-serving. */ ptr.x8 = sc->sc_wrbuf; for (r = 0; r < sc->sc_wrbufsz; r += sc->sc_width) { - val = cfi_read(sc, sc->sc_wrofs + r); + val = cfi_read_raw(sc, sc->sc_wrofs + r); switch (sc->sc_width) { case 1: *(ptr.x8)++ = val; @@ -189,7 +189,7 @@ cfi_devread(struct cdev *dev, struct uio while (error == 0 && uio->uio_resid > 0 && uio->uio_offset < sc->sc_size) { ofs = uio->uio_offset; - val = cfi_read(sc, ofs); + val = cfi_read_raw(sc, ofs); switch (sc->sc_width) { case 1: buf.x8[0] = val; Modified: user/jchandra/xlp-merge/sys/dev/cfi/cfi_disk.c ============================================================================== --- user/jchandra/xlp-merge/sys/dev/cfi/cfi_disk.c Mon Feb 27 13:38:52 2012 (r232209) +++ user/jchandra/xlp-merge/sys/dev/cfi/cfi_disk.c Mon Feb 27 13:57:14 2012 (r232210) @@ -182,19 +182,19 @@ cfi_disk_read(struct cfi_softc *sc, stru if (sc->sc_width == 1) { uint8_t *dp = (uint8_t *)bp->bio_data; while (resid > 0 && bp->bio_offset < sc->sc_size) { - *dp++ = cfi_read(sc, bp->bio_offset); + *dp++ = cfi_read_raw(sc, bp->bio_offset); bp->bio_offset += 1, resid -= 1; } } else if (sc->sc_width == 2) { uint16_t *dp = (uint16_t *)bp->bio_data; while (resid > 0 && bp->bio_offset < sc->sc_size) { - *dp++ = cfi_read(sc, bp->bio_offset); + *dp++ = cfi_read_raw(sc, bp->bio_offset); bp->bio_offset += 2, resid -= 2; } } else { uint32_t *dp = (uint32_t *)bp->bio_data; while (resid > 0 && bp->bio_offset < sc->sc_size) { - *dp++ = cfi_read(sc, bp->bio_offset); + *dp++ = cfi_read_raw(sc, bp->bio_offset); bp->bio_offset += 4, resid -= 4; } } Modified: user/jchandra/xlp-merge/sys/dev/cfi/cfi_var.h ============================================================================== --- user/jchandra/xlp-merge/sys/dev/cfi/cfi_var.h Mon Feb 27 13:38:52 2012 (r232209) +++ user/jchandra/xlp-merge/sys/dev/cfi/cfi_var.h Mon Feb 27 13:57:14 2012 (r232210) @@ -71,6 +71,7 @@ int cfi_probe(device_t); int cfi_attach(device_t); int cfi_detach(device_t); +uint32_t cfi_read_raw(struct cfi_softc *, u_int); uint32_t cfi_read(struct cfi_softc *, u_int); uint8_t cfi_read_qry(struct cfi_softc *, u_int); int cfi_write_block(struct cfi_softc *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202271357.q1RDvEbh020615>