summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-07-17 15:55:07 -0700
committerJason Ekstrand <[email protected]>2018-07-18 08:42:38 -0700
commit6953d7f5d253028e41af1d0e4a60d0407e91a831 (patch)
tree57345d5b09b00be48b070d107a9838c058d64040
parent322fa3e5be5cd08ce752075f4fbff15019b8d6c7 (diff)
intel/dump_gpu: Fix corner cases in PPGTT range calculations
For large buffers which span an entire l1 page table, we got the range calculations wrong. In this case, we end up with an l1_start which is the first byte represented by the given l1 table and an l1_end which is the first byte after the range represented by the l1 table. Then l2_start_index == L2_index(l2_end) due to roll-over. Instead, compute lN_end using (1Ull << shift) - 1 so that lN_end is the last byte in the range represented by the Nth level page table. When we do this, we don't need the conditional expression anymore. Reviewed-by: Lionel Landwerlin <[email protected]>
-rw-r--r--src/intel/tools/intel_dump_gpu.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/intel/tools/intel_dump_gpu.c b/src/intel/tools/intel_dump_gpu.c
index 766ba662d91..029a01c93d1 100644
--- a/src/intel/tools/intel_dump_gpu.c
+++ b/src/intel/tools/intel_dump_gpu.c
@@ -457,28 +457,28 @@ map_ppgtt(uint64_t start, uint64_t size)
for (uint64_t l4 = l4_start; l4 < l4_end; l4 += (1ULL << 39)) {
uint64_t l3_start = max(l4, start & 0xffffc0000000);
- uint64_t l3_end = min(l4 + (1ULL << 39),
+ uint64_t l3_end = min(l4 + (1ULL << 39) - 1,
((start + size - 1) | 0x00003fffffff) & 0xffffffffffff);
uint64_t l3_start_idx = L3_index(l3_start);
- uint64_t l3_end_idx = L3_index(l3_start) >= l3_start_idx ? L3_index(l3_end) : 0x1ff;
+ uint64_t l3_end_idx = L3_index(l3_end);
populate_ppgtt_table(L3_table(l4), l3_start_idx, l3_end_idx, 3);
for (uint64_t l3 = l3_start; l3 < l3_end; l3 += (1ULL << 30)) {
uint64_t l2_start = max(l3, start & 0xffffffe00000);
- uint64_t l2_end = min(l3 + (1ULL << 30),
+ uint64_t l2_end = min(l3 + (1ULL << 30) - 1,
((start + size - 1) | 0x0000001fffff) & 0xffffffffffff);
uint64_t l2_start_idx = L2_index(l2_start);
- uint64_t l2_end_idx = L2_index(l2_end) >= l2_start_idx ? L2_index(l2_end) : 0x1ff;
+ uint64_t l2_end_idx = L2_index(l2_end);
populate_ppgtt_table(L2_table(l3), l2_start_idx, l2_end_idx, 2);
for (uint64_t l2 = l2_start; l2 < l2_end; l2 += (1ULL << 21)) {
uint64_t l1_start = max(l2, start & 0xfffffffff000);
- uint64_t l1_end = min(l2 + (1ULL << 21),
+ uint64_t l1_end = min(l2 + (1ULL << 21) - 1,
((start + size - 1) | 0x000000000fff) & 0xffffffffffff);
uint64_t l1_start_idx = L1_index(l1_start);
- uint64_t l1_end_idx = L1_index(l1_end) >= l1_start_idx ? L1_index(l1_end) : 0x1ff;
+ uint64_t l1_end_idx = L1_index(l1_end);
populate_ppgtt_table(L1_table(l2), l1_start_idx, l1_end_idx, 1);
}