forked from mirrors/linux
		
	x86, hpet: Introduce x86_msi_ops.setup_hpet_msi
This function pointer can be overwritten by the IRQ remapping code. The irq_remapping_enabled check can be removed from default_setup_hpet_msi. Signed-off-by: Joerg Roedel <joro@8bytes.org> Acked-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
		
							parent
							
								
									afcc8a40a0
								
							
						
					
					
						commit
						71054d8841
					
				
					 6 changed files with 14 additions and 15 deletions
				
			
		| 
						 | 
					@ -80,9 +80,9 @@ extern void hpet_msi_write(struct hpet_dev *hdev, struct msi_msg *msg);
 | 
				
			||||||
extern void hpet_msi_read(struct hpet_dev *hdev, struct msi_msg *msg);
 | 
					extern void hpet_msi_read(struct hpet_dev *hdev, struct msi_msg *msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PCI_MSI
 | 
					#ifdef CONFIG_PCI_MSI
 | 
				
			||||||
extern int arch_setup_hpet_msi(unsigned int irq, unsigned int id);
 | 
					extern int default_setup_hpet_msi(unsigned int irq, unsigned int id);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
static inline int arch_setup_hpet_msi(unsigned int irq, unsigned int id)
 | 
					static inline int default_setup_hpet_msi(unsigned int irq, unsigned int id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return -EINVAL;
 | 
						return -EINVAL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -111,6 +111,7 @@ extern void hpet_unregister_irq_handler(rtc_irq_handler handler);
 | 
				
			||||||
static inline int hpet_enable(void) { return 0; }
 | 
					static inline int hpet_enable(void) { return 0; }
 | 
				
			||||||
static inline int is_hpet_enabled(void) { return 0; }
 | 
					static inline int is_hpet_enabled(void) { return 0; }
 | 
				
			||||||
#define hpet_readl(a) 0
 | 
					#define hpet_readl(a) 0
 | 
				
			||||||
 | 
					#define default_setup_hpet_msi	NULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif /* _ASM_X86_HPET_H */
 | 
					#endif /* _ASM_X86_HPET_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,6 +187,7 @@ struct x86_msi_ops {
 | 
				
			||||||
	void (*teardown_msi_irq)(unsigned int irq);
 | 
						void (*teardown_msi_irq)(unsigned int irq);
 | 
				
			||||||
	void (*teardown_msi_irqs)(struct pci_dev *dev);
 | 
						void (*teardown_msi_irqs)(struct pci_dev *dev);
 | 
				
			||||||
	void (*restore_msi_irqs)(struct pci_dev *dev, int irq);
 | 
						void (*restore_msi_irqs)(struct pci_dev *dev, int irq);
 | 
				
			||||||
 | 
						int  (*setup_hpet_msi)(unsigned int irq, unsigned int id);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct x86_io_apic_ops {
 | 
					struct x86_io_apic_ops {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3399,18 +3399,12 @@ static struct irq_chip hpet_msi_type = {
 | 
				
			||||||
	.irq_retrigger = ioapic_retrigger_irq,
 | 
						.irq_retrigger = ioapic_retrigger_irq,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int arch_setup_hpet_msi(unsigned int irq, unsigned int id)
 | 
					int default_setup_hpet_msi(unsigned int irq, unsigned int id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct irq_chip *chip = &hpet_msi_type;
 | 
						struct irq_chip *chip = &hpet_msi_type;
 | 
				
			||||||
	struct msi_msg msg;
 | 
						struct msi_msg msg;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (irq_remapping_enabled) {
 | 
					 | 
				
			||||||
		ret = setup_hpet_msi_remapped(irq, id);
 | 
					 | 
				
			||||||
		if (ret)
 | 
					 | 
				
			||||||
			return ret;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret = msi_compose_msg(NULL, irq, &msg, id);
 | 
						ret = msi_compose_msg(NULL, irq, &msg, id);
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -478,7 +478,7 @@ static int hpet_msi_next_event(unsigned long delta,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int hpet_setup_msi_irq(unsigned int irq)
 | 
					static int hpet_setup_msi_irq(unsigned int irq)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (arch_setup_hpet_msi(irq, hpet_blockid)) {
 | 
						if (x86_msi.setup_hpet_msi(irq, hpet_blockid)) {
 | 
				
			||||||
		destroy_irq(irq);
 | 
							destroy_irq(irq);
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@
 | 
				
			||||||
#include <asm/time.h>
 | 
					#include <asm/time.h>
 | 
				
			||||||
#include <asm/irq.h>
 | 
					#include <asm/irq.h>
 | 
				
			||||||
#include <asm/io_apic.h>
 | 
					#include <asm/io_apic.h>
 | 
				
			||||||
 | 
					#include <asm/hpet.h>
 | 
				
			||||||
#include <asm/pat.h>
 | 
					#include <asm/pat.h>
 | 
				
			||||||
#include <asm/tsc.h>
 | 
					#include <asm/tsc.h>
 | 
				
			||||||
#include <asm/iommu.h>
 | 
					#include <asm/iommu.h>
 | 
				
			||||||
| 
						 | 
					@ -115,6 +116,7 @@ struct x86_msi_ops x86_msi = {
 | 
				
			||||||
	.teardown_msi_irq	= native_teardown_msi_irq,
 | 
						.teardown_msi_irq	= native_teardown_msi_irq,
 | 
				
			||||||
	.teardown_msi_irqs	= default_teardown_msi_irqs,
 | 
						.teardown_msi_irqs	= default_teardown_msi_irqs,
 | 
				
			||||||
	.restore_msi_irqs	= default_restore_msi_irqs,
 | 
						.restore_msi_irqs	= default_restore_msi_irqs,
 | 
				
			||||||
 | 
						.setup_hpet_msi		= default_setup_hpet_msi,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct x86_io_apic_ops x86_io_apic_ops = {
 | 
					struct x86_io_apic_ops x86_io_apic_ops = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ static void irq_remapping_disable_io_apic(void)
 | 
				
			||||||
static void __init irq_remapping_modify_x86_ops(void)
 | 
					static void __init irq_remapping_modify_x86_ops(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	x86_io_apic_ops.disable		= irq_remapping_disable_io_apic;
 | 
						x86_io_apic_ops.disable		= irq_remapping_disable_io_apic;
 | 
				
			||||||
 | 
						x86_msi.setup_hpet_msi		= setup_hpet_msi_remapped;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static __init int setup_nointremap(char *str)
 | 
					static __init int setup_nointremap(char *str)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue