Hello everyone
(target is C6678)
I'm working on PCIe and researching the enumeration process.
I've looked at the Linux PCIe RC (Host) Driver for KeyStone PCIe Module configured as Root Complex
In the check_device function
/** * check_device() - Checks device availability * @bus: Pointer to bus to check the device availability on * @devfn: Device number and function * * Checks for the possibility of device being present. Relies on following * logic to indicate success: * - downstream link must be established to traverse PCIe fabric * - treating RC as virtual PCI bridge, first (and only) device on bus 1 will be * numbered as 0 * - don't check device number beyond bus 1 as device on our secondary side may * as well be a PCIe-PCI bridge */ static int check_device(struct pci_bus *bus, unsigned int devfn)
I see this comment
/* * Apparently the C66x does not manage the error response * to non-posted PCIe transactions with an explicit abort external * exception like on ARM with its MMU. * * So in order to check if a device is present or not when * accessing the PCIe remote configuration space, we try to * read and modify the parity enable bit of the PCI command field. * According to the PCI specification this bit is r/w and can be * modified for all EP and bridges. * * If the bit can be modified we come to the conclusion that * device is present. Otherwise device is not present. */
Can someone explains a little more about this ?
It would mean that the C6678 as a Root Complex doesn't respect the standard enumeration process as defined in the PCIe specification...
Regards,
Clement