static int aibs_sysctl(SYSCTL_HANDLER_ARGS) { struct aibs_softc *sc = arg1; enum aibs_type st = arg2; int i = oidp->oid_number; ACPI_STATUS rs; ACPI_OBJECT p, *bp; ACPI_OBJECT_LIST mp; ACPI_BUFFER b; char *name; struct aibs_sensor *as; ACPI_INTEGER v, l, h; int so[3]; switch (st) { case AIBS_VOLT: name = "RVLT"; as = sc->sc_asens_volt; break; case AIBS_TEMP: name = "RTMP"; as = sc->sc_asens_temp; break; case AIBS_FAN: name = "RFAN"; as = sc->sc_asens_fan; break; default: return ENOENT; } if (as == NULL) return ENOENT; l = as[i].l; h = as[i].h; p.Type = ACPI_TYPE_INTEGER; p.Integer.Value = as[i].i; mp.Count = 1; mp.Pointer = &p; b.Length = ACPI_ALLOCATE_BUFFER; ACPI_SERIAL_BEGIN(aibs); rs = AcpiEvaluateObjectTyped(sc->sc_ah, name, &mp, &b, ACPI_TYPE_INTEGER); if (ACPI_FAILURE(rs)) { ddevice_printf(sc->sc_dev, "%s: %i: evaluation failed\n", name, i); ACPI_SERIAL_END(aibs); return EIO; } bp = b.Pointer; v = bp->Integer.Value; AcpiOsFree(b.Pointer); ACPI_SERIAL_END(aibs); switch (st) { case AIBS_VOLT: break; case AIBS_TEMP: v += 2731; l += 2731; h += 2731; break; case AIBS_FAN: break; } so[0] = v; so[1] = l; so[2] = h; return sysctl_handle_opaque(oidp, &so, sizeof(so), req); }
static void aibs_refresh_r(struct aibs_softc *sc, enum sensor_type st) { ACPI_STATUS rs; ACPI_HANDLE rh; int i, n = sc->sc_sensordev.maxnumt[st]; char *name; struct aibs_sensor *as; switch (st) { case SENSOR_TEMP: name = "RTMP"; as = sc->sc_asens_temp; break; case SENSOR_FANRPM: name = "RFAN"; as = sc->sc_asens_fan; break; case SENSOR_VOLTS_DC: name = "RVLT"; as = sc->sc_asens_volt; break; default: return; } if (as == NULL) return; rs = AcpiGetHandle(sc->sc_ah, name, &rh); if (ACPI_FAILURE(rs)) { ddevice_printf(sc->sc_dev, "%s: method handle not found\n", name); for (i = 0; i < n; i++) as[i].s.flags |= SENSOR_FINVALID; return; } for (i = 0; i < n; i++) { ACPI_OBJECT p, *bp; ACPI_OBJECT_LIST mp; ACPI_BUFFER b; UINT64 v; struct ksensor *s = &as[i].s; const UINT64 l = as[i].l, h = as[i].h; p.Type = ACPI_TYPE_INTEGER; p.Integer.Value = as[i].i; mp.Count = 1; mp.Pointer = &p; b.Length = ACPI_ALLOCATE_BUFFER; rs = AcpiEvaluateObjectTyped(rh, NULL, &mp, &b, ACPI_TYPE_INTEGER); if (ACPI_FAILURE(rs)) { ddevice_printf(sc->sc_dev, "%s: %i: evaluation failed\n", name, i); s->flags |= SENSOR_FINVALID; continue; } bp = b.Pointer; v = bp->Integer.Value; AcpiOsFree(b.Pointer); switch (st) { case SENSOR_TEMP: s->value = v * 100 * 1000 + 273150000; if (v == 0) { s->status = SENSOR_S_UNKNOWN; s->flags |= SENSOR_FINVALID; } else { if (v > h) s->status = SENSOR_S_CRIT; else if (v > l) s->status = SENSOR_S_WARN; else s->status = SENSOR_S_OK; s->flags &= ~SENSOR_FINVALID; } break; case SENSOR_FANRPM: s->value = v; /* some boards have strange limits for fans */ if ((l != 0 && l < v && v < h) || (l == 0 && v > h)) s->status = SENSOR_S_OK; else s->status = SENSOR_S_WARN; s->flags &= ~SENSOR_FINVALID; break; case SENSOR_VOLTS_DC: s->value = v * 1000; if (l < v && v < h) s->status = SENSOR_S_OK; else s->status = SENSOR_S_WARN; s->flags &= ~SENSOR_FINVALID; break; default: /* NOTREACHED */ break; } } return; }