linux/arch/arm64/include/asm/hardirq.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2012 ARM Ltd.
   4 */
   5#ifndef __ASM_HARDIRQ_H
   6#define __ASM_HARDIRQ_H
   7
   8#include <linux/cache.h>
   9#include <linux/percpu.h>
  10#include <linux/threads.h>
  11#include <asm/barrier.h>
  12#include <asm/irq.h>
  13#include <asm/kvm_arm.h>
  14#include <asm/sysreg.h>
  15
  16#define NR_IPI  7
  17
  18typedef struct {
  19        unsigned int __softirq_pending;
  20        unsigned int ipi_irqs[NR_IPI];
  21} ____cacheline_aligned irq_cpustat_t;
  22
  23#include <linux/irq_cpustat.h>  /* Standard mappings for irq_cpustat_t above */
  24
  25#define __inc_irq_stat(cpu, member)     __IRQ_STAT(cpu, member)++
  26#define __get_irq_stat(cpu, member)     __IRQ_STAT(cpu, member)
  27
  28u64 smp_irq_stat_cpu(unsigned int cpu);
  29#define arch_irq_stat_cpu       smp_irq_stat_cpu
  30
  31#define __ARCH_IRQ_EXIT_IRQS_DISABLED   1
  32
  33struct nmi_ctx {
  34        u64 hcr;
  35};
  36
  37DECLARE_PER_CPU(struct nmi_ctx, nmi_contexts);
  38
  39#define arch_nmi_enter()                                                        \
  40        do {                                                                    \
  41                if (is_kernel_in_hyp_mode()) {                                  \
  42                        struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts);  \
  43                        nmi_ctx->hcr = read_sysreg(hcr_el2);                    \
  44                        if (!(nmi_ctx->hcr & HCR_TGE)) {                        \
  45                                write_sysreg(nmi_ctx->hcr | HCR_TGE, hcr_el2);  \
  46                                isb();                                          \
  47                        }                                                       \
  48                }                                                               \
  49        } while (0)
  50
  51#define arch_nmi_exit()                                                         \
  52        do {                                                                    \
  53                if (is_kernel_in_hyp_mode()) {                                  \
  54                        struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts);  \
  55                        if (!(nmi_ctx->hcr & HCR_TGE))                          \
  56                                write_sysreg(nmi_ctx->hcr, hcr_el2);            \
  57                }                                                               \
  58        } while (0)
  59
  60static inline void ack_bad_irq(unsigned int irq)
  61{
  62        extern unsigned long irq_err_count;
  63        irq_err_count++;
  64}
  65
  66#endif /* __ASM_HARDIRQ_H */
  67