hardware_properties.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <tuple>
  6. #include "common/bit_util.h"
  7. #include "common/common_types.h"
  8. namespace Core {
  9. namespace Hardware {
  10. constexpr u64 BASE_CLOCK_RATE = 1'020'000'000; // Default CPU Frequency = 1020 MHz
  11. constexpr u64 CNTFREQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz
  12. constexpr u32 NUM_CPU_CORES = 4; // Number of CPU Cores
  13. // Virtual to Physical core map.
  14. constexpr std::array<s32, Common::BitSize<u64>()> VirtualToPhysicalCoreMap{
  15. 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  16. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
  17. };
  18. static constexpr inline size_t NumVirtualCores = Common::BitSize<u64>();
  19. static constexpr inline u64 VirtualCoreMask = [] {
  20. u64 mask = 0;
  21. for (size_t i = 0; i < NumVirtualCores; ++i) {
  22. mask |= (UINT64_C(1) << i);
  23. }
  24. return mask;
  25. }();
  26. static constexpr inline u64 ConvertVirtualCoreMaskToPhysical(u64 v_core_mask) {
  27. u64 p_core_mask = 0;
  28. while (v_core_mask != 0) {
  29. const u64 next = std::countr_zero(v_core_mask);
  30. v_core_mask &= ~(static_cast<u64>(1) << next);
  31. p_core_mask |= (static_cast<u64>(1) << VirtualToPhysicalCoreMap[next]);
  32. }
  33. return p_core_mask;
  34. }
  35. // Cortex-A57 supports 4 memory watchpoints
  36. constexpr u64 NUM_WATCHPOINTS = 4;
  37. } // namespace Hardware
  38. } // namespace Core