[Intel-gfx] [PATCH] drm/i915/rps: split out display rps parts to a separate file

Ville Syrjälä ville.syrjala at linux.intel.com
Thu Mar 2 17:22:03 UTC 2023


On Thu, Mar 02, 2023 at 06:49:36PM +0200, Jani Nikula wrote:
> Split out the RPS parts so they can be conditionally compiled out later.
> 
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>

Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

> ---
>  drivers/gpu/drm/i915/Makefile                 |  1 +
>  .../gpu/drm/i915/display/intel_atomic_plane.c | 79 ++----------------
>  .../gpu/drm/i915/display/intel_display_rps.c  | 81 +++++++++++++++++++
>  .../gpu/drm/i915/display/intel_display_rps.h  | 22 +++++
>  4 files changed, 111 insertions(+), 72 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/display/intel_display_rps.c
>  create mode 100644 drivers/gpu/drm/i915/display/intel_display_rps.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index b2f91a1f8268..8e46f57e4569 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -239,6 +239,7 @@ i915-y += \
>  	display/intel_display_power.o \
>  	display/intel_display_power_map.o \
>  	display/intel_display_power_well.o \
> +	display/intel_display_rps.o \
>  	display/intel_dmc.o \
>  	display/intel_dpio_phy.o \
>  	display/intel_dpll.o \
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> index 3bd8f7eb75a6..719a60e278f3 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> @@ -34,11 +34,10 @@
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_fourcc.h>
>  
> -#include "gt/intel_rps.h"
> -
>  #include "i915_config.h"
>  #include "intel_atomic_plane.h"
>  #include "intel_cdclk.h"
> +#include "intel_display_rps.h"
>  #include "intel_display_trace.h"
>  #include "intel_display_types.h"
>  #include "intel_fb.h"
> @@ -941,64 +940,6 @@ int intel_atomic_plane_check_clipping(struct intel_plane_state *plane_state,
>  	return 0;
>  }
>  
> -struct wait_rps_boost {
> -	struct wait_queue_entry wait;
> -
> -	struct drm_crtc *crtc;
> -	struct i915_request *request;
> -};
> -
> -static int do_rps_boost(struct wait_queue_entry *_wait,
> -			unsigned mode, int sync, void *key)
> -{
> -	struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
> -	struct i915_request *rq = wait->request;
> -
> -	/*
> -	 * If we missed the vblank, but the request is already running it
> -	 * is reasonable to assume that it will complete before the next
> -	 * vblank without our intervention, so leave RPS alone.
> -	 */
> -	if (!i915_request_started(rq))
> -		intel_rps_boost(rq);
> -	i915_request_put(rq);
> -
> -	drm_crtc_vblank_put(wait->crtc);
> -
> -	list_del(&wait->wait.entry);
> -	kfree(wait);
> -	return 1;
> -}
> -
> -static void add_rps_boost_after_vblank(struct drm_crtc *crtc,
> -				       struct dma_fence *fence)
> -{
> -	struct wait_rps_boost *wait;
> -
> -	if (!dma_fence_is_i915(fence))
> -		return;
> -
> -	if (DISPLAY_VER(to_i915(crtc->dev)) < 6)
> -		return;
> -
> -	if (drm_crtc_vblank_get(crtc))
> -		return;
> -
> -	wait = kmalloc(sizeof(*wait), GFP_KERNEL);
> -	if (!wait) {
> -		drm_crtc_vblank_put(crtc);
> -		return;
> -	}
> -
> -	wait->request = to_request(dma_fence_get(fence));
> -	wait->crtc = crtc;
> -
> -	wait->wait.func = do_rps_boost;
> -	wait->wait.flags = 0;
> -
> -	add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
> -}
> -
>  /**
>   * intel_prepare_plane_fb - Prepare fb for usage on plane
>   * @_plane: drm plane to prepare for
> @@ -1089,13 +1030,13 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
>  		dma_resv_iter_begin(&cursor, obj->base.resv,
>  				    DMA_RESV_USAGE_WRITE);
>  		dma_resv_for_each_fence_unlocked(&cursor, fence) {
> -			add_rps_boost_after_vblank(new_plane_state->hw.crtc,
> -						   fence);
> +			intel_display_rps_boost_after_vblank(new_plane_state->hw.crtc,
> +							     fence);
>  		}
>  		dma_resv_iter_end(&cursor);
>  	} else {
> -		add_rps_boost_after_vblank(new_plane_state->hw.crtc,
> -					   new_plane_state->uapi.fence);
> +		intel_display_rps_boost_after_vblank(new_plane_state->hw.crtc,
> +						     new_plane_state->uapi.fence);
>  	}
>  
>  	/*
> @@ -1106,10 +1047,7 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
>  	 * that are not quite steady state without resorting to forcing
>  	 * maximum clocks following a vblank miss (see do_rps_boost()).
>  	 */
> -	if (!state->rps_interactive) {
> -		intel_rps_mark_interactive(&to_gt(dev_priv)->rps, true);
> -		state->rps_interactive = true;
> -	}
> +	intel_display_rps_mark_interactive(dev_priv, state, true);
>  
>  	return 0;
>  
> @@ -1140,10 +1078,7 @@ intel_cleanup_plane_fb(struct drm_plane *plane,
>  	if (!obj)
>  		return;
>  
> -	if (state->rps_interactive) {
> -		intel_rps_mark_interactive(&to_gt(dev_priv)->rps, false);
> -		state->rps_interactive = false;
> -	}
> +	intel_display_rps_mark_interactive(dev_priv, state, false);
>  
>  	/* Should only be called after a successful intel_prepare_plane_fb()! */
>  	intel_plane_unpin_fb(old_plane_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_rps.c b/drivers/gpu/drm/i915/display/intel_display_rps.c
> new file mode 100644
> index 000000000000..918d0327169a
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_display_rps.c
> @@ -0,0 +1,81 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#include <drm/drm_crtc.h>
> +#include <drm/drm_vblank.h>
> +
> +#include "gt/intel_rps.h"
> +#include "i915_drv.h"
> +#include "intel_display_rps.h"
> +#include "intel_display_types.h"
> +
> +struct wait_rps_boost {
> +	struct wait_queue_entry wait;
> +
> +	struct drm_crtc *crtc;
> +	struct i915_request *request;
> +};
> +
> +static int do_rps_boost(struct wait_queue_entry *_wait,
> +			unsigned mode, int sync, void *key)
> +{
> +	struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
> +	struct i915_request *rq = wait->request;
> +
> +	/*
> +	 * If we missed the vblank, but the request is already running it
> +	 * is reasonable to assume that it will complete before the next
> +	 * vblank without our intervention, so leave RPS alone.
> +	 */
> +	if (!i915_request_started(rq))
> +		intel_rps_boost(rq);
> +	i915_request_put(rq);
> +
> +	drm_crtc_vblank_put(wait->crtc);
> +
> +	list_del(&wait->wait.entry);
> +	kfree(wait);
> +	return 1;
> +}
> +
> +void intel_display_rps_boost_after_vblank(struct drm_crtc *crtc,
> +					  struct dma_fence *fence)
> +{
> +	struct wait_rps_boost *wait;
> +
> +	if (!dma_fence_is_i915(fence))
> +		return;
> +
> +	if (DISPLAY_VER(to_i915(crtc->dev)) < 6)
> +		return;
> +
> +	if (drm_crtc_vblank_get(crtc))
> +		return;
> +
> +	wait = kmalloc(sizeof(*wait), GFP_KERNEL);
> +	if (!wait) {
> +		drm_crtc_vblank_put(crtc);
> +		return;
> +	}
> +
> +	wait->request = to_request(dma_fence_get(fence));
> +	wait->crtc = crtc;
> +
> +	wait->wait.func = do_rps_boost;
> +	wait->wait.flags = 0;
> +
> +	add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
> +}
> +
> +void intel_display_rps_mark_interactive(struct drm_i915_private *i915,
> +					struct intel_atomic_state *state,
> +					bool interactive)
> +{
> +	if (state->rps_interactive == interactive)
> +		return;
> +
> +	intel_rps_mark_interactive(&to_gt(i915)->rps, interactive);
> +	state->rps_interactive = interactive;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_display_rps.h b/drivers/gpu/drm/i915/display/intel_display_rps.h
> new file mode 100644
> index 000000000000..e19009c2371a
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_display_rps.h
> @@ -0,0 +1,22 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#ifndef __INTEL_DISPLAY_RPS_H__
> +#define __INTEL_DISPLAY_RPS_H__
> +
> +#include <linux/types.h>
> +
> +struct dma_fence;
> +struct drm_crtc;
> +struct drm_i915_private;
> +struct intel_atomic_state;
> +
> +void intel_display_rps_boost_after_vblank(struct drm_crtc *crtc,
> +					  struct dma_fence *fence);
> +void intel_display_rps_mark_interactive(struct drm_i915_private *i915,
> +					struct intel_atomic_state *state,
> +					bool interactive);
> +
> +#endif /* __INTEL_DISPLAY_RPS_H__ */
> -- 
> 2.39.1

-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list