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