Files
linux-nv-oot/drivers/gpu/host1x/hw/intr_general_hw.c
Johnny Liu 03fd3f1188 gpu: host1x: Enable general interrupts for actmon
Host1x general interrupts include actmon-related interrupts, axi
timeout interrupts, and illegal access interrupts. This change enables
actmon-related interrupts only.

Bug 3788919

Signed-off-by: Johnny Liu <johnliu@nvidia.com>
Change-Id: Iea1f1622a11afa72f70f8d10efebd857a51cc4e2
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2889825
Reviewed-by: Mikko Perttunen <mperttunen@nvidia.com>
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
2023-04-28 03:32:38 -07:00

92 lines
2.6 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Tegra host1x General Interrupt Management
*
* Copyright (C) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
*/
#include <linux/interrupt.h>
#include "../dev.h"
static irqreturn_t host1x_general_isr(int irq, void *dev_id)
{
struct host1x *host = dev_id;
unsigned long status;
status = host1x_common_readl(host, HOST1X_COMMON_THOST_INTRSTATUS);
if (status & HOST1X_COMMON_THOST_INTRSTATUS_NVENC_ACTMON_INTR)
host1x_actmon_handle_interrupt(host, HOST1X_CLASS_NVENC);
if (status & HOST1X_COMMON_THOST_INTRSTATUS_VIC_ACTMON_INTR)
host1x_actmon_handle_interrupt(host, HOST1X_CLASS_VIC);
if (status & HOST1X_COMMON_THOST_INTRSTATUS_NVDEC_ACTMON_INTR)
host1x_actmon_handle_interrupt(host, HOST1X_CLASS_NVDEC);
if (status & HOST1X_COMMON_THOST_INTRSTATUS_NVJPG_ACTMON_INTR)
host1x_actmon_handle_interrupt(host, HOST1X_CLASS_NVJPG);
if (status & HOST1X_COMMON_THOST_INTRSTATUS_NVJPG1_ACTMON_INTR)
host1x_actmon_handle_interrupt(host, HOST1X_CLASS_NVJPG1);
host1x_common_writel(host, status, HOST1X_COMMON_THOST_INTRSTATUS);
return IRQ_HANDLED;
}
static int host1x_intr_init_host_general(struct host1x *host)
{
int err;
host1x_hw_intr_disable_all_general_intrs(host);
err = devm_request_threaded_irq(host->dev,
host->general_irq,
NULL, host1x_general_isr,
IRQF_ONESHOT, "host1x_general",
host);
if (err < 0) {
devm_free_irq(host->dev, host->general_irq, host);
return err;
}
return 0;
}
static void host1x_intr_enable_general_intrs(struct host1x *host)
{
if (!host->common_regs)
return;
/* Assign CPU0 for host1x general interrupts */
host1x_common_writel(host, 0x1, HOST1X_COMMON_INTR_CPU0_MASK);
/* Allow host1x general interrupts go to CPU0 only */
host1x_common_writel(host, 0x1, HOST1X_COMMON_THOST_GLOBAL_INTRMASK);
/* Enable host1x general interrupts */
host1x_common_writel(host,
HOST1X_COMMON_THOST_INTRMASK_NVENC_ACTMON(1) |
HOST1X_COMMON_THOST_INTRMASK_VIC_ACTMON(1) |
HOST1X_COMMON_THOST_INTRMASK_NVDEC_ACTMON(1) |
HOST1X_COMMON_THOST_INTRMASK_NVJPG_ACTMON(1) |
HOST1X_COMMON_THOST_INTRMASK_NVJPG1_ACTMON(1),
HOST1X_COMMON_THOST_INTRMASK);
}
static void host1x_intr_disable_all_general_intrs(struct host1x *host)
{
if (!host->common_regs)
return;
host1x_common_writel(host, 0x0, HOST1X_COMMON_THOST_INTRMASK);
}
static const struct host1x_intr_general_ops host1x_intr_general_ops = {
.init_host_general = host1x_intr_init_host_general,
.enable_general_intrs = host1x_intr_enable_general_intrs,
.disable_all_general_intrs = host1x_intr_disable_all_general_intrs,
};