From owner-svn-src-user@FreeBSD.ORG Mon Feb 27 13:57:14 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AF46A1065672; Mon, 27 Feb 2012 13:57:14 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 949C78FC13; Mon, 27 Feb 2012 13:57:14 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q1RDvEcO020620; Mon, 27 Feb 2012 13:57:14 GMT (envelope-from jchandra@svn.freebsd.org) Received: (from jchandra@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q1RDvEbh020615; Mon, 27 Feb 2012 13:57:14 GMT (envelope-from jchandra@svn.freebsd.org) Message-Id: <201202271357.q1RDvEbh020615@svn.freebsd.org> From: "Jayachandran C." Date: Mon, 27 Feb 2012 13:57:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r232210 - user/jchandra/xlp-merge/sys/dev/cfi X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Feb 2012 13:57:14 -0000 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 #include #include +#include #include #include #include @@ -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 *);