/* * 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);