git: 07c5a2486cc6 - stable/14 - hyperv/storvsc: Fix busdma constraints

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Tue, 15 Apr 2025 02:25:34 UTC
The branch stable/14 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=07c5a2486cc6f8e64715b5d7c31ccfa02f9f3745

commit 07c5a2486cc6f8e64715b5d7c31ccfa02f9f3745
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-03-31 10:45:14 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-04-15 02:25:24 +0000

    hyperv/storvsc: Fix busdma constraints
    
    - The BUS_DMA_KEEP_PG_OFFSET flag is needed, since
      storvsc_xferbuf_prepare() assumes that only the first segment may have
      a non-zero offset, and that all following segments are page-sized and
      -aligned.
    - storvsc_xferbuf_prepare() handles 64-bit bus addresses, so avoid
      unneeded bouncing on i386.
    
    PR:             285681
    Reported by:    dim
    Tested by:      dim, whu
    MFC after:      2 weeks
    
    (cherry picked from commit a319ba694538a38429115aaaf1d4b3946ea3a8b5)
---
 sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
index d7e7bd85ae29..076b436a2191 100644
--- a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
+++ b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
@@ -954,13 +954,18 @@ storvsc_init_requests(device_t dev)
 		bus_get_dma_tag(dev),		/* parent */
 		1,				/* alignment */
 		PAGE_SIZE,			/* boundary */
+#if defined(__i386__) && defined(PAE)
+		BUS_SPACE_MAXADDR_48BIT,	/* lowaddr */
+		BUS_SPACE_MAXADDR_48BIT,	/* highaddr */
+#else
 		BUS_SPACE_MAXADDR,		/* lowaddr */
 		BUS_SPACE_MAXADDR,		/* highaddr */
+#endif
 		NULL, NULL,			/* filter, filterarg */
 		STORVSC_DATA_SIZE_MAX,		/* maxsize */
 		STORVSC_DATA_SEGCNT_MAX,	/* nsegments */
 		STORVSC_DATA_SEGSZ_MAX,		/* maxsegsize */
-		0,				/* flags */
+		BUS_DMA_KEEP_PG_OFFSET,		/* flags */
 		NULL,				/* lockfunc */
 		NULL,				/* lockfuncarg */
 		&sc->storvsc_req_dtag);