mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Merge branch 'linus' into irq/numa
Conflicts: arch/mips/sibyte/bcm1480/irq.c arch/mips/sibyte/sb1250/irq.c Merge reason: we gathered a few conflicts plus update to latest upstream fixes. Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
commit
3d58f48ba0
758 changed files with 19610 additions and 5324 deletions
|
|
@ -129,7 +129,6 @@ struct acpiphp_func {
|
|||
struct acpiphp_bridge *bridge; /* Ejectable PCI-to-PCI bridge */
|
||||
|
||||
struct list_head sibling;
|
||||
struct pci_dev *pci_dev;
|
||||
struct notifier_block nb;
|
||||
acpi_handle handle;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,9 +32,6 @@
|
|||
|
||||
/*
|
||||
* Lifetime rules for pci_dev:
|
||||
* - The one in acpiphp_func has its refcount elevated by pci_get_slot()
|
||||
* when the driver is loaded or when an insertion event occurs. It loses
|
||||
* a refcount when its ejected or the driver unloads.
|
||||
* - The one in acpiphp_bridge has its refcount elevated by pci_get_slot()
|
||||
* when the bridge is scanned and it loses a refcount when the bridge
|
||||
* is removed.
|
||||
|
|
@ -130,6 +127,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
unsigned long long adr, sun;
|
||||
int device, function, retval;
|
||||
struct pci_bus *pbus = bridge->pci_bus;
|
||||
struct pci_dev *pdev;
|
||||
|
||||
if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle))
|
||||
return AE_OK;
|
||||
|
|
@ -213,10 +211,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
newfunc->slot = slot;
|
||||
list_add_tail(&newfunc->sibling, &slot->funcs);
|
||||
|
||||
/* associate corresponding pci_dev */
|
||||
newfunc->pci_dev = pci_get_slot(pbus, PCI_DEVFN(device, function));
|
||||
if (newfunc->pci_dev) {
|
||||
pdev = pci_get_slot(pbus, PCI_DEVFN(device, function));
|
||||
if (pdev) {
|
||||
slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON);
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
if (is_dock_device(handle)) {
|
||||
|
|
@ -617,7 +615,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
|
|||
if (ACPI_FAILURE(status))
|
||||
err("failed to remove notify handler\n");
|
||||
}
|
||||
pci_dev_put(func->pci_dev);
|
||||
list_del(list);
|
||||
kfree(func);
|
||||
}
|
||||
|
|
@ -1101,22 +1098,24 @@ static int __ref enable_device(struct acpiphp_slot *slot)
|
|||
pci_enable_bridges(bus);
|
||||
pci_bus_add_devices(bus);
|
||||
|
||||
/* associate pci_dev to our representation */
|
||||
list_for_each (l, &slot->funcs) {
|
||||
func = list_entry(l, struct acpiphp_func, sibling);
|
||||
func->pci_dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
|
||||
func->function));
|
||||
if (!func->pci_dev)
|
||||
dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
|
||||
func->function));
|
||||
if (!dev)
|
||||
continue;
|
||||
|
||||
if (func->pci_dev->hdr_type != PCI_HEADER_TYPE_BRIDGE &&
|
||||
func->pci_dev->hdr_type != PCI_HEADER_TYPE_CARDBUS)
|
||||
if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE &&
|
||||
dev->hdr_type != PCI_HEADER_TYPE_CARDBUS) {
|
||||
pci_dev_put(dev);
|
||||
continue;
|
||||
}
|
||||
|
||||
status = find_p2p_bridge(func->handle, (u32)1, bus, NULL);
|
||||
if (ACPI_FAILURE(status))
|
||||
warn("find_p2p_bridge failed (error code = 0x%x)\n",
|
||||
status);
|
||||
pci_dev_put(dev);
|
||||
}
|
||||
|
||||
slot->flags |= SLOT_ENABLED;
|
||||
|
|
@ -1142,17 +1141,14 @@ static void disable_bridges(struct pci_bus *bus)
|
|||
*/
|
||||
static int disable_device(struct acpiphp_slot *slot)
|
||||
{
|
||||
int retval = 0;
|
||||
struct acpiphp_func *func;
|
||||
struct list_head *l;
|
||||
struct pci_dev *pdev;
|
||||
|
||||
/* is this slot already disabled? */
|
||||
if (!(slot->flags & SLOT_ENABLED))
|
||||
goto err_exit;
|
||||
|
||||
list_for_each (l, &slot->funcs) {
|
||||
func = list_entry(l, struct acpiphp_func, sibling);
|
||||
|
||||
list_for_each_entry(func, &slot->funcs, sibling) {
|
||||
if (func->bridge) {
|
||||
/* cleanup p2p bridges under this P2P bridge */
|
||||
cleanup_p2p_bridge(func->bridge->handle,
|
||||
|
|
@ -1160,35 +1156,28 @@ static int disable_device(struct acpiphp_slot *slot)
|
|||
func->bridge = NULL;
|
||||
}
|
||||
|
||||
if (func->pci_dev) {
|
||||
pci_stop_bus_device(func->pci_dev);
|
||||
if (func->pci_dev->subordinate) {
|
||||
disable_bridges(func->pci_dev->subordinate);
|
||||
pci_disable_device(func->pci_dev);
|
||||
pdev = pci_get_slot(slot->bridge->pci_bus,
|
||||
PCI_DEVFN(slot->device, func->function));
|
||||
if (pdev) {
|
||||
pci_stop_bus_device(pdev);
|
||||
if (pdev->subordinate) {
|
||||
disable_bridges(pdev->subordinate);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
pci_remove_bus_device(pdev);
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each (l, &slot->funcs) {
|
||||
func = list_entry(l, struct acpiphp_func, sibling);
|
||||
|
||||
list_for_each_entry(func, &slot->funcs, sibling) {
|
||||
acpiphp_unconfigure_ioapics(func->handle);
|
||||
acpiphp_bus_trim(func->handle);
|
||||
/* try to remove anyway.
|
||||
* acpiphp_bus_add might have been failed */
|
||||
|
||||
if (!func->pci_dev)
|
||||
continue;
|
||||
|
||||
pci_remove_bus_device(func->pci_dev);
|
||||
pci_dev_put(func->pci_dev);
|
||||
func->pci_dev = NULL;
|
||||
}
|
||||
|
||||
slot->flags &= (~SLOT_ENABLED);
|
||||
|
||||
err_exit:
|
||||
return retval;
|
||||
err_exit:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,10 @@
|
|||
#define DMA_32BIT_PFN IOVA_PFN(DMA_BIT_MASK(32))
|
||||
#define DMA_64BIT_PFN IOVA_PFN(DMA_BIT_MASK(64))
|
||||
|
||||
#ifndef PHYSICAL_PAGE_MASK
|
||||
#define PHYSICAL_PAGE_MASK PAGE_MASK
|
||||
#endif
|
||||
|
||||
/* global iommu list, set NULL for ignored DMAR units */
|
||||
static struct intel_iommu **g_iommus;
|
||||
|
||||
|
|
@ -1216,7 +1220,7 @@ static void dmar_init_reserved_ranges(void)
|
|||
if (!r->flags || !(r->flags & IORESOURCE_MEM))
|
||||
continue;
|
||||
addr = r->start;
|
||||
addr &= PAGE_MASK;
|
||||
addr &= PHYSICAL_PAGE_MASK;
|
||||
size = r->end - addr;
|
||||
size = PAGE_ALIGN(size);
|
||||
iova = reserve_iova(&reserved_iova_list, IOVA_PFN(addr),
|
||||
|
|
@ -2164,7 +2168,8 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr,
|
|||
* is not a big problem
|
||||
*/
|
||||
ret = domain_page_mapping(domain, start_paddr,
|
||||
((u64)paddr) & PAGE_MASK, size, prot);
|
||||
((u64)paddr) & PHYSICAL_PAGE_MASK,
|
||||
size, prot);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
|
|
@ -2454,8 +2459,8 @@ static int intel_map_sg(struct device *hwdev, struct scatterlist *sglist, int ne
|
|||
addr = page_to_phys(sg_page(sg)) + sg->offset;
|
||||
size = aligned_size((u64)addr, sg->length);
|
||||
ret = domain_page_mapping(domain, start_addr + offset,
|
||||
((u64)addr) & PAGE_MASK,
|
||||
size, prot);
|
||||
((u64)addr) & PHYSICAL_PAGE_MASK,
|
||||
size, prot);
|
||||
if (ret) {
|
||||
/* clear the page */
|
||||
dma_pte_clear_range(domain, start_addr,
|
||||
|
|
|
|||
|
|
@ -455,8 +455,6 @@ static int msix_capability_init(struct pci_dev *dev,
|
|||
entry->msi_attrib.default_irq = dev->irq;
|
||||
entry->msi_attrib.pos = pos;
|
||||
entry->mask_base = base;
|
||||
entry->masked = readl(base + j * PCI_MSIX_ENTRY_SIZE +
|
||||
PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
|
||||
msix_mask_irq(entry, 1);
|
||||
|
||||
list_add_tail(&entry->list, &dev->msi_list);
|
||||
|
|
@ -493,6 +491,12 @@ static int msix_capability_init(struct pci_dev *dev,
|
|||
msix_set_enable(dev, 1);
|
||||
dev->msix_enabled = 1;
|
||||
|
||||
list_for_each_entry(entry, &dev->msi_list, list) {
|
||||
int vector = entry->msi_attrib.entry_nr;
|
||||
entry->masked = readl(base + vector * PCI_MSIX_ENTRY_SIZE +
|
||||
PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -557,7 +557,8 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state)
|
|||
} else {
|
||||
error = -ENODEV;
|
||||
/* Fall back to PCI_D0 if native PM is not supported */
|
||||
pci_update_current_state(dev, PCI_D0);
|
||||
if (!dev->pm_cap)
|
||||
dev->current_state = PCI_D0;
|
||||
}
|
||||
|
||||
return error;
|
||||
|
|
|
|||
|
|
@ -95,6 +95,9 @@ struct aer_broadcast_data {
|
|||
static inline pci_ers_result_t merge_result(enum pci_ers_result orig,
|
||||
enum pci_ers_result new)
|
||||
{
|
||||
if (new == PCI_ERS_RESULT_NONE)
|
||||
return orig;
|
||||
|
||||
switch (orig) {
|
||||
case PCI_ERS_RESULT_CAN_RECOVER:
|
||||
case PCI_ERS_RESULT_RECOVERED:
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ static int slot_reset_iter(struct device *device, void *data)
|
|||
|
||||
static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)
|
||||
{
|
||||
pci_ers_result_t status = PCI_ERS_RESULT_NONE;
|
||||
pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
|
||||
int retval;
|
||||
|
||||
/* If fatal, restore cfg space for possible link reset at upstream */
|
||||
|
|
|
|||
Loading…
Reference in a new issue