[igt-dev] [PATCH i-g-t 2/2] lib/[gpu_cmds|intel_bufops]: Enable surface state mocs setting.

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon Jun 12 05:28:22 UTC 2023


On Fri, Jun 09, 2023 at 03:01:28PM +0200, Christoph Manszewski wrote:
> Allow the user to control the setting of surface caching.
> Add 'mocs' field to intel_buf structure and update the surface state
> fill commands to use introduced filed.
> 
> Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek at intel.com>
> Signed-off-by: Christoph Manszewski <christoph.manszewski at intel.com>
> ---
>  lib/gpu_cmds.c     | 19 +++++++++++++++++++
>  lib/intel_bufops.c |  1 +
>  lib/intel_bufops.h | 20 ++++++++++++++++++++
>  3 files changed, 40 insertions(+)
> 
> diff --git a/lib/gpu_cmds.c b/lib/gpu_cmds.c
> index 1f321ae4..aa4aa34d 100644
> --- a/lib/gpu_cmds.c
> +++ b/lib/gpu_cmds.c
> @@ -23,6 +23,7 @@
>   */
>  
>  #include "gpu_cmds.h"
> +#include "intel_mocs.h"
>  
>  uint32_t
>  gen7_fill_curbe_buffer_data(struct intel_bb *ibb, uint8_t color)
> @@ -135,6 +136,7 @@ gen8_fill_surface_state(struct intel_bb *ibb,
>  	struct gen8_surface_state *ss;
>  	uint32_t write_domain, read_domain, offset;
>  	uint64_t address;
> +	enum intel_buf_mocs mocs = intel_buf_get_mocs(buf);
>  
>  	if (is_dst) {
>  		write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
> @@ -154,6 +156,11 @@ gen8_fill_surface_state(struct intel_bb *ibb,
>  	ss->ss0.vertical_alignment = 1; /* align 4 */
>  	ss->ss0.horizontal_alignment = 1; /* align 4 */
>  
> +	if (mocs == INTEL_BUF_MOCS_UC)
> +		ss->ss1.memory_object_control = intel_get_uc_mocs(ibb->fd);
> +	else if (mocs == INTEL_BUF_MOCS_WB)
> +		ss->ss1.memory_object_control = intel_get_wb_mocs(ibb->fd);
> +

At the moment this if/else if is a dead code (similar in the functions below)
because you're setting

+	buf->mocs = INTEL_BUF_MOCS_DEFAULT;

and there're no usage of intel_buf_set_mocs() helper.

Is this intentional and preparation for next patches? If yes:

Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>

--
Zbigniew

>  	if (buf->tiling == I915_TILING_X)
>  		ss->ss0.tiled_mode = 2;
>  	else if (buf->tiling == I915_TILING_Y || buf->tiling == I915_TILING_4)
> @@ -190,6 +197,7 @@ gen11_fill_surface_state(struct intel_bb *ibb,
>  	struct gen8_surface_state *ss;
>  	uint32_t write_domain, read_domain, offset;
>  	uint64_t address;
> +	enum intel_buf_mocs mocs = intel_buf_get_mocs(buf);
>  
>  	if (is_dst) {
>  		write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
> @@ -209,6 +217,11 @@ gen11_fill_surface_state(struct intel_bb *ibb,
>  	ss->ss0.vertical_alignment = vertical_alignment; /* align 4 */
>  	ss->ss0.horizontal_alignment = horizontal_alignment; /* align 4 */
>  
> +	if (mocs == INTEL_BUF_MOCS_UC)
> +		ss->ss1.memory_object_control = intel_get_uc_mocs(ibb->fd);
> +	else if (mocs == INTEL_BUF_MOCS_WB)
> +		ss->ss1.memory_object_control = intel_get_wb_mocs(ibb->fd);
> +
>  	if (buf->tiling == I915_TILING_X)
>  		ss->ss0.tiled_mode = 2;
>  	else if (buf->tiling == I915_TILING_Y || buf->tiling == I915_TILING_4)
> @@ -817,6 +830,7 @@ xehp_fill_surface_state(struct intel_bb *ibb,
>  	struct xehp_surface_state *ss;
>  	uint32_t write_domain, read_domain, offset;
>  	uint64_t address;
> +	enum intel_buf_mocs mocs = intel_buf_get_mocs(buf);
>  
>  	if (is_dst) {
>  		write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
> @@ -836,6 +850,11 @@ xehp_fill_surface_state(struct intel_bb *ibb,
>  	ss->ss0.vertical_alignment = 1; /* align 4 */
>  	ss->ss0.horizontal_alignment = 1; /* align 4 */
>  
> +	if (mocs == INTEL_BUF_MOCS_UC)
> +		ss->ss1.memory_object_control = intel_get_uc_mocs(ibb->fd);
> +	else if (mocs == INTEL_BUF_MOCS_WB)
> +		ss->ss1.memory_object_control = intel_get_wb_mocs(ibb->fd);
> +
>  	if (buf->tiling == I915_TILING_X)
>  		ss->ss0.tiled_mode = 2;
>  	else if (buf->tiling == I915_TILING_Y || buf->tiling == I915_TILING_4)
> diff --git a/lib/intel_bufops.c b/lib/intel_bufops.c
> index 46fd981f..52475793 100644
> --- a/lib/intel_bufops.c
> +++ b/lib/intel_bufops.c
> @@ -837,6 +837,7 @@ static void __intel_buf_init(struct buf_ops *bops,
>  	buf->bops = bops;
>  	buf->addr.offset = INTEL_BUF_INVALID_ADDRESS;
>  	IGT_INIT_LIST_HEAD(&buf->link);
> +	buf->mocs = INTEL_BUF_MOCS_DEFAULT;
>  
>  	if (compression) {
>  		igt_require(bops->intel_gen >= 9);
> diff --git a/lib/intel_bufops.h b/lib/intel_bufops.h
> index 0037548a..4dfe4681 100644
> --- a/lib/intel_bufops.h
> +++ b/lib/intel_bufops.h
> @@ -12,6 +12,12 @@ struct buf_ops;
>  #define INTEL_BUF_NAME_MAXSIZE 32
>  #define INVALID_ADDR(x) ((x) == INTEL_BUF_INVALID_ADDRESS)
>  
> +enum intel_buf_mocs {
> +	INTEL_BUF_MOCS_DEFAULT,
> +	INTEL_BUF_MOCS_UC,
> +	INTEL_BUF_MOCS_WB,
> +};
> +
>  struct intel_buf {
>  	struct buf_ops *bops;
>  
> @@ -23,6 +29,7 @@ struct intel_buf {
>  	uint32_t compression;
>  	uint32_t swizzle_mode;
>  	uint32_t yuv_semiplanar_bpp;
> +	enum intel_buf_mocs mocs;
>  	bool format_is_yuv;
>  	bool format_is_yuv_semiplanar;
>  	struct {
> @@ -212,4 +219,17 @@ const char *intel_buf_set_name(struct intel_buf *buf, const char *name);
>  void intel_buf_write_to_png(struct intel_buf *buf, const char *filename);
>  void intel_buf_write_aux_to_png(struct intel_buf *buf, const char *filename);
>  
> +static inline enum intel_buf_mocs intel_buf_get_mocs(const struct intel_buf *buf)
> +{
> +	igt_assert(buf);
> +	return buf->mocs;
> +}
> +
> +static inline void intel_buf_set_mocs(struct intel_buf *buf,
> +				      enum intel_buf_mocs mocs)
> +{
> +	igt_assert(buf);
> +	buf->mocs = mocs;
> +}
> +
>  #endif
> -- 
> 2.40.1
> 


More information about the igt-dev mailing list