示例#1
0
static int
thunder_pem_get_id(device_t pci, device_t child, enum pci_id_type type,
    uintptr_t *id)
{
	int bsf;
	int pem;

	if (type != PCI_ID_MSI)
		return (pcib_get_id(pci, child, type, id));

	bsf = pci_get_rid(child);

	/* PEM (PCIe MAC/root complex) number is equal to domain */
	pem = pci_get_domain(child);

	/*
	 * Set appropriate device ID (passed by the HW along with
	 * the transaction to memory) for different root complex
	 * numbers using hard-coded domain portion for each group.
	 */
	if (pem < 3)
		*id = (0x1 << PCI_RID_DOMAIN_SHIFT) | bsf;
	else if (pem < 6)
		*id = (0x3 << PCI_RID_DOMAIN_SHIFT) | bsf;
	else if (pem < 9)
		*id = (0x9 << PCI_RID_DOMAIN_SHIFT) | bsf;
	else if (pem < 12)
		*id = (0xB << PCI_RID_DOMAIN_SHIFT) | bsf;
	else
		return (ENXIO);

	return (0);
}
static int
thunder_pem_fdt_get_id(device_t dev, device_t child, enum pci_id_type type,
                       uintptr_t *id)
{
    phandle_t node;
    uint32_t rid;
    uint16_t pci_rid;

    if (type != PCI_ID_MSI)
        return (pcib_get_id(dev, child, type, id));

    node = ofw_bus_get_node(dev);
    pci_rid = pci_get_rid(child);

    ofw_bus_msimap(node, pci_rid, NULL, &rid);
    *id = rid;

    return (0);
}