diff --git a/src/broadcom/simulator/v3d_simulator.c b/src/broadcom/simulator/v3d_simulator.c index ba5cdf68b42..306d4877dda 100644 --- a/src/broadcom/simulator/v3d_simulator.c +++ b/src/broadcom/simulator/v3d_simulator.c @@ -1099,6 +1099,10 @@ v3d_simulator_ioctl(int fd, unsigned long request, void *args) case DRM_IOCTL_V3D_PERFMON_GET_VALUES: return v3d_simulator_perfmon_get_values_ioctl(fd, args); + case DRM_IOCTL_V3D_PERFMON_GET_COUNTER: + return v3d_X_simulator(perfmon_get_counter_ioctl)(sim_state.perfcnt_total, + args); + case DRM_IOCTL_GEM_OPEN: case DRM_IOCTL_GEM_FLINK: return drmIoctl(fd, request, args); diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c index 0a269e5f564..8d8145fac13 100644 --- a/src/broadcom/simulator/v3dx_simulator.c +++ b/src/broadcom/simulator/v3dx_simulator.c @@ -302,6 +302,30 @@ v3dX(simulator_get_param_ioctl)(struct v3d_hw *v3d, abort(); } +int +v3dX(simulator_perfmon_get_counter_ioctl)(uint32_t perfcnt_total, + struct drm_v3d_perfmon_get_counter *args) +{ + const char **counter = NULL; + + /* Make sure that the counter ID is valid */ + if (args->counter >= perfcnt_total) + return -1; + + counter = v3d_performance_counters[args->counter]; + + memcpy(args->name, counter[V3D_PERFCNT_NAME], + DRM_V3D_PERFCNT_MAX_NAME); + + memcpy(args->category, counter[V3D_PERFCNT_CATEGORY], + DRM_V3D_PERFCNT_MAX_CATEGORY); + + memcpy(args->description, counter[V3D_PERFCNT_DESCRIPTION], + DRM_V3D_PERFCNT_MAX_DESCRIPTION); + + return 0; +} + static struct v3d_hw *v3d_isr_hw; diff --git a/src/broadcom/simulator/v3dx_simulator.h b/src/broadcom/simulator/v3dx_simulator.h index 14fb97ce6f0..576129768a6 100644 --- a/src/broadcom/simulator/v3dx_simulator.h +++ b/src/broadcom/simulator/v3dx_simulator.h @@ -32,11 +32,14 @@ struct drm_v3d_get_param; struct drm_v3d_submit_cl; struct drm_v3d_submit_tfu; struct drm_v3d_submit_csd; +struct drm_v3d_perfmon_get_counter; void v3dX(simulator_init_regs)(struct v3d_hw *v3d); int v3dX(simulator_get_param_ioctl)(struct v3d_hw *v3d, uint32_t perfcnt_total, struct drm_v3d_get_param *args); +int v3dX(simulator_perfmon_get_counter_ioctl)(uint32_t perfcnt_total, + struct drm_v3d_perfmon_get_counter *args); void v3dX(simulator_submit_cl_ioctl)(struct v3d_hw *v3d, struct drm_v3d_submit_cl *args, uint32_t gmp_offset);