| @@ -89,12 +89,25 @@ static int get_flat_ccs_offset(struct xe_gt gt, u64 tile_size, u64 poffset) |
| 89 | 89 | offset = offset_hi << 32; / HW view bits 39:32 / |
| 90 | 90 | offset |= offset_lo << 6; / HW view bits 31:6 / |
| 91 | 91 | offset = num_enabled; / convert to SW view / |
| 92 | | - offset = round_up(offset, SZ_128K); /
SW must round up to nearest 128K / |
| 93 | 92 |
|
| 94 | | - /
We don't expect any holes / |
| 95 | | - xe_assert_msg(xe, offset == (xe_mmio_read64_2x32(>_to_tile(gt)->mmio, GSMBASE) - |
| 96 | | - ccs_size), |
| 97 | | - "Hole between CCS and GSM.\n"); |
| | 93 | + /
|
| | 94 | + * Everything below this offset is handed to the VRAM |
| | 95 | + * allocator, so it has to be the first address the |
| | 96 | + * compression hardware owns, rounded down. Rounding it up |
| | 97 | + * publishes CCS storage as free memory. |
| | 98 | + / |
| | 99 | + offset = round_down(offset, SZ_4K); |
| | 100 | + |
| | 101 | + /
|
| | 102 | + * CCS storage must not run into GSM. The old check compared |
| | 103 | + * the offset against GSMBASE - ccs_size for equality, which |
| | 104 | + * could not fail: that value is 128K aligned, so it agreed |
| | 105 | + * with the rounded-up offset even when the base was not 128K |
| | 106 | + * aligned - exactly the case this fixes. |
| | 107 | + */ |
| | 108 | + xe_assert_msg(xe, offset + ccs_size <= |
| | 109 | + xe_mmio_read64_2x32(>_to_tile(gt)->mmio, GSMBASE), |
| | 110 | + "CCS overlaps GSM.\n"); |
| 98 | 111 | } else { |
| 99 | 112 | reg = xe_gt_mcr_unicast_read_any(gt, XEHP_FLAT_CCS_BASE_ADDR); |
| 100 | 113 | offset = (u64)REG_FIELD_GET(XEHP_FLAT_CCS_PTR, reg) * SZ_64K; |
| |