Blame view

kernel/linux-rt-4.4.41/arch/tile/include/asm/irq.h 3.06 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  /*
   * 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_all_cpu_backtrace(bool self);
  #define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace
  #endif
  
  #endif /* _ASM_TILE_IRQ_H */