[Intel-xe] [PATCH v4 2/6] drm/xe: add xe_ttm_stolen_cpu_access_needs_ggtt()
Thomas Hellström
thomas.hellstrom at linux.intel.com
Tue Mar 14 10:09:36 UTC 2023
On 3/14/23 11:08, Matthew Auld wrote:
> On 14/03/2023 09:53, Thomas Hellström wrote:
>>
>> On 3/14/23 09:58, Matthew Auld wrote:
>>> xe_ttm_stolen_cpu_inaccessible() was originally meant to just cover the
>>> case where stolen is not directly CPU accessible on some older
>>> integrated platforms, and as such a GGTT mapping was also required for
>>> CPU access (as per the check in xe_bo_create_pin_map_at()).
>>>
>>> However with small-bar systems on dgfx we have one more case where
>>> stolen is also inaccessible, however here we don't have any fallback
>>> GGTT mode for CPU access. Fix the check in xe_bo_create_pin_map_at() to
>>> make this distinction clear. In such a case the later vmap() will fail
>>> anyway.
>>>
>>> v2: fix kernel-doc warning
>>> v3: Simplify further and remove cpu_inaccessible()
>>>
>>> Suggested-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
>>> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
>>> Cc: Gwan-gyeong Mun <gwan-gyeong.mun at intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_bo.c | 2 +-
>>> drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c | 39
>>> ++++++++------------------
>>> drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h | 2 +-
>>> 3 files changed, 14 insertions(+), 29 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>> index 3e90ea42e075..73a7f2cd4ad8 100644
>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>> @@ -1151,7 +1151,7 @@ struct xe_bo *xe_bo_create_pin_map_at(struct
>>> xe_device *xe, struct xe_gt *gt,
>>> u64 end = offset == ~0ull ? offset : start + size;
>>> if (flags & XE_BO_CREATE_STOLEN_BIT &&
>>> - xe_ttm_stolen_cpu_inaccessible(xe))
>>> + xe_ttm_stolen_cpu_access_needs_ggtt(xe))
>>> flags |= XE_BO_CREATE_GGTT_BIT;
>>> bo = xe_bo_create_locked_range(xe, gt, vm, size, start, end,
>>> type, flags);
>>> diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>> b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>> index 27cc31f022a5..8759c13acd9b 100644
>>> --- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>> +++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>> @@ -38,32 +38,17 @@ to_stolen_mgr(struct ttm_resource_manager *man)
>>> }
>>> /**
>>> - * xe_ttm_stolen_cpu_inaccessible - Can we directly CPU access
>>> stolen memory for
>>> - * this device.
>>> + * xe_ttm_stolen_cpu_access_needs_ggtt - If we can't directly CPU
>>> access stolen,
>>
>> Nit: Should be xe_ttm_stolen_cpu_access_needs_ggtt() ?
>
> Do you just mean I need the brackets? Ctrl-F is not helping me...maybe
> I'm blind.
Yes, just the brackets.
/Thomas
>
>>
>> Otherwise LGTM.
>
> Thanks.
>
>>
>> /Thomas
>>
>>
>>> + * can we then fallback to mapping through the GGTT.
>>> * @xe: xe device
>>> *
>>> - * On some integrated platforms we can't directly access stolen via
>>> the CPU
>>> - * (like some normal system memory). Also on small-bar systems for
>>> discrete,
>>> - * since stolen is always as the end of normal VRAM, and the BAR
>>> likely doesn't
>>> - * stretch that far. However CPU access of stolen is generally
>>> rare, and at
>>> - * least on discrete should not be needed.
>>> - *
>>> - * If this is indeed inaccessible then we fallback to using the
>>> GGTT mappable
>>> - * aperture for CPU access. On discrete platforms we have no such
>>> thing, so when
>>> - * later attempting to CPU map the memory an error is instead thrown.
>>> + * Some older integrated platforms don't support reliable CPU
>>> access for stolen,
>>> + * however on such hardware we can always use the mappable part of
>>> the GGTT for
>>> + * CPU access. Check if that's the case for this device.
>>> */
>>> -bool xe_ttm_stolen_cpu_inaccessible(struct xe_device *xe)
>>> +bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe)
>>> {
>>> - struct ttm_resource_manager *ttm_mgr =
>>> - ttm_manager_type(&xe->ttm, XE_PL_STOLEN);
>>> - struct xe_ttm_stolen_mgr *mgr;
>>> -
>>> - if (!ttm_mgr)
>>> - return true;
>>> -
>>> - mgr = to_stolen_mgr(ttm_mgr);
>>> -
>>> - return !mgr->io_base || GRAPHICS_VERx100(xe) < 1270;
>>> + return GRAPHICS_VERx100(xe) < 1270 && !IS_DGFX(xe);
>>> }
>>> static s64 detect_bar2_dgfx(struct xe_device *xe, struct
>>> xe_ttm_stolen_mgr *mgr)
>>> @@ -178,7 +163,7 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe)
>>> drm_dbg_kms(&xe->drm, "Initialized stolen memory support with
>>> %llu bytes\n",
>>> stolen_size);
>>> - if (!xe_ttm_stolen_cpu_inaccessible(xe))
>>> + if (mgr->io_base && !xe_ttm_stolen_cpu_access_needs_ggtt(xe))
>>> mgr->mapping = devm_ioremap_wc(&pdev->dev, mgr->io_base,
>>> stolen_size);
>>> }
>>> @@ -191,7 +176,7 @@ u64 xe_ttm_stolen_io_offset(struct xe_bo *bo,
>>> u32 offset)
>>> XE_BUG_ON(!mgr->io_base);
>>> - if (!IS_DGFX(xe) && xe_ttm_stolen_cpu_inaccessible(xe))
>>> + if (xe_ttm_stolen_cpu_access_needs_ggtt(xe))
>>> return mgr->io_base + xe_bo_ggtt_addr(bo) + offset;
>>> xe_res_first(bo->ttm.resource, offset, 4096, &cur);
>>> @@ -257,10 +242,10 @@ int xe_ttm_stolen_io_mem_reserve(struct
>>> xe_device *xe, struct ttm_resource *mem)
>>> if (!mgr || !mgr->io_base)
>>> return -EIO;
>>> - if (!xe_ttm_stolen_cpu_inaccessible(xe))
>>> - return __xe_ttm_stolen_io_mem_reserve_bar2(xe, mgr, mem);
>>> - else
>>> + if (xe_ttm_stolen_cpu_access_needs_ggtt(xe))
>>> return __xe_ttm_stolen_io_mem_reserve_stolen(xe, mgr, mem);
>>> + else
>>> + return __xe_ttm_stolen_io_mem_reserve_bar2(xe, mgr, mem);
>>> }
>>> u64 xe_ttm_stolen_gpu_offset(struct xe_device *xe)
>>> diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h
>>> b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h
>>> index 2fda97b97a05..1777245ff810 100644
>>> --- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h
>>> +++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h
>>> @@ -14,7 +14,7 @@ struct xe_device;
>>> void xe_ttm_stolen_mgr_init(struct xe_device *xe);
>>> int xe_ttm_stolen_io_mem_reserve(struct xe_device *xe, struct
>>> ttm_resource *mem);
>>> -bool xe_ttm_stolen_cpu_inaccessible(struct xe_device *xe);
>>> +bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe);
>>> u64 xe_ttm_stolen_io_offset(struct xe_bo *bo, u32 offset);
>>> u64 xe_ttm_stolen_gpu_offset(struct xe_device *xe);
More information about the Intel-xe
mailing list