From 14d25d8d684d0196d160653659c5afbf5af777f0 Mon Sep 17 00:00:00 2001 From: Dani Liberman Date: Mon, 18 Sep 2023 14:48:47 +0300 Subject: [PATCH] drm/xe: change old msi irq api to a new one As a preparation for msix support, changing for new msi irq api which supports both msi and msix. Reviewed-by: Ohad Sharabi Signed-off-by: Dani Liberman Signed-off-by: Rodrigo Vivi [Rebase fixes by Rodrigo] --- drivers/gpu/drm/xe/xe_irq.c | 38 ++++++++++++++++++++++++++++--------- drivers/gpu/drm/xe/xe_pci.c | 3 --- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c index e1126eccb50e..82ddf9d84a56 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 b72d9f568768..7e018ee9db40 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; -- 2.25.1