Skip to content

Commit e2b921a

Browse files
committed
drm/i915: refine error process for i915 PXP virtualization
refine error process for PXP virtualization, add more trace for user triage. Signed-off-by: Xue, Bosheng <bosheng.xue@intel.com>
1 parent fe7b2fa commit e2b921a

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

drivers/gpu/drm/i915/pxp/virt/intel_pxp_fe.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include "intel_pxp_fe.h"
1515
#include "gt/iov/intel_iov_query.h"
1616

17+
#define PRELIM_DRM_I915_PXP_OP_STATUS_ERROR_RETURN 0xfff
18+
1719
int intel_pxp_fe_sm_ioctl_reserve_session(struct intel_pxp *pxp, struct drm_file *drmfile,
1820
int protection_mode, u32 *pxp_tag);
1921

@@ -74,7 +76,6 @@ static void event_cb(int event, void *priv)
7476
unsigned long flags;
7577
if (!pxp)
7678
return;
77-
printk("PXP FE: event receive: %d\n", event);
7879
spin_lock_irqsave(&pxp->fe.irq_lock, flags);
7980
pxp->session_events |= event;
8081
spin_unlock_irqrestore(&pxp->fe.irq_lock, flags);
@@ -88,7 +89,7 @@ void intel_pxp_fe_terminate(struct intel_pxp *pxp)
8889
mutex_lock(&pxp->fe.session_mutex);
8990
for (int index = 0; index < INTEL_PXP_MAX_HWDRM_SESSIONS; index++) {
9091
if (pxp->fe.hwdrm_sessions[index].index >= 0) {
91-
printk("%s, PXP FE: session terminate:%d\n", __FUNCTION__, index);
92+
drm_dbg(&pxp->fe.i915->drm, "%s, PXP FE: session terminate:%d\n", __FUNCTION__, index);
9293
intel_pxp_fe_sm_ioctl_terminate_session(pxp, pxp->fe.hwdrm_sessions[index].drmfile, index);
9394
}
9495
}
@@ -116,7 +117,7 @@ static void pxp_fe_session_work(struct work_struct *work)
116117
if (!events)
117118
return;
118119

119-
//printk("PXP FE: processing event-flags 0x%08x", events);
120+
drm_info(&pxp_fe->i915->drm, "PXP FE: processing event-flags 0x%08x", events);
120121

121122
if (events & PXP_INVAL_REQUIRED) {
122123
intel_pxp_invalidate(pxp_fe->i915->pxp);
@@ -143,7 +144,7 @@ int pxp_bind(void *gpu_priv, void *pxp_priv)
143144
struct virtio_pxp *vpxp = (struct virtio_pxp *)pxp_priv;
144145
if (!pxp || !vpxp)
145146
return -1;
146-
printk("%s\n", __FUNCTION__);
147+
trace_printk("%s\n", __FUNCTION__);
147148
pxp->fe.vpxp = vpxp;
148149
pxp->fe.enabled = true;
149150
pxp->fe.max_sessions = vpxp->sessions;
@@ -159,7 +160,7 @@ void pxp_unbind(void *gpu_priv)
159160
struct intel_pxp *pxp = (struct intel_pxp *)gpu_priv;
160161
if (!pxp)
161162
return;
162-
printk("%s\n", __FUNCTION__);
163+
trace_printk("%s\n", __FUNCTION__);
163164
pxp->fe.enabled = false;
164165
}
165166

@@ -256,7 +257,7 @@ int intel_pxp_fe_start(struct intel_pxp *pxp)
256257
return 0;
257258
if (intel_pxp_is_active(pxp))
258259
return 0;
259-
printk("%s\n", __FUNCTION__);
260+
DRM_INFO("%s\n", __FUNCTION__);
260261
pxp_key_instance_update(pxp);
261262

262263
pxp->fe.active = true;
@@ -270,7 +271,7 @@ void intel_pxp_fe_end(struct intel_pxp *pxp)
270271
return;
271272
if (!intel_pxp_is_active(pxp))
272273
return ;
273-
printk("%s\n", __FUNCTION__);
274+
DRM_INFO("%s\n", __FUNCTION__);
274275
flush_work(&pxp->fe.session_work);
275276
pxp->fe.active = false;
276277
}
@@ -310,7 +311,7 @@ int intel_pxp_fe_sm_ioctl_reserve_session(struct intel_pxp *pxp, struct drm_file
310311
int protection_mode, u32 *pxp_tag)
311312
{
312313
int ret = 0;
313-
int session_id = 0;
314+
int session_id = -1;
314315
struct prelim_drm_i915_pxp_set_session_status_params params;
315316
memset(&params, 0, sizeof(params));
316317
if (!drmfile || !pxp_tag || pxp->fe.avail_sessions <= 0)
@@ -320,9 +321,11 @@ int intel_pxp_fe_sm_ioctl_reserve_session(struct intel_pxp *pxp, struct drm_file
320321
ret = virtio_set_session(pxp->fe.vpxp, &params);
321322
*pxp_tag = params.pxp_tag;
322323
session_id = *pxp_tag & PRELIM_DRM_I915_PXP_TAG_SESSION_ID_MASK;
323-
//printk("%s, session_id:%d, ret:%d\n",__FUNCTION__, session_id, ret);
324-
if (session_id >= INTEL_PXP_MAX_HWDRM_SESSIONS || session_id < 0) {
325-
DRM_ERROR("PXP FE: invalid session id:%d", session_id);
324+
drm_dbg(&pxp->fe.i915->drm, "%s, session_id:%d, ret:%d\n",__FUNCTION__, session_id, ret);
325+
if (session_id >= INTEL_PXP_MAX_HWDRM_SESSIONS || session_id < 0 || ret != 0) {
326+
DRM_ERROR("PXP FE: invalid session id:%d, ret:%d", session_id, ret);
327+
if (ret > 0)
328+
return ret;
326329
return -1;
327330
}
328331
pxp->fe.avail_sessions--;
@@ -349,10 +352,9 @@ int intel_pxp_fe_sm_ioctl_mark_session_in_play(struct intel_pxp *pxp,
349352
params.pxp_tag = session_id;
350353
params.req_session_state = PRELIM_DRM_I915_PXP_REQ_SESSION_IN_PLAY;
351354
ret = virtio_set_session(pxp->fe.vpxp, &params);
352-
//printk("%s, session_id:%d, ret:%d\n",__FUNCTION__, session_id, ret);
353-
if (ret < 0)
354-
return ret;
355-
pxp->fe.hwdrm_sessions[session_id].is_valid = true;
355+
drm_dbg(&pxp->fe.i915->drm, "%s, session_id:%d, ret:%d\n",__FUNCTION__, session_id, ret);
356+
if (!ret)
357+
pxp->fe.hwdrm_sessions[session_id].is_valid = true;
356358
return ret;
357359
}
358360

@@ -367,14 +369,14 @@ int intel_pxp_fe_sm_ioctl_terminate_session(struct intel_pxp *pxp,
367369
return -EINVAL;
368370
if (!check_session_id(pxp, session_id))
369371
return -EINVAL;
372+
params.pxp_tag = session_id;
373+
params.req_session_state = PRELIM_DRM_I915_PXP_REQ_SESSION_TERMINATE;
374+
ret = virtio_set_session(pxp->fe.vpxp, &params);
375+
drm_dbg(&pxp->fe.i915->drm, "%s, session_id:%d, ret:%d\n",__FUNCTION__, session_id, ret);
370376
pxp->fe.hwdrm_sessions[session_id].is_valid = false;
371377
pxp->fe.hwdrm_sessions[session_id].index = -1;
372378
pxp->fe.hwdrm_sessions[session_id].drmfile = NULL;
373379
pxp->fe.avail_sessions++;
374-
params.pxp_tag = session_id;
375-
params.req_session_state = PRELIM_DRM_I915_PXP_REQ_SESSION_TERMINATE;
376-
ret = virtio_set_session(pxp->fe.vpxp, &params);
377-
//printk("%s, session_id:%d, ret:%d\n",__FUNCTION__, session_id, ret);
378380
return ret;
379381
}
380382

@@ -394,7 +396,7 @@ int intel_pxp_fe_io_message(struct intel_pxp *pxp,
394396
params.msg_out = (u64)msg_out;
395397
params.msg_out_buf_size = msg_out_max_size;
396398
ret = virtio_io_msg(pxp->fe.vpxp, &params);
397-
//printk("%s, ret:%d, ret size:%d\n",__FUNCTION__, ret, params.msg_out_ret_size);
399+
drm_dbg(&pxp->fe.i915->drm, "%s, ret:%d, ret size:%d\n",__FUNCTION__, ret, params.msg_out_ret_size);
398400
*msg_out_rcv_size = params.msg_out_ret_size;
399401
return ret;
400402
}
@@ -416,7 +418,7 @@ int intel_pxp_fe_sm_ioctl_query_pxp_tag(struct intel_pxp *pxp,
416418
ret = virtio_query_tag(pxp->fe.vpxp, &params);
417419
*pxp_tag = params.pxp_tag;
418420
*session_is_alive = params.session_is_alive;
419-
//printk("%s, ret:%d\n",__FUNCTION__, ret);
421+
drm_dbg(&pxp->fe.i915->drm, "%s, ret:%d\n",__FUNCTION__, ret);
420422
return ret;
421423
}
422424

@@ -431,6 +433,7 @@ int intel_pxp_fe_gsccs_get_client_host_session_handle(struct intel_pxp *pxp, str
431433
params.request_type = request_type;
432434
ret = virtio_host_session_handle_request(pxp->fe.vpxp, &params);
433435
*host_session_handle = params.host_session_handle;
436+
drm_dbg(&pxp->fe.i915->drm, "%s, ret:%d\n",__FUNCTION__, ret);
434437
return ret;
435438
}
436439

@@ -467,6 +470,10 @@ static int pxp_fe_set_session_status(struct intel_pxp *pxp,
467470
default:
468471
ret = -EINVAL;
469472
}
473+
if (ret == PRELIM_DRM_I915_PXP_OP_STATUS_ERROR_RETURN)
474+
ret = -1;
475+
drm_dbg(&pxp->fe.i915->drm, "set fe pxp session status (req %d ret %d)\n",
476+
params.req_session_state, ret);
470477

471478
if (ret >= 0) {
472479
pxp_ops->status = ret;
@@ -475,6 +482,9 @@ static int pxp_fe_set_session_status(struct intel_pxp *pxp,
475482
ret = -EFAULT;
476483
else
477484
ret = 0;
485+
} else {
486+
DRM_ERROR("Failed to set fe pxp session status (req %d ret%d)\n",
487+
params.req_session_state, ret);
478488
}
479489

480490
return ret;
@@ -523,7 +533,7 @@ intel_pxp_fe_ioctl_io_message(struct intel_pxp *pxp, struct drm_file *drmfile,
523533
&params->msg_out_ret_size);
524534

525535
if (ret) {
526-
drm_dbg(&i915->drm, "Failed to send/receive user TEE message\n");
536+
drm_dbg(&i915->drm, "Failed to send/receive user TEE message, ret:%d\n", ret);
527537
goto end;
528538
}
529539

@@ -691,7 +701,7 @@ void intel_pxp_fe_close(struct intel_pxp *pxp, struct drm_file *drmfile)
691701
mutex_lock(&pxp->fe.session_mutex);
692702
for (index = 0; index < INTEL_PXP_MAX_HWDRM_SESSIONS; index++) {
693703
if (pxp->fe.hwdrm_sessions[index].index >= 0 && (pxp->fe.hwdrm_sessions[index].drmfile == drmfile)) {
694-
printk("%s, PXP FE: session terminate:%d\n", __FUNCTION__, index);
704+
drm_dbg(&pxp->fe.i915->drm, "%s, PXP FE: session terminate:%d\n", __FUNCTION__, index);
695705
intel_pxp_fe_sm_ioctl_terminate_session(pxp, pxp->fe.hwdrm_sessions[index].drmfile, index);
696706
}
697707
}

drivers/gpu/drm/i915/pxp/virt/virtio_pxp.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ static void virtpxp_recv_events(struct virtqueue *vq)
4444
spin_lock_irqsave(&vpxp->event_lock, flags);
4545
while ((event = virtqueue_get_buf(vq, &len)) != NULL) {
4646
spin_unlock_irqrestore(&vpxp->event_lock, flags);
47-
spin_lock_irqsave(&pxp_lock, flags);
4847
if (vpxp->irq_recv)
4948
vpxp->irq_recv(*event, vpxp->cb_priv);
50-
spin_unlock_irqrestore(&pxp_lock, flags);
5149
virtpxp_queue_evtbuf(vpxp);
5250
spin_lock_irqsave(&vpxp->event_lock, flags);
5351
}
@@ -416,7 +414,7 @@ static int virtpxp_probe(struct virtio_device *vdev)
416414
gdev->vpxp = vpxp;
417415
}
418416
spin_unlock_irqrestore(&pxp_lock, flags);
419-
printk("virtio_pxp:vpxp:%p device idx:%d, vfid:%d, sessions:%d\n", vpxp, device_idx, device_vfid, sessions);
417+
printk("virtio_pxp: init pxp device idx:%d, vfid:%d, sessions:%d\n", device_idx, device_vfid, sessions);
420418

421419
return 0;
422420

0 commit comments

Comments
 (0)