X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/4a3eedf9ecc9bbe3f3a5c6ce5e53ad199d639d32..d26ffc64f583ab2d29df48f13518685602bc8832:/osfmk/i386/hpet.c diff --git a/osfmk/i386/hpet.c b/osfmk/i386/hpet.c index 5ae9621d5..f8fd9832d 100644 --- a/osfmk/i386/hpet.c +++ b/osfmk/i386/hpet.c @@ -42,12 +42,12 @@ #include #include #include -#include -#include #include -#include #include +#include #include +#include +#include #include #include #include @@ -58,19 +58,6 @@ #include #include #include -#if MACH_KDB -#include -#endif -#if MACH_KDB -#include -#include -#include -#include -#include -#include -#include -#endif /* MACH_KDB */ -#include /* Decimal powers: */ #define kilo (1000ULL) @@ -79,7 +66,7 @@ #define Tera (kilo * Giga) #define Peta (kilo * Tera) -uint32_t hpetArea = 0; +vm_offset_t hpetArea = 0; uint32_t hpetAreap = 0; uint64_t hpetFemto = 0; uint64_t hpetFreq = 0; @@ -91,7 +78,7 @@ uint64_t hpet2tsc = 0; uint64_t bus2hpet = 0; uint64_t hpet2bus = 0; -uint32_t rcbaArea = 0; +vm_offset_t rcbaArea = 0; uint32_t rcbaAreap = 0; static int (*hpet_req)(uint32_t apicid, void *arg, hpetRequest_t *hpet) = NULL; @@ -133,6 +120,26 @@ hpet_request(uint32_t cpu) return(-1); } + /* + * Deal with the case where the CPU # passed in is past the + * value specified in cpus=n in boot-args. + */ + if (cpu >= real_ncpus) { + enabled = ml_set_interrupts_enabled(FALSE); + lcpu = cpu_to_lcpu(cpu); + if (lcpu != NULL) { + core = lcpu->core; + pkg = core->package; + + if (lcpu->primary) { + pkg->flags |= X86PKG_FL_HAS_HPET; + } + } + + ml_set_interrupts_enabled(enabled); + return(0); + } + rc = (*hpet_req)(ml_get_apicid(cpu), hpet_arg, &hpetReq); if (rc != 0) { return(rc); @@ -188,7 +195,7 @@ map_rcbaArea(void) outl(cfgAdr, lpcCfg | (0xF0 & 0xFC)); rcbaAreap = inl(cfgDat | (0xF0 & 0x03)); rcbaArea = io_map_spec(rcbaAreap & -4096, PAGE_SIZE * 4, VM_WIMG_IO); - kprintf("RCBA: vaddr = %08X, paddr = %08X\n", rcbaArea, rcbaAreap); + kprintf("RCBA: vaddr = %lX, paddr = %08X\n", (unsigned long)rcbaArea, rcbaAreap); } /* @@ -219,7 +226,7 @@ hpet_init(void) */ hpetAreap = hpetAddr | ((hptc & 3) << 12); hpetArea = io_map_spec(hpetAreap & -4096, PAGE_SIZE * 4, VM_WIMG_IO); - kprintf("HPET: vaddr = %08X, paddr = %08X\n", hpetArea, hpetAreap); + kprintf("HPET: vaddr = %lX, paddr = %08X\n", (unsigned long)hpetArea, hpetAreap); /* * Extract the HPET tick rate. @@ -279,10 +286,6 @@ hpet_init(void) hpet2bus = tmrCvt(hpetCvtt2n, busFCvtn2t); DBG(" CVT: HPET to BUS = %08X.%08X\n", (uint32_t)(hpet2bus >> 32), (uint32_t)hpet2bus); - -#if MACH_KDB - db_display_hpet((hpetReg_t *)hpetArea); /* (BRINGUP) */ -#endif } /* @@ -343,7 +346,7 @@ ml_hpet_cfg(uint32_t cpu, uint32_t hpetVect) enabled = ml_set_interrupts_enabled(FALSE); /* Calculate address of the HPET for this processor */ - hpetVaddr = (uint64_t *)(((uint32_t)&(((hpetReg_t *)hpetArea)->TIM1_CONF)) + (cpu << 5)); + hpetVaddr = (uint64_t *)(((uintptr_t)&(((hpetReg_t *)hpetArea)->TIM1_CONF)) + (cpu << 5)); hpet = (hpetTimer_t *)hpetVaddr; DBG("ml_hpet_cfg: HPET for cpu %d at %p, vector = %d\n", @@ -467,64 +470,3 @@ rdHPET(void) return (((uint64_t) high) << 32) | low; } - -#if MACH_KDB - -#define HI32(x) ((uint32_t)(((x) >> 32) & 0xFFFFFFFF)) -#define LO32(x) ((uint32_t)((x) & 0xFFFFFFFF)) - -/* - * Displays HPET memory mapped area - * hp - */ -void -db_hpet(__unused db_expr_t addr, __unused int have_addr, __unused db_expr_t count, __unused char *modif) -{ - - db_display_hpet((hpetReg_t *) hpetArea); /* Dump out the HPET - * stuff */ - return; -} - -void -db_display_hpet(hpetReg_t *hpt) -{ - uint64_t cmain; - - cmain = hpt->MAIN_CNT; /* Get the main timer */ - - /* General capabilities */ - db_printf(" GCAP_ID = %08X.%08X\n", - HI32(hpt->GCAP_ID), LO32(hpt->GCAP_ID)); - /* General configuration */ - db_printf(" GEN_CONF = %08X.%08X\n", - HI32(hpt->GEN_CONF), LO32(hpt->GEN_CONF)); - /* General Interrupt status */ - db_printf("GINTR_STA = %08X.%08X\n", - HI32(hpt->GINTR_STA), LO32(hpt->GINTR_STA)); - /* Main counter */ - db_printf(" MAIN_CNT = %08X.%08X\n", - HI32(cmain), LO32(cmain)); - /* Timer 0 config and cap */ - db_printf("TIM0_CONF = %08X.%08X\n", - HI32(hpt->TIM0_CONF), LO32(hpt->TIM0_CONF)); - /* Timer 0 comparator */ - db_printf("TIM0_COMP = %08X.%08X\n", - HI32(hpt->TIM0_COMP), LO32(hpt->TIM0_COMP)); - /* Timer 1 config and cap */ - db_printf("TIM0_CONF = %08X.%08X\n", - HI32(hpt->TIM1_CONF), LO32(hpt->TIM1_CONF)); - /* Timer 1 comparator */ - db_printf("TIM1_COMP = %08X.%08X\n", - HI32(hpt->TIM1_COMP), LO32(hpt->TIM1_COMP)); - /* Timer 2 config and cap */ - db_printf("TIM2_CONF = %08X.%08X\n", - HI32(hpt->TIM2_CONF), LO32(hpt->TIM2_CONF)); - /* Timer 2 comparator */ - db_printf("TIM2_COMP = %08X.%08X\n", - HI32(hpt->TIM2_COMP), LO32(hpt->TIM2_COMP)); - - db_printf("\nHPET Frequency = %d.%05dMHz\n", - (uint32_t) (hpetFreq / 1000000), (uint32_t) (hpetFreq % 1000000)); -} -#endif