~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/loongarch/include/asm/irq.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*
  3  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4  */
  5 #ifndef _ASM_IRQ_H
  6 #define _ASM_IRQ_H
  7 
  8 #include <linux/irqdomain.h>
  9 #include <linux/irqreturn.h>
 10 
 11 #define IRQ_STACK_SIZE                  THREAD_SIZE
 12 #define IRQ_STACK_START                 (IRQ_STACK_SIZE - 16)
 13 
 14 DECLARE_PER_CPU(unsigned long, irq_stack);
 15 
 16 /*
 17  * The highest address on the IRQ stack contains a dummy frame which is
 18  * structured as follows:
 19  *
 20  *   top ------------
 21  *       | task sp  | <- irq_stack[cpu] + IRQ_STACK_START
 22  *       ------------
 23  *       |          | <- First frame of IRQ context
 24  *       ------------
 25  *
 26  * task sp holds a copy of the task stack pointer where the struct pt_regs
 27  * from exception entry can be found.
 28  */
 29 
 30 static inline bool on_irq_stack(int cpu, unsigned long sp)
 31 {
 32         unsigned long low = per_cpu(irq_stack, cpu);
 33         unsigned long high = low + IRQ_STACK_SIZE;
 34 
 35         return (low <= sp && sp <= high);
 36 }
 37 
 38 void spurious_interrupt(void);
 39 
 40 #define NR_IRQS_LEGACY 16
 41 
 42 #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
 43 void arch_trigger_cpumask_backtrace(const struct cpumask *mask, int exclude_cpu);
 44 
 45 #define MAX_IO_PICS 2
 46 #define NR_IRQS (64 + (256 * MAX_IO_PICS))
 47 
 48 struct acpi_vector_group {
 49         int node;
 50         int pci_segment;
 51         struct irq_domain *parent;
 52 };
 53 extern struct acpi_vector_group pch_group[MAX_IO_PICS];
 54 extern struct acpi_vector_group msi_group[MAX_IO_PICS];
 55 
 56 #define CORES_PER_EIO_NODE      4
 57 
 58 #define LOONGSON_CPU_UART0_VEC          10 /* CPU UART0 */
 59 #define LOONGSON_CPU_THSENS_VEC         14 /* CPU Thsens */
 60 #define LOONGSON_CPU_HT0_VEC            16 /* CPU HT0 irq vector base number */
 61 #define LOONGSON_CPU_HT1_VEC            24 /* CPU HT1 irq vector base number */
 62 
 63 /* IRQ number definitions */
 64 #define LOONGSON_LPC_IRQ_BASE           0
 65 #define LOONGSON_LPC_LAST_IRQ           (LOONGSON_LPC_IRQ_BASE + 15)
 66 
 67 #define LOONGSON_CPU_IRQ_BASE           16
 68 #define LOONGSON_CPU_LAST_IRQ           (LOONGSON_CPU_IRQ_BASE + 14)
 69 
 70 #define LOONGSON_PCH_IRQ_BASE           64
 71 #define LOONGSON_PCH_ACPI_IRQ           (LOONGSON_PCH_IRQ_BASE + 47)
 72 #define LOONGSON_PCH_LAST_IRQ           (LOONGSON_PCH_IRQ_BASE + 64 - 1)
 73 
 74 #define LOONGSON_MSI_IRQ_BASE           (LOONGSON_PCH_IRQ_BASE + 64)
 75 #define LOONGSON_MSI_LAST_IRQ           (LOONGSON_PCH_IRQ_BASE + 256 - 1)
 76 
 77 #define GSI_MIN_LPC_IRQ         LOONGSON_LPC_IRQ_BASE
 78 #define GSI_MAX_LPC_IRQ         (LOONGSON_LPC_IRQ_BASE + 16 - 1)
 79 #define GSI_MIN_CPU_IRQ         LOONGSON_CPU_IRQ_BASE
 80 #define GSI_MAX_CPU_IRQ         (LOONGSON_CPU_IRQ_BASE + 48 - 1)
 81 #define GSI_MIN_PCH_IRQ         LOONGSON_PCH_IRQ_BASE
 82 #define GSI_MAX_PCH_IRQ         (LOONGSON_PCH_IRQ_BASE + 256 - 1)
 83 
 84 struct acpi_madt_lio_pic;
 85 struct acpi_madt_eio_pic;
 86 struct acpi_madt_ht_pic;
 87 struct acpi_madt_bio_pic;
 88 struct acpi_madt_msi_pic;
 89 struct acpi_madt_lpc_pic;
 90 
 91 int liointc_acpi_init(struct irq_domain *parent,
 92                                         struct acpi_madt_lio_pic *acpi_liointc);
 93 int eiointc_acpi_init(struct irq_domain *parent,
 94                                         struct acpi_madt_eio_pic *acpi_eiointc);
 95 
 96 int htvec_acpi_init(struct irq_domain *parent,
 97                                         struct acpi_madt_ht_pic *acpi_htvec);
 98 int pch_lpc_acpi_init(struct irq_domain *parent,
 99                                         struct acpi_madt_lpc_pic *acpi_pchlpc);
100 int pch_msi_acpi_init(struct irq_domain *parent,
101                                         struct acpi_madt_msi_pic *acpi_pchmsi);
102 int pch_pic_acpi_init(struct irq_domain *parent,
103                                         struct acpi_madt_bio_pic *acpi_pchpic);
104 int find_pch_pic(u32 gsi);
105 struct fwnode_handle *get_pch_msi_handle(int pci_segment);
106 
107 extern struct acpi_madt_lio_pic *acpi_liointc;
108 extern struct acpi_madt_eio_pic *acpi_eiointc[MAX_IO_PICS];
109 
110 extern struct acpi_madt_ht_pic *acpi_htintc;
111 extern struct acpi_madt_lpc_pic *acpi_pchlpc;
112 extern struct acpi_madt_msi_pic *acpi_pchmsi[MAX_IO_PICS];
113 extern struct acpi_madt_bio_pic *acpi_pchpic[MAX_IO_PICS];
114 
115 extern struct fwnode_handle *cpuintc_handle;
116 extern struct fwnode_handle *liointc_handle;
117 extern struct fwnode_handle *pch_lpc_handle;
118 extern struct fwnode_handle *pch_pic_handle[MAX_IO_PICS];
119 
120 static inline int get_percpu_irq(int vector)
121 {
122         struct irq_domain *d;
123 
124         d = irq_find_matching_fwnode(cpuintc_handle, DOMAIN_BUS_ANY);
125         if (d)
126                 return irq_create_mapping(d, vector);
127 
128         return -EINVAL;
129 }
130 
131 #include <asm-generic/irq.h>
132 
133 #endif /* _ASM_IRQ_H */
134 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php