Simplify the sysctl variable for BIOS switch policy, and document it

in acpivga(4).  The previous hw.acpi.acpivga0.policy variable is
renamed into bios_policy for consistency, and is for ACPI_DEBUG only.

ok jruoho@
This commit is contained in:
gsutre 2010-10-28 21:45:02 +00:00
parent ff08ca3b05
commit a9f3b6413d
2 changed files with 77 additions and 16 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: acpivga.4,v 1.2 2010/10/28 14:36:04 jruoho Exp $
.\" $NetBSD: acpivga.4,v 1.3 2010/10/28 21:45:02 gsutre Exp $
.\"
.\" Copyright (c) 2010 The NetBSD Foundation, Inc.
.\" All rights reserved.
@ -47,22 +47,29 @@ implement these extensions in their
.Tn ACPI
BIOS.
.Pp
The driver handles brightness hotkeys and output switch hotkeys.
The driver handles brightness hotkeys and display switch hotkeys.
In addition, the following
.Xr sysctl 8
read/write variables are provided (when hardware support is available):
.Bl -tag -width Ds
.It Va hw.acpi.acpivga0.policy
BIOS switch policy.
Accepted values range from 0 to 7.
For more information, refer to the documentation of the _DOS method,
in Section B.4.1 of the
.Tn ACPI
specification (revision 4.0a).
.It Va hw.acpi.acpivga0.bios_switch
BIOS output switching policy.
This boolean variable controls the behavior of the BIOS when a display
switch hotkey is pressed.
.Bl -tag -width xxx -compact
.It Sy 1
the BIOS should automatically switch outputs, with no interaction from
.Nm .
.It Sy 0
the BIOS should only notify
.Nm
of the desired output state changes.
.El
.It Va hw.acpi.acpiout0.brightness
Brightness level.
Typical values range from 0 to 100, but any integer value is accepted (the
driver uses the closest brightness level supported by the device).
This integer variable typically ranges from 0 to 100, but any integer value
is accepted (the driver uses the closest brightness level supported by the
device).
.El
.Pp
Please note, however, that future versions of
@ -99,7 +106,17 @@ Many
BIOSes implement only part of the
.Tn ACPI
video extensions.
In particular, display output switching often does not work.
In particular, display output switching via these extensions often does not
work.
For this reason,
.Nm
enables
.Va hw.acpi.acpivga0.bios_switch
by default.
If the display switch hotkey does not work with this default setting, try
setting
.Va hw.acpi.acpivga0.bios_switch
to 0.
.Pp
Brightness level should be controlled via
.Xr wsconsctl 8

View File

@ -1,4 +1,4 @@
/* $NetBSD: acpi_display.c,v 1.3 2010/10/26 22:27:44 gsutre Exp $ */
/* $NetBSD: acpi_display.c,v 1.4 2010/10/28 21:45:02 gsutre Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: acpi_display.c,v 1.3 2010/10/26 22:27:44 gsutre Exp $");
__KERNEL_RCSID(0, "$NetBSD: acpi_display.c,v 1.4 2010/10/28 21:45:02 gsutre Exp $");
#include <sys/param.h>
#include <sys/device.h>
@ -347,7 +347,10 @@ static void acpidisp_out_zero_brightness_callback(void *);
static void acpidisp_vga_sysctl_setup(struct acpidisp_vga_softc *);
static void acpidisp_out_sysctl_setup(struct acpidisp_out_softc *);
#ifdef ACPI_DEBUG
static int acpidisp_vga_sysctl_policy(SYSCTLFN_PROTO);
#endif
static int acpidisp_vga_sysctl_policy_output(SYSCTLFN_PROTO);
#ifdef ACPI_DISP_SWITCH_SYSCTLS
static int acpidisp_out_sysctl_status(SYSCTLFN_PROTO);
static int acpidisp_out_sysctl_state(SYSCTLFN_PROTO);
@ -1114,11 +1117,19 @@ acpidisp_vga_sysctl_setup(struct acpidisp_vga_softc *asc)
CTL_CREATE, CTL_EOL)) != 0)
goto fail;
#ifdef ACPI_DEBUG
(void)sysctl_createv(&asc->sc_log, 0, &rnode, NULL,
CTLFLAG_READWRITE | CTLFLAG_HEX, CTLTYPE_INT, "policy",
SYSCTL_DESCR("Current BIOS switch policy"),
CTLFLAG_READWRITE | CTLFLAG_HEX, CTLTYPE_INT, "bios_policy",
SYSCTL_DESCR("Current BIOS switch policies (debug)"),
acpidisp_vga_sysctl_policy, 0, asc, 0,
CTL_CREATE, CTL_EOL);
#endif
(void)sysctl_createv(&asc->sc_log, 0, &rnode, NULL,
CTLFLAG_READWRITE, CTLTYPE_BOOL, "bios_switch",
SYSCTL_DESCR("Current BIOS output switching policy"),
acpidisp_vga_sysctl_policy_output, 0, asc, 0,
CTL_CREATE, CTL_EOL);
}
return;
@ -1202,6 +1213,7 @@ acpidisp_out_sysctl_setup(struct acpidisp_out_softc *osc)
* Sysctl callbacks.
*/
#ifdef ACPI_DEBUG
static int
acpidisp_vga_sysctl_policy(SYSCTLFN_ARGS)
{
@ -1232,6 +1244,38 @@ acpidisp_vga_sysctl_policy(SYSCTLFN_ARGS)
return error;
}
#endif
static int
acpidisp_vga_sysctl_policy_output(SYSCTLFN_ARGS)
{
struct sysctlnode node;
struct acpidisp_vga_softc *asc;
bool val;
int error;
node = *rnode;
asc = (struct acpidisp_vga_softc *)node.sysctl_data;
mutex_enter(&asc->sc_mtx);
val = (asc->sc_policy.fmt.output == ACPI_DISP_POLICY_OUTPUT_AUTO);
mutex_exit(&asc->sc_mtx);
node.sysctl_data = &val;
error = sysctl_lookup(SYSCTLFN_CALL(&node));
if (error || newp == NULL)
return error;
mutex_enter(&asc->sc_mtx);
if (val)
asc->sc_policy.fmt.output = ACPI_DISP_POLICY_OUTPUT_AUTO;
else
asc->sc_policy.fmt.output = ACPI_DISP_POLICY_OUTPUT_NORMAL;
error = acpidisp_set_policy(asc, asc->sc_policy.raw);
mutex_exit(&asc->sc_mtx);
return error;
}
#ifdef ACPI_DISP_SWITCH_SYSCTLS
static int