mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-21 02:27:02 +07:00
a1dafe857d
enable_IR_x2apic() calls setup_irq_remapping_ops() which by default installs the intel dmar remapping ops and then calls the amd iommu irq remapping prepare callback to figure out whether we are running on an AMD machine with irq remapping hardware. Right after that it calls irq_remapping_prepare() which pointlessly checks: if (!remap_ops || !remap_ops->prepare) return -ENODEV; and then calls remap_ops->prepare() which is silly in the AMD case as it got called from setup_irq_remapping_ops() already a few microseconds ago. Simplify this and just collapse everything into irq_remapping_prepare(). The irq_remapping_prepare() remains still silly as it assigns blindly the intel ops, but that's not scope of this patch. The scope here is to move the preperatory work, i.e. memory allocations out of the atomic section which is required to enable irq remapping. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Borislav Petkov <bp@alien8.de> Acked-and-tested-by: Joerg Roedel <joro@8bytes.org> Cc: Tony Luck <tony.luck@intel.com> Cc: iommu@lists.linux-foundation.org Cc: Joerg Roedel <jroedel@suse.de> Cc: H. Peter Anvin <hpa@linux.intel.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Yinghai Lu <yinghai@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> Cc: Jan Beulich <JBeulich@suse.com> Cc: Richard Weinberger <richard@nod.at> Cc: Oren Twaig <oren@scalemp.com> Cc: x86@kernel.org Link: http://lkml.kernel.org/r/20141205084147.232633738@linutronix.de Link: http://lkml.kernel.org/r/1420615903-28253-2-git-send-email-jiang.liu@linux.intel.com Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
108 lines
3.4 KiB
C
108 lines
3.4 KiB
C
/*
|
|
* Copyright (C) 2012 Advanced Micro Devices, Inc.
|
|
* Author: Joerg Roedel <joerg.roedel@amd.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published
|
|
* by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* This header file contains the interface of the interrupt remapping code to
|
|
* the x86 interrupt management code.
|
|
*/
|
|
|
|
#ifndef __X86_IRQ_REMAPPING_H
|
|
#define __X86_IRQ_REMAPPING_H
|
|
|
|
#include <asm/io_apic.h>
|
|
|
|
struct IO_APIC_route_entry;
|
|
struct io_apic_irq_attr;
|
|
struct irq_chip;
|
|
struct msi_msg;
|
|
struct pci_dev;
|
|
struct irq_cfg;
|
|
|
|
#ifdef CONFIG_IRQ_REMAP
|
|
|
|
extern int irq_remapping_supported(void);
|
|
extern void set_irq_remapping_broken(void);
|
|
extern int irq_remapping_prepare(void);
|
|
extern int irq_remapping_enable(void);
|
|
extern void irq_remapping_disable(void);
|
|
extern int irq_remapping_reenable(int);
|
|
extern int irq_remap_enable_fault_handling(void);
|
|
extern int setup_ioapic_remapped_entry(int irq,
|
|
struct IO_APIC_route_entry *entry,
|
|
unsigned int destination,
|
|
int vector,
|
|
struct io_apic_irq_attr *attr);
|
|
extern void free_remapped_irq(int irq);
|
|
extern void compose_remapped_msi_msg(struct pci_dev *pdev,
|
|
unsigned int irq, unsigned int dest,
|
|
struct msi_msg *msg, u8 hpet_id);
|
|
extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id);
|
|
extern void panic_if_irq_remap(const char *msg);
|
|
extern bool setup_remapped_irq(int irq,
|
|
struct irq_cfg *cfg,
|
|
struct irq_chip *chip);
|
|
|
|
void irq_remap_modify_chip_defaults(struct irq_chip *chip);
|
|
|
|
#else /* CONFIG_IRQ_REMAP */
|
|
|
|
static inline int irq_remapping_supported(void) { return 0; }
|
|
static inline void set_irq_remapping_broken(void) { }
|
|
static inline int irq_remapping_prepare(void) { return -ENODEV; }
|
|
static inline int irq_remapping_enable(void) { return -ENODEV; }
|
|
static inline void irq_remapping_disable(void) { }
|
|
static inline int irq_remapping_reenable(int eim) { return -ENODEV; }
|
|
static inline int irq_remap_enable_fault_handling(void) { return -ENODEV; }
|
|
static inline int setup_ioapic_remapped_entry(int irq,
|
|
struct IO_APIC_route_entry *entry,
|
|
unsigned int destination,
|
|
int vector,
|
|
struct io_apic_irq_attr *attr)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
static inline void free_remapped_irq(int irq) { }
|
|
static inline void compose_remapped_msi_msg(struct pci_dev *pdev,
|
|
unsigned int irq, unsigned int dest,
|
|
struct msi_msg *msg, u8 hpet_id)
|
|
{
|
|
}
|
|
static inline int setup_hpet_msi_remapped(unsigned int irq, unsigned int id)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline void panic_if_irq_remap(const char *msg)
|
|
{
|
|
}
|
|
|
|
static inline void irq_remap_modify_chip_defaults(struct irq_chip *chip)
|
|
{
|
|
}
|
|
|
|
static inline bool setup_remapped_irq(int irq,
|
|
struct irq_cfg *cfg,
|
|
struct irq_chip *chip)
|
|
{
|
|
return false;
|
|
}
|
|
#endif /* CONFIG_IRQ_REMAP */
|
|
|
|
#define dmar_alloc_hwirq() irq_alloc_hwirq(-1)
|
|
#define dmar_free_hwirq irq_free_hwirq
|
|
|
|
#endif /* __X86_IRQ_REMAPPING_H */
|