- Remove bo->clients out of bos_lock area (Tejas)
- Carve out wopcm portion from the stolen memory (Nirmoy) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmeuKuwACgkQ+mJfZA7r E8otWAf9EYDbWE9va00T9kzPbzs3h/LEgkF7E22zgQPDcty+EwP+yGC9itcYnW8x HfzR7iQa56Q3iO9i+UINkjZnVzjNtuQpM5G4vKKW6eBwO/4tGvXy2knBf5Vd2yvY nLZQRPitaScwV17VjL0iw4ib4WuQWpJU7FZeTlIz8oHsF4dDV2B/R5k4REvbzM8a 81O0bXT+gvTQ//6A0PWDe4zPkS2dxKk6lhw57WRAnk0q4zRfV2rr4zlUHOrvDu8H Lfzz+fkrssYNVvzstLesRlIr8za6IhJDg4crro57dnAluNbPBCGl+GHBAc4eVeC5 P6z7Hl1xfkLGrFJoTj6m9Lvywt9Osw== =YbHU -----END PGP SIGNATURE----- Merge tag 'drm-xe-fixes-2025-02-13' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes - Remove bo->clients out of bos_lock area (Tejas) - Carve out wopcm portion from the stolen memory (Nirmoy) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/Z64rCicgpBe_t5GY@intel.com
This commit is contained in:
commit
04485cc348
2 changed files with 39 additions and 33 deletions
|
@ -135,8 +135,8 @@ void xe_drm_client_add_bo(struct xe_drm_client *client,
|
|||
XE_WARN_ON(bo->client);
|
||||
XE_WARN_ON(!list_empty(&bo->client_link));
|
||||
|
||||
spin_lock(&client->bos_lock);
|
||||
bo->client = xe_drm_client_get(client);
|
||||
spin_lock(&client->bos_lock);
|
||||
list_add_tail(&bo->client_link, &client->bos_list);
|
||||
spin_unlock(&client->bos_lock);
|
||||
}
|
||||
|
|
|
@ -57,38 +57,6 @@ bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe)
|
|||
return GRAPHICS_VERx100(xe) < 1270 && !IS_DGFX(xe);
|
||||
}
|
||||
|
||||
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 tile_offset;
|
||||
u64 tile_size;
|
||||
|
||||
tile_offset = tile->mem.vram.io_start - xe->mem.vram.io_start;
|
||||
tile_size = tile->mem.vram.actual_physical_size;
|
||||
|
||||
/* Use DSM base address instead for stolen memory */
|
||||
mgr->stolen_base = (xe_mmio_read64_2x32(mmio, DSMBASE) & BDSM_MASK) - tile_offset;
|
||||
if (drm_WARN_ON(&xe->drm, tile_size < mgr->stolen_base))
|
||||
return 0;
|
||||
|
||||
stolen_size = tile_size - mgr->stolen_base;
|
||||
|
||||
/* Verify usage fits in the actual resource available */
|
||||
if (mgr->stolen_base + stolen_size <= pci_resource_len(pdev, LMEM_BAR))
|
||||
mgr->io_base = tile->mem.vram.io_start + mgr->stolen_base;
|
||||
|
||||
/*
|
||||
* There may be few KB of platform dependent reserved memory at the end
|
||||
* of vram which is not part of the DSM. Such reserved memory portion is
|
||||
* always less then DSM granularity so align down the stolen_size to DSM
|
||||
* granularity to accommodate such reserve vram portion.
|
||||
*/
|
||||
return ALIGN_DOWN(stolen_size, SZ_1M);
|
||||
}
|
||||
|
||||
static u32 get_wopcm_size(struct xe_device *xe)
|
||||
{
|
||||
u32 wopcm_size;
|
||||
|
@ -112,6 +80,44 @@ static u32 get_wopcm_size(struct xe_device *xe)
|
|||
return wopcm_size;
|
||||
}
|
||||
|
||||
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, wopcm_size;
|
||||
u64 tile_offset;
|
||||
u64 tile_size;
|
||||
|
||||
tile_offset = tile->mem.vram.io_start - xe->mem.vram.io_start;
|
||||
tile_size = tile->mem.vram.actual_physical_size;
|
||||
|
||||
/* Use DSM base address instead for stolen memory */
|
||||
mgr->stolen_base = (xe_mmio_read64_2x32(mmio, DSMBASE) & BDSM_MASK) - tile_offset;
|
||||
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))
|
||||
mgr->io_base = tile->mem.vram.io_start + mgr->stolen_base;
|
||||
|
||||
/*
|
||||
* There may be few KB of platform dependent reserved memory at the end
|
||||
* of vram which is not part of the DSM. Such reserved memory portion is
|
||||
* always less then DSM granularity so align down the stolen_size to DSM
|
||||
* granularity to accommodate such reserve vram portion.
|
||||
*/
|
||||
return ALIGN_DOWN(stolen_size, SZ_1M);
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue