gpu: host1x: Add API for reading actmon count

Add API for reading the activity monitor average count for VIC,
NVENC, and NVDEC. There is currently no support for initializing
actmon, so this relies on someone else on a virtualized system
having initialized it (and mapped the actmon region read-only).

Bug 3973633

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Change-Id: Ia1bfec6a090d4effb288b17cbac4d42bf5d0b4e5
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2864719
Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com>
Reviewed-by: Jonathan Hunter <jonathanh@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
Mikko Perttunen
2023-02-28 11:12:18 +02:00
committed by Laxman Dewangan
parent 4207a59049
commit 41a9f72f78
5 changed files with 48 additions and 2 deletions

View File

@@ -15,6 +15,7 @@ host1x-next-y = \
debug.o \
mipi.o \
fence.o \
actmon.o \
hw/host1x01.o \
hw/host1x02.o \
hw/host1x04.o \

View File

@@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Tegra host1x activity monitor interfaes
*
* Copyright (c) 2023, NVIDIA Corporation.
*/
#include "dev.h"
int host1x_actmon_read_avg_count(struct host1x_client *client)
{
struct host1x *host = dev_get_drvdata(client->host->parent);
unsigned int offset;
if (!host->actmon_regs)
return -ENODEV;
/* FIXME: Only T234 supported */
switch (client->class) {
case HOST1X_CLASS_NVENC:
offset = 0x0;
break;
case HOST1X_CLASS_VIC:
offset = 0x10000;
break;
case HOST1X_CLASS_NVDEC:
offset = 0x20000;
break;
default:
return -EINVAL;
}
return readl(host->actmon_regs + offset + 0xa4);
}
EXPORT_SYMBOL(host1x_actmon_read_avg_count);

View File

@@ -748,6 +748,7 @@ static int host1x_get_syncpt_pools(struct host1x *host)
static int host1x_probe(struct platform_device *pdev)
{
struct resource *res;
struct host1x *host;
int err;
@@ -758,8 +759,6 @@ static int host1x_probe(struct platform_device *pdev)
host->info = of_device_get_match_data(&pdev->dev);
if (host->info->has_hypervisor) {
struct resource *res;
host->regs = devm_platform_ioremap_resource_byname(pdev, "vm");
if (IS_ERR(host->regs))
return PTR_ERR(host->regs);
@@ -782,6 +781,13 @@ static int host1x_probe(struct platform_device *pdev)
return PTR_ERR(host->regs);
}
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "actmon");
if (res) {
host->actmon_regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(host->actmon_regs))
return PTR_ERR(host->actmon_regs);
}
host->syncpt_irq = platform_get_irq(pdev, 0);
if (host->syncpt_irq < 0)
return host->syncpt_irq;

View File

@@ -130,6 +130,7 @@ struct host1x {
void __iomem *regs;
void __iomem *hv_regs; /* hypervisor region */
void __iomem *common_regs;
void __iomem *actmon_regs;
int syncpt_irq;
struct host1x_syncpt *syncpt;
struct host1x_syncpt_base *bases;

View File

@@ -506,4 +506,6 @@ static inline void host1x_memory_context_put(struct host1x_memory_context *cd)
}
#endif
int host1x_actmon_read_avg_count(struct host1x_client *client);
#endif