[PATCH] arm: Improve MMC performance on Versatile Express

Sergei Shtylyov sshtylyov at mvista.com
Fri Jan 21 10:09:44 EST 2011


Hello.

Pawel Moll wrote:

> VE suffers from serious problem with MMC transfers - low performance,
> errors when other IO peripherals (especially USB) are used at the
> same time etc.

> It all boils down to the MMC controller short FIFO and - in result -
> timing constrains. The most problematic case - USB driver hogging
> CPU and MMC FIFO under/overruns in the result - can be mitigated on
> SMP system by distributing interrupts handling for these peripherals
> between cores.

> With this, the MMC card clock can be safely (at least it looks like
> it) increased to 1.5MHz, improving performance.

> Signed-off-by: Pawel Moll <pawel.moll at arm.com>
> ---
>  arch/arm/mach-vexpress/v2m.c |   14 ++++++++++++++
>  1 files changed, 14 insertions(+), 0 deletions(-)

> diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c
> index 4b5af01..300ac72 100644
> --- a/arch/arm/mach-vexpress/v2m.c
> +++ b/arch/arm/mach-vexpress/v2m.c
[...]
>  static AMBA_DEVICE(aaci,  "mb:aaci",  V2M_AACI, NULL);
> @@ -391,6 +392,19 @@ static void __init v2m_init(void)
>  	for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++)
>  		amba_device_register(v2m_amba_devs[i], &iomem_resource);
>  
> +	/* WARNING: HACK HACK HACK!
> +	 *
> +	 * MMCI cell has very tight timing requirements regarding interrupt
> +	 * handling (fractions of millisecond), while the USB host controller
> +	 * interrupt handler can hog the CPU for more then 1 millisecond!
> +	 *
> +	 * To mitigate the problem on SMP systems, we can set CPU affinities
> +	 * of these interrupts to different cores... */

    The preferred style for the mutli-line comments is this:

/*
  * bla
  * bla
  */

    You were close. :-)

> +	BUG_ON(v2m_usb_resources[1].flags != IORESOURCE_IRQ);
> +	irq_set_affinity(v2m_usb_resources[1].start, cpumask_of(0));
> +	irq_set_affinity(mmci_device.irq[0], cpumask_of(1));
> +	irq_set_affinity(mmci_device.irq[1], cpumask_of(1));
> +
>  	pm_power_off = v2m_power_off;
>  	arm_pm_restart = v2m_restart;

WBR, Sergei



More information about the linux-arm-kernel mailing list