summaryrefslogtreecommitdiffstats
path: root/bsps/arm/include/bsp/arm-gic.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bsps/arm/include/bsp/arm-gic.h37
1 files changed, 36 insertions, 1 deletions
diff --git a/bsps/arm/include/bsp/arm-gic.h b/bsps/arm/include/bsp/arm-gic.h
index ab5840919a..2abbea52cb 100644
--- a/bsps/arm/include/bsp/arm-gic.h
+++ b/bsps/arm/include/bsp/arm-gic.h
@@ -7,7 +7,7 @@
*/
/*
- * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013, 2019 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -101,6 +101,41 @@ static inline bool gic_id_is_active(volatile gic_dist *dist, uint32_t id)
return (dist->icdabr[i] & bit) != 0;
}
+typedef enum {
+ GIC_GROUP_0,
+ GIC_GROUP_1
+} gic_group;
+
+static inline gic_group gic_id_get_group(
+ volatile gic_dist *dist,
+ uint32_t id
+)
+{
+ uint32_t i = GIC_ID_TO_ONE_BIT_REG_INDEX(id);
+ uint32_t bit = GIC_ID_TO_ONE_BIT_REG_BIT(id);
+
+ return (dist->icdigr[i] & bit) != 0 ? GIC_GROUP_1 : GIC_GROUP_0;
+}
+
+static inline void gic_id_set_group(
+ volatile gic_dist *dist,
+ uint32_t id,
+ gic_group group
+)
+{
+ uint32_t i = GIC_ID_TO_ONE_BIT_REG_INDEX(id);
+ uint32_t bit = GIC_ID_TO_ONE_BIT_REG_BIT(id);
+ uint32_t icdigr = dist->icdigr[i];
+
+ icdigr &= ~bit;
+
+ if (group == GIC_GROUP_1) {
+ icdigr |= bit;
+ }
+
+ dist->icdigr[i] = icdigr;
+}
+
static inline void gic_id_set_priority(
volatile gic_dist *dist,
uint32_t id,