[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