From: Michalis Pappas Date: Tue, 19 Sep 2023 14:48:29 +0000 (+0200) Subject: plat/common: Adapt common code to the new uk_intctlr API X-Git-Tag: RELEASE-0.15.0~45 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ad628ee1756cd87052f1c03e0956685a5acf7527;p=unikraft%2Funikraft.git plat/common: Adapt common code to the new uk_intctlr API Notice: Picking individual commits in this PR will break the build. Signed-off-by: Michalis Pappas Reviewed-by: Marco Schlumpp Reviewed-by: Sergiu Moga Approved-by: Razvan Deaconescu GitHub-Closes: #1103 --- diff --git a/plat/Config.uk b/plat/Config.uk index ce6ee7903..764993a68 100644 --- a/plat/Config.uk +++ b/plat/Config.uk @@ -39,7 +39,7 @@ config UKPLAT_LCPU_MAXCOUNT config HAVE_SMP bool default y if UKPLAT_LCPU_MAXCOUNT > 1 - default n + select LIBUKINTCTLR_APIC if (ARCH_X86_64 && UKPLAT_LCPU_MAXCOUNT > 1) select UKPLAT_ACPI if ARCH_X86_64 menu "Multiprocessor Configuration" diff --git a/plat/common/arm/generic_timer.c b/plat/common/arm/generic_timer.c index d70748c59..716c3853e 100644 --- a/plat/common/arm/generic_timer.c +++ b/plat/common/arm/generic_timer.c @@ -33,12 +33,8 @@ #include #include #include -#include #include #include -#include -#include -#include #include static uint64_t boot_ticks; diff --git a/plat/common/arm/time.c b/plat/common/arm/time.c index 7f317b321..8d89036a0 100644 --- a/plat/common/arm/time.c +++ b/plat/common/arm/time.c @@ -35,14 +35,11 @@ #include #include #include -#include #include #include #include #include -#include -#include -#include +#include #include static const char * const arch_timer_list[] = { @@ -110,9 +107,8 @@ __nsec ukplat_time_get_ticks(void) /* must be called before interrupts are enabled */ void ukplat_time_init(void) { - int rc, irq, fdt_timer; - uint32_t irq_type, hwirq; - uint32_t trigger_type; + int rc, offs; + struct uk_intctlr_irq irq; dtb = (void *)ukplat_bootinfo_get()->dtb; @@ -123,27 +119,25 @@ void ukplat_time_init(void) generic_timer_update_boot_ticks(); /* Currently, we only support 1 timer per system */ - fdt_timer = fdt_node_offset_by_compatible_list(dtb, -1, - arch_timer_list); - if (fdt_timer < 0) - UK_CRASH("Could not find arch timer!\n"); + offs = fdt_node_offset_by_compatible_list(dtb, -1, arch_timer_list); + if (unlikely(offs < 0)) + UK_CRASH("Could not find arch timer (%d)\n", offs); - rc = generic_timer_init(fdt_timer); - if (rc < 0) - UK_CRASH("Failed to initialize platform time\n"); + rc = generic_timer_init(offs); + if (unlikely(rc < 0)) + UK_CRASH("Failed to initialize platform time (%d)\n", rc); - rc = gic_get_irq_from_dtb(dtb, fdt_timer, 2, &irq_type, &hwirq, - &trigger_type); - if (rc < 0) - UK_CRASH("Failed to find IRQ number from DTB\n"); + rc = uk_intctlr_irq_fdt_xlat(dtb, offs, 2, &irq); + if (unlikely(rc < 0)) + UK_CRASH("Could not get IRQ from dtb (%d)\n", rc); - irq = gic_irq_translate(irq_type, hwirq); + uk_intctlr_irq_configure(&irq); - rc = ukplat_irq_register(irq, generic_timer_irq_handler, NULL); - if (rc < 0) + rc = uk_intctlr_irq_register(irq.id, generic_timer_irq_handler, NULL); + if (unlikely(rc < 0)) UK_CRASH("Failed to register timer interrupt handler\n"); - else - timer_irq = irq; + + timer_irq = irq.id; /* * Mask IRQ before scheduler start working. Otherwise we will get diff --git a/plat/common/include/uk/plat/common/cpu.h b/plat/common/include/uk/plat/common/cpu.h index 5506c25b6..723fa843b 100644 --- a/plat/common/include/uk/plat/common/cpu.h +++ b/plat/common/include/uk/plat/common/cpu.h @@ -33,7 +33,8 @@ #ifndef __PLAT_CMN_CPU_H__ #define __PLAT_CMN_CPU_H__ -#include +#include + #if defined(__X86_64__) #include #elif defined(__ARM_32__) || defined(__ARM_64__) diff --git a/plat/common/lcpu.c b/plat/common/lcpu.c index 94ffcee64..e18b3bd0b 100644 --- a/plat/common/lcpu.c +++ b/plat/common/lcpu.c @@ -39,8 +39,10 @@ #include #include +#if CONFIG_HAVE_SMP +#include +#endif /* CONFIG_HAVE_SMP */ #include -#include #include #include #include @@ -329,14 +331,14 @@ int lcpu_mp_init(unsigned long run_irq, unsigned long wakeup_irq, void *arg) return rc; /* Register the lcpu_run and lcpu_wakeup interrupt handlers */ - rc = ukplat_irq_register(run_irq, lcpu_ipi_run_handler, NULL); + rc = uk_intctlr_irq_register(run_irq, lcpu_ipi_run_handler, NULL); if (unlikely(rc)) { uk_pr_crit("Could not register handler for IPI IRQ %ld\n", run_irq); return rc; } - rc = ukplat_irq_register(wakeup_irq, lcpu_ipi_wakeup_handler, NULL); + rc = uk_intctlr_irq_register(wakeup_irq, lcpu_ipi_wakeup_handler, NULL); if (unlikely(rc)) { uk_pr_crit("Could not register handler for wakeup IRQ %ld\n", wakeup_irq); diff --git a/plat/common/x86/lcpu.c b/plat/common/x86/lcpu.c index f988da7ef..002465a17 100644 --- a/plat/common/x86/lcpu.c +++ b/plat/common/x86/lcpu.c @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -51,6 +50,10 @@ #include #include +#if CONFIG_LIBUKINTCTLR_APIC +#include +#endif /* CONFIG_LIBUKINTCTLR_APIC */ + #include "start16_helpers.h" __lcpuid lcpu_arch_id(void) diff --git a/plat/drivers/rtc/pl031.c b/plat/drivers/rtc/pl031.c index feb419c45..805085df5 100644 --- a/plat/drivers/rtc/pl031.c +++ b/plat/drivers/rtc/pl031.c @@ -35,13 +35,11 @@ #include #include #include -#include -#include +#include #include #include #include #include -#include static __u64 pl031_base_addr; static int pl031_irq; @@ -155,41 +153,37 @@ void pl031_clear_intr(void) int pl031_register_alarm_handler(int (*handler)(void *)) { - return ukplat_irq_register(pl031_irq, handler, NULL); + return uk_intctlr_irq_register(pl031_irq, handler, NULL); } int pl031_init_rtc(void *dtb) { __u64 size; - __u32 irq_type, hwirq, trigger_type; - int fdt_rtc, rc; + int offs, rc; + struct uk_intctlr_irq irq; uk_pr_info("Probing RTC...\n"); - /* Search for RTC device by compatible property name. */ - fdt_rtc = fdt_node_offset_by_compatible(dtb, -1, PL031_COMPATIBLE); - if (unlikely(fdt_rtc < 0)) { - uk_pr_err("Could not find RTC device, fdt_rtc is %d\n", - fdt_rtc); + offs = fdt_node_offset_by_compatible(dtb, -1, PL031_COMPATIBLE); + if (unlikely(offs < 0)) { + uk_pr_err("Could not find RTC node (%d)\n", offs); return -EINVAL; } - rc = fdt_get_address(dtb, fdt_rtc, 0, &pl031_base_addr, &size); + rc = fdt_get_address(dtb, offs, 0, &pl031_base_addr, &size); if (unlikely(rc < 0)) { uk_pr_err("Could not get RTC address\n"); return -EINVAL; } uk_pr_info("Found RTC at: 0x%lx\n", pl031_base_addr); - rc = gic_get_irq_from_dtb(dtb, fdt_rtc, 0, &irq_type, &hwirq, - &trigger_type); - if (unlikely(rc < 0)) { - uk_pr_err("Failed to find RTC IRQ from DTB\n"); - return -EINVAL; - } + rc = uk_intctlr_irq_fdt_xlat(dtb, offs, 0, &irq); + if (unlikely(rc)) + return rc; + + uk_intctlr_irq_configure(&irq); - pl031_irq = gic_irq_translate(irq_type, hwirq); - uk_pr_info("RTC IRQ is: %d\n", pl031_irq); + pl031_irq = irq.id; if (pl031_get_status() == PL031_STATUS_DISABLED) pl031_enable();