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