The present invention relates to the field of computer systems. More specifically, the present invention relates to the translation and validation of a logical address to a physical address in a computer system.
Computer systems usually include a motherboard containing a central processing unit (CPU) and a memory. Typically, one or more external devices (i.e., peripheral devices) are in communication with the computer system and can access (i.e., read and/or write to) the memory. A peripheral device in communication with the motherboard may attempt to access a memory location that is either nonexistent or prohibited by the CPU. For example, if the peripheral device writes to a particular memory location that is specifically used by the CPU for a specific function, the CPU may not be able to operate correctly following the write to that particular memory location. Therefore, it would be advantageous to intercept such an attempt to access a memory location that is unavailable to a peripheral device and thereby provide a level of fault-tolerance.
The present invention provides a method and apparatus for input/output (I/O) virtual address translation and validation. In one aspect, a range of memory in a computer system is assigned to a device driver for its exclusive use. The device driver is associated with a peripheral device attached to a bus. The device driver invokes system functionality of the computer system for receiving a logical address and outputting a physical address. In one embodiment, the physical address has a length that is greater than the logical address.
In one embodiment, the device driver assigns a bus slot number to the peripheral device. In another embodiment, the I/O virtual address translation is disabled. In yet another embodiment, the device driver assigns a range of memory to at least one attached peripheral device. In a further embodiment, memory is allocated for a scatter-gather table.
In another aspect, the invention relates to an apparatus for providing I/O virtual address translation and validation. The apparatus includes a peripheral device and a memory. Additionally, the apparatus includes an I/O virtual address cache memory, a scatter-gather table, and a device driver. The scatter-gather table is in communication with the I/O virtual address cache memory and maps a logical address to a physical address. The logical address is associated with the peripheral device and has a length that is less than the physical address. The device driver provides the logical address to the I/O virtual address cache memory to obtain the physical address.
In one embodiment, the I/O virtual address cache memory includes an address validation cache and an address translation cache. The address validation cache corroborates that an address is a valid address within a range of addresses. The address translation cache translates the address from a logical address to a physical address.
These and other advantages of the invention may be more clearly understood with reference to the specification and the drawings, in which:
In the drawings, like reference characters generally refer to the same parts throughout the different views. Also, the drawings are not necessarily to scale, emphasis instead being placed upon illustrating the principles of the invention.
A computer system 4 constructed in accordance with the invention is depicted in FIG. 1. In brief overview, the computer system 4 includes a motherboard 8 in communication with an I/O board 12. The motherboard 8 includes a microprocessor 13, a main memory 14 for storing programs and/or data, a system bus controller 15, and a system bus 16 allowing communication among these components. Examples of the microprocessor 13 are, without limitation, a Pentium Classic/MMX CPU, developed by Intel Corporation of Austin, Tex., an AMD-K6 CPU, developed by AMD of Sunnyvale, Calif., and the like. The system bus controller 15 determines which component (e.g., microprocessor 13) obtains control of the system bus 16. In one embodiment, the system bus controller 15 polls an interrupt line (not shown) and grants access to the system bus 16 to the component associated with the interrupt having the highest priority.
The motherboard 8 and the I/O board 12 are additionally in communication with an I/O controller 19. In one embodiment, the I/O controller 19 is also in communication with the system bus 16 (and therefore in communication with the motherboard 8) via a communications bus 21. In a further embodiment, a communications bus controller 23 determines which component (e.g., I/O controller 19) obtains control of the communications bus 21. In another embodiment, an internal I/O controller 19′ is connected directly to the system bus 16 and an internal I/O board 20′ (i.e., the I/O board 20′ is part of the motherboard 8).
In one particular embodiment, the communications bus 21 is a Peripheral Component Interconnect (PCI) bus, developed by Intel Corporation of Austin, Tex., and which is a local bus used for interfacing a peripheral device with the computer system 4. Other examples of the communications bus 21 include, without limitation, an Industry Standard Architecture (ISA) bus, an Extended ISA (EISA) bus, a Nu Bus developed by Apple of Cupertino, Calif., a MicroChannel Architecture (MCA) Bus developed by IBM Corporation of Armonk, N.Y., a Video Electronics Standards Association (VESA) bus, a VESA local (VL) bus, and the like.
In one embodiment, the system bus 16 and/or the communications bus 21 includes a predefined number of slots (i.e., bus slots). Any peripheral device in communication with the bus 16, 21 is connected to a bus slot. In other embodiments, each bus slot has a control line so that the bus controller 15, 23 can enable and disable access to the respective bus 16, 21 (e.g., for a particular peripheral device). In yet another embodiment, each bus controller 15, 23 has a separate enable register for each bus slot. Further, each bus slot has a range of memory located in the main memory 14 associated with the bus slot (and therefore associated with a peripheral device connected to that bus slot).
In more detail and also referring to
The main memory 14 typically includes a volatile memory component 29 and a non-volatile memory component 33. Examples of the volatile memory component 29 include, without limitation, Random Access Memory (RAM), Static RAM (SRAM), and Dynamic RAM (DRAM). Examples of the non-volatile memory component 33 include, without limitation, Read Only Memory (ROM), Programmable ROM (PROM), Erasable Programmable ROM (EPROM), and the like.
The volatile memory component (hereafter referred to as “RAM”) 29 typically contains an operating system (not shown) and one or more device drivers (not shown) that permit access to various peripheral devices 32 (e.g., a display screen, a keyboard, a disk drive, a printer). Examples of the OS include, but are not limited to, Windows NT developed by Microsoft Corporation of Redmond, Wash., OS/2 developed by IBM Corporation of Armonk, N.Y., Netware developed by Novell, Incorporated of San Jose, Calif., and the like. The non-volatile memory component (hereafter referred to as “ROM”) 33 typically contains a basic input/output system (BIOS) (not shown) that handles the boot process of the computer system 4.
Additionally, the MMU 27 maintains a scatter-gather (S/G) table 35 stored in the main memory 14. The S/G table 35 is a table that contains information mapping one memory address to another memory address for the peripheral devices 32.
The I/O board 12 includes a first buffer 37 (hereafter referred to as a “pre-FIFO buffer”) and a second buffer 39 (hereafter referred to as a “posted write FIFO buffer”) arranged in a first-in, first-out (FIFO) manner (i.e., the current data read out of the buffer 37, 39 was the oldest data written into the buffer 37, 39). The I/O board 12 also includes an I/O virtual address (IOVA) cache memory 41. In another embodiment, the IOVA cache memory 41 is cache memory that is not located on the I/O board 12. In yet another embodiment, the IOVA cache memory 41 is a disk cache. Similar to the motherboard 8, the I/O board 12 may additionally include an ASIC.
In general, the IOVA cache memory 41 prevents a prohibited access of the main memory 14 by a peripheral device 32, thus avoiding the shortcomings of the prior art. In more detail, the IOVA cache memory 41 provides a virtual memory space having IOVA addresses for mapping and checking read requests and write requests by the peripheral device 32 to the motherboard 8 (i.e., to main memory 14) over the communications bus 21. Furthermore, the IOVA cache memory 41 can be a directly mapped memory, a fully associative memory, or a set associative memory. Other organizations of the cache memory are additionally possible without affecting the operation of the present invention.
Additionally and as described in more detail below, the pre-FIFO buffer 37 stores data that has not yet been transmitted to the IOVA cache memory 41. The posted write FIFO buffer 39 stores data after the data has been transmitted to the IOVA cache memory 41 (i.e., after translation and validation, as described below) but prior to transmitting the data to the main memory 14.
More specifically, the IOVA cache memory 41 includes a validation cache 43 and a translation cache 45. As described further below, the validation cache 43 corroborates that a logical address is a valid address within the range of addresses corresponding to the main memory 14. The translation cache 45 translates a logical address (i.e., an address having a communications bus address format) to the main memory address format, or physical address, that the motherboard 8 can read from or write to. In one embodiment, addresses on the communications bus 21 (i.e., logical addresses) have a 32 bit address format and the main memory addresses (i.e., physical addresses) have a 36 bit address format. Therefore, the translation cache 45 enables 32-bit bus controllers (i.e., bus controller 23) to directly address the main memory 14 above a certain memory limit that otherwise exists due to the size (i.e., 32 bit) of addresses on the communications bus 21.
In one embodiment, an entry stored in the IOVA cache memory 41 at an IOVA address includes an identifying field (hereafter “tag bits”). The I/O board 12 constructs the tag bits from a predetermined portion of the logical address (from the requesting peripheral device 32). When updating (e.g., writing) a cache entry in the IOVA cache memory 41, the I/O board 12 inserts the tag bits as part of the IOVA cache memory entry. When reading a cache entry in the IOVA cache memory 41, the I/O board 12 compares the tag bits of the IOVA cache memory entry to the predetermined portion of the logical address.
In other embodiments, the IOVA cache memory entry includes a bus slot number. The bus slot number stored in the IOVA cache memory entry indicates which, if any, peripheral devices 32 have access to the IOVA cache memory entry associated with the logical address.
The invention is particularly useful in a system-critical fault-tolerant computer (FTC) system 4 that offers continuous availability. In such an embodiment, the invention may include multiple motherboards 8, multiple I/O boards 12, and the associated multiple components shown in
Also referring to
After verification and translation, the pre-FIFO buffer 37 releases the R/W command to the posted write FIFO buffer 39. The I/O board 12 then transmits the command to the ASIC 25, and the ASIC 25 transmits the R/W command to the MMU 27. The MMU 27 determines the physical address stored in the S/G table 35 associated with the R/W command and sends (step 345) the requested information back to the requesting peripheral device 32.
More specifically and also referring to
In general, a validity check is a determination of whether the address 58 is an address that can be read by the IOVA cache memory 41. For example, an address 58 is invalid if the address 58 has an incorrect size. The permission verification is a test to determine whether the read and write command can occur for the type of transaction that the peripheral device 32 is performing. A bounds compare determines whether an address 58 is within a particular memory range (e.g., within the memory 14).
In greater detail and in one embodiment, the validation cache 43 performs a cache validity check on the IOVA cache memory entry (associated with the address 58) stored in the IOVA cache memory 41 and determines (step 316) if the cache entry is valid. In one embodiment, the validation cache 43 performs the cache validity check when a predetermined bit in a predefined register is set. In another embodiment, the determination is set during initialization of the computer system 4. More specifically and in one embodiment, if the validation cache 43 determines that a predetermined bit is inactive in the IOVA cache memory entry, the S/G table 35 entry is invalid, resulting in a cache miss and a subsequent update from the main memory 14. An invalid entry error occurs (step 317) if the IOVA cache memory entry is invalid following the update from the main memory 14. If the entry is valid, the validation cache 43 deems (step 318) the address as a valid address.
The validation cache 43 can also perform a permission verification on the address 58. In one embodiment, the validation cache 43 performs the permission verification following the cache validity check. The validation cache determines (step 319) if the permission is valid. The validation cache 43 makes the determination by verifying that the read or write command can occur for the type of transaction the peripheral device 32 is performing. If the read or write command is invalid, an error results (step 321). If the permission is valid, the validation cache 43 deems (step 318) the address as a valid address.
The validation cache 43 can also perform a tag compare. The validation cache 43 determines (step 322) if the tag bits, as described above, in the IOVA cache memory entry are equivalent to a predetermined portion of the address 58. The tag bits can be any portion of the IOVA cache memory entry. More specifically, in some embodiments, the tag bits are the upper two bits or the lower two bits of the IOVA cache memory entry. In other embodiments, the tag bits are the upper four bits or the lower four bits of the IOVA cache memory entry. In more preferred embodiments, the tag bits are the upper eight bits or the lower eight bits of the IOVA cache memory entry. In yet other embodiments, the tag bits are the upper sixteen bits or the lower sixteen bits of the IOVA cache memory entry. It should be clear that the tag bits of the IOVA cache memory entry can be any portion of the number of bits in the IOVA cache memory entry. Similarly, the predetermined portion of the address 58 can be any portion of the address 58 (e.g., the low order bits, the high order bits).
If the tag bits match, the validation cache 43 deems (step 318) the address as a valid address. An error occurs (step 317) if the tag bits do not match the predetermined portion of the address 58.
In one embodiment, the validation cache 43 additionally determines (step 325) if the bus slot number included in the IOVA cache memory entry matches the bus slot number assigned to the peripheral device 32 requesting the read or write. If the bus slot numbers match, the validation cache 43 deems (step 318) the address as a valid address. A disparity between the bus slot number assigned to the peripheral device 32 to the bus slot number stored in the IOVA cache memory entry results (step 317) in an error.
Further, the validation cache 43 can also perform a bounds compare. The validation cache 43 determines (step 328) whether the size boundary of the address 58 is equivalent to the bounds specified by the starting and ending boundaries of the memory region addressed by the IOVA cache memory entry. If the size boundary of the address 58 does not match the bounds specified, an error results (step 317). If the size boundary matches the bounds specified, the address 58 is deemed to be valid (step 318). It should be noted that the validation cache 43 can perform any one or any combination of the above mentioned checks to validate the address 58.
Referring again to
Referring to
In one embodiment, the device driver 408 communicates with a hardware abstraction layer (HAL) 312, which is essentially an interface between the device driver 408 and the peripheral devices 32. In one embodiment, the HAL 412 enables the operating system 404 to send commands to the peripheral device 32 without determining specific details about the peripheral device 32. For example, the operating system 404 can send a generic command, such as “read from peripheral device 32” to the HAL 412 without identifying the specific details (e.g., specific command to read that particular peripheral device 32). The HAL 412 typically contains many functions 416′, 416″, 416′″ (generally 416) associated with the peripheral devices 32.
A table of one embodiment of the HAL functions 416 available, the input parameters of these HAL functions 416, and the output parameters of these HAL functions 416 is shown in the Appendix. For example, the HALEnableIOVA function enables the IOVA cache memory 41 to perform the address verification and translation for a particular address. In one embodiment, if this function 416 is not called (i.e., the IOVA cache memory 41 is disabled), the peripheral device 32 cannot write to the requested address 58. In another embodiment, if this function 416 is not called (i.e., the IOVA cache memory 41 is disabled), the peripheral device 32 can write to any location in the main memory 14 (i.e., no checking or validation performed by the IOVA cache memory 41).
As another example, the HALMapCommonBuffer function 416 maps a range of contiguous physical memory (i.e., having physical addresses) to enable access by a bus master device. The function 416 returns a logical address corresponding to the physical address if the physical address can be mapped. The HAL functions 416, input parameters, and output parameters illustrated in the Appendix are merely illustrative and not limiting to the invention.
Referring also to
The HAL 412 then determines (step 510) a size for the S/G memory table 35. In one embodiment, the S/G memory table 35 supports a programmable table size through the programming of a register. Therefore, the operating system 404 can minimize the S/G table 35 size in a low end system (e.g., the size of the main memory 14 is less than a predefined memory size) and can map the entire range of logical addresses in a high end system (e.g., the size of the main memory 14 is greater than the size of the range of available logical addresses). In one embodiment, the HAL 412 obtains a table size parameter from an initialization file (e.g., boot.ini) and uses the size to determine the amount of memory to allocate. If no table size parameter is found, the HAL 412 uses a default table size parameter to determine the table size. In a further embodiment, the HAL 412 allocates a minimum amount of memory for the S/G memory table 35. For example, the HAL 412 calls a HAL function 416 (e.g., HalAllocatePhysicalMemory) to allocate the S/G table 35.
Additionally, the HAL 412 can assign a predetermined start address for the S/G table 35. In one embodiment, if the computer system 4 does not have enough memory space available within the main memory 14, the HAL function 416 (e.g., HalAllocatePhysicalMemory) returns an error (e.g., No31 Memory error). In another embodiment, the computer system 4 frees memory space that has not been modified in a predefined amount of time to enable the allocation of the S/G table 35. In one embodiment, the HAL 412 then performs (step 515) additional initialization procedures, such as, but not limited to, the determination of the size of the main memory 14, the verification of a valid I/O board 12, the verification of a valid motherboard 8, and the like.
In greater detail and in one embodiment, the HAL 412 determines its “registry parameters.” In one embodiment in which the operating system 404 is the Microsoft Windows operating system, the HAL 412 reads the registry parameters from the Microsoft Windows 2000 registry file. In another embodiment, the HAL 412 reads the registry parameters from a file stored on the computer system 4. In yet another embodiment, the HAL 412 reads the registry parameters from the main memory 14. The registry parameters can be further divided into a bus enumeration, also referred to hereafter as a PCI Bus Enumeration, which provides a location for bus (e.g., PCI) enumeration parameters, and a bus configuration space, also referred to hereafter as a PCI Configuration Space, which provides a location for parameters that can override the default parameters in the bus enumeration (e.g., PCI Bus Enumeration) parameters. For example, “registry parameters” within the PCI Configuration Space are a PCI bus number and a PCI slot number. Additionally, examples of “registry parameters” within the PCI Bus Enumeration include, but are not limited to, memory size allocated to the I/O board 12, amount of I/O space allocated to the I/O board 12, range of bus numbers allocated to the I/O board 12, and the like.
The HAL 412 then allocates (step 520) resources from the RAM 29 for the IOVA cache memory 41 and the PCI Configuration Space. Additionally, the device driver 408 stores any errors that occur throughout the process. In one embodiment, the device driver 408 calls a HAL function 416 (e.g., HalGetSlotData) to obtain various error and state data, including HAL initialization errors.
Then the device driver 408 invokes computer system functionality to enable (step 525) the IOVA cache memory 41. In one embodiment, the device driver 408 calls a HAL function 416 (e.g., HalEnableIOVA) to enable the IOVA cache memory 41. In other embodiments, the HAL 412 enables the IOVA cache memory 41 by writing a predefined value to a predetermined register associated with the IOVA cache memory 41. In yet another embodiment, the HAL 412 enables the IOVA cache memory 41 by writing any value to a predetermined register associated with the IOVA cache memory 41. In another embodiment, the HAL 412 enables the IOVA cache memory 41 by writing a value (e.g., predefined, any value) to the IOVA cache memory 41.
Further, the HAL 412 maintains a reference count of peripheral devices 32 using the IOVA cache memory 41 for each bus slot on the I/O board 12. In one embodiment, the device driver 408 includes multiple peripheral devices 32 that share the same bus slot. In other embodiments, these peripheral devices 32 occupy different bus function addresses or may be located under secondary bus bridges (e.g., a secondary PCI bridge).
Additionally, if an unsupported I/O board 12 is detected, the HAL function 416 (e.g., HalEnableIova) that the device driver 408 invoked returns an error code. In one embodiment, the device driver 408 then operates without the IOVA cache memory 41. In another embodiment, the device driver 408 halts operations.
Once the device driver 408 enables the IOVA cache memory 41, the device driver 408 can map and free IOVA ranges by invoking distinct HAL functions 416. For example, a device driver 408 provides a physical address that does not vary frequently (i.e., a long-term physical address), such as for queues and device control structures, to a HAL function 416 (e.g., HalMapCommonBuffer) and the HAL function 416 returns a logical address corresponding to the physical address. Additionally, a device driver 408 provides a physical address for an upcoming use (i.e., a short-term physical address), such as addresses for data destination buffers, to a HAL function 416 (e.g., HalMapIovaRange) and the HAL function 416 returns a logical address corresponding to the physical address.
If any of the above mentioned HAL functions 416 returns (step 530) an error message (e.g., No−IOVA), the device driver 408 delays the execution of the HAL function 416 and performs (step 535) another attempt at a later time. In one embodiment, the device driver 408 executes a delay mechanism to perform this request at the later time. In additional embodiments, the device driver 408 calls a HAL function 416 (e.g., HALDisableIOVA) to disable the IOVA cache memory 41.
Following a successful allocation of IOVA addresses in step 520, the device driver 408 invokes another HAL function 416 (e.g., HalMapIovaRange) to program (step 540) the S/G table 35 for the I/O board 12. The device driver 408 invokes the HAL function 416 for each memory range (consisting of physical addresses) that the peripheral device 32 uses for its operation. The HAL function 416 outputs a logical address (e.g., an IOVA address) to the device driver 408 for use by the bus controller.
The device driver 408 then determines (step 545) if the peripheral device 32 completes the transaction that requires the IOVA addresses. In one embodiment, the device driver 408 polls the peripheral device 32 to determine if the peripheral device 32 is in an available state. Upon such a determination, the device driver 408 invokes (step 550) a HAL function 416 (e.g., HalFreeIOVARange) to “free” the IOVA range that the device driver 408 previously mapped in step 440. In one embodiment, the device driver 408 invokes a HAL function 416 to “free” the IOVA range once for each range of IOVA addresses that were previously mapped. In more detail, the HAL function 416 decrements a reference count for that IOVA map in the S/G table 35 and unassigns each address previously mapped. In another embodiment, a HAL function 416 unassigns the entire range of IOVA addresses previously mapped from a single execution. Furthermore, the HAL 412 invalidates the appropriate S/G table 35 entries and clears the appropriate IOVA cache memory 41 entries for the I/O board 12.
In one embodiment, the HAL 412 efficiently manages the IOVA cache memory 41 by verifying that all of the S/G table 35 entries (e.g., pointers to the physical addresses) have been used prior to invalidating an entry in the IOVA cache memory 41. In other embodiments, the HAL 412 invalidates the IOVA cache entries upon the completion of each transaction in step 545.
Many alterations and modifications may be made by those having ordinary skill in the art without departing from the spirit and scope of the invention. Therefore, it must be expressly understood that the illustrated embodiment has been shown only for the purposes of example and should not be taken as limiting the invention, which is defined by the following claims. The following claims are thus to be read as not only literally including what is set forth by the claims but also to include all equivalent elements for performing substantially the same function in substantially the same way to obtain substantially the same result, even though not identical in other respects to what is shown and described in the above illustration.
Number | Name | Date | Kind |
---|---|---|---|
3460094 | Pryor et al. | Aug 1969 | A |
3544973 | Borck et al. | Dec 1970 | A |
3548382 | Lichty et al. | Dec 1970 | A |
3609704 | Shurter | Sep 1971 | A |
3641505 | Artz et al. | Feb 1972 | A |
3705388 | Nishimoto | Dec 1972 | A |
3710324 | Cohen et al. | Jan 1973 | A |
3736566 | Anderson et al. | May 1973 | A |
3795901 | Boehm et al. | Mar 1974 | A |
3805039 | Stiffler | Apr 1974 | A |
3893084 | Kotok et al. | Jul 1975 | A |
4164787 | Aranguren | Aug 1979 | A |
4228496 | Katzman et al. | Oct 1980 | A |
4356550 | Katzman et al. | Oct 1982 | A |
4365295 | Katzman et al. | Dec 1982 | A |
4366535 | Cedolin et al. | Dec 1982 | A |
4466098 | Southard | Aug 1984 | A |
4484273 | Stiffler et al. | Nov 1984 | A |
4695975 | Bedrij | Sep 1987 | A |
4700292 | Campanini | Oct 1987 | A |
4716523 | Burrus, Jr. et al. | Dec 1987 | A |
4866604 | Reid | Sep 1989 | A |
4924427 | Savage et al. | May 1990 | A |
4942517 | Cok | Jul 1990 | A |
4942519 | Nakayama | Jul 1990 | A |
4965717 | Cutts, Jr. et al. | Oct 1990 | A |
4993030 | Krakauer et al. | Feb 1991 | A |
5115490 | Komuro et al. | May 1992 | A |
5175855 | Putnam et al. | Dec 1992 | A |
5193162 | Bordsen et al. | Mar 1993 | A |
5193180 | Hastings | Mar 1993 | A |
5195040 | Goldsmith | Mar 1993 | A |
5231640 | Hanson et al. | Jul 1993 | A |
5276860 | Fortier et al. | Jan 1994 | A |
5280612 | Lorie et al. | Jan 1994 | A |
5280619 | Wang | Jan 1994 | A |
5295258 | Jewett et al. | Mar 1994 | A |
5317726 | Horst | May 1994 | A |
5321706 | Holm et al. | Jun 1994 | A |
5335334 | Takahashi et al. | Aug 1994 | A |
5357612 | Alaiwan | Oct 1994 | A |
5386524 | Lary et al. | Jan 1995 | A |
5404361 | Casorso et al. | Apr 1995 | A |
5423037 | Hvasshovd | Jun 1995 | A |
5423046 | Nunnelley et al. | Jun 1995 | A |
5426747 | Weinreb et al. | Jun 1995 | A |
5440727 | Bhide et al. | Aug 1995 | A |
5440732 | Lomet et al. | Aug 1995 | A |
5463755 | Dumarot et al. | Oct 1995 | A |
5475860 | Ellison et al. | Dec 1995 | A |
5497476 | Oldfield et al. | Mar 1996 | A |
5504873 | Martin et al. | Apr 1996 | A |
5513314 | Kandasamy et al. | Apr 1996 | A |
5550986 | DuLac | Aug 1996 | A |
5555404 | Torbjçrnsen et al. | Sep 1996 | A |
5557770 | Bhide et al. | Sep 1996 | A |
5566316 | Fechner et al. | Oct 1996 | A |
5568629 | Gentry et al. | Oct 1996 | A |
5584008 | Shimada et al. | Dec 1996 | A |
5584018 | Kamiyama | Dec 1996 | A |
5586253 | Green et al. | Dec 1996 | A |
5586310 | Sharman | Dec 1996 | A |
5627961 | Sharman | May 1997 | A |
5632031 | Velissaropoulos et al. | May 1997 | A |
5664172 | Antoshenkov | Sep 1997 | A |
5671442 | Feeney et al. | Sep 1997 | A |
5687392 | Radko | Nov 1997 | A |
5815649 | Utter et al. | Sep 1998 | A |
5838899 | Leavitt et al. | Nov 1998 | A |
5862145 | Grossman et al. | Jan 1999 | A |
5892928 | Wallach et al. | Apr 1999 | A |
5894560 | Carmichael et al. | Apr 1999 | A |
5953538 | Duncan et al. | Sep 1999 | A |
5953742 | Williams | Sep 1999 | A |
5956756 | Khalidi et al. | Sep 1999 | A |
5990914 | Horan et al. | Nov 1999 | A |
6012106 | Schumann et al. | Jan 2000 | A |
6012120 | Duncan et al. | Jan 2000 | A |
6021456 | Herdeg et al. | Feb 2000 | A |
6047343 | Olarig | Apr 2000 | A |
6098137 | Goodrum et al. | Aug 2000 | A |
6105075 | Ghaffari | Aug 2000 | A |
6128711 | Duncan et al. | Oct 2000 | A |
6138198 | Garnett et al. | Oct 2000 | A |
6141722 | Parsons | Oct 2000 | A |
6141744 | Wing So | Oct 2000 | A |
6202147 | Slaughter et al. | Mar 2001 | B1 |
6484227 | Mergard et al. | Nov 2002 | B1 |
6546483 | Lai | Apr 2003 | B1 |
Number | Date | Country |
---|---|---|
0 208 430 | Jan 1987 | EP |
0 428 330 | May 1991 | EP |
0 406 759 | Sep 1991 | EP |
0 475 005 | Nov 1995 | EP |
0 390 567 | Jun 1999 | EP |
Number | Date | Country | |
---|---|---|---|
20020166038 A1 | Nov 2002 | US |