Re: [PATCH] mmc: bcm2835: DMA mapping improvements

Robin Murphy <[email protected]> Mon, 13 Jul 2026 13:19:10 +0100
Newsgroups org.kernel.vger.linux-mmc
Message-ID <[email protected]>
On 13/07/2026 12:25 pm, Ulf Hansson wrote:
[...]
>> @@ -1281,10 +1279,8 @@ static int bcm2835_add_host(struct bcm2835_host *host)
>>
>>          if (!host->dma_chan_rxtx) {
>>                  dev_warn(dev, "unable to initialise DMA channel. Falling back to PIO\n");
>> -               host->use_dma = false;
>> +               host->dma_dev = NULL;
>>          } else {
>> -               host->use_dma = true;
>> -
>>                  host->dma_cfg_tx.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
>>                  host->dma_cfg_tx.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
>>                  host->dma_cfg_tx.direction = DMA_MEM_TO_DEV;
>> @@ -1300,12 +1296,18 @@ static int bcm2835_add_host(struct bcm2835_host *host)
>>                  if (dmaengine_slave_config(host->dma_chan_rxtx,
>>                                             &host->dma_cfg_tx) != 0 ||
>>                      dmaengine_slave_config(host->dma_chan_rxtx,
>> -                                          &host->dma_cfg_rx) != 0)
>> -                       host->use_dma = false;
>> +                                          &host->dma_cfg_rx) != 0) {

Hang on, doesn't this whole if condition need to be inverted? It's true 
upon dma config _failure_, thanks to the original use_dma logic being a 
bit backwards here.

Thanks,
Robin.

>> +                       host->dma_dev =
>> +                               dmaengine_get_dma_device(host->dma_chan_rxtx);
>> +               }
>>          }
>>
>>          mmc->max_segs = 128;
>> -       mmc->max_req_size = min_t(size_t, 524288, dma_max_mapping_size(dev));
>> +       mmc->max_req_size = 524288;
>> +       if (host->dma_dev) {
>> +               mmc->max_req_size = min_t(size_t, mmc->max_req_size,
>> +                               dma_max_mapping_size(host->dma_dev));
>> +       }
>>          mmc->max_seg_size = mmc->max_req_size;
>>          mmc->max_blk_size = 1024;
>>          mmc->max_blk_count =  65535;
>> @@ -1336,10 +1338,10 @@ static int bcm2835_add_host(struct bcm2835_host *host)
>>          }
>>
>>          pio_limit_string[0] = '\0';
>> -       if (host->use_dma && (PIO_THRESHOLD > 0))
>> +       if (host->dma_dev && (PIO_THRESHOLD > 0))
>>                  sprintf(pio_limit_string, " (>%d)", PIO_THRESHOLD);
>>          dev_info(dev, "loaded - DMA %s%s\n",
>> -                host->use_dma ? "enabled" : "disabled", pio_limit_string);
>> +                host->dma_dev ? "enabled" : "disabled", pio_limit_string);
>>
>>          return 0;
>>   }
>> --
>> 2.43.7
>>