Re: WinLink E850-96: WARNING: at block/blk-settings.c:204 blk_validate_limits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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]





[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux