void pldwdog_attach(device_t parent, device_t self, void *aux) { struct pldwdog_softc *sc = device_private(self); struct ebus_attach_args *ea = aux; printf("\n"); sc->sc_dev = self; sc->sc_btag = ea->ea_bustag; if (ea->ea_nreg < 1) { printf(": no registers??\n"); return; } if (ea->ea_nvaddr) sparc_promaddr_to_handle(sc->sc_btag, ea->ea_vaddr[0], &sc->sc_bh); else if (bus_space_map(sc->sc_btag, EBUS_ADDR_FROM_REG(&ea->ea_reg[0]), ea->ea_reg[0].size, 0, &sc->sc_bh) != 0) { printf(": can't map register space\n"); return; } sc->sc_wdog_period = PLD_WDOG_PERIOD_DEFAULT; sc->sc_smw.smw_name = device_xname(sc->sc_dev); sc->sc_smw.smw_cookie = sc; sc->sc_smw.smw_setmode = pldwdog_setmode; sc->sc_smw.smw_tickle = pldwdog_tickle; sc->sc_smw.smw_period = sc->sc_wdog_period; if (sysmon_wdog_register(&sc->sc_smw) != 0) aprint_error_dev(sc->sc_dev, "unable to register with sysmon\n"); /* pldwdog_regs(sc); */ #if 0 bus_intr_establish(ea->ea_bustag, ea->ea_intr[0], IPL_TTY, pldwdog_intr, sc); #endif }
void lpt_ebus_attach(device_t parent, device_t self, void *aux) { struct lpt_softc *sc = device_private(self); struct ebus_attach_args *ea = aux; int i; sc->sc_dev = self; sc->sc_iot = ea->ea_bustag; /* * Addresses that should be supplied by the prom: * - normal lpt registers * - ns873xx configuration registers * - DMA space * The `lpt' driver does not use DMA accesses, so we can * ignore that for now. We should enable the lpt port in * the ns873xx registers here. XXX * * Use the prom address if there. */ if (ea->ea_nvaddr) sparc_promaddr_to_handle(sc->sc_iot, ea->ea_vaddr[0], &sc->sc_ioh); else if (bus_space_map(sc->sc_iot, EBUS_ADDR_FROM_REG(&ea->ea_reg[0]), ea->ea_reg[0].size, 0, &sc->sc_ioh) != 0) { aprint_error(": can't map register space\n"); return; } for (i = 0; i < ea->ea_nintr; i++) bus_intr_establish(ea->ea_bustag, ea->ea_intr[i], IPL_SERIAL, lptintr, sc); aprint_normal("\n"); lpt_attach_subr(sc); }
/* * SUNW,psycho initialisation .. * - find the per-psycho registers * - figure out the IGN. * - find our partner psycho * - configure ourselves * - bus range, bus, * - get interrupt-map and interrupt-map-mask * - setup the chipsets. * - if we're the first of the pair, initialise the IOMMU, otherwise * just copy its tags and addresses. */ static void psycho_attach(device_t parent, device_t self, void *aux) { struct psycho_softc *sc = device_private(self); struct psycho_softc *osc = NULL; struct psycho_pbm *pp; struct pcibus_attach_args pba; struct mainbus_attach_args *ma = aux; struct psycho_ranges *pr; prop_dictionary_t dict; bus_space_handle_t bh; uint64_t csr, mem_base; int psycho_br[2], n, i; bus_space_handle_t pci_ctl; char *model = prom_getpropstring(ma->ma_node, "model"); aprint_normal("\n"); sc->sc_dev = self; sc->sc_node = ma->ma_node; sc->sc_bustag = ma->ma_bustag; sc->sc_dmatag = ma->ma_dmatag; sc->sc_last_stick = 0; if (psycho0 == NULL) psycho0 = sc; DPRINTF(PDB_STICK, ("init psycho0 %lx\n", (long)sc)); /* * Identify the device. */ for (i=0; psycho_names[i].p_name; i++) if (strcmp(model, psycho_names[i].p_name) == 0) { sc->sc_mode = psycho_names[i].p_type; goto found; } model = prom_getpropstring(ma->ma_node, "compatible"); for (i=0; psycho_names[i].p_name; i++) if (strcmp(model, psycho_names[i].p_name) == 0) { sc->sc_mode = psycho_names[i].p_type; goto found; } panic("unknown psycho model %s", model); found: /* * The psycho gets three register banks: * (0) per-PBM configuration and status registers * (1) per-PBM PCI configuration space, containing only the * PBM 256-byte PCI header * (2) the shared psycho configuration registers (struct psychoreg) */ /* Register layouts are different. stuupid. */ if (sc->sc_mode == PSYCHO_MODE_PSYCHO) { sc->sc_basepaddr = (paddr_t)ma->ma_reg[2].ur_paddr; if (ma->ma_naddress > 2) { sparc_promaddr_to_handle(sc->sc_bustag, ma->ma_address[2], &sc->sc_bh); sparc_promaddr_to_handle(sc->sc_bustag, ma->ma_address[0], &pci_ctl); sc->sc_regs = (struct psychoreg *) bus_space_vaddr(sc->sc_bustag, sc->sc_bh); } else if (ma->ma_nreg > 2) { /* We need to map this in ourselves. */ if (bus_space_map(sc->sc_bustag, ma->ma_reg[2].ur_paddr, ma->ma_reg[2].ur_len, BUS_SPACE_MAP_LINEAR, &sc->sc_bh)) panic("psycho_attach: cannot map regs"); sc->sc_regs = (struct psychoreg *) bus_space_vaddr(sc->sc_bustag, sc->sc_bh); if (bus_space_map(sc->sc_bustag, ma->ma_reg[0].ur_paddr, ma->ma_reg[0].ur_len, BUS_SPACE_MAP_LINEAR, &pci_ctl)) panic("psycho_attach: cannot map ctl"); } else panic("psycho_attach: %d not enough registers", ma->ma_nreg); } else { sc->sc_basepaddr = (paddr_t)ma->ma_reg[0].ur_paddr; if (ma->ma_naddress) { sparc_promaddr_to_handle(sc->sc_bustag, ma->ma_address[0], &sc->sc_bh); sc->sc_regs = (struct psychoreg *) bus_space_vaddr(sc->sc_bustag, sc->sc_bh); bus_space_subregion(sc->sc_bustag, sc->sc_bh, offsetof(struct psychoreg, psy_pcictl), sizeof(struct pci_ctl), &pci_ctl); } else if (ma->ma_nreg) {
void sab_attach(struct device *parent, struct device *self, void *aux) { struct sab_softc *sc = (struct sab_softc *)self; struct ebus_attach_args *ea = aux; uint8_t r; u_int i; int locs[SABCF_NLOCS]; sc->sc_bt = ea->ea_bustag; sc->sc_node = ea->ea_node; /* Use prom mapping, if available. */ if (ea->ea_nvaddr) sparc_promaddr_to_handle(sc->sc_bt, ea->ea_vaddr[0], &sc->sc_bh); else if (bus_space_map(sc->sc_bt, EBUS_ADDR_FROM_REG(&ea->ea_reg[0]), ea->ea_reg[0].size, 0, &sc->sc_bh) != 0) { printf(": can't map register space\n"); return; } sc->sc_ih = bus_intr_establish(ea->ea_bustag, ea->ea_intr[0], IPL_TTY, sab_intr, sc); if (sc->sc_ih == NULL) { printf(": can't map interrupt\n"); return; } sc->sc_softintr = softint_establish(SOFTINT_SERIAL, sab_softintr, sc); if (sc->sc_softintr == NULL) { printf(": can't get soft intr\n"); return; } aprint_normal(": rev "); r = SAB_READ(sc, SAB_VSTR) & SAB_VSTR_VMASK; switch (r) { case SAB_VSTR_V_1: aprint_normal("1"); break; case SAB_VSTR_V_2: aprint_normal("2"); break; case SAB_VSTR_V_32: aprint_normal("3.2"); break; default: aprint_normal("unknown(0x%x)", r); break; } aprint_normal("\n"); /* Let current output drain */ DELAY(100000); /* Set all pins, except DTR pins to be inputs */ SAB_WRITE(sc, SAB_PCR, ~(SAB_PVR_DTR_A | SAB_PVR_DTR_B)); /* Disable port interrupts */ SAB_WRITE(sc, SAB_PIM, 0xff); SAB_WRITE(sc, SAB_PVR, SAB_PVR_DTR_A | SAB_PVR_DTR_B | SAB_PVR_MAGIC); SAB_WRITE(sc, SAB_IPC, SAB_IPC_ICPL); for (i = 0; i < SAB_NCHAN; i++) { struct sabtty_attach_args stax; stax.sbt_portno = i; locs[SABCF_CHANNEL] = i; sc->sc_child[i] = (struct sabtty_softc *)config_found_sm_loc(self, "sab", locs, &stax, sab_print, config_stdsubmatch); if (sc->sc_child[i] != NULL) sc->sc_nchild++; } }