@@ -137,10 +137,32 @@ static void ggtt_update_access_counter(struct xe_ggtt *ggtt)
137137 }
138138}
139139
140+ /**
141+ * xe_ggtt_start - Get starting offset of GGTT.
142+ * @ggtt: &xe_ggtt
143+ *
144+ * Returns: Starting offset for this &xe_ggtt.
145+ */
146+ u64 xe_ggtt_start (struct xe_ggtt * ggtt )
147+ {
148+ return ggtt -> start ;
149+ }
150+
151+ /**
152+ * xe_ggtt_size - Get size of GGTT.
153+ * @ggtt: &xe_ggtt
154+ *
155+ * Returns: Total usable size of this &xe_ggtt.
156+ */
157+ u64 xe_ggtt_size (struct xe_ggtt * ggtt )
158+ {
159+ return ggtt -> size ;
160+ }
161+
140162static void xe_ggtt_set_pte (struct xe_ggtt * ggtt , u64 addr , u64 pte )
141163{
142164 xe_tile_assert (ggtt -> tile , !(addr & XE_PTE_MASK ));
143- xe_tile_assert (ggtt -> tile , addr < ggtt -> size );
165+ xe_tile_assert (ggtt -> tile , addr < ggtt -> start + ggtt -> size );
144166
145167 writeq (pte , & ggtt -> gsm [addr >> XE_PTE_SHIFT ]);
146168}
@@ -256,16 +278,16 @@ static const struct xe_ggtt_pt_ops xelpg_pt_wa_ops = {
256278 .ggtt_get_pte = xe_ggtt_get_pte ,
257279};
258280
259- static void __xe_ggtt_init_early (struct xe_ggtt * ggtt , u32 reserved )
281+ static void __xe_ggtt_init_early (struct xe_ggtt * ggtt , u64 start , u64 size )
260282{
261- drm_mm_init (& ggtt -> mm , reserved ,
262- ggtt -> size - reserved );
283+ ggtt -> start = start ;
284+ ggtt -> size = size ;
285+ drm_mm_init (& ggtt -> mm , start , size );
263286}
264287
265- int xe_ggtt_init_kunit (struct xe_ggtt * ggtt , u32 reserved , u32 size )
288+ int xe_ggtt_init_kunit (struct xe_ggtt * ggtt , u32 start , u32 size )
266289{
267- ggtt -> size = size ;
268- __xe_ggtt_init_early (ggtt , reserved );
290+ __xe_ggtt_init_early (ggtt , start , size );
269291 return 0 ;
270292}
271293EXPORT_SYMBOL_IF_KUNIT (xe_ggtt_init_kunit );
@@ -293,26 +315,32 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
293315 struct xe_device * xe = tile_to_xe (ggtt -> tile );
294316 struct pci_dev * pdev = to_pci_dev (xe -> drm .dev );
295317 unsigned int gsm_size ;
318+ u64 ggtt_start , wopcm = xe_wopcm_size (xe ), ggtt_size ;
296319 int err ;
297320
298- if (IS_SRIOV_VF (xe ) || GRAPHICS_VERx100 (xe ) >= 1250 )
299- gsm_size = SZ_8M ; /* GGTT is expected to be 4GiB */
300- else
301- gsm_size = probe_gsm_size (pdev );
302-
303- if (gsm_size == 0 ) {
304- xe_tile_err (ggtt -> tile , "Hardware reported no preallocated GSM\n" );
305- return - ENOMEM ;
321+ if (!IS_SRIOV_VF (xe )) {
322+ if (GRAPHICS_VERx100 (xe ) >= 1250 )
323+ gsm_size = SZ_8M ; /* GGTT is expected to be 4GiB */
324+ else
325+ gsm_size = probe_gsm_size (pdev );
326+ if (gsm_size == 0 ) {
327+ xe_tile_err (ggtt -> tile , "Hardware reported no preallocated GSM\n" );
328+ return - ENOMEM ;
329+ }
330+ ggtt_start = wopcm ;
331+ ggtt_size = (gsm_size / 8 ) * (u64 )XE_PAGE_SIZE - ggtt_start ;
332+ } else {
333+ /* GGTT is expected to be 4GiB */
334+ ggtt_start = wopcm ;
335+ ggtt_size = SZ_4G - ggtt_start ;
306336 }
307337
308338 ggtt -> gsm = ggtt -> tile -> mmio .regs + SZ_8M ;
309- ggtt -> size = (gsm_size / 8 ) * (u64 ) XE_PAGE_SIZE ;
310-
311339 if (IS_DGFX (xe ) && xe -> info .vram_flags & XE_VRAM_FLAGS_NEED64K )
312340 ggtt -> flags |= XE_GGTT_FLAGS_64K ;
313341
314- if (ggtt -> size > GUC_GGTT_TOP )
315- ggtt -> size = GUC_GGTT_TOP ;
342+ if (ggtt_size + ggtt_start > GUC_GGTT_TOP )
343+ ggtt_size = GUC_GGTT_TOP - ggtt_start ;
316344
317345 if (GRAPHICS_VERx100 (xe ) >= 1270 )
318346 ggtt -> pt_ops =
@@ -326,7 +354,7 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
326354 if (!ggtt -> wq )
327355 return - ENOMEM ;
328356
329- __xe_ggtt_init_early (ggtt , xe_wopcm_size ( xe ) );
357+ __xe_ggtt_init_early (ggtt , ggtt_start , ggtt_size );
330358
331359 err = drmm_add_action_or_reset (& xe -> drm , ggtt_fini_early , ggtt );
332360 if (err )
@@ -563,11 +591,9 @@ void xe_ggtt_node_remove_balloon_locked(struct xe_ggtt_node *node)
563591static void xe_ggtt_assert_fit (struct xe_ggtt * ggtt , u64 start , u64 size )
564592{
565593 struct xe_tile * tile = ggtt -> tile ;
566- struct xe_device * xe = tile_to_xe (tile );
567- u64 __maybe_unused wopcm = xe_wopcm_size (xe );
568594
569- xe_tile_assert (tile , start >= wopcm );
570- xe_tile_assert (tile , start + size < ggtt -> size - wopcm );
595+ xe_tile_assert (tile , start >= ggtt -> start );
596+ xe_tile_assert (tile , start + size <= ggtt -> start + ggtt -> size );
571597}
572598
573599/**
@@ -890,14 +916,12 @@ u64 xe_ggtt_largest_hole(struct xe_ggtt *ggtt, u64 alignment, u64 *spare)
890916{
891917 const struct drm_mm * mm = & ggtt -> mm ;
892918 const struct drm_mm_node * entry ;
893- u64 hole_min_start = xe_wopcm_size (tile_to_xe (ggtt -> tile ));
894919 u64 hole_start , hole_end , hole_size ;
895920 u64 max_hole = 0 ;
896921
897922 mutex_lock (& ggtt -> lock );
898-
899923 drm_mm_for_each_hole (entry , mm , hole_start , hole_end ) {
900- hole_start = max (hole_start , hole_min_start );
924+ hole_start = max (hole_start , ggtt -> start );
901925 hole_start = ALIGN (hole_start , alignment );
902926 hole_end = ALIGN_DOWN (hole_end , alignment );
903927 if (hole_start >= hole_end )
@@ -1069,15 +1093,13 @@ u64 xe_ggtt_print_holes(struct xe_ggtt *ggtt, u64 alignment, struct drm_printer
10691093{
10701094 const struct drm_mm * mm = & ggtt -> mm ;
10711095 const struct drm_mm_node * entry ;
1072- u64 hole_min_start = xe_wopcm_size (tile_to_xe (ggtt -> tile ));
10731096 u64 hole_start , hole_end , hole_size ;
10741097 u64 total = 0 ;
10751098 char buf [10 ];
10761099
10771100 mutex_lock (& ggtt -> lock );
1078-
10791101 drm_mm_for_each_hole (entry , mm , hole_start , hole_end ) {
1080- hole_start = max (hole_start , hole_min_start );
1102+ hole_start = max (hole_start , ggtt -> start );
10811103 hole_start = ALIGN (hole_start , alignment );
10821104 hole_end = ALIGN_DOWN (hole_end , alignment );
10831105 if (hole_start >= hole_end )
0 commit comments