fw-dma.txt 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. This page describes the structures and procedures used by the cx2341x DMA
  2. engine.
  3. Introduction
  4. ============
  5. The cx2341x PCI interface is busmaster capable. This means it has a DMA
  6. engine to efficiently transfer large volumes of data between the card and main
  7. memory without requiring help from a CPU. Like most hardware, it must operate
  8. on contiguous physical memory. This is difficult to come by in large quantities
  9. on virtual memory machines.
  10. Therefore, it also supports a technique called "scatter-gather". The card can
  11. transfer multiple buffers in one operation. Instead of allocating one large
  12. contiguous buffer, the driver can allocate several smaller buffers.
  13. In practice, I've seen the average transfer to be roughly 80K, but transfers
  14. above 128K were not uncommon, particularly at startup. The 128K figure is
  15. important, because that is the largest block that the kernel can normally
  16. allocate. Even still, 128K blocks are hard to come by, so the driver writer is
  17. urged to choose a smaller block size and learn the scatter-gather technique.
  18. Mailbox #10 is reserved for DMA transfer information.
  19. Flow
  20. ====
  21. This section describes, in general, the order of events when handling DMA
  22. transfers. Detailed information follows this section.
  23. - The card raises the Encoder interrupt.
  24. - The driver reads the transfer type, offset and size from Mailbox #10.
  25. - The driver constructs the scatter-gather array from enough free dma buffers
  26. to cover the size.
  27. - The driver schedules the DMA transfer via the ScheduleDMAtoHost API call.
  28. - The card raises the DMA Complete interrupt.
  29. - The driver checks the DMA status register for any errors.
  30. - The driver post-processes the newly transferred buffers.
  31. NOTE! It is possible that the Encoder and DMA Complete interrupts get raised
  32. simultaneously. (End of the last, start of the next, etc.)
  33. Mailbox #10
  34. ===========
  35. The Flags, Command, Return Value and Timeout fields are ignored.
  36. Name: Mailbox #10
  37. Results[0]: Type: 0: MPEG.
  38. Results[1]: Offset: The position relative to the card's memory space.
  39. Results[2]: Size: The exact number of bytes to transfer.
  40. My speculation is that since the StartCapture API has a capture type of "RAW"
  41. available, that the type field will have other values that correspond to YUV
  42. and PCM data.
  43. Scatter-Gather Array
  44. ====================
  45. The scatter-gather array is a contiguously allocated block of memory that
  46. tells the card the source and destination of each data-block to transfer.
  47. Card "addresses" are derived from the offset supplied by Mailbox #10. Host
  48. addresses are the physical memory location of the target DMA buffer.
  49. Each S-G array element is a struct of three 32-bit words. The first word is
  50. the source address, the second is the destination address. Both take up the
  51. entire 32 bits. The lowest 16 bits of the third word is the transfer byte
  52. count. The high-bit of the third word is the "last" flag. The last-flag tells
  53. the card to raise the DMA_DONE interrupt. From hard personal experience, if
  54. you forget to set this bit, the card will still "work" but the stream will
  55. most likely get corrupted.
  56. The transfer count must be a multiple of 256. Therefore, the driver will need
  57. to track how much data in the target buffer is valid and deal with it
  58. accordingly.
  59. Array Element:
  60. - 32-bit Source Address
  61. - 32-bit Destination Address
  62. - 16-bit reserved (high bit is the last flag)
  63. - 16-bit byte count
  64. DMA Transfer Status
  65. ===================
  66. Register 0x0004 holds the DMA Transfer Status:
  67. Bit
  68. 4 Scatter-Gather array error
  69. 3 DMA write error
  70. 2 DMA read error
  71. 1 write completed
  72. 0 read completed