Skip to content

Commit 0425393

Browse files
committed
Merge tag 'amd-drm-next-5.7-2020-03-19' of git://people.freedesktop.org/~agd5f/linux into drm-next
amd-drm-next-5.7-2020-03-19: amdgpu: - SR-IOV fixes - RAS fixes - Fallthrough cleanups - Kconfig fix for ACP - Fix load balancing with VCN - DC fixes - GPU reset fixes - Various cleanups scheduler: - Revert job distribution optimization - Add a helper to pick the least loaded scheduler Signed-off-by: Dave Airlie <[email protected]> From: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 7c2cb99 + 8cd2960 commit 0425393

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+955
-503
lines changed

drivers/gpu/drm/amd/acp/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# SPDX-License-Identifier: MIT
22
menu "ACP (Audio CoProcessor) Configuration"
3+
depends on DRM_AMDGPU
34

45
config DRM_AMD_ACP
56
bool "Enable AMD Audio CoProcessor IP support"

drivers/gpu/drm/amd/amdgpu/amdgpu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,8 @@ uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
994994
uint32_t acc_flags);
995995
void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
996996
uint32_t acc_flags);
997+
void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
998+
uint32_t acc_flags);
997999
void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value);
9981000
uint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset);
9991001

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static uint32_t get_sdma_rlc_reg_offset(struct amdgpu_device *adev,
7979
dev_warn(adev->dev,
8080
"Invalid sdma engine id (%d), using engine id 0\n",
8181
engine_id);
82-
/* fall through */
82+
fallthrough;
8383
case 0:
8484
sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0,
8585
mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;

drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -91,47 +91,51 @@ static int amdgpu_ctx_init_entity(struct amdgpu_ctx *ctx, const u32 hw_ip, const
9191
priority = (ctx->override_priority == DRM_SCHED_PRIORITY_UNSET) ?
9292
ctx->init_priority : ctx->override_priority;
9393
switch (hw_ip) {
94-
case AMDGPU_HW_IP_GFX:
95-
sched = &adev->gfx.gfx_ring[0].sched;
96-
scheds = &sched;
97-
num_scheds = 1;
98-
break;
99-
case AMDGPU_HW_IP_COMPUTE:
100-
hw_prio = amdgpu_ctx_sched_prio_to_compute_prio(priority);
101-
scheds = adev->gfx.compute_prio_sched[hw_prio];
102-
num_scheds = adev->gfx.num_compute_sched[hw_prio];
103-
break;
104-
case AMDGPU_HW_IP_DMA:
105-
scheds = adev->sdma.sdma_sched;
106-
num_scheds = adev->sdma.num_sdma_sched;
107-
break;
108-
case AMDGPU_HW_IP_UVD:
109-
sched = &adev->uvd.inst[0].ring.sched;
110-
scheds = &sched;
111-
num_scheds = 1;
112-
break;
113-
case AMDGPU_HW_IP_VCE:
114-
sched = &adev->vce.ring[0].sched;
115-
scheds = &sched;
116-
num_scheds = 1;
117-
break;
118-
case AMDGPU_HW_IP_UVD_ENC:
119-
sched = &adev->uvd.inst[0].ring_enc[0].sched;
120-
scheds = &sched;
121-
num_scheds = 1;
122-
break;
123-
case AMDGPU_HW_IP_VCN_DEC:
124-
scheds = adev->vcn.vcn_dec_sched;
125-
num_scheds = adev->vcn.num_vcn_dec_sched;
126-
break;
127-
case AMDGPU_HW_IP_VCN_ENC:
128-
scheds = adev->vcn.vcn_enc_sched;
129-
num_scheds = adev->vcn.num_vcn_enc_sched;
130-
break;
131-
case AMDGPU_HW_IP_VCN_JPEG:
132-
scheds = adev->jpeg.jpeg_sched;
133-
num_scheds = adev->jpeg.num_jpeg_sched;
134-
break;
94+
case AMDGPU_HW_IP_GFX:
95+
sched = &adev->gfx.gfx_ring[0].sched;
96+
scheds = &sched;
97+
num_scheds = 1;
98+
break;
99+
case AMDGPU_HW_IP_COMPUTE:
100+
hw_prio = amdgpu_ctx_sched_prio_to_compute_prio(priority);
101+
scheds = adev->gfx.compute_prio_sched[hw_prio];
102+
num_scheds = adev->gfx.num_compute_sched[hw_prio];
103+
break;
104+
case AMDGPU_HW_IP_DMA:
105+
scheds = adev->sdma.sdma_sched;
106+
num_scheds = adev->sdma.num_sdma_sched;
107+
break;
108+
case AMDGPU_HW_IP_UVD:
109+
sched = &adev->uvd.inst[0].ring.sched;
110+
scheds = &sched;
111+
num_scheds = 1;
112+
break;
113+
case AMDGPU_HW_IP_VCE:
114+
sched = &adev->vce.ring[0].sched;
115+
scheds = &sched;
116+
num_scheds = 1;
117+
break;
118+
case AMDGPU_HW_IP_UVD_ENC:
119+
sched = &adev->uvd.inst[0].ring_enc[0].sched;
120+
scheds = &sched;
121+
num_scheds = 1;
122+
break;
123+
case AMDGPU_HW_IP_VCN_DEC:
124+
sched = drm_sched_pick_best(adev->vcn.vcn_dec_sched,
125+
adev->vcn.num_vcn_dec_sched);
126+
scheds = &sched;
127+
num_scheds = 1;
128+
break;
129+
case AMDGPU_HW_IP_VCN_ENC:
130+
sched = drm_sched_pick_best(adev->vcn.vcn_enc_sched,
131+
adev->vcn.num_vcn_enc_sched);
132+
scheds = &sched;
133+
num_scheds = 1;
134+
break;
135+
case AMDGPU_HW_IP_VCN_JPEG:
136+
scheds = adev->jpeg.jpeg_sched;
137+
num_scheds = adev->jpeg.num_jpeg_sched;
138+
break;
135139
}
136140

137141
r = drm_sched_entity_init(&entity->entity, priority, scheds, num_scheds,

drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "amdgpu.h"
3434
#include "amdgpu_pm.h"
3535
#include "amdgpu_dm_debugfs.h"
36+
#include "amdgpu_ras.h"
3637

3738
/**
3839
* amdgpu_debugfs_add_files - Add simple debugfs entries
@@ -178,7 +179,7 @@ static int amdgpu_debugfs_process_reg_op(bool read, struct file *f,
178179
} else {
179180
r = get_user(value, (uint32_t *)buf);
180181
if (!r)
181-
WREG32(*pos >> 2, value);
182+
amdgpu_mm_wreg_mmio_rlc(adev, *pos >> 2, value, 0);
182183
}
183184
if (r) {
184185
result = r;
@@ -783,11 +784,11 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
783784
ssize_t result = 0;
784785
uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
785786

786-
if (size & 3 || *pos & 3)
787+
if (size > 4096 || size & 3 || *pos & 3)
787788
return -EINVAL;
788789

789790
/* decode offset */
790-
offset = *pos & GENMASK_ULL(11, 0);
791+
offset = (*pos & GENMASK_ULL(11, 0)) >> 2;
791792
se = (*pos & GENMASK_ULL(19, 12)) >> 12;
792793
sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
793794
cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
@@ -825,7 +826,7 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
825826
while (size) {
826827
uint32_t value;
827828

828-
value = data[offset++];
829+
value = data[result >> 2];
829830
r = put_user(value, (uint32_t *)buf);
830831
if (r) {
831832
result = r;
@@ -1294,7 +1295,6 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_ib_preempt, NULL,
12941295
DEFINE_SIMPLE_ATTRIBUTE(fops_sclk_set, NULL,
12951296
amdgpu_debugfs_sclk_set, "%llu\n");
12961297

1297-
extern void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev);
12981298
int amdgpu_debugfs_init(struct amdgpu_device *adev)
12991299
{
13001300
int r, i;

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,26 @@ void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value)
306306
BUG();
307307
}
308308

309+
void static inline amdgpu_mm_wreg_mmio(struct amdgpu_device *adev, uint32_t reg, uint32_t v, uint32_t acc_flags)
310+
{
311+
trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
312+
313+
if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
314+
writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
315+
else {
316+
unsigned long flags;
317+
318+
spin_lock_irqsave(&adev->mmio_idx_lock, flags);
319+
writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
320+
writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
321+
spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
322+
}
323+
324+
if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
325+
udelay(500);
326+
}
327+
}
328+
309329
/**
310330
* amdgpu_mm_wreg - write to a memory mapped IO register
311331
*
@@ -319,29 +339,33 @@ void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value)
319339
void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
320340
uint32_t acc_flags)
321341
{
322-
trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
323-
324342
if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
325343
adev->last_mm_index = v;
326344
}
327345

328346
if ((acc_flags & AMDGPU_REGS_KIQ) || (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)))
329347
return amdgpu_kiq_wreg(adev, reg, v);
330348

331-
if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
332-
writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
333-
else {
334-
unsigned long flags;
349+
amdgpu_mm_wreg_mmio(adev, reg, v, acc_flags);
350+
}
335351

336-
spin_lock_irqsave(&adev->mmio_idx_lock, flags);
337-
writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
338-
writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
339-
spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
340-
}
352+
/*
353+
* amdgpu_mm_wreg_mmio_rlc - write register either with mmio or with RLC path if in range
354+
*
355+
* this function is invoked only the debugfs register access
356+
* */
357+
void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
358+
uint32_t acc_flags)
359+
{
360+
if (amdgpu_sriov_fullaccess(adev) &&
361+
adev->gfx.rlc.funcs &&
362+
adev->gfx.rlc.funcs->is_rlcg_access_range) {
341363

342-
if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
343-
udelay(500);
364+
if (adev->gfx.rlc.funcs->is_rlcg_access_range(adev, reg))
365+
return adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, v);
344366
}
367+
368+
amdgpu_mm_wreg_mmio(adev, reg, v, acc_flags);
345369
}
346370

347371
/**
@@ -3933,6 +3957,8 @@ static int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,
39333957
if (r)
39343958
goto out;
39353959

3960+
amdgpu_fbdev_set_suspend(tmp_adev, 0);
3961+
39363962
/* must succeed. */
39373963
amdgpu_ras_resume(tmp_adev);
39383964

@@ -4106,6 +4132,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
41064132
*/
41074133
amdgpu_unregister_gpu_instance(tmp_adev);
41084134

4135+
amdgpu_fbdev_set_suspend(adev, 1);
4136+
41094137
/* disable ras on ALL IPs */
41104138
if (!(in_ras_intr && !use_baco) &&
41114139
amdgpu_device_ip_need_full_reset(tmp_adev))

drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,8 @@ struct amdgpu_pm {
448448
/* powerplay feature */
449449
uint32_t pp_feature;
450450

451+
/* Used for I2C access to various EEPROMs on relevant ASICs */
452+
struct i2c_adapter smu_i2c;
451453
};
452454

453455
#define R600_SSTU_DFLT 0

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ static int psp_sw_fini(void *handle)
159159
adev->psp.sos_fw = NULL;
160160
release_firmware(adev->psp.asd_fw);
161161
adev->psp.asd_fw = NULL;
162+
if (adev->psp.cap_fw) {
163+
release_firmware(adev->psp.cap_fw);
164+
adev->psp.cap_fw = NULL;
165+
}
162166
if (adev->psp.ta_fw) {
163167
release_firmware(adev->psp.ta_fw);
164168
adev->psp.ta_fw = NULL;
@@ -200,6 +204,7 @@ psp_cmd_submit_buf(struct psp_context *psp,
200204
int ret;
201205
int index;
202206
int timeout = 2000;
207+
bool ras_intr = false;
203208

204209
mutex_lock(&psp->mutex);
205210

@@ -224,7 +229,8 @@ psp_cmd_submit_buf(struct psp_context *psp,
224229
* because gpu reset thread triggered and lock resource should
225230
* be released for psp resume sequence.
226231
*/
227-
if (amdgpu_ras_intr_triggered())
232+
ras_intr = amdgpu_ras_intr_triggered();
233+
if (ras_intr)
228234
break;
229235
msleep(1);
230236
amdgpu_asic_invalidate_hdp(psp->adev, NULL);
@@ -237,14 +243,14 @@ psp_cmd_submit_buf(struct psp_context *psp,
237243
* during psp initialization to avoid breaking hw_init and it doesn't
238244
* return -EINVAL.
239245
*/
240-
if (psp->cmd_buf_mem->resp.status || !timeout) {
246+
if ((psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) {
241247
if (ucode)
242248
DRM_WARN("failed to load ucode id (%d) ",
243249
ucode->ucode_id);
244250
DRM_WARN("psp command (0x%X) failed and response status is (0x%X)\n",
245251
psp->cmd_buf_mem->cmd_id,
246252
psp->cmd_buf_mem->resp.status);
247-
if (!timeout) {
253+
if ((ucode->ucode_id == AMDGPU_UCODE_ID_CAP) || !timeout) {
248254
mutex_unlock(&psp->mutex);
249255
return -EINVAL;
250256
}
@@ -1186,6 +1192,9 @@ static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
11861192
enum psp_gfx_fw_type *type)
11871193
{
11881194
switch (ucode->ucode_id) {
1195+
case AMDGPU_UCODE_ID_CAP:
1196+
*type = GFX_FW_TYPE_CAP;
1197+
break;
11891198
case AMDGPU_UCODE_ID_SDMA0:
11901199
*type = GFX_FW_TYPE_SDMA0;
11911200
break;

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ struct psp_context
252252
uint32_t asd_ucode_size;
253253
uint8_t *asd_start_addr;
254254

255+
/* cap firmware */
256+
const struct firmware *cap_fw;
257+
255258
/* fence buffer */
256259
struct amdgpu_bo *fence_buf_bo;
257260
uint64_t fence_buf_mc_addr;

drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,7 @@ void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
11161116
void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
11171117
{
11181118
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
1119-
struct ras_manager *obj, *tmp;
1119+
struct ras_manager *obj;
11201120
struct ras_fs_if fs_info;
11211121

11221122
/*
@@ -1128,10 +1128,7 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
11281128

11291129
amdgpu_ras_debugfs_create_ctrl_node(adev);
11301130

1131-
list_for_each_entry_safe(obj, tmp, &con->head, node) {
1132-
if (!obj)
1133-
continue;
1134-
1131+
list_for_each_entry(obj, &con->head, node) {
11351132
if (amdgpu_ras_is_supported(adev, obj->head.block) &&
11361133
(obj->attr_inuse == 1)) {
11371134
sprintf(fs_info.debugfs_name, "%s_err_inject",
@@ -1765,18 +1762,30 @@ static void amdgpu_ras_check_supported(struct amdgpu_device *adev,
17651762
*hw_supported = 0;
17661763
*supported = 0;
17671764

1768-
if (amdgpu_sriov_vf(adev) ||
1765+
if (amdgpu_sriov_vf(adev) || !adev->is_atom_fw ||
17691766
(adev->asic_type != CHIP_VEGA20 &&
17701767
adev->asic_type != CHIP_ARCTURUS))
17711768
return;
17721769

1773-
if (adev->is_atom_fw &&
1774-
(amdgpu_atomfirmware_mem_ecc_supported(adev) ||
1775-
amdgpu_atomfirmware_sram_ecc_supported(adev)))
1776-
*hw_supported = AMDGPU_RAS_BLOCK_MASK;
1770+
if (amdgpu_atomfirmware_mem_ecc_supported(adev)) {
1771+
DRM_INFO("HBM ECC is active.\n");
1772+
*hw_supported |= (1 << AMDGPU_RAS_BLOCK__UMC |
1773+
1 << AMDGPU_RAS_BLOCK__DF);
1774+
} else
1775+
DRM_INFO("HBM ECC is not presented.\n");
1776+
1777+
if (amdgpu_atomfirmware_sram_ecc_supported(adev)) {
1778+
DRM_INFO("SRAM ECC is active.\n");
1779+
*hw_supported |= ~(1 << AMDGPU_RAS_BLOCK__UMC |
1780+
1 << AMDGPU_RAS_BLOCK__DF);
1781+
} else
1782+
DRM_INFO("SRAM ECC is not presented.\n");
1783+
1784+
/* hw_supported needs to be aligned with RAS block mask. */
1785+
*hw_supported &= AMDGPU_RAS_BLOCK_MASK;
17771786

17781787
*supported = amdgpu_ras_enable == 0 ?
1779-
0 : *hw_supported & amdgpu_ras_mask;
1788+
0 : *hw_supported & amdgpu_ras_mask;
17801789
}
17811790

17821791
int amdgpu_ras_init(struct amdgpu_device *adev)

0 commit comments

Comments
 (0)