Skip to content

Commit 2067391

Browse files
committed
Merge tag 'amd-drm-next-5.9-2020-07-17' of git://people.freedesktop.org/~agd5f/linux into drm-next
amd-drm-next-5.9-2020-07-17: amdgpu: - SI UVD/VCE clock support - Updates for Sienna Cichlid - Expose drm rotation property - Atomfirmware updates for renoir - updates to GPUVM hub handling for different register layouts - swSMU restructuring and cleanups - RAS fixes - DC fixes - mode1 reset support for Sienna Cichlid - Add support for Navy Flounder GPUs amdkfd: - Add SMI events watch interface UAPI: - Add amdkfd SMI events watch interface Userspace which uses this interface: ROCm/rocm_smi_lib@2235ede Signed-off-by: Dave Airlie <[email protected]> From: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 959ed53 + 6e14ade commit 2067391

File tree

158 files changed

+5162
-3019
lines changed

Some content is hidden

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

158 files changed

+5162
-3019
lines changed

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ static const bool debug_evictions; /* = false */
193193
#endif
194194

195195
extern int amdgpu_tmz;
196+
extern int amdgpu_reset_method;
196197

197198
#ifdef CONFIG_DRM_AMDGPU_SI
198199
extern int amdgpu_si_support;
@@ -1010,10 +1011,10 @@ int amdgpu_gpu_wait_for_idle(struct amdgpu_device *adev);
10101011

10111012
void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,
10121013
uint32_t *buf, size_t size, bool write);
1013-
uint32_t amdgpu_device_rreg(struct amdgpu_device *adev, uint32_t reg,
1014-
uint32_t acc_flags);
1015-
void amdgpu_device_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
1014+
uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
10161015
uint32_t acc_flags);
1016+
void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
1017+
uint32_t acc_flags);
10171018
void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
10181019
uint32_t acc_flags);
10191020
void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value);
@@ -1032,18 +1033,18 @@ int emu_soc_asic_init(struct amdgpu_device *adev);
10321033
*/
10331034
#define AMDGPU_REGS_NO_KIQ (1<<1)
10341035

1035-
#define RREG32_NO_KIQ(reg) amdgpu_device_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ)
1036-
#define WREG32_NO_KIQ(reg, v) amdgpu_device_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ)
1036+
#define RREG32_NO_KIQ(reg) amdgpu_mm_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ)
1037+
#define WREG32_NO_KIQ(reg, v) amdgpu_mm_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ)
10371038

10381039
#define RREG32_KIQ(reg) amdgpu_kiq_rreg(adev, (reg))
10391040
#define WREG32_KIQ(reg, v) amdgpu_kiq_wreg(adev, (reg), (v))
10401041

10411042
#define RREG8(reg) amdgpu_mm_rreg8(adev, (reg))
10421043
#define WREG8(reg, v) amdgpu_mm_wreg8(adev, (reg), (v))
10431044

1044-
#define RREG32(reg) amdgpu_device_rreg(adev, (reg), 0)
1045-
#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_device_rreg(adev, (reg), 0))
1046-
#define WREG32(reg, v) amdgpu_device_wreg(adev, (reg), (v), 0)
1045+
#define RREG32(reg) amdgpu_mm_rreg(adev, (reg), 0)
1046+
#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_mm_rreg(adev, (reg), 0))
1047+
#define WREG32(reg, v) amdgpu_mm_wreg(adev, (reg), (v), 0)
10471048
#define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
10481049
#define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
10491050
#define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg))
@@ -1080,7 +1081,16 @@ int emu_soc_asic_init(struct amdgpu_device *adev);
10801081
tmp_ |= ((val) & ~(mask)); \
10811082
WREG32_PLL(reg, tmp_); \
10821083
} while (0)
1083-
#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_device_rreg((adev), (reg), false))
1084+
1085+
#define WREG32_SMC_P(_Reg, _Val, _Mask) \
1086+
do { \
1087+
u32 tmp = RREG32_SMC(_Reg); \
1088+
tmp &= (_Mask); \
1089+
tmp |= ((_Val) & ~(_Mask)); \
1090+
WREG32_SMC(_Reg, tmp); \
1091+
} while (0)
1092+
1093+
#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_mm_rreg((adev), (reg), false))
10841094
#define RREG32_IO(reg) amdgpu_io_rreg(adev, (reg))
10851095
#define WREG32_IO(reg, v) amdgpu_io_wreg(adev, (reg), (v))
10861096

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
#include "amdgpu_xgmi.h"
3232
#include <uapi/linux/kfd_ioctl.h>
3333

34-
static const unsigned int compute_vmid_bitmap = 0xFF00;
35-
3634
/* Total memory size in system memory and all GPU VRAM. Used to
3735
* estimate worst case amount of memory to reserve for page tables
3836
*/
@@ -113,7 +111,9 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
113111

114112
if (adev->kfd.dev) {
115113
struct kgd2kfd_shared_resources gpu_resources = {
116-
.compute_vmid_bitmap = compute_vmid_bitmap,
114+
.compute_vmid_bitmap =
115+
((1 << AMDGPU_NUM_VMID) - 1) -
116+
((1 << adev->vm_manager.first_kfd_vmid) - 1),
117117
.num_pipe_per_mec = adev->gfx.mec.num_pipe_per_mec,
118118
.num_queue_per_pipe = adev->gfx.mec.num_queue_per_pipe,
119119
.gpuvm_size = min(adev->vm_manager.max_pfn
@@ -637,10 +637,8 @@ void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle)
637637

638638
bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)
639639
{
640-
if (adev->kfd.dev) {
641-
if ((1 << vmid) & compute_vmid_bitmap)
642-
return true;
643-
}
640+
if (adev->kfd.dev)
641+
return vmid >= adev->vm_manager.first_kfd_vmid;
644642

645643
return false;
646644
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev)
111111

112112
union igp_info {
113113
struct atom_integrated_system_info_v1_11 v11;
114+
struct atom_integrated_system_info_v1_12 v12;
114115
};
115116

116117
union umc_info {
@@ -214,6 +215,15 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
214215
if (vram_type)
215216
*vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
216217
break;
218+
case 12:
219+
mem_channel_number = igp_info->v12.umachannelnumber;
220+
/* channel width is 64 */
221+
if (vram_width)
222+
*vram_width = mem_channel_number * 64;
223+
mem_type = igp_info->v12.memorytype;
224+
if (vram_type)
225+
*vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
226+
break;
217227
default:
218228
return -EINVAL;
219229
}

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,27 +1343,37 @@ static void amdgpu_ib_preempt_job_recovery(struct drm_gpu_scheduler *sched)
13431343
static void amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring *ring)
13441344
{
13451345
struct amdgpu_job *job;
1346-
struct drm_sched_job *s_job;
1346+
struct drm_sched_job *s_job, *tmp;
13471347
uint32_t preempt_seq;
13481348
struct dma_fence *fence, **ptr;
13491349
struct amdgpu_fence_driver *drv = &ring->fence_drv;
13501350
struct drm_gpu_scheduler *sched = &ring->sched;
1351+
bool preempted = true;
13511352

13521353
if (ring->funcs->type != AMDGPU_RING_TYPE_GFX)
13531354
return;
13541355

13551356
preempt_seq = le32_to_cpu(*(drv->cpu_addr + 2));
1356-
if (preempt_seq <= atomic_read(&drv->last_seq))
1357-
return;
1357+
if (preempt_seq <= atomic_read(&drv->last_seq)) {
1358+
preempted = false;
1359+
goto no_preempt;
1360+
}
13581361

13591362
preempt_seq &= drv->num_fences_mask;
13601363
ptr = &drv->fences[preempt_seq];
13611364
fence = rcu_dereference_protected(*ptr, 1);
13621365

1366+
no_preempt:
13631367
spin_lock(&sched->job_list_lock);
1364-
list_for_each_entry(s_job, &sched->ring_mirror_list, node) {
1368+
list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
1369+
if (dma_fence_is_signaled(&s_job->s_fence->finished)) {
1370+
/* remove job from ring_mirror_list */
1371+
list_del_init(&s_job->node);
1372+
sched->ops->free_job(s_job);
1373+
continue;
1374+
}
13651375
job = to_amdgpu_job(s_job);
1366-
if (job->fence == fence)
1376+
if (preempted && job->fence == fence)
13671377
/* mark the job as preempted */
13681378
job->preemption_status |= AMDGPU_IB_PREEMPTED;
13691379
}
@@ -1461,10 +1471,12 @@ static int amdgpu_debugfs_sclk_set(void *data, u64 val)
14611471
}
14621472

14631473
if (is_support_sw_smu(adev)) {
1464-
ret = smu_get_dpm_freq_range(&adev->smu, SMU_SCLK, &min_freq, &max_freq, true);
1474+
ret = smu_get_dpm_freq_range(&adev->smu, SMU_SCLK, &min_freq, &max_freq);
14651475
if (ret || val > max_freq || val < min_freq)
14661476
return -EINVAL;
1467-
ret = smu_set_soft_freq_range(&adev->smu, SMU_SCLK, (uint32_t)val, (uint32_t)val, true);
1477+
ret = smu_set_soft_freq_range(&adev->smu, SMU_SCLK, (uint32_t)val, (uint32_t)val);
1478+
} else {
1479+
return 0;
14681480
}
14691481

14701482
pm_runtime_mark_last_busy(adev->ddev->dev);

0 commit comments

Comments
 (0)