[PATCH] drm/xe: Carve out wopcm portion from the stolen memory
Nirmoy Das
nirmoy.das at linux.intel.com
Mon Feb 10 15:09:32 UTC 2025
On 2/7/2025 11:55 PM, Lucas De Marchi wrote:
> On Fri, Feb 07, 2025 at 05:43:34PM +0100, Nirmoy Das wrote:
>> Top of stolen memory is wopcm which shouldn't be accessed so remove
>> that portion of memory from the stolen memory.
>
> humn... we are already doing this for integrated. The copy & paste is
> small here to deserve a refactor, but maybe mention that this is already
> done for integrated and it was missed on the discrete side?
>
>>
>> Fixes: d8b52a02cb40 ("drm/xe: Implement stolen memory.")
>> Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
>> Cc: Matthew Auld <matthew.auld at intel.com>
>> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>> Cc: <stable at vger.kernel.org> # v6.8+
>
> I'd rather do this 6.11+. It's not important before that as we didn't
> have any platform out of force probe or close to be out of force probe.
>
> We will most likely not be able to apply this patch on 6.8.
>
>> Signed-off-by: Nirmoy Das <nirmoy.das at intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c | 54 ++++++++++++++------------
>> 1 file changed, 30 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>> index 423856cc18d4..d414421f8c13 100644
>> --- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>> +++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>> @@ -57,12 +57,35 @@ bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe)
>> return GRAPHICS_VERx100(xe) < 1270 && !IS_DGFX(xe);
>> }
>>
>> +static u32 get_wopcm_size(struct xe_device *xe)
>> +{
>> + u32 wopcm_size;
>> + u64 val;
>> +
>> + val = xe_mmio_read64_2x32(xe_root_tile_mmio(xe), STOLEN_RESERVED);
>> + val = REG_FIELD_GET64(WOPCM_SIZE_MASK, val);
>> +
>> + switch (val) {
>> + case 0x5 ... 0x6:
>> + val--;
>> + fallthrough;
>> + case 0x0 ... 0x3:
>> + wopcm_size = (1U << val) * SZ_1M;
>> + break;
>> + default:
>> + WARN(1, "Missing case wopcm_size=%llx\n", val);
>> + wopcm_size = 0;
>> + }
>> +
>> + return wopcm_size;
>> +}
>
> Please also mention in the commit message the code movement here, that
> is done just for the function to be called by detect_bar2_dgfx()
>
> Other than that, Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
Thanks Lucas, sent out a v2 with better commit message and stable tag with 6.11+.
Nirmoy
>
> thanks
> Lucas De Marchi
>
>> +
>> static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
>> {
>> struct xe_tile *tile = xe_device_get_root_tile(xe);
>> struct xe_mmio *mmio = xe_root_tile_mmio(xe);
>> struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
>> - u64 stolen_size;
>> + u64 stolen_size, wopcm_size;
>> u64 tile_offset;
>> u64 tile_size;
>>
>> @@ -74,7 +97,13 @@ static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
>> if (drm_WARN_ON(&xe->drm, tile_size < mgr->stolen_base))
>> return 0;
>>
>> + /* Carve out the top of DSM as it contains the reserved WOPCM region */
>> + wopcm_size = get_wopcm_size(xe);
>> + if (drm_WARN_ON(&xe->drm, !wopcm_size))
>> + return 0;
>> +
>> stolen_size = tile_size - mgr->stolen_base;
>> + stolen_size -= wopcm_size;
>>
>> /* Verify usage fits in the actual resource available */
>> if (mgr->stolen_base + stolen_size <= pci_resource_len(pdev, LMEM_BAR))
>> @@ -89,29 +118,6 @@ static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
>> return ALIGN_DOWN(stolen_size, SZ_1M);
>> }
>>
>> -static u32 get_wopcm_size(struct xe_device *xe)
>> -{
>> - u32 wopcm_size;
>> - u64 val;
>> -
>> - val = xe_mmio_read64_2x32(xe_root_tile_mmio(xe), STOLEN_RESERVED);
>> - val = REG_FIELD_GET64(WOPCM_SIZE_MASK, val);
>> -
>> - switch (val) {
>> - case 0x5 ... 0x6:
>> - val--;
>> - fallthrough;
>> - case 0x0 ... 0x3:
>> - wopcm_size = (1U << val) * SZ_1M;
>> - break;
>> - default:
>> - WARN(1, "Missing case wopcm_size=%llx\n", val);
>> - wopcm_size = 0;
>> - }
>> -
>> - return wopcm_size;
>> -}
>> -
>> static u32 detect_bar2_integrated(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
>> {
>> struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
>> --
>> 2.46.0
>>
More information about the Intel-xe
mailing list