mirror of
https://github.com/torvalds/linux.git
synced 2026-04-23 00:55:48 -04:00
Merge tag 'amd-drm-next-5.14-2021-06-02' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-5.14-2021-06-02:
amdgpu:
- GC/MM register access macro clean up for SR-IOV
- Beige Goby updates
- W=1 Fixes
- Aldebaran fixes
- Misc display fixes
- ACPI ATCS/ATIF handling rework
- SR-IOV fixes
- RAS fixes
- 16bpc fixed point format support
- Initial smartshift support
- RV/PCO power tuning fixes for suspend/resume
- More buffer object subclassing work
- Add new INFO query for additional vbios information
- Add new placement for preemptable SG buffers
amdkfd:
- Misc fixes
radeon:
- W=1 Fixes
- Misc cleanups
UAPI:
- Add new INFO query for additional vbios information
Useful for debugging vbios related issues. Proposed umr patch:
https://patchwork.freedesktop.org/patch/433297/
- 16bpc fixed point format support
IGT test:
https://lists.freedesktop.org/archives/igt-dev/2021-May/031507.html
Proposed Vulkan patch:
a25d480207
- Add a new GEM flag which is only used internally in the kernel driver. Userspace
is not allowed to set it.
drm:
- 16bpc fixed point format fourcc
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210602214009.4553-1-alexander.deucher@amd.com
This commit is contained in:
@@ -47,7 +47,7 @@
|
||||
#include "gfx_v10_0.h"
|
||||
#include "nbio_v2_3.h"
|
||||
|
||||
/**
|
||||
/*
|
||||
* Navi10 has two graphic rings to share each graphic pipe.
|
||||
* 1. Primary ring
|
||||
* 2. Async ring
|
||||
@@ -1432,38 +1432,36 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00c00000)
|
||||
};
|
||||
|
||||
static bool gfx_v10_is_rlcg_rw(struct amdgpu_device *adev, u32 offset, uint32_t *flag, bool write)
|
||||
static bool gfx_v10_get_rlcg_flag(struct amdgpu_device *adev, u32 acc_flags, u32 hwip,
|
||||
int write, u32 *rlcg_flag)
|
||||
{
|
||||
/* always programed by rlcg, only for gc */
|
||||
if (offset == SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_HI) ||
|
||||
offset == SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_LO) ||
|
||||
offset == SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_LENGTH) ||
|
||||
offset == SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_CNTL) ||
|
||||
offset == SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX) ||
|
||||
offset == SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL)) {
|
||||
if (!amdgpu_sriov_reg_indirect_gc(adev))
|
||||
*flag = GFX_RLCG_GC_WRITE_OLD;
|
||||
else
|
||||
*flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ;
|
||||
switch (hwip) {
|
||||
case GC_HWIP:
|
||||
if (amdgpu_sriov_reg_indirect_gc(adev)) {
|
||||
*rlcg_flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
/* only in new version, AMDGPU_REGS_NO_KIQ and AMDGPU_REGS_RLC enabled simultaneously */
|
||||
} else if ((acc_flags & AMDGPU_REGS_RLC) && !(acc_flags & AMDGPU_REGS_NO_KIQ)) {
|
||||
*rlcg_flag = GFX_RLCG_GC_WRITE_OLD;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
case MMHUB_HWIP:
|
||||
if (amdgpu_sriov_reg_indirect_mmhub(adev) &&
|
||||
(acc_flags & AMDGPU_REGS_RLC) && write) {
|
||||
*rlcg_flag = GFX_RLCG_MMHUB_WRITE;
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Not program register by RLCG\n");
|
||||
}
|
||||
|
||||
/* currently support gc read/write, mmhub write */
|
||||
if (offset >= SOC15_REG_OFFSET(GC, 0, mmSDMA0_DEC_START) &&
|
||||
offset <= SOC15_REG_OFFSET(GC, 0, mmRLC_GTS_OFFSET_MSB)) {
|
||||
if (amdgpu_sriov_reg_indirect_gc(adev))
|
||||
*flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ;
|
||||
else
|
||||
return false;
|
||||
} else {
|
||||
if (amdgpu_sriov_reg_indirect_mmhub(adev))
|
||||
*flag = GFX_RLCG_MMHUB_WRITE;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static u32 gfx_v10_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, uint32_t flag)
|
||||
@@ -1523,36 +1521,34 @@ static u32 gfx_v10_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, uint32
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void gfx_v10_rlcg_wreg(struct amdgpu_device *adev, u32 offset, u32 value, u32 flag)
|
||||
static void gfx_v10_rlcg_wreg(struct amdgpu_device *adev, u32 offset, u32 value, u32 acc_flags, u32 hwip)
|
||||
{
|
||||
uint32_t rlcg_flag;
|
||||
u32 rlcg_flag;
|
||||
|
||||
if (amdgpu_sriov_fullaccess(adev) &&
|
||||
gfx_v10_is_rlcg_rw(adev, offset, &rlcg_flag, 1)) {
|
||||
if (!amdgpu_sriov_runtime(adev) &&
|
||||
gfx_v10_get_rlcg_flag(adev, acc_flags, hwip, 1, &rlcg_flag)) {
|
||||
gfx_v10_rlcg_rw(adev, offset, value, rlcg_flag);
|
||||
|
||||
return;
|
||||
}
|
||||
if (flag & AMDGPU_REGS_NO_KIQ)
|
||||
|
||||
if (acc_flags & AMDGPU_REGS_NO_KIQ)
|
||||
WREG32_NO_KIQ(offset, value);
|
||||
else
|
||||
WREG32(offset, value);
|
||||
}
|
||||
|
||||
static u32 gfx_v10_rlcg_rreg(struct amdgpu_device *adev, u32 offset, u32 flag)
|
||||
static u32 gfx_v10_rlcg_rreg(struct amdgpu_device *adev, u32 offset, u32 acc_flags, u32 hwip)
|
||||
{
|
||||
uint32_t rlcg_flag;
|
||||
u32 rlcg_flag;
|
||||
|
||||
if (amdgpu_sriov_fullaccess(adev) &&
|
||||
gfx_v10_is_rlcg_rw(adev, offset, &rlcg_flag, 0))
|
||||
if (!amdgpu_sriov_runtime(adev) &&
|
||||
gfx_v10_get_rlcg_flag(adev, acc_flags, hwip, 0, &rlcg_flag))
|
||||
return gfx_v10_rlcg_rw(adev, offset, 0, rlcg_flag);
|
||||
|
||||
if (flag & AMDGPU_REGS_NO_KIQ)
|
||||
if (acc_flags & AMDGPU_REGS_NO_KIQ)
|
||||
return RREG32_NO_KIQ(offset);
|
||||
else
|
||||
return RREG32(offset);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct soc15_reg_golden golden_settings_gc_10_1_nv14[] =
|
||||
@@ -3935,7 +3931,7 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
{
|
||||
const char *chip_name;
|
||||
char fw_name[40];
|
||||
char wks[10];
|
||||
char *wks = "";
|
||||
int err;
|
||||
struct amdgpu_firmware_info *info = NULL;
|
||||
const struct common_firmware_header *header = NULL;
|
||||
@@ -3948,7 +3944,6 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
memset(wks, 0, sizeof(wks));
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_NAVI10:
|
||||
chip_name = "navi10";
|
||||
@@ -3957,7 +3952,7 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
chip_name = "navi14";
|
||||
if (!(adev->pdev->device == 0x7340 &&
|
||||
adev->pdev->revision != 0x00))
|
||||
snprintf(wks, sizeof(wks), "_wks");
|
||||
wks = "_wks";
|
||||
break;
|
||||
case CHIP_NAVI12:
|
||||
chip_name = "navi12";
|
||||
@@ -5233,10 +5228,10 @@ static void gfx_v10_0_rlc_enable_srm(struct amdgpu_device *adev)
|
||||
uint32_t tmp;
|
||||
|
||||
/* enable Save Restore Machine */
|
||||
tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL));
|
||||
tmp = RREG32_SOC15(GC, 0, mmRLC_SRM_CNTL);
|
||||
tmp |= RLC_SRM_CNTL__AUTO_INCR_ADDR_MASK;
|
||||
tmp |= RLC_SRM_CNTL__SRM_ENABLE_MASK;
|
||||
WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL), tmp);
|
||||
WREG32_SOC15(GC, 0, mmRLC_SRM_CNTL, tmp);
|
||||
}
|
||||
|
||||
static int gfx_v10_0_rlc_load_microcode(struct amdgpu_device *adev)
|
||||
@@ -7941,12 +7936,12 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,
|
||||
static void gfx_v10_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)
|
||||
{
|
||||
u32 reg, data;
|
||||
|
||||
/* not for *_SOC15 */
|
||||
reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL);
|
||||
if (amdgpu_sriov_is_pp_one_vf(adev))
|
||||
data = RREG32_NO_KIQ(reg);
|
||||
else
|
||||
data = RREG32(reg);
|
||||
data = RREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL);
|
||||
|
||||
data &= ~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK;
|
||||
data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT;
|
||||
@@ -8688,16 +8683,16 @@ gfx_v10_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,
|
||||
|
||||
switch (state) {
|
||||
case AMDGPU_IRQ_STATE_DISABLE:
|
||||
cp_int_cntl = RREG32(cp_int_cntl_reg);
|
||||
cp_int_cntl = RREG32_SOC15_IP(GC, cp_int_cntl_reg);
|
||||
cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
|
||||
TIME_STAMP_INT_ENABLE, 0);
|
||||
WREG32(cp_int_cntl_reg, cp_int_cntl);
|
||||
WREG32_SOC15_IP(GC, cp_int_cntl_reg, cp_int_cntl);
|
||||
break;
|
||||
case AMDGPU_IRQ_STATE_ENABLE:
|
||||
cp_int_cntl = RREG32(cp_int_cntl_reg);
|
||||
cp_int_cntl = RREG32_SOC15_IP(GC, cp_int_cntl_reg);
|
||||
cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
|
||||
TIME_STAMP_INT_ENABLE, 1);
|
||||
WREG32(cp_int_cntl_reg, cp_int_cntl);
|
||||
WREG32_SOC15_IP(GC, cp_int_cntl_reg, cp_int_cntl);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -8741,16 +8736,16 @@ static void gfx_v10_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev
|
||||
|
||||
switch (state) {
|
||||
case AMDGPU_IRQ_STATE_DISABLE:
|
||||
mec_int_cntl = RREG32(mec_int_cntl_reg);
|
||||
mec_int_cntl = RREG32_SOC15_IP(GC, mec_int_cntl_reg);
|
||||
mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,
|
||||
TIME_STAMP_INT_ENABLE, 0);
|
||||
WREG32(mec_int_cntl_reg, mec_int_cntl);
|
||||
WREG32_SOC15_IP(GC, mec_int_cntl_reg, mec_int_cntl);
|
||||
break;
|
||||
case AMDGPU_IRQ_STATE_ENABLE:
|
||||
mec_int_cntl = RREG32(mec_int_cntl_reg);
|
||||
mec_int_cntl = RREG32_SOC15_IP(GC, mec_int_cntl_reg);
|
||||
mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,
|
||||
TIME_STAMP_INT_ENABLE, 1);
|
||||
WREG32(mec_int_cntl_reg, mec_int_cntl);
|
||||
WREG32_SOC15_IP(GC, mec_int_cntl_reg, mec_int_cntl);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -8946,20 +8941,20 @@ static int gfx_v10_0_kiq_set_interrupt_state(struct amdgpu_device *adev,
|
||||
GENERIC2_INT_ENABLE, 0);
|
||||
WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, tmp);
|
||||
|
||||
tmp = RREG32(target);
|
||||
tmp = RREG32_SOC15_IP(GC, target);
|
||||
tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL,
|
||||
GENERIC2_INT_ENABLE, 0);
|
||||
WREG32(target, tmp);
|
||||
WREG32_SOC15_IP(GC, target, tmp);
|
||||
} else {
|
||||
tmp = RREG32_SOC15(GC, 0, mmCPC_INT_CNTL);
|
||||
tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL,
|
||||
GENERIC2_INT_ENABLE, 1);
|
||||
WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, tmp);
|
||||
|
||||
tmp = RREG32(target);
|
||||
tmp = RREG32_SOC15_IP(GC, target);
|
||||
tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL,
|
||||
GENERIC2_INT_ENABLE, 1);
|
||||
WREG32(target, tmp);
|
||||
WREG32_SOC15_IP(GC, target, tmp);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user