Skip to content

Commit 871e899

Browse files
committed
Merge branch 'drm-next-4.17' of git://people.freedesktop.org/~agd5f/linux into drm-next
A few fixes for 4.17: - Fix a potential use after free in a error case - Fix pcie lane handling in amdgpu SI dpm - sdma pipeline sync fix - A few vega12 cleanups and fixes - Misc other fixes * 'drm-next-4.17' of git://people.freedesktop.org/~agd5f/linux: drm/amdgpu: Fix memory leaks at amdgpu_init() error path drm/amdgpu: Fix PCIe lane width calculation drm/radeon: Fix PCIe lane width calculation drm/amdgpu/si: implement get/set pcie_lanes asic callback drm/amdgpu: Add support for SRBM selection v3 Revert "drm/amdgpu: Don't change preferred domian when fallback GTT v5" drm/amd/powerply: fix power reading on Fiji drm/amd/powerplay: Enable ACG SS feature drm/amdgpu/sdma: fix mask in emit_pipeline_sync drm/amdgpu: Fix KIQ hang on bare metal for device unbind/bind back v2. drm/amd/pp: Clean header file in vega12_smumgr.c drm/amd/pp: Remove Dead functions on Vega12 drm/amd/pp: silence a static checker warning drm/amdgpu: drop compute ring timeout setting for non-sriov only (v2) drm/amdgpu: fix typo of domain fallback
2 parents c975f17 + c60e22f commit 871e899

29 files changed

+299
-1556
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,7 @@ struct amdgpu_gfx_funcs {
890890
void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields);
891891
void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t thread, uint32_t start, uint32_t size, uint32_t *dst);
892892
void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t start, uint32_t size, uint32_t *dst);
893+
void (*select_me_pipe_q)(struct amdgpu_device *adev, u32 me, u32 pipe, u32 queue);
893894
};
894895

895896
struct amdgpu_ngg_buf {
@@ -1812,6 +1813,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
18121813
#define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance))
18131814
#define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a))
18141815
#define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i))
1816+
#define amdgpu_gfx_select_me_pipe_q(adev, me, pipe, q) (adev)->gfx.funcs->select_me_pipe_q((adev), (me), (pipe), (q))
18151817

18161818
/* Common functions */
18171819
int amdgpu_device_gpu_recover(struct amdgpu_device *adev,

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

Lines changed: 40 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,21 @@ int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
6464

6565
#if defined(CONFIG_DEBUG_FS)
6666

67-
static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
68-
size_t size, loff_t *pos)
67+
68+
static int amdgpu_debugfs_process_reg_op(bool read, struct file *f,
69+
char __user *buf, size_t size, loff_t *pos)
6970
{
7071
struct amdgpu_device *adev = file_inode(f)->i_private;
7172
ssize_t result = 0;
7273
int r;
73-
bool pm_pg_lock, use_bank;
74-
unsigned instance_bank, sh_bank, se_bank;
74+
bool pm_pg_lock, use_bank, use_ring;
75+
unsigned instance_bank, sh_bank, se_bank, me, pipe, queue;
7576

76-
if (size & 0x3 || *pos & 0x3)
77+
pm_pg_lock = use_bank = use_ring = false;
78+
instance_bank = sh_bank = se_bank = me = pipe = queue = 0;
79+
80+
if (size & 0x3 || *pos & 0x3 ||
81+
((*pos & (1ULL << 62)) && (*pos & (1ULL << 61))))
7782
return -EINVAL;
7883

7984
/* are we reading registers for which a PG lock is necessary? */
@@ -91,8 +96,15 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
9196
if (instance_bank == 0x3FF)
9297
instance_bank = 0xFFFFFFFF;
9398
use_bank = 1;
99+
} else if (*pos & (1ULL << 61)) {
100+
101+
me = (*pos & GENMASK_ULL(33, 24)) >> 24;
102+
pipe = (*pos & GENMASK_ULL(43, 34)) >> 34;
103+
queue = (*pos & GENMASK_ULL(53, 44)) >> 44;
104+
105+
use_ring = 1;
94106
} else {
95-
use_bank = 0;
107+
use_bank = use_ring = 0;
96108
}
97109

98110
*pos &= (1UL << 22) - 1;
@@ -104,6 +116,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
104116
mutex_lock(&adev->grbm_idx_mutex);
105117
amdgpu_gfx_select_se_sh(adev, se_bank,
106118
sh_bank, instance_bank);
119+
} else if (use_ring) {
120+
mutex_lock(&adev->srbm_mutex);
121+
amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue);
107122
}
108123

109124
if (pm_pg_lock)
@@ -115,8 +130,14 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
115130
if (*pos > adev->rmmio_size)
116131
goto end;
117132

118-
value = RREG32(*pos >> 2);
119-
r = put_user(value, (uint32_t *)buf);
133+
if (read) {
134+
value = RREG32(*pos >> 2);
135+
r = put_user(value, (uint32_t *)buf);
136+
} else {
137+
r = get_user(value, (uint32_t *)buf);
138+
if (!r)
139+
WREG32(*pos >> 2, value);
140+
}
120141
if (r) {
121142
result = r;
122143
goto end;
@@ -132,6 +153,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
132153
if (use_bank) {
133154
amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
134155
mutex_unlock(&adev->grbm_idx_mutex);
156+
} else if (use_ring) {
157+
amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0);
158+
mutex_unlock(&adev->srbm_mutex);
135159
}
136160

137161
if (pm_pg_lock)
@@ -140,78 +164,17 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
140164
return result;
141165
}
142166

167+
168+
static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
169+
size_t size, loff_t *pos)
170+
{
171+
return amdgpu_debugfs_process_reg_op(true, f, buf, size, pos);
172+
}
173+
143174
static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
144175
size_t size, loff_t *pos)
145176
{
146-
struct amdgpu_device *adev = file_inode(f)->i_private;
147-
ssize_t result = 0;
148-
int r;
149-
bool pm_pg_lock, use_bank;
150-
unsigned instance_bank, sh_bank, se_bank;
151-
152-
if (size & 0x3 || *pos & 0x3)
153-
return -EINVAL;
154-
155-
/* are we reading registers for which a PG lock is necessary? */
156-
pm_pg_lock = (*pos >> 23) & 1;
157-
158-
if (*pos & (1ULL << 62)) {
159-
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
160-
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
161-
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
162-
163-
if (se_bank == 0x3FF)
164-
se_bank = 0xFFFFFFFF;
165-
if (sh_bank == 0x3FF)
166-
sh_bank = 0xFFFFFFFF;
167-
if (instance_bank == 0x3FF)
168-
instance_bank = 0xFFFFFFFF;
169-
use_bank = 1;
170-
} else {
171-
use_bank = 0;
172-
}
173-
174-
*pos &= (1UL << 22) - 1;
175-
176-
if (use_bank) {
177-
if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
178-
(se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
179-
return -EINVAL;
180-
mutex_lock(&adev->grbm_idx_mutex);
181-
amdgpu_gfx_select_se_sh(adev, se_bank,
182-
sh_bank, instance_bank);
183-
}
184-
185-
if (pm_pg_lock)
186-
mutex_lock(&adev->pm.mutex);
187-
188-
while (size) {
189-
uint32_t value;
190-
191-
if (*pos > adev->rmmio_size)
192-
return result;
193-
194-
r = get_user(value, (uint32_t *)buf);
195-
if (r)
196-
return r;
197-
198-
WREG32(*pos >> 2, value);
199-
200-
result += 4;
201-
buf += 4;
202-
*pos += 4;
203-
size -= 4;
204-
}
205-
206-
if (use_bank) {
207-
amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
208-
mutex_unlock(&adev->grbm_idx_mutex);
209-
}
210-
211-
if (pm_pg_lock)
212-
mutex_unlock(&adev->pm.mutex);
213-
214-
return result;
177+
return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos);
215178
}
216179

217180
static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,11 @@ static int __init amdgpu_init(void)
922922
{
923923
int r;
924924

925+
if (vgacon_text_force()) {
926+
DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
927+
return -EINVAL;
928+
}
929+
925930
r = amdgpu_sync_init();
926931
if (r)
927932
goto error_sync;
@@ -930,10 +935,6 @@ static int __init amdgpu_init(void)
930935
if (r)
931936
goto error_fence;
932937

933-
if (vgacon_text_force()) {
934-
DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
935-
return -EINVAL;
936-
}
937938
DRM_INFO("amdgpu kernel modesetting enabled.\n");
938939
driver = &kms_driver;
939940
pdriver = &amdgpu_kms_pci_driver;

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
410410
int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
411411
unsigned num_hw_submission)
412412
{
413+
long timeout;
413414
int r;
414415

415416
/* Check that num_hw_submission is a power of two */
@@ -433,11 +434,16 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
433434

434435
/* No need to setup the GPU scheduler for KIQ ring */
435436
if (ring->funcs->type != AMDGPU_RING_TYPE_KIQ) {
437+
/* for non-sriov case, no timeout enforce on compute ring */
438+
if ((ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE)
439+
&& !amdgpu_sriov_vf(ring->adev))
440+
timeout = MAX_SCHEDULE_TIMEOUT;
441+
else
442+
timeout = msecs_to_jiffies(amdgpu_lockup_timeout);
443+
436444
r = drm_sched_init(&ring->sched, &amdgpu_sched_ops,
437445
num_hw_submission, amdgpu_job_hang_limit,
438-
(ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) ?
439-
MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(amdgpu_lockup_timeout),
440-
ring->name);
446+
timeout, ring->name);
441447
if (r) {
442448
DRM_ERROR("Failed to create scheduler on ring %s.\n",
443449
ring->name);

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,23 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
5656
alignment = PAGE_SIZE;
5757
}
5858

59+
retry:
5960
r = amdgpu_bo_create(adev, size, alignment, initial_domain,
6061
flags, type, resv, &bo);
6162
if (r) {
62-
DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
63-
size, initial_domain, alignment, r);
63+
if (r != -ERESTARTSYS) {
64+
if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
65+
flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
66+
goto retry;
67+
}
68+
69+
if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
70+
initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
71+
goto retry;
72+
}
73+
DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
74+
size, initial_domain, alignment, r);
75+
}
6476
return r;
6577
}
6678
*obj = &bo->gem_base;

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,6 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
356356
struct amdgpu_bo *bo;
357357
unsigned long page_align;
358358
size_t acc_size;
359-
u32 domains;
360359
int r;
361360

362361
page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
@@ -418,23 +417,12 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
418417
#endif
419418

420419
bo->tbo.bdev = &adev->mman.bdev;
421-
domains = bo->preferred_domains;
422-
retry:
423-
amdgpu_ttm_placement_from_domain(bo, domains);
420+
amdgpu_ttm_placement_from_domain(bo, domain);
421+
424422
r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type,
425423
&bo->placement, page_align, &ctx, acc_size,
426424
NULL, resv, &amdgpu_ttm_bo_destroy);
427-
428-
if (unlikely(r && r != -ERESTARTSYS)) {
429-
if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
430-
bo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
431-
goto retry;
432-
} else if (domains != bo->preferred_domains) {
433-
domains = bo->allowed_domains;
434-
goto retry;
435-
}
436-
}
437-
if (unlikely(r))
425+
if (unlikely(r != 0))
438426
return r;
439427

440428
if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size &&

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ static void cik_sdma_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
859859
amdgpu_ring_write(ring, addr & 0xfffffffc);
860860
amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
861861
amdgpu_ring_write(ring, seq); /* reference */
862-
amdgpu_ring_write(ring, 0xfffffff); /* mask */
862+
amdgpu_ring_write(ring, 0xffffffff); /* mask */
863863
amdgpu_ring_write(ring, (0xfff << 16) | 4); /* retry count, poll interval */
864864
}
865865

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3061,11 +3061,18 @@ static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,
30613061
start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
30623062
}
30633063

3064+
static void gfx_v6_0_select_me_pipe_q(struct amdgpu_device *adev,
3065+
u32 me, u32 pipe, u32 q)
3066+
{
3067+
DRM_INFO("Not implemented\n");
3068+
}
3069+
30643070
static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = {
30653071
.get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter,
30663072
.select_se_sh = &gfx_v6_0_select_se_sh,
30673073
.read_wave_data = &gfx_v6_0_read_wave_data,
30683074
.read_wave_sgprs = &gfx_v6_0_read_wave_sgprs,
3075+
.select_me_pipe_q = &gfx_v6_0_select_me_pipe_q
30693076
};
30703077

30713078
static int gfx_v6_0_early_init(void *handle)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4270,11 +4270,18 @@ static void gfx_v7_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,
42704270
start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
42714271
}
42724272

4273+
static void gfx_v7_0_select_me_pipe_q(struct amdgpu_device *adev,
4274+
u32 me, u32 pipe, u32 q)
4275+
{
4276+
cik_srbm_select(adev, me, pipe, q, 0);
4277+
}
4278+
42734279
static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = {
42744280
.get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter,
42754281
.select_se_sh = &gfx_v7_0_select_se_sh,
42764282
.read_wave_data = &gfx_v7_0_read_wave_data,
42774283
.read_wave_sgprs = &gfx_v7_0_read_wave_sgprs,
4284+
.select_me_pipe_q = &gfx_v7_0_select_me_pipe_q
42784285
};
42794286

42804287
static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3475,6 +3475,12 @@ static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev,
34753475
WREG32(mmGRBM_GFX_INDEX, data);
34763476
}
34773477

3478+
static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev,
3479+
u32 me, u32 pipe, u32 q)
3480+
{
3481+
vi_srbm_select(adev, me, pipe, q, 0);
3482+
}
3483+
34783484
static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
34793485
{
34803486
u32 data, mask;
@@ -5442,6 +5448,7 @@ static const struct amdgpu_gfx_funcs gfx_v8_0_gfx_funcs = {
54425448
.select_se_sh = &gfx_v8_0_select_se_sh,
54435449
.read_wave_data = &gfx_v8_0_read_wave_data,
54445450
.read_wave_sgprs = &gfx_v8_0_read_wave_sgprs,
5451+
.select_me_pipe_q = &gfx_v8_0_select_me_pipe_q
54455452
};
54465453

54475454
static int gfx_v8_0_early_init(void *handle)

0 commit comments

Comments
 (0)