Exemplo n.º 1
0
Arquivo: apb.c Projeto: MarginC/kame
static int
apb_attach(device_t dev)
{
	struct apb_softc *sc;
	device_t child;

	sc = device_get_softc(dev);
	sc->dev = dev;

	/*
	 * Get current bridge configuration.
	 */
	sc->secbus = pci_read_config(dev, PCIR_SECBUS_1, 1);
	sc->subbus = pci_read_config(dev, PCIR_SUBBUS_1, 1);
	sc->iomap = pci_read_config(dev, APBR_IOMAP, 1);
	sc->memmap = pci_read_config(dev, APBR_MEMMAP, 1);

	if (bootverbose) {
		device_printf(dev, "  secondary bus     %d\n", sc->secbus);
		device_printf(dev, "  subordinate bus   %d\n", sc->subbus);
		device_printf(dev, "  I/O decode        ");
		apb_map_print(sc->iomap, APB_IO_SCALE);
		printf("\n");
		device_printf(dev, "  memory decode     ");
		apb_map_print(sc->memmap, APB_MEM_SCALE);
		printf("\n");
	}

	/*
	 * XXX If the subordinate bus number is less than the secondary bus
	 * number, we should pick a better value.  One sensible alternative
	 * would be to pick 255; the only tradeoff here is that configuration
	 * transactions would be more widely routed than absolutely necessary.
	 */
	if (sc->secbus != 0) {
		child = device_add_child(dev, "pci", -1);
		if (child != NULL)
			return (bus_generic_attach(dev));
	} else
		panic("apb_attach: APB with uninitialized secbus");

	/* no secondary bus; we should have fixed this */
	return (0);
}
Exemplo n.º 2
0
static int
apb_attach(device_t dev)
{
    struct apb_softc *sc;
    struct sysctl_ctx_list *sctx;
    struct sysctl_oid *soid;

    sc = device_get_softc(dev);

    /*
     * Get current bridge configuration.
     */
    sc->sc_bsc.ops_pcib_sc.domain = pci_get_domain(dev);
    sc->sc_bsc.ops_pcib_sc.secstat =
        pci_read_config(dev, PCIR_SECSTAT_1, 2);
    sc->sc_bsc.ops_pcib_sc.command =
        pci_read_config(dev, PCIR_COMMAND, 2);
    sc->sc_bsc.ops_pcib_sc.pribus =
        pci_read_config(dev, PCIR_PRIBUS_1, 1);
    sc->sc_bsc.ops_pcib_sc.bus.sec =
        pci_read_config(dev, PCIR_SECBUS_1, 1);
    sc->sc_bsc.ops_pcib_sc.bus.sub =
        pci_read_config(dev, PCIR_SUBBUS_1, 1);
    sc->sc_bsc.ops_pcib_sc.bridgectl =
        pci_read_config(dev, PCIR_BRIDGECTL_1, 2);
    sc->sc_bsc.ops_pcib_sc.seclat =
        pci_read_config(dev, PCIR_SECLAT_1, 1);
    sc->sc_iomap = pci_read_config(dev, APBR_IOMAP, 1);
    sc->sc_memmap = pci_read_config(dev, APBR_MEMMAP, 1);

    /*
     * Setup SYSCTL reporting nodes.
     */
    sctx = device_get_sysctl_ctx(dev);
    soid = device_get_sysctl_tree(dev);
    SYSCTL_ADD_UINT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "domain",
                    CTLFLAG_RD, &sc->sc_bsc.ops_pcib_sc.domain, 0,
                    "Domain number");
    SYSCTL_ADD_UINT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "pribus",
                    CTLFLAG_RD, &sc->sc_bsc.ops_pcib_sc.pribus, 0,
                    "Primary bus number");
    SYSCTL_ADD_UINT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "secbus",
                    CTLFLAG_RD, &sc->sc_bsc.ops_pcib_sc.bus.sec, 0,
                    "Secondary bus number");
    SYSCTL_ADD_UINT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "subbus",
                    CTLFLAG_RD, &sc->sc_bsc.ops_pcib_sc.bus.sub, 0,
                    "Subordinate bus number");

    ofw_pcib_gen_setup(dev);

    if (bootverbose) {
        device_printf(dev, "  domain            %d\n",
                      sc->sc_bsc.ops_pcib_sc.domain);
        device_printf(dev, "  secondary bus     %d\n",
                      sc->sc_bsc.ops_pcib_sc.bus.sec);
        device_printf(dev, "  subordinate bus   %d\n",
                      sc->sc_bsc.ops_pcib_sc.bus.sub);
        device_printf(dev, "  I/O decode        ");
        apb_map_print(sc->sc_iomap, APB_IO_SCALE);
        printf("\n");
        device_printf(dev, "  memory decode     ");
        apb_map_print(sc->sc_memmap, APB_MEM_SCALE);
        printf("\n");
    }

    device_add_child(dev, "pci", -1);
    return (bus_generic_attach(dev));
}