Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 May 2009 13:55:26 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-current@freebsd.org
Cc:        Piotr =?utf-8?q?Zi=C4=99cik?= <kosmo@semihalf.com>
Subject:   Re: Generic ATA driver DMA coherency issues
Message-ID:  <200905271355.28791.jhb@freebsd.org>
In-Reply-To: <200905271253.06693.kosmo@semihalf.com>
References:  <200905271253.06693.kosmo@semihalf.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday 27 May 2009 6:53:06 am Piotr Zi=C4=99cik wrote:
> While working on bring-up SATA on ARM SoC I had issues with DMA memory=20
> coherency. After tracing, I have found problem in generic ATA code=20
behaviour.
>=20
> The ATA generic driver allocates 64k DMA workspace memory which can be=20
> optionally used by ATA chipset drivers. Currently only ata-ahci,=20
ata-marvell,=20
> ata-promise and ata-siliconimage relies on this feature. In general, the=
=20
> drivers use preallocated DMA workspace to hold small request descriptors,=
=20
> consumed by hardware.
>=20
> All of these drivers do not synchronize workspace with bus_dmamap_sync().=
=20
They=20
> assumes that DMA workspace is coherent. However ATA driver neither enforc=
es=20
> coherency by using BUS_DMA_COHERENT flag nor synchronizes the workspace w=
ith=20
> bus_dmamap_sync().
>=20
> I have fixed my problem by adding BUS_DMA_COHERENT flag to workspace=20
> allocation code:
>=20
> diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c
> index ab4c3c8..71ee41b 100644
> --- a/sys/dev/ata/ata-dma.c
> +++ b/sys/dev/ata/ata-dma.c
> @@ -95,8 +95,8 @@ ata_dmainit(device_t dev)
>                            0, NULL, NULL, &ch->dma.work_tag))
>         goto error;
>=20
> -    if (bus_dmamem_alloc(ch->dma.work_tag, (void **)&ch->dma.work, 0,
> -                        &ch->dma.work_map))
> +    if (bus_dmamem_alloc(ch->dma.work_tag, (void **)&ch->dma.work,
> +                        BUS_DMA_COHERENT, &ch->dma.work_map))
>         goto error;
>=20
>      if (bus_dmamap_load(ch->dma.work_tag, ch->dma.work_map, ch->dma.work,
>=20
> The question is about multiplatform impact of this change. Especially I a=
m=20
> curious how everything works without any problems on i386.

The flag has no effect on x86.

=2D-=20
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905271355.28791.jhb>