mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
amd-drm-next-6.15-2025-03-27:
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 -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQgO5Idg2tXNTSZAr293/aFa7yZ2AUCZ+XxCgAKCRC93/aFa7yZ 2P6MAP9D6MY6JH5RStUFDiIp3beNm7dQUfUcl2uXIJMU/SELXwEA2SjNuROeCtQj KNwPatatoQHxVnjQgxLOlKO86QoX8Qg= =ZCWI -----END PGP SIGNATURE----- Merge tag 'amd-drm-next-6.15-2025-03-27' of https://gitlab.freedesktop.org/agd5f/linux into drm-next amd-drm-next-6.15-2025-03-27: 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 Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://lore.kernel.org/r/20250328004749.3392457-1-alexander.deucher@amd.com
This commit is contained in:
commit
526da2436b
|
|
@ -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 @@ static bool amdgpu_get_bios_apu(struct amdgpu_device *adev)
|
|||
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 @@ static int gfx_v9_4_3_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_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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user