Skip to content

Commit d153e8c

Browse files
committed
Merge tag 'drm-intel-next-fixes-2021-02-25' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
A fix for color format check from Ville, plus the re-enable of -Wuninitialized from Nathan, and the GVT fixes including fixes for ww locking, cmd parser and a general cleanup of dev_priv->gt. Signed-off-by: Dave Airlie <[email protected]> From: Rodrigo Vivi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 9c712c9 + ed428ff commit d153e8c

File tree

7 files changed

+65
-94
lines changed

7 files changed

+65
-94
lines changed

drivers/gpu/drm/i915/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ subdir-ccflags-y += $(call cc-disable-warning, unused-but-set-variable)
2121
subdir-ccflags-y += $(call cc-disable-warning, sign-compare)
2222
subdir-ccflags-y += $(call cc-disable-warning, sometimes-uninitialized)
2323
subdir-ccflags-y += $(call cc-disable-warning, initializer-overrides)
24-
subdir-ccflags-y += $(call cc-disable-warning, uninitialized)
2524
subdir-ccflags-y += $(call cc-disable-warning, frame-address)
2625
subdir-ccflags-$(CONFIG_DRM_I915_WERROR) += -Werror
2726

drivers/gpu/drm/i915/display/intel_crtc.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ void intel_crtc_state_reset(struct intel_crtc_state *crtc_state,
109109
crtc_state->cpu_transcoder = INVALID_TRANSCODER;
110110
crtc_state->master_transcoder = INVALID_TRANSCODER;
111111
crtc_state->hsw_workaround_pipe = INVALID_PIPE;
112-
crtc_state->output_format = INTEL_OUTPUT_FORMAT_INVALID;
113112
crtc_state->scaler_state.scaler_id = -1;
114113
crtc_state->mst_master_transcoder = INVALID_TRANSCODER;
115114
}

drivers/gpu/drm/i915/display/intel_display.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10211,7 +10211,6 @@ static void snprintf_output_types(char *buf, size_t len,
1021110211
}
1021210212

1021310213
static const char * const output_format_str[] = {
10214-
[INTEL_OUTPUT_FORMAT_INVALID] = "Invalid",
1021510214
[INTEL_OUTPUT_FORMAT_RGB] = "RGB",
1021610215
[INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
1021710216
[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
@@ -10220,7 +10219,7 @@ static const char * const output_format_str[] = {
1022010219
static const char *output_formats(enum intel_output_format format)
1022110220
{
1022210221
if (format >= ARRAY_SIZE(output_format_str))
10223-
format = INTEL_OUTPUT_FORMAT_INVALID;
10222+
return "invalid";
1022410223
return output_format_str[format];
1022510224
}
1022610225

drivers/gpu/drm/i915/display/intel_display_types.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,6 @@ struct intel_crtc_wm_state {
830830
};
831831

832832
enum intel_output_format {
833-
INTEL_OUTPUT_FORMAT_INVALID,
834833
INTEL_OUTPUT_FORMAT_RGB,
835834
INTEL_OUTPUT_FORMAT_YCBCR420,
836835
INTEL_OUTPUT_FORMAT_YCBCR444,

drivers/gpu/drm/i915/gvt/cmd_parser.c

Lines changed: 20 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "gt/intel_lrc.h"
4242
#include "gt/intel_ring.h"
4343
#include "gt/intel_gt_requests.h"
44+
#include "gt/shmem_utils.h"
4445
#include "gvt.h"
4546
#include "i915_pvinfo.h"
4647
#include "trace.h"
@@ -3094,111 +3095,57 @@ int intel_gvt_scan_and_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
30943095
*/
30953096
void intel_gvt_update_reg_whitelist(struct intel_vgpu *vgpu)
30963097
{
3098+
const unsigned long start = LRC_STATE_PN * PAGE_SIZE;
30973099
struct intel_gvt *gvt = vgpu->gvt;
3098-
struct drm_i915_private *dev_priv = gvt->gt->i915;
30993100
struct intel_engine_cs *engine;
31003101
enum intel_engine_id id;
3101-
const unsigned long start = LRC_STATE_PN * PAGE_SIZE;
3102-
struct i915_request *rq;
3103-
struct intel_vgpu_submission *s = &vgpu->submission;
3104-
struct i915_request *requests[I915_NUM_ENGINES] = {};
3105-
bool is_ctx_pinned[I915_NUM_ENGINES] = {};
3106-
int ret = 0;
31073102

31083103
if (gvt->is_reg_whitelist_updated)
31093104
return;
31103105

3111-
for_each_engine(engine, &dev_priv->gt, id) {
3112-
ret = intel_context_pin(s->shadow[id]);
3113-
if (ret) {
3114-
gvt_vgpu_err("fail to pin shadow ctx\n");
3115-
goto out;
3116-
}
3117-
is_ctx_pinned[id] = true;
3118-
3119-
rq = i915_request_create(s->shadow[id]);
3120-
if (IS_ERR(rq)) {
3121-
gvt_vgpu_err("fail to alloc default request\n");
3122-
ret = -EIO;
3123-
goto out;
3124-
}
3125-
requests[id] = i915_request_get(rq);
3126-
i915_request_add(rq);
3127-
}
3128-
3129-
if (intel_gt_wait_for_idle(&dev_priv->gt,
3130-
I915_GEM_IDLE_TIMEOUT) == -ETIME) {
3131-
ret = -EIO;
3132-
goto out;
3133-
}
3134-
31353106
/* scan init ctx to update cmd accessible list */
3136-
for_each_engine(engine, &dev_priv->gt, id) {
3137-
int size = engine->context_size - PAGE_SIZE;
3138-
void *vaddr;
3107+
for_each_engine(engine, gvt->gt, id) {
31393108
struct parser_exec_state s;
3140-
struct drm_i915_gem_object *obj;
3141-
struct i915_request *rq;
3142-
3143-
rq = requests[id];
3144-
GEM_BUG_ON(!i915_request_completed(rq));
3145-
GEM_BUG_ON(!intel_context_is_pinned(rq->context));
3146-
obj = rq->context->state->obj;
3147-
3148-
if (!obj) {
3149-
ret = -EIO;
3150-
goto out;
3151-
}
3109+
void *vaddr;
3110+
int ret;
31523111

3153-
i915_gem_object_set_cache_coherency(obj,
3154-
I915_CACHE_LLC);
3112+
if (!engine->default_state)
3113+
continue;
31553114

3156-
vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
3115+
vaddr = shmem_pin_map(engine->default_state);
31573116
if (IS_ERR(vaddr)) {
3158-
gvt_err("failed to pin init ctx obj, ring=%d, err=%lx\n",
3159-
id, PTR_ERR(vaddr));
3160-
ret = PTR_ERR(vaddr);
3161-
goto out;
3117+
gvt_err("failed to map %s->default state, err:%zd\n",
3118+
engine->name, PTR_ERR(vaddr));
3119+
return;
31623120
}
31633121

31643122
s.buf_type = RING_BUFFER_CTX;
31653123
s.buf_addr_type = GTT_BUFFER;
31663124
s.vgpu = vgpu;
31673125
s.engine = engine;
31683126
s.ring_start = 0;
3169-
s.ring_size = size;
3127+
s.ring_size = engine->context_size - start;
31703128
s.ring_head = 0;
3171-
s.ring_tail = size;
3129+
s.ring_tail = s.ring_size;
31723130
s.rb_va = vaddr + start;
31733131
s.workload = NULL;
31743132
s.is_ctx_wa = false;
31753133
s.is_init_ctx = true;
31763134

31773135
/* skipping the first RING_CTX_SIZE(0x50) dwords */
31783136
ret = ip_gma_set(&s, RING_CTX_SIZE);
3179-
if (ret) {
3180-
i915_gem_object_unpin_map(obj);
3181-
goto out;
3137+
if (ret == 0) {
3138+
ret = command_scan(&s, 0, s.ring_size, 0, s.ring_size);
3139+
if (ret)
3140+
gvt_err("Scan init ctx error\n");
31823141
}
31833142

3184-
ret = command_scan(&s, 0, size, 0, size);
3143+
shmem_unpin_map(engine->default_state, vaddr);
31853144
if (ret)
3186-
gvt_err("Scan init ctx error\n");
3187-
3188-
i915_gem_object_unpin_map(obj);
3145+
return;
31893146
}
31903147

3191-
out:
3192-
if (!ret)
3193-
gvt->is_reg_whitelist_updated = true;
3194-
3195-
for (id = 0; id < I915_NUM_ENGINES ; id++) {
3196-
if (requests[id])
3197-
i915_request_put(requests[id]);
3198-
3199-
if (is_ctx_pinned[id])
3200-
intel_context_unpin(s->shadow[id]);
3201-
}
3148+
gvt->is_reg_whitelist_updated = true;
32023149
}
32033150

32043151
int intel_gvt_scan_engine_context(struct intel_vgpu_workload *workload)

drivers/gpu/drm/i915/gvt/execlist.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -522,12 +522,11 @@ static void init_vgpu_execlist(struct intel_vgpu *vgpu,
522522
static void clean_execlist(struct intel_vgpu *vgpu,
523523
intel_engine_mask_t engine_mask)
524524
{
525-
struct drm_i915_private *dev_priv = vgpu->gvt->gt->i915;
526-
struct intel_engine_cs *engine;
527525
struct intel_vgpu_submission *s = &vgpu->submission;
526+
struct intel_engine_cs *engine;
528527
intel_engine_mask_t tmp;
529528

530-
for_each_engine_masked(engine, &dev_priv->gt, engine_mask, tmp) {
529+
for_each_engine_masked(engine, vgpu->gvt->gt, engine_mask, tmp) {
531530
kfree(s->ring_scan_buffer[engine->id]);
532531
s->ring_scan_buffer[engine->id] = NULL;
533532
s->ring_scan_buffer_size[engine->id] = 0;
@@ -537,11 +536,10 @@ static void clean_execlist(struct intel_vgpu *vgpu,
537536
static void reset_execlist(struct intel_vgpu *vgpu,
538537
intel_engine_mask_t engine_mask)
539538
{
540-
struct drm_i915_private *dev_priv = vgpu->gvt->gt->i915;
541539
struct intel_engine_cs *engine;
542540
intel_engine_mask_t tmp;
543541

544-
for_each_engine_masked(engine, &dev_priv->gt, engine_mask, tmp)
542+
for_each_engine_masked(engine, vgpu->gvt->gt, engine_mask, tmp)
545543
init_vgpu_execlist(vgpu, engine);
546544
}
547545

drivers/gpu/drm/i915/gvt/scheduler.c

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,9 @@ static void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
412412
if (!wa_ctx->indirect_ctx.obj)
413413
return;
414414

415+
i915_gem_object_lock(wa_ctx->indirect_ctx.obj, NULL);
415416
i915_gem_object_unpin_map(wa_ctx->indirect_ctx.obj);
417+
i915_gem_object_unlock(wa_ctx->indirect_ctx.obj);
416418
i915_gem_object_put(wa_ctx->indirect_ctx.obj);
417419

418420
wa_ctx->indirect_ctx.obj = NULL;
@@ -520,6 +522,7 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
520522
struct intel_gvt *gvt = workload->vgpu->gvt;
521523
const int gmadr_bytes = gvt->device_info.gmadr_bytes_in_cmd;
522524
struct intel_vgpu_shadow_bb *bb;
525+
struct i915_gem_ww_ctx ww;
523526
int ret;
524527

525528
list_for_each_entry(bb, &workload->shadow_bb, list) {
@@ -544,10 +547,19 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
544547
* directly
545548
*/
546549
if (!bb->ppgtt) {
547-
bb->vma = i915_gem_object_ggtt_pin(bb->obj,
548-
NULL, 0, 0, 0);
550+
i915_gem_ww_ctx_init(&ww, false);
551+
retry:
552+
i915_gem_object_lock(bb->obj, &ww);
553+
554+
bb->vma = i915_gem_object_ggtt_pin_ww(bb->obj, &ww,
555+
NULL, 0, 0, 0);
549556
if (IS_ERR(bb->vma)) {
550557
ret = PTR_ERR(bb->vma);
558+
if (ret == -EDEADLK) {
559+
ret = i915_gem_ww_ctx_backoff(&ww);
560+
if (!ret)
561+
goto retry;
562+
}
551563
goto err;
552564
}
553565

@@ -561,13 +573,15 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
561573
0);
562574
if (ret)
563575
goto err;
564-
}
565576

566-
/* No one is going to touch shadow bb from now on. */
567-
i915_gem_object_flush_map(bb->obj);
577+
/* No one is going to touch shadow bb from now on. */
578+
i915_gem_object_flush_map(bb->obj);
579+
i915_gem_object_unlock(bb->obj);
580+
}
568581
}
569582
return 0;
570583
err:
584+
i915_gem_ww_ctx_fini(&ww);
571585
release_shadow_batch_buffer(workload);
572586
return ret;
573587
}
@@ -594,14 +608,29 @@ static int prepare_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
594608
unsigned char *per_ctx_va =
595609
(unsigned char *)wa_ctx->indirect_ctx.shadow_va +
596610
wa_ctx->indirect_ctx.size;
611+
struct i915_gem_ww_ctx ww;
612+
int ret;
597613

598614
if (wa_ctx->indirect_ctx.size == 0)
599615
return 0;
600616

601-
vma = i915_gem_object_ggtt_pin(wa_ctx->indirect_ctx.obj, NULL,
602-
0, CACHELINE_BYTES, 0);
603-
if (IS_ERR(vma))
604-
return PTR_ERR(vma);
617+
i915_gem_ww_ctx_init(&ww, false);
618+
retry:
619+
i915_gem_object_lock(wa_ctx->indirect_ctx.obj, &ww);
620+
621+
vma = i915_gem_object_ggtt_pin_ww(wa_ctx->indirect_ctx.obj, &ww, NULL,
622+
0, CACHELINE_BYTES, 0);
623+
if (IS_ERR(vma)) {
624+
ret = PTR_ERR(vma);
625+
if (ret == -EDEADLK) {
626+
ret = i915_gem_ww_ctx_backoff(&ww);
627+
if (!ret)
628+
goto retry;
629+
}
630+
return ret;
631+
}
632+
633+
i915_gem_object_unlock(wa_ctx->indirect_ctx.obj);
605634

606635
/* FIXME: we are not tracking our pinned VMA leaving it
607636
* up to the core to fix up the stray pin_count upon
@@ -635,12 +664,14 @@ static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload)
635664

636665
list_for_each_entry_safe(bb, pos, &workload->shadow_bb, list) {
637666
if (bb->obj) {
667+
i915_gem_object_lock(bb->obj, NULL);
638668
if (bb->va && !IS_ERR(bb->va))
639669
i915_gem_object_unpin_map(bb->obj);
640670

641671
if (bb->vma && !IS_ERR(bb->vma))
642672
i915_vma_unpin(bb->vma);
643673

674+
i915_gem_object_unlock(bb->obj);
644675
i915_gem_object_put(bb->obj);
645676
}
646677
list_del(&bb->list);
@@ -1015,13 +1046,12 @@ void intel_vgpu_clean_workloads(struct intel_vgpu *vgpu,
10151046
intel_engine_mask_t engine_mask)
10161047
{
10171048
struct intel_vgpu_submission *s = &vgpu->submission;
1018-
struct drm_i915_private *dev_priv = vgpu->gvt->gt->i915;
10191049
struct intel_engine_cs *engine;
10201050
struct intel_vgpu_workload *pos, *n;
10211051
intel_engine_mask_t tmp;
10221052

10231053
/* free the unsubmited workloads in the queues. */
1024-
for_each_engine_masked(engine, &dev_priv->gt, engine_mask, tmp) {
1054+
for_each_engine_masked(engine, vgpu->gvt->gt, engine_mask, tmp) {
10251055
list_for_each_entry_safe(pos, n,
10261056
&s->workload_q_head[engine->id], list) {
10271057
list_del_init(&pos->list);

0 commit comments

Comments
 (0)