Discussion:
question about block layer and dma alignment issue.
Oleksij Rempel
2014-10-07 09:37:45 UTC
Permalink
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.
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?
--
Regards,
Oleksij
Jens Axboe
2014-10-07 15:25:36 UTC
Permalink
Post by Oleksij Rempel
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.
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
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?
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.
--
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Oleksij Rempel
2014-10-08 06:50:02 UTC
Permalink
Post by Jens Axboe
Post by Oleksij Rempel
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.
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
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?
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.
--
Regards,
Oleksij
Adrian Hunter
2014-10-16 14:31:54 UTC
Permalink
Post by Oleksij Rempel
Post by Jens Axboe
Post by Oleksij Rempel
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.
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
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?
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.
Post by Oleksij Rempel
Ok,
i will need to setup testing board for this kind of work. It will take
some time.
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Loading...