Skip to contentSkip to conversation

ACPI pcibios_disable_device implementation for x86

PATCH New Shaohua Li 1 participant 1 message May 17, 2005

Subsystems (3)
lore
Share & tools
lore

Shaohua Li

author
#0 lore raw

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
diff -puN arch/i386/kernel/acpi/boot.c~suspend_resume_irq arch/i386/kernel/acpi/boot.c
@@ -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
diff -puN arch/i386/pci/acpi.c~suspend_resume_irq arch/i386/pci/acpi.c
@@ -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
diff -puN arch/i386/pci/common.c~suspend_resume_irq arch/i386/pci/common.c
@@ -253,3 +253,9 @@ int pcibios_enable_device(struct pci_dev
 
 	return 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
diff -puN arch/i386/pci/irq.c~suspend_resume_irq arch/i386/pci/irq.c
@@ -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
diff -puN arch/i386/pci/pci.h~suspend_resume_irq arch/i386/pci/pci.h
@@ -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
diff -puN include/acpi/acpi_drivers.h~suspend_resume_irq include/acpi/acpi_drivers.h
@@ -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
diff -puN include/asm-i386/mpspec.h~suspend_resume_irq include/asm-i386/mpspec.h
@@ -33,6 +33,7 @@ extern void mp_register_ioapic (u8 id, u
 extern 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
diff -puN include/linux/acpi.h~suspend_resume_irq include/linux/acpi.h
@@ -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
diff -puN include/asm-x86_64/mpspec.h~suspend_resume_irq include/asm-x86_64/mpspec.h
@@ -188,6 +188,7 @@ extern void mp_register_ioapic (u8 id, u
 extern 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