irq-gic-common.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2002 ARM Limited, All Rights Reserved.
  4. */
  5. #include <linux/interrupt.h>
  6. #include <linux/io.h>
  7. #include <linux/irq.h>
  8. #include <linux/irqchip/arm-gic.h>
  9. #include <linux/kernel.h>
  10. #include "irq-gic-common.h"
  11. static DEFINE_RAW_SPINLOCK(irq_controller_lock);
  12. void gic_enable_of_quirks(const struct device_node *np,
  13. const struct gic_quirk *quirks, void *data)
  14. {
  15. for (; quirks->desc; quirks++) {
  16. if (!quirks->compatible && !quirks->property)
  17. continue;
  18. if (quirks->compatible &&
  19. !of_device_is_compatible(np, quirks->compatible))
  20. continue;
  21. if (quirks->property &&
  22. !of_property_read_bool(np, quirks->property))
  23. continue;
  24. if (quirks->init(data))
  25. pr_info("GIC: enabling workaround for %s\n",
  26. quirks->desc);
  27. }
  28. }
  29. void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
  30. void *data)
  31. {
  32. for (; quirks->desc; quirks++) {
  33. if (quirks->compatible || quirks->property)
  34. continue;
  35. if (quirks->iidr != (quirks->mask & iidr))
  36. continue;
  37. if (quirks->init(data))
  38. pr_info("GIC: enabling workaround for %s\n",
  39. quirks->desc);
  40. }
  41. }
  42. int gic_configure_irq(unsigned int irq, unsigned int type,
  43. void __iomem *base)
  44. {
  45. u32 confmask = 0x2 << ((irq % 16) * 2);
  46. u32 confoff = (irq / 16) * 4;
  47. u32 val, oldval;
  48. int ret = 0;
  49. unsigned long flags;
  50. /*
  51. * Read current configuration register, and insert the config
  52. * for "irq", depending on "type".
  53. */
  54. raw_spin_lock_irqsave(&irq_controller_lock, flags);
  55. val = oldval = readl_relaxed(base + confoff);
  56. if (type & IRQ_TYPE_LEVEL_MASK)
  57. val &= ~confmask;
  58. else if (type & IRQ_TYPE_EDGE_BOTH)
  59. val |= confmask;
  60. /* If the current configuration is the same, then we are done */
  61. if (val == oldval) {
  62. raw_spin_unlock_irqrestore(&irq_controller_lock, flags);
  63. return 0;
  64. }
  65. /*
  66. * Write back the new configuration, and possibly re-enable
  67. * the interrupt. If we fail to write a new configuration for
  68. * an SPI then WARN and return an error. If we fail to write the
  69. * configuration for a PPI this is most likely because the GIC
  70. * does not allow us to set the configuration or we are in a
  71. * non-secure mode, and hence it may not be catastrophic.
  72. */
  73. writel_relaxed(val, base + confoff);
  74. if (readl_relaxed(base + confoff) != val)
  75. ret = -EINVAL;
  76. raw_spin_unlock_irqrestore(&irq_controller_lock, flags);
  77. return ret;
  78. }
  79. void gic_dist_config(void __iomem *base, int gic_irqs, u8 priority)
  80. {
  81. unsigned int i;
  82. /*
  83. * Set all global interrupts to be level triggered, active low.
  84. */
  85. for (i = 32; i < gic_irqs; i += 16)
  86. writel_relaxed(GICD_INT_ACTLOW_LVLTRIG,
  87. base + GIC_DIST_CONFIG + i / 4);
  88. /*
  89. * Set priority on all global interrupts.
  90. */
  91. for (i = 32; i < gic_irqs; i += 4)
  92. writel_relaxed(REPEAT_BYTE_U32(priority),
  93. base + GIC_DIST_PRI + i);
  94. /*
  95. * Deactivate and disable all SPIs. Leave the PPI and SGIs
  96. * alone as they are in the redistributor registers on GICv3.
  97. */
  98. for (i = 32; i < gic_irqs; i += 32) {
  99. writel_relaxed(GICD_INT_EN_CLR_X32,
  100. base + GIC_DIST_ACTIVE_CLEAR + i / 8);
  101. writel_relaxed(GICD_INT_EN_CLR_X32,
  102. base + GIC_DIST_ENABLE_CLEAR + i / 8);
  103. }
  104. }
  105. void gic_cpu_config(void __iomem *base, int nr, u8 priority)
  106. {
  107. int i;
  108. /*
  109. * Deal with the banked PPI and SGI interrupts - disable all
  110. * private interrupts. Make sure everything is deactivated.
  111. */
  112. for (i = 0; i < nr; i += 32) {
  113. writel_relaxed(GICD_INT_EN_CLR_X32,
  114. base + GIC_DIST_ACTIVE_CLEAR + i / 8);
  115. writel_relaxed(GICD_INT_EN_CLR_X32,
  116. base + GIC_DIST_ENABLE_CLEAR + i / 8);
  117. }
  118. /*
  119. * Set priority on PPI and SGI interrupts
  120. */
  121. for (i = 0; i < nr; i += 4)
  122. writel_relaxed(REPEAT_BYTE_U32(priority),
  123. base + GIC_DIST_PRI + i * 4 / 4);
  124. }