80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * This file is subject to the terms and conditions of the GNU General Public
 | 
						|
 * License.  See the file "COPYING" in the main directory of this archive
 | 
						|
 * for more details.
 | 
						|
 *
 | 
						|
 * SGI UV IRQ functions
 | 
						|
 *
 | 
						|
 * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/module.h>
 | 
						|
#include <linux/irq.h>
 | 
						|
 | 
						|
#include <asm/apic.h>
 | 
						|
#include <asm/uv/uv_irq.h>
 | 
						|
 | 
						|
static void uv_noop(unsigned int irq)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
static unsigned int uv_noop_ret(unsigned int irq)
 | 
						|
{
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static void uv_ack_apic(unsigned int irq)
 | 
						|
{
 | 
						|
	ack_APIC_irq();
 | 
						|
}
 | 
						|
 | 
						|
struct irq_chip uv_irq_chip = {
 | 
						|
	.name		= "UV-CORE",
 | 
						|
	.startup	= uv_noop_ret,
 | 
						|
	.shutdown	= uv_noop,
 | 
						|
	.enable		= uv_noop,
 | 
						|
	.disable	= uv_noop,
 | 
						|
	.ack		= uv_noop,
 | 
						|
	.mask		= uv_noop,
 | 
						|
	.unmask		= uv_noop,
 | 
						|
	.eoi		= uv_ack_apic,
 | 
						|
	.end		= uv_noop,
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Set up a mapping of an available irq and vector, and enable the specified
 | 
						|
 * MMR that defines the MSI that is to be sent to the specified CPU when an
 | 
						|
 * interrupt is raised.
 | 
						|
 */
 | 
						|
int uv_setup_irq(char *irq_name, int cpu, int mmr_blade,
 | 
						|
		 unsigned long mmr_offset)
 | 
						|
{
 | 
						|
	int irq;
 | 
						|
	int ret;
 | 
						|
 | 
						|
	irq = create_irq();
 | 
						|
	if (irq <= 0)
 | 
						|
		return -EBUSY;
 | 
						|
 | 
						|
	ret = arch_enable_uv_irq(irq_name, irq, cpu, mmr_blade, mmr_offset);
 | 
						|
	if (ret != irq)
 | 
						|
		destroy_irq(irq);
 | 
						|
 | 
						|
	return ret;
 | 
						|
}
 | 
						|
EXPORT_SYMBOL_GPL(uv_setup_irq);
 | 
						|
 | 
						|
/*
 | 
						|
 * Tear down a mapping of an irq and vector, and disable the specified MMR that
 | 
						|
 * defined the MSI that was to be sent to the specified CPU when an interrupt
 | 
						|
 * was raised.
 | 
						|
 *
 | 
						|
 * Set mmr_blade and mmr_offset to what was passed in on uv_setup_irq().
 | 
						|
 */
 | 
						|
void uv_teardown_irq(unsigned int irq, int mmr_blade, unsigned long mmr_offset)
 | 
						|
{
 | 
						|
	arch_disable_uv_irq(mmr_blade, mmr_offset);
 | 
						|
	destroy_irq(irq);
 | 
						|
}
 | 
						|
EXPORT_SYMBOL_GPL(uv_teardown_irq);
 |