GIC: Add helpers to set interrupt configuration
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>
Fri, 22 Sep 2017 07:32:09 +0000 (08:32 +0100)
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>
Mon, 16 Oct 2017 15:50:02 +0000 (16:50 +0100)
The helpers perform read-modify-write on GIC*_ICFGR registers, but don't
serialise callers. Any serialisation must be taken care of by the
callers.

Change-Id: I71995f82ff2c7f70d37af0ede30d6ee18682fd3f
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
drivers/arm/gic/common/gic_common.c
drivers/arm/gic/common/gic_common_private.h
drivers/arm/gic/v3/gicv3_helpers.c
include/drivers/arm/gic_common.h

index 71155a9708c5dbffc3c699c556ea050a210820a3..d523772b1f4b852b5161524933caed6b38045e68 100644 (file)
@@ -299,3 +299,15 @@ void gicd_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri)
 {
        mmio_write_8(base + GICD_IPRIORITYR + id, pri & GIC_PRI_MASK);
 }
+
+void gicd_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg)
+{
+       unsigned bit_num = id & ((1 << ICFGR_SHIFT) - 1);
+       uint32_t reg_val = gicd_read_icfgr(base, id);
+
+       /* Clear the field, and insert required configuration */
+       reg_val &= ~(GIC_CFG_MASK << bit_num);
+       reg_val |= ((cfg & GIC_CFG_MASK) << bit_num);
+
+       gicd_write_icfgr(base, id, reg_val);
+}
index 8b96b37bb3d90a301e01c5ff843d5ee8cd095c31..2021f9aae9cfd58c5a6d9c98d4e2d2c3e7640447 100644 (file)
@@ -77,5 +77,6 @@ unsigned int gicd_get_isactiver(uintptr_t base, unsigned int id);
 void gicd_set_isactiver(uintptr_t base, unsigned int id);
 void gicd_set_icactiver(uintptr_t base, unsigned int id);
 void gicd_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri);
+void gicd_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg);
 
 #endif /* GIC_COMMON_PRIVATE_H_ */
index 3abc6a5ca7507349149583bf5aa2c54453d73d8d..33dbe2c8ea8a981255fa99e1bdbd5c5f892d12cd 100644 (file)
@@ -225,6 +225,38 @@ void gicr_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri)
        mmio_write_8(base + GICR_IPRIORITYR + id, pri & GIC_PRI_MASK);
 }
 
+/*
+ * Accessor to set the bit fields corresponding to interrupt ID
+ * in GIC Re-distributor ICFGR0.
+ */
+void gicr_set_icfgr0(uintptr_t base, unsigned int id, unsigned int cfg)
+{
+       unsigned bit_num = id & ((1 << ICFGR_SHIFT) - 1);
+       uint32_t reg_val = gicr_read_icfgr0(base);
+
+       /* Clear the field, and insert required configuration */
+       reg_val &= ~(GIC_CFG_MASK << bit_num);
+       reg_val |= ((cfg & GIC_CFG_MASK) << bit_num);
+
+       gicr_write_icfgr0(base, reg_val);
+}
+
+/*
+ * Accessor to set the bit fields corresponding to interrupt ID
+ * in GIC Re-distributor ICFGR1.
+ */
+void gicr_set_icfgr1(uintptr_t base, unsigned int id, unsigned int cfg)
+{
+       unsigned bit_num = id & ((1 << ICFGR_SHIFT) - 1);
+       uint32_t reg_val = gicr_read_icfgr1(base);
+
+       /* Clear the field, and insert required configuration */
+       reg_val &= ~(GIC_CFG_MASK << bit_num);
+       reg_val |= ((cfg & GIC_CFG_MASK) << bit_num);
+
+       gicr_write_icfgr1(base, reg_val);
+}
+
 /******************************************************************************
  * This function marks the core as awake in the re-distributor and
  * ensures that the interface is active.
index 14979cca4e60e0fb408129bf612ad377b22fd580..f7fc8ceb64cd02e4288279cfec440e53ef7869e9 100644 (file)
@@ -23,6 +23,9 @@
 /* Mask for the priority field common to all GIC interfaces */
 #define GIC_PRI_MASK                   0xff
 
+/* Mask for the configuration field common to all GIC interfaces */
+#define GIC_CFG_MASK                   0x3
+
 /* Constant to indicate a spurious interrupt in all GIC versions */
 #define GIC_SPURIOUS_INTERRUPT         1023