acpi_wmi_if:

- Document different semantics for ACPI_WMI_PROVIDES_GUID_STRING_METHOD

acpi_wmi.c:
- Modify acpi_wmi_provides_guid_string_method to return absolut number of
  instances known for the given GUID.

acpi_hp.c:
- sysctl dev.acpi_hp.0.verbose to toggle debug output
- A modification so this can deal with different array lengths
  when reading the CMI BIOS - now it works ok on HP Compaq nx7300
  as well.
- Change behaviour to query only max_instance-1 CMI BIOS instances,
  because all HPs seen so far are broken in that respect
  (or there is a fundamental misunderstanding on my side, possible
  as well). This way a disturbing ACPI Error Field exceeds Buffer
  message is avoided.
- New bit to set on dev.acpi_hp.0.cmi_detail (0x8) to
  also query the highest guid instance of CMI bios

acpi_hp.4:
- Document dev.acpi_hp.0.verbose sysctl in man page
- Document new bit for dev.acpi_hp.0.cmi_detail
- Add a section to manpage about hardware that has been reported
  to work ok

Submitted by:	Michael Gmelin, freebsdusb at bindone.de
Approved by:	re (kib)
MFC after:	2 weeks
This commit is contained in:
Rui Paulo 2009-06-30 09:51:41 +00:00
parent ba3b25b35a
commit 0f73b657a9
4 changed files with 24 additions and 5 deletions

View File

@ -165,6 +165,9 @@ Show path component of BIOS setting
Show a list of valid options for the BIOS setting
.It Li 0x04
Show additional flags of BIOS setting (ReadOnly etc.)
.It Li 0x08
Query highest BIOS entry instance. This is broken on many HP models and
therefore disabled by default.
.El
.El
.Pp

View File

@ -106,6 +106,7 @@ ACPI_MODULE_NAME("HP")
#define ACPI_HP_CMI_DETAIL_PATHS 0x01
#define ACPI_HP_CMI_DETAIL_ENUMS 0x02
#define ACPI_HP_CMI_DETAIL_FLAGS 0x04
#define ACPI_HP_CMI_DETAIL_SHOW_MAX_INSTANCE 0x08
struct acpi_hp_inst_seq_pair {
UINT32 sequence; /* sequence number as suggested by cmi bios */
@ -489,9 +490,10 @@ acpi_hp_attach(device_t dev)
sc->has_notify = 1;
}
}
if (ACPI_WMI_PROVIDES_GUID_STRING(sc->wmi_dev, ACPI_HP_WMI_CMI_GUID)) {
if ((sc->has_cmi =
ACPI_WMI_PROVIDES_GUID_STRING(sc->wmi_dev, ACPI_HP_WMI_CMI_GUID)
)) {
device_printf(dev, "HP CMI GUID detected\n");
sc->has_cmi = 1;
}
if (sc->has_cmi) {
@ -752,6 +754,10 @@ acpi_hp_sysctl_set(struct acpi_hp_softc *sc, int method, int arg, int oldarg)
arg?1:0));
case ACPI_HP_METHOD_CMI_DETAIL:
sc->cmi_detail = arg;
if ((arg & ACPI_HP_CMI_DETAIL_SHOW_MAX_INSTANCE) !=
(oldarg & ACPI_HP_CMI_DETAIL_SHOW_MAX_INSTANCE)) {
sc->cmi_order_size = -1;
}
break;
}
}
@ -1103,6 +1109,7 @@ acpi_hp_hpcmi_read(struct cdev *dev, struct uio *buf, int flag)
struct acpi_hp_softc *sc;
int pos, i, l, ret;
UINT8 instance;
UINT8 maxInstance;
UINT32 sequence;
int linesize = 1025;
char line[linesize];
@ -1119,14 +1126,20 @@ acpi_hp_hpcmi_read(struct cdev *dev, struct uio *buf, int flag)
else {
if (!sbuf_done(&sc->hpcmi_sbuf)) {
if (sc->cmi_order_size < 0) {
maxInstance = sc->has_cmi;
if (!(sc->cmi_detail &
ACPI_HP_CMI_DETAIL_SHOW_MAX_INSTANCE) &&
maxInstance > 0) {
maxInstance--;
}
sc->cmi_order_size = 0;
for (instance = 0; instance < 128;
for (instance = 0; instance < maxInstance;
++instance) {
if (acpi_hp_get_cmi_block(sc->wmi_dev,
ACPI_HP_WMI_CMI_GUID, instance,
line, linesize, &sequence,
sc->cmi_detail)) {
instance = 128;
instance = maxInstance;
}
else {
pos = sc->cmi_order_size;

View File

@ -326,11 +326,13 @@ acpi_wmi_detach(device_t dev)
static int
acpi_wmi_provides_guid_string_method(device_t dev, const char *guid_string)
{
struct wmi_info *winfo;
int ret;
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
ACPI_SERIAL_BEGIN(acpi_wmi);
ret = (acpi_wmi_lookup_wmi_info_by_guid_string(guid_string) == NULL)?0:1;
winfo = acpi_wmi_lookup_wmi_info_by_guid_string(guid_string);
ret = (winfo == NULL)?0:winfo->ginfo.max_instance+1;
ACPI_SERIAL_END(acpi_wmi);
return (ret);

View File

@ -46,6 +46,7 @@ CODE {
#
# Check if given GUID exists in WMI
# Returns number of instances (max_instace+1) or 0 if guid doesn't exist
#
# device_t dev: Device to probe
# const char* guid_string: String form of the GUID