mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-12 01:20:14 +00:00
drm fixes for 6.15-rc1
bridge: - tda998x: Select CONFIG_DRM_KMS_HELPER amdgpu: - Guard against potential division by 0 in fan code - Zero RPM support for SMU 14.0.2 - Properly handle SI and CIK support being disabled - PSR fixes - DML2 fixes - DP Link training fix - Vblank fixes - RAS fixes - Partitioning fix - SDMA fix - SMU 13.0.x fixes - Rom fetching fix - MES fixes - Queue reset fix xe: - Fix NULL pointer dereference on error path - Add missing HW workaround for BMG - Fix survivability mode not triggering - Fix build warning when DRM_FBDEV_EMULATION is not set i915: - Bounds check for scalers in DSC prefill latency computation - Fix build by adding a missing include adp: - Fix error handling in plane setup -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmfwQ5wACgkQDHTzWXnE hr7OIxAAn8ATKOYsyxaq0t8+gj2jhmGC1L3X6tQUzSh3uAwZpWzYlP8RVMMS9WrL Cwj0kBLlq71GasuG/wjEnAxuoahEWebrwTm73it9yWXWW+GsQYhOcWttvmhNSVET aTUdB2VM32S0QHf8t6rP0yG4XqJD95sSNnXCTh6/ksk5rhK6NpqyJRkdVBIRxI5O IUXxfxmREIrAq5ZfpoPuVUEA2US2W9p+L616RnILewa3iZYzK9XahfcErFU8xlS+ 796ZaYFGEWUmdJKTyCejRHz5z1afXAgKO3vRyGKbLC4MAsxk6MsWzTXsH5EMukxF lCtJQuODFDed2gXxLUOeXAUjWoHrgYpJBWRk23Pq83Kx2sf85MD2SF2d8pGJqMa+ B0JYr/mFtZCi5xraHIH6rwx7k2+KqPVAl+P8f/Fye/AIxBUE3KoI43M69TQ3B2VD dG8Jz53DUVQ1TUGJjfZajninFfBdDlr9PgPLmp1gESjbGkI1azGXngwlaVK4kti+ iZmM/4pbB0A/+PG7Wq1DFEhr0fvQW2RjtgXoh+CujRLgK7ZYwVbCcFpmGQgjOiXb IyphOc7tPiOH1EcXGSsrV5JlkyhVL0Ghu6JCKQCzF5MXbrg1fwjjUwVuGtJyqtso kKBbx3bx7rv577VXRhM13s0MPwOyhgi56a4kBtX7YRJqY5cVkdM= =P/sW -----END PGP SIGNATURE----- Merge tag 'drm-next-2025-04-05' of https://gitlab.freedesktop.org/drm/kernel Pull drm fixes from Dave Airlie: "Weekly fixes, mostly from the end of last week, this week was very quiet, maybe you scared everyone away. It's mostly amdgpu, and xe, with some i915, adp and bridge bits, since I think this is overly quiet I'd expect rc2 to be a bit more lively. bridge: - tda998x: Select CONFIG_DRM_KMS_HELPER amdgpu: - Guard against potential division by 0 in fan code - Zero RPM support for SMU 14.0.2 - Properly handle SI and CIK support being disabled - PSR fixes - DML2 fixes - DP Link training fix - Vblank fixes - RAS fixes - Partitioning fix - SDMA fix - SMU 13.0.x fixes - Rom fetching fix - MES fixes - Queue reset fix xe: - Fix NULL pointer dereference on error path - Add missing HW workaround for BMG - Fix survivability mode not triggering - Fix build warning when DRM_FBDEV_EMULATION is not set i915: - Bounds check for scalers in DSC prefill latency computation - Fix build by adding a missing include adp: - Fix error handling in plane setup" # -----BEGIN PGP SIGNATURE----- * tag 'drm-next-2025-04-05' of https://gitlab.freedesktop.org/drm/kernel: (34 commits) drm/i2c: tda998x: select CONFIG_DRM_KMS_HELPER drm/amdgpu/gfx12: fix num_mec drm/amdgpu/gfx11: fix num_mec drm/amd/pm: Add gpu_metrics_v1_8 drm/amdgpu: Prefer shadow rom when available drm/amd/pm: Update smu metrics table for smu_v13_0_6 drm/amd/pm: Remove host limit metrics support Remove unnecessary firmware version check for gc v9_4_2 drm/amdgpu: stop unmapping MQD for kernel queues v3 Revert "drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA" drm/amdgpu: Parse all deferred errors with UMC aca handle drm/amdgpu: Update ta ras block drm/amdgpu: Add NPS2 to DPX compatible mode drm/amdgpu: Use correct gfx deferred error count drm/amd/display: Actually do immediate vblank disable drm/amd/display: prevent hang on link training fail Revert "drm/amd/display: dml2 soc dscclk use DPM table clk setting" drm/amd/display: Increase vblank offdelay for PSR panels drm/amd: Handle being compiled without SI or CIK support better drm/amd/pm: Add zero RPM enabled OD setting support for SMU14.0.2 ...
This commit is contained in:
commit
758e4c86a1
@ -232,9 +232,9 @@ static struct drm_plane *adp_plane_new(struct adp_drv_private *adp)
|
||||
ALL_CRTCS, &adp_plane_funcs,
|
||||
plane_formats, ARRAY_SIZE(plane_formats),
|
||||
NULL, DRM_PLANE_TYPE_PRIMARY, "plane");
|
||||
if (!plane) {
|
||||
if (IS_ERR(plane)) {
|
||||
drm_err(drm, "failed to allocate plane");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
return plane;
|
||||
}
|
||||
|
||||
drm_plane_helper_add(plane, &adp_plane_helper_funcs);
|
||||
|
||||
@ -195,6 +195,10 @@ static bool aca_bank_is_valid(struct aca_handle *handle, struct aca_bank *bank,
|
||||
{
|
||||
const struct aca_bank_ops *bank_ops = handle->bank_ops;
|
||||
|
||||
/* Parse all deferred errors with UMC aca handle */
|
||||
if (ACA_BANK_ERR_IS_DEFFERED(bank))
|
||||
return handle->hwip == ACA_HWIP_TYPE_UMC;
|
||||
|
||||
if (!aca_bank_hwip_is_matched(bank, handle->hwip))
|
||||
return false;
|
||||
|
||||
|
||||
@ -80,14 +80,6 @@ struct ras_query_context;
|
||||
(ACA_REG__STATUS__POISON((bank)->regs[ACA_REG_IDX_STATUS]) || \
|
||||
ACA_REG__STATUS__DEFERRED((bank)->regs[ACA_REG_IDX_STATUS]))
|
||||
|
||||
#define ACA_BANK_ERR_CE_DE_DECODE(bank) \
|
||||
(ACA_BANK_ERR_IS_DEFFERED(bank) ? ACA_ERROR_TYPE_DEFERRED : \
|
||||
ACA_ERROR_TYPE_CE)
|
||||
|
||||
#define ACA_BANK_ERR_UE_DE_DECODE(bank) \
|
||||
(ACA_BANK_ERR_IS_DEFFERED(bank) ? ACA_ERROR_TYPE_DEFERRED : \
|
||||
ACA_ERROR_TYPE_UE)
|
||||
|
||||
enum aca_reg_idx {
|
||||
ACA_REG_IDX_CTL = 0,
|
||||
ACA_REG_IDX_STATUS = 1,
|
||||
|
||||
@ -447,6 +447,13 @@ success:
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool amdgpu_prefer_rom_resource(struct amdgpu_device *adev)
|
||||
{
|
||||
struct resource *res = &adev->pdev->resource[PCI_ROM_RESOURCE];
|
||||
|
||||
return (res->flags & IORESOURCE_ROM_SHADOW);
|
||||
}
|
||||
|
||||
static bool amdgpu_get_bios_dgpu(struct amdgpu_device *adev)
|
||||
{
|
||||
if (amdgpu_atrm_get_bios(adev)) {
|
||||
@ -465,14 +472,27 @@ static bool amdgpu_get_bios_dgpu(struct amdgpu_device *adev)
|
||||
goto success;
|
||||
}
|
||||
|
||||
if (amdgpu_read_platform_bios(adev)) {
|
||||
dev_info(adev->dev, "Fetched VBIOS from platform\n");
|
||||
goto success;
|
||||
}
|
||||
if (amdgpu_prefer_rom_resource(adev)) {
|
||||
if (amdgpu_read_bios(adev)) {
|
||||
dev_info(adev->dev, "Fetched VBIOS from ROM BAR\n");
|
||||
goto success;
|
||||
}
|
||||
|
||||
if (amdgpu_read_bios(adev)) {
|
||||
dev_info(adev->dev, "Fetched VBIOS from ROM BAR\n");
|
||||
goto success;
|
||||
if (amdgpu_read_platform_bios(adev)) {
|
||||
dev_info(adev->dev, "Fetched VBIOS from platform\n");
|
||||
goto success;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (amdgpu_read_platform_bios(adev)) {
|
||||
dev_info(adev->dev, "Fetched VBIOS from platform\n");
|
||||
goto success;
|
||||
}
|
||||
|
||||
if (amdgpu_read_bios(adev)) {
|
||||
dev_info(adev->dev, "Fetched VBIOS from ROM BAR\n");
|
||||
goto success;
|
||||
}
|
||||
}
|
||||
|
||||
if (amdgpu_read_bios_from_rom(adev)) {
|
||||
|
||||
@ -1809,7 +1809,6 @@ static const u16 amdgpu_unsupported_pciidlist[] = {
|
||||
};
|
||||
|
||||
static const struct pci_device_id pciidlist[] = {
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
{0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
{0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
@ -1882,8 +1881,6 @@ static const struct pci_device_id pciidlist[] = {
|
||||
{0x1002, 0x6665, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
|
||||
{0x1002, 0x6667, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
|
||||
{0x1002, 0x666F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
|
||||
#endif
|
||||
#ifdef CONFIG_DRM_AMDGPU_CIK
|
||||
/* Kaveri */
|
||||
{0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
|
||||
{0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_APU},
|
||||
@ -1966,7 +1963,6 @@ static const struct pci_device_id pciidlist[] = {
|
||||
{0x1002, 0x985D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
|
||||
{0x1002, 0x985E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
|
||||
{0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
|
||||
#endif
|
||||
/* topaz */
|
||||
{0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
|
||||
{0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
|
||||
@ -2313,14 +2309,14 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
switch (flags & AMD_ASIC_MASK) {
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
case CHIP_HAINAN:
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
if (!amdgpu_si_support) {
|
||||
switch (flags & AMD_ASIC_MASK) {
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
case CHIP_HAINAN:
|
||||
if (!amdgpu_si_support) {
|
||||
dev_info(&pdev->dev,
|
||||
"SI support provided by radeon.\n");
|
||||
dev_info(&pdev->dev,
|
||||
@ -2328,16 +2324,18 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
|
||||
);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#else
|
||||
dev_info(&pdev->dev, "amdgpu is built without SI support.\n");
|
||||
return -ENODEV;
|
||||
#endif
|
||||
case CHIP_KAVERI:
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
#ifdef CONFIG_DRM_AMDGPU_CIK
|
||||
if (!amdgpu_cik_support) {
|
||||
switch (flags & AMD_ASIC_MASK) {
|
||||
case CHIP_KAVERI:
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
if (!amdgpu_cik_support) {
|
||||
dev_info(&pdev->dev,
|
||||
"CIK support provided by radeon.\n");
|
||||
dev_info(&pdev->dev,
|
||||
@ -2345,8 +2343,14 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
|
||||
);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#else
|
||||
dev_info(&pdev->dev, "amdgpu is built without CIK support.\n");
|
||||
return -ENODEV;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
adev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_kms_driver, typeof(*adev), ddev);
|
||||
if (IS_ERR(adev))
|
||||
|
||||
@ -77,6 +77,7 @@ const char *ras_block_string[] = {
|
||||
"jpeg",
|
||||
"ih",
|
||||
"mpio",
|
||||
"mmsch",
|
||||
};
|
||||
|
||||
const char *ras_mca_block_string[] = {
|
||||
|
||||
@ -98,6 +98,7 @@ enum amdgpu_ras_block {
|
||||
AMDGPU_RAS_BLOCK__JPEG,
|
||||
AMDGPU_RAS_BLOCK__IH,
|
||||
AMDGPU_RAS_BLOCK__MPIO,
|
||||
AMDGPU_RAS_BLOCK__MMSCH,
|
||||
|
||||
AMDGPU_RAS_BLOCK__LAST,
|
||||
AMDGPU_RAS_BLOCK__ANY = -1
|
||||
@ -795,6 +796,12 @@ amdgpu_ras_block_to_ta(enum amdgpu_ras_block block) {
|
||||
return TA_RAS_BLOCK__VCN;
|
||||
case AMDGPU_RAS_BLOCK__JPEG:
|
||||
return TA_RAS_BLOCK__JPEG;
|
||||
case AMDGPU_RAS_BLOCK__IH:
|
||||
return TA_RAS_BLOCK__IH;
|
||||
case AMDGPU_RAS_BLOCK__MPIO:
|
||||
return TA_RAS_BLOCK__MPIO;
|
||||
case AMDGPU_RAS_BLOCK__MMSCH:
|
||||
return TA_RAS_BLOCK__MMSCH;
|
||||
default:
|
||||
WARN_ONCE(1, "RAS ERROR: unexpected block id %d\n", block);
|
||||
return TA_RAS_BLOCK__UMC;
|
||||
|
||||
@ -608,59 +608,17 @@ static ssize_t amdgpu_debugfs_mqd_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_ring *ring = file_inode(f)->i_private;
|
||||
volatile u32 *mqd;
|
||||
u32 *kbuf;
|
||||
int r, i;
|
||||
uint32_t value, result;
|
||||
ssize_t bytes = min_t(ssize_t, ring->mqd_size - *pos, size);
|
||||
void *from = ((u8 *)ring->mqd_ptr) + *pos;
|
||||
|
||||
if (*pos & 3 || size & 3)
|
||||
return -EINVAL;
|
||||
if (*pos > ring->mqd_size)
|
||||
return 0;
|
||||
|
||||
kbuf = kmalloc(ring->mqd_size, GFP_KERNEL);
|
||||
if (!kbuf)
|
||||
return -ENOMEM;
|
||||
if (copy_to_user(buf, from, bytes))
|
||||
return -EFAULT;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto err_free;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&mqd);
|
||||
if (r)
|
||||
goto err_unreserve;
|
||||
|
||||
/*
|
||||
* Copy to local buffer to avoid put_user(), which might fault
|
||||
* and acquire mmap_sem, under reservation_ww_class_mutex.
|
||||
*/
|
||||
for (i = 0; i < ring->mqd_size/sizeof(u32); i++)
|
||||
kbuf[i] = mqd[i];
|
||||
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
|
||||
result = 0;
|
||||
while (size) {
|
||||
if (*pos >= ring->mqd_size)
|
||||
break;
|
||||
|
||||
value = kbuf[*pos/4];
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
goto err_free;
|
||||
buf += 4;
|
||||
result += 4;
|
||||
size -= 4;
|
||||
*pos += 4;
|
||||
}
|
||||
|
||||
kfree(kbuf);
|
||||
return result;
|
||||
|
||||
err_unreserve:
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
err_free:
|
||||
kfree(kbuf);
|
||||
return r;
|
||||
*pos += bytes;
|
||||
return bytes;
|
||||
}
|
||||
|
||||
static const struct file_operations amdgpu_debugfs_mqd_fops = {
|
||||
|
||||
@ -1172,7 +1172,7 @@ static int xgmi_v6_4_0_aca_bank_parser(struct aca_handle *handle, struct aca_ban
|
||||
break;
|
||||
case ACA_SMU_TYPE_CE:
|
||||
count = ext_error_code == 6 ? count : 0ULL;
|
||||
bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_CE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type, count);
|
||||
break;
|
||||
default:
|
||||
|
||||
@ -473,7 +473,8 @@ static int aqua_vanjaram_get_xcp_res_info(struct amdgpu_xcp_mgr *xcp_mgr,
|
||||
break;
|
||||
case AMDGPU_DPX_PARTITION_MODE:
|
||||
num_xcp = 2;
|
||||
nps_modes = BIT(AMDGPU_NPS1_PARTITION_MODE);
|
||||
nps_modes = BIT(AMDGPU_NPS1_PARTITION_MODE) |
|
||||
BIT(AMDGPU_NPS2_PARTITION_MODE);
|
||||
break;
|
||||
case AMDGPU_TPX_PARTITION_MODE:
|
||||
num_xcp = 3;
|
||||
|
||||
@ -6851,22 +6851,9 @@ static int gfx_v10_0_kgq_init_queue(struct amdgpu_ring *ring, bool reset)
|
||||
static int gfx_v10_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
int r, i;
|
||||
struct amdgpu_ring *ring;
|
||||
|
||||
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
|
||||
ring = &adev->gfx.gfx_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v10_0_kgq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v10_0_kgq_init_queue(&adev->gfx.gfx_ring[i], false);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
@ -7173,55 +7160,24 @@ static int gfx_v10_0_kcq_init_queue(struct amdgpu_ring *ring, bool restore)
|
||||
|
||||
static int gfx_v10_0_kiq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
int r;
|
||||
|
||||
ring = &adev->gfx.kiq[0].ring;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (unlikely(r != 0)) {
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v10_0_kiq_init_queue(ring);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
gfx_v10_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v10_0_kcq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
int r = 0, i;
|
||||
int i, r;
|
||||
|
||||
gfx_v10_0_cp_compute_enable(adev, true);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v10_0_kcq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v10_0_kcq_init_queue(&adev->gfx.compute_ring[i],
|
||||
false);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_gfx_enable_kcq(adev, 0);
|
||||
done:
|
||||
return r;
|
||||
return amdgpu_gfx_enable_kcq(adev, 0);
|
||||
}
|
||||
|
||||
static int gfx_v10_0_cp_resume(struct amdgpu_device *adev)
|
||||
@ -9579,20 +9535,9 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)) {
|
||||
DRM_ERROR("fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v10_0_kgq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v10_0_kgq_init_queue(ring, true);
|
||||
if (r) {
|
||||
DRM_ERROR("fail to unresv mqd_obj\n");
|
||||
DRM_ERROR("fail to init kgq\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -9649,20 +9594,9 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)) {
|
||||
dev_err(adev->dev, "fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v10_0_kcq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v10_0_kcq_init_queue(ring, true);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "fail to init kcq\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
@ -1581,7 +1581,7 @@ static int gfx_v11_0_sw_init(struct amdgpu_ip_block *ip_block)
|
||||
adev->gfx.me.num_me = 1;
|
||||
adev->gfx.me.num_pipe_per_me = 1;
|
||||
adev->gfx.me.num_queue_per_pipe = 1;
|
||||
adev->gfx.mec.num_mec = 2;
|
||||
adev->gfx.mec.num_mec = 1;
|
||||
adev->gfx.mec.num_pipe_per_mec = 4;
|
||||
adev->gfx.mec.num_queue_per_pipe = 4;
|
||||
break;
|
||||
@ -4115,22 +4115,9 @@ static int gfx_v11_0_kgq_init_queue(struct amdgpu_ring *ring, bool reset)
|
||||
static int gfx_v11_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
int r, i;
|
||||
struct amdgpu_ring *ring;
|
||||
|
||||
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
|
||||
ring = &adev->gfx.gfx_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v11_0_kgq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v11_0_kgq_init_queue(&adev->gfx.gfx_ring[i], false);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
@ -4452,57 +4439,24 @@ static int gfx_v11_0_kcq_init_queue(struct amdgpu_ring *ring, bool reset)
|
||||
|
||||
static int gfx_v11_0_kiq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
int r;
|
||||
|
||||
ring = &adev->gfx.kiq[0].ring;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (unlikely(r != 0)) {
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v11_0_kiq_init_queue(ring);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
ring->sched.ready = true;
|
||||
gfx_v11_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v11_0_kcq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
int r = 0, i;
|
||||
int i, r;
|
||||
|
||||
if (!amdgpu_async_gfx_ring)
|
||||
gfx_v11_0_cp_compute_enable(adev, true);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v11_0_kcq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v11_0_kcq_init_queue(&adev->gfx.compute_ring[i], false);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_gfx_enable_kcq(adev, 0);
|
||||
done:
|
||||
return r;
|
||||
return amdgpu_gfx_enable_kcq(adev, 0);
|
||||
}
|
||||
|
||||
static int gfx_v11_0_cp_resume(struct amdgpu_device *adev)
|
||||
@ -6667,20 +6621,9 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)) {
|
||||
dev_err(adev->dev, "fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v11_0_kgq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v11_0_kgq_init_queue(ring, true);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "failed to init kgq\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -6707,20 +6650,9 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring, unsigned int vmid)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)) {
|
||||
dev_err(adev->dev, "fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v11_0_kcq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v11_0_kcq_init_queue(ring, true);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "fail to init kcq\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_mes_map_legacy_queue(adev, ring);
|
||||
|
||||
@ -1355,7 +1355,7 @@ static int gfx_v12_0_sw_init(struct amdgpu_ip_block *ip_block)
|
||||
adev->gfx.me.num_me = 1;
|
||||
adev->gfx.me.num_pipe_per_me = 1;
|
||||
adev->gfx.me.num_queue_per_pipe = 1;
|
||||
adev->gfx.mec.num_mec = 2;
|
||||
adev->gfx.mec.num_mec = 1;
|
||||
adev->gfx.mec.num_pipe_per_mec = 2;
|
||||
adev->gfx.mec.num_queue_per_pipe = 4;
|
||||
break;
|
||||
@ -3001,37 +3001,19 @@ static int gfx_v12_0_kgq_init_queue(struct amdgpu_ring *ring, bool reset)
|
||||
|
||||
static int gfx_v12_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
int r, i;
|
||||
struct amdgpu_ring *ring;
|
||||
int i, r;
|
||||
|
||||
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
|
||||
ring = &adev->gfx.gfx_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v12_0_kgq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v12_0_kgq_init_queue(&adev->gfx.gfx_ring[i], false);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_gfx_enable_kgq(adev, 0);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
|
||||
r = gfx_v12_0_cp_gfx_start(adev);
|
||||
if (r)
|
||||
goto done;
|
||||
|
||||
done:
|
||||
return r;
|
||||
return gfx_v12_0_cp_gfx_start(adev);
|
||||
}
|
||||
|
||||
static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m,
|
||||
@ -3344,57 +3326,25 @@ static int gfx_v12_0_kcq_init_queue(struct amdgpu_ring *ring, bool reset)
|
||||
|
||||
static int gfx_v12_0_kiq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
int r;
|
||||
|
||||
ring = &adev->gfx.kiq[0].ring;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (unlikely(r != 0)) {
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v12_0_kiq_init_queue(ring);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
ring->sched.ready = true;
|
||||
gfx_v12_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
|
||||
adev->gfx.kiq[0].ring.sched.ready = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v12_0_kcq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
int r = 0, i;
|
||||
int i, r;
|
||||
|
||||
if (!amdgpu_async_gfx_ring)
|
||||
gfx_v12_0_cp_compute_enable(adev, true);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v12_0_kcq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v12_0_kcq_init_queue(&adev->gfx.compute_ring[i], false);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_gfx_enable_kcq(adev, 0);
|
||||
done:
|
||||
return r;
|
||||
return amdgpu_gfx_enable_kcq(adev, 0);
|
||||
}
|
||||
|
||||
static int gfx_v12_0_cp_resume(struct amdgpu_device *adev)
|
||||
@ -5224,20 +5174,9 @@ static int gfx_v12_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)) {
|
||||
dev_err(adev->dev, "fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v12_0_kgq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v12_0_kgq_init_queue(ring, true);
|
||||
if (r) {
|
||||
DRM_ERROR("fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "failed to init kgq\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -5264,20 +5203,9 @@ static int gfx_v12_0_reset_kcq(struct amdgpu_ring *ring, unsigned int vmid)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)) {
|
||||
DRM_ERROR("fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v12_0_kcq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v12_0_kcq_init_queue(ring, true);
|
||||
if (r) {
|
||||
DRM_ERROR("fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "failed to init kcq\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_mes_map_legacy_queue(adev, ring);
|
||||
|
||||
@ -4683,60 +4683,25 @@ static void gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device *adev)
|
||||
|
||||
static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
int r;
|
||||
|
||||
ring = &adev->gfx.kiq[0].ring;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr);
|
||||
if (unlikely(r != 0)) {
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v8_0_kiq_init_queue(ring);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
gfx_v8_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v8_0_kcq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
int r = 0, i;
|
||||
int i, r;
|
||||
|
||||
gfx_v8_0_cp_compute_enable(adev, true);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v8_0_kcq_init_queue(ring);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v8_0_kcq_init_queue(&adev->gfx.compute_ring[i]);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v8_0_set_mec_doorbell_range(adev);
|
||||
|
||||
r = gfx_v8_0_kiq_kcq_enable(adev);
|
||||
if (r)
|
||||
goto done;
|
||||
|
||||
done:
|
||||
return r;
|
||||
return gfx_v8_0_kiq_kcq_enable(adev);
|
||||
}
|
||||
|
||||
static int gfx_v8_0_cp_test_all_rings(struct amdgpu_device *adev)
|
||||
|
||||
@ -1269,6 +1269,7 @@ static void gfx_v9_0_check_fw_write_wait(struct amdgpu_device *adev)
|
||||
adev->gfx.mec_fw_write_wait = false;
|
||||
|
||||
if ((amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 1)) &&
|
||||
(amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 2)) &&
|
||||
((adev->gfx.mec_fw_version < 0x000001a5) ||
|
||||
(adev->gfx.mec_feature_version < 46) ||
|
||||
(adev->gfx.pfp_fw_version < 0x000000b7) ||
|
||||
@ -3890,55 +3891,23 @@ static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring, bool restore)
|
||||
|
||||
static int gfx_v9_0_kiq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
int r;
|
||||
|
||||
ring = &adev->gfx.kiq[0].ring;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (unlikely(r != 0)) {
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v9_0_kiq_init_queue(ring);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
gfx_v9_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v9_0_kcq_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
int r = 0, i;
|
||||
int i, r;
|
||||
|
||||
gfx_v9_0_cp_compute_enable(adev, true);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v9_0_kcq_init_queue(ring, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v9_0_kcq_init_queue(&adev->gfx.compute_ring[i], false);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_gfx_enable_kcq(adev, 0);
|
||||
done:
|
||||
return r;
|
||||
return amdgpu_gfx_enable_kcq(adev, 0);
|
||||
}
|
||||
|
||||
static int gfx_v9_0_cp_resume(struct amdgpu_device *adev)
|
||||
@ -7319,20 +7288,9 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)){
|
||||
dev_err(adev->dev, "fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v9_0_kcq_init_queue(ring, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v9_0_kcq_init_queue(ring, true);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "fail to init kcq\n");
|
||||
return r;
|
||||
}
|
||||
spin_lock_irqsave(&kiq->ring_lock, flags);
|
||||
|
||||
@ -867,13 +867,12 @@ static int gfx_v9_4_3_aca_bank_parser(struct aca_handle *handle,
|
||||
|
||||
switch (type) {
|
||||
case ACA_SMU_TYPE_UE:
|
||||
bank->aca_err_type = ACA_BANK_ERR_UE_DE_DECODE(bank);
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_UE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type, 1ULL);
|
||||
break;
|
||||
case ACA_SMU_TYPE_CE:
|
||||
bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
|
||||
ret = aca_error_cache_log_bank_error(handle, &info,
|
||||
bank->aca_err_type,
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_CE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
|
||||
ACA_REG__MISC0__ERRCNT(misc0));
|
||||
break;
|
||||
default:
|
||||
@ -2168,55 +2167,27 @@ static int gfx_v9_4_3_xcc_kcq_fini_register(struct amdgpu_device *adev, int xcc_
|
||||
|
||||
static int gfx_v9_4_3_xcc_kiq_resume(struct amdgpu_device *adev, int xcc_id)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
int r;
|
||||
|
||||
ring = &adev->gfx.kiq[xcc_id].ring;
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (unlikely(r != 0)) {
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
return r;
|
||||
}
|
||||
|
||||
gfx_v9_4_3_xcc_kiq_init_queue(ring, xcc_id);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
gfx_v9_4_3_xcc_kiq_init_queue(&adev->gfx.kiq[xcc_id].ring, xcc_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v9_4_3_xcc_kcq_resume(struct amdgpu_device *adev, int xcc_id)
|
||||
{
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
int r = 0, i;
|
||||
struct amdgpu_ring *ring;
|
||||
int i, r;
|
||||
|
||||
gfx_v9_4_3_xcc_cp_compute_enable(adev, true, xcc_id);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i + xcc_id * adev->gfx.num_compute_rings];
|
||||
ring = &adev->gfx.compute_ring[i + xcc_id *
|
||||
adev->gfx.num_compute_rings];
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0))
|
||||
goto done;
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v9_4_3_xcc_kcq_init_queue(ring, xcc_id, false);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v9_4_3_xcc_kcq_init_queue(ring, xcc_id, false);
|
||||
if (r)
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_gfx_enable_kcq(adev, xcc_id);
|
||||
done:
|
||||
return r;
|
||||
return amdgpu_gfx_enable_kcq(adev, xcc_id);
|
||||
}
|
||||
|
||||
static int gfx_v9_4_3_xcc_cp_resume(struct amdgpu_device *adev, int xcc_id)
|
||||
@ -3588,20 +3559,9 @@ pipe_reset:
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_bo_reserve(ring->mqd_obj, false);
|
||||
if (unlikely(r != 0)){
|
||||
dev_err(adev->dev, "fail to resv mqd_obj\n");
|
||||
return r;
|
||||
}
|
||||
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
|
||||
if (!r) {
|
||||
r = gfx_v9_4_3_xcc_kcq_init_queue(ring, ring->xcc_id, true);
|
||||
amdgpu_bo_kunmap(ring->mqd_obj);
|
||||
ring->mqd_ptr = NULL;
|
||||
}
|
||||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
r = gfx_v9_4_3_xcc_kcq_init_queue(ring, ring->xcc_id, true);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "fail to unresv mqd_obj\n");
|
||||
dev_err(adev->dev, "fail to init kcq\n");
|
||||
return r;
|
||||
}
|
||||
spin_lock_irqsave(&kiq->ring_lock, flags);
|
||||
|
||||
@ -1328,7 +1328,7 @@ static int jpeg_v4_0_3_aca_bank_parser(struct aca_handle *handle, struct aca_ban
|
||||
1ULL);
|
||||
break;
|
||||
case ACA_SMU_TYPE_CE:
|
||||
bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_CE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
|
||||
ACA_REG__MISC0__ERRCNT(misc0));
|
||||
break;
|
||||
|
||||
@ -751,7 +751,7 @@ static int mmhub_v1_8_aca_bank_parser(struct aca_handle *handle, struct aca_bank
|
||||
1ULL);
|
||||
break;
|
||||
case ACA_SMU_TYPE_CE:
|
||||
bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_CE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
|
||||
ACA_REG__MISC0__ERRCNT(misc0));
|
||||
break;
|
||||
|
||||
@ -31,7 +31,6 @@
|
||||
#include "amdgpu_ucode.h"
|
||||
#include "amdgpu_trace.h"
|
||||
#include "amdgpu_reset.h"
|
||||
#include "gc/gc_9_0_sh_mask.h"
|
||||
|
||||
#include "sdma/sdma_4_4_2_offset.h"
|
||||
#include "sdma/sdma_4_4_2_sh_mask.h"
|
||||
@ -1291,71 +1290,21 @@ static void sdma_v4_4_2_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
|
||||
seq, 0xffffffff, 4);
|
||||
}
|
||||
|
||||
/*
|
||||
* sdma_v4_4_2_get_invalidate_req - Construct the VM_INVALIDATE_ENG0_REQ register value
|
||||
* @vmid: The VMID to invalidate
|
||||
* @flush_type: The type of flush (0 = legacy, 1 = lightweight, 2 = heavyweight)
|
||||
|
||||
/**
|
||||
* sdma_v4_4_2_ring_emit_vm_flush - vm flush using sDMA
|
||||
*
|
||||
* This function constructs the VM_INVALIDATE_ENG0_REQ register value for the specified VMID
|
||||
* and flush type. It ensures that all relevant page table cache levels (L1 PTEs, L2 PTEs, and
|
||||
* L2 PDEs) are invalidated.
|
||||
*/
|
||||
static uint32_t sdma_v4_4_2_get_invalidate_req(unsigned int vmid,
|
||||
uint32_t flush_type)
|
||||
{
|
||||
u32 req = 0;
|
||||
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ,
|
||||
PER_VMID_INVALIDATE_REQ, 1 << vmid);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, flush_type);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1);
|
||||
req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ,
|
||||
CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0);
|
||||
|
||||
return req;
|
||||
}
|
||||
|
||||
/*
|
||||
* sdma_v4_4_2_ring_emit_vm_flush - Emit VM flush commands for SDMA
|
||||
* @ring: The SDMA ring
|
||||
* @vmid: The VMID to flush
|
||||
* @pd_addr: The page directory address
|
||||
* @ring: amdgpu_ring pointer
|
||||
* @vmid: vmid number to use
|
||||
* @pd_addr: address
|
||||
*
|
||||
* This function emits the necessary register writes and waits to perform a VM flush for the
|
||||
* specified VMID. It updates the PTB address registers and issues a VM invalidation request
|
||||
* using the specified VM invalidation engine.
|
||||
* Update the page table base and flush the VM TLB
|
||||
* using sDMA.
|
||||
*/
|
||||
static void sdma_v4_4_2_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
unsigned int vmid, uint64_t pd_addr)
|
||||
unsigned vmid, uint64_t pd_addr)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
uint32_t req = sdma_v4_4_2_get_invalidate_req(vmid, 0);
|
||||
unsigned int eng = ring->vm_inv_eng;
|
||||
struct amdgpu_vmhub *hub = &adev->vmhub[ring->vm_hub];
|
||||
|
||||
amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 +
|
||||
(hub->ctx_addr_distance * vmid),
|
||||
lower_32_bits(pd_addr));
|
||||
|
||||
amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 +
|
||||
(hub->ctx_addr_distance * vmid),
|
||||
upper_32_bits(pd_addr));
|
||||
/*
|
||||
* Construct and emit the VM invalidation packet
|
||||
*/
|
||||
amdgpu_ring_write(ring,
|
||||
SDMA_PKT_VM_INVALIDATION_HEADER_OP(SDMA_OP_VM_INVALIDATE) |
|
||||
SDMA_PKT_VM_INVALIDATION_HEADER_SUB_OP(SDMA_SUBOP_VM_INVALIDATE) |
|
||||
SDMA_PKT_VM_INVALIDATION_HEADER_XCC0_ENG_ID(0x1f) |
|
||||
SDMA_PKT_VM_INVALIDATION_HEADER_XCC1_ENG_ID(0x1f) |
|
||||
SDMA_PKT_VM_INVALIDATION_HEADER_MMHUB_ENG_ID(eng));
|
||||
amdgpu_ring_write(ring, SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_INVALIDATEREQ(req));
|
||||
amdgpu_ring_write(ring, 0);
|
||||
amdgpu_ring_write(ring, SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_INVALIDATEACK(BIT(vmid)));
|
||||
amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
|
||||
}
|
||||
|
||||
static void sdma_v4_4_2_ring_emit_wreg(struct amdgpu_ring *ring,
|
||||
@ -2177,7 +2126,8 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_ring_funcs = {
|
||||
3 + /* hdp invalidate */
|
||||
6 + /* sdma_v4_4_2_ring_emit_pipeline_sync */
|
||||
/* sdma_v4_4_2_ring_emit_vm_flush */
|
||||
4 + 2 * 3 +
|
||||
SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +
|
||||
SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 +
|
||||
10 + 10 + 10, /* sdma_v4_4_2_ring_emit_fence x3 for user fence, vm fence */
|
||||
.emit_ib_size = 7 + 6, /* sdma_v4_4_2_ring_emit_ib */
|
||||
.emit_ib = sdma_v4_4_2_ring_emit_ib,
|
||||
@ -2209,7 +2159,8 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_page_ring_funcs = {
|
||||
3 + /* hdp invalidate */
|
||||
6 + /* sdma_v4_4_2_ring_emit_pipeline_sync */
|
||||
/* sdma_v4_4_2_ring_emit_vm_flush */
|
||||
4 + 2 * 3 +
|
||||
SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +
|
||||
SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 +
|
||||
10 + 10 + 10, /* sdma_v4_4_2_ring_emit_fence x3 for user fence, vm fence */
|
||||
.emit_ib_size = 7 + 6, /* sdma_v4_4_2_ring_emit_ib */
|
||||
.emit_ib = sdma_v4_4_2_ring_emit_ib,
|
||||
@ -2595,7 +2546,7 @@ static int sdma_v4_4_2_aca_bank_parser(struct aca_handle *handle, struct aca_ban
|
||||
1ULL);
|
||||
break;
|
||||
case ACA_SMU_TYPE_CE:
|
||||
bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_CE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
|
||||
ACA_REG__MISC0__ERRCNT(misc0));
|
||||
break;
|
||||
|
||||
@ -92,6 +92,9 @@ enum ta_ras_block {
|
||||
TA_RAS_BLOCK__MCA,
|
||||
TA_RAS_BLOCK__VCN,
|
||||
TA_RAS_BLOCK__JPEG,
|
||||
TA_RAS_BLOCK__IH,
|
||||
TA_RAS_BLOCK__MPIO,
|
||||
TA_RAS_BLOCK__MMSCH,
|
||||
TA_NUM_BLOCK_MAX
|
||||
};
|
||||
|
||||
|
||||
@ -85,7 +85,8 @@ bool umc_v12_0_is_deferred_error(struct amdgpu_device *adev, uint64_t mc_umc_sta
|
||||
|
||||
return (amdgpu_ras_is_poison_mode_supported(adev) &&
|
||||
(REG_GET_FIELD(mc_umc_status, MCA_UMC_UMC0_MCUMC_STATUST0, Val) == 1) &&
|
||||
(REG_GET_FIELD(mc_umc_status, MCA_UMC_UMC0_MCUMC_STATUST0, Deferred) == 1));
|
||||
((REG_GET_FIELD(mc_umc_status, MCA_UMC_UMC0_MCUMC_STATUST0, Deferred) == 1) ||
|
||||
(REG_GET_FIELD(mc_umc_status, MCA_UMC_UMC0_MCUMC_STATUST0, Poison) == 1)));
|
||||
}
|
||||
|
||||
bool umc_v12_0_is_uncorrectable_error(struct amdgpu_device *adev, uint64_t mc_umc_status)
|
||||
|
||||
@ -1965,7 +1965,7 @@ static int vcn_v4_0_3_aca_bank_parser(struct aca_handle *handle, struct aca_bank
|
||||
1ULL);
|
||||
break;
|
||||
case ACA_SMU_TYPE_CE:
|
||||
bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
|
||||
bank->aca_err_type = ACA_ERROR_TYPE_CE;
|
||||
ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
|
||||
ACA_REG__MISC0__ERRCNT(misc0));
|
||||
break;
|
||||
|
||||
@ -64,9 +64,6 @@
|
||||
#define HEADER_BARRIER 5
|
||||
#define SDMA_OP_AQL_COPY 0
|
||||
#define SDMA_OP_AQL_BARRIER_OR 0
|
||||
/* vm invalidation is only available for GC9.4.3/GC9.4.4/GC9.5.0 */
|
||||
#define SDMA_OP_VM_INVALIDATE 8
|
||||
#define SDMA_SUBOP_VM_INVALIDATE 4
|
||||
|
||||
/*define for op field*/
|
||||
#define SDMA_PKT_HEADER_op_offset 0
|
||||
@ -3334,72 +3331,5 @@
|
||||
#define SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift 0
|
||||
#define SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32(x) (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift)
|
||||
|
||||
/*
|
||||
** Definitions for SDMA_PKT_VM_INVALIDATION packet
|
||||
*/
|
||||
|
||||
/*define for HEADER word*/
|
||||
/*define for op field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_op_offset 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_op_mask 0x000000FF
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_op_shift 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_OP(x) ((x & SDMA_PKT_VM_INVALIDATION_HEADER_op_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_op_shift)
|
||||
|
||||
/*define for sub_op field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_offset 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_mask 0x000000FF
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_shift 8
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_SUB_OP(x) ((x & SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_shift)
|
||||
|
||||
/*define for xcc0_eng_id field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_xcc0_eng_id_offset 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_xcc0_eng_id_mask 0x0000001F
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_xcc0_eng_id_shift 16
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_XCC0_ENG_ID(x) ((x & SDMA_PKT_VM_INVALIDATION_HEADER_xcc0_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_xcc0_eng_id_shift)
|
||||
|
||||
/*define for xcc1_eng_id field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_xcc1_eng_id_offset 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_xcc1_eng_id_mask 0x0000001F
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_xcc1_eng_id_shift 21
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_XCC1_ENG_ID(x) ((x & SDMA_PKT_VM_INVALIDATION_HEADER_xcc1_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_xcc1_eng_id_shift)
|
||||
|
||||
/*define for mmhub_eng_id field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_mmhub_eng_id_offset 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_mmhub_eng_id_mask 0x0000001F
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_mmhub_eng_id_shift 26
|
||||
#define SDMA_PKT_VM_INVALIDATION_HEADER_MMHUB_ENG_ID(x) ((x & SDMA_PKT_VM_INVALIDATION_HEADER_mmhub_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_mmhub_eng_id_shift)
|
||||
|
||||
/*define for INVALIDATEREQ word*/
|
||||
/*define for invalidatereq field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_offset 1
|
||||
#define SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_mask 0xFFFFFFFF
|
||||
#define SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_shift 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_INVALIDATEREQ(x) ((x & SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_mask) << SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_shift)
|
||||
|
||||
/*define for ADDRESSRANGELO word*/
|
||||
/*define for addressrangelo field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_offset 2
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_mask 0xFFFFFFFF
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_shift 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_ADDRESSRANGELO(x) ((x & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_shift)
|
||||
|
||||
/*define for ADDRESSRANGEHI word*/
|
||||
/*define for invalidateack field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_offset 3
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_mask 0x0000FFFF
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_shift 0
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_INVALIDATEACK(x) ((x & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_shift)
|
||||
|
||||
/*define for addressrangehi field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_offset 3
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_mask 0x0000001F
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_shift 16
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_ADDRESSRANGEHI(x) ((x & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_shift)
|
||||
|
||||
/*define for reserved field*/
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_offset 3
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_mask 0x000001FF
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_shift 23
|
||||
#define SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_RESERVED(x) ((x & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_shift)
|
||||
|
||||
#endif /* __SDMA_PKT_OPEN_H_ */
|
||||
|
||||
@ -8707,14 +8707,39 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,
|
||||
int offdelay;
|
||||
|
||||
if (acrtc_state) {
|
||||
if (amdgpu_ip_version(adev, DCE_HWIP, 0) <
|
||||
IP_VERSION(3, 5, 0) ||
|
||||
acrtc_state->stream->link->psr_settings.psr_version <
|
||||
DC_PSR_VERSION_UNSUPPORTED ||
|
||||
!(adev->flags & AMD_IS_APU)) {
|
||||
timing = &acrtc_state->stream->timing;
|
||||
timing = &acrtc_state->stream->timing;
|
||||
|
||||
/* at least 2 frames */
|
||||
/*
|
||||
* Depending on when the HW latching event of double-buffered
|
||||
* registers happen relative to the PSR SDP deadline, and how
|
||||
* bad the Panel clock has drifted since the last ALPM off
|
||||
* event, there can be up to 3 frames of delay between sending
|
||||
* the PSR exit cmd to DMUB fw, and when the panel starts
|
||||
* displaying live frames.
|
||||
*
|
||||
* We can set:
|
||||
*
|
||||
* 20/100 * offdelay_ms = 3_frames_ms
|
||||
* => offdelay_ms = 5 * 3_frames_ms
|
||||
*
|
||||
* This ensures that `3_frames_ms` will only be experienced as a
|
||||
* 20% delay on top how long the display has been static, and
|
||||
* thus make the delay less perceivable.
|
||||
*/
|
||||
if (acrtc_state->stream->link->psr_settings.psr_version <
|
||||
DC_PSR_VERSION_UNSUPPORTED) {
|
||||
offdelay = DIV64_U64_ROUND_UP((u64)5 * 3 * 10 *
|
||||
timing->v_total *
|
||||
timing->h_total,
|
||||
timing->pix_clk_100hz);
|
||||
config.offdelay_ms = offdelay ?: 30;
|
||||
} else if (amdgpu_ip_version(adev, DCE_HWIP, 0) <
|
||||
IP_VERSION(3, 5, 0) ||
|
||||
!(adev->flags & AMD_IS_APU)) {
|
||||
/*
|
||||
* Older HW and DGPU have issues with instant off;
|
||||
* use a 2 frame offdelay.
|
||||
*/
|
||||
offdelay = DIV64_U64_ROUND_UP((u64)20 *
|
||||
timing->v_total *
|
||||
timing->h_total,
|
||||
@ -8722,6 +8747,8 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,
|
||||
|
||||
config.offdelay_ms = offdelay ?: 30;
|
||||
} else {
|
||||
/* offdelay_ms = 0 will never disable vblank */
|
||||
config.offdelay_ms = 1;
|
||||
config.disable_immediate = true;
|
||||
}
|
||||
|
||||
|
||||
@ -590,11 +590,11 @@ void dml2_init_soc_states(struct dml2_context *dml2, const struct dc *in_dc,
|
||||
p->out_states->state_array[i].dtbclk_mhz = max_dtbclk_mhz;
|
||||
p->out_states->state_array[i].phyclk_mhz = max_phyclk_mhz;
|
||||
|
||||
p->out_states->state_array[i].dscclk_mhz = max_dispclk_mhz / 3.0;
|
||||
p->out_states->state_array[i].phyclk_mhz = max_phyclk_mhz;
|
||||
p->out_states->state_array[i].dtbclk_mhz = max_dtbclk_mhz;
|
||||
|
||||
/* Dependent states. */
|
||||
p->out_states->state_array[i].dscclk_mhz = p->in_states->state_array[i].dscclk_mhz;
|
||||
p->out_states->state_array[i].dram_speed_mts = p->in_states->state_array[i].dram_speed_mts;
|
||||
p->out_states->state_array[i].fabricclk_mhz = p->in_states->state_array[i].fabricclk_mhz;
|
||||
p->out_states->state_array[i].socclk_mhz = p->in_states->state_array[i].socclk_mhz;
|
||||
|
||||
@ -3033,7 +3033,11 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx)
|
||||
dccg->funcs->set_dpstreamclk(dccg, DTBCLK0, tg->inst, dp_hpo_inst);
|
||||
|
||||
phyd32clk = get_phyd32clk_src(link);
|
||||
dccg->funcs->enable_symclk32_se(dccg, dp_hpo_inst, phyd32clk);
|
||||
if (link->cur_link_settings.link_rate == LINK_RATE_UNKNOWN) {
|
||||
dccg->funcs->disable_symclk32_se(dccg, dp_hpo_inst);
|
||||
} else {
|
||||
dccg->funcs->enable_symclk32_se(dccg, dp_hpo_inst, phyd32clk);
|
||||
}
|
||||
} else {
|
||||
if (dccg->funcs->enable_symclk_se)
|
||||
dccg->funcs->enable_symclk_se(dccg, stream_enc->stream_enc_inst,
|
||||
|
||||
@ -936,8 +936,11 @@ void dcn401_enable_stream(struct pipe_ctx *pipe_ctx)
|
||||
if (dc_is_dp_signal(pipe_ctx->stream->signal) || dc_is_virtual_signal(pipe_ctx->stream->signal)) {
|
||||
if (dc->link_srv->dp_is_128b_132b_signal(pipe_ctx)) {
|
||||
dccg->funcs->set_dpstreamclk(dccg, DPREFCLK, tg->inst, dp_hpo_inst);
|
||||
|
||||
dccg->funcs->enable_symclk32_se(dccg, dp_hpo_inst, phyd32clk);
|
||||
if (link->cur_link_settings.link_rate == LINK_RATE_UNKNOWN) {
|
||||
dccg->funcs->disable_symclk32_se(dccg, dp_hpo_inst);
|
||||
} else {
|
||||
dccg->funcs->enable_symclk32_se(dccg, dp_hpo_inst, phyd32clk);
|
||||
}
|
||||
} else {
|
||||
dccg->funcs->enable_symclk_se(dccg, stream_enc->stream_enc_inst,
|
||||
link_enc->transmitter - TRANSMITTER_UNIPHY_A);
|
||||
|
||||
@ -341,6 +341,7 @@ enum pp_policy_soc_pstate {
|
||||
#define MAX_CLKS 4
|
||||
#define NUM_VCN 4
|
||||
#define NUM_JPEG_ENG 32
|
||||
#define NUM_JPEG_ENG_V1 40
|
||||
#define MAX_XCC 8
|
||||
#define NUM_XCP 8
|
||||
struct seq_file;
|
||||
@ -376,6 +377,20 @@ struct amdgpu_xcp_metrics_v1_1 {
|
||||
uint64_t gfx_below_host_limit_acc[MAX_XCC];
|
||||
};
|
||||
|
||||
struct amdgpu_xcp_metrics_v1_2 {
|
||||
/* Utilization Instantaneous (%) */
|
||||
uint32_t gfx_busy_inst[MAX_XCC];
|
||||
uint16_t jpeg_busy[NUM_JPEG_ENG_V1];
|
||||
uint16_t vcn_busy[NUM_VCN];
|
||||
/* Utilization Accumulated (%) */
|
||||
uint64_t gfx_busy_acc[MAX_XCC];
|
||||
/* Total App Clock Counter Accumulated */
|
||||
uint64_t gfx_below_host_limit_ppt_acc[MAX_XCC];
|
||||
uint64_t gfx_below_host_limit_thm_acc[MAX_XCC];
|
||||
uint64_t gfx_low_utilization_acc[MAX_XCC];
|
||||
uint64_t gfx_below_host_limit_total_acc[MAX_XCC];
|
||||
};
|
||||
|
||||
struct amd_pm_funcs {
|
||||
/* export for dpm on ci and si */
|
||||
int (*pre_set_power_state)(void *handle);
|
||||
@ -1090,6 +1105,105 @@ struct gpu_metrics_v1_7 {
|
||||
uint32_t pcie_lc_perf_other_end_recovery;
|
||||
};
|
||||
|
||||
struct gpu_metrics_v1_8 {
|
||||
struct metrics_table_header common_header;
|
||||
|
||||
/* Temperature (Celsius) */
|
||||
uint16_t temperature_hotspot;
|
||||
uint16_t temperature_mem;
|
||||
uint16_t temperature_vrsoc;
|
||||
|
||||
/* Power (Watts) */
|
||||
uint16_t curr_socket_power;
|
||||
|
||||
/* Utilization (%) */
|
||||
uint16_t average_gfx_activity;
|
||||
uint16_t average_umc_activity; // memory controller
|
||||
|
||||
/* VRAM max bandwidthi (in GB/sec) at max memory clock */
|
||||
uint64_t mem_max_bandwidth;
|
||||
|
||||
/* Energy (15.259uJ (2^-16) units) */
|
||||
uint64_t energy_accumulator;
|
||||
|
||||
/* Driver attached timestamp (in ns) */
|
||||
uint64_t system_clock_counter;
|
||||
|
||||
/* Accumulation cycle counter */
|
||||
uint32_t accumulation_counter;
|
||||
|
||||
/* Accumulated throttler residencies */
|
||||
uint32_t prochot_residency_acc;
|
||||
uint32_t ppt_residency_acc;
|
||||
uint32_t socket_thm_residency_acc;
|
||||
uint32_t vr_thm_residency_acc;
|
||||
uint32_t hbm_thm_residency_acc;
|
||||
|
||||
/* Clock Lock Status. Each bit corresponds to clock instance */
|
||||
uint32_t gfxclk_lock_status;
|
||||
|
||||
/* Link width (number of lanes) and speed (in 0.1 GT/s) */
|
||||
uint16_t pcie_link_width;
|
||||
uint16_t pcie_link_speed;
|
||||
|
||||
/* XGMI bus width and bitrate (in Gbps) */
|
||||
uint16_t xgmi_link_width;
|
||||
uint16_t xgmi_link_speed;
|
||||
|
||||
/* Utilization Accumulated (%) */
|
||||
uint32_t gfx_activity_acc;
|
||||
uint32_t mem_activity_acc;
|
||||
|
||||
/*PCIE accumulated bandwidth (GB/sec) */
|
||||
uint64_t pcie_bandwidth_acc;
|
||||
|
||||
/*PCIE instantaneous bandwidth (GB/sec) */
|
||||
uint64_t pcie_bandwidth_inst;
|
||||
|
||||
/* PCIE L0 to recovery state transition accumulated count */
|
||||
uint64_t pcie_l0_to_recov_count_acc;
|
||||
|
||||
/* PCIE replay accumulated count */
|
||||
uint64_t pcie_replay_count_acc;
|
||||
|
||||
/* PCIE replay rollover accumulated count */
|
||||
uint64_t pcie_replay_rover_count_acc;
|
||||
|
||||
/* PCIE NAK sent accumulated count */
|
||||
uint32_t pcie_nak_sent_count_acc;
|
||||
|
||||
/* PCIE NAK received accumulated count */
|
||||
uint32_t pcie_nak_rcvd_count_acc;
|
||||
|
||||
/* XGMI accumulated data transfer size(KiloBytes) */
|
||||
uint64_t xgmi_read_data_acc[NUM_XGMI_LINKS];
|
||||
uint64_t xgmi_write_data_acc[NUM_XGMI_LINKS];
|
||||
|
||||
/* XGMI link status(active/inactive) */
|
||||
uint16_t xgmi_link_status[NUM_XGMI_LINKS];
|
||||
|
||||
uint16_t padding;
|
||||
|
||||
/* PMFW attached timestamp (10ns resolution) */
|
||||
uint64_t firmware_timestamp;
|
||||
|
||||
/* Current clocks (Mhz) */
|
||||
uint16_t current_gfxclk[MAX_GFX_CLKS];
|
||||
uint16_t current_socclk[MAX_CLKS];
|
||||
uint16_t current_vclk0[MAX_CLKS];
|
||||
uint16_t current_dclk0[MAX_CLKS];
|
||||
uint16_t current_uclk;
|
||||
|
||||
/* Number of current partition */
|
||||
uint16_t num_partition;
|
||||
|
||||
/* XCP metrics stats */
|
||||
struct amdgpu_xcp_metrics_v1_2 xcp_stats[NUM_XCP];
|
||||
|
||||
/* PCIE other end recovery counter */
|
||||
uint32_t pcie_lc_perf_other_end_recovery;
|
||||
};
|
||||
|
||||
/*
|
||||
* gpu_metrics_v2_0 is not recommended as it's not naturally aligned.
|
||||
* Use gpu_metrics_v2_1 or later instead.
|
||||
|
||||
@ -267,10 +267,10 @@ int smu7_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
|
||||
if (hwmgr->thermal_controller.fanInfo.bNoFan ||
|
||||
(hwmgr->thermal_controller.fanInfo.
|
||||
ucTachometerPulsesPerRevolution == 0) ||
|
||||
speed == 0 ||
|
||||
(!speed || speed > UINT_MAX/8) ||
|
||||
(speed < hwmgr->thermal_controller.fanInfo.ulMinRPM) ||
|
||||
(speed > hwmgr->thermal_controller.fanInfo.ulMaxRPM))
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_MicrocodeFanControl))
|
||||
smu7_fan_ctrl_stop_smc_fan_control(hwmgr);
|
||||
|
||||
@ -307,10 +307,10 @@ int vega10_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
|
||||
int result = 0;
|
||||
|
||||
if (hwmgr->thermal_controller.fanInfo.bNoFan ||
|
||||
speed == 0 ||
|
||||
(!speed || speed > UINT_MAX/8) ||
|
||||
(speed < hwmgr->thermal_controller.fanInfo.ulMinRPM) ||
|
||||
(speed > hwmgr->thermal_controller.fanInfo.ulMaxRPM))
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_MicrocodeFanControl))
|
||||
result = vega10_fan_ctrl_stop_smc_fan_control(hwmgr);
|
||||
|
||||
@ -191,7 +191,7 @@ int vega20_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
|
||||
uint32_t tach_period, crystal_clock_freq;
|
||||
int result = 0;
|
||||
|
||||
if (!speed)
|
||||
if (!speed || speed > UINT_MAX/8)
|
||||
return -EINVAL;
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_MicrocodeFanControl)) {
|
||||
|
||||
@ -127,7 +127,7 @@ typedef enum {
|
||||
VOLTAGE_GUARDBAND_COUNT
|
||||
} GFX_GUARDBAND_e;
|
||||
|
||||
#define SMU_METRICS_TABLE_VERSION 0xF
|
||||
#define SMU_METRICS_TABLE_VERSION 0x10
|
||||
|
||||
// Unified metrics table for smu_v13_0_6
|
||||
typedef struct __attribute__((packed, aligned(4))) {
|
||||
@ -241,7 +241,10 @@ typedef struct __attribute__((packed, aligned(4))) {
|
||||
uint32_t PCIeOtherEndRecoveryAcc; // The Pcie counter itself is accumulated
|
||||
|
||||
//Total App Clock Counter
|
||||
uint64_t GfxclkBelowHostLimitAcc[8];
|
||||
uint64_t GfxclkBelowHostLimitPptAcc[8];
|
||||
uint64_t GfxclkBelowHostLimitThmAcc[8];
|
||||
uint64_t GfxclkBelowHostLimitTotalAcc[8];
|
||||
uint64_t GfxclkLowUtilizationAcc[8];
|
||||
} MetricsTableV0_t;
|
||||
|
||||
// Metrics table for smu_v13_0_6 APUS
|
||||
|
||||
@ -1267,6 +1267,9 @@ static int arcturus_set_fan_speed_rpm(struct smu_context *smu,
|
||||
uint32_t crystal_clock_freq = 2500;
|
||||
uint32_t tach_period;
|
||||
|
||||
if (!speed || speed > UINT_MAX/8)
|
||||
return -EINVAL;
|
||||
|
||||
tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed);
|
||||
WREG32_SOC15(THM, 0, mmCG_TACH_CTRL_ARCT,
|
||||
REG_SET_FIELD(RREG32_SOC15(THM, 0, mmCG_TACH_CTRL_ARCT),
|
||||
|
||||
@ -1226,7 +1226,7 @@ int smu_v13_0_set_fan_speed_rpm(struct smu_context *smu,
|
||||
uint32_t tach_period;
|
||||
int ret;
|
||||
|
||||
if (!speed)
|
||||
if (!speed || speed > UINT_MAX/8)
|
||||
return -EINVAL;
|
||||
|
||||
ret = smu_v13_0_auto_fan_control(smu, 0);
|
||||
|
||||
@ -109,7 +109,6 @@ enum smu_v13_0_6_caps {
|
||||
SMU_CAP(OTHER_END_METRICS),
|
||||
SMU_CAP(SET_UCLK_MAX),
|
||||
SMU_CAP(PCIE_METRICS),
|
||||
SMU_CAP(HST_LIMIT_METRICS),
|
||||
SMU_CAP(MCA_DEBUG_MODE),
|
||||
SMU_CAP(PER_INST_METRICS),
|
||||
SMU_CAP(CTF_LIMIT),
|
||||
@ -325,8 +324,6 @@ static void smu_v13_0_14_init_caps(struct smu_context *smu)
|
||||
|
||||
if (fw_ver >= 0x05550E00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(OTHER_END_METRICS));
|
||||
if (fw_ver >= 0x05551000)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
|
||||
if (fw_ver >= 0x05550B00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(PER_INST_METRICS));
|
||||
if (fw_ver >= 0x5551200)
|
||||
@ -342,7 +339,6 @@ static void smu_v13_0_12_init_caps(struct smu_context *smu)
|
||||
SMU_CAP(RMA_MSG),
|
||||
SMU_CAP(ACA_SYND),
|
||||
SMU_CAP(OTHER_END_METRICS),
|
||||
SMU_CAP(HST_LIMIT_METRICS),
|
||||
SMU_CAP(PER_INST_METRICS) };
|
||||
uint32_t fw_ver = smu->smc_fw_version;
|
||||
|
||||
@ -387,8 +383,6 @@ static void smu_v13_0_6_init_caps(struct smu_context *smu)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(RMA_MSG));
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(ACA_SYND));
|
||||
|
||||
if (fw_ver >= 0x04556F00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
|
||||
if (fw_ver >= 0x04556A00)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(PER_INST_METRICS));
|
||||
} else {
|
||||
@ -408,8 +402,6 @@ static void smu_v13_0_6_init_caps(struct smu_context *smu)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(RMA_MSG));
|
||||
if (fw_ver < 0x00555600)
|
||||
smu_v13_0_6_cap_clear(smu, SMU_CAP(ACA_SYND));
|
||||
if (pgm == 0 && fw_ver >= 0x557900)
|
||||
smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
|
||||
}
|
||||
if (((pgm == 7) && (fw_ver >= 0x7550700)) ||
|
||||
((pgm == 0) && (fw_ver >= 0x00557900)) ||
|
||||
@ -2674,13 +2666,6 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
|
||||
gpu_metrics->xcp_stats[i].gfx_busy_acc[idx] =
|
||||
SMUQ10_ROUND(GET_GPU_METRIC_FIELD(GfxBusyAcc,
|
||||
version)[inst]);
|
||||
|
||||
if (smu_v13_0_6_cap_supported(
|
||||
smu, SMU_CAP(HST_LIMIT_METRICS)))
|
||||
gpu_metrics->xcp_stats[i].gfx_below_host_limit_acc[idx] =
|
||||
SMUQ10_ROUND(GET_GPU_METRIC_FIELD
|
||||
(GfxclkBelowHostLimitAcc, version)
|
||||
[inst]);
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,6 +79,7 @@
|
||||
#define PP_OD_FEATURE_FAN_ACOUSTIC_TARGET 8
|
||||
#define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9
|
||||
#define PP_OD_FEATURE_FAN_MINIMUM_PWM 10
|
||||
#define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11
|
||||
|
||||
static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
|
||||
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1),
|
||||
@ -1052,6 +1053,10 @@ static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
|
||||
od_min_setting = overdrive_lowerlimits->FanMinimumPwm;
|
||||
od_max_setting = overdrive_upperlimits->FanMinimumPwm;
|
||||
break;
|
||||
case PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE:
|
||||
od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
|
||||
od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
|
||||
break;
|
||||
default:
|
||||
od_min_setting = od_max_setting = INT_MAX;
|
||||
break;
|
||||
@ -1330,6 +1335,24 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
|
||||
min_value, max_value);
|
||||
break;
|
||||
|
||||
case SMU_OD_FAN_ZERO_RPM_ENABLE:
|
||||
if (!smu_v14_0_2_is_od_feature_supported(smu,
|
||||
PP_OD_FEATURE_ZERO_FAN_BIT))
|
||||
break;
|
||||
|
||||
size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_ENABLE:\n");
|
||||
size += sysfs_emit_at(buf, size, "%d\n",
|
||||
(int)od_table->OverDriveTable.FanZeroRpmEnable);
|
||||
|
||||
size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
|
||||
smu_v14_0_2_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE,
|
||||
&min_value,
|
||||
&max_value);
|
||||
size += sysfs_emit_at(buf, size, "ZERO_RPM_ENABLE: %u %u\n",
|
||||
min_value, max_value);
|
||||
break;
|
||||
|
||||
case SMU_OD_RANGE:
|
||||
if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
|
||||
!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) &&
|
||||
@ -2270,7 +2293,9 @@ static void smu_v14_0_2_set_supported_od_feature_mask(struct smu_context *smu)
|
||||
OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_RETRIEVE |
|
||||
OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_SET |
|
||||
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
|
||||
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET;
|
||||
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
|
||||
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
|
||||
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
|
||||
}
|
||||
|
||||
static int smu_v14_0_2_get_overdrive_table(struct smu_context *smu,
|
||||
@ -2349,6 +2374,8 @@ static int smu_v14_0_2_set_default_od_settings(struct smu_context *smu)
|
||||
user_od_table_bak.OverDriveTable.FanTargetTemperature;
|
||||
user_od_table->OverDriveTable.FanMinimumPwm =
|
||||
user_od_table_bak.OverDriveTable.FanMinimumPwm;
|
||||
user_od_table->OverDriveTable.FanZeroRpmEnable =
|
||||
user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
|
||||
}
|
||||
|
||||
smu_v14_0_2_set_supported_od_feature_mask(smu);
|
||||
@ -2396,6 +2423,11 @@ static int smu_v14_0_2_od_restore_table_single(struct smu_context *smu, long inp
|
||||
od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
|
||||
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
||||
break;
|
||||
case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
|
||||
od_table->OverDriveTable.FanZeroRpmEnable =
|
||||
boot_overdrive_table->OverDriveTable.FanZeroRpmEnable;
|
||||
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
|
||||
break;
|
||||
case PP_OD_EDIT_ACOUSTIC_LIMIT:
|
||||
od_table->OverDriveTable.AcousticLimitRpmThreshold =
|
||||
boot_overdrive_table->OverDriveTable.AcousticLimitRpmThreshold;
|
||||
@ -2678,6 +2710,27 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
|
||||
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
||||
break;
|
||||
|
||||
case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
|
||||
if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) {
|
||||
dev_warn(adev->dev, "Zero RPM setting not supported!\n");
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
smu_v14_0_2_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[0] < minimum ||
|
||||
input[0] > maximum) {
|
||||
dev_info(adev->dev, "zero RPM enable setting(%ld) must be within [%d, %d]!\n",
|
||||
input[0], minimum, maximum);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
od_table->OverDriveTable.FanZeroRpmEnable = input[0];
|
||||
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
|
||||
break;
|
||||
|
||||
case PP_OD_RESTORE_DEFAULT_TABLE:
|
||||
if (size == 1) {
|
||||
ret = smu_v14_0_2_od_restore_table_single(smu, input[0]);
|
||||
|
||||
@ -1083,6 +1083,9 @@ void smu_cmn_init_soft_gpu_metrics(void *table, uint8_t frev, uint8_t crev)
|
||||
case METRICS_VERSION(1, 7):
|
||||
structure_size = sizeof(struct gpu_metrics_v1_7);
|
||||
break;
|
||||
case METRICS_VERSION(1, 8):
|
||||
structure_size = sizeof(struct gpu_metrics_v1_8);
|
||||
break;
|
||||
case METRICS_VERSION(2, 0):
|
||||
structure_size = sizeof(struct gpu_metrics_v2_0);
|
||||
break;
|
||||
|
||||
@ -91,12 +91,13 @@ config DRM_FSL_LDB
|
||||
Support for i.MX8MP DPI-to-LVDS on-SoC encoder.
|
||||
|
||||
config DRM_I2C_NXP_TDA998X
|
||||
tristate "NXP Semiconductors TDA998X HDMI encoder"
|
||||
default m if DRM_TILCDC
|
||||
select CEC_CORE if CEC_NOTIFIER
|
||||
select SND_SOC_HDMI_CODEC if SND_SOC
|
||||
help
|
||||
Support for NXP Semiconductors TDA998X HDMI encoders.
|
||||
tristate "NXP Semiconductors TDA998X HDMI encoder"
|
||||
default m if DRM_TILCDC
|
||||
select CEC_CORE if CEC_NOTIFIER
|
||||
select DRM_KMS_HELPER
|
||||
select SND_SOC_HDMI_CODEC if SND_SOC
|
||||
help
|
||||
Support for NXP Semiconductors TDA998X HDMI encoders.
|
||||
|
||||
config DRM_ITE_IT6263
|
||||
tristate "ITE IT6263 LVDS/HDMI bridge"
|
||||
|
||||
@ -6,6 +6,8 @@
|
||||
#ifndef __INTEL_FBDEV_H__
|
||||
#define __INTEL_FBDEV_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_fb_helper;
|
||||
struct drm_fb_helper_surface_size;
|
||||
struct drm_i915_private;
|
||||
|
||||
@ -2314,6 +2314,7 @@ cdclk_prefill_adjustment(const struct intel_crtc_state *crtc_state)
|
||||
static int
|
||||
dsc_prefill_latency(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
const struct intel_crtc_scaler_state *scaler_state =
|
||||
&crtc_state->scaler_state;
|
||||
int linetime = DIV_ROUND_UP(1000 * crtc_state->hw.adjusted_mode.htotal,
|
||||
@ -2323,7 +2324,9 @@ dsc_prefill_latency(const struct intel_crtc_state *crtc_state)
|
||||
crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ? 2 : 1;
|
||||
u32 dsc_prefill_latency = 0;
|
||||
|
||||
if (!crtc_state->dsc.compression_enable || !num_scaler_users)
|
||||
if (!crtc_state->dsc.compression_enable ||
|
||||
!num_scaler_users ||
|
||||
num_scaler_users > crtc->num_scalers)
|
||||
return dsc_prefill_latency;
|
||||
|
||||
dsc_prefill_latency = DIV_ROUND_UP(15 * linetime * chroma_downscaling_factor, 10);
|
||||
|
||||
@ -53,7 +53,7 @@ config DRM_XE
|
||||
config DRM_XE_DISPLAY
|
||||
bool "Enable display support"
|
||||
depends on DRM_XE && DRM_XE=m && HAS_IOPORT
|
||||
select FB_IOMEM_HELPERS
|
||||
select FB_IOMEM_HELPERS if DRM_FBDEV_EMULATION
|
||||
select I2C
|
||||
select I2C_ALGOBIT
|
||||
default y
|
||||
|
||||
@ -130,6 +130,10 @@
|
||||
#define RING_EXECLIST_STATUS_LO(base) XE_REG((base) + 0x234)
|
||||
#define RING_EXECLIST_STATUS_HI(base) XE_REG((base) + 0x234 + 4)
|
||||
|
||||
#define RING_IDLEDLY(base) XE_REG((base) + 0x23c)
|
||||
#define INHIBIT_SWITCH_UNTIL_PREEMPTED REG_BIT(31)
|
||||
#define IDLE_DELAY REG_GENMASK(20, 0)
|
||||
|
||||
#define RING_CONTEXT_CONTROL(base) XE_REG((base) + 0x244, XE_REG_OPTION_MASKED)
|
||||
#define CTX_CTRL_PXP_ENABLE REG_BIT(10)
|
||||
#define CTX_CTRL_OAC_CONTEXT_ENABLE REG_BIT(8)
|
||||
|
||||
@ -53,6 +53,7 @@
|
||||
#include "xe_pxp.h"
|
||||
#include "xe_query.h"
|
||||
#include "xe_shrinker.h"
|
||||
#include "xe_survivability_mode.h"
|
||||
#include "xe_sriov.h"
|
||||
#include "xe_tile.h"
|
||||
#include "xe_ttm_stolen_mgr.h"
|
||||
@ -705,8 +706,20 @@ int xe_device_probe_early(struct xe_device *xe)
|
||||
sriov_update_device_info(xe);
|
||||
|
||||
err = xe_pcode_probe_early(xe);
|
||||
if (err)
|
||||
return err;
|
||||
if (err) {
|
||||
int save_err = err;
|
||||
|
||||
/*
|
||||
* Try to leave device in survivability mode if device is
|
||||
* possible, but still return the previous error for error
|
||||
* propagation
|
||||
*/
|
||||
err = xe_survivability_mode_enable(xe);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return save_err;
|
||||
}
|
||||
|
||||
err = wait_for_lmem_ready(xe);
|
||||
if (err)
|
||||
|
||||
@ -222,13 +222,7 @@ int xe_eu_stall_init(struct xe_gt *gt)
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(xe->drm.dev, xe_eu_stall_fini, gt);
|
||||
if (ret)
|
||||
goto exit_destroy;
|
||||
|
||||
return 0;
|
||||
exit_destroy:
|
||||
destroy_workqueue(gt->eu_stall->buf_ptr_poll_wq);
|
||||
return devm_add_action_or_reset(xe->drm.dev, xe_eu_stall_fini, gt);
|
||||
exit_free:
|
||||
mutex_destroy(>->eu_stall->stream_lock);
|
||||
kfree(gt->eu_stall);
|
||||
|
||||
@ -16,35 +16,47 @@
|
||||
#include "xe_macros.h"
|
||||
#include "xe_mmio.h"
|
||||
|
||||
static u32 get_crystal_clock_freq(u32 rpm_config_reg)
|
||||
#define f19_2_mhz 19200000
|
||||
#define f24_mhz 24000000
|
||||
#define f25_mhz 25000000
|
||||
#define f38_4_mhz 38400000
|
||||
#define ts_base_83 83333
|
||||
#define ts_base_52 52083
|
||||
#define ts_base_80 80000
|
||||
|
||||
static void read_crystal_clock(struct xe_gt *gt, u32 rpm_config_reg, u32 *freq,
|
||||
u32 *timestamp_base)
|
||||
{
|
||||
const u32 f19_2_mhz = 19200000;
|
||||
const u32 f24_mhz = 24000000;
|
||||
const u32 f25_mhz = 25000000;
|
||||
const u32 f38_4_mhz = 38400000;
|
||||
u32 crystal_clock = REG_FIELD_GET(RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK,
|
||||
rpm_config_reg);
|
||||
|
||||
switch (crystal_clock) {
|
||||
case RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ:
|
||||
return f24_mhz;
|
||||
*freq = f24_mhz;
|
||||
*timestamp_base = ts_base_83;
|
||||
return;
|
||||
case RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ:
|
||||
return f19_2_mhz;
|
||||
*freq = f19_2_mhz;
|
||||
*timestamp_base = ts_base_52;
|
||||
return;
|
||||
case RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_38_4_MHZ:
|
||||
return f38_4_mhz;
|
||||
*freq = f38_4_mhz;
|
||||
*timestamp_base = ts_base_52;
|
||||
return;
|
||||
case RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_25_MHZ:
|
||||
return f25_mhz;
|
||||
*freq = f25_mhz;
|
||||
*timestamp_base = ts_base_80;
|
||||
return;
|
||||
default:
|
||||
XE_WARN_ON("NOT_POSSIBLE");
|
||||
return 0;
|
||||
xe_gt_warn(gt, "Invalid crystal clock frequency: %u", crystal_clock);
|
||||
*freq = 0;
|
||||
*timestamp_base = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int xe_gt_clock_init(struct xe_gt *gt)
|
||||
static void check_ctc_mode(struct xe_gt *gt)
|
||||
{
|
||||
u32 c0 = xe_mmio_read32(>->mmio, RPM_CONFIG0);
|
||||
u32 freq = 0;
|
||||
|
||||
/*
|
||||
* CTC_MODE[0] = 1 is definitely not supported for Xe2 and later
|
||||
* platforms. In theory it could be a valid setting for pre-Xe2
|
||||
@ -57,8 +69,18 @@ int xe_gt_clock_init(struct xe_gt *gt)
|
||||
*/
|
||||
if (xe_mmio_read32(>->mmio, CTC_MODE) & CTC_SOURCE_DIVIDE_LOGIC)
|
||||
xe_gt_warn(gt, "CTC_MODE[0] is set; this is unexpected and undocumented\n");
|
||||
}
|
||||
|
||||
freq = get_crystal_clock_freq(c0);
|
||||
int xe_gt_clock_init(struct xe_gt *gt)
|
||||
{
|
||||
u32 freq;
|
||||
u32 c0;
|
||||
|
||||
if (!IS_SRIOV_VF(gt_to_xe(gt)))
|
||||
check_ctc_mode(gt);
|
||||
|
||||
c0 = xe_mmio_read32(>->mmio, RPM_CONFIG0);
|
||||
read_crystal_clock(gt, c0, &freq, >->info.timestamp_base);
|
||||
|
||||
/*
|
||||
* Now figure out how the command stream's timestamp
|
||||
|
||||
@ -121,6 +121,8 @@ struct xe_gt {
|
||||
enum xe_gt_type type;
|
||||
/** @info.reference_clock: clock frequency */
|
||||
u32 reference_clock;
|
||||
/** @info.timestamp_base: GT timestamp base */
|
||||
u32 timestamp_base;
|
||||
/**
|
||||
* @info.engine_mask: mask of engines present on GT. Some of
|
||||
* them may be reserved in runtime and not available for user.
|
||||
|
||||
@ -8,7 +8,9 @@
|
||||
#include <linux/nospec.h>
|
||||
|
||||
#include <drm/drm_managed.h>
|
||||
#include <drm/drm_print.h>
|
||||
#include <uapi/drm/xe_drm.h>
|
||||
#include <generated/xe_wa_oob.h>
|
||||
|
||||
#include "regs/xe_engine_regs.h"
|
||||
#include "regs/xe_gt_regs.h"
|
||||
@ -21,6 +23,7 @@
|
||||
#include "xe_gsc.h"
|
||||
#include "xe_gt.h"
|
||||
#include "xe_gt_ccs_mode.h"
|
||||
#include "xe_gt_clock.h"
|
||||
#include "xe_gt_printk.h"
|
||||
#include "xe_gt_mcr.h"
|
||||
#include "xe_gt_topology.h"
|
||||
@ -564,6 +567,33 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
|
||||
xe_reg_whitelist_process_engine(hwe);
|
||||
}
|
||||
|
||||
static void adjust_idledly(struct xe_hw_engine *hwe)
|
||||
{
|
||||
struct xe_gt *gt = hwe->gt;
|
||||
u32 idledly, maxcnt;
|
||||
u32 idledly_units_ps = 8 * gt->info.timestamp_base;
|
||||
u32 maxcnt_units_ns = 640;
|
||||
bool inhibit_switch = 0;
|
||||
|
||||
if (!IS_SRIOV_VF(gt_to_xe(hwe->gt)) && XE_WA(gt, 16023105232)) {
|
||||
idledly = xe_mmio_read32(>->mmio, RING_IDLEDLY(hwe->mmio_base));
|
||||
maxcnt = xe_mmio_read32(>->mmio, RING_PWRCTX_MAXCNT(hwe->mmio_base));
|
||||
|
||||
inhibit_switch = idledly & INHIBIT_SWITCH_UNTIL_PREEMPTED;
|
||||
idledly = REG_FIELD_GET(IDLE_DELAY, idledly);
|
||||
idledly = DIV_ROUND_CLOSEST(idledly * idledly_units_ps, 1000);
|
||||
maxcnt = REG_FIELD_GET(IDLE_WAIT_TIME, maxcnt);
|
||||
maxcnt *= maxcnt_units_ns;
|
||||
|
||||
if (xe_gt_WARN_ON(gt, idledly >= maxcnt || inhibit_switch)) {
|
||||
idledly = DIV_ROUND_CLOSEST(((maxcnt - 1) * maxcnt_units_ns),
|
||||
idledly_units_ps);
|
||||
idledly = DIV_ROUND_CLOSEST(idledly, 1000);
|
||||
xe_mmio_write32(>->mmio, RING_IDLEDLY(hwe->mmio_base), idledly);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int hw_engine_init(struct xe_gt *gt, struct xe_hw_engine *hwe,
|
||||
enum xe_hw_engine_id id)
|
||||
{
|
||||
@ -604,6 +634,9 @@ static int hw_engine_init(struct xe_gt *gt, struct xe_hw_engine *hwe,
|
||||
if (xe->info.has_usm && hwe->class == XE_ENGINE_CLASS_COPY)
|
||||
gt->usm.reserved_bcs_instance = hwe->instance;
|
||||
|
||||
/* Ensure IDLEDLY is lower than MAXCNT */
|
||||
adjust_idledly(hwe);
|
||||
|
||||
return devm_add_action_or_reset(xe->drm.dev, hw_engine_fini, hwe);
|
||||
|
||||
err_hwsp:
|
||||
|
||||
@ -803,16 +803,14 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
return err;
|
||||
|
||||
err = xe_device_probe_early(xe);
|
||||
|
||||
/*
|
||||
* In Boot Survivability mode, no drm card is exposed and driver is
|
||||
* loaded with bare minimum to allow for firmware to be flashed through
|
||||
* mei. If early probe fails, check if survivability mode is flagged by
|
||||
* HW to be enabled. In that case enable it and return success.
|
||||
*/
|
||||
if (err) {
|
||||
if (xe_survivability_mode_required(xe) &&
|
||||
xe_survivability_mode_enable(xe))
|
||||
/*
|
||||
* In Boot Survivability mode, no drm card is exposed and driver
|
||||
* is loaded with bare minimum to allow for firmware to be
|
||||
* flashed through mei. If early probe failed, but it managed to
|
||||
* enable survivability mode, return success.
|
||||
*/
|
||||
if (xe_survivability_mode_is_enabled(xe))
|
||||
return 0;
|
||||
|
||||
return err;
|
||||
|
||||
@ -155,13 +155,21 @@ static int enable_survivability_mode(struct pci_dev *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make sure xe_heci_gsc_init() knows about survivability mode */
|
||||
survivability->mode = true;
|
||||
|
||||
ret = xe_heci_gsc_init(xe);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
/*
|
||||
* But if it fails, device can't enter survivability
|
||||
* so move it back for correct error handling
|
||||
*/
|
||||
survivability->mode = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
xe_vsec_init(xe);
|
||||
|
||||
survivability->mode = true;
|
||||
dev_err(dev, "In Survivability Mode\n");
|
||||
|
||||
return 0;
|
||||
@ -178,15 +186,16 @@ bool xe_survivability_mode_is_enabled(struct xe_device *xe)
|
||||
return xe->survivability.mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_survivability_mode_required - checks if survivability mode is required
|
||||
* @xe: xe device instance
|
||||
/*
|
||||
* survivability_mode_requested - check if it's possible to enable
|
||||
* survivability mode and that was requested by firmware
|
||||
*
|
||||
* This function reads the boot status from Pcode
|
||||
* This function reads the boot status from Pcode.
|
||||
*
|
||||
* Return: true if boot status indicates failure, false otherwise
|
||||
* Return: true if platform support is available and boot status indicates
|
||||
* failure, false otherwise.
|
||||
*/
|
||||
bool xe_survivability_mode_required(struct xe_device *xe)
|
||||
static bool survivability_mode_requested(struct xe_device *xe)
|
||||
{
|
||||
struct xe_survivability *survivability = &xe->survivability;
|
||||
struct xe_mmio *mmio = xe_root_tile_mmio(xe);
|
||||
@ -208,7 +217,8 @@ bool xe_survivability_mode_required(struct xe_device *xe)
|
||||
*
|
||||
* Initialize survivability information and enable survivability mode
|
||||
*
|
||||
* Return: 0 for success, negative error code otherwise.
|
||||
* Return: 0 if survivability mode is enabled or not requested; negative error
|
||||
* code otherwise.
|
||||
*/
|
||||
int xe_survivability_mode_enable(struct xe_device *xe)
|
||||
{
|
||||
@ -216,6 +226,9 @@ int xe_survivability_mode_enable(struct xe_device *xe)
|
||||
struct xe_survivability_info *info;
|
||||
struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
|
||||
|
||||
if (!survivability_mode_requested(xe))
|
||||
return 0;
|
||||
|
||||
survivability->size = MAX_SCRATCH_MMIO;
|
||||
|
||||
info = devm_kcalloc(xe->drm.dev, survivability->size, sizeof(*info),
|
||||
|
||||
@ -12,6 +12,5 @@ struct xe_device;
|
||||
|
||||
int xe_survivability_mode_enable(struct xe_device *xe);
|
||||
bool xe_survivability_mode_is_enabled(struct xe_device *xe);
|
||||
bool xe_survivability_mode_required(struct xe_device *xe);
|
||||
|
||||
#endif /* _XE_SURVIVABILITY_MODE_H_ */
|
||||
|
||||
@ -622,6 +622,12 @@ static const struct xe_rtp_entry_sr engine_was[] = {
|
||||
FUNC(xe_rtp_match_first_render_or_compute)),
|
||||
XE_RTP_ACTIONS(SET(TDL_TSL_CHICKEN, RES_CHK_SPR_DIS))
|
||||
},
|
||||
{ XE_RTP_NAME("16023105232"),
|
||||
XE_RTP_RULES(MEDIA_VERSION_RANGE(1301, 3000), OR,
|
||||
GRAPHICS_VERSION_RANGE(2001, 3001)),
|
||||
XE_RTP_ACTIONS(SET(RING_PSMI_CTL(0), RC_SEMA_IDLE_MSG_DISABLE,
|
||||
XE_RTP_ACTION_FLAG(ENGINE_BASE)))
|
||||
},
|
||||
};
|
||||
|
||||
static const struct xe_rtp_entry_sr lrc_was[] = {
|
||||
|
||||
@ -53,3 +53,5 @@ no_media_l3 MEDIA_VERSION(3000)
|
||||
GRAPHICS_VERSION_RANGE(1270, 1274)
|
||||
1508761755 GRAPHICS_VERSION(1255)
|
||||
GRAPHICS_VERSION(1260), GRAPHICS_STEP(A0, B0)
|
||||
16023105232 GRAPHICS_VERSION_RANGE(2001, 3001)
|
||||
MEDIA_VERSION_RANGE(1301, 3000)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user