From 20ef12080950c328702f590b53c50e328a03b971 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Thu, 2 Oct 2008 18:49:42 -0400 Subject: [PATCH] Add ich2-timer. --- aseg/Makefile | 5 ++++- ich2/ich2-timer.c | 39 +++++++++++++++++++++++++++++++++++++++ include/reg-82801b.h | 3 +++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 ich2/ich2-timer.c diff --git a/aseg/Makefile b/aseg/Makefile index 8283648..3015bd7 100644 --- a/aseg/Makefile +++ b/aseg/Makefile @@ -1,6 +1,9 @@ CC=gcc CFLAGS=-I../include -I../include/raw -nostdlib -nostdinc -fno-builtin -D__RAW__ -Wall -Werror -pedantic -ansi -std=gnu99 -OBJS=counter.o firstrun.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o ../ich2/smram-ich2.o ../ich2/smi.o vga-overlay.o packet.o ../lib/sprintf.o ../lib/doprnt.o ../pci/pci.o 3c905.o + +OBJS=counter.o firstrun.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o \ + ../ich2/smram-ich2.o ../ich2/smi.o vga-overlay.o packet.o ../lib/sprintf.o \ + ../lib/doprnt.o ../pci/pci.o 3c905.o ../ich2/ich2-timer.o all: aseg.elf diff --git a/ich2/ich2-timer.c b/ich2/ich2-timer.c new file mode 100644 index 0000000..b98e381 --- /dev/null +++ b/ich2/ich2-timer.c @@ -0,0 +1,39 @@ +#include +#include +#include + +static uint16_t _get_PMBASE() +{ + static long pmbase = -1; + + if (pmbase == -1) /* Memoize it so that we don't have to hit PCI so often. */ + pmbase = pci_read32(ICH2_LPC_BUS, ICH2_LPC_DEV, ICH2_LPC_FN, ICH2_LPC_PCI_PMBASE) & ICH2_PMBASE_MASK; + + return pmbase; +} + +static unsigned long _curtmr() +{ + return inl(_get_PMBASE + ICH2_PMBASE_PM1_TMR) & 0xFFFFFF; +} + +/* This is kind of a heuristic, since we can't get interrupts. */ +static unsigned long starttmr = 0, endtmr = 0; + +void oneshot_start_ms(unsigned long milliseconds) +{ + starttmr = _curtmr(); + endtmr = (starttmr + milliseconds*(ICH2_PM1_TMR_FREQ/1000)) % 0xFFFFFF; +} + +int oneshot_running(void) +{ + if (endtmr == 0 && starttmr == 0) + return 0; + if ((endtmr < starttmr) && ((_curtmr() > starttmr) || (_curtmr() < endtmr))) + return 1; + else if ((_curtmr() < endtmr) && (_curtmr() > starttmr)) + return 1; + endtmr = starttmr = 0; + return 0; +} diff --git a/include/reg-82801b.h b/include/reg-82801b.h index a60c458..4e116c2 100644 --- a/include/reg-82801b.h +++ b/include/reg-82801b.h @@ -44,6 +44,9 @@ #define ICH2_PM1_EN_GBL_EN (1 << 5) #define ICH2_PM1_EN_TMROF_EN (1 << 0 +#define ICH2_PMBASE_PM1_TMR 0x08 +#define ICH2_PM1_TMR_FREQ 3579545 /* This will be the encryption key for a question on the test. */ + #define ICH2_PMBASE_SMI_EN 0x30 #define ICH2_SMI_EN_PERIODIC_EN (1 << 14) #define ICH2_SMI_EN_TCO_EN (1 << 13) -- 2.39.2