/* * Configure all devices found that we know about. * This is done at boot time. */ void cpu_configure(void) { #ifdef ENABLE_INT5_STATCLOCK evcnt_attach_static(&statclock_ev); #endif (void)splhigh(); /* To be really sure.. */ if (config_rootfound("mainbus", NULL) == NULL) panic("no mainbus found"); /* Configuration is finished, turn on interrupts. */ #ifdef ENABLE_INT5_STATCLOCK /* * Enable interrupt sources. * We can't enable CPU INT5 which is used by statclock(9) here * until cpu_initclocks(9) is called because there is no way * to disable it other than setting status register by spl(9). */ _spllower(MIPS_INT_MASK_5); #else /* enable all source forcing SOFT_INTs cleared */ _splnone(); #endif }
/* ARGSUSED */ void fwisoattach(int n) { int i; memset(fwiso_data_str, 0, sizeof(fwiso_data_str)); for (i = 0; i < NFWISO; ++i) { snprintf(fwiso_data_str[i].fd_devname, 10, "fwiso%d", i); fwiso_data_str[i].fd_channel = -1; fwiso_data_str[i].fd_mode = -1; fwiso_data_str[i].fd_threshold = 0; fwiso_data_str[i].fd_tag = 0; fwiso_data_str[i].fd_uioprev = 0; } evcnt_attach_static(&fwiso_drop_ev); evcnt_attach_static(&fwiso_frame_ev); }
/* * Attach a dynamically-initialized event. Zero it, set up the type * and string pointers and then act like it was statically initialized. */ void evcnt_attach_dynamic_nozero(struct evcnt *ev, int type, const struct evcnt *parent, const char *group, const char *name) { ev->ev_type = type; ev->ev_parent = parent; ev->ev_group = group; ev->ev_name = name; evcnt_attach_static(ev); }
void interrupt_init(void) { static const char *softintr_names[] = IPL_SOFTNAMES; struct playstation2_soft_intr *asi; int i; evcnt_attach_static(&_playstation2_evcnt.clock); evcnt_attach_static(&_playstation2_evcnt.sbus); evcnt_attach_static(&_playstation2_evcnt.dmac); for (i = 0; i < _IPL_NSOFT; i++) { asi = &playstation2_soft_intrs[i]; TAILQ_INIT(&asi->softintr_q); asi->softintr_ipl = IPL_SOFT + i; simple_lock_init(&asi->softintr_slock); evcnt_attach_dynamic(&asi->softintr_evcnt, EVCNT_TYPE_INTR, NULL, "soft", softintr_names[i]); } /* XXX Establish legacy soft interrupt handlers. */ softnet_intrhand = softintr_establish(IPL_SOFTNET, (void (*)(void *))netintr, NULL); KDASSERT(softnet_intrhand != NULL); /* install software interrupt handler */ intc_intr_establish(I_CH10_TIMER1, IPL_SOFT, timer1_intr, 0); intc_intr_establish(I_CH11_TIMER2, IPL_SOFTCLOCK, timer2_intr, 0); /* IPL_SOFTNET and IPL_SOFTSERIAL are shared interrupt. */ intc_intr_establish(I_CH12_TIMER3, IPL_SOFTNET, timer3_intr, 0); /* enable SIF BIOS access */ md_imask = ~D_STAT_CIM_BIT(D_CH5_SIF0); mips_cp0_status_write(0x00010801); }
static void timer_jazzio_attach(device_t parent, device_t self, void *aux) { if (timer_jazzio_conf == NULL) panic("timer_jazzio_conf isn't initialized"); aprint_normal("\n"); evcnt_attach_static(&timer_jazzio_ev); (*platform->set_intr)(timer_jazzio_conf->tjc_intr_mask, timer_jazzio_conf->tjc_intr, ARC_INTPRI_TIMER_INT); timerattach(self, &timerfns_jazzio); timer_jazzio_found = 1; }
/* * Initialize event counters. This does the attach procedure for * each of the static event counters in the "evcnts" link set. */ void evcnt_init(void) { __link_set_decl(evcnts, struct evcnt); struct evcnt * const *evp; KASSERT(!init_done); mutex_init(&evcnt_lock, MUTEX_DEFAULT, IPL_NONE); init_done = true; __link_set_foreach(evp, evcnts) { if (*evp == &dummy_static_evcnt) continue; evcnt_attach_static(*evp); } }
/* * Attach the mainbus. * * Our main job is to attach the CPU (the root node we got in configure()) * and iterate down the list of `mainbus devices' (children of that node). * We also record the `node id' of the default frame buffer, if any. */ static void mainbus_attach(device_t parent, device_t dev, void *aux) { extern struct sparc_bus_dma_tag mainbus_dma_tag; extern struct sparc_bus_space_tag mainbus_space_tag; struct mainbus_attach_args ma; char sbuf[32]; const char *const *ssp, *sp = NULL; char *c; int node0, node, rv, i; static const char *const openboot_special[] = { /* ignore these (end with NULL) */ /* * These are _root_ devices to ignore. Others must be handled * elsewhere. */ "virtual-memory", "aliases", "memory", "openprom", "options", "packages", "chosen", NULL }; if (OF_getprop(findroot(), "banner-name", machine_banner, sizeof machine_banner) < 0) i = 0; else { i = 1; if (((c = strchr(machine_banner, '(')) != NULL) && c != &machine_banner[0]) { while (*c == '(' || *c == ' ') { *c = '\0'; c--; } } } OF_getprop(findroot(), "name", machine_model, sizeof machine_model); prom_getidprom(); if (i) aprint_normal(": %s (%s): hostid %lx\n", machine_model, machine_banner, hostid); else aprint_normal(": %s: hostid %lx\n", machine_model, hostid); aprint_naive("\n"); /* * Locate and configure the ``early'' devices. These must be * configured before we can do the rest. For instance, the * EEPROM contains the Ethernet address for the LANCE chip. * If the device cannot be located or configured, panic. */ if (sparc_ncpus == 0) panic("None of the CPUs found"); /* * Init static interrupt eventcounters */ for (i = 0; i < __arraycount(intr_evcnts); i++) evcnt_attach_static(&intr_evcnts[i]); node = findroot(); /* first early device to be configured is the CPU */ for (node = OF_child(node); node; node = OF_peer(node)) { if (OF_getprop(node, "device_type", sbuf, sizeof(sbuf)) <= 0) continue; if (strcmp(sbuf, "cpu") != 0) continue; memset(&ma, 0, sizeof(ma)); ma.ma_bustag = &mainbus_space_tag; ma.ma_dmatag = &mainbus_dma_tag; ma.ma_node = node; ma.ma_name = "cpu"; config_found(dev, &ma, mbprint); } node = findroot(); /* re-init root node */ /* Find the "options" node */ node0 = OF_child(node); /* * Configure the devices, in PROM order. Skip * PROM entries that are not for devices, or which must be * done before we get here. */ for (node = node0; node; node = OF_peer(node)) { int portid; DPRINTF(ACDB_PROBE, ("Node: %x", node)); if ((OF_getprop(node, "device_type", sbuf, sizeof(sbuf)) > 0) && strcmp(sbuf, "cpu") == 0) continue; OF_getprop(node, "name", sbuf, sizeof(sbuf)); DPRINTF(ACDB_PROBE, (" name %s\n", sbuf)); for (ssp = openboot_special; (sp = *ssp) != NULL; ssp++) if (strcmp(sbuf, sp) == 0) break; if (sp != NULL) continue; /* an "early" device already configured */ memset(&ma, 0, sizeof ma); ma.ma_bustag = &mainbus_space_tag; ma.ma_dmatag = &mainbus_dma_tag; ma.ma_name = sbuf; ma.ma_node = node; if (OF_getprop(node, "upa-portid", &portid, sizeof(portid)) != sizeof(portid) && OF_getprop(node, "portid", &portid, sizeof(portid)) != sizeof(portid)) portid = -1; ma.ma_upaid = portid; if (prom_getprop(node, "reg", sizeof(*ma.ma_reg), &ma.ma_nreg, &ma.ma_reg) != 0) continue; #ifdef DEBUG if (autoconf_debug & ACDB_PROBE) { if (ma.ma_nreg) printf(" reg %08lx.%08lx\n", (long)ma.ma_reg->ur_paddr, (long)ma.ma_reg->ur_len); else printf(" no reg\n"); } #endif rv = prom_getprop(node, "interrupts", sizeof(*ma.ma_interrupts), &ma.ma_ninterrupts, &ma.ma_interrupts); if (rv != 0 && rv != ENOENT) { free(ma.ma_reg, M_DEVBUF); continue; } #ifdef DEBUG if (autoconf_debug & ACDB_PROBE) { if (ma.ma_interrupts) printf(" interrupts %08x\n", *ma.ma_interrupts); else printf(" no interrupts\n"); } #endif rv = prom_getprop(node, "address", sizeof(*ma.ma_address), &ma.ma_naddress, &ma.ma_address); if (rv != 0 && rv != ENOENT) { free(ma.ma_reg, M_DEVBUF); if (ma.ma_ninterrupts) free(ma.ma_interrupts, M_DEVBUF); continue; } #ifdef DEBUG if (autoconf_debug & ACDB_PROBE) { if (ma.ma_naddress) printf(" address %08x\n", *ma.ma_address); else printf(" no address\n"); } #endif (void) config_found(dev, (void *)&ma, mbprint); free(ma.ma_reg, M_DEVBUF); if (ma.ma_ninterrupts) free(ma.ma_interrupts, M_DEVBUF); if (ma.ma_naddress) free(ma.ma_address, M_DEVBUF); } /* Try to attach PROM console */ memset(&ma, 0, sizeof ma); ma.ma_name = "pcons"; (void) config_found(dev, (void *)&ma, mbprint); }