mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Merge branch 'pci/hotplug'
- Differentiate between pciehp surprise and safe removal (Lukas Wunner)
- Remove unnecessary pciehp includes (Lukas Wunner)
- Drop pciehp hotplug_slot_ops wrappers (Lukas Wunner)
- Tolerate PCIe Slot Presence Detect being hardwired to zero to
workaround broken hardware, e.g., the Wilocity switch/wireless device
(Lukas Wunner)
- Unify pciehp controller & slot structs (Lukas Wunner)
- Constify hotplug_slot_ops (Lukas Wunner)
- Drop hotplug_slot_info (Lukas Wunner)
- Embed hotplug_slot struct into users instead of allocating it
separately (Lukas Wunner)
- Initialize PCIe port service drivers directly instead of relying on
initcall ordering (Keith Busch)
- Restore PCI config state after a slot reset (Keith Busch)
- Save/restore DPC config state along with other PCI config state (Keith
Busch)
- Reference count devices during AER handling to avoid race issue with
concurrent hot removal (Keith Busch)
- If an Upstream Port reports ERR_FATAL, don't try to read the Port's
config space because it is probably unreachable (Keith Busch)
- During error handling, use slot-specific reset instead of secondary
bus reset to avoid link up/down issues on hotplug ports (Keith Busch)
- Restore previous AER/DPC handling that does not remove and re-enumerate
devices on ERR_FATAL (Keith Busch)
- Notify all drivers that may be affected by error recovery resets (Keith
Busch)
- Always generate error recovery uevents, even if a driver doesn't have
error callbacks (Keith Busch)
- Make PCIe link active reporting detection generic (Keith Busch)
- Support D3cold in PCIe hierarchies during system sleep and runtime,
including hotplug and Thunderbolt ports (Mika Westerberg)
- Handle hpmemsize/hpiosize kernel parameters uniformly, whether slots
are empty or occupied (Jon Derrick)
- Remove duplicated include from pci/pcie/err.c and unused variable from
cpqphp (YueHaibing)
- Remove driver pci_cleanup_aer_uncorrect_error_status() calls (Oza
Pawandeep)
- Uninline PCI bus accessors for better ftracing (Keith Busch)
- Remove unused AER Root Port .error_resume method (Keith Busch)
- Use kfifo in AER instead of a local version (Keith Busch)
- Use threaded IRQ in AER bottom half (Keith Busch)
- Use managed resources in AER core (Keith Busch)
- Reuse pcie_port_find_device() for AER injection (Keith Busch)
- Abstract AER interrupt handling to disconnect error injection (Keith
Busch)
- Refactor AER injection callbacks to simplify future improvments (Keith
Busch)
* pci/hotplug:
PCI/AER: Refactor error injection fallbacks
PCI/AER: Abstract AER interrupt handling
PCI/AER: Reuse existing pcie_port_find_device() interface
PCI/AER: Use managed resource allocations
PCI/AER: Use threaded IRQ for bottom half
PCI/AER: Use kfifo_in_spinlocked() to insert locked elements
PCI/AER: Use kfifo for tracking events instead of reimplementing it
PCI/AER: Remove error source from AER struct aer_rpc
PCI/AER: Remove unused aer_error_resume()
PCI: Uninline PCI bus accessors for better ftracing
PCI/AER: Remove pci_cleanup_aer_uncorrect_error_status() calls
PCI: pnv_php: Use kmemdup()
PCI: cpqphp: Remove set but not used variable 'physical_slot'
PCI/ERR: Remove duplicated include from err.c
PCI: Equalize hotplug memory and io for occupied and empty slots
PCI / ACPI: Whitelist D3 for more PCIe hotplug ports
ACPI / property: Allow multiple property compatible _DSD entries
PCI/PME: Implement runtime PM callbacks
PCI: pciehp: Implement runtime PM callbacks
PCI/portdrv: Add runtime PM hooks for port service drivers
PCI/portdrv: Resume upon exit from system suspend if left runtime suspended
PCI: pciehp: Do not handle events if interrupts are masked
PCI: pciehp: Disable hotplug interrupt during suspend
PCI / ACPI: Enable wake automatically for power managed bridges
PCI: Do not skip power-managed bridges in pci_enable_wake()
PCI: Make link active reporting detection generic
PCI: Unify device inaccessible
PCI/ERR: Always report current recovery status for udev
PCI/ERR: Simplify broadcast callouts
PCI/ERR: Run error recovery callbacks for all affected devices
PCI/ERR: Handle fatal error recovery
PCI/ERR: Use slot reset if available
PCI/AER: Don't read upstream ports below fatal errors
PCI/AER: Take reference on error devices
PCI/DPC: Save and restore config state
PCI: portdrv: Restore PCI config state on slot reset
PCI: portdrv: Initialize service drivers directly
PCI: hotplug: Document TODOs
PCI: hotplug: Embed hotplug_slot
PCI: hotplug: Drop hotplug_slot_info
PCI: hotplug: Constify hotplug_slot_ops
PCI: pciehp: Reshuffle controller struct for clarity
PCI: pciehp: Rename controller struct members for clarity
PCI: pciehp: Unify controller and slot structs
PCI: pciehp: Tolerate Presence Detect hardwired to zero
PCI: pciehp: Drop hotplug_slot_ops wrappers
PCI: pciehp: Drop unnecessary includes
PCI: pciehp: Differentiate between surprise and safe removal
PCI: Simplify disconnected marking
This commit is contained in:
commit
20634dc361
84 changed files with 1383 additions and 1747 deletions
|
|
@ -24,11 +24,15 @@ static int acpi_data_get_property_array(const struct acpi_device_data *data,
|
|||
acpi_object_type type,
|
||||
const union acpi_object **obj);
|
||||
|
||||
/* ACPI _DSD device properties GUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301 */
|
||||
static const guid_t prp_guid =
|
||||
static const guid_t prp_guids[] = {
|
||||
/* ACPI _DSD device properties GUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301 */
|
||||
GUID_INIT(0xdaffd814, 0x6eba, 0x4d8c,
|
||||
0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01);
|
||||
/* ACPI _DSD data subnodes GUID: dbb8e3e6-5886-4ba6-8795-1319f52a966b */
|
||||
0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01),
|
||||
/* Hotplug in D3 GUID: 6211e2c0-58a3-4af3-90e1-927a4e0c55a4 */
|
||||
GUID_INIT(0x6211e2c0, 0x58a3, 0x4af3,
|
||||
0x90, 0xe1, 0x92, 0x7a, 0x4e, 0x0c, 0x55, 0xa4),
|
||||
};
|
||||
|
||||
static const guid_t ads_guid =
|
||||
GUID_INIT(0xdbb8e3e6, 0x5886, 0x4ba6,
|
||||
0x87, 0x95, 0x13, 0x19, 0xf5, 0x2a, 0x96, 0x6b);
|
||||
|
|
@ -56,6 +60,7 @@ static bool acpi_nondev_subnode_extract(const union acpi_object *desc,
|
|||
dn->name = link->package.elements[0].string.pointer;
|
||||
dn->fwnode.ops = &acpi_data_fwnode_ops;
|
||||
dn->parent = parent;
|
||||
INIT_LIST_HEAD(&dn->data.properties);
|
||||
INIT_LIST_HEAD(&dn->data.subnodes);
|
||||
|
||||
result = acpi_extract_properties(desc, &dn->data);
|
||||
|
|
@ -288,6 +293,35 @@ static void acpi_init_of_compatible(struct acpi_device *adev)
|
|||
adev->flags.of_compatible_ok = 1;
|
||||
}
|
||||
|
||||
static bool acpi_is_property_guid(const guid_t *guid)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(prp_guids); i++) {
|
||||
if (guid_equal(guid, &prp_guids[i]))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct acpi_device_properties *
|
||||
acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,
|
||||
const union acpi_object *properties)
|
||||
{
|
||||
struct acpi_device_properties *props;
|
||||
|
||||
props = kzalloc(sizeof(*props), GFP_KERNEL);
|
||||
if (props) {
|
||||
INIT_LIST_HEAD(&props->list);
|
||||
props->guid = guid;
|
||||
props->properties = properties;
|
||||
list_add_tail(&props->list, &data->properties);
|
||||
}
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
static bool acpi_extract_properties(const union acpi_object *desc,
|
||||
struct acpi_device_data *data)
|
||||
{
|
||||
|
|
@ -312,7 +346,7 @@ static bool acpi_extract_properties(const union acpi_object *desc,
|
|||
properties->type != ACPI_TYPE_PACKAGE)
|
||||
break;
|
||||
|
||||
if (!guid_equal((guid_t *)guid->buffer.pointer, &prp_guid))
|
||||
if (!acpi_is_property_guid((guid_t *)guid->buffer.pointer))
|
||||
continue;
|
||||
|
||||
/*
|
||||
|
|
@ -320,13 +354,13 @@ static bool acpi_extract_properties(const union acpi_object *desc,
|
|||
* package immediately following it.
|
||||
*/
|
||||
if (!acpi_properties_format_valid(properties))
|
||||
break;
|
||||
continue;
|
||||
|
||||
data->properties = properties;
|
||||
return true;
|
||||
acpi_data_add_props(data, (const guid_t *)guid->buffer.pointer,
|
||||
properties);
|
||||
}
|
||||
|
||||
return false;
|
||||
return !list_empty(&data->properties);
|
||||
}
|
||||
|
||||
void acpi_init_properties(struct acpi_device *adev)
|
||||
|
|
@ -336,6 +370,7 @@ void acpi_init_properties(struct acpi_device *adev)
|
|||
acpi_status status;
|
||||
bool acpi_of = false;
|
||||
|
||||
INIT_LIST_HEAD(&adev->data.properties);
|
||||
INIT_LIST_HEAD(&adev->data.subnodes);
|
||||
|
||||
if (!adev->handle)
|
||||
|
|
@ -398,11 +433,16 @@ static void acpi_destroy_nondev_subnodes(struct list_head *list)
|
|||
|
||||
void acpi_free_properties(struct acpi_device *adev)
|
||||
{
|
||||
struct acpi_device_properties *props, *tmp;
|
||||
|
||||
acpi_destroy_nondev_subnodes(&adev->data.subnodes);
|
||||
ACPI_FREE((void *)adev->data.pointer);
|
||||
adev->data.of_compatible = NULL;
|
||||
adev->data.pointer = NULL;
|
||||
adev->data.properties = NULL;
|
||||
list_for_each_entry_safe(props, tmp, &adev->data.properties, list) {
|
||||
list_del(&props->list);
|
||||
kfree(props);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -427,32 +467,37 @@ static int acpi_data_get_property(const struct acpi_device_data *data,
|
|||
const char *name, acpi_object_type type,
|
||||
const union acpi_object **obj)
|
||||
{
|
||||
const union acpi_object *properties;
|
||||
int i;
|
||||
const struct acpi_device_properties *props;
|
||||
|
||||
if (!data || !name)
|
||||
return -EINVAL;
|
||||
|
||||
if (!data->pointer || !data->properties)
|
||||
if (!data->pointer || list_empty(&data->properties))
|
||||
return -EINVAL;
|
||||
|
||||
properties = data->properties;
|
||||
for (i = 0; i < properties->package.count; i++) {
|
||||
const union acpi_object *propname, *propvalue;
|
||||
const union acpi_object *property;
|
||||
list_for_each_entry(props, &data->properties, list) {
|
||||
const union acpi_object *properties;
|
||||
unsigned int i;
|
||||
|
||||
property = &properties->package.elements[i];
|
||||
properties = props->properties;
|
||||
for (i = 0; i < properties->package.count; i++) {
|
||||
const union acpi_object *propname, *propvalue;
|
||||
const union acpi_object *property;
|
||||
|
||||
propname = &property->package.elements[0];
|
||||
propvalue = &property->package.elements[1];
|
||||
property = &properties->package.elements[i];
|
||||
|
||||
if (!strcmp(name, propname->string.pointer)) {
|
||||
if (type != ACPI_TYPE_ANY && propvalue->type != type)
|
||||
return -EPROTO;
|
||||
if (obj)
|
||||
*obj = propvalue;
|
||||
propname = &property->package.elements[0];
|
||||
propvalue = &property->package.elements[1];
|
||||
|
||||
return 0;
|
||||
if (!strcmp(name, propname->string.pointer)) {
|
||||
if (type != ACPI_TYPE_ANY &&
|
||||
propvalue->type != type)
|
||||
return -EPROTO;
|
||||
if (obj)
|
||||
*obj = propvalue;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -132,8 +132,8 @@ void acpi_extract_apple_properties(struct acpi_device *adev)
|
|||
}
|
||||
WARN_ON(free_space != (void *)newprops + newsize);
|
||||
|
||||
adev->data.properties = newprops;
|
||||
adev->data.pointer = newprops;
|
||||
acpi_data_add_props(&adev->data, &apple_prp_guid, newprops);
|
||||
|
||||
out_free:
|
||||
ACPI_FREE(props);
|
||||
|
|
|
|||
Loading…
Reference in a new issue