LF OS
Hobby operating system for amd64 with high ambitions
Loading...
Searching...
No Matches
hpet.c
Go to the documentation of this file.
1#include <log.h>
2#include <hpet.h>
3#include <string.h>
4#include <vm.h>
5
6struct hpet_mmio {
7 struct {
16
18 }__attribute__((packed)) capabilities;
20 uint64_t _padding1;
22 struct {
23 uint64_t enable_cnf : 1;
24 uint64_t leg_rt_cnf : 1;
26 }__attribute__((packed)) configuration;
27
28 uint64_t _padding2;
29
30 struct {
31 uint64_t t0_int_sts : 1;
32 uint64_t t1_int_sts : 1;
33 uint64_t t2_int_sts : 1;
35 }__attribute__((packed)) interrupt_status;
36
37 uint64_t _padding3[25];
38
39 uint64_t main_counter_register;
40
41 uint64_t _padding4;
42
43 struct {
44 struct {
46 uint64_t tn_int_type_cnf : 1;
47 uint64_t tn_int_enb_cnf : 1;
48 uint64_t tn_type_cnf : 1;
49 uint64_t tn_per_int_cnf : 1;
50 uint64_t tn_size_cap : 1;
51 uint64_t tn_val_set_cnf : 1;
53 uint64_t tn_32mode_cnf : 1;
54 uint64_t tn_int_route_cnf : 5;
55 uint64_t tn_fsb_en_cnf : 1;
56 uint64_t tn_fsb_int_del_cap : 1;
57
59
60 uint64_t tn_int_route_cap : 32;
61 }__attribute__((packed)) config_and_caps;
62
63 union {
64 struct {
65 uint64_t val32 : 32;
67 }__attribute__((packed));
68
69 uint64_t val64;
70 }__attribute__((packed)) comparator_value;
71
72 struct {
73 uint64_t tn_fsb_int_val : 32;
74 uint64_t tn_fsb_int_addr : 32;
75 }__attribute__((packed)) fsb_interrupt_route;
76
78 }__attribute__((packed)) timers[32];
79}__attribute__((packed));
80
98
99static struct hpet_mmio* hpet;
100
103
105 struct hpet_acpi_table* table = (struct hpet_acpi_table*)header;
106
107 uint64_t rev = table->hardware_revision;
108 uint64_t num_comp = table->num_comparators;
109 uint64_t pci_vendor = table->pci_vendor_id;
110
112 loge("hpet", "HPET not in system memory address space is not yet implemented");
113 return;
114 }
115
118
119 uint64_t period = hpet->capabilities.counter_clk_period;
120
121 if(period < 1000000) {
122 loge("hpet", "hpet timer periods below 1ns are not yet implemented");
123 return;
124 }
125
126 ticks_to_ns_multiplier = period / 1000000;
127
128 logd("hpet", "configuring HPET at %d:%x (%x): vendor %x, rev %d, #comparators %d, ns multiplier %d",
130 pci_vendor, rev, num_comp, ticks_to_ns_multiplier
131 );
132
133 hpet->configuration.enable_cnf = 1;
134
135 initialization_ticks = hpet->main_counter_register;
136
137 logd("hpet", "initialization_ticks = %u", initialization_ticks);
138 logi("hpet", "HPET initialized, we now know the time");
139}
140
141void sc_handle_clock_read(uint64_t* nanoseconds) {
142 uint64_t ticks = hpet->main_counter_register -
144 *nanoseconds = ticks * ticks_to_ns_multiplier;
145}
static const uint8_t acpi_address_space_memory
Definition acpi.h:19
uint64_t address
Definition acpi.h:27
uint8_t address_space
Definition acpi.h:23
unsigned short uint16_t
Definition arch.h:8
uint64_t ptr_t
Definition arch.h:17
unsigned long uint64_t
Definition arch.h:14
unsigned char uint8_t
Definition arch.h:5
static uint16_t ticks_to_ns_multiplier
Definition hpet.c:102
uint64_t leg_route_cap
Definition hpet.c:24
uint8_t num_comparators
Definition hpet.c:85
uint16_t pci_vendor_id
Definition hpet.c:89
void init_hpet(struct acpi_table_header *header)
Definition hpet.c:104
struct acpi_table_header header
Definition hpet.c:82
uint64_t counter_clk_period
Definition hpet.c:28
uint8_t page_protection
Definition hpet.c:95
uint64_t vendor_id
Definition hpet.c:26
static struct hpet_mmio * hpet
Definition hpet.c:99
uint8_t hardware_revision
Definition hpet.c:84
uint8_t hpet_number
Definition hpet.c:92
uint64_t count_size_cap
Definition hpet.c:22
struct acpi_address base_address
Definition hpet.c:91
void sc_handle_clock_read(uint64_t *nanoseconds)
Definition hpet.c:141
uint64_t num_tim_cap
Definition hpet.c:21
uint64_t rev_id
Definition hpet.c:19
uint8_t count_size_cap
Definition hpet.c:86
static uint64_t initialization_ticks
Definition hpet.c:101
uint8_t _reserved
Definition hpet.c:87
uint8_t legacy_replacement_irq_cap
Definition hpet.c:88
uint64_t _reserved
Definition hpet.c:23
uint16_t main_counter_minimum_clock_tick
Definition hpet.c:93
struct acpi_table_header header
Definition hpet.c:0
uint8_t oem
Definition hpet.c:96
#define ALLOCATOR_REGION_SLAB_4K
Definition vm.h:24
#define logd(component, fmt,...)
Definition log.h:28
#define logi(component, fmt,...)
Definition log.h:36
#define loge(component, fmt,...)
Definition log.h:52
uint16_t _reserved3
Definition sc.c:17
uint64_t _reserved2
Definition sc.c:16
uint64_t _reserved1
Definition sc.c:6
void vm_context_map(struct vm_table *pml4, ptr_t virtual, ptr_t physical, uint8_t pat)
Definition vm.c:406
ptr_t vm_context_find_free(struct vm_table *context, region_t region, size_t num)
Definition vm.c:531
struct vm_table * VM_KERNEL_CONTEXT
Definition vm.c:16