From owner-svn-src-all@FreeBSD.ORG Thu Mar 19 16:03:21 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 919BD1065674; Thu, 19 Mar 2009 16:03:21 +0000 (UTC) (envelope-from marius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7C07C8FC16; Thu, 19 Mar 2009 16:03:21 +0000 (UTC) (envelope-from marius@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n2JG3L2Q068123; Thu, 19 Mar 2009 16:03:21 GMT (envelope-from marius@svn.freebsd.org) Received: (from marius@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n2JG3LMw068119; Thu, 19 Mar 2009 16:03:21 GMT (envelope-from marius@svn.freebsd.org) Message-Id: <200903191603.n2JG3LMw068119@svn.freebsd.org> From: Marius Strobl Date: Thu, 19 Mar 2009 16:03:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r190077 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb sparc64/include sparc64/sparc64 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Mar 2009 16:03:22 -0000 Author: marius Date: Thu Mar 19 16:03:21 2009 New Revision: 190077 URL: http://svn.freebsd.org/changeset/base/190077 Log: MFC: r185008, r188456 - Allow the front-end to specify that iommu(4) should disable rerun of the streaming cache for silicon bug workarounds. - Announce the presence of a streaming cache on attach for informational purposes. - For performance reasons don't do unnecessary flushes of the streaming cache when coherent mappings are synced. - Fix some minor style issues. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/sparc64/include/bus_private.h stable/7/sys/sparc64/include/iommureg.h stable/7/sys/sparc64/include/iommuvar.h stable/7/sys/sparc64/sparc64/iommu.c Modified: stable/7/sys/sparc64/include/bus_private.h ============================================================================== --- stable/7/sys/sparc64/include/bus_private.h Thu Mar 19 15:59:29 2009 (r190076) +++ stable/7/sys/sparc64/include/bus_private.h Thu Mar 19 16:03:21 2009 (r190077) @@ -66,9 +66,10 @@ struct bus_dmamap { int dm_flags; /* (p) */ }; -/* Flag values. */ -#define DMF_LOADED 1 /* Map is loaded */ -#define DMF_COHERENT 2 /* Coherent mapping requested */ +/* Flag values */ +#define DMF_LOADED (1 << 0) /* Map is loaded. */ +#define DMF_COHERENT (1 << 1) /* Coherent mapping requested. */ +#define DMF_STREAMED (1 << 2) /* Streaming cache used. */ int sparc64_dma_alloc_map(bus_dma_tag_t dmat, bus_dmamap_t *mapp); void sparc64_dma_free_map(bus_dma_tag_t dmat, bus_dmamap_t map); Modified: stable/7/sys/sparc64/include/iommureg.h ============================================================================== --- stable/7/sys/sparc64/include/iommureg.h Thu Mar 19 15:59:29 2009 (r190076) +++ stable/7/sys/sparc64/include/iommureg.h Thu Mar 19 16:03:21 2009 (r190077) @@ -54,7 +54,7 @@ #define ISR_PGFLUSH 0x0008 /* streaming buffer page flush */ #define ISR_FLUSHSYNC 0x0010 /* streaming buffer flush sync */ -/* streaming buffer diagnostics registers. */ +/* streaming buffer diagnostics registers */ #define ISD_DATA_DIAG 0x0000 /* streaming buffer data RAM diag 0..127 */ #define ISD_ERROR_DIAG 0x0400 /* streaming buffer error status diag 0..127 */ #define ISD_PG_TAG_DIAG 0x0800 /* streaming buffer page tag diag 0..15 */ @@ -63,6 +63,7 @@ /* streaming buffer control register */ #define STRBUF_EN 0x0000000000000001UL #define STRBUF_D 0x0000000000000002UL +#define STRBUF_RR_DIS 0x0000000000000004UL #define IOMMU_MAXADDR(bits) ((1UL << (bits)) - 1) @@ -91,7 +92,7 @@ #define IOMMUCR_EN 0x0000000000000001UL /* - * Diagnostic register definitions. + * Diagnostic register definitions */ #define IOMMU_DTAG_VPNBITS 19 #define IOMMU_DTAG_VPNMASK ((1 << IOMMU_DTAG_VPNBITS) - 1) @@ -126,10 +127,10 @@ /* Writeable */ #define IOTTE_W 0x0000000000000002UL -/* log2 of the IOMMU TTE size. */ +/* log2 of the IOMMU TTE size */ #define IOTTE_SHIFT 3 -/* Streaming buffer line size. */ +/* Streaming buffer line size */ #define STRBUF_LINESZ 64 /* Modified: stable/7/sys/sparc64/include/iommuvar.h ============================================================================== --- stable/7/sys/sparc64/include/iommuvar.h Thu Mar 19 15:59:29 2009 (r190076) +++ stable/7/sys/sparc64/include/iommuvar.h Thu Mar 19 16:03:21 2009 (r190077) @@ -45,12 +45,12 @@ TAILQ_HEAD(iommu_maplruq_head, bus_dmamap); /* - * Per-IOMMU state. The parenthesized comments indicate the locking strategy: + * Per-IOMMU state; the parenthesized comments indicate the locking strategy: * i - protected by is_mtx. * r - read-only after initialization. * * - comment refers to pointer target / target hardware registers * (for bus_addr_t). - * is_maplruq is also locked by is_mtx. Elements of is_tsb may only be + * is_maplruq is also locked by is_mtx. Elements of is_tsb may only be * accessed from functions operating on the map owning the corresponding * resource, so the locking the user is required to do to protect the * map is sufficient. @@ -81,7 +81,7 @@ struct iommu_state { */ volatile char is_flush[STRBUF_FLUSHSYNC_NBYTES * 3 - 1]; - /* copies of our parents state, to allow us to be self contained */ + /* copies of our parent's state, to allow us to be self contained */ bus_space_tag_t is_bustag; /* (r) Our bus tag */ bus_space_handle_t is_bushandle; /* (r) */ bus_addr_t is_iommu; /* (r, *i) IOMMU registers */ @@ -96,6 +96,9 @@ struct iommu_state { bus_addr_t is_dva; /* (r, *r) */ /* Tag compare diagnostics access */ bus_addr_t is_dtcmp; /* (r, *r) */ + /* behavior flags */ + u_int is_flags; /* (r) */ +#define IOMMU_RERUN_DISABLE (1 << 0) }; /* interfaces for PCI/SBus code */ Modified: stable/7/sys/sparc64/sparc64/iommu.c ============================================================================== --- stable/7/sys/sparc64/sparc64/iommu.c Thu Mar 19 15:59:29 2009 (r190076) +++ stable/7/sys/sparc64/sparc64/iommu.c Thu Mar 19 16:03:21 2009 (r190077) @@ -119,8 +119,7 @@ __FBSDID("$FreeBSD$"); * - When running out of DVMA space, return EINPROGRESS in the non- * BUS_DMA_NOWAIT case and delay the callback until sufficient space * becomes available. - * - Use the streaming cache unless BUS_DMA_COHERENT is specified; do not - * flush the streaming cache when coherent mappings are synced. + * - Use the streaming cache unless BUS_DMA_COHERENT is specified. */ #include "opt_iommu.h" @@ -150,12 +149,12 @@ __FBSDID("$FreeBSD$"); #include /* - * Tuning constants. + * Tuning constants */ #define IOMMU_MAX_PRE (32 * 1024) #define IOMMU_MAX_PRE_SEG 3 -/* Threshold for using the streaming buffer. */ +/* Threshold for using the streaming buffer */ #define IOMMU_STREAM_THRESH 128 MALLOC_DEFINE(M_IOMMU, "dvmamem", "IOMMU DVMA Buffers"); @@ -309,9 +308,10 @@ iommu_init(const char *name, struct iomm is->is_dvmabase = IOTSB_VSTART(is->is_tsbsize); size = IOTSB_BASESZ << is->is_tsbsize; - printf("%s: DVMA map: %#lx to %#lx\n", name, + printf("%s: DVMA map: %#lx to %#lx%s\n", name, is->is_dvmabase, is->is_dvmabase + - (size << (IO_PAGE_SHIFT - IOTTE_SHIFT)) - 1); + (size << (IO_PAGE_SHIFT - IOTTE_SHIFT)) - 1, + IOMMU_HAS_SB(is) ? ", streaming buffer" : ""); /* * Set up resource mamangement. @@ -376,11 +376,13 @@ iommu_reset(struct iommu_state *is) for (i = 0; i < 2; i++) { if (is->is_sb[i] != 0) { - /* Enable diagnostics mode? */ - IOMMU_WRITE8(is, is_sb[i], ISR_CTL, STRBUF_EN); - - /* No streaming buffers? Disable them */ - if (IOMMU_READ8(is, is_sb[i], ISR_CTL) == 0) + IOMMU_WRITE8(is, is_sb[i], ISR_CTL, STRBUF_EN | + ((is->is_flags & IOMMU_RERUN_DISABLE) != 0 ? + STRBUF_RR_DIS : 0)); + + /* No streaming buffers? Disable them. */ + if ((IOMMU_READ8(is, is_sb[i], ISR_CTL) & + STRBUF_EN) == 0) is->is_sb[i] = 0; } } @@ -585,7 +587,7 @@ iommu_dvmamap_vunload(struct iommu_state struct bus_dmamap_res *r; int streamed = 0; - IS_LOCK_ASSERT(is); /* for iommu_strbuf_sync() below. */ + IS_LOCK_ASSERT(is); /* for iommu_strbuf_sync() below */ SLIST_FOREACH(r, &map->dm_reslist, dr_link) { streamed |= iommu_remove(is, BDR_START(r), r->dr_used); r->dr_used = 0; @@ -820,7 +822,7 @@ iommu_dvmamap_destroy(bus_dma_tag_t dt, } /* - * IOMMU DVMA operations, common to PCI and SBus. + * IOMMU DVMA operations, common to PCI and SBus */ static int iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is, @@ -831,8 +833,8 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t bus_size_t sgsize, esize; vm_offset_t vaddr, voffs; vm_paddr_t curaddr; - int error, sgcnt, firstpg, stream; pmap_t pmap = NULL; + int error, firstpg, sgcnt; KASSERT(buflen != 0, ("%s: buflen == 0!", __func__)); if (buflen > dt->dt_maxsize) @@ -853,7 +855,9 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t sgcnt = *segp; firstpg = 1; - stream = iommu_use_streaming(is, map, buflen); + map->dm_flags &= ~DMF_STREAMED; + map->dm_flags |= iommu_use_streaming(is, map, buflen) != 0 ? + DMF_STREAMED : 0; for (; buflen > 0; ) { /* * Get the physical address for this page. @@ -874,7 +878,7 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t vaddr += sgsize; iommu_enter(is, trunc_io_page(dvmaddr), trunc_io_page(curaddr), - stream, flags); + (map->dm_flags & DMF_STREAMED) != 0, flags); /* * Chop the chunk up into segments of at most maxsegsz, but try @@ -1139,7 +1143,7 @@ iommu_dvmamap_sync(bus_dma_tag_t dt, bus /* XXX This is probably bogus. */ if ((op & BUS_DMASYNC_PREREAD) != 0) membar(Sync); - if (IOMMU_HAS_SB(is) && + if ((map->dm_flags & DMF_STREAMED) != 0 && ((op & BUS_DMASYNC_POSTREAD) != 0 || (op & BUS_DMASYNC_PREWRITE) != 0)) { IS_LOCK(is);