From owner-dev-commits-src-main@freebsd.org Wed Feb 24 23:26:41 2021 Return-Path: Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 8B5BA54C835; Wed, 24 Feb 2021 23:26:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4DmBrd2qL0z4mT4; Wed, 24 Feb 2021 23:26:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4FBF8519E; Wed, 24 Feb 2021 23:26:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 11ONQf6V073135; Wed, 24 Feb 2021 23:26:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 11ONQfWA073134; Wed, 24 Feb 2021 23:26:41 GMT (envelope-from git) Date: Wed, 24 Feb 2021 23:26:41 GMT Message-Id: <202102242326.11ONQfWA073134@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Marcin Wojtas Subject: git: 6dd69f0064f1 - main - iflib: introduce isc_dma_width MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mw X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6dd69f0064f1e54671cdb46ce5975a332fb761e8 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for the main branch of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Feb 2021 23:26:41 -0000 The branch main has been updated by mw: URL: https://cgit.FreeBSD.org/src/commit/?id=6dd69f0064f1e54671cdb46ce5975a332fb761e8 commit 6dd69f0064f1e54671cdb46ce5975a332fb761e8 Author: Marcin Wojtas AuthorDate: 2021-02-24 22:56:45 +0000 Commit: Marcin Wojtas CommitDate: 2021-02-24 23:25:39 +0000 iflib: introduce isc_dma_width Some DMA controllers are unable to address the full host memory space and are instead limited to a subset of address range (e.g. 48-bit). Allow the driver to specify the maximum allowed DMA addressing width (in bits) for the NIC hardware, by introducing a new field in if_softc_ctx. If said field is omitted (set to 0), the lowaddr of DMA window bounds defaults to BUS_SPACE_MAXADDR. Submitted by: Artur Rojek Obtained from: Semihalf Sponsored by: Amazon, Inc. Differential Revision: https://reviews.freebsd.org/D28706 --- sys/net/iflib.c | 23 +++++++++++++++++++---- sys/net/iflib.h | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/sys/net/iflib.c b/sys/net/iflib.c index 5366b652373d..6fd0ee3751f0 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -1389,15 +1389,22 @@ _iflib_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err) *(bus_addr_t *) arg = segs[0].ds_addr; } +#define DMA_WIDTH_TO_BUS_LOWADDR(width) \ + (((width) == 0) || (width) == flsl(BUS_SPACE_MAXADDR) ? \ + BUS_SPACE_MAXADDR : (1ULL << (width)) - 1ULL) + int iflib_dma_alloc_align(if_ctx_t ctx, int size, int align, iflib_dma_info_t dma, int mapflags) { int err; device_t dev = ctx->ifc_dev; + bus_addr_t lowaddr; + + lowaddr = DMA_WIDTH_TO_BUS_LOWADDR(ctx->ifc_softc_ctx.isc_dma_width); err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ align, 0, /* alignment, bounds */ - BUS_SPACE_MAXADDR, /* lowaddr */ + lowaddr, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ size, /* maxsize */ @@ -1648,6 +1655,7 @@ iflib_txsd_alloc(iflib_txq_t txq) if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; device_t dev = ctx->ifc_dev; bus_size_t tsomaxsize; + bus_addr_t lowaddr; int err, nsegments, ntsosegments; bool tso; @@ -1664,12 +1672,14 @@ iflib_txsd_alloc(iflib_txq_t txq) MPASS(sctx->isc_tso_maxsize >= tsomaxsize); } + lowaddr = DMA_WIDTH_TO_BUS_LOWADDR(scctx->isc_dma_width); + /* * Set up DMA tags for TX buffers. */ if ((err = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, /* alignment, bounds */ - BUS_SPACE_MAXADDR, /* lowaddr */ + lowaddr, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ sctx->isc_tx_maxsize, /* maxsize */ @@ -1687,7 +1697,7 @@ iflib_txsd_alloc(iflib_txq_t txq) tso = (if_getcapabilities(ctx->ifc_ifp) & IFCAP_TSO) != 0; if (tso && (err = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, /* alignment, bounds */ - BUS_SPACE_MAXADDR, /* lowaddr */ + lowaddr, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ tsomaxsize, /* maxsize */ @@ -1889,18 +1899,21 @@ iflib_rxsd_alloc(iflib_rxq_t rxq) if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; device_t dev = ctx->ifc_dev; iflib_fl_t fl; + bus_addr_t lowaddr; int err; MPASS(scctx->isc_nrxd[0] > 0); MPASS(scctx->isc_nrxd[rxq->ifr_fl_offset] > 0); + lowaddr = DMA_WIDTH_TO_BUS_LOWADDR(scctx->isc_dma_width); + fl = rxq->ifr_fl; for (int i = 0; i < rxq->ifr_nfl; i++, fl++) { fl->ifl_size = scctx->isc_nrxd[rxq->ifr_fl_offset]; /* this isn't necessarily the same */ /* Set up DMA tag for RX buffers. */ err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ 1, 0, /* alignment, bounds */ - BUS_SPACE_MAXADDR, /* lowaddr */ + lowaddr, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ sctx->isc_rx_maxsize, /* maxsize */ @@ -4748,6 +4761,8 @@ iflib_device_register(device_t dev, void *sc, if_shared_ctx_t sctx, if_ctx_t *ct _iflib_pre_assert(scctx); ctx->ifc_txrx = *scctx->isc_txrx; + MPASS(scctx->isc_dma_width <= flsl(BUS_SPACE_MAXADDR)); + if (sctx->isc_flags & IFLIB_DRIVER_MEDIA) ctx->ifc_mediap = scctx->isc_media; diff --git a/sys/net/iflib.h b/sys/net/iflib.h index a30740e67b6e..95305850f7d3 100644 --- a/sys/net/iflib.h +++ b/sys/net/iflib.h @@ -236,6 +236,8 @@ typedef struct if_softc_ctx { int isc_disable_msix; if_txrx_t isc_txrx; struct ifmedia *isc_media; + bus_size_t isc_dma_width; /* device dma width in bits, 0 means + use BUS_SPACE_MAXADDR instead */ } *if_softc_ctx_t; /*