8#ifndef VMWARE_SVGA_STATE_H
9#define VMWARE_SVGA_STATE_H
11#include "pedigree/kernel/processor/types.h"
13namespace VmwareSvgaState {
14constexpr uint64_t FifoSyncTimeout = 1000000000ULL;
15constexpr size_t FifoSyncPollLimit = 10000000;
19 explicit PollBudget(uint64_t started, uint64_t timeout = FifoSyncTimeout,
20 size_t pollLimit = FifoSyncPollLimit)
21 : m_Started(started), m_Timeout(timeout), m_PollLimit(pollLimit), m_Polls(0) {}
23 bool keepPolling(uint64_t now) {
24 if (m_Polls >= m_PollLimit)
28 return (m_Polls < m_PollLimit) && ((now - m_Started) < m_Timeout);
31 size_t polls()
const {
50 constexpr uint32_t alignmentMask =
sizeof(uint32_t) - 1;
51 return !(layout.min & alignmentMask) && !(layout.max & alignmentMask) &&
52 !(layout.next & alignmentMask) && !(layout.stop & alignmentMask) &&
53 (layout.max > layout.min) && ((layout.max - layout.min) >= (2 *
sizeof(uint32_t))) &&
54 (layout.next >= layout.min) && (layout.next < layout.max) && (layout.stop >= layout.min) &&
55 (layout.stop < layout.max);
58inline bool valid(
const FifoLayout& layout,
size_t headerFloor,
size_t apertureBytes) {
59 return valid(layout) && (layout.min >= headerFloor) && (layout.max <= apertureBytes);
62inline size_t freeBytes(
const FifoLayout& layout) {
66 if (layout.next >= layout.stop) {
67 return (layout.max - layout.next) + (layout.stop - layout.min) -
sizeof(uint32_t);
70 return layout.stop - layout.next -
sizeof(uint32_t);
73inline bool canFit(
const FifoLayout& layout,
size_t words) {
74 if (!words || (words > (~
static_cast<size_t>(0) /
sizeof(uint32_t))))
77 return (words *
sizeof(uint32_t)) <= freeBytes(layout);