Skip to contentSkip to conversation

question about block layer and dma alignment issue.

DISCUSSION Oleksij Rempel 3 participants 4 messages Oct 7, 2014 – Oct 16, 2014 2 messages not in the archive MMC, SD and SDIO

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw

Am 04.10.2014 um 19:00 schrieb Jens Axboe:

Quoted 14 lines · Oleksij Rempel
Quoted 12 lines

Hello Jens,

i hope it is OK to ask you directly, i didn't found better way to do this.
I'm writing MMC driver based on reverse engineering for au6601 mmc controller. This driver uses MMC API, and last one trying to use BLK API as directly as possible. So far so gut, but i have a problem by using SG requests with DMA without conversation. This controller accepts only addresses with this mask 0xffff.f000 - also page aligned. Till now i tried different QUEUE_FLAG_ flags and blk_queue settings, but i never had absolute aligned quarantine.
Please tell me if i do some thing wrong or go in the wrong direction.

Quoted 4 lines

Unless you can accept a 4kb hardware block size (and I'm assuming you cannot, since you need to support 512b file systems?), then you'd have to bounce the requests that don't align properly. You can fix some of them by setting blk_queue_dma_alignment(q, 4095).

I needed to include MMC list with Ulf Hansson at the beginning, so here we are.

Hi Ulf,

here is the list of drivers which do care about dma alignment . Some of them use bounce_buffer, some will use PIO instead of DMA, for not aligned requests:

dw_mmc.c: dw_mci_pre_dma_transfer
wbsd.c
usdhi6rol0.c
tmio_mmc_dma.c
sunxi-mmc.c
sdhci.c
pxamci.c
mvsdio.c
au6601.c(not upstream jet)

The problem of all this driver is that each of them use own solution. I think this code can be moved to some common place. For example, it can be done in drivers/mmc/card/queue.c and enabled by mmc_host_dma_alignment variable. Or provide a mmc_sg_align() function, which should be called explicatively by driver.

Which option is preferable?

Signature · 2 lines
Regards,
Oleksij
#3 lore raw
Quoted 39 lines · Oleksij Rempel

Am 04.10.2014 um 19:00 schrieb Jens Axboe:

Quoted 14 lines · Oleksij Rempel
Quoted 12 lines

Hello Jens,

i hope it is OK to ask you directly, i didn't found better way to do this.
I'm writing MMC driver based on reverse engineering for au6601 mmc controller. This driver uses MMC API, and last one trying to use BLK API as directly as possible. So far so gut, but i have a problem by using SG requests with DMA without conversation. This controller accepts only addresses with this mask 0xffff.f000 - also page aligned. Till now i tried different QUEUE_FLAG_ flags and blk_queue settings, but i never had absolute aligned quarantine.
Please tell me if i do some thing wrong or go in the wrong direction.

Quoted 4 lines

Unless you can accept a 4kb hardware block size (and I'm assuming you cannot, since you need to support 512b file systems?), then you'd have to bounce the requests that don't align properly. You can fix some of them by setting blk_queue_dma_alignment(q, 4095).

I needed to include MMC list with Ulf Hansson at the beginning, so here we are.

Hi Ulf,

here is the list of drivers which do care about dma alignment . Some of them use bounce_buffer, some will use PIO instead of DMA, for not aligned requests:

dw_mmc.c: dw_mci_pre_dma_transfer
wbsd.c
usdhi6rol0.c
tmio_mmc_dma.c
sunxi-mmc.c
sdhci.c
pxamci.c
mvsdio.c
au6601.c(not upstream jet)

Quoted 7 lines

The problem of all this driver is that each of them use own solution. I think this code can be moved to some common place. For example, it can be done in drivers/mmc/card/queue.c and enabled by mmc_host_dma_alignment variable. Or provide a mmc_sg_align() function, which should be called explicatively by driver.

Which option is preferable?

I would roll a block version that they all can use, you can look at block/bounce.c for inspiration. That file deals with bouncing higher pages to lower memory, so it's not exactly what you want. But the metod of allocating a new bio that meets criteria and copying data over, that is the same that you need.

Signature · 1 line
Jens Axboe
#4 lore raw

Am 07.10.2014 um 17:25 schrieb Jens Axboe:

Quoted 46 lines · Oleksij Rempel
Quoted 45 lines

Am 04.10.2014 um 19:00 schrieb Jens Axboe:

Quoted 14 lines · Oleksij Rempel
Quoted 12 lines

Hello Jens,

i hope it is OK to ask you directly, i didn't found better way to do this.
I'm writing MMC driver based on reverse engineering for au6601 mmc controller. This driver uses MMC API, and last one trying to use BLK API as directly as possible. So far so gut, but i have a problem by using SG requests with DMA without conversation. This controller accepts only addresses with this mask 0xffff.f000 - also page aligned. Till now i tried different QUEUE_FLAG_ flags and blk_queue settings, but i never had absolute aligned quarantine.
Please tell me if i do some thing wrong or go in the wrong direction.

Quoted 4 lines

Unless you can accept a 4kb hardware block size (and I'm assuming you cannot, since you need to support 512b file systems?), then you'd have to bounce the requests that don't align properly. You can fix some of them by setting blk_queue_dma_alignment(q, 4095).

I needed to include MMC list with Ulf Hansson at the beginning, so here we are.

Hi Ulf,

here is the list of drivers which do care about dma alignment . Some of them use bounce_buffer, some will use PIO instead of DMA, for not aligned requests:

dw_mmc.c: dw_mci_pre_dma_transfer
wbsd.c
usdhi6rol0.c
tmio_mmc_dma.c
sunxi-mmc.c
sdhci.c
pxamci.c
mvsdio.c
au6601.c(not upstream jet)

The problem of all this driver is that each of them use own solution. I think this code can be moved to some common place. For example, it can be done in drivers/mmc/card/queue.c and enabled by mmc_host_dma_alignment variable. Or provide a mmc_sg_align() function, which should be called explicatively by driver.

Quoted 7 lines
Quoted 1 line

Which option is preferable?

I would roll a block version that they all can use, you can look at block/bounce.c for inspiration. That file deals with bouncing higher pages to lower memory, so it's not exactly what you want. But the metod of allocating a new bio that meets criteria and copying data over, that is the same that you need.

Ok,

i will need to setup testing board for this kind of work. It will take some time.

Signature · 2 lines
Regards,
Oleksij
#5 lore raw
Quoted 51 lines · Oleksij Rempel

Am 07.10.2014 um 17:25 schrieb Jens Axboe:

Quoted 50 lines · Oleksij Rempel
Quoted 37 lines

Am 04.10.2014 um 19:00 schrieb Jens Axboe:

Quoted 13 lines · Oleksij Rempel
Quoted 12 lines

Hello Jens,

i hope it is OK to ask you directly, i didn't found better way to do this.
I'm writing MMC driver based on reverse engineering for au6601 mmc controller. This driver uses MMC API, and last one trying to use BLK API as directly as possible. So far so gut, but i have a problem by using SG requests with DMA without conversation. This controller accepts only addresses with this mask 0xffff.f000 - also page aligned. Till now i tried different QUEUE_FLAG_ flags and blk_queue settings, but i never had absolute aligned quarantine.
Please tell me if i do some thing wrong or go in the wrong direction.

Quoted 4 lines

Unless you can accept a 4kb hardware block size (and I'm assuming you cannot, since you need to support 512b file systems?), then you'd have to bounce the requests that don't align properly. You can fix some of them by setting blk_queue_dma_alignment(q, 4095).

I needed to include MMC list with Ulf Hansson at the beginning, so here we are.

Hi Ulf,

here is the list of drivers which do care about dma alignment . Some of them use bounce_buffer, some will use PIO instead of DMA, for not aligned requests:

dw_mmc.c: dw_mci_pre_dma_transfer
wbsd.c
usdhi6rol0.c
tmio_mmc_dma.c
sunxi-mmc.c
sdhci.c
pxamci.c
mvsdio.c
au6601.c(not upstream jet)

Quoted 7 lines

The problem of all this driver is that each of them use own solution. I think this code can be moved to some common place. For example, it can be done in drivers/mmc/card/queue.c and enabled by mmc_host_dma_alignment variable. Or provide a mmc_sg_align() function, which should be called explicatively by driver.

Which option is preferable?

I would roll a block version that they all can use, you can look at block/bounce.c for inspiration. That file deals with bouncing higher pages to lower memory, so it's not exactly what you want. But the metod of allocating a new bio that meets criteria and copying data over, that is the same that you need.

Not all cards are block devices e.g. SDIO wifi. And there is also mmc_test.

Quoted 5 lines

Ok,

i will need to setup testing board for this kind of work. It will take some time.