Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/xe: Make xe_ggtt_node offset relative to starting offset

Fix all functions that use node->start to use xe_ggtt_node_addr,
and add ggtt->start to node->start.

This will make node shifting for SR-IOV VF a one-liner, instead of
manually changing each GGTT node's base address.

Also convert some uses of mutex_lock/unlock to mutex guards.

Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://patch.msgid.link/20260206112108.1453809-8-dev@lankhorst.se
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>

+31 -22
+31 -22
drivers/gpu/drm/xe/xe_ggtt.c
··· 299 299 { 300 300 ggtt->start = start; 301 301 ggtt->size = size; 302 - drm_mm_init(&ggtt->mm, start, size); 302 + drm_mm_init(&ggtt->mm, 0, size); 303 303 } 304 304 305 305 int xe_ggtt_init_kunit(struct xe_ggtt *ggtt, u32 start, u32 size) ··· 401 401 /* Display may have allocated inside ggtt, so be careful with clearing here */ 402 402 mutex_lock(&ggtt->lock); 403 403 drm_mm_for_each_hole(hole, &ggtt->mm, start, end) 404 - xe_ggtt_clear(ggtt, start, end - start); 404 + xe_ggtt_clear(ggtt, ggtt->start + start, end - start); 405 405 406 406 xe_ggtt_invalidate(ggtt); 407 407 mutex_unlock(&ggtt->lock); ··· 418 418 419 419 mutex_lock(&ggtt->lock); 420 420 if (bound) 421 - xe_ggtt_clear(ggtt, node->base.start, node->base.size); 421 + xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node), xe_ggtt_node_size(node)); 422 422 drm_mm_remove_node(&node->base); 423 423 node->base.size = 0; 424 424 mutex_unlock(&ggtt->lock); ··· 570 570 xe_tile_assert(ggtt->tile, IS_ALIGNED(start, XE_PAGE_SIZE)); 571 571 xe_tile_assert(ggtt->tile, IS_ALIGNED(end, XE_PAGE_SIZE)); 572 572 xe_tile_assert(ggtt->tile, !drm_mm_node_allocated(&node->base)); 573 + xe_tile_assert(ggtt->tile, start >= ggtt->start); 573 574 lockdep_assert_held(&ggtt->lock); 574 575 575 576 node->base.color = 0; 576 - node->base.start = start; 577 + node->base.start = start - ggtt->start; 577 578 node->base.size = end - start; 578 579 579 580 err = drm_mm_reserve_node(&ggtt->mm, &node->base); 580 581 581 582 if (xe_tile_WARN(ggtt->tile, err, "Failed to balloon GGTT %#llx-%#llx (%pe)\n", 582 - node->base.start, node->base.start + node->base.size, ERR_PTR(err))) 583 + xe_ggtt_node_addr(node), xe_ggtt_node_addr(node) + node->base.size, ERR_PTR(err))) 583 584 return err; 584 585 585 586 xe_ggtt_dump_node(ggtt, &node->base, "balloon"); ··· 771 770 if (XE_WARN_ON(!node)) 772 771 return; 773 772 774 - start = node->base.start; 773 + start = xe_ggtt_node_addr(node); 775 774 end = start + xe_bo_size(bo); 776 775 777 776 if (!xe_bo_is_vram(bo) && !xe_bo_is_stolen(bo)) { ··· 892 891 } 893 892 894 893 mutex_lock(&ggtt->lock); 894 + xe_tile_assert(ggtt->tile, start >= ggtt->start || !start); 895 + xe_tile_assert(ggtt->tile, end >= ggtt->start); 896 + 897 + if (start) 898 + start -= ggtt->start; 899 + 900 + end -= ggtt->start; 901 + 895 902 err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node[tile_id]->base, 896 903 xe_bo_size(bo), alignment, 0, start, end, 0); 897 904 if (err) { ··· 1011 1002 return FIELD_PREP(GGTT_PTE_VFID, vfid) | XE_PAGE_PRESENT; 1012 1003 } 1013 1004 1014 - static void xe_ggtt_assign_locked(struct xe_ggtt *ggtt, const struct drm_mm_node *node, u16 vfid) 1005 + static void xe_ggtt_assign_locked(const struct xe_ggtt_node *node, u16 vfid) 1015 1006 { 1016 - u64 start = node->start; 1017 - u64 size = node->size; 1007 + struct xe_ggtt *ggtt = node->ggtt; 1008 + u64 start = xe_ggtt_node_addr(node); 1009 + u64 size = xe_ggtt_node_size(node); 1018 1010 u64 end = start + size - 1; 1019 1011 u64 pte = xe_encode_vfid_pte(vfid); 1020 1012 1021 1013 lockdep_assert_held(&ggtt->lock); 1022 1014 1023 - if (!drm_mm_node_allocated(node)) 1015 + if (!xe_ggtt_node_allocated(node)) 1024 1016 return; 1025 1017 1026 1018 while (start < end) { ··· 1043 1033 */ 1044 1034 void xe_ggtt_assign(const struct xe_ggtt_node *node, u16 vfid) 1045 1035 { 1046 - mutex_lock(&node->ggtt->lock); 1047 - xe_ggtt_assign_locked(node->ggtt, &node->base, vfid); 1048 - mutex_unlock(&node->ggtt->lock); 1036 + guard(mutex)(&node->ggtt->lock); 1037 + xe_ggtt_assign_locked(node, vfid); 1049 1038 } 1050 1039 1051 1040 /** ··· 1066 1057 if (!node) 1067 1058 return -ENOENT; 1068 1059 1069 - guard(mutex)(&node->ggtt->lock); 1060 + ggtt = node->ggtt; 1061 + guard(mutex)(&ggtt->lock); 1070 1062 1071 1063 if (xe_ggtt_node_pt_size(node) != size) 1072 1064 return -EINVAL; 1073 1065 1074 - ggtt = node->ggtt; 1075 - start = node->base.start; 1076 - end = start + node->base.size - 1; 1066 + start = xe_ggtt_node_addr(node); 1067 + end = start + xe_ggtt_node_size(node) - 1; 1077 1068 1078 1069 while (start < end) { 1079 1070 pte = ggtt->pt_ops->ggtt_get_pte(ggtt, start); ··· 1106 1097 if (!node) 1107 1098 return -ENOENT; 1108 1099 1109 - guard(mutex)(&node->ggtt->lock); 1100 + ggtt = node->ggtt; 1101 + guard(mutex)(&ggtt->lock); 1110 1102 1111 1103 if (xe_ggtt_node_pt_size(node) != size) 1112 1104 return -EINVAL; 1113 1105 1114 - ggtt = node->ggtt; 1115 - start = node->base.start; 1116 - end = start + node->base.size - 1; 1106 + start = xe_ggtt_node_addr(node); 1107 + end = start + xe_ggtt_node_size(node) - 1; 1117 1108 1118 1109 while (start < end) { 1119 1110 vfid_pte = u64_replace_bits(*buf++, vfid, GGTT_PTE_VFID); ··· 1220 1211 */ 1221 1212 u64 xe_ggtt_node_addr(const struct xe_ggtt_node *node) 1222 1213 { 1223 - return node->base.start; 1214 + return node->base.start + node->ggtt->start; 1224 1215 } 1225 1216 1226 1217 /**