Documentation Archive Developer
Search

ADC Home > Reference Library > Technical Q&As > Hardware & Drivers > PCI and PC Card >

Legacy Devices


Q: I've been getting various reports from users about a problem with Open Firmware on almost all Macintoshes. It appears that Open Firmware is incorrectly assigning the same I/O range to several cards on the same PCI bus. Is this a known bug?

A: Apple does not know of any reports concerning Open Firmware incorrectly assigning PCI I/O space. What you may be seeing is two or more PC-compatible "legacy" devices being placed into Macintosh PCI slots. A legacy device could be, for instance, a VGA or IDE controller with hard-coded address assignments previously used on an ISA bus. Since both of these controllers are hard wired to the same physical address in PCI I/O space, their address assignments conflict. There is no work around since both controllers expect to use the same address. This was acceptable when a PC had limited expansion capabilities, but must be taken into account when your personal computer has a PCI bus. For details see "PCI Bus Binding to IEEE Std 1275-1994 Standard for Boot (Initialization Configuration) Firmware Revision 2.1" Section 7, Legacy Devices. For your convenience here is that text:

7. Legacy devices

"Legacy" VGA and IDE devices that are implemented on PCI will typically have the
same "hard-decoded" addresses as they did on ISA. Such devices that have FCode can use
explicit indication of their address requirements as described above. However, for
cards that have no FCode image, Open Firmware shall assume the standard address
ranges and shall create the "reg" property with these ranges, in addition to any
 relocatable regions that have base registers.


For VGA devices (class-code = 0x000100 or 0x030000), the address ranges are:
0x3B0-0x3BB (I/O, aliased; t=1)
0x3C0-0x3DF (I/O, aliased; t=1)
0xA0000-0xBFFFF (Memory, below 1MB, t=1)

For IDE devices (class-code = 0x010100), the address ranges are:
0x1F0-0x1F7 Primary Command Block (I/O)
0x3F6 Primary Control Block (I/O)
0x170-0x17F Secondary Command Block (I/O)
0x376 Secondary Control Block (I/O)

As you can see, both types of controller expect to be given a physical address range by Open Firmware. You can determine that your device is requesting a non relocatable address range by looking at the reg property in the node for your device. If phys.hi bit 31 is a 1, then your device is requesting a non-relocatable address range. This might not be a problem if one device is requesting non-relocatable address space. However, if your Macintosh has more that one device requesting hard-coded space, then you must check to see if there is a conflict.

[Mar 20 2000]