Page MenuHomeFreeBSD

Various fixes for PCI _OSC handling so HotPlug works again.
ClosedPublic

Authored by jhb on Apr 27 2017, 4:57 AM.
Tags
None
Referenced Files
Unknown Object (File)
Thu, May 2, 2:49 PM
Unknown Object (File)
Thu, May 2, 1:54 PM
Unknown Object (File)
Sat, Apr 20, 6:00 PM
Unknown Object (File)
Apr 4 2024, 3:02 PM
Unknown Object (File)
Apr 4 2024, 11:04 AM
Unknown Object (File)
Mar 10 2024, 8:35 PM
Unknown Object (File)
Dec 3 2023, 1:57 PM
Unknown Object (File)
Nov 12 2023, 3:17 AM
Subscribers
None

Details

Summary

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).
Test Plan
  • tested hotplug on my x220 which was not being enabled but is now working again after these changes

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

This looks good to my eye. But I wrote the original, so take that with a grain of salt.

This revision is now accepted and ready to land.Apr 27 2017, 5:37 AM
This revision was automatically updated to reflect the committed changes.