Module: Mesa
Branch: master
Commit: 6953d7f5d253028e41af1d0e4a60d0407e91a831
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6953d7f5d253028e41af1d0e4a60d0407e91a831

Author: Jason Ekstrand <[email protected]>
Date:   Tue Jul 17 15:55:07 2018 -0700

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]>

---

 src/intel/tools/intel_dump_gpu.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/intel/tools/intel_dump_gpu.c b/src/intel/tools/intel_dump_gpu.c
index 766ba662d9..029a01c93d 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);
          }

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to