freebsd-src/sys/arm
Mitchell Horne b134c10d65 busdma: fix page miscount for small segment sizes
For small segments (< PAGE_SIZE) there is a mismatch between how
required bounce pages are counted in _bus_dmamap_count_pages() and
bounce_bus_dmamap_load_buffer().

This problem has been observed on the RISC-V VisionFive v2 SoC (and
earlier revisions of the hardware) which has memory physically addressed
above 4GB. This requires some bouncing for the dwmmc driver, which has
has a maximum segment size of 2048 bytes. When attempting to load a
page-aligned 4-page buffer that requires bouncing, we can end up
counting 4 bounce pages for an 8-segment transfer. These pages will be
incorrectly configured to cover only the first half of the transfer (4 x
2048 bytes).

Fix the immediate issue by adding the maxsegsz check to
_bus_dmamap_count_pages(); this is what _bus_dmamap_count_phys() does
already. The result is that we will inefficiently allocate a separate
bounce page for each segment (8 pages for the example above), but the
transfer will proceed in its entirety.

The more complete fix is to address the shortcomings in how small
segments are assigned to bounce pages, so that we opportunistically
batch multiple segments to a page whenever they fit (e.g. two 2048 bytes
segments per 4096 page). This will be addressed more holistically in the
future. For now this change will prevent the (silent) incomplete
transfers that have been observed.

PR:		273694
Reported by:	Jari Sihvola <jsihv@gmx.com>
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D34118
2024-02-16 14:38:48 -04:00
..
allwinner intrng: Remove irq_root_ipicount and corresponding intr_pic_claim_root arg 2024-01-24 23:49:53 +00:00
altera/socfpga sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
annapurna/alpine sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
arm busdma: fix page miscount for small segment sizes 2024-02-16 14:38:48 -04:00
broadcom/bcm2835 intrng: Allow alternative IPI PICs to be registered and used 2024-01-24 23:49:54 +00:00
conf arm: Add EARLY_PRINTF and SOCDEV_PA/VA to NOTES 2024-02-13 11:48:53 +00:00
freescale clk: Move clock code in dev/clk 2024-01-10 19:20:26 +01:00
include arm: Clean up socdev_va 2024-02-13 11:48:52 +00:00
mv arm mv_pcib: Use bus_generic_rman_* 2024-01-23 09:37:30 -08:00
nvidia uart(4): Honor hardware state of NS8250-class for tsw_busy 2024-01-14 08:03:59 +01:00
qemu sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
qualcomm phy: Move phy code in dev/phy 2024-01-10 19:20:34 +01:00
rockchip clk: Move rockchip driver into the common directory 2024-01-10 19:20:22 +01:00
ti intrng: Remove irq_root_ipicount and corresponding intr_pic_claim_root arg 2024-01-24 23:49:53 +00:00
xilinx sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00