Lines Matching defs:pHpetTimer

281 DECLINLINE(bool) hpet32bitTimer(HPETTIMER *pHpetTimer)
283 uint64_t u64Cfg = pHpetTimer->u64Config;
288 DECLINLINE(uint64_t) hpetInvalidValue(HPETTIMER *pHpetTimer)
290 return hpet32bitTimer(pHpetTimer) ? UINT32_MAX : UINT64_MAX;
333 DECLINLINE(uint64_t) hpetComputeDiff(HPETTIMER *pHpetTimer, uint64_t u64Now)
336 if (hpet32bitTimer(pHpetTimer))
340 u32Diff = (uint32_t)pHpetTimer->u64Cmp - (uint32_t)u64Now;
348 u64Diff = pHpetTimer->u64Cmp - u64Now;
355 static void hpetAdjustComparator(HPETTIMER *pHpetTimer, uint64_t u64Now)
357 uint64_t u64Period = pHpetTimer->u64Period;
359 if ((pHpetTimer->u64Config & HPET_TN_PERIODIC) && u64Period)
361 uint64_t cPeriods = (u64Now - pHpetTimer->u64Cmp) / u64Period;
363 pHpetTimer->u64Cmp += (cPeriods + 1) * u64Period;
372 * @param pHpetTimer The timer.
374 DECLINLINE(void) hpetTimerSetFrequencyHint(HPET *pThis, HPETTIMER *pHpetTimer)
376 if (pHpetTimer->u64Config & HPET_TN_PERIODIC)
378 uint64_t const u64Period = pHpetTimer->u64Period;
381 TMTimerSetFrequencyHint(pHpetTimer->CTX_SUFF(pTimer), u32Freq / (uint32_t)u64Period);
386 static void hpetProgramTimer(HPETTIMER *pHpetTimer)
389 pHpetTimer->u8Wrap = 0;
391 uint64_t u64Ticks = hpetGetTicks(pHpetTimer->CTX_SUFF(pHpet));
392 hpetAdjustComparator(pHpetTimer, u64Ticks);
394 uint64_t u64Diff = hpetComputeDiff(pHpetTimer, u64Ticks);
400 if ( hpet32bitTimer(pHpetTimer)
401 && !(pHpetTimer->u64Config & HPET_TN_PERIODIC))
407 pHpetTimer->idxTimer, u32TillWrap, u64Ticks, u64Diff));
409 pHpetTimer->u8Wrap = 1;
421 Log4(("HPET: next IRQ in %lld ticks (%lld ns)\n", u64Diff, hpetTicksToNs(pHpetTimer->CTX_SUFF(pHpet), u64Diff)));
422 TMTimerSetNano(pHpetTimer->CTX_SUFF(pTimer), hpetTicksToNs(pHpetTimer->CTX_SUFF(pHpet), u64Diff));
423 hpetTimerSetFrequencyHint(pHpetTimer->CTX_SUFF(pHpet), pHpetTimer);
453 HPETTIMER const *pHpetTimer = &pThis->aTimers[iTimerNo];
458 u32Value = (uint32_t)pHpetTimer->u64Config;
463 u32Value = (uint32_t)(pHpetTimer->u64Config >> 32);
468 u32Value = (uint32_t)pHpetTimer->u64Cmp;
469 Log(("read HPET_TN_CMP on %d: %#x (%#llx)\n", pHpetTimer->idxTimer, u32Value, pHpetTimer->u64Cmp));
473 u32Value = (uint32_t)(pHpetTimer->u64Cmp >> 32);
474 Log(("read HPET_TN_CMP+4 on %d: %#x (%#llx)\n", pHpetTimer->idxTimer, u32Value, pHpetTimer->u64Cmp));
478 u32Value = (uint32_t)(pHpetTimer->u64Fsb >> 32); /** @todo Looks wrong, but since it's not supported, who cares. */
484 LogRelMax(10, ("invalid HPET register read %d on %d\n", iTimerReg, pHpetTimer->idxTimer));
516 HPETTIMER *pHpetTimer = &pThis->aTimers[iTimerNo];
526 if (pHpetTimer->u64Config & HPET_TN_PERIODIC_CAP)
529 if (pHpetTimer->u64Config & HPET_TN_SIZE_CAP)
537 pHpetTimer->u64Cmp = (uint32_t)pHpetTimer->u64Cmp;
538 pHpetTimer->u64Period = (uint32_t)pHpetTimer->u64Period;
547 pHpetTimer->u64Config = hpetUpdateMasked(u32NewValue, pHpetTimer->u64Config, u64Mask);
561 if (pHpetTimer->u64Config & HPET_TN_PERIODIC)
562 pHpetTimer->u64Period = RT_MAKE_U64(u32NewValue, RT_HI_U32(pHpetTimer->u64Period));
563 pHpetTimer->u64Cmp = RT_MAKE_U64(u32NewValue, RT_HI_U32(pHpetTimer->u64Cmp));
564 pHpetTimer->u64Config &= ~HPET_TN_SETVAL;
565 Log2(("after HPET_TN_CMP cmp=%#llx per=%#llx\n", pHpetTimer->u64Cmp, pHpetTimer->u64Period));
568 hpetProgramTimer(pHpetTimer);
577 if (!hpet32bitTimer(pHpetTimer))
579 if (pHpetTimer->u64Config & HPET_TN_PERIODIC)
580 pHpetTimer->u64Period = RT_MAKE_U64(RT_LO_U32(pHpetTimer->u64Period), u32NewValue);
581 pHpetTimer->u64Cmp = RT_MAKE_U64(RT_LO_U32(pHpetTimer->u64Cmp), u32NewValue);
583 Log2(("after HPET_TN_CMP+4 cmp=%llx per=%llx tmr=%d\n", pHpetTimer->u64Cmp, pHpetTimer->u64Period, iTimerNo));
585 pHpetTimer->u64Config &= ~HPET_TN_SETVAL;
588 hpetProgramTimer(pHpetTimer);
967 * @param pHpetTimer The HPET timer.
969 static uint32_t hpetR3TimerGetIrq(struct HPETTIMER const *pHpetTimer)
979 if ( (pHpetTimer->idxTimer <= 1)
980 && (pHpetTimer->CTX_SUFF(pHpet)->u64HpetConfig & HPET_CFG_LEGACY))
981 return (pHpetTimer->idxTimer == 0) ? 0 : 8;
983 return (pHpetTimer->u64Config & HPET_TN_INT_ROUTE_MASK) >> HPET_TN_INT_ROUTE_SHIFT;
991 * @param pHpetTimer The HPET timer.
993 static void hpetR3TimerUpdateIrq(HPET *pThis, struct HPETTIMER *pHpetTimer)
996 if ( !!(pHpetTimer->u64Config & HPET_TN_ENABLE)
999 uint32_t irq = hpetR3TimerGetIrq(pHpetTimer);
1003 if ((pHpetTimer->u64Config & HPET_TN_INT_TYPE) == HPET_TIMER_TYPE_LEVEL)
1004 pThis->u64Isr |= (uint64_t)(1 << pHpetTimer->idxTimer);
1008 if ((pHpetTimer->u64Config & HPET_TN_INT_TYPE) == HPET_TIMER_TYPE_EDGE)
1026 HPETTIMER *pHpetTimer = (HPETTIMER *)pvUser;
1027 uint64_t u64Period = pHpetTimer->u64Period;
1031 if (pHpetTimer->u64Config & HPET_TN_PERIODIC)
1034 hpetAdjustComparator(pHpetTimer, u64CurTick);
1036 u64Diff = hpetComputeDiff(pHpetTimer, u64CurTick);
1042 else if (hpet32bitTimer(pHpetTimer))
1045 if (pHpetTimer->u8Wrap)
1047 u64Diff = hpetComputeDiff(pHpetTimer, u64CurTick);
1049 pHpetTimer->u8Wrap = 0;
1054 hpetR3TimerUpdateIrq(pThis, pHpetTimer);
1126 HPETTIMER *pHpetTimer = &pThis->aTimers[iTimer];
1127 TMR3TimerSave(pHpetTimer->pTimerR3, pSSM);
1128 SSMR3PutU8(pSSM, pHpetTimer->u8Wrap);
1129 SSMR3PutU64(pSSM, pHpetTimer->u64Config);
1130 SSMR3PutU64(pSSM, pHpetTimer->u64Cmp);
1131 SSMR3PutU64(pSSM, pHpetTimer->u64Fsb);
1132 SSMR3PutU64(pSSM, pHpetTimer->u64Period);
1177 HPETTIMER *pHpetTimer = &pThis->aTimers[iTimer];
1178 TMR3TimerLoad(pHpetTimer->pTimerR3, pSSM);
1179 SSMR3GetU8(pSSM, &pHpetTimer->u8Wrap);
1180 SSMR3GetU64(pSSM, &pHpetTimer->u64Config);
1181 SSMR3GetU64(pSSM, &pHpetTimer->u64Cmp);
1182 SSMR3GetU64(pSSM, &pHpetTimer->u64Fsb);
1183 SSMR3GetU64(pSSM, &pHpetTimer->u64Period);
1206 HPETTIMER *pHpetTimer = &pThis->aTimers[iTimer];
1207 if (TMTimerIsActive(pHpetTimer->CTX_SUFF(pTimer)))
1208 hpetTimerSetFrequencyHint(pThis, pHpetTimer);
1254 HPETTIMER *pHpetTimer = &pThis->aTimers[i];
1255 Assert(pHpetTimer->idxTimer == i);
1256 TMTimerStop(pHpetTimer->pTimerR3);
1260 pHpetTimer->u64Config = (i == 0)
1264 pHpetTimer->u64Config = HPET_TN_PERIODIC_CAP | HPET_TN_SIZE_CAP;
1268 pHpetTimer->u64Config |= ((uint64_t)u32RoutingCap) << 32;
1269 pHpetTimer->u64Period = 0;
1270 pHpetTimer->u8Wrap = 0;
1271 pHpetTimer->u64Cmp = hpetInvalidValue(pHpetTimer);
1325 HPETTIMER *pHpetTimer = &pThis->aTimers[i];
1327 pHpetTimer->idxTimer = i;
1328 pHpetTimer->pHpetR3 = pThis;
1329 pHpetTimer->pHpetR0 = PDMINS_2_DATA_R0PTR(pDevIns);
1330 pHpetTimer->pHpetRC = PDMINS_2_DATA_RCPTR(pDevIns);
1369 HPETTIMER *pHpetTimer = &pThis->aTimers[i];
1371 rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, hpetR3Timer, pHpetTimer,