It looks like consistent_sync() is off by one on arm as the dmac
functions are being called with start and end instead of start and length.
Also posted to linux-arm-kernel mailing list:
http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2005-November/032037.html
 void consistent_sync(void *vaddr, size_t size, int direction)
 {
        unsigned long start = (unsigned long)vaddr;
-       unsigned long end   = start + size;
+       unsigned long end   = start + size - 1;
 
        switch (direction) {
        case DMA_FROM_DEVICE:           /* invalidate only */