drm/xe: change old msi irq api to a new one
authorDani Liberman <dliberman@habana.ai>
Mon, 18 Sep 2023 11:48:47 +0000 (14:48 +0300)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:41:16 +0000 (11:41 -0500)
As a preparation for msix support, changing for new msi irq api
which supports both msi and msix.

Reviewed-by: Ohad Sharabi <osharabi@habana.ai>
Signed-off-by: Dani Liberman <dliberman@habana.ai>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
[Rebase fixes by Rodrigo]

drivers/gpu/drm/xe/xe_irq.c
drivers/gpu/drm/xe/xe_pci.c

index e1126eccb50e6f2d0331f680460a90b0af0d7436..82ddf9d84a56f68ca62ebee6b6c5ca1e4944e587 100644 (file)
@@ -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)
index b72d9f568768bcae9cf31bac23c8fd6a84d025d9..7e018ee9db40685196a6d661eb886c4a35f1e8a2 100644 (file)
@@ -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;