#include <lunaix/types.h>
+#include <lunaix/mm/mmio.h>
#include <asm/soc/gic.h>
#include <klibc/string.h>
}
static void
-__setup_pe_rdist(struct arm_gic* gic, struct dt_prop_iter* prop)
+__setup_pe_rdist(struct arm_gic* gic, struct dt_prop_iter* prop, int cpu)
{
ptr_t base;
- size_t len, off;
- int i;
+ size_t len;
base = dtprop_reg_nextaddr(prop);
len = dtprop_reg_nextlen(prop);
- assert(len >= NR_CPU * FRAME_SIZE * 2);
-
- i = 0;
- base = ioremap(base, len);
- off = base;
-
- for (; i < NR_CPU; i++) {
- gic->pes[i]._rd = (struct gic_rd*) (base + off);
- off += sizeof(struct gic_rd);
- }
+ gic->pes[cpu]._rd = (struct gic_rd*)ioremap(base, len);
}
static void
struct dt_node* its_node;
struct dt_node_iter iter;
struct dt_prop_iter prop;
+ struct gic_its* its;
ptr_t its_base;
size_t its_size;
dt_begin_find(&iter, gic_node, __its_predicate, NULL);
- if (!dt_find_next(&iter, (struct dt_node_base**)&its_node)) {
- return;
- }
-
- dt_end_find(&iter);
-
- dt_decode_reg(&prop, its_node, reg);
-
- its_base = dtprop_reg_nextaddr(&prop);
- its_size = dtprop_reg_nextlen(&prop);
+ while (dt_find_next(&iter, (struct dt_node_base**)&its_node))
+ {
+ dt_decode_reg(&prop, its_node, reg);
- assert(its_size >= sizeof(struct gic_its));
+ its_base = dtprop_reg_nextaddr(&prop);
+ its_size = dtprop_reg_nextlen(&prop);
- gic->mmrs.its = (struct gic_its*)ioremap(its_base, its_size);
+ its = gic_its_create(gic, ioremap(its_base, its_size));
+ dt_bind_object(&its_node->base, its);
+ }
+
+ dt_end_find(&iter);
}
void
sz = dtprop_reg_nextlen(&prop);
gic->mmrs.dist_base = (gicreg_t*)ioremap(ptr, sz);
- __setup_pe_rdist(gic, &prop);
-
- // ignore cpu_if, as we use sysreg to access them
- dtprop_next_n(&prop, 2);
+ for (int i = 0; i < NR_CPU; i++) {
+ __setup_pe_rdist(gic, &prop, i);
+ }
+ // ignore cpu_if, as we use sysreg to access them
// ignore vcpu_if, as we dont do any EL2 stuff
__create_its(gic, gic_node);
gic_dtprop_interpret(struct gic_int_param* param,
struct dt_prop_val* val, int width)
{
- struct dt_prop_iter* iter;
+ struct dt_prop_iter iter;
unsigned int v;
- dt_decode(&iter, NULL, val, 1);
+ dt_decode_simple(&iter, val);
v = dtprop_u32_at(&iter, 0);
switch (v)