Merge branch 'acpi-resources'
* acpi-resources: (23 commits) Merge branch 'pci/host-generic' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci into acpi-resources x86/irq, ACPI: Implement ACPI driver to support IOAPIC hotplug ACPI: Add interfaces to parse IOAPIC ID for IOAPIC hotplug x86/PCI: Refine the way to release PCI IRQ resources x86/PCI/ACPI: Use common ACPI resource interfaces to simplify implementation x86/PCI: Fix the range check for IO resources PCI: Use common resource list management code instead of private implementation resources: Move struct resource_list_entry from ACPI into resource core ACPI: Introduce helper function acpi_dev_filter_resource_type() ACPI: Add field offset to struct resource_list_entry ACPI: Translate resource into master side address for bridge window resources ACPI: Return translation offset when parsing ACPI address space resources ACPI: Enforce stricter checks for address space descriptors ACPI: Set flag IORESOURCE_UNSET for unassigned resources ACPI: Normalize return value of resource parser functions ACPI: Fix a bug in parsing ACPI Memory24 resource ACPI: Add prefetch decoding to the address space parser ACPI: Move the window flag logic to the combined parser ACPI: Unify the parsing of address_space and ext_address_space ACPI: Let the parser return false for disabled resources ...
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h> /* for struct resource */
|
||||
#include <linux/resource_ext.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/property.h>
|
||||
|
||||
@@ -151,6 +152,10 @@ int acpi_map_cpu(acpi_handle handle, int physid, int *pcpu);
|
||||
int acpi_unmap_cpu(int cpu);
|
||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
||||
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
|
||||
int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
|
||||
#endif
|
||||
|
||||
int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);
|
||||
int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base);
|
||||
int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base);
|
||||
@@ -288,22 +293,25 @@ extern int pnpacpi_disabled;
|
||||
bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res);
|
||||
bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res);
|
||||
bool acpi_dev_resource_address_space(struct acpi_resource *ares,
|
||||
struct resource *res);
|
||||
struct resource_win *win);
|
||||
bool acpi_dev_resource_ext_address_space(struct acpi_resource *ares,
|
||||
struct resource *res);
|
||||
struct resource_win *win);
|
||||
unsigned long acpi_dev_irq_flags(u8 triggering, u8 polarity, u8 shareable);
|
||||
bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
|
||||
struct resource *res);
|
||||
|
||||
struct resource_list_entry {
|
||||
struct list_head node;
|
||||
struct resource res;
|
||||
};
|
||||
|
||||
void acpi_dev_free_resource_list(struct list_head *list);
|
||||
int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,
|
||||
int (*preproc)(struct acpi_resource *, void *),
|
||||
void *preproc_data);
|
||||
int acpi_dev_filter_resource_type(struct acpi_resource *ares,
|
||||
unsigned long types);
|
||||
|
||||
static inline int acpi_dev_filter_resource_type_cb(struct acpi_resource *ares,
|
||||
void *arg)
|
||||
{
|
||||
return acpi_dev_filter_resource_type(ares, (unsigned long)arg);
|
||||
}
|
||||
|
||||
int acpi_check_resource_conflict(const struct resource *res);
|
||||
|
||||
|
@@ -29,6 +29,7 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/resource_ext.h>
|
||||
#include <uapi/linux/pci.h>
|
||||
|
||||
#include <linux/pci_ids.h>
|
||||
@@ -397,16 +398,10 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
|
||||
return (pdev->error_state != pci_channel_io_normal);
|
||||
}
|
||||
|
||||
struct pci_host_bridge_window {
|
||||
struct list_head list;
|
||||
struct resource *res; /* host bridge aperture (CPU address) */
|
||||
resource_size_t offset; /* bus address + offset = CPU address */
|
||||
};
|
||||
|
||||
struct pci_host_bridge {
|
||||
struct device dev;
|
||||
struct pci_bus *bus; /* root bus */
|
||||
struct list_head windows; /* pci_host_bridge_windows */
|
||||
struct list_head windows; /* resource_entry */
|
||||
void (*release_fn)(struct pci_host_bridge *);
|
||||
void *release_data;
|
||||
};
|
||||
|
77
include/linux/resource_ext.h
Normal file
77
include/linux/resource_ext.h
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (C) 2015, Intel Corporation
|
||||
* Author: Jiang Liu <jiang.liu@linux.intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#ifndef _LINUX_RESOURCE_EXT_H
|
||||
#define _LINUX_RESOURCE_EXT_H
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/* Represent resource window for bridge devices */
|
||||
struct resource_win {
|
||||
struct resource res; /* In master (CPU) address space */
|
||||
resource_size_t offset; /* Translation offset for bridge */
|
||||
};
|
||||
|
||||
/*
|
||||
* Common resource list management data structure and interfaces to support
|
||||
* ACPI, PNP and PCI host bridge etc.
|
||||
*/
|
||||
struct resource_entry {
|
||||
struct list_head node;
|
||||
struct resource *res; /* In master (CPU) address space */
|
||||
resource_size_t offset; /* Translation offset for bridge */
|
||||
struct resource __res; /* Default storage for res */
|
||||
};
|
||||
|
||||
extern struct resource_entry *
|
||||
resource_list_create_entry(struct resource *res, size_t extra_size);
|
||||
extern void resource_list_free(struct list_head *head);
|
||||
|
||||
static inline void resource_list_add(struct resource_entry *entry,
|
||||
struct list_head *head)
|
||||
{
|
||||
list_add(&entry->node, head);
|
||||
}
|
||||
|
||||
static inline void resource_list_add_tail(struct resource_entry *entry,
|
||||
struct list_head *head)
|
||||
{
|
||||
list_add_tail(&entry->node, head);
|
||||
}
|
||||
|
||||
static inline void resource_list_del(struct resource_entry *entry)
|
||||
{
|
||||
list_del(&entry->node);
|
||||
}
|
||||
|
||||
static inline void resource_list_free_entry(struct resource_entry *entry)
|
||||
{
|
||||
kfree(entry);
|
||||
}
|
||||
|
||||
static inline void
|
||||
resource_list_destroy_entry(struct resource_entry *entry)
|
||||
{
|
||||
resource_list_del(entry);
|
||||
resource_list_free_entry(entry);
|
||||
}
|
||||
|
||||
#define resource_list_for_each_entry(entry, list) \
|
||||
list_for_each_entry((entry), (list), node)
|
||||
|
||||
#define resource_list_for_each_entry_safe(entry, tmp, list) \
|
||||
list_for_each_entry_safe((entry), (tmp), (list), node)
|
||||
|
||||
#endif /* _LINUX_RESOURCE_EXT_H */
|
Reference in New Issue
Block a user