]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Various fixes for PCI _OSC handling so HotPlug works again.
authorjhb <jhb@FreeBSD.org>
Thu, 27 Apr 2017 16:32:42 +0000 (16:32 +0000)
committerjhb <jhb@FreeBSD.org>
Thu, 27 Apr 2017 16:32:42 +0000 (16:32 +0000)
commit2750ce9b17ee373b6d46e6d15d21d2e6c63f6d4d
tree34344256f3f72524244415334e9cda6c820cdecc
parentf58cfd8a1868e30c65c7755ef42402d223ce1a46
Various fixes for PCI _OSC handling so HotPlug works again.

- Rename the default implementation of 'pcib_request_feature' and add
  a pcib_request_feature() wrapper function (as is often done for
  new-bus APIs implemented via kobj) that accepts a single function.
  Previously the call to pcib_request_feature() ended up invoking the
  method on the great-great-grandparent of the bridge device instead
  of the grandparent.  For a bridge that was a direct child of pci0 on
  x86 this resulted in the method skipping over the Host-PCI bridge
  driver and being invoked against nexus0
- When invoking _OSC from a Host-PCI bridge driver, invoke
  device_get_softc() against the Host-PCI bridge device instead of the
  child bridge that is requesting HotPlug.  Using the wrong softc data
  resulted in garbage being passed for the ACPI handle causing the
  _OSC call to fail.
- While here, perform some other cleanups to _OSC handling in the ACPI
  Host-PCI bridge driver:
  - Don't invoke _OSC when requesting a control that has already been
    granted by the firmware.
  - Don't set the first word of the capability array before invoking
    _OSC.  This word is always set explicitly by acpi_EvaluateOSC()
    since it is UUID-independent.
  - Don't modify the set of granted controls unless _OSC doesn't exist
    (which is treated as always successful), or the _OSC method
    doesn't fail.
  - Don't require an _OSC status of 0 for success.  _OSC always
    returns the updated control mask even if it returns a non-zero
    status in the first word.
  - Whine if _OSC ever tries to revoke a previously-granted control.
    (It is not supposed to do that.)
- While here, add constants for the _OSC status word in acpivar.h
  (though currently unused).

Reported by: adrian
Reviewed by: imp
MFC after: 1 week
Tested on: Lenovo x220
Differential Revision: https://reviews.freebsd.org/D10520
sys/dev/acpica/acpi_pcib_acpi.c
sys/dev/acpica/acpivar.h
sys/dev/pci/pci_pci.c
sys/dev/pci/pcib_private.h