On Fri, 20 Dec 2002 19:27:14 +0100 (CET), Daniela Engert wrote: >>HWDEVICE MyDevice; >>USHORT MyIRQ; >> >>if (MyDevice = PCI_FindDevice(0x1073, -1, PDD_FIND_STRAIGHT, 0)) { >> MyIRQ = PDD_GetDeviceIRQ(MyDevice,0); >> PrintF ("Yamaha found on %lx using %d!", &MyDevice, MyIRQ); >> PCI_WriteConfigDWord (MyDevice, 64, 0x1000); >> } >>That's all the code needed to find the first PCI-device of vendor 0x1073 and >Interesting. I have no idea (yet) how rich your API is, but in >DaniS506.ADD I have a quite elaborate code to find supported PCI >devices (for details see attachment):
>enumerate *all* PCI functions on *all* PCI type buses. Take into already doing that. I'm also assigning bus numbers after I enumerated all buses and scanning them as well. And if those contain another bridge, it's enumerated again, etc. pp. >account that some old PCI bridges have badly broken PCI config spaces! i would like to get more information on that. Anyway as soon as gconfig is uploaded to netlabs, you may look by yourself and implement work-arounds for such bridges. Bridges will get a separate HWDeviceID Group, so it's easy to check them later. >For each PCI function found do >{ > if (PCI class == PCI_MASS_STORAGE) { > read PCI vendor and device id; > match ids against a list of known devices to map functionally >identical chips to a single member; > set compatible_device_id = remapped_device_id; > match vendor id and compatible_device_id against a list of known >devices to map chips from the same "family" to a single representant; > match family vendor and device id against a list of supported chip >families returning an index into this list; > if (no match in list) { > if ((PCI subclass == PCI_IDE_CONTROLLER) && > (PCI programming interface == LEGACY)) > if (PCI programming interface == PCI IDE busmaster) > index = generic legacy SFF8038 compliant IDE busmaster >device; > else > index = generic legacy IDE device; > else > unknown/unsupported chip found; > } > if (supported chip found) { > construct a IDE PCI device object instance from index into object >factory; > call "accept" method; > if (instance acceptable) > keep object instance; > else > destroy object instance; > } > } >} >In which way could GCONFIG help in this process ? Hmm for such complex enumeration, I would propose that you use GCONFIG Detection area directly. This means that you will get access to all base-blocks. Each contains the basic information for a piece of hardware like e.g.: Revision : BYTE - Minor version number Version : BYTE - Major version number Class.BaseClass : BYTE - Base-Class Class.Subclass : BYTE - Sub-Class Class.Interface : BYTE - Programming interface class Class.Unused : BYTE - Reserved VendorID : WORD - VendorID of Device DeviceID : WORD - DeviceID of Device CardVendorID : WORD - VendorID of actual card CardDeviceID : WORD - DeviceID of actual card CompatVendorID : WORD - Compatible VendorID CompatDeviceID : WORD - Compatible DeviceID ...and some more. So you should be able to get your checking done by just using the base-blocks w/o any real PCI space interaction. And if you do, then you may use the PCI_Read/WriteConfigSpace functions. Note: This base-block is available for all sorts of devices including PnP, PCI, USB, etc. pp. You will have to check, if the HWDeviceID is of type PCI, so you get all PCI devices (not bridges, nor cardbus). If you also support cardbus, you should check for type Cardbus as well. cu, Kiewitz ----------- To unsubscribe yourself from this list, send the following message to [EMAIL PROTECTED] unsubscribe acpi-os2 end