diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c index e1126eccb50e6f2d0331f680460a90b0af0d7436..82ddf9d84a56f68ca62ebee6b6c5ca1e4944e587 100644 --- a/drivers/gpu/drm/xe/xe_irq.c +++ b/drivers/gpu/drm/xe/xe_irq.c @@ -555,23 +555,24 @@ static void irq_uninstall(struct drm_device *drm, void *arg) { struct xe_device *xe = arg; struct pci_dev *pdev = to_pci_dev(xe->drm.dev); - int irq = pdev->irq; + int irq; if (!xe->irq.enabled) return; xe->irq.enabled = false; xe_irq_reset(xe); + + irq = pci_irq_vector(pdev, 0); free_irq(irq, xe); - if (pdev->msi_enabled) - pci_disable_msi(pdev); + pci_free_irq_vectors(pdev); } int xe_irq_install(struct xe_device *xe) { - int irq = to_pci_dev(xe->drm.dev)->irq; + struct pci_dev *pdev = to_pci_dev(xe->drm.dev); irq_handler_t irq_handler; - int err; + int err, irq; irq_handler = xe_irq_handler(xe); if (!irq_handler) { @@ -581,16 +582,35 @@ int xe_irq_install(struct xe_device *xe) xe_irq_reset(xe); - err = request_irq(irq, irq_handler, - IRQF_SHARED, DRIVER_NAME, xe); - if (err < 0) + err = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); + if (err < 0) { + drm_err(&xe->drm, "MSI: Failed to enable support %d\n", err); return err; + } + + irq = pci_irq_vector(pdev, 0); + err = request_irq(irq, irq_handler, IRQF_SHARED, DRIVER_NAME, xe); + if (err < 0) { + drm_err(&xe->drm, "Failed to request MSI IRQ %d\n", err); + goto free_pci_irq_vectors; + } xe->irq.enabled = true; xe_irq_postinstall(xe); - return drmm_add_action_or_reset(&xe->drm, irq_uninstall, xe); + err = drmm_add_action_or_reset(&xe->drm, irq_uninstall, xe); + if (err) + goto free_irq_handler; + + return 0; + +free_irq_handler: + free_irq(irq, xe); +free_pci_irq_vectors: + pci_free_irq_vectors(pdev); + + return err; } void xe_irq_shutdown(struct xe_device *xe) diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c index b72d9f568768bcae9cf31bac23c8fd6a84d025d9..7e018ee9db40685196a6d661eb886c4a35f1e8a2 100644 --- a/drivers/gpu/drm/xe/xe_pci.c +++ b/drivers/gpu/drm/xe/xe_pci.c @@ -670,9 +670,6 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) pci_set_master(pdev); - if (pci_enable_msi(pdev) < 0) - drm_dbg(&xe->drm, "can't enable MSI"); - err = xe_info_init(xe, desc, subplatform_desc); if (err) goto err_pci_disable;