From f6f028e9b674684423f346bbc26a5cdccd979478 Mon Sep 17 00:00:00 2001 From: Oleksii Moisieiev Date: Fri, 19 Jan 2024 10:21:27 +0200 Subject: [PATCH] plat/xen: Introduce an implementation of uk_intctlr_plat_probe uk_intctlr_plat_probe is platform specific initialization for GIC drivers. It maps destributor/redistributor address to the page table so system can access registers and returns mapped addresses to GIC driver. Signed-off-by: Oleksii Moisieiev Reviewed-by: Michalis Pappas Reviewed-by: Andrei Stan Approved-by: Michalis Pappas GitHub-Closes: #726 --- plat/xen/arm/setup64.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/plat/xen/arm/setup64.c b/plat/xen/arm/setup64.c index 9aeaf743b2..3134484504 100644 --- a/plat/xen/arm/setup64.c +++ b/plat/xen/arm/setup64.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -204,6 +205,28 @@ static inline void _get_cmdline(struct ukplat_bootinfo *bi) bi->cmdline_len = cmdline_len; } +int uk_intctlr_plat_probe(void *in, void *out) +{ + struct uk_intctlr_plat_data *dout = (struct uk_intctlr_plat_data *)out; + struct uk_intctlr_plat_data *din = (struct uk_intctlr_plat_data *)in; + + if (!in || !out) + return -EINVAL; + +#if defined(__arm__) + dout->dist_addr = to_virt((long)fdt64_ld(din->dist_addr)); + dout->rdist_addr = to_virt((long)fdt64_ld(din->rdist_addr)); +#else + set_pgt_entry(&fixmap_pgtable[l2_pgt_idx(FIX_GIC_START)], + ((din->dist_addr & L2_MASK) | BLOCK_DEV_ATTR | L2_BLOCK)); + dout->dist_addr = (FIX_GIC_START + (din->dist_addr & L2_OFFSET)); + dout->rdist_addr = (FIX_GIC_START + (din->rdist_addr & L2_OFFSET)); +#endif + /* Setting memory barrier to get access to mapped pages */ + wmb(); + return 0; +} + static int _init_mem(struct ukplat_bootinfo *const bi, paddr_t physical_offset) { int rc;