On Fri, Mar 1, 2024 at 2:51 PM Sam Protsenko <semen.protsenko@xxxxxxxxxx> wrote: > > On Thu, Feb 29, 2024 at 8:56 AM Arnd Bergmann <arnd@xxxxxxxx> wrote: > > > > On Thu, Feb 29, 2024, at 15:14, Naresh Kamboju wrote: > > > The arm64 WinLink E850-96 Board boot failed with 16K and 64K page size builds > > > Please find the below warning log on Linux next-20240229. > > > First noticed on the next-20240220 tag. > > > > > > This issue arises only when one of these Kconfig options is enabled. > > > CONFIG_ARM64_16K_PAGES=y > > > CONFIG_ARM64_64K_PAGES=y > > > > > > Reported-by: Linux Kernel Functional Testing <lkft@xxxxxxxxxx> > > > > > > Warning log: > > > ------- > > > [ 2.231008] mmc_host mmc0: Bus speed (slot 0) = 49968750Hz (slot > > > req 52000000Hz, actual 49968750HZ div = 0) > > > [ 2.231714] mmc_host mmc0: Bus speed (slot 0) = 399750000Hz (slot > > > req 200000000Hz, actual 199875000HZ div = 1) > > > [ 2.241961] mmc0: new HS400 Enhanced strobe MMC card at address 0001 > > > [ 2.249182] ------------[ cut here ]------------ > > > [ 2.252371] WARNING: CPU: 3 PID: 90 at block/blk-settings.c:204 > > > blk_validate_limits (block/blk-settings.c:204 (discriminator 1)) > > > > > > The warning was added with commit d690cb8ae14b ("block: add > > an API to atomically update queue limits") > > > > + if (!lim->max_segment_size) > > + lim->max_segment_size = BLK_MAX_SEGMENT_SIZE; > > + if (WARN_ON_ONCE(lim->max_segment_size < PAGE_SIZE)) > > + return -EINVAL; > > > > Whereas mmc_alloc_disk sets the limit as > > > > /* > > * Setting a virt_boundary implicity sets a max_segment_size, so try > > * to set the hardware one here. > > */ > > if (host->can_dma_map_merge) { > > lim.virt_boundary_mask = dma_get_merge_boundary(mmc_dev(host)); > > lim.max_segments = MMC_DMA_MAP_MERGE_SEGMENTS; > > } else { > > lim.max_segment_size = > > round_down(host->max_seg_size, lim.logical_block_size); > > lim.max_segments = host->max_segs; > > } > > > > and max_seg_size gets initialized to either one less > > than 64k, or to exactly 4k in the dwmmc driver here: > > > > /* Useful defaults if platform data is unset. */ > > if (host->use_dma == TRANS_MODE_IDMAC) { > > mmc->max_segs = host->ring_size; > > mmc->max_blk_size = 65535; > > Changing this value here to PAGE_SIZE (instead of 65535) makes E850-96 > functional again (tested with CONFIG_ARM64_16K_PAGES=y). I'm sure this > is just a quick hack, but maybe it can be helpful in further analysis. > If anybody wants me to run some tests on E850-96 -- please let me > know. > Sorry, just noticed I commented on the wrong line. Here is the change I made: - mmc->max_seg_size = 0x1000; + mmc->max_seg_size = PAGE_SIZE; for (host->use_dma == TRANS_MODE_IDMAC) case. > [snip]