Beispiel #1
0
int __init device_init(struct dt_device_node *dev, enum device_type type,
                       const void *data)
{
    const struct device_desc *desc;

    ASSERT(dev != NULL);

    if ( !dt_device_is_available(dev) )
        return  -ENODEV;

    for ( desc = _sdevice; desc != _edevice; desc++ )
    {
        if ( desc->type != type )
            continue;

        if ( device_is_compatible(desc, dev) )
        {
            ASSERT(desc->init != NULL);

            return desc->init(dev, data);
        }

    }

    return -EBADF;
}
Beispiel #2
0
/*
 * Xen does not currently support mapping MMIO regions and interrupt
 * for bus child devices (referenced via the "ranges" and
 * "interrupt-map" properties to domain 0). Instead for now map the
 * necessary resources manually.
 */
static int xgene_storm_specific_mapping(struct domain *d)
{
    struct dt_device_node *node = NULL;
    int ret;

    while ( (node = dt_find_compatible_node(node, "pci", "apm,xgene-pcie")) )
    {
        u64 addr;

        /* Identify the bus via it's control register address */
        ret = dt_device_get_address(node, 0, &addr, NULL);
        if ( ret < 0 )
            return ret;

        if ( !dt_device_is_available(node) )
            continue;

       switch ( addr )
        {
        case 0x1f2b0000: /* PCIe0 */
            ret = xgene_storm_pcie_specific_mapping(d,
                node,
                0x0e000000000UL, 0x10000000000UL, 0xc2);
            break;
        case 0x1f2c0000: /* PCIe1 */
            ret = xgene_storm_pcie_specific_mapping(d,
                node,
                0x0d000000000UL, 0x0e000000000UL, 0xc8);
            break;
        case 0x1f2d0000: /* PCIe2 */
            ret = xgene_storm_pcie_specific_mapping(d,
                node,
                0x09000000000UL, 0x0a000000000UL, 0xce);
            break;
        case 0x1f500000: /* PCIe3 */
            ret = xgene_storm_pcie_specific_mapping(d,
                node,
                0x0a000000000UL, 0x0c000000000UL, 0xd4);
            break;
        case 0x1f510000: /* PCIe4 */
            ret = xgene_storm_pcie_specific_mapping(d,
                node,
                0x0c000000000UL, 0x0d000000000UL, 0xda);
            break;

        default:
            printk("Ignoring unknown PCI bus %s\n", dt_node_full_name(node));
            continue;
        }

        if ( ret < 0 )
            return ret;
    }

    return 0;
}