drm/xe: Don't hand out the flat CCS storage as usable VRAM · torvalds/linux@818bebe

GitHub

1 min read Original article ↗
Original file line numberDiff line numberDiff line change

@@ -89,12 +89,25 @@ static int get_flat_ccs_offset(struct xe_gt *gt, u64 tile_size, u64 *poffset)

8989

offset = offset_hi << 32; /* HW view bits 39:32 */

9090

offset |= offset_lo << 6; /* HW view bits 31:6 */

9191

offset *= num_enabled; /* convert to SW view */

92-

offset = round_up(offset, SZ_128K); /* SW must round up to nearest 128K */

9392
94-

/* We don't expect any holes */

95-

xe_assert_msg(xe, offset == (xe_mmio_read64_2x32(&gt_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(&gt_to_tile(gt)->mmio, GSMBASE),

110+

"CCS overlaps GSM.\n");

98111

} else {

99112

reg = xe_gt_mcr_unicast_read_any(gt, XEHP_FLAT_CCS_BASE_ADDR);

100113

offset = (u64)REG_FIELD_GET(XEHP_FLAT_CCS_PTR, reg) * SZ_64K;