コード例 #1
0
ファイル: acpiprt.c プロジェクト: avsm/openbsd-xen-sys
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);
}
コード例 #2
0
ファイル: acpiasus.c プロジェクト: sofuture/bitrig
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);
}
コード例 #3
0
ファイル: acpitoshiba.c プロジェクト: SylvestreG/bitrig
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);
}
コード例 #4
0
ファイル: acpitoshiba.c プロジェクト: SylvestreG/bitrig
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);
}
コード例 #5
0
ファイル: acpitoshiba.c プロジェクト: SylvestreG/bitrig
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);
}
コード例 #6
0
ファイル: acpitz.c プロジェクト: avsm/openbsd-xen-sys
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);
}
コード例 #7
0
ファイル: acpidock.c プロジェクト: SylvestreG/bitrig
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);
}
コード例 #8
0
ファイル: acpisony.c プロジェクト: alenichev/openbsd-kernel
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);
}
コード例 #9
0
ファイル: acpisony.c プロジェクト: alenichev/openbsd-kernel
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;
}
コード例 #10
0
ファイル: acpivout.c プロジェクト: orumin/openbsd-efivars
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);
}
コード例 #11
0
ファイル: acpivideo.c プロジェクト: ajinkya93/OpenBSD
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);
}
コード例 #12
0
ファイル: acpitz.c プロジェクト: avsm/openbsd-xen-sys
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);
}
コード例 #13
0
ファイル: atk0110.c プロジェクト: ajinkya93/OpenBSD
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);
}
コード例 #14
0
ファイル: acpivout.c プロジェクト: orumin/openbsd-efivars
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);
}
コード例 #15
0
ファイル: acpiasus.c プロジェクト: sofuture/bitrig
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);
}
コード例 #16
0
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);
}
コード例 #17
0
ファイル: acpisony.c プロジェクト: alenichev/openbsd-kernel
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;
}
コード例 #18
0
ファイル: acpisony.c プロジェクト: alenichev/openbsd-kernel
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;
}
コード例 #19
0
ファイル: acpivout.c プロジェクト: orumin/openbsd-efivars
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);
}
コード例 #20
0
ファイル: acpicpu.c プロジェクト: avsm/openbsd-xen-sys
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);
}
コード例 #21
0
ファイル: acpibat.c プロジェクト: alenichev/openbsd-kernel
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);
}
コード例 #22
0
ファイル: acpidock.c プロジェクト: SylvestreG/bitrig
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);
}
コード例 #23
0
ファイル: atk0110.c プロジェクト: ajinkya93/OpenBSD
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);
}
コード例 #24
0
ファイル: acpidock.c プロジェクト: SylvestreG/bitrig
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);
}
コード例 #25
0
ファイル: acpicpu.c プロジェクト: avsm/openbsd-xen-sys
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);
}
コード例 #26
0
ファイル: acpicpu.c プロジェクト: avsm/openbsd-xen-sys
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");
}
コード例 #27
0
ファイル: acpibat.c プロジェクト: alenichev/openbsd-kernel
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);
}
コード例 #28
0
ファイル: atk0110.c プロジェクト: ajinkya93/OpenBSD
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);
}
コード例 #29
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);
}
コード例 #30
0
ファイル: acpiec.c プロジェクト: repos-holder/openbsd-patches
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);
}