1/* 2 * Copyright 2021 Haiku, Inc. All rights reserved. 3 * Released under the terms of the MIT License. 4 * 5 * Copyright 2008, Dustin Howett, dustin.howett@gmail.com. All rights reserved. 6 * Distributed under the terms of the MIT License. 7 * 8 * Copyright 2001, Travis Geiselbrecht. All rights reserved. 9 * Distributed under the terms of the NewOS License. 10*/ 11 12 13#include "acpi.h" 14#include "mmu.h" 15 16 17#include <boot/stage2.h> 18#include <boot/arch/x86/arch_cpu.h> 19#include <boot/arch/x86/arch_hpet.h> 20#include <kernel/arch/x86/arch_hpet.h> 21 22#include <string.h> 23 24 25//#define TRACE_HPET 26#ifdef TRACE_HPET 27# define TRACE(x...) dprintf(x) 28#else 29# define TRACE(x...) ; 30#endif 31 32 33void 34hpet_init(void) 35{ 36 // Try to find the HPET ACPI table. 37 TRACE("hpet_init: Looking for HPET...\n"); 38 acpi_hpet *hpet = (acpi_hpet *)acpi_find_table(ACPI_HPET_SIGNATURE); 39 40 // Clear hpet kernel args to known invalid state; 41 gKernelArgs.arch_args.hpet_phys = 0; 42 gKernelArgs.arch_args.hpet = NULL; 43 44 if (hpet == NULL) { 45 // No HPET table in the RSDT. 46 // Since there are no other methods for finding it, 47 // assume we don't have one. 48 TRACE("hpet_init: HPET not found.\n"); 49 return; 50 } 51 52 TRACE("hpet_init: found HPET at 0x%" B_PRIx64 ".\n", 53 hpet->hpet_address.address); 54 gKernelArgs.arch_args.hpet_phys = hpet->hpet_address.address; 55 gKernelArgs.arch_args.hpet = (void *)mmu_map_physical_memory( 56 gKernelArgs.arch_args.hpet_phys, B_PAGE_SIZE, kDefaultPageFlags); 57} 58