Commit c606043d authored by Maíra Canal's avatar Maíra Canal

drm/v3d: Different V3D versions can have different number of perfcnt

Currently, even though V3D 7.1 has 93 performance counters, it is not
possible to create counters bigger than 87, as
`v3d_perfmon_create_ioctl()` understands that counters bigger than 87
are invalid.

Therefore, create a device variable to expose the maximum
number of counters for a given V3D version and make
`v3d_perfmon_create_ioctl()` check this variable.

This commit fixes CTS failures in the performance queries tests
`dEQP-VK.query_pool.performance_query.*` [1]

Link: https://gitlab.freedesktop.org/mesa/mesa/-/commit/ea1f09a5f21839f4f3b93610b58507c4bd9b9b81 [1]
Fixes: 6fd94871 ("drm/v3d: add brcm,2712-v3d as a compatible V3D device")
Signed-off-by: default avatarMaíra Canal <mcanal@igalia.com>
Reviewed-by: default avatarIago Toral Quiroga <itoral@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240512222655.2792754-3-mcanal@igalia.com
parent 3cbcbe01
...@@ -294,6 +294,13 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) ...@@ -294,6 +294,13 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES); v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
WARN_ON(v3d->cores > 1); /* multicore not yet implemented */ WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
if (v3d->ver >= 71)
v3d->max_counters = ARRAY_SIZE(v3d_v71_performance_counters);
else if (v3d->ver >= 42)
v3d->max_counters = ARRAY_SIZE(v3d_v42_performance_counters);
else
v3d->max_counters = 0;
v3d->reset = devm_reset_control_get_exclusive(dev, NULL); v3d->reset = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(v3d->reset)) { if (IS_ERR(v3d->reset)) {
ret = PTR_ERR(v3d->reset); ret = PTR_ERR(v3d->reset);
......
...@@ -104,6 +104,11 @@ struct v3d_dev { ...@@ -104,6 +104,11 @@ struct v3d_dev {
int ver; int ver;
bool single_irq_line; bool single_irq_line;
/* Different revisions of V3D have different total number of performance
* counters
*/
unsigned int max_counters;
void __iomem *hub_regs; void __iomem *hub_regs;
void __iomem *core_regs[3]; void __iomem *core_regs[3];
void __iomem *bridge_regs; void __iomem *bridge_regs;
......
...@@ -123,6 +123,7 @@ int v3d_perfmon_create_ioctl(struct drm_device *dev, void *data, ...@@ -123,6 +123,7 @@ int v3d_perfmon_create_ioctl(struct drm_device *dev, void *data,
{ {
struct v3d_file_priv *v3d_priv = file_priv->driver_priv; struct v3d_file_priv *v3d_priv = file_priv->driver_priv;
struct drm_v3d_perfmon_create *req = data; struct drm_v3d_perfmon_create *req = data;
struct v3d_dev *v3d = v3d_priv->v3d;
struct v3d_perfmon *perfmon; struct v3d_perfmon *perfmon;
unsigned int i; unsigned int i;
int ret; int ret;
...@@ -134,7 +135,7 @@ int v3d_perfmon_create_ioctl(struct drm_device *dev, void *data, ...@@ -134,7 +135,7 @@ int v3d_perfmon_create_ioctl(struct drm_device *dev, void *data,
/* Make sure all counters are valid. */ /* Make sure all counters are valid. */
for (i = 0; i < req->ncounters; i++) { for (i = 0; i < req->ncounters; i++) {
if (req->counters[i] >= V3D_PERFCNT_NUM) if (req->counters[i] >= v3d->max_counters)
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment