int acpidock_walkchildren(struct aml_node *node, void *arg) { struct acpidock_softc *sc = arg; struct aml_nodelist *n; if (node && node->value && node->value->type == AML_OBJTYPE_DEVICE) { n = malloc(sizeof *n, M_DEVBUF, M_WAITOK | M_ZERO); n->node = node; dnprintf(10,"%s depends on", aml_nodename(node)); dnprintf(10,"%s\n", aml_nodename(sc->sc_devnode)); TAILQ_INSERT_TAIL(&sc->sc_deps_h, n, entries); } return (0); }
void db_acpi_trace(db_expr_t addr, int haddr, db_expr_t count, char *modif) { struct aml_scope *root; struct aml_value *sp; int idx; extern struct aml_scope *aml_lastscope; for (root=aml_lastscope; root && root->pos; root=root->parent) { db_printf("%.4x Called: %s\n", aml_pc(root->pos), aml_nodename(root->node)); for (idx = 0; idx< AML_MAX_ARG; idx++) { sp = aml_getstack(root, AMLOP_ARG0 + idx); if (sp && sp->type) { db_printf(" arg%d: ", idx); db_aml_showvalue(sp); } } for (idx = 0; idx < AML_MAX_LOCAL; idx++) { sp = aml_getstack(root, AMLOP_LOCAL0 + idx); if (sp && sp->type) { db_printf(" local%d: ", idx); db_aml_showvalue(sp); } } } }
void acpiprt_prt_add(struct acpiprt_softc *sc, struct aml_value *v) { struct aml_node *node; struct aml_value res, *pp; u_int64_t addr; int pin, irq, sta; #if NIOAPIC > 0 struct mp_intr_map *map; struct ioapic_softc *apic; #endif pci_chipset_tag_t pc = NULL; pcitag_t tag; pcireg_t reg; int bus, dev, func, nfuncs; if (v->type != AML_OBJTYPE_PACKAGE || v->length != 4) { printf("invalid mapping object\n"); return; } addr = aml_val2int(v->v_package[0]); pin = aml_val2int(v->v_package[1]); if (pin > 3) { return; } pp = v->v_package[2]; if (pp->type == AML_OBJTYPE_NAMEREF) { node = aml_searchname(sc->sc_devnode, pp->v_nameref); if (node == NULL) { printf("Invalid device!\n"); return; } pp = node->value; } if (pp->type == AML_OBJTYPE_OBJREF) { pp = pp->v_objref.ref; } if (pp->type == AML_OBJTYPE_DEVICE) { node = pp->node; if (aml_evalname(sc->sc_acpi, node, "_STA", 0, NULL, &res)) printf("no _STA method\n"); sta = aml_val2int(&res) & STA_ENABLED; aml_freevalue(&res); if (sta == 0) return; if (aml_evalname(sc->sc_acpi, node, "_CRS", 0, NULL, &res)) printf("no _CRS method\n"); if (res.type != AML_OBJTYPE_BUFFER || res.length < 6) { printf("invalid _CRS object\n"); aml_freevalue(&res); return; } aml_parse_resource(res.length, res.v_buffer, acpiprt_getirq, &irq); aml_freevalue(&res); } else { irq = aml_val2int(v->v_package[3]); } #ifdef ACPI_DEBUG printf("%s: %s addr 0x%llx pin %d irq %d\n", DEVNAME(sc), aml_nodename(pp->node), addr, pin, irq); #endif #if NIOAPIC > 0 if (nioapics > 0) { apic = ioapic_find_bybase(irq); if (apic == NULL) { printf("%s: no apic found for irq %d\n", DEVNAME(sc), irq); return; } map = malloc(sizeof (struct mp_intr_map), M_DEVBUF, M_NOWAIT); if (map == NULL) return; memset(map, 0, sizeof *map); map->ioapic = apic; map->ioapic_pin = irq - apic->sc_apic_vecbase; map->bus_pin = ((addr >> 14) & 0x7c) | (pin & 0x3); map->redir = IOAPIC_REDLO_ACTLO | IOAPIC_REDLO_LEVEL; map->redir |= (IOAPIC_REDLO_DEL_LOPRI << IOAPIC_REDLO_DEL_SHIFT); map->ioapic_ih = APIC_INT_VIA_APIC | ((apic->sc_apicid << APIC_INT_APIC_SHIFT) | (map->ioapic_pin << APIC_INT_PIN_SHIFT)); apic->sc_pins[map->ioapic_pin].ip_map = map; map->next = mp_busses[sc->sc_bus].mb_intrs; mp_busses[sc->sc_bus].mb_intrs = map; return; }
void db_aml_showvalue(struct aml_value *value) { int idx; if (value == NULL) return; if (value->node) db_printf("[%s] ", aml_nodename(value->node)); switch (value->type & ~AML_STATIC) { case AML_OBJTYPE_OBJREF: db_printf("refof: %x {\n", value->v_objref.index); db_aml_showvalue(value->v_objref.ref); db_printf("}\n"); break; case AML_OBJTYPE_NAMEREF: db_printf("nameref: %s\n", value->v_nameref); break; case AML_OBJTYPE_INTEGER: db_printf("integer: %llx %s\n", value->v_integer, (value->type & AML_STATIC) ? "(static)" : ""); break; case AML_OBJTYPE_STRING: db_printf("string: %s\n", value->v_string); break; case AML_OBJTYPE_PACKAGE: db_printf("package: %d {\n", value->length); for (idx = 0; idx < value->length; idx++) db_aml_showvalue(value->v_package[idx]); db_printf("}\n"); break; case AML_OBJTYPE_BUFFER: db_printf("buffer: %d ", value->length); db_aml_dump(value->length, value->v_buffer); break; case AML_OBJTYPE_DEBUGOBJ: db_printf("debug"); break; case AML_OBJTYPE_MUTEX: db_printf("mutex : %llx\n", value->v_integer); break; case AML_OBJTYPE_DEVICE: db_printf("device\n"); break; case AML_OBJTYPE_EVENT: db_printf("event\n"); break; case AML_OBJTYPE_PROCESSOR: db_printf("cpu: %x,%x,%x\n", value->v_processor.proc_id, value->v_processor.proc_addr, value->v_processor.proc_len); break; case AML_OBJTYPE_METHOD: db_printf("method: args=%d, serialized=%d, synclevel=%d\n", AML_METHOD_ARGCOUNT(value->v_method.flags), AML_METHOD_SERIALIZED(value->v_method.flags), AML_METHOD_SYNCLEVEL(value->v_method.flags)); break; case AML_OBJTYPE_FIELDUNIT: db_printf("%s: access=%x,lock=%x,update=%x pos=%.4x " "len=%.4x\n", aml_mnem(value->v_field.type, NULL), AML_FIELD_ACCESS(value->v_field.flags), AML_FIELD_LOCK(value->v_field.flags), AML_FIELD_UPDATE(value->v_field.flags), value->v_field.bitpos, value->v_field.bitlen); if (value->v_field.ref2) db_printf(" index: %.3x %s\n", value->v_field.ref3, aml_nodename(value->v_field.ref2->node)); if (value->v_field.ref1) db_printf(" data: %s\n", aml_nodename(value->v_field.ref1->node)); break; case AML_OBJTYPE_BUFFERFIELD: db_printf("%s: pos=%.4x len=%.4x\n", aml_mnem(value->v_field.type, NULL), value->v_field.bitpos, value->v_field.bitlen); db_printf(" buffer: %s\n", aml_nodename(value->v_field.ref1->node)); break; case AML_OBJTYPE_OPREGION: db_printf("opregion: %s,0x%llx,0x%x\n", db_opregion(value->v_opregion.iospace), value->v_opregion.iobase, value->v_opregion.iolen); break; default: db_printf("unknown: %d\n", value->type); break; } }