* mmap over HPET - 32 bit wrap arround
[not found] ` <83CA05F64804AF43B8F733C4ABDFAA5101384FA4@mail1.bitband.com>
@ 2008-05-28 22:19 ` Raz
2008-05-28 23:57 ` Lee Revell
0 siblings, 1 reply; 3+ messages in thread
From: Raz @ 2008-05-28 22:19 UTC (permalink / raw)
To: Linux Kernel
I am wondering wether someone can explain how hpet behaves. The bellow
is a short program that reads from a mmaped /dev/hpet the time. I am
running it and it looks that afer ~296 seconds the counter resets . I
AM RUNNING 64bi KERNEL(2.6.18-8.el5) and reading a 64BIT VARIABLE.
my hpet is 14MHZ, so I am guessing a 32bit wraparound ( ~296 * 14Mhz
) = MAX_INT . but why ?
thank you
raz
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>ing 6
#include <sys/mman.h>
#include <stdio.h>
struct hpet {
uint64_t hpet_cap; /* capabilities */
uint64_t res0; /* reserved */
uint64_t hpet_config; /* configuration */
uint64_t res1; /* reserved */
uint64_t hpet_isr; /* interrupt status reg */
uint64_t res2[25]; /* reserved */
union { /* main counter */
uint64_t _hpet_mc64;
uint32_t _hpet_mc32;
unsigned long _hpet_mc;
} _u0;
uint64_t res3; /* reserved */
struct hpet_timer {
uint64_t hpet_config; /* configuration/cap */
union { /* timer compare register */
uint64_t _hpet_hc64;
uint32_t _hpet_hc32;
unsigned long _hpet_compare;
} _u1;
uint64_t hpet_fsb[2]; /* FSB route */
} hpet_timers[1];
};
struct hpet* timer;
int hpet_fd;
uint64_t resHZ;
uint64_t divisor;
#define NSEC_PER_SEC 1000000000LL
#define USEC_PER_SEC 1000000LL
int hpet_init()
{
hpet_fd = open("/dev/hpet", O_RDONLY);
if (hpet_fd < 0) {
puts("This system has no accessible HPET device");
return -1;
}
timer = ( struct hpet* )mmap(NULL, 1024 ,PROT_READ,
MAP_SHARED, hpet_fd, 0);
if ((long)timer == (-1) ) {
puts("This system has no mappable HPET device");
close(hpet_fd);
return -1;
}
return 0;
}
void discover_hpet_resulotion(void)
{
uint64_t d1,d2;
d1 = timer->_u0._hpet_mc64;
sleep(1);
d2 = timer->_u0._hpet_mc64;
resHZ = d2 - d1;
printf("HPET clock resolution %lldHZ\n",
resHZ);
}
void calibrate_hpet(void)
{
divisor = NSEC_PER_SEC / resHZ;
printf("divisor=%lld ns/hpet\n", divisor);
}
uint64_t __get_cur_ns(void)
{
return (timer->_u0._hpet_mc64*divisor);
}
uint64_t __get_cur_us(void)
{
return __get_cur_ns()/1000;
}
int main()
{
uint64_t d1,d2;
if ( hpet_init() < 0 ){
return (0);
}
discover_hpet_resulotion();
calibrate_hpet();
while(1){
d1 = __get_cur_us();
sleep(1);
d2 = __get_cur_us();
printf("cur %lldus delta=%lldus\n",
d2,d2-d1);
}
}
--
Raz
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: mmap over HPET - 32 bit wrap arround
2008-05-28 22:19 ` mmap over HPET - 32 bit wrap arround Raz
@ 2008-05-28 23:57 ` Lee Revell
2008-05-31 18:20 ` Raz
0 siblings, 1 reply; 3+ messages in thread
From: Lee Revell @ 2008-05-28 23:57 UTC (permalink / raw)
To: Raz; +Cc: Linux Kernel
On Wed, May 28, 2008 at 6:19 PM, Raz <raziebe@gmail.com> wrote:
> I am wondering wether someone can explain how hpet behaves. The bellow
> is a short program that reads from a mmaped /dev/hpet the time. I am
> running it and it looks that afer ~296 seconds the counter resets . I
> AM RUNNING 64bi KERNEL(2.6.18-8.el5) and reading a 64BIT VARIABLE.
> my hpet is 14MHZ, so I am guessing a 32bit wraparound ( ~296 * 14Mhz
> ) = MAX_INT . but why ?
>
HPET counter can be either 32 or 64 bit. Check COUNT_SIZE_CAP.
http://www.intel.com/hardwaredesign/hpetspec_1.pdf
Lee
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: mmap over HPET - 32 bit wrap arround
2008-05-28 23:57 ` Lee Revell
@ 2008-05-31 18:20 ` Raz
0 siblings, 0 replies; 3+ messages in thread
From: Raz @ 2008-05-31 18:20 UTC (permalink / raw)
To: Lee Revell; +Cc: Linux Kernel
On Thu, May 29, 2008 at 2:57 AM, Lee Revell <rlrevell@joe-job.com> wrote:
> On Wed, May 28, 2008 at 6:19 PM, Raz <raziebe@gmail.com> wrote:
>> I am wondering wether someone can explain how hpet behaves. The bellow
>> is a short program that reads from a mmaped /dev/hpet the time. I am
>> running it and it looks that afer ~296 seconds the counter resets . I
>> AM RUNNING 64bi KERNEL(2.6.18-8.el5) and reading a 64BIT VARIABLE.
>> my hpet is 14MHZ, so I am guessing a 32bit wraparound ( ~296 * 14Mhz
>> ) = MAX_INT . but why ?
>>
>
> HPET counter can be either 32 or 64 bit. Check COUNT_SIZE_CAP.
>
> http://www.intel.com/hardwaredesign/hpetspec_1.pdf
>
> Lee
>
Thank you Lee for your response. According to the SPEC I debugged and found:
section :2.3.4 Main Capabilities and ID Register
bit 13: HPET_COUNTER_SIZE_MASK & readq(&hpet->hpet_cap) is on.
indicates 64bit timer.
section 2.4.8 Timer n Configuration and Capabilties Register
bit 5 on Tn_SIZE_CAP is to 32bit. Problem is that it is readonly( page
18 in spec).
None of the above counters is 64bit, and there is no BIOS settings for
hpet ( T61 Lenovo ).
Furthermore , I have 3 timers , and only a single /dev/hpet. why ?
thank you
--
Raz
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-05-31 18:21 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <83CA05F64804AF43B8F733C4ABDFAA5101384F73@mail1.bitband.com>
[not found] ` <83CA05F64804AF43B8F733C4ABDFAA5101384FA4@mail1.bitband.com>
2008-05-28 22:19 ` mmap over HPET - 32 bit wrap arround Raz
2008-05-28 23:57 ` Lee Revell
2008-05-31 18:20 ` Raz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®