|
41 | 41 | #include "gt/intel_lrc.h" |
42 | 42 | #include "gt/intel_ring.h" |
43 | 43 | #include "gt/intel_gt_requests.h" |
| 44 | +#include "gt/shmem_utils.h" |
44 | 45 | #include "gvt.h" |
45 | 46 | #include "i915_pvinfo.h" |
46 | 47 | #include "trace.h" |
@@ -3094,111 +3095,57 @@ int intel_gvt_scan_and_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) |
3094 | 3095 | */ |
3095 | 3096 | void intel_gvt_update_reg_whitelist(struct intel_vgpu *vgpu) |
3096 | 3097 | { |
| 3098 | + const unsigned long start = LRC_STATE_PN * PAGE_SIZE; |
3097 | 3099 | struct intel_gvt *gvt = vgpu->gvt; |
3098 | | - struct drm_i915_private *dev_priv = gvt->gt->i915; |
3099 | 3100 | struct intel_engine_cs *engine; |
3100 | 3101 | 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; |
3107 | 3102 |
|
3108 | 3103 | if (gvt->is_reg_whitelist_updated) |
3109 | 3104 | return; |
3110 | 3105 |
|
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 | | - |
3135 | 3106 | /* 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) { |
3139 | 3108 | 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; |
3152 | 3111 |
|
3153 | | - i915_gem_object_set_cache_coherency(obj, |
3154 | | - I915_CACHE_LLC); |
| 3112 | + if (!engine->default_state) |
| 3113 | + continue; |
3155 | 3114 |
|
3156 | | - vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB); |
| 3115 | + vaddr = shmem_pin_map(engine->default_state); |
3157 | 3116 | 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; |
3162 | 3120 | } |
3163 | 3121 |
|
3164 | 3122 | s.buf_type = RING_BUFFER_CTX; |
3165 | 3123 | s.buf_addr_type = GTT_BUFFER; |
3166 | 3124 | s.vgpu = vgpu; |
3167 | 3125 | s.engine = engine; |
3168 | 3126 | s.ring_start = 0; |
3169 | | - s.ring_size = size; |
| 3127 | + s.ring_size = engine->context_size - start; |
3170 | 3128 | s.ring_head = 0; |
3171 | | - s.ring_tail = size; |
| 3129 | + s.ring_tail = s.ring_size; |
3172 | 3130 | s.rb_va = vaddr + start; |
3173 | 3131 | s.workload = NULL; |
3174 | 3132 | s.is_ctx_wa = false; |
3175 | 3133 | s.is_init_ctx = true; |
3176 | 3134 |
|
3177 | 3135 | /* skipping the first RING_CTX_SIZE(0x50) dwords */ |
3178 | 3136 | 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"); |
3182 | 3141 | } |
3183 | 3142 |
|
3184 | | - ret = command_scan(&s, 0, size, 0, size); |
| 3143 | + shmem_unpin_map(engine->default_state, vaddr); |
3185 | 3144 | if (ret) |
3186 | | - gvt_err("Scan init ctx error\n"); |
3187 | | - |
3188 | | - i915_gem_object_unpin_map(obj); |
| 3145 | + return; |
3189 | 3146 | } |
3190 | 3147 |
|
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; |
3202 | 3149 | } |
3203 | 3150 |
|
3204 | 3151 | int intel_gvt_scan_engine_context(struct intel_vgpu_workload *workload) |
|
0 commit comments