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 <osharabi@habana.ai> Signed-off-by: Dani Liberman <dliberman@habana.ai> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> [Rebase fixes by Rodrigo]
This commit is contained in:
parent
dbac286d85
commit
14d25d8d68
2 changed files with 29 additions and 12 deletions
|
@ -555,23 +555,24 @@ static void irq_uninstall(struct drm_device *drm, void *arg)
|
||||||
{
|
{
|
||||||
struct xe_device *xe = arg;
|
struct xe_device *xe = arg;
|
||||||
struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
|
struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
|
||||||
int irq = pdev->irq;
|
int irq;
|
||||||
|
|
||||||
if (!xe->irq.enabled)
|
if (!xe->irq.enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xe->irq.enabled = false;
|
xe->irq.enabled = false;
|
||||||
xe_irq_reset(xe);
|
xe_irq_reset(xe);
|
||||||
|
|
||||||
|
irq = pci_irq_vector(pdev, 0);
|
||||||
free_irq(irq, xe);
|
free_irq(irq, xe);
|
||||||
if (pdev->msi_enabled)
|
pci_free_irq_vectors(pdev);
|
||||||
pci_disable_msi(pdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int xe_irq_install(struct xe_device *xe)
|
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;
|
irq_handler_t irq_handler;
|
||||||
int err;
|
int err, irq;
|
||||||
|
|
||||||
irq_handler = xe_irq_handler(xe);
|
irq_handler = xe_irq_handler(xe);
|
||||||
if (!irq_handler) {
|
if (!irq_handler) {
|
||||||
|
@ -581,16 +582,35 @@ int xe_irq_install(struct xe_device *xe)
|
||||||
|
|
||||||
xe_irq_reset(xe);
|
xe_irq_reset(xe);
|
||||||
|
|
||||||
err = request_irq(irq, irq_handler,
|
err = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
|
||||||
IRQF_SHARED, DRIVER_NAME, xe);
|
if (err < 0) {
|
||||||
if (err < 0)
|
drm_err(&xe->drm, "MSI: Failed to enable support %d\n", err);
|
||||||
return 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.enabled = true;
|
||||||
|
|
||||||
xe_irq_postinstall(xe);
|
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)
|
void xe_irq_shutdown(struct xe_device *xe)
|
||||||
|
|
|
@ -670,9 +670,6 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
|
|
||||||
pci_set_master(pdev);
|
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);
|
err = xe_info_init(xe, desc, subplatform_desc);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_pci_disable;
|
goto err_pci_disable;
|
||||||
|
|
Loading…
Add table
Reference in a new issue