ACPI pcibios_disable_device implementation for x86
Subsystems (3)
PATCH 1/1 ACPI pcibios_disable_device implementation for x86
Hi,
This an implementation of pcibios_disable_device for x86. It's porting from current ia64 implementation, but more sample. The design of pcibios_disable_device is for ioapic hotplug, but here we used it for suspend/resume, since we must disable PIC/IOAPIC/irq router at suspend. Most changes are in ACPI part. It's against -mm tree.
Thanks,
Shaohua
---
linux-2.6.11-root/arch/i386/kernel/acpi/boot.c | 11 +++ linux-2.6.11-root/arch/i386/kernel/mpparse.c | 45 +++++++++++-- linux-2.6.11-root/arch/i386/pci/acpi.c | 1 linux-2.6.11-root/arch/i386/pci/common.c | 6 + linux-2.6.11-root/arch/i386/pci/irq.c | 1 linux-2.6.11-root/arch/i386/pci/pci.h | 1 linux-2.6.11-root/arch/x86_64/kernel/mpparse.c | 43 ++++++++++--- linux-2.6.11-root/drivers/acpi/pci_irq.c | 82 +++++++++++++++++-------- linux-2.6.11-root/drivers/acpi/pci_link.c | 76 +++++++++++++++++++---- linux-2.6.11-root/include/acpi/acpi_drivers.h | 3 linux-2.6.11-root/include/asm-i386/mpspec.h | 1 linux-2.6.11-root/include/asm-x86_64/mpspec.h | 1 linux-2.6.11-root/include/linux/acpi.h | 4 - 13 files changed, 216 insertions(+), 59 deletions(-)
arch/i386/kernel/acpi/boot.c renamed from arch/i386/kernel/acpi/boot.c~suspend_resume_irq +11 -0
@@ -484,6 +484,17 @@ unsigned int acpi_register_gsi(u32 gsi, }EXPORT_SYMBOL (acpi_register_gsi); +void acpi_unregister_gsi (u32 gsi) +{ +/* ELCR set to edge? seems not required */ +#ifdef CONFIG_X86_IO_APIC +if (acpi_irq_model ==ACPI_IRQ_MODEL_IOAPIC ) { +mp_unregister_gsi (gsi); + } +#endif +} +EXPORT_SYMBOL (acpi_unregister_gsi); +/* * ACPI based hotplug support for CPU */
arch/i386/kernel/mpparse.c renamed from arch/i386/kernel/mpparse.c~suspend_resume_irq +37 -8
78 lines not on this page · raw message
arch/i386/pci/acpi.c renamed from arch/i386/pci/acpi.c~suspend_resume_irq +1 -0
@@ -30,6 +30,7 @@ static int __init pci_acpi_init(void)acpi_irq_penalty_init (); pcibios_scanned++; pcibios_enable_irq = acpi_pci_irq_enable; + pcibios_disable_irq = acpi_pci_irq_disable;if (pci_routeirq) {/*
arch/i386/pci/common.c renamed from arch/i386/pci/common.c~suspend_resume_irq +6 -0
@@ -253,3 +253,9 @@ int pcibios_enable_device(struct pci_devreturn pcibios_enable_irq (dev); } + +void pcibios_disable_device (struct pci_dev *dev) +{ +if (pcibios_disable_irq) +pcibios_disable_irq (dev); +}
arch/i386/pci/irq.c renamed from arch/i386/pci/irq.c~suspend_resume_irq +1 -0
@@ -56,6 +56,7 @@ struct irq_router_handler { };int (*pcibios_enable_irq)(struct pci_dev *dev) =NULL ; +void (*pcibios_disable_irq)(struct pci_dev *dev) =NULL ;/* * Check passed address for the PCI IRQ Routing Table signature
arch/i386/pci/pci.h renamed from arch/i386/pci/pci.h~suspend_resume_irq +1 -0
@@ -73,3 +73,4 @@ extern int pcibios_scanned;extern spinlock_t pci_config_lock;extern int (*pcibios_enable_irq)(struct pci_dev *dev); +extern void (*pcibios_disable_irq)(struct pci_dev *dev);
drivers/acpi/pci_irq.c renamed from drivers/acpi/pci_irq.c~suspend_resume_irq +56 -26
150 lines not on this page · raw message
drivers/acpi/pci_link.c renamed from drivers/acpi/pci_link.c~suspend_resume_irq +64 -12
134 lines not on this page · raw message
include/acpi/acpi_drivers.h renamed from include/acpi/acpi_drivers.h~suspend_resume_irq +2 -1
@@ -56,8 +56,9 @@/* ACPI PCI Interrupt Link (pci_link.c) */ int acpi_irq_penalty_init (void ); -int acpi_pci_link_get_irq (acpi_handle handle,int index,int *edge_level, +int acpi_pci_link_allocate_irq (acpi_handle handle,int index,int *edge_level,int *active_high_low,char **name); +int acpi_pci_link_free_irq (acpi_handle handle);/* ACPI PCI Interrupt Routing (pci_irq.c) */
include/asm-i386/mpspec.h renamed from include/asm-i386/mpspec.h~suspend_resume_irq +1 -0
@@ -33,6 +33,7 @@ extern void mp_register_ioapic (u8 id, uextern void mp_override_legacy_irq (u8 bus_irq,u8 polarity,u8 trigger,u32 gsi);extern void mp_config_acpi_legacy_irqs (void );extern int mp_register_gsi (u32 gsi,int edge_level,int active_high_low); +extern void mp_unregister_gsi (u32 gsi);#endif /*CONFIG_ACPI_BOOT*/ #define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS)
include/linux/acpi.h renamed from include/linux/acpi.h~suspend_resume_irq +0 -4
@@ -431,9 +431,7 @@ int acpi_gsi_to_irq (u32 gsi, unsigned i* If this matches the last registration, any IRQ resources for gsi * are freed. */ -#ifdef CONFIG_ACPI_DEALLOCATE_IRQ void acpi_unregister_gsi (u32 gsi); -#endif #ifdef CONFIG_ACPI_PCI
@@ -458,9 +456,7 @@ struct pci_dev;int acpi_pci_irq_enable (struct pci_dev *dev);void acpi_penalize_isa_irq (int irq,int active); -#ifdef CONFIG_ACPI_DEALLOCATE_IRQ void acpi_pci_irq_disable (struct pci_dev *dev); -#endif struct acpi_pci_driver {struct acpi_pci_driver *next;
arch/x86_64/kernel/mpparse.c renamed from arch/x86_64/kernel/mpparse.c~suspend_resume_irq +35 -8
76 lines not on this page · raw message
include/asm-x86_64/mpspec.h renamed from include/asm-x86_64/mpspec.h~suspend_resume_irq +1 -0
@@ -188,6 +188,7 @@ extern void mp_register_ioapic (u8 id, uextern void mp_override_legacy_irq (u8 bus_irq,u8 polarity,u8 trigger,u32 gsi);extern void mp_config_acpi_legacy_irqs (void );extern int mp_register_gsi (u32 gsi,int edge_level,int active_high_low); +extern void mp_unregister_gsi (u32 gsi);#endif /*CONFIG_X86_IO_APIC*/ #endif
_
-------------------------------------------------------
This SF.Net email is sponsored by Oracle Space Sweepstakes Want to be the first software developer in space? Enter now for the Oracle Space Sweepstakes!
http://ads.osdn.com/?ad_id=7412&alloc_id=16344&op=click