Home | History | Annotate | Line # | Download | only in gt
      1  1.1  riastrad /*	$NetBSD: intel_sseu.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * SPDX-License-Identifier: MIT
      5  1.1  riastrad  *
      6  1.1  riastrad  * Copyright  2019 Intel Corporation
      7  1.1  riastrad  */
      8  1.1  riastrad 
      9  1.1  riastrad #ifndef __INTEL_SSEU_H__
     10  1.1  riastrad #define __INTEL_SSEU_H__
     11  1.1  riastrad 
     12  1.1  riastrad #include <linux/types.h>
     13  1.1  riastrad #include <linux/kernel.h>
     14  1.1  riastrad 
     15  1.1  riastrad #include "i915_gem.h"
     16  1.1  riastrad 
     17  1.1  riastrad struct drm_i915_private;
     18  1.1  riastrad 
     19  1.1  riastrad #define GEN_MAX_SLICES		(6) /* CNL upper bound */
     20  1.1  riastrad #define GEN_MAX_SUBSLICES	(8) /* ICL upper bound */
     21  1.1  riastrad #define GEN_SSEU_STRIDE(max_entries) DIV_ROUND_UP(max_entries, BITS_PER_BYTE)
     22  1.1  riastrad #define GEN_MAX_SUBSLICE_STRIDE GEN_SSEU_STRIDE(GEN_MAX_SUBSLICES)
     23  1.1  riastrad #define GEN_MAX_EUS		(16) /* TGL upper bound */
     24  1.1  riastrad #define GEN_MAX_EU_STRIDE GEN_SSEU_STRIDE(GEN_MAX_EUS)
     25  1.1  riastrad 
     26  1.1  riastrad struct sseu_dev_info {
     27  1.1  riastrad 	u8 slice_mask;
     28  1.1  riastrad 	u8 subslice_mask[GEN_MAX_SLICES * GEN_MAX_SUBSLICE_STRIDE];
     29  1.1  riastrad 	u8 eu_mask[GEN_MAX_SLICES * GEN_MAX_SUBSLICES * GEN_MAX_EU_STRIDE];
     30  1.1  riastrad 	u16 eu_total;
     31  1.1  riastrad 	u8 eu_per_subslice;
     32  1.1  riastrad 	u8 min_eu_in_pool;
     33  1.1  riastrad 	/* For each slice, which subslice(s) has(have) 7 EUs (bitfield)? */
     34  1.1  riastrad 	u8 subslice_7eu[3];
     35  1.1  riastrad 	u8 has_slice_pg:1;
     36  1.1  riastrad 	u8 has_subslice_pg:1;
     37  1.1  riastrad 	u8 has_eu_pg:1;
     38  1.1  riastrad 
     39  1.1  riastrad 	/* Topology fields */
     40  1.1  riastrad 	u8 max_slices;
     41  1.1  riastrad 	u8 max_subslices;
     42  1.1  riastrad 	u8 max_eus_per_subslice;
     43  1.1  riastrad 
     44  1.1  riastrad 	u8 ss_stride;
     45  1.1  riastrad 	u8 eu_stride;
     46  1.1  riastrad };
     47  1.1  riastrad 
     48  1.1  riastrad /*
     49  1.1  riastrad  * Powergating configuration for a particular (context,engine).
     50  1.1  riastrad  */
     51  1.1  riastrad struct intel_sseu {
     52  1.1  riastrad 	u8 slice_mask;
     53  1.1  riastrad 	u8 subslice_mask;
     54  1.1  riastrad 	u8 min_eus_per_subslice;
     55  1.1  riastrad 	u8 max_eus_per_subslice;
     56  1.1  riastrad };
     57  1.1  riastrad 
     58  1.1  riastrad static inline struct intel_sseu
     59  1.1  riastrad intel_sseu_from_device_info(const struct sseu_dev_info *sseu)
     60  1.1  riastrad {
     61  1.1  riastrad 	struct intel_sseu value = {
     62  1.1  riastrad 		.slice_mask = sseu->slice_mask,
     63  1.1  riastrad 		.subslice_mask = sseu->subslice_mask[0],
     64  1.1  riastrad 		.min_eus_per_subslice = sseu->max_eus_per_subslice,
     65  1.1  riastrad 		.max_eus_per_subslice = sseu->max_eus_per_subslice,
     66  1.1  riastrad 	};
     67  1.1  riastrad 
     68  1.1  riastrad 	return value;
     69  1.1  riastrad }
     70  1.1  riastrad 
     71  1.1  riastrad static inline bool
     72  1.1  riastrad intel_sseu_has_subslice(const struct sseu_dev_info *sseu, int slice,
     73  1.1  riastrad 			int subslice)
     74  1.1  riastrad {
     75  1.1  riastrad 	u8 mask;
     76  1.1  riastrad 	int ss_idx = subslice / BITS_PER_BYTE;
     77  1.1  riastrad 
     78  1.1  riastrad 	GEM_BUG_ON(ss_idx >= sseu->ss_stride);
     79  1.1  riastrad 
     80  1.1  riastrad 	mask = sseu->subslice_mask[slice * sseu->ss_stride + ss_idx];
     81  1.1  riastrad 
     82  1.1  riastrad 	return mask & BIT(subslice % BITS_PER_BYTE);
     83  1.1  riastrad }
     84  1.1  riastrad 
     85  1.1  riastrad void intel_sseu_set_info(struct sseu_dev_info *sseu, u8 max_slices,
     86  1.1  riastrad 			 u8 max_subslices, u8 max_eus_per_subslice);
     87  1.1  riastrad 
     88  1.1  riastrad unsigned int
     89  1.1  riastrad intel_sseu_subslice_total(const struct sseu_dev_info *sseu);
     90  1.1  riastrad 
     91  1.1  riastrad unsigned int
     92  1.1  riastrad intel_sseu_subslices_per_slice(const struct sseu_dev_info *sseu, u8 slice);
     93  1.1  riastrad 
     94  1.1  riastrad u32  intel_sseu_get_subslices(const struct sseu_dev_info *sseu, u8 slice);
     95  1.1  riastrad 
     96  1.1  riastrad void intel_sseu_set_subslices(struct sseu_dev_info *sseu, int slice,
     97  1.1  riastrad 			      u32 ss_mask);
     98  1.1  riastrad 
     99  1.1  riastrad u32 intel_sseu_make_rpcs(struct drm_i915_private *i915,
    100  1.1  riastrad 			 const struct intel_sseu *req_sseu);
    101  1.1  riastrad 
    102  1.1  riastrad #endif /* __INTEL_SSEU_H__ */
    103