summaryrefslogtreecommitdiffstats
path: root/share/doc/handbook/dma.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'share/doc/handbook/dma.sgml')
-rw-r--r--share/doc/handbook/dma.sgml535
1 files changed, 0 insertions, 535 deletions
diff --git a/share/doc/handbook/dma.sgml b/share/doc/handbook/dma.sgml
deleted file mode 100644
index 9893229..0000000
--- a/share/doc/handbook/dma.sgml
+++ /dev/null
@@ -1,535 +0,0 @@
-<!-- $Id$ -->
-<!-- The FreeBSD Documentation Project -->
-
-<!--
-<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
-
-<!ENTITY % authors SYSTEM "authors.sgml">
-%authors;
-
-]>
--->
- <sect><heading>DMA: What it is and how it works<label id="dma"></heading>
-
- <p><em>Copyright &copy; 1995 &a.uhclem;, All Rights Reserved.<newline>
- 10 December 1996.</em>
-
-<!-- Version 1(3) -->
-
- Direct Memory Access (DMA) is a method of allowing data to
- be moved from one location to another in a computer without
- intervention from the central processor (CPU).
-
- The way that the DMA function is implemented varies between
- computer architectures, so this discussion will limit
- itself to the implementation and workings of the DMA
- subsystem on the IBM Personal Computer (PC), the IBM PC/AT
- and all of its successors and clones.
-
- The PC DMA subsystem is based on the Intel 8237 DMA
- controller. The 8237 contains four DMA channels that can
- be programmed independently and any one of the channels may be
- active at any moment. These channels are numbered 0, 1, 2
- and 3. Starting with the PC/AT, IBM added a second 8237
- chip, and numbered those channels 4, 5, 6 and 7.
-
- The original DMA controller (0, 1, 2 and 3) moves one byte
- in each transfer. The second DMA controller (4, 5, 6, and
- 7) moves 16-bits from two adjacent memory locations in each
- transfer, with the first byte always coming from an even-numbered
- address. The two controllers are identical components and the
- difference in transfer size is caused by the way the second
- controller is wired into the system.
-
- The 8237 has two electrical signals for each channel, named
- DRQ and -DACK. There are additional signals with the
- names HRQ (Hold Request), HLDA (Hold Acknowledge), -EOP
- (End of Process), and the bus control signals -MEMR (Memory
- Read), -MEMW (Memory Write), -IOR (I/O Read), and -IOW (I/O
- Write).
-
- The 8237 DMA is known as a ``fly-by'' DMA controller. This
- means that the data being moved from one location to
- another does not pass through the DMA chip and is not
- stored in the DMA chip. Subsequently, the DMA can only
- transfer data between an I/O port and a memory address, but
- not between two I/O ports or two memory locations.
-
- <quote><em>Note:</em> The 8237 does allow two channels to
- be connected together to allow memory-to-memory DMA
- operations in a non-``fly-by'' mode, but nobody in the PC
- industry uses this scarce resource this way since it is
- faster to move data between memory locations using the
- CPU.</quote>
-
- In the PC architecture, each DMA channel is normally
- activated only when the hardware that uses that DMA
- requests a transfer by asserting the DRQ line for that
- channel.
-
-
- <sect1><heading>A Sample DMA transfer</heading>
-
- <p>Here is an example of the steps that occur to cause a
- DMA transfer. In this example, the floppy disk
- controller (FDC) has just read a byte from a diskette and
- wants the DMA to place it in memory at location
- 0x00123456. The process begins by the FDC asserting the
- DRQ2 signal to alert the DMA controller.
-
- The DMA controller will note that the DRQ2 signal is asserted.
- The DMA controller will then make sure that DMA channel 2
- has been programmed and is enabled. The DMA controller
- also makes sure that none of the other DMA channels are active
- or have a higher priority. Once these checks are
- complete, the DMA asks the CPU to release the bus so that
- the DMA may use the bus. The DMA requests the bus by
- asserting the HRQ signal which goes to the CPU.
-
- The CPU detects the HRQ signal, and will complete
- executing the current instruction. Once the processor
- has reached a state where it can release the bus, it
- will. Now all of the signals normally generated by the
- CPU (-MEMR, -MEMW, -IOR, -IOW and a few others) are
- placed in a tri-stated condition (neither high or low)
- and then the CPU asserts the HLDA signal which tells the
- DMA controller that it is now in charge of the bus.
-
- Depending on the processor, the CPU may be able to
- execute a few additional instructions now that it no
- longer has the bus, but the CPU will eventually have to
- wait when it reaches an instruction that must read
- something from memory that is not in the internal
- processor cache or pipeline.
-
- Now that the DMA ``is in charge'', the DMA activates its
- -MEMR, -MEMW, -IOR, -IOW output signals, and the address
- outputs from the DMA are set to 0x3456, which will be
- used to direct the byte that is about to transferred to a
- specific memory location.
-
- The DMA will then let the device that requested the DMA
- transfer know that the transfer is commencing. This is
- done by asserting the -DACK signal, or in the case of the
- floppy disk controller, -DACK2 is asserted.
-
- The floppy disk controller is now responsible for placing
- the byte to be transferred on the bus Data lines. Unless
- the floppy controller needs more time to get the data
- byte on the bus (and if the peripheral does need more time it
- alerts the DMA via the READY signal), the DMA will wait
- one DMA clock, and then de-assert the -MEMW and -IOR
- signals so that the memory will latch and store the byte
- that was on the bus, and the FDC will know that the byte
- has been transferred.
-
- Since the DMA cycle only transfers a single byte at a
- time, the FDC now drops the DRQ2 signal, so that the DMA
- knows it is no longer needed. The DMA will de-assert the
- -DACK2 signal, so that the FDC knows it must stop placing
- data on the bus.
-
- The DMA will now check to see if any of the other DMA
- channels have any work to do. If none of the channels
- have their DRQ lines asserted, the DMA controller has
- completed its work and will now tri-state the -MEMR,
- -MEMW, -IOR, -IOW and address signals.
-
- Finally, the DMA will de-assert the HRQ signal. The CPU
- sees this, and de-asserts the HOLDA signal. Now the CPU
- activates its -MEMR, -MEMW, -IOR, -IOW and address lines,
- and it resumes executing instructions and accessing main
- memory and the peripherals.
-
- For a typical floppy disk sector, the above process is
- repeated 512 times, once for each byte. Each time a byte
- is transferred, the address register in the DMA is
- incremented and the counter that shows how many bytes are
- to be transferred is decremented.
-
- When the counter reaches zero, the DMA asserts the EOP
- signal, which indicates that the counter has reached zero
- and no more data will be transferred until the DMA
- controller is reprogrammed by the CPU. This event is
- also called the Terminal Count (TC). There is only one
- EOP signal, because only one DMA channel can be active at
- any instant.
-
- If a peripheral wants to generate an interrupt when the
- transfer of a buffer is complete, it can test for its
- -DACK signal and the EOP signal both being asserted at
- the same time. When that happens, it means the DMA will not
- transfer any more information for that peripheral without
- intervention by the CPU. The peripheral can then assert
- one of the interrupt signals to get the processors'
- attention. The DMA chip itself is not capable of
- generating an interrupt. The peripheral and its
- associated hardware is responsible for generating any
- interrupt that occurs.
-
- It is important to understand that although the CPU
- always releases the bus to the DMA when the DMA makes the
- request, this action is invisible to both applications
- and the operating systems, except for slight changes in
- the amount of time the processor takes to execute
- instructions when the DMA is active. Subsequently, the
- processor must poll the peripheral, poll the registers in
- the DMA chip, or receive an interrupt from the peripheral
- to know for certain when a DMA transfer has completed.
-
-
-<sect1><heading>DMA Page Registers and 16Meg address space limitations</heading>
-
- <p>You may have noticed earlier that instead of the DMA
- setting the address lines to 0x00123456 as we said
- earlier, the DMA only set 0x3456. The reason for this
- takes a bit of explaining.
-
- When the original IBM PC was designed, IBM elected to use
- both DMA and interrupt controller chips that were
- designed for use with the 8085, an 8-bit processor with
- an address space of 16 bits (64K). Since the IBM PC
- supported more than 64K of memory, something had to be
- done to allow the DMA to read or write memory locations
- above the 64K mark. What IBM did to solve this problem
- was to add a latch for each DMA channel that holds the
- upper bits of the address to be read to or written from.
- Whenever a DMA channel is active, the contents of that
- latch are written to the address bus and kept there until
- the DMA operation for the channel ends. These latches
- are called ``Page Registers''.
-
- So for our example above, the DMA would put the 0x3456
- part of the address on the bus, and the Page Register for
- DMA channel 2 would put 0x0012xxxx on the bus. Together,
- these two values form the complete address in memory that
- is to be accessed.
-
- Because the Page Register latch is independent of the DMA
- chip, the area of memory to be read or written must not
- span a 64K physical boundary. If the DMA accesses memory
- location 0xffff, after the transfer the DMA will then increment
- the address register and the DMA will access the next byte at
- location 0x0000, not 0x10000. The results of letting this
- happen are probably not intended.
-
- <quote><em>Note:</em> ``Physical'' 64K boundaries should
- not be confused with 8086-mode 64K ``Segments'', which
- are created by adding a segment register with an offset
- register. Page Registers have no address overlap.</quote>
-
- To further complicate matters, the external DMA address
- latches on the PC/AT hold only eight bits, so that gives
- us 8+16=24 bits, which means that the DMA can only point
- at memory locations between 0 and 16Meg. For newer
- computers that allow more than 16Meg of memory, the
- PC-compatible DMA cannot access memory locations above 16Meg.
-
- To get around this restriction, operating systems will
- reserve a buffer in an area below 16Meg that also does not
- span a physical 64K boundary. Then the DMA will be
- programmed to transfer data from the peripheral and into that
- buffer. Once the DMA has moved the data into this buffer,
- the operating system will then copy the data from the buffer
- to the address where the data is really supposed to be stored.
-
- When writing data from an address above 16Meg to a
- DMA-based peripheral, the data must be first copied from
- where it resides into a buffer located below 16Meg, and
- then the DMA can copy the data from the buffer to the
- hardware. In FreeBSD, these reserved buffers are called
- ``Bounce Buffers''. In the MS-DOS world, they are
- sometimes called ``Smart Buffers''.
-
-
- <sect1><heading>DMA Operational Modes and Settings</heading>
-
- <p>The 8237 DMA can be operated in several modes. The main
- ones are:
-
-<descrip>
-
- <tag/Single/ A single byte (or word) is transferred.
- The DMA must release and re-acquire the bus for each
- additional byte. This is commonly-used by devices
- that cannot transfer the entire block of data
- immediately. The peripheral will request the DMA
- each time it is ready for another transfer.
-
- The floppy disk controller only has a one-byte
- buffer, so it uses this mode.
-
-
- <tag>Block/Demand</tag> Once the DMA acquires the
- system bus, an entire block of data is transferred,
- up to a maximum of 64K. If the peripheral needs
- additional time, it can assert the READY signal to
- suspend the transfer briefly. READY should not be
- used excessively, and for slow peripheral transfers,
- the Single Transfer Mode should be used instead.
-
- The difference between Block and Demand is that once a
- Block transfer is started, it runs until the transfer
- count reaches zero. DRQ only needs to be asserted
- until -DACK is asserted. Demand Mode will transfer
- one more bytes until DRQ is de-asserted and the DMA
- pauses the transfer and releases the bus back to the CPU.
- When DRQ is asserted later, the transfer resumes where
- it was suspended.
-
- Older hard disk controllers used Demand Mode until
- CPU speeds increased to the point that it was more
- efficient to transfer the data using the CPU, particularly
- if the memory locations used in the transfer were above the
- 16Meg mark.
-
-
- <tag>Cascade</tag> This mechanism allows a DMA channel
- to request the bus, but then the attached peripheral
- device is responsible for placing the addressing
- information on the bus instead of the DMA. This is also
- known as ``Bus Mastering''.
-
- When a DMA channel in Cascade Mode receives control
- of the bus, the DMA does not place addresses and I/O
- control signals on the bus like the DMA normally does
- when it is active. Instead, the DMA only asserts the
- -DACK signal for this channel.
-
- At this point it is up to the device connected to that DMA
- channel to provide address and bus control signals.
- The peripheral has complete control over the system
- bus, and can do reads and/or writes to any address
- below 16Meg. When the peripheral is finished with
- the bus, it de-asserts the DRQ line, and the DMA
- controller can return control to the CPU or to some
- other DMA channel.
-
- Cascade Mode can be used to chain multiple DMA
- controllers together, and this is exactly what DMA
- Channel 4 is used for in the PC. When a peripheral
- requests the bus on DMA channels 0, 1, 2 or 3, the
- slave DMA controller asserts HLDREQ, but this wire is
- actually connected to DRQ4 on the primary DMA
- controller. The primary DMA controller then requests
- the bus from the CPU using HLDREQ. Once the bus is
- granted, -DACK4 is asserted, and that wire is
- actually connected to the HLDA signal on the slave
- DMA controller. The slave DMA controller then
- transfers data for the DMA channel that requested it,
- or the slave DMA may grant the bus to a peripheral
- that wants to perform its own bus-mastering, such as
- a SCSI controller.
-
- Because of this wiring arrangement, only DMA channels
- 0, 1, 2, 3, 5, 6 and 7 are usable on PC/AT systems.
-
- <quote><em>Note:</em> DMA channel 0 was reserved for
- refresh operations in early IBM PC computers, but
- is generally available for use by peripherals in
- modern systems.</quote>
-
- When a peripheral is performing Bus Mastering, it is
- important that the peripheral transmit data to or
- from memory constantly while it holds the system bus.
- If the peripheral cannot do this, it must release the
- bus frequently so that the system can perform refresh
- operations on main memory.
-
- The Dynamic RAM used in all PCs for main memory must be
- accessed frequently to keep the bits stored in the
- components "charged". Dynamic RAM essentially consists
- of millions of capacitors with each one holding one bit
- of data. These capacitors are charged with power to
- represent a "1" or drained to represent a "0". Because
- all capacitors leak, power must be added at regular intervals
- to keep the "1" values intact. The RAM chips actually handle
- the task of pumping power back into all of the appropriate
- locations in RAM, but they must be told when to do it by
- the rest of the computer so that the refresh activity won't
- interfere with the computer wanting to access RAM normally.
- If the computer is unable to refresh memory, the contents
- of memory will become corrupted in just a few milliseconds.
-
- Since memory read and write cycles ``count'' as refresh
- cycles (a dynamic RAM refresh cycle is actually an incomplete
- memory read cycle), as long as the peripheral
- controller continues reading or writing data to
- sequential memory locations, that action will refresh
- all of memory.
-
- Bus-mastering is found in some SCSI host interfaces and
- other high-performance peripheral controllers.
-
-
- <tag>Autoinitialize</tag> This mode causes the DMA to
- perform Byte, Block or Demand transfers, but when the
- DMA transfer counter reaches zero, the counter and
- address are set back to where they were when the DMA
- channel was originally programmed. This means that
- as long as the peripheral requests transfers, they will
- be granted. It is up to the CPU to move new data
- into the fixed buffer ahead of where the DMA is about
- to transfer it when doing output operations, and read new
- data out of the buffer behind where the DMA is writing
- when doing input operations.
-
- This technique is frequently used on audio devices that
- have small or no hardware ``sample'' buffers. There is
- additional CPU overhead to manage this ``circular'' buffer,
- but in some cases this may be the only way to eliminate the
- latency that occurs when the DMA counter reaches zero
- and the DMA stops transfers until it is reprogrammed.
- </descrip>
-
- <sect1><heading>Programming the DMA</heading>
-
- <p>The DMA channel that is to be programmed should always
- be ``masked'' before loading any settings. This is because
- the hardware might unexpectedly assert DRQ, and the DMA might
- respond, even though not all of the parameters have been
- loaded or updated.
-
- Once masked, the host must specify the direction of the
- transfer (memory-to-I/O or I/O-to-memory), what mode of
- DMA operation is to be used for the transfer (Single,
- Block, Demand, Cascade, etc), and finally the address and
- length of the transfer are loaded. The length that is
- loaded is one less than the amount you expect the DMA to
- transfer. The LSB and MSB of the address and length are
- written to the same 8-bit I/O port, so another port must
- be written to first to guarantee that the DMA accepts the
- first byte as the LSB and the second byte as the MSB of
- the length and address.
-
- Then, be sure to update the Page Register, which is
- external to the DMA and is accessed through a different
- set of I/O ports.
-
- Once all the settings are ready, the DMA channel can be
- un-masked. That DMA channel is now considered to be
- ``armed'', and will respond when DRQ is asserted.
-
- Refer to a hardware data book for precise programming
- details for the 8237. You will also need to refer to the
- I/O port map for the PC system, which describes where
- the DMA and Page Register ports are located. A complete
- table is located below.
-
-
- <sect1><heading>DMA Port Map</heading>
-
- <p>All systems based on the IBM-PC and PC/AT have the DMA
- hardware located at the same I/O ports. The complete
- list is provided below. Ports assigned to DMA Controller
- &num;2 are undefined on non-AT designs.
-
-<sect2><heading>0x00 - 0x1f DMA Controller &num;1 (Channels 0, 1, 2 and 3)</heading>
-
-<p>DMA Address and Count Registers
-
-<verb>
-0x00 write Channel 0 starting address
-0x00 read Channel 0 current address
-0x02 write Channel 0 starting word count
-0x02 read Channel 0 remaining word count
-
-0x04 write Channel 1 starting address
-0x04 read Channel 1 current address
-0x06 write Channel 1 starting word count
-0x06 read Channel 1 remaining word count
-
-0x08 write Channel 2 starting address
-0x08 read Channel 2 current address
-0x0a write Channel 2 starting word count
-0x0a read Channel 2 remaining word count
-
-0x0c write Channel 3 starting address
-0x0c read Channel 3 current address
-0x0e write Channel 3 starting word count
-0x0e read Channel 3 remaining word count
-</verb>
-
-DMA Command Registers
-
-<verb>
-0x10 write Command Register
-0x10 read Status Register
-0x12 write Request Register
-0x12 read -
-0x14 write Single Mask Register Bit
-0x14 read -
-0x16 write Mode Register
-0x16 read -
-0x18 write Clear LSB/MSB Flip-Flop
-0x18 read -
-0x1a write Master Clear/Reset
-0x1a read Temporary Register
-0x1c write Clear Mask Register
-0x1c read -
-0x1e write Write All Mask Register Bits
-0x1e read -
-</verb>
-
-<sect2><heading>0xc0 - 0xdf DMA Controller &num;2 (Channels 4, 5, 6 and 7)</heading>
-
-<p>DMA Address and Count Registers
-
-<verb>
-0xc0 write Channel 4 starting address
-0xc0 read Channel 4 current address
-0xc2 write Channel 4 starting word count
-0xc2 read Channel 4 remaining word count
-
-0xc4 write Channel 5 starting address
-0xc4 read Channel 5 current address
-0xc6 write Channel 5 starting word count
-0xc6 read Channel 5 remaining word count
-
-0xc8 write Channel 6 starting address
-0xc8 read Channel 6 current address
-0xca write Channel 6 starting word count
-0xca read Channel 6 remaining word count
-
-0xcc write Channel 7 starting address
-0xcc read Channel 7 current address
-0xce write Channel 7 starting word count
-0xce read Channel 7 remaining word count
-</verb>
-
-DMA Command Registers
-
-<verb>
-0xd0 write Command Register
-0xd0 read Status Register
-0xd2 write Request Register
-0xd2 read -
-0xd4 write Single Mask Register Bit
-0xd4 read -
-0xd6 write Mode Register
-0xd6 read -
-0xd8 write Clear LSB/MSB Flip-Flop
-0xd8 read -
-0xda write Master Clear/Reset
-0xda read Temporary Register
-0xdc write Clear Mask Register
-0xdc read -
-0xde write Write All Mask Register Bits
-0xde read -
-</verb>
-
-<sect2><heading>0x80 - 0x9f DMA Page Registers</heading>
-
-<p><verb>
-0x87 r/w DMA Channel 0
-0x83 r/w DMA Channel 1
-0x81 r/w DMA Channel 2
-0x82 r/w DMA Channel 3
-
-0x8b r/w DMA Channel 5
-0x89 r/w DMA Channel 6
-0x8a r/w DMA Channel 7
-
-0x8f Refresh
-</verb>
-
OpenPOWER on IntegriCloud