void acpiprt_attach(struct device *parent, struct device *self, void *aux) { struct acpiprt_softc *sc = (struct acpiprt_softc *)self; struct acpi_attach_args *aa = aux; struct aml_value res; int i; sc->sc_acpi = (struct acpi_softc *)parent; sc->sc_devnode = aa->aaa_node; sc->sc_bus = acpiprt_getpcibus(sc, sc->sc_devnode); printf(": bus %d (%s)", sc->sc_bus, sc->sc_devnode->parent->name); if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PRT", 0, NULL, &res)) { printf(": no PCI interrupt routing table\n"); return; } if (res.type != AML_OBJTYPE_PACKAGE) { printf(": _PRT is not a package\n"); aml_freevalue(&res); return; } printf("\n"); if (sc->sc_bus == -1) return; for (i = 0; i < res.length; i++) acpiprt_prt_add(sc, res.v_package[i]); aml_freevalue(&res); }
int acpiasus_activate(struct device *self, int act) { struct acpiasus_softc *sc = (struct acpiasus_softc *)self; struct aml_value cmd; struct aml_value ret; switch (act) { case DVACT_SUSPEND: break; case DVACT_RESUME: acpiasus_init(self); bzero(&cmd, sizeof(cmd)); cmd.type = AML_OBJTYPE_INTEGER; cmd.v_integer = ASUS_SDSP_LCD; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "SDSP", 1, &cmd, &ret)) printf("%s: no SDSP\n", DEVNAME(sc)); else aml_freevalue(&ret); break; } return (0); }
int toshiba_read_events(struct acpitoshiba_softc *sc) { struct aml_value args[HCI_WORDS]; struct aml_value res; int i, val; bzero(args, sizeof(args)); bzero(&res, sizeof(res)); for (i = 0; i < HCI_WORDS; ++i) args[i].type = AML_OBJTYPE_INTEGER; args[HCI_REG_AX].v_integer = HCI_GET; args[HCI_REG_BX].v_integer = HCI_REG_SYSTEM_EVENT; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI, i, args, &res)) { printf("%s: couldn't toggle METHOD_HCI\n", DEVNAME(sc)); return (HCI_FAILURE); } /* * We receive a package type so we need to get the event * value from the HCI_REG_CX. */ val = aml_val2int(res.v_package[HCI_REG_CX]); aml_freevalue(&res); return (val); }
int toshiba_get_brightness(struct acpitoshiba_softc *sc, u_int32_t *brightness) { struct aml_value args[HCI_WORDS]; struct aml_value res; int i; bzero(args, sizeof(args)); bzero(&res, sizeof(res)); for (i = 0; i < HCI_WORDS; ++i) args[i].type = AML_OBJTYPE_INTEGER; args[HCI_REG_AX].v_integer = HCI_GET; args[HCI_REG_BX].v_integer = HCI_REG_LCD_BRIGHTNESS; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI, i, args, &res)) { printf("%s: get brightness failed\n", DEVNAME(sc)); return (HCI_FAILURE); } /* * We receive a package type so we need to get the event * value from the HCI_REG_CX. */ *brightness = aml_val2int(res.v_package[HCI_REG_CX]); *brightness >>= HCI_LCD_BRIGHTNESS_SHIFT; aml_freevalue(&res); return (HCI_SUCCESS); }
int toshiba_get_video_output(struct acpitoshiba_softc *sc, u_int32_t *video_output) { struct aml_value res, args[HCI_WORDS]; int i; bzero(args, sizeof(args)); bzero(&res, sizeof(res)); for (i = 0; i < HCI_WORDS; ++i) args[i].type = AML_OBJTYPE_INTEGER; args[HCI_REG_AX].v_integer = HCI_GET; args[HCI_REG_BX].v_integer = HCI_REG_VIDEO_OUTPUT; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, METHOD_HCI, i, args, &res)) { printf("%s: get video output failed\n", DEVNAME(sc)); return (HCI_FAILURE); } /* * We receive a package type so we need to get the event * value from the HCI_REG_CX. */ *video_output = aml_val2int(res.v_package[HCI_REG_CX]); *video_output &= 0xff; aml_freevalue(&res); return (HCI_SUCCESS); }
int acpitz_setcpu(struct acpitz_softc *sc, int trend) { struct aml_value res0, *ref; int x; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PSL", 0, NULL, &res0)) { printf("%s: _PSL failed\n", DEVNAME(sc)); goto out; } if (res0.type != AML_OBJTYPE_PACKAGE) { printf("%s: not a package\n", DEVNAME(sc)); goto out; } for (x = 0; x < res0.length; x++) { if (res0.v_package[x]->type != AML_OBJTYPE_OBJREF) { printf("%s: _PSL[%d] not a object ref\n", DEVNAME(sc), x); continue; } ref = res0.v_package[x]->v_objref.ref; if (ref->type != AML_OBJTYPE_PROCESSOR) printf("%s: _PSL[%d] not a CPU\n", DEVNAME(sc), x); } out: aml_freevalue(&res0); return (0); }
int acpidock_eject(struct acpidock_softc *sc, struct aml_node *node) { struct aml_value cmd; struct aml_value res; int rv; if (node != sc->sc_devnode) aml_notify(node, 3); memset(&cmd, 0, sizeof cmd); cmd.v_integer = 1; cmd.type = AML_OBJTYPE_INTEGER; if (aml_evalname(sc->sc_acpi, node, "_EJ0", 1, &cmd, &res) != 0) { dnprintf(15, "%s: _EJ0 failed\n", DEVNAME(sc)); rv = 0; } else { dnprintf(15, "%s: _EJ0 successful\n", DEVNAME(sc)); rv = 1; } aml_freevalue(&res); return (rv); }
void acpisony_set_brightness(struct acpisony_softc *sc, int level) { struct aml_value arg; bzero(&arg, sizeof(arg)); arg.type = AML_OBJTYPE_INTEGER; arg.v_integer = level; aml_evalname(sc->sc_acpi, sc->sc_devnode, "SBRT", 1, &arg, NULL); aml_freevalue(&arg); }
int acpisony_get_brightness(struct acpisony_softc *sc) { struct aml_value res; int val; aml_evalname(sc->sc_acpi, sc->sc_devnode, "GBRT", 0, NULL, &res); val = aml_val2int(&res); aml_freevalue(&res); return val; }
void acpivout_set_brightness(struct acpivout_softc *sc, int level) { struct aml_value args, res; memset(&args, 0, sizeof(args)); args.v_integer = level; args.type = AML_OBJTYPE_INTEGER; DPRINTF(("%s: BCM = %d\n", DEVNAME(sc), level)); aml_evalname(sc->sc_acpi, sc->sc_devnode, "_BCM", 1, &args, &res); aml_freevalue(&res); }
void acpivideo_set_policy(struct acpivideo_softc *sc, int policy) { struct aml_value args, res; memset(&args, 0, sizeof(args)); args.v_integer = policy; args.type = AML_OBJTYPE_INTEGER; aml_evalname(sc->sc_acpi, sc->sc_devnode, "_DOS", 1, &args, &res); DPRINTF(("%s: set policy to %X\n", DEVNAME(sc), aml_val2int(&res))); aml_freevalue(&res); }
int acpitz_getreading(struct acpitz_softc *sc, char *name) { struct aml_value res; int rv = -1; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, name, 0, NULL, &res)) { dnprintf(10, "%s: no %s\n", DEVNAME(sc), name); goto out; } rv = aml_val2int(&res); out: aml_freevalue(&res); return (rv); }
int aibs_getpack(struct aibs_softc *sc, struct aml_node *n, int64_t i, struct aml_value *res) { struct aml_value req; req.type = AML_OBJTYPE_INTEGER; req.v_integer = i; if (aml_evalnode(sc->sc_acpi, n, 1, &req, res)) { dprintf("%s: %s: %lld: evaluation failed\n", DEVNAME(sc), n->name, i); aml_freevalue(res); return (-1); } if (res->type != AML_OBJTYPE_PACKAGE) { dprintf("%s: %s: %lld: not a package: type %i\n", DEVNAME(sc), n->name, i, res->type); aml_freevalue(res); return (-1); } return (0); }
int acpivout_get_brightness(struct acpivout_softc *sc) { struct aml_value res; int level; aml_evalname(sc->sc_acpi, sc->sc_devnode, "_BQC", 0, NULL, &res); level = aml_val2int(&res); aml_freevalue(&res); DPRINTF(("%s: BQC = %d\n", DEVNAME(sc), level)); if (level < sc->sc_bcl[0] || level > sc->sc_bcl[sc->sc_bcl_len -1]) level = -1; return (level); }
void acpiasus_init(struct device *self) { struct acpiasus_softc *sc = (struct acpiasus_softc *)self; struct aml_value cmd; struct aml_value ret; bzero(&cmd, sizeof(cmd)); cmd.type = AML_OBJTYPE_INTEGER; cmd.v_integer = 0x40; /* Disable ASL display switching. */ if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "INIT", 1, &cmd, &ret)) printf("%s: no INIT\n", DEVNAME(sc)); else aml_freevalue(&ret); }
void acpibat_attach(struct device *parent, struct device *self, void *aux) { struct acpibat_softc *sc = (struct acpibat_softc *)self; struct acpi_attach_args *aa = aux; struct aml_value res; sc->sc_acpi = (struct acpi_softc *)parent; sc->sc_devnode = aa->aaa_node; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, &res)) { dnprintf(10, "%s: no _STA\n", DEVNAME(sc)); return; } if ((res.v_integer & STA_BATTERY) != 0) { sc->sc_bat_present = 1; acpibat_getbif(sc); acpibat_getbst(sc); printf(": %s", sc->sc_devnode->name); if (sc->sc_bif.bif_model[0]) printf(" model \"%s\"", sc->sc_bif.bif_model); if (sc->sc_bif.bif_serial[0]) printf(" serial %s", sc->sc_bif.bif_serial); if (sc->sc_bif.bif_type[0]) printf(" type %s", sc->sc_bif.bif_type); if (sc->sc_bif.bif_oem[0]) printf(" oem \"%s\"", sc->sc_bif.bif_oem); printf("\n"); } else { sc->sc_bat_present = 0; printf(": %s not present\n", sc->sc_devnode->name); } aml_freevalue(&res); /* create sensors */ acpibat_monitor(sc); /* populate sensors */ acpibat_refresh(sc); aml_register_notify(sc->sc_devnode, aa->aaa_dev, acpibat_notify, sc, ACPIDEV_POLL); }
int acpisony_find_offset(struct acpisony_softc *sc, int key) { struct aml_value arg, res; int val; bzero(&arg, sizeof(arg)); arg.type = AML_OBJTYPE_INTEGER; for (arg.v_integer = 0x20; arg.v_integer < 0x30; arg.v_integer++) { aml_evalname(sc->sc_acpi, sc->sc_devnode, "SN00", 1, &arg, &res); val = aml_val2int(&res); aml_freevalue(&res); if (val == key) { DPRINTF(("Matched key %X\n", val)); return arg.v_integer - 0x20; } } return -1; }
int acpisony_set_hotkey(struct acpisony_softc *sc, int key, int val) { int off, rc = -1; struct aml_value res, arg; bzero(&arg, sizeof(arg)); arg.type = AML_OBJTYPE_INTEGER; off = acpisony_find_offset(sc, key); DPRINTF(("off = %X\n", off)); if (off < 0) return rc; arg.v_integer = off | val; aml_evalname(sc->sc_acpi, sc->sc_devnode, "SN07", 1, &arg, &res); rc = aml_val2int(&res); aml_freevalue(&res); return rc; }
void acpivout_get_bcl(struct acpivout_softc *sc) { int i, j, value; struct aml_value res; DPRINTF(("Getting _BCL!")); aml_evalname(sc->sc_acpi, sc->sc_devnode, "_BCL", 0, NULL, &res); if (res.type != AML_OBJTYPE_PACKAGE) { sc->sc_bcl_len = 0; goto err; } /* * Per the ACPI spec section B.6.2 the _BCL method returns a package. * The first integer in the package is the brightness level * when the computer has full power, and the second is the * brightness level when the computer is on batteries. * All other levels may be used by OSPM. * So we skip the first two integers in the package. */ if (res.length <= 2) { sc->sc_bcl_len = 0; goto err; } sc->sc_bcl_len = res.length - 2; sc->sc_bcl = mallocarray(sc->sc_bcl_len, sizeof(int), M_DEVBUF, M_WAITOK | M_ZERO); for (i = 0; i < sc->sc_bcl_len; i++) { /* Sort darkest to brightest */ value = aml_val2int(res.v_package[i + 2]); for (j = i; j > 0 && sc->sc_bcl[j - 1] > value; j--) sc->sc_bcl[j] = sc->sc_bcl[j - 1]; sc->sc_bcl[j] = value; } err: aml_freevalue(&res); }
int acpicpu_getpss(struct acpicpu_softc *sc) { struct aml_value res; int i; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PSS", 0, NULL, &res)) { dnprintf(20, "%s: no _PSS\n", DEVNAME(sc)); return (1); } if (sc->sc_pss) free(sc->sc_pss, M_DEVBUF); sc->sc_pss = malloc(res.length * sizeof *sc->sc_pss, M_DEVBUF, M_WAITOK); memset(sc->sc_pss, 0, res.length * sizeof *sc->sc_pss); for (i = 0; i < res.length; i++) { sc->sc_pss[i].pss_core_freq = aml_val2int( res.v_package[i]->v_package[0]); sc->sc_pss[i].pss_power = aml_val2int( res.v_package[i]->v_package[1]); sc->sc_pss[i].pss_trans_latency = aml_val2int( res.v_package[i]->v_package[2]); sc->sc_pss[i].pss_bus_latency = aml_val2int( res.v_package[i]->v_package[3]); sc->sc_pss[i].pss_ctrl = aml_val2int( res.v_package[i]->v_package[4]); sc->sc_pss[i].pss_status = aml_val2int( res.v_package[i]->v_package[5]); } aml_freevalue(&res); sc->sc_pss_len = res.length; return (0); }
int acpibat_getbst(struct acpibat_softc *sc) { struct aml_value res; int rv = EINVAL; if (!sc->sc_bat_present) { memset(&sc->sc_bst, 0, sizeof(sc->sc_bst)); return (0); } if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_BST", 0, NULL, &res)) { dnprintf(10, "%s: no _BST\n", DEVNAME(sc)); goto out; } if (res.length != 4) { dnprintf(10, "%s: invalid _BST, battery status not saved\n", DEVNAME(sc)); goto out; } sc->sc_bst.bst_state = aml_val2int(res.v_package[0]); sc->sc_bst.bst_rate = aml_val2int(res.v_package[1]); sc->sc_bst.bst_capacity = aml_val2int(res.v_package[2]); sc->sc_bst.bst_voltage = aml_val2int(res.v_package[3]); dnprintf(60, "state: %u rate: %u cap: %u volt: %u ", sc->sc_bst.bst_state, sc->sc_bst.bst_rate, sc->sc_bst.bst_capacity, sc->sc_bst.bst_voltage); rv = 0; out: aml_freevalue(&res); return (rv); }
int acpidock_dockctl(struct acpidock_softc *sc, int dock) { struct aml_value cmd; struct aml_value res; int rv; memset(&cmd, 0, sizeof cmd); cmd.v_integer = dock; cmd.type = AML_OBJTYPE_INTEGER; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_DCK", 1, &cmd, &res) != 0) { dnprintf(15, "%s: _DCK %d failed\n", DEVNAME(sc), dock); rv = 0; } else { dnprintf(15, "%s: _DCK %d successful\n", DEVNAME(sc), dock); rv = 1; } aml_freevalue(&res); return (rv); }
void aibs_attach_new(struct aibs_softc *sc) { struct aml_value res; int i; if (aibs_getpack(sc, sc->sc_ggrpnode, ATK_ID_MUX_HWMON, &res)) { printf("%s: GGRP: sensor enumeration failed\n", DEVNAME(sc)); return; } for (i = 0; i < res.length; i++) { struct aml_value *r; r = res.v_package[i]; if (r->type != AML_OBJTYPE_STRING) { printf("%s: %s: %i: not a string (type %i)\n", DEVNAME(sc), "GGRP", i, r->type); continue; } aibs_add_sensor(sc, r->v_string); } aml_freevalue(&res); }
int acpidock_foundejd(struct aml_node *node, void *arg) { struct acpidock_softc *sc = (struct acpidock_softc *)arg; struct aml_value res; struct aml_node *dock; extern struct aml_node aml_root; dnprintf(15, "%s: %s", DEVNAME(sc), node->name); if (aml_evalnode(sc->sc_acpi, node, 0, NULL, &res) == -1) printf(": error\n"); else { dock = aml_searchname(&aml_root, res.v_string); if (dock == sc->sc_devnode) /* Add all children devices of Device containing _EJD */ aml_walknodes(node->parent, AML_WALK_POST, acpidock_walkchildren, sc); aml_freevalue(&res); } return (0); }
int acpicpu_getpct(struct acpicpu_softc *sc) { struct aml_value res; int rv = 1; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PPC", 0, NULL, &res)) { dnprintf(20, "%s: no _PPC\n", DEVNAME(sc)); printf("%s: no _PPC\n", DEVNAME(sc)); return (1); } dnprintf(10, "_PPC: %d\n", aml_val2int(&res)); aml_freevalue(&res); if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PCT", 0, NULL, &res)) { printf("%s: no _PCT\n", DEVNAME(sc)); return (1); } if (res.length != 2) { printf("%s: %s: invalid _PCT length\n", DEVNAME(sc), sc->sc_devnode->name); return (1); } memcpy(&sc->sc_pct.pct_ctrl, res.v_package[0]->v_buffer, sizeof sc->sc_pct.pct_ctrl); if (sc->sc_pct.pct_ctrl.grd_gas.address_space_id == GAS_FUNCTIONAL_FIXED) { printf("CTRL GASIO is CPU manufacturer overridden\n"); goto bad; } memcpy(&sc->sc_pct.pct_status, res.v_package[1]->v_buffer, sizeof sc->sc_pct.pct_status); if (sc->sc_pct.pct_status.grd_gas.address_space_id == GAS_FUNCTIONAL_FIXED) { printf("STATUS GASIO is CPU manufacturer overridden\n"); goto bad; } dnprintf(10, "_PCT(ctrl) : %02x %04x %02x %02x %02x %02x %016x\n", sc->sc_pct.pct_ctrl.grd_descriptor, sc->sc_pct.pct_ctrl.grd_length, sc->sc_pct.pct_ctrl.grd_gas.address_space_id, sc->sc_pct.pct_ctrl.grd_gas.register_bit_width, sc->sc_pct.pct_ctrl.grd_gas.register_bit_offset, sc->sc_pct.pct_ctrl.grd_gas.access_size, sc->sc_pct.pct_ctrl.grd_gas.address); dnprintf(10, "_PCT(status): %02x %04x %02x %02x %02x %02x %016x\n", sc->sc_pct.pct_status.grd_descriptor, sc->sc_pct.pct_status.grd_length, sc->sc_pct.pct_status.grd_gas.address_space_id, sc->sc_pct.pct_status.grd_gas.register_bit_width, sc->sc_pct.pct_status.grd_gas.register_bit_offset, sc->sc_pct.pct_status.grd_gas.access_size, sc->sc_pct.pct_status.grd_gas.address); rv = 0; bad: aml_freevalue(&res); return (rv); }
void acpicpu_attach(struct device *parent, struct device *self, void *aux) { struct acpicpu_softc *sc = (struct acpicpu_softc *)self; struct acpi_attach_args *aa = aux; struct aml_value res; int i; sc->sc_acpi = (struct acpi_softc *)parent; sc->sc_devnode = aa->aaa_node; SLIST_INIT(&sc->sc_cstates); sc->sc_pss = NULL; printf(": %s: ", sc->sc_devnode->name); if (aml_evalnode(sc->sc_acpi, sc->sc_devnode, 0, NULL, &res) == 0) { if (res.type == AML_OBJTYPE_PROCESSOR) { sc->sc_cpu = res.v_processor.proc_id; sc->sc_pblk_addr = res.v_processor.proc_addr; sc->sc_pblk_len = res.v_processor.proc_len; } aml_freevalue(&res); } sc->sc_duty_off = sc->sc_acpi->sc_fadt->duty_offset; sc->sc_duty_wid = sc->sc_acpi->sc_fadt->duty_width; if (!valid_throttle(sc->sc_duty_off, sc->sc_duty_wid, sc->sc_pblk_addr)) sc->sc_flags |= FLAGS_NOTHROTTLE; #ifdef ACPI_DEBUG printf(": %s: ", sc->sc_devnode->name); printf("\n: hdr:%x pblk:%x,%x duty:%x,%x pstate:%x (%d throttling states)\n", sc->sc_acpi->sc_fadt->hdr_revision, sc->sc_pblk_addr, sc->sc_pblk_len, sc->sc_duty_off, sc->sc_duty_wid, sc->sc_acpi->sc_fadt->pstate_cnt, CPU_MAXSTATE(sc)); #endif /* Get C-States from _CST or FADT */ if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_CST", 0, NULL, &res) == 0) { aml_foreachpkg(&res, 1, acpicpu_add_cstatepkg, sc); aml_freevalue(&res); } else { /* Some systems don't export a full PBLK, reduce functionality */ if (sc->sc_pblk_len < 5) sc->sc_flags |= FLAGS_NO_C2; if (sc->sc_pblk_len < 6) sc->sc_flags |= FLAGS_NO_C3; acpicpu_add_cstate(sc, ACPI_STATE_C2, sc->sc_acpi->sc_fadt->p_lvl2_lat, -1, sc->sc_pblk_addr + 4); acpicpu_add_cstate(sc, ACPI_STATE_C3, sc->sc_acpi->sc_fadt->p_lvl3_lat, -1, sc->sc_pblk_addr + 5); } if (acpicpu_getpss(sc)) { /* XXX not the right test but has to do for now */ sc->sc_flags |= FLAGS_NOPSS; goto nopss; } #ifdef ACPI_DEBUG for (i = 0; i < sc->sc_pss_len; i++) { dnprintf(20, "%d %d %d %d %d %d\n", sc->sc_pss[i].pss_core_freq, sc->sc_pss[i].pss_power, sc->sc_pss[i].pss_trans_latency, sc->sc_pss[i].pss_bus_latency, sc->sc_pss[i].pss_ctrl, sc->sc_pss[i].pss_status); } dnprintf(20, "\n"); #endif /* XXX this needs to be moved to probe routine */ if (acpicpu_getpct(sc)) return; /* Notify BIOS we are handing p-states */ if (sc->sc_acpi->sc_fadt->pstate_cnt) acpi_write_pmreg(sc->sc_acpi, ACPIREG_SMICMD, 0, sc->sc_acpi->sc_fadt->pstate_cnt); for (i = 0; i < sc->sc_pss_len; i++) printf("%d%s", sc->sc_pss[i].pss_core_freq, i < sc->sc_pss_len - 1 ? ", " : " MHz\n"); aml_register_notify(sc->sc_devnode, NULL, acpicpu_notify, sc, ACPIDEV_NOPOLL); if (setperf_prio < 30) { cpu_setperf = acpicpu_setperf; setperf_prio = 30; acpi_hasprocfvs = 1; } acpicpu_sc[sc->sc_dev.dv_unit] = sc; return; nopss: if (sc->sc_flags & FLAGS_NOTHROTTLE) printf("no performance/throttling supported\n"); }
int acpibat_getbif(struct acpibat_softc *sc) { struct aml_value res; int rv = EINVAL; if (!sc->sc_bat_present) { memset(&sc->sc_bif, 0, sizeof(sc->sc_bif)); return (0); } if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_BIF", 0, NULL, &res)) { dnprintf(10, "%s: no _BIF\n", DEVNAME(sc)); goto out; } if (res.length != 13) { dnprintf(10, "%s: invalid _BIF, battery info not saved\n", DEVNAME(sc)); goto out; } sc->sc_bif.bif_power_unit = aml_val2int(res.v_package[0]); sc->sc_bif.bif_capacity = aml_val2int(res.v_package[1]); sc->sc_bif.bif_last_capacity = aml_val2int(res.v_package[2]); sc->sc_bif.bif_technology = aml_val2int(res.v_package[3]); sc->sc_bif.bif_voltage = aml_val2int(res.v_package[4]); sc->sc_bif.bif_warning = aml_val2int(res.v_package[5]); sc->sc_bif.bif_low = aml_val2int(res.v_package[6]); sc->sc_bif.bif_cap_granu1 = aml_val2int(res.v_package[7]); sc->sc_bif.bif_cap_granu2 = aml_val2int(res.v_package[8]); strlcpy(sc->sc_bif.bif_model, aml_val_to_string(res.v_package[9]), sizeof(sc->sc_bif.bif_model)); strlcpy(sc->sc_bif.bif_serial, aml_val_to_string(res.v_package[10]), sizeof(sc->sc_bif.bif_serial)); strlcpy(sc->sc_bif.bif_type, aml_val_to_string(res.v_package[11]), sizeof(sc->sc_bif.bif_type)); strlcpy(sc->sc_bif.bif_oem, aml_val_to_string(res.v_package[12]), sizeof(sc->sc_bif.bif_oem)); dnprintf(60, "power_unit: %u capacity: %u last_cap: %u tech: %u " "volt: %u warn: %u low: %u gran1: %u gran2: %d model: %s " "serial: %s type: %s oem: %s\n", sc->sc_bif.bif_power_unit, sc->sc_bif.bif_capacity, sc->sc_bif.bif_last_capacity, sc->sc_bif.bif_technology, sc->sc_bif.bif_voltage, sc->sc_bif.bif_warning, sc->sc_bif.bif_low, sc->sc_bif.bif_cap_granu1, sc->sc_bif.bif_cap_granu2, sc->sc_bif.bif_model, sc->sc_bif.bif_serial, sc->sc_bif.bif_type, sc->sc_bif.bif_oem); rv = 0; out: aml_freevalue(&res); return (rv); }
int aibs_getvalue(struct aibs_softc *sc, int64_t i, int64_t *v) { struct aml_node *n = sc->sc_gitmnode; struct aml_value req, res; struct aibs_cmd_buffer cmd; struct aibs_ret_buffer ret; enum aml_objecttype type; if (sc->sc_mode) { cmd.id = i; cmd.param1 = 0; cmd.param2 = 0; type = req.type = AML_OBJTYPE_BUFFER; req.v_buffer = (uint8_t *)&cmd; req.length = sizeof(cmd); } else { switch (ATK_TYPE(i)) { case ATK_TYPE_TEMP: n = sc->sc_rtmpnode; break; case ATK_TYPE_FAN: n = sc->sc_rfannode; break; case ATK_TYPE_VOLT: n = sc->sc_rvltnode; break; default: return (-1); } type = req.type = AML_OBJTYPE_INTEGER; req.v_integer = i; } if (aml_evalnode(sc->sc_acpi, n, 1, &req, &res)) { dprintf("%s: %s: %lld: evaluation failed\n", DEVNAME(sc), n->name, i); aml_freevalue(&res); return (-1); } if (res.type != type) { dprintf("%s: %s: %lld: not an integer: type %i\n", DEVNAME(sc), n->name, i, res.type); aml_freevalue(&res); return (-1); } if (sc->sc_mode) { if (res.length < sizeof(ret)) { dprintf("%s: %s: %lld: result buffer too small\n", DEVNAME(sc), n->name, i); aml_freevalue(&res); return (-1); } memcpy(&ret, res.v_buffer, sizeof(ret)); if (ret.flags == 0) { dprintf("%s: %s: %lld: bad flags in result\n", DEVNAME(sc), n->name, i); aml_freevalue(&res); return (-1); } *v = ret.value; } else { *v = res.v_integer; } aml_freevalue(&res); return (0); }
int acpiec_getcrs(struct acpiec_softc *sc, struct acpi_attach_args *aa) { struct aml_value res; bus_size_t ec_sc, ec_data; int dtype, ctype; char *buf; int size, ret; int64_t gpe; struct acpi_ecdt *ecdt = aa->aaa_table; extern struct aml_node aml_root; /* Check if this is ECDT initialization */ if (ecdt) { /* Get GPE, Data and Control segments */ sc->sc_gpe = ecdt->gpe_bit; ctype = ecdt->ec_control.address_space_id; ec_sc = ecdt->ec_control.address; dtype = ecdt->ec_data.address_space_id; ec_data = ecdt->ec_data.address; /* Get devnode from header */ sc->sc_devnode = aml_searchname(&aml_root, ecdt->ec_id); goto ecdtdone; } if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "_GPE", 0, NULL, &gpe)) { dnprintf(10, "%s: no _GPE\n", DEVNAME(sc)); return (1); } sc->sc_gpe = gpe; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_CRS", 0, NULL, &res)) { dnprintf(10, "%s: no _CRS\n", DEVNAME(sc)); return (1); } /* Parse CRS to get control and data registers */ if (res.type != AML_OBJTYPE_BUFFER) { dnprintf(10, "%s: unknown _CRS type %d\n", DEVNAME(sc), res.type); aml_freevalue(&res); return (1); } size = res.length; buf = res.v_buffer; ret = acpiec_getregister(buf, size, &dtype, &ec_data); if (ret <= 0) { dnprintf(10, "%s: failed to read DATA from _CRS\n", DEVNAME(sc)); aml_freevalue(&res); return (1); } buf += ret; size -= ret; ret = acpiec_getregister(buf, size, &ctype, &ec_sc); if (ret <= 0) { dnprintf(10, "%s: failed to read S/C from _CRS\n", DEVNAME(sc)); aml_freevalue(&res); return (1); } buf += ret; size -= ret; if (size != 2 || *buf != RES_TYPE_ENDTAG) { dnprintf(10, "%s: no _CRS end tag\n", DEVNAME(sc)); aml_freevalue(&res); return (1); } aml_freevalue(&res); /* XXX: todo - validate _CRS checksum? */ ecdtdone: dnprintf(10, "%s: Data: 0x%lx, S/C: 0x%lx\n", DEVNAME(sc), ec_data, ec_sc); if (ctype == GAS_SYSTEM_IOSPACE) sc->sc_cmd_bt = aa->aaa_iot; else sc->sc_cmd_bt = aa->aaa_memt; if (bus_space_map(sc->sc_cmd_bt, ec_sc, 1, 0, &sc->sc_cmd_bh)) { dnprintf(10, "%s: failed to map S/C reg.\n", DEVNAME(sc)); return (1); } if (dtype == GAS_SYSTEM_IOSPACE) sc->sc_data_bt = aa->aaa_iot; else sc->sc_data_bt = aa->aaa_memt; if (bus_space_map(sc->sc_data_bt, ec_data, 1, 0, &sc->sc_data_bh)) { dnprintf(10, "%s: failed to map DATA reg.\n", DEVNAME(sc)); bus_space_unmap(sc->sc_cmd_bt, sc->sc_cmd_bh, 1); return (1); } return (0); }
int acpiec_getcrs(struct acpiec_softc *sc, struct acpi_attach_args *aa) { struct aml_value res; bus_size_t ec_sc, ec_data; int type1, type2; char *buf; int size, ret; if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_GPE", 0, NULL, &res)) { dnprintf(10, "%s: no _GPE\n", DEVNAME(sc)); return (1); } sc->sc_gpe = aml_val2int(&res); aml_freevalue(&res); if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_CRS", 0, NULL, &res)) { dnprintf(10, "%s: no _CRS\n", DEVNAME(sc)); return (1); } /* Parse CRS to get control and data registers */ if (res.type != AML_OBJTYPE_BUFFER) { dnprintf(10, "%s: unknown _CRS type %d\n", DEVNAME(sc), res.type); aml_freevalue(&res); return (1); } size = res.length; buf = res.v_buffer; ret = acpiec_getregister(buf, size, &type1, &ec_data); if (ret <= 0) { dnprintf(10, "%s: failed to read DATA from _CRS\n", DEVNAME(sc)); aml_freevalue(&res); return (1); } buf += ret; size -= ret; ret = acpiec_getregister(buf, size, &type2, &ec_sc); if (ret <= 0) { dnprintf(10, "%s: failed to read S/C from _CRS\n", DEVNAME(sc)); aml_freevalue(&res); return (1); } buf += ret; size -= ret; if (size != 2 || *buf != RES_TYPE_ENDTAG) { dnprintf(10, "%s: no _CRS end tag\n", DEVNAME(sc)); aml_freevalue(&res); return (1); } aml_freevalue(&res); /* XXX: todo - validate _CRS checksum? */ dnprintf(10, "%s: Data: 0x%x, S/C: 0x%x\n", DEVNAME(sc), ec_data, ec_sc); if (type1 == GAS_SYSTEM_IOSPACE) sc->sc_cmd_bt = aa->aaa_iot; else sc->sc_cmd_bt = aa->aaa_memt; if (bus_space_map(sc->sc_cmd_bt, ec_sc, 1, 0, &sc->sc_cmd_bh)) { dnprintf(10, "%s: failed to map S/C reg.\n", DEVNAME(sc)); return (1); } if (type2 == GAS_SYSTEM_IOSPACE) sc->sc_data_bt = aa->aaa_iot; else sc->sc_data_bt = aa->aaa_memt; if (bus_space_map(sc->sc_data_bt, ec_data, 1, 0, &sc->sc_data_bh)) { dnprintf(10, "%s: failed to map DATA reg.\n", DEVNAME(sc)); bus_space_unmap(sc->sc_cmd_bt, sc->sc_cmd_bh, 1); return (1); } return (0); }