[PATCH 1/8] drm/xe/irq: refactor irq flows to support also msix
Rodrigo Vivi
rodrigo.vivi at intel.com
Wed Jun 26 15:03:05 UTC 2024
On Wed, Jun 26, 2024 at 01:33:38PM +0300, Dani Liberman wrote:
> When enabling MSIX, there is no need for HW to aggregate interrupts.
> Added a separate MSIX flow that skips unnecessary code in irq init,
> reset, and fini.
>
> Signed-off-by: Dani Liberman <dliberman at habana.ai>
just a heads up that I just pushed this patch:
https://patchwork.freedesktop.org/patch/597392/
so I believe you might need to rebase.
Cc: Ilia Levi <illevi at habana.ai>
> ---
> drivers/gpu/drm/xe/xe_device_types.h | 2 +
> drivers/gpu/drm/xe/xe_irq.c | 99 +++++++++++++++++++++-------
> 2 files changed, 77 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index c37be471d11c..09ce7ba1b4ed 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -306,6 +306,8 @@ struct xe_device {
>
> /** @irq.enabled: interrupts enabled on this device */
> bool enabled;
> + /** @irq.msix_enabled: msix interrupts enabled on this device */
> + bool msix_enabled;
> } irq;
>
> /** @ttm: ttm device */
> diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
> index ab3d5b7a1e8c..663a86edecc0 100644
> --- a/drivers/gpu/drm/xe/xe_irq.c
> +++ b/drivers/gpu/drm/xe/xe_irq.c
> @@ -666,28 +666,46 @@ static irq_handler_t xe_irq_handler(struct xe_device *xe)
> return xelp_irq_handler;
> }
>
> -static void irq_uninstall(void *arg)
> +static void xe_irq_msi_free(struct xe_device *xe)
> {
> - struct xe_device *xe = arg;
> struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> int irq;
>
> + irq = pci_irq_vector(pdev, 0);
> + free_irq(irq, xe);
> +}
> +
> +static void xe_irq_msix_free(struct xe_device *xe)
> +{
> +
> +}
> +
> +static void xe_irq_free(struct xe_device *xe)
> +{
> + if (xe->irq.msix_enabled)
> + xe_irq_msix_free(xe);
> + else
> + xe_irq_msi_free(xe);
> +}
> +
> +static void irq_uninstall(void *arg)
> +{
> + struct xe_device *xe = arg;
> +
> if (!xe->irq.enabled)
> return;
>
> xe->irq.enabled = false;
> xe_irq_reset(xe);
>
> - irq = pci_irq_vector(pdev, 0);
> - free_irq(irq, xe);
> + xe_irq_free(xe);
> }
>
> -int xe_irq_install(struct xe_device *xe)
> +static int xe_irq_msi_request(struct xe_device *xe)
> {
> struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> - unsigned int irq_flags = PCI_IRQ_MSIX;
> irq_handler_t irq_handler;
> - int err, irq, nvec;
> + int irq, err;
>
> irq_handler = xe_irq_handler(xe);
> if (!irq_handler) {
> @@ -695,32 +713,55 @@ int xe_irq_install(struct xe_device *xe)
> return -EINVAL;
> }
>
> - xe_irq_reset(xe);
> + 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);
> + return err;
> + }
> +
> + return 0;
> +}
> +
> +static int xe_irq_msix_request(struct xe_device *xe)
> +{
> + return 0;
> +}
> +
> +int xe_irq_install(struct xe_device *xe)
> +{
> + struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> + unsigned int irq_flags = PCI_IRQ_MSIX;
> +
> + int err, nvec;
>
> nvec = pci_msix_vec_count(pdev);
> - if (nvec <= 0) {
> - if (nvec == -EINVAL) {
> - /* MSIX capability is not supported in the device, using MSI */
> - irq_flags = PCI_IRQ_MSI;
> - nvec = 1;
> - } else {
> - drm_err(&xe->drm, "MSIX: Failed getting count\n");
> - return nvec;
> - }
> + if (nvec > 0) {
> + xe->irq.msix_enabled = true;
> + } else if (nvec == -EINVAL) {
> + /* MSIX capability is not supported in the device, using MSI */
> + irq_flags = PCI_IRQ_MSI;
> + nvec = 1;
> + } else {
> + drm_err(&xe->drm, "MSIX: Failed getting count\n");
> + return nvec;
> }
>
> + xe_irq_reset(xe);
> +
> err = pci_alloc_irq_vectors(pdev, nvec, nvec, irq_flags);
> if (err < 0) {
> drm_err(&xe->drm, "MSI/MSIX: 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/MSIX IRQ %d\n", err);
> + if (xe->irq.msix_enabled)
> + err = xe_irq_msix_request(xe);
> + else
> + err = xe_irq_msi_request(xe);
> +
> + if (err)
> return err;
> - }
>
> xe->irq.enabled = true;
>
> @@ -733,7 +774,7 @@ int xe_irq_install(struct xe_device *xe)
> return 0;
>
> free_irq_handler:
> - free_irq(irq, xe);
> + xe_irq_free(xe);
>
> return err;
> }
> @@ -743,6 +784,11 @@ void xe_irq_shutdown(struct xe_device *xe)
> irq_uninstall(xe);
> }
>
> +static void xe_irq_msix_synchronize_irq(struct xe_device *xe)
> +{
> +
> +}
> +
> void xe_irq_suspend(struct xe_device *xe)
> {
> int irq = to_pci_dev(xe->drm.dev)->irq;
> @@ -751,7 +797,12 @@ void xe_irq_suspend(struct xe_device *xe)
> xe->irq.enabled = false; /* no new irqs */
> spin_unlock_irq(&xe->irq.lock);
>
> - synchronize_irq(irq); /* flush irqs */
> + /* flush irqs */
> + if (xe->irq.msix_enabled)
> + xe_irq_msix_synchronize_irq(xe);
> + else
> + synchronize_irq(irq);
> +
> xe_irq_reset(xe); /* turn irqs off */
> }
>
> --
> 2.34.1
>
More information about the Intel-xe
mailing list