diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gpu.h')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gpu.h | 53 | 
1 files changed, 51 insertions, 2 deletions
diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 8cd829e520b..9b579b79284 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -25,6 +25,7 @@  #include "msm_ringbuffer.h"  struct msm_gem_submit; +struct msm_gpu_perfcntr;  /* So far, with hardware that I've seen to date, we can have:   *  + zero, one, or two z180 2d cores @@ -64,6 +65,18 @@ struct msm_gpu {  	struct drm_device *dev;  	const struct msm_gpu_funcs *funcs; +	/* performance counters (hw & sw): */ +	spinlock_t perf_lock; +	bool perfcntr_active; +	struct { +		bool active; +		ktime_t time; +	} last_sample; +	uint32_t totaltime, activetime;    /* sw counters */ +	uint32_t last_cntrs[5];            /* hw counters */ +	const struct msm_gpu_perfcntr *perfcntrs; +	uint32_t num_perfcntrs; +  	struct msm_ringbuffer *rb;  	uint32_t rb_iova; @@ -72,22 +85,35 @@ struct msm_gpu {  	uint32_t submitted_fence; +	/* is gpu powered/active? */ +	int active_cnt; +	bool inactive; +  	/* worker for handling active-list retiring: */  	struct work_struct retire_work;  	void __iomem *mmio;  	int irq; -	struct iommu_domain *iommu; +	struct msm_mmu *mmu;  	int id;  	/* Power Control: */  	struct regulator *gpu_reg, *gpu_cx;  	struct clk *ebi1_clk, *grp_clks[5];  	uint32_t fast_rate, slow_rate, bus_freq; + +#ifdef CONFIG_MSM_BUS_SCALING +	struct msm_bus_scale_pdata *bus_scale_table;  	uint32_t bsc; +#endif -	/* Hang Detction: */ +	/* Hang and Inactivity Detection: +	 */ +#define DRM_MSM_INACTIVE_PERIOD   66 /* in ms (roughly four frames) */ +#define DRM_MSM_INACTIVE_JIFFIES  msecs_to_jiffies(DRM_MSM_INACTIVE_PERIOD) +	struct timer_list inactive_timer; +	struct work_struct inactive_work;  #define DRM_MSM_HANGCHECK_PERIOD 500 /* in ms */  #define DRM_MSM_HANGCHECK_JIFFIES msecs_to_jiffies(DRM_MSM_HANGCHECK_PERIOD)  	struct timer_list hangcheck_timer; @@ -95,6 +121,24 @@ struct msm_gpu {  	struct work_struct recover_work;  }; +static inline bool msm_gpu_active(struct msm_gpu *gpu) +{ +	return gpu->submitted_fence > gpu->funcs->last_fence(gpu); +} + +/* Perf-Counters: + * The select_reg and select_val are just there for the benefit of the child + * class that actually enables the perf counter..  but msm_gpu base class + * will handle sampling/displaying the counters. + */ + +struct msm_gpu_perfcntr { +	uint32_t select_reg; +	uint32_t sample_reg; +	uint32_t select_val; +	const char *name; +}; +  static inline void gpu_write(struct msm_gpu *gpu, u32 reg, u32 data)  {  	msm_writel(data, gpu->mmio + (reg << 2)); @@ -108,6 +152,11 @@ static inline u32 gpu_read(struct msm_gpu *gpu, u32 reg)  int msm_gpu_pm_suspend(struct msm_gpu *gpu);  int msm_gpu_pm_resume(struct msm_gpu *gpu); +void msm_gpu_perfcntr_start(struct msm_gpu *gpu); +void msm_gpu_perfcntr_stop(struct msm_gpu *gpu); +int msm_gpu_perfcntr_sample(struct msm_gpu *gpu, uint32_t *activetime, +		uint32_t *totaltime, uint32_t ncntrs, uint32_t *cntrs); +  void msm_gpu_retire(struct msm_gpu *gpu);  int msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,  		struct msm_file_private *ctx);  | 
