diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c index f30f8f668dee29b9a642f3f1ec6f8ca8f7717f55..c641c802d4fb69c0078c47e4ba681514afce4c04 100644 --- a/drivers/gpu/drm/xe/xe_device.c +++ b/drivers/gpu/drm/xe/xe_device.c @@ -864,8 +864,8 @@ int xe_device_probe(struct xe_device *xe) /* A PXP init failure is not fatal */ err = xe_pxp_init(xe); - if (err && err != -EOPNOTSUPP) - drm_err(&xe->drm, "PXP initialization failed: %pe\n", ERR_PTR(err)); + if (err) + goto err_fini_display; err = drm_dev_register(&xe->drm, 0); if (err) diff --git a/drivers/gpu/drm/xe/xe_pxp.c b/drivers/gpu/drm/xe/xe_pxp.c index 5e7a1688a771c03f26118ec4cd66935b52743755..3cd3f83e86b008a1ae66c184c1a734cb94ff54ad 100644 --- a/drivers/gpu/drm/xe/xe_pxp.c +++ b/drivers/gpu/drm/xe/xe_pxp.c @@ -372,8 +372,8 @@ static void pxp_fini(void *arg) * are performed asynchronously as part of the GSC init. PXP can only be used * after both this function and the async worker have completed. * - * Returns -EOPNOTSUPP if PXP is not supported, 0 if PXP initialization is - * successful, other errno value if there is an error during the init. + * Returns 0 if PXP is not supported or if PXP initialization is successful, + * other errno value if there is an error during the init. */ int xe_pxp_init(struct xe_device *xe) { @@ -382,26 +382,28 @@ int xe_pxp_init(struct xe_device *xe) int err; if (!xe_pxp_is_supported(xe)) - return -EOPNOTSUPP; + return 0; /* we only support PXP on single tile devices with a media GT */ if (xe->info.tile_count > 1 || !gt) - return -EOPNOTSUPP; + return 0; /* The GSCCS is required for submissions to the GSC FW */ if (!(gt->info.engine_mask & BIT(XE_HW_ENGINE_GSCCS0))) - return -EOPNOTSUPP; + return 0; /* PXP requires both GSC and HuC firmwares to be available */ if (!xe_uc_fw_is_loadable(>->uc.gsc.fw) || !xe_uc_fw_is_loadable(>->uc.huc.fw)) { drm_info(&xe->drm, "skipping PXP init due to missing FW dependencies"); - return -EOPNOTSUPP; + return 0; } pxp = drmm_kzalloc(&xe->drm, sizeof(struct xe_pxp), GFP_KERNEL); - if (!pxp) - return -ENOMEM; + if (!pxp) { + err = -ENOMEM; + goto out; + } INIT_LIST_HEAD(&pxp->queues.list); spin_lock_init(&pxp->queues.lock); @@ -448,6 +450,8 @@ int xe_pxp_init(struct xe_device *xe) destroy_workqueue(pxp->irq.wq); out_free: drmm_kfree(&xe->drm, pxp); +out: + drm_err(&xe->drm, "PXP initialization failed: %pe\n", ERR_PTR(err)); return err; }