DMA issues w/ via82cxxx (OQO 02)

From: Karim Yaghmour
Date: Mon Mar 10 2008 - 19:09:00 EST


----- KRYPTIVA PACKAGED MESSAGE -----
PACKAGING TYPE: SIGNED

I've been working on getting a decent Linux install working on the
OQO 02 for a few weeks. I ran into quite a few issues but have been
able to overcome most (like getting the OQO to display nice on a
DVI monitor ...); except for some DMA issues which I'd prefer
getting some advice over before I play around.

Unlike the 01, which was based on the Transmeta chip, the 02 is
based on a VIA C7M ULV (1.5GHz or 1.6Ghz depending on config) and
uses the CX700 as an all-in-one video/sound/IDE chip:
http://www.via.com.tw/en/products/chipsets/c-series/cx700/#blkdiagram
Overall it's a pretty decent device.

Getting a standard distro to work on it was a challenge. Ubuntu 7.10
won't install. For some reason the kernel doesn't like the hardware
too much (it hangs.) 7.04 does install, but it's got DMA issues. So
what I did was install 7.04 and "update" to 7.10 but use the 7.04
kernel until I got a 2.6.24.3 going. There's an unofficial patch
from OQO to solve the DMA issues with Linux which I ported to
2.6.24.3:
http://www.oqo.com/unsupported/linux/cx700-dma.patch
Full unofficial instructions here:
http://www.oqo.com/unsupported/linux/

Without this patch, the kernel continuously gets DMA timeouts. With
the patch, it works fine ... for a while. After a certain amount of
random time, some DMA timeouts will happen. Sometimes they are
relatively isolated. Other times, once they start they won't stop.
I've included samples at the bottom of this email.

Standard diagnostics on the disk show that it's fine, but somehow
the IDE controller is flaky. According to the following posts it
would seem that some hardware is slow to respond and the IDE code
gets "impatient":
http://lkml.org/lkml/2005/5/25/221
http://lkml.org/lkml/2005/5/26/176
Not sure whether the disk's slow RPM (4200) could be a factor in
the case of the OQO 02.

So I'm wondering if somebody could point me in the right direction.
Clearly the patch works for some time (i.e. no DMA timeouts) and
then timeouts start happening, possibly under heavy disk load. Is
there anything I could tweak to help or is this really a case of
unsupported hardware?

Any help would be greatly appreciated. Thanks,

Karim Yaghmour
Founder and CEO
Kryptiva inc.


Sample DMA errors (some reboots in between):
--------------------------------------------
Mar 3 09:27:22 localhost kernel: [ 3286.574721] hdc: dma_timer_expiry: dma status == 0x20
Mar 3 09:27:22 localhost kernel: [ 3286.574755] hdc: DMA timeout retry
Mar 3 09:27:22 localhost kernel: [ 3286.574770] hdc: timeout waiting for DMA
Mar 3 09:27:37 localhost kernel: [ 3292.347888] hdc: status timeout: status=0xd0 { Busy }
Mar 3 09:27:37 localhost kernel: [ 3292.347922] ide: failed opcode was: unknown
Mar 3 09:27:37 localhost kernel: [ 3292.347980] hdc: no DRQ after issuing MULTWRITE
Mar 3 09:27:38 localhost kernel: [ 3292.577621] ide1: reset: success
Mar 3 09:28:12 localhost kernel: [ 3305.208017] hdc: status timeout: status=0xd0 { Busy }
Mar 3 09:28:12 localhost kernel: [ 3305.208050] ide: failed opcode was: unknown
Mar 3 09:28:12 localhost kernel: [ 3305.208108] hdc: no DRQ after issuing MULTWRITE
Mar 3 09:28:13 localhost kernel: [ 3305.530337] ide1: reset: success
...
Mar 3 13:07:25 localhost kernel: [ 9202.335387] hdc: dma_timer_expiry: dma status == 0x20
Mar 3 13:07:25 localhost kernel: [ 9202.335419] hdc: DMA timeout retry
Mar 3 13:07:25 localhost kernel: [ 9202.335434] hdc: timeout waiting for DMA
Mar 3 13:07:25 localhost kernel: [ 9202.451339] hdc: status timeout: status=0xd0 { Busy }
Mar 3 13:07:25 localhost kernel: [ 9202.451363] ide: failed opcode was: unknown
Mar 3 13:07:25 localhost kernel: [ 9202.451420] hdc: no DRQ after issuing MULTWRITE
Mar 3 13:07:26 localhost kernel: [ 9202.707746] ide1: reset: success
Mar 3 13:07:35 localhost kernel: [ 2301.996646] hdc: status timeout: status=0xd0 { Busy }
Mar 3 13:07:35 localhost kernel: [ 2301.996658] ide: failed opcode was: unknown
Mar 3 13:07:35 localhost kernel: [ 2301.997984] hdc: no DRQ after issuing MULTWRITE
Mar 3 13:07:35 localhost kernel: [ 2302.044409] ide1: reset: success
Mar 3 13:07:36 localhost kernel: [ 2302.164272] hdc: status timeout: status=0xd0 { Busy }
Mar 3 13:07:36 localhost kernel: [ 2302.164282] ide: failed opcode was: unknown
Mar 3 13:07:36 localhost kernel: [ 2302.164317] hdc: no DRQ after issuing MULTWRITE
Mar 3 13:07:36 localhost kernel: [ 2302.691800] ide1: reset: success
...
Mar 4 01:27:41 localhost kernel: [18212.360790] hdc: dma_timer_expiry: dma status == 0x20
Mar 4 01:27:41 localhost kernel: [18212.360824] hdc: DMA timeout retry
Mar 4 01:27:41 localhost kernel: [18212.360840] hdc: timeout waiting for DMA
Mar 4 01:28:51 localhost kernel: [18300.035293] hdc: dma_timer_expiry: dma status == 0x20
Mar 4 01:28:51 localhost kernel: [18300.035327] hdc: DMA timeout retry
Mar 4 01:28:51 localhost kernel: [18300.035343] hdc: timeout waiting for DMA
Mar 4 01:50:07 localhost kernel: [20852.223010] hdc: dma_timer_expiry: dma status == 0x20
Mar 4 01:50:07 localhost kernel: [20852.223045] hdc: DMA timeout retry
Mar 4 01:50:07 localhost kernel: [20852.223061] hdc: timeout waiting for DMA
...
Mar 4 14:29:30 localhost kernel: [ 379.409774] hdc: dma_timer_expiry: dma status == 0x20
Mar 4 14:29:30 localhost kernel: [ 379.409788] hdc: DMA timeout retry
Mar 4 14:29:30 localhost kernel: [ 379.409792] hdc: timeout waiting for DMA
Mar 4 14:29:30 localhost kernel: [ 379.410047] hdc: status error: status=0x51 { DriveReady SeekComplete Error }
Mar 4 14:29:30 localhost kernel: [ 379.410056] hdc: status error: error=0x04 { DriveStatusError }
Mar 4 14:29:30 localhost kernel: [ 379.410063] ide: failed opcode was: unknown
Mar 4 14:29:30 localhost kernel: [ 379.410070] hdc: no DRQ after issuing MULTWRITE
Mar 4 14:29:30 localhost kernel: [ 379.421243] hdc: status error: status=0x51 { DriveReady SeekComplete Error }
Mar 4 14:29:30 localhost kernel: [ 379.421251] hdc: status error: error=0x04 { DriveStatusError }
Mar 4 14:29:30 localhost kernel: [ 379.421258] ide: failed opcode was: unknown
Mar 4 14:29:30 localhost kernel: [ 379.421264] hdc: no DRQ after issuing MULTWRITE
Mar 4 14:29:30 localhost kernel: [ 379.432579] hdc: status error: status=0x51 { DriveReady SeekComplete Error }
Mar 4 14:29:30 localhost kernel: [ 379.432588] hdc: status error: error=0x04 { DriveStatusError }
Mar 4 14:29:30 localhost kernel: [ 379.432594] ide: failed opcode was: unknown
Mar 4 14:29:30 localhost kernel: [ 379.432600] hdc: no DRQ after issuing MULTWRITE
Mar 4 14:29:30 localhost kernel: [ 379.446502] hdc: status error: status=0x51 { DriveReady SeekComplete Error }
Mar 4 14:29:30 localhost kernel: [ 379.446510] hdc: status error: error=0x04 { DriveStatusError }
Mar 4 14:29:30 localhost kernel: [ 379.446517] ide: failed opcode was: unknown
Mar 4 14:29:30 localhost kernel: [ 379.446546] hdc: no DRQ after issuing MULTWRITE
Mar 4 14:29:30 localhost kernel: [ 379.488369] ide1: reset: success
...
Mar 4 20:17:21 localhost kernel: [ 1229.078076] hdc: dma_timer_expiry: dma status == 0x24
Mar 4 20:17:31 localhost kernel: [ 310.357908] hdc: DMA interrupt recovery
Mar 4 20:17:31 localhost kernel: [ 310.357923] hdc: lost interrupt
Mar 4 20:25:57 localhost kernel: [ 1267.055119] hdc: dma_timer_expiry: dma status == 0x24
Mar 4 20:25:57 localhost kernel: [ 1279.998907] hdc: DMA interrupt recovery
Mar 4 20:25:57 localhost kernel: [ 1279.998939] hdc: lost interrupt
Mar 4 20:25:57 localhost kernel: [ 1311.894213] hdc: dma_timer_expiry: dma status == 0x24
Mar 4 20:25:57 localhost kernel: [ 331.229499] hdc: DMA interrupt recovery
Mar 4 20:25:57 localhost kernel: [ 331.229514] hdc: lost interrupt
Mar 4 20:25:57 localhost kernel: [ 1351.822576] hdc: dma_timer_expiry: dma status == 0x24
Mar 4 20:25:57 localhost kernel: [ 1366.689010] hdc: DMA interrupt recovery
Mar 4 20:25:57 localhost kernel: [ 1366.689039] hdc: lost interrupt
Mar 4 20:25:57 localhost kernel: [ 1391.865651] hdc: dma_timer_expiry: dma status == 0x24
Mar 4 20:25:57 localhost kernel: [ 1404.198657] hdc: DMA interrupt recovery
Mar 4 20:25:57 localhost kernel: [ 1404.198689] hdc: lost interrupt
Mar 4 20:25:57 localhost kernel: [ 1428.973425] hdc: dma_timer_expiry: dma status == 0x24
Mar 4 20:25:57 localhost kernel: [ 1440.720827] hdc: DMA interrupt recovery
Mar 4 20:25:57 localhost kernel: [ 1440.720860] hdc: lost interrupt
...
Mar 5 00:22:30 localhost kernel: [ 3661.626173] hdc: dma_timer_expiry: dma status == 0x24
Mar 5 00:28:44 localhost kernel: [ 3883.197988] hdc: dma_timer_expiry: dma status == 0x20
Mar 5 00:28:44 localhost kernel: [ 3883.198000] hdc: DMA timeout retry
Mar 5 00:28:44 localhost kernel: [ 3883.198004] hdc: timeout waiting for DMA

----- KRYPTIVA SIGNED MESSAGE -----
This email claims to have been packaged by Kryptiva.
To process this email and authenticate its origin, get
the free plugin from:
http://www.kryptiva.com/downloads

----- KRYPTIVA SIGNATURE START -----
AvWVqAAAAAIAAAABAAAAAAAATiACAQAAAACgAQAIAAAABAAAAAECABQeQpzoxBhWk1N2pZBP
+oJQqNIFbQMAFNa8GHXZWJH5Dz+D76vfh6JhvWLvBAAURAL2x8oKVxDoCb3M2+az1McuJdkG
ABQufjDxg3ZpKELkwuEedzcbtj6XDgcAFGBYVRYVxGPKznDAvCV9tyFGIeZ/EQAYAAAAAAAA
TiBH1bmdAAbZigAAAAAAADroEwAEAAAAAAAAAIID/1COLIewi7oyiGGYE7/BkNOXeJslZW4i
3nafo47IsSEnR3jndEvqprAlqORStWxxWwA9WVxNFTIAHYl0cBwlqfXyM7nskT3VtvyZSJBj
JgGV82ADwv/DDuqvIA7gZ+2YjQcl48ktzm9AVYjFwZb0lgBgkSGqnwHgO2KWEOE3BmCS
----- KRYPTIVA SIGNATURE END -----
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/