mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-24 10:11:26 +03:00
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:
committed by
Laxman Dewangan
parent
4207a59049
commit
41a9f72f78
@@ -15,6 +15,7 @@ host1x-next-y = \
|
||||
debug.o \
|
||||
mipi.o \
|
||||
fence.o \
|
||||
actmon.o \
|
||||
hw/host1x01.o \
|
||||
hw/host1x02.o \
|
||||
hw/host1x04.o \
|
||||
|
||||
36
drivers/gpu/host1x/actmon.c
Normal file
36
drivers/gpu/host1x/actmon.c
Normal 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);
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user