Re: [PATCH] x86/acpi: calling mp_config_acpi_gsi in mp_register_gsi

From: Yinghai Lu
Date: Sun Apr 26 2009 - 19:26:51 EST


it seems it still have some problem. will have -v2.

YH

Yinghai Lu wrote:
> it seems that change about calling mp_config_acpi_gsi in acpi_pci_irq_enable()
> never get into mainline.
>
> actually we could call that in mp_register_gsi with struct device...
> also could make mp_config_acpi_gsi to be static
>
> [Impact: make update_mptable working]
>
> Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>
>
> ---
> arch/x86/include/asm/mpspec.h | 9 ------
> arch/x86/kernel/acpi/boot.c | 62 ++++++++++++++++++++++++------------------
> 2 files changed, 36 insertions(+), 35 deletions(-)
>
> Index: linux-2.6/arch/x86/include/asm/mpspec.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/mpspec.h
> +++ linux-2.6/arch/x86/include/asm/mpspec.h
> @@ -77,17 +77,8 @@ extern int mp_register_gsi(struct device
> int active_high_low);
> extern int acpi_probe_gsi(void);
> #ifdef CONFIG_X86_IO_APIC
> -extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
> - u32 gsi, int triggering, int polarity);
> extern int mp_find_ioapic(int gsi);
> extern int mp_find_ioapic_pin(int ioapic, int gsi);
> -#else
> -static inline int
> -mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
> - u32 gsi, int triggering, int polarity)
> -{
> - return 0;
> -}
> #endif
> #else /* !CONFIG_ACPI: */
> static inline int acpi_probe_gsi(void)
> Index: linux-2.6/arch/x86/kernel/acpi/boot.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/acpi/boot.c
> +++ linux-2.6/arch/x86/kernel/acpi/boot.c
> @@ -33,6 +33,7 @@
> #include <linux/irq.h>
> #include <linux/bootmem.h>
> #include <linux/ioport.h>
> +#include <linux/pci.h>
>
> #include <asm/pgtable.h>
> #include <asm/io_apic.h>
> @@ -1158,6 +1159,40 @@ void __init mp_config_acpi_legacy_irqs(v
> }
> }
>
> +static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int triggering,
> + int polarity)
> +{
> +#ifdef CONFIG_X86_MPPARSE
> + struct mpc_intsrc mp_irq;
> + struct pci_dev *pdev;
> + unsigned char number;
> + unsigned int devfn;
> + int ioapic;
> + u8 pin;
> +
> + if (!acpi_ioapic)
> + return 0;
> +
> + pdev = to_pci_dev(dev);
> + number = pdev->bus->number;
> + devfn = pdev->devfn;
> + pin = pdev->pin;
> + /* print the entry should happen on mptable identically */
> + mp_irq.type = MP_INTSRC;
> + mp_irq.irqtype = mp_INT;
> + mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) |
> + (polarity == ACPI_ACTIVE_HIGH ? 1 : 3);
> + mp_irq.srcbus = number;
> + mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
> + ioapic = mp_find_ioapic(gsi);
> + mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id;
> + mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
> +
> + save_mp_irq(&mp_irq);
> +#endif
> + return 0;
> +}
> +
> int mp_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)
> {
> int ioapic;
> @@ -1189,6 +1224,7 @@ int mp_register_gsi(struct device *dev,
> ioapic_pin);
> return gsi;
> }
> + mp_config_acpi_gsi(dev, gsi, triggering, polarity);
>
> /*
> * Avoid pin reprogramming. PRTs typically include entries
> @@ -1208,32 +1244,6 @@ int mp_register_gsi(struct device *dev,
> return gsi;
> }
>
> -int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
> - u32 gsi, int triggering, int polarity)
> -{
> -#ifdef CONFIG_X86_MPPARSE
> - struct mpc_intsrc mp_irq;
> - int ioapic;
> -
> - if (!acpi_ioapic)
> - return 0;
> -
> - /* print the entry should happen on mptable identically */
> - mp_irq.type = MP_INTSRC;
> - mp_irq.irqtype = mp_INT;
> - mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) |
> - (polarity == ACPI_ACTIVE_HIGH ? 1 : 3);
> - mp_irq.srcbus = number;
> - mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
> - ioapic = mp_find_ioapic(gsi);
> - mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id;
> - mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
> -
> - save_mp_irq(&mp_irq);
> -#endif
> - return 0;
> -}
> -
> /*
> * Parse IOAPIC related entries in MADT
> * returns 0 on success, < 0 on error
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/