mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
511f838945
Previously tile was rolling its own method of capturing backtrace data in the NMI handlers, but it was relying on running printk() from the NMI handler, which is not always safe. So adopt the nmi_backtrace model (with the new cpumask extension) instead. So we can call the nmi_backtrace code directly from the nmi handler, move the nmi_enter()/exit() into the top-level tile NMI handler. The semantics of the routine change slightly since it is now synchronous with the remote cores completing the backtraces. Previously it was asynchronous, but with protection to avoid starting a new remote backtrace if the old one was still in progress. Link: http://lkml.kernel.org/r/1472487169-14923-4-git-send-email-cmetcalf@mellanox.com Signed-off-by: Chris Metcalf <cmetcalf@mellanox.com> Cc: Daniel Thompson <daniel.thompson@linaro.org> [arm] Cc: Petr Mladek <pmladek@suse.com> Cc: Aaron Tomlin <atomlin@redhat.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Russell King <linux@arm.linux.org.uk> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
88 lines
3.1 KiB
C
88 lines
3.1 KiB
C
/*
|
|
* Copyright 2010 Tilera Corporation. All Rights Reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation, version 2.
|
|
*
|
|
* 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, GOOD TITLE or
|
|
* NON INFRINGEMENT. See the GNU General Public License for
|
|
* more details.
|
|
*/
|
|
|
|
#ifndef _ASM_TILE_IRQ_H
|
|
#define _ASM_TILE_IRQ_H
|
|
|
|
#include <linux/hardirq.h>
|
|
|
|
/* The hypervisor interface provides 32 IRQs. */
|
|
#define NR_IRQS 32
|
|
|
|
/* IRQ numbers used for linux IPIs. */
|
|
#define IRQ_RESCHEDULE 0
|
|
/* Interrupts for dynamic allocation start at 1. Let the core allocate irq0 */
|
|
#define NR_IRQS_LEGACY 1
|
|
|
|
#define irq_canonicalize(irq) (irq)
|
|
|
|
void ack_bad_irq(unsigned int irq);
|
|
|
|
/*
|
|
* Different ways of handling interrupts. Tile interrupts are always
|
|
* per-cpu; there is no global interrupt controller to implement
|
|
* enable/disable. Most onboard devices can send their interrupts to
|
|
* many tiles at the same time, and Tile-specific drivers know how to
|
|
* deal with this.
|
|
*
|
|
* However, generic devices (usually PCIE based, sometimes GPIO)
|
|
* expect that interrupts will fire on a single core at a time and
|
|
* that the irq can be enabled or disabled from any core at any time.
|
|
* We implement this by directing such interrupts to a single core.
|
|
*
|
|
* One added wrinkle is that PCI interrupts can be either
|
|
* hardware-cleared (legacy interrupts) or software cleared (MSI).
|
|
* Other generic device systems (GPIO) are always software-cleared.
|
|
*
|
|
* The enums below are used by drivers for onboard devices, including
|
|
* the internals of PCI root complex and GPIO. They allow the driver
|
|
* to tell the generic irq code what kind of interrupt is mapped to a
|
|
* particular IRQ number.
|
|
*/
|
|
enum {
|
|
/* per-cpu interrupt; use enable/disable_percpu_irq() to mask */
|
|
TILE_IRQ_PERCPU,
|
|
/* global interrupt, hardware responsible for clearing. */
|
|
TILE_IRQ_HW_CLEAR,
|
|
/* global interrupt, software responsible for clearing. */
|
|
TILE_IRQ_SW_CLEAR,
|
|
};
|
|
|
|
|
|
/*
|
|
* Paravirtualized drivers should call this when they dynamically
|
|
* allocate a new IRQ or discover an IRQ that was pre-allocated by the
|
|
* hypervisor for use with their particular device. This gives the
|
|
* IRQ subsystem an opportunity to do interrupt-type-specific
|
|
* initialization.
|
|
*
|
|
* ISSUE: We should modify this API so that registering anything
|
|
* except percpu interrupts also requires providing callback methods
|
|
* for enabling and disabling the interrupt. This would allow the
|
|
* generic IRQ code to proxy enable/disable_irq() calls back into the
|
|
* PCI subsystem, which in turn could enable or disable the interrupt
|
|
* at the PCI shim.
|
|
*/
|
|
void tile_irq_activate(unsigned int irq, int tile_irq_type);
|
|
|
|
void setup_irq_regs(void);
|
|
|
|
#ifdef __tilegx__
|
|
void arch_trigger_cpumask_backtrace(const struct cpumask *mask,
|
|
bool exclude_self);
|
|
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
|
|
#endif
|
|
|
|
#endif /* _ASM_TILE_IRQ_H */
|