[Intel-gfx] [RFC 2/7] drm/i915: Introduce runtime device info
Ville Syrjälä
ville.syrjala at linux.intel.com
Mon Nov 12 17:36:27 UTC 2018
On Mon, Nov 12, 2018 at 05:12:37PM +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>
> Idea of runtime device info is to contain all fields from the existing
> device info which are modified at runtime.
>
> Initially we move there fields which are never set from the static
> tables ie.: num_rings, num_sprites, num_scalers,
If we accept that num_sprites[fused_off_pipe] can be non-zero
we could keep num_sprites and num_scalers in the static info.
I don't *think* we have any code that would rely on those being
zero.
> cs_timestamp_frequency_khz, sseu and has_pooled_eu.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula at intel.com>
> ---
> drivers/gpu/drm/i915/i915_debugfs.c | 27 +++---
> drivers/gpu/drm/i915/i915_drv.c | 17 ++--
> drivers/gpu/drm/i915/i915_drv.h | 3 +-
> drivers/gpu/drm/i915/i915_gpu_error.c | 19 +++--
> drivers/gpu/drm/i915/i915_gpu_error.h | 1 +
> drivers/gpu/drm/i915/i915_perf.c | 5 +-
> drivers/gpu/drm/i915/i915_query.c | 2 +-
> drivers/gpu/drm/i915/intel_device_info.c | 82 +++++++++++--------
> drivers/gpu/drm/i915/intel_device_info.h | 42 ++++++----
> drivers/gpu/drm/i915/intel_display.c | 2 +-
> drivers/gpu/drm/i915/intel_display.h | 6 +-
> drivers/gpu/drm/i915/intel_engine_cs.c | 4 +-
> drivers/gpu/drm/i915/intel_lrc.c | 14 ++--
> drivers/gpu/drm/i915/intel_pm.c | 2 +-
> drivers/gpu/drm/i915/intel_ringbuffer.c | 4 +-
> drivers/gpu/drm/i915/intel_ringbuffer.h | 4 +-
> drivers/gpu/drm/i915/intel_workarounds.c | 6 +-
> .../gpu/drm/i915/selftests/i915_gem_context.c | 6 +-
> drivers/gpu/drm/i915/selftests/intel_lrc.c | 4 +-
> 19 files changed, 144 insertions(+), 106 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 670db5073d70..1b8a3f203b92 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -48,7 +48,7 @@ static int i915_capabilities(struct seq_file *m, void *data)
> seq_printf(m, "pch: %d\n", INTEL_PCH_TYPE(dev_priv));
>
> intel_device_info_dump_flags(info, &p);
> - intel_device_info_dump_runtime(info, &p);
> + intel_device_info_dump_runtime(&dev_priv->runtime_info, &p);
> intel_driver_caps_print(&dev_priv->caps, &p);
>
> kernel_param_lock(THIS_MODULE);
> @@ -3289,7 +3289,7 @@ static int i915_engine_info(struct seq_file *m, void *unused)
> seq_printf(m, "Global active requests: %d\n",
> dev_priv->gt.active_requests);
> seq_printf(m, "CS timestamp frequency: %u kHz\n",
> - dev_priv->info.cs_timestamp_frequency_khz);
> + dev_priv->runtime_info.cs_timestamp_frequency_khz);
>
> p = drm_seq_file_printer(m);
> for_each_engine(engine, dev_priv, id)
> @@ -3305,7 +3305,7 @@ static int i915_rcs_topology(struct seq_file *m, void *unused)
> struct drm_i915_private *dev_priv = node_to_i915(m->private);
> struct drm_printer p = drm_seq_file_printer(m);
>
> - intel_device_info_dump_topology(&INTEL_INFO(dev_priv)->sseu, &p);
> + intel_device_info_dump_topology(&dev_priv->runtime_info.sseu, &p);
>
> return 0;
> }
> @@ -4341,7 +4341,7 @@ static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
> struct sseu_dev_info *sseu)
> {
> #define SS_MAX 6
> - const struct intel_device_info *info = INTEL_INFO(dev_priv);
> + const struct intel_runtime_device_info *info = &dev_priv->runtime_info;
> u32 s_reg[SS_MAX], eu_reg[2 * SS_MAX], eu_mask[2];
> int s, ss;
>
> @@ -4397,7 +4397,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
> struct sseu_dev_info *sseu)
> {
> #define SS_MAX 3
> - const struct intel_device_info *info = INTEL_INFO(dev_priv);
> + const struct intel_runtime_device_info *info = &dev_priv->runtime_info;
> u32 s_reg[SS_MAX], eu_reg[2 * SS_MAX], eu_mask[2];
> int s, ss;
>
> @@ -4424,8 +4424,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
> sseu->slice_mask |= BIT(s);
>
> if (IS_GEN9_BC(dev_priv))
> - sseu->subslice_mask[s] =
> - INTEL_INFO(dev_priv)->sseu.subslice_mask[s];
> + sseu->subslice_mask[s] = info->sseu.subslice_mask[s];
>
> for (ss = 0; ss < info->sseu.max_subslices; ss++) {
> unsigned int eu_cnt;
> @@ -4459,10 +4458,10 @@ static void broadwell_sseu_device_status(struct drm_i915_private *dev_priv,
>
> if (sseu->slice_mask) {
> sseu->eu_per_subslice =
> - INTEL_INFO(dev_priv)->sseu.eu_per_subslice;
> + dev_priv->runtime_info.sseu.eu_per_subslice;
> for (s = 0; s < fls(sseu->slice_mask); s++) {
> sseu->subslice_mask[s] =
> - INTEL_INFO(dev_priv)->sseu.subslice_mask[s];
> + dev_priv->runtime_info.sseu.subslice_mask[s];
> }
> sseu->eu_total = sseu->eu_per_subslice *
> sseu_subslice_total(sseu);
> @@ -4470,7 +4469,7 @@ static void broadwell_sseu_device_status(struct drm_i915_private *dev_priv,
> /* subtract fused off EU(s) from enabled slice(s) */
> for (s = 0; s < fls(sseu->slice_mask); s++) {
> u8 subslice_7eu =
> - INTEL_INFO(dev_priv)->sseu.subslice_7eu[s];
> + dev_priv->runtime_info.sseu.subslice_7eu[s];
>
> sseu->eu_total -= hweight8(subslice_7eu);
> }
> @@ -4523,14 +4522,14 @@ static int i915_sseu_status(struct seq_file *m, void *unused)
> return -ENODEV;
>
> seq_puts(m, "SSEU Device Info\n");
> - i915_print_sseu_info(m, true, &INTEL_INFO(dev_priv)->sseu);
> + i915_print_sseu_info(m, true, &dev_priv->runtime_info.sseu);
>
> seq_puts(m, "SSEU Device Status\n");
> memset(&sseu, 0, sizeof(sseu));
> - sseu.max_slices = INTEL_INFO(dev_priv)->sseu.max_slices;
> - sseu.max_subslices = INTEL_INFO(dev_priv)->sseu.max_subslices;
> + sseu.max_slices = dev_priv->runtime_info.sseu.max_slices;
> + sseu.max_subslices = dev_priv->runtime_info.sseu.max_subslices;
> sseu.max_eus_per_subslice =
> - INTEL_INFO(dev_priv)->sseu.max_eus_per_subslice;
> + dev_priv->runtime_info.sseu.max_eus_per_subslice;
>
> intel_runtime_pm_get(dev_priv);
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index b1d23c73c147..9cfd5b145248 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -357,12 +357,12 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data,
> value = i915_cmd_parser_get_version(dev_priv);
> break;
> case I915_PARAM_SUBSLICE_TOTAL:
> - value = sseu_subslice_total(&INTEL_INFO(dev_priv)->sseu);
> + value = sseu_subslice_total(&dev_priv->runtime_info.sseu);
> if (!value)
> return -ENODEV;
> break;
> case I915_PARAM_EU_TOTAL:
> - value = INTEL_INFO(dev_priv)->sseu.eu_total;
> + value = dev_priv->runtime_info.sseu.eu_total;
> if (!value)
> return -ENODEV;
> break;
> @@ -379,7 +379,7 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data,
> value = HAS_POOLED_EU(dev_priv);
> break;
> case I915_PARAM_MIN_EU_IN_POOL:
> - value = INTEL_INFO(dev_priv)->sseu.min_eu_in_pool;
> + value = dev_priv->runtime_info.sseu.min_eu_in_pool;
> break;
> case I915_PARAM_HUC_STATUS:
> value = intel_huc_check_status(&dev_priv->huc);
> @@ -429,17 +429,18 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data,
> value = intel_engines_has_context_isolation(dev_priv);
> break;
> case I915_PARAM_SLICE_MASK:
> - value = INTEL_INFO(dev_priv)->sseu.slice_mask;
> + value = dev_priv->runtime_info.sseu.slice_mask;
> if (!value)
> return -ENODEV;
> break;
> case I915_PARAM_SUBSLICE_MASK:
> - value = INTEL_INFO(dev_priv)->sseu.subslice_mask[0];
> + value = dev_priv->runtime_info.sseu.subslice_mask[0];
> if (!value)
> return -ENODEV;
> break;
> case I915_PARAM_CS_TIMESTAMP_FREQUENCY:
> - value = 1000 * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz;
> + value = 1000 *
> + dev_priv->runtime_info.cs_timestamp_frequency_khz;
> break;
> case I915_PARAM_MMAP_GTT_COHERENT:
> value = INTEL_INFO(dev_priv)->has_coherent_ggtt;
> @@ -1372,7 +1373,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
> if (i915_inject_load_failure())
> return -ENODEV;
>
> - intel_device_info_runtime_init(mkwrite_device_info(dev_priv));
> + intel_device_info_runtime_init(dev_priv);
>
> if (HAS_PPGTT(dev_priv)) {
> if (intel_vgpu_active(dev_priv) &&
> @@ -1620,7 +1621,7 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
> struct drm_printer p = drm_debug_printer("i915 device info:");
>
> intel_device_info_dump(&dev_priv->info, &p);
> - intel_device_info_dump_runtime(&dev_priv->info, &p);
> + intel_device_info_dump_runtime(&dev_priv->runtime_info, &p);
> }
>
> if (IS_ENABLED(CONFIG_DRM_I915_DEBUG))
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 08d25aa480f7..f677a9936d33 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1589,6 +1589,7 @@ struct drm_i915_private {
> struct kmem_cache *priorities;
>
> const struct intel_device_info info;
> + struct intel_runtime_device_info runtime_info;
> struct intel_driver_caps caps;
>
> /**
> @@ -2663,7 +2664,7 @@ intel_info(const struct drm_i915_private *dev_priv)
> #define USES_GUC_SUBMISSION(dev_priv) intel_uc_is_using_guc_submission()
> #define USES_HUC(dev_priv) intel_uc_is_using_huc()
>
> -#define HAS_POOLED_EU(dev_priv) ((dev_priv)->info.has_pooled_eu)
> +#define HAS_POOLED_EU(dev_priv) ((dev_priv)->runtime_info.has_pooled_eu)
>
> #define INTEL_PCH_DEVICE_ID_MASK 0xff80
> #define INTEL_PCH_IBX_DEVICE_ID_TYPE 0x3b00
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> index c8d8f79688a8..3e872bb1f00a 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> @@ -589,15 +589,18 @@ static void print_error_obj(struct drm_i915_error_state_buf *m,
> err_puts(m, "\n");
> }
>
> -static void err_print_capabilities(struct drm_i915_error_state_buf *m,
> - const struct intel_device_info *info,
> - const struct intel_driver_caps *caps)
> +static void
> +err_print_capabilities(struct drm_i915_error_state_buf *m,
> + const struct intel_device_info *info,
> + const struct intel_runtime_device_info *runtime_info,
> + const struct intel_driver_caps *caps)
> {
> struct drm_printer p = i915_error_printer(m);
>
> intel_device_info_dump_flags(info, &p);
> + intel_device_info_dump_runtime(runtime_info, &p);
> intel_driver_caps_print(caps, &p);
> - intel_device_info_dump_topology(&info->sseu, &p);
> + intel_device_info_dump_topology(&runtime_info->sseu, &p);
> }
>
> static void err_print_params(struct drm_i915_error_state_buf *m,
> @@ -829,7 +832,10 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
> if (error->display)
> intel_display_print_error_state(m, error->display);
>
> - err_print_capabilities(m, &error->device_info, &error->driver_caps);
> + err_print_capabilities(m,
> + &error->device_info,
> + &error->runtime_device_info,
> + &error->driver_caps);
> err_print_params(m, &error->params);
> err_print_uc(m, &error->uc);
>
> @@ -1751,6 +1757,9 @@ static void capture_gen_state(struct i915_gpu_state *error)
> memcpy(&error->device_info,
> INTEL_INFO(i915),
> sizeof(error->device_info));
> + memcpy(&error->runtime_device_info,
> + &i915->runtime_info,
> + sizeof(error->runtime_device_info));
> error->driver_caps = i915->caps;
> }
>
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h
> index 8710fb18ed74..ede9aa5ae1a2 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.h
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.h
> @@ -45,6 +45,7 @@ struct i915_gpu_state {
> u32 reset_count;
> u32 suspend_count;
> struct intel_device_info device_info;
> + struct intel_runtime_device_info runtime_device_info;
> struct intel_driver_caps driver_caps;
> struct i915_params params;
>
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 2c2b63be7a6c..9054237251c3 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -2646,7 +2646,8 @@ i915_perf_open_ioctl_locked(struct drm_i915_private *dev_priv,
> static u64 oa_exponent_to_ns(struct drm_i915_private *dev_priv, int exponent)
> {
> return div64_u64(1000000000ULL * (2ULL << exponent),
> - 1000ULL * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz);
> + 1000ULL *
> + dev_priv->runtime_info.cs_timestamp_frequency_khz);
> }
>
> static int
> @@ -3505,7 +3506,7 @@ void i915_perf_init(struct drm_i915_private *dev_priv)
> spin_lock_init(&dev_priv->perf.oa.oa_buffer.ptr_lock);
>
> oa_sample_rate_hard_limit = 1000 *
> - (INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz / 2);
> + (dev_priv->runtime_info.cs_timestamp_frequency_khz / 2);
> dev_priv->perf.sysctl_header = register_sysctl_table(dev_root);
>
> mutex_init(&dev_priv->perf.metrics_lock);
> diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c
> index 6fc4b8eeab42..6b2c6e6873d3 100644
> --- a/drivers/gpu/drm/i915/i915_query.c
> +++ b/drivers/gpu/drm/i915/i915_query.c
> @@ -13,7 +13,7 @@
> static int query_topology_info(struct drm_i915_private *dev_priv,
> struct drm_i915_query_item *query_item)
> {
> - const struct sseu_dev_info *sseu = &INTEL_INFO(dev_priv)->sseu;
> + const struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> struct drm_i915_query_topology_info topo;
> u32 slice_length, subslice_length, eu_length, total_length;
>
> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index 89ed3a84a4fa..8385767aaf08 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -79,6 +79,15 @@ void intel_device_info_dump_flags(const struct intel_device_info *info,
> #undef PRINT_FLAG
> }
>
> +void
> +intel_runtime_device_info_dump_flags(const struct intel_runtime_device_info *info,
> + struct drm_printer *p)
> +{
> +#define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->name));
> + DEV_RUNTIME_INFO_FOR_EACH_FLAG(PRINT_FLAG);
> +#undef PRINT_FLAG
> +}
> +
> static void sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p)
> {
> int s;
> @@ -100,13 +109,16 @@ static void sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p)
> drm_printf(p, "has EU power gating: %s\n", yesno(sseu->has_eu_pg));
> }
>
> -void intel_device_info_dump_runtime(const struct intel_device_info *info,
> - struct drm_printer *p)
> +void
> +intel_device_info_dump_runtime(const struct intel_runtime_device_info *info,
> + struct drm_printer *p)
> {
> sseu_dump(&info->sseu, p);
>
> drm_printf(p, "CS timestamp frequency: %u kHz\n",
> info->cs_timestamp_frequency_khz);
> +
> + intel_runtime_device_info_dump_flags(info, p);
> }
>
> void intel_device_info_dump(const struct intel_device_info *info,
> @@ -160,7 +172,7 @@ static u16 compute_eu_total(const struct sseu_dev_info *sseu)
>
> static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)
> {
> - struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> + struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> u8 s_en;
> u32 ss_en, ss_en_mask;
> u8 eu_en;
> @@ -199,7 +211,7 @@ static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)
>
> static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
> {
> - struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> + struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> const u32 fuse2 = I915_READ(GEN8_FUSE2);
> int s, ss;
> const int eu_mask = 0xff;
> @@ -276,7 +288,7 @@ static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
>
> static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)
> {
> - struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> + struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> u32 fuse;
>
> fuse = I915_READ(CHV_FUSE_GT);
> @@ -329,7 +341,7 @@ static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)
>
> static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
> {
> - struct intel_device_info *info = mkwrite_device_info(dev_priv);
> + struct intel_runtime_device_info *info = &dev_priv->runtime_info;
> struct sseu_dev_info *sseu = &info->sseu;
> int s, ss;
> u32 fuse2, eu_disable, subslice_mask;
> @@ -433,7 +445,7 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
>
> static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
> {
> - struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> + struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> int s, ss;
> u32 fuse2, subslice_mask, eu_disable[3]; /* s_max */
>
> @@ -515,8 +527,7 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
>
> static void haswell_sseu_info_init(struct drm_i915_private *dev_priv)
> {
> - struct intel_device_info *info = mkwrite_device_info(dev_priv);
> - struct sseu_dev_info *sseu = &info->sseu;
> + struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> u32 fuse1;
> int s, ss;
>
> @@ -524,9 +535,9 @@ static void haswell_sseu_info_init(struct drm_i915_private *dev_priv)
> * There isn't a register to tell us how many slices/subslices. We
> * work off the PCI-ids here.
> */
> - switch (info->gt) {
> + switch (INTEL_INFO(dev_priv)->gt) {
> default:
> - MISSING_CASE(info->gt);
> + MISSING_CASE(INTEL_INFO(dev_priv)->gt);
> /* fall through */
> case 1:
> sseu->slice_mask = BIT(0);
> @@ -735,29 +746,30 @@ static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv)
> * - after the PCH has been detected,
> * - before the first usage of the fields it can tweak.
> */
> -void intel_device_info_runtime_init(struct intel_device_info *info)
> +void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
> {
> - struct drm_i915_private *dev_priv =
> - container_of(info, struct drm_i915_private, info);
> + struct intel_device_info *info = mkwrite_device_info(dev_priv);
> + struct intel_runtime_device_info *runtime_info =
> + &dev_priv->runtime_info;
> enum pipe pipe;
>
> if (INTEL_GEN(dev_priv) >= 10) {
> for_each_pipe(dev_priv, pipe)
> - info->num_scalers[pipe] = 2;
> + runtime_info->num_scalers[pipe] = 2;
> } else if (IS_GEN9(dev_priv)) {
> - info->num_scalers[PIPE_A] = 2;
> - info->num_scalers[PIPE_B] = 2;
> - info->num_scalers[PIPE_C] = 1;
> + runtime_info->num_scalers[PIPE_A] = 2;
> + runtime_info->num_scalers[PIPE_B] = 2;
> + runtime_info->num_scalers[PIPE_C] = 1;
> }
>
> BUILD_BUG_ON(I915_NUM_ENGINES > BITS_PER_TYPE(intel_ring_mask_t));
>
> if (IS_GEN11(dev_priv))
> for_each_pipe(dev_priv, pipe)
> - info->num_sprites[pipe] = 6;
> + runtime_info->num_sprites[pipe] = 6;
> else if (IS_GEN10(dev_priv) || IS_GEMINILAKE(dev_priv))
> for_each_pipe(dev_priv, pipe)
> - info->num_sprites[pipe] = 3;
> + runtime_info->num_sprites[pipe] = 3;
> else if (IS_BROXTON(dev_priv)) {
> /*
> * Skylake and Broxton currently don't expose the topmost plane as its
> @@ -768,15 +780,15 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
> * down the line.
> */
>
> - info->num_sprites[PIPE_A] = 2;
> - info->num_sprites[PIPE_B] = 2;
> - info->num_sprites[PIPE_C] = 1;
> + runtime_info->num_sprites[PIPE_A] = 2;
> + runtime_info->num_sprites[PIPE_B] = 2;
> + runtime_info->num_sprites[PIPE_C] = 1;
> } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
> for_each_pipe(dev_priv, pipe)
> - info->num_sprites[pipe] = 2;
> + runtime_info->num_sprites[pipe] = 2;
> } else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) {
> for_each_pipe(dev_priv, pipe)
> - info->num_sprites[pipe] = 1;
> + runtime_info->num_sprites[pipe] = 1;
> }
>
> if (i915_modparams.disable_display) {
> @@ -860,7 +872,8 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
> }
>
> /* Initialize command stream timestamp frequency */
> - info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
> + runtime_info->cs_timestamp_frequency_khz =
> + read_timestamp_frequency(dev_priv);
> }
>
> void intel_driver_caps_print(const struct intel_driver_caps *caps,
> @@ -880,6 +893,8 @@ void intel_driver_caps_print(const struct intel_driver_caps *caps,
> void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
> {
> struct intel_device_info *info = mkwrite_device_info(dev_priv);
> + struct intel_runtime_device_info *runtime_info =
> + &dev_priv->runtime_info;
> u32 media_fuse;
> unsigned int i;
>
> @@ -888,27 +903,28 @@ void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
>
> media_fuse = ~I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
>
> - info->vdbox_enable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
> - info->vebox_enable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
> - GEN11_GT_VEBOX_DISABLE_SHIFT;
> + runtime_info->vdbox_enable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
> + runtime_info->vebox_enable =
> + (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
> + GEN11_GT_VEBOX_DISABLE_SHIFT;
>
> - DRM_DEBUG_DRIVER("vdbox enable: %04x\n", info->vdbox_enable);
> + DRM_DEBUG_DRIVER("vdbox enable: %04x\n", runtime_info->vdbox_enable);
> for (i = 0; i < I915_MAX_VCS; i++) {
> if (!HAS_ENGINE(dev_priv, _VCS(i)))
> continue;
>
> - if (!(BIT(i) & info->vdbox_enable)) {
> + if (!(BIT(i) & runtime_info->vdbox_enable)) {
> info->ring_mask &= ~ENGINE_MASK(_VCS(i));
> DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
> }
> }
>
> - DRM_DEBUG_DRIVER("vebox enable: %04x\n", info->vebox_enable);
> + DRM_DEBUG_DRIVER("vebox enable: %04x\n", runtime_info->vebox_enable);
> for (i = 0; i < I915_MAX_VECS; i++) {
> if (!HAS_ENGINE(dev_priv, _VECS(i)))
> continue;
>
> - if (!(BIT(i) & info->vebox_enable)) {
> + if (!(BIT(i) & runtime_info->vebox_enable)) {
> info->ring_mask &= ~ENGINE_MASK(_VECS(i));
> DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
> }
> diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
> index 88f97210dc49..83e19ac8e401 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.h
> +++ b/drivers/gpu/drm/i915/intel_device_info.h
> @@ -105,7 +105,6 @@ enum intel_ppgtt {
> func(has_logical_ring_elsq); \
> func(has_logical_ring_preemption); \
> func(has_overlay); \
> - func(has_pooled_eu); \
> func(has_psr); \
> func(has_rc6); \
> func(has_rc6p); \
> @@ -154,8 +153,8 @@ struct intel_device_info {
>
> u8 gen;
> u8 gt; /* GT number, 0 if undefined */
> - u8 num_rings;
> intel_ring_mask_t ring_mask; /* Rings supported by the HW */
> + u8 num_pipes;
>
> enum intel_platform platform;
> u32 platform_mask;
> @@ -165,10 +164,6 @@ struct intel_device_info {
>
> u32 display_mmio_offset;
>
> - u8 num_pipes;
> - u8 num_sprites[I915_MAX_PIPES];
> - u8 num_scalers[I915_MAX_PIPES];
> -
> #define DEFINE_FLAG(name) u8 name:1
> DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
> #undef DEFINE_FLAG
> @@ -179,19 +174,33 @@ struct intel_device_info {
> int trans_offsets[I915_MAX_TRANSCODERS];
> int cursor_offsets[I915_MAX_PIPES];
>
> - /* Slice/subslice/EU info */
> - struct sseu_dev_info sseu;
> + struct color_luts {
> + u16 degamma_lut_size;
> + u16 gamma_lut_size;
> + } color;
> +};
>
> - u32 cs_timestamp_frequency_khz;
> +#define DEV_RUNTIME_INFO_FOR_EACH_FLAG(func) \
> + func(has_pooled_eu); \
> +
> +struct intel_runtime_device_info {
> + unsigned int num_rings;
> +
> + u8 num_sprites[I915_MAX_PIPES];
> + u8 num_scalers[I915_MAX_PIPES];
>
> /* Enabled (not fused off) media engine bitmasks. */
> u8 vdbox_enable;
> u8 vebox_enable;
>
> - struct color_luts {
> - u16 degamma_lut_size;
> - u16 gamma_lut_size;
> - } color;
> + u32 cs_timestamp_frequency_khz;
> +
> + /* Slice/subslice/EU info */
> + struct sseu_dev_info sseu;
> +
> +#define DEFINE_FLAG(name) u8 name:1
> + DEV_RUNTIME_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
> +#undef DEFINE_FLAG
> };
>
> struct intel_driver_caps {
> @@ -248,13 +257,14 @@ static inline void sseu_set_eus(struct sseu_dev_info *sseu,
>
> const char *intel_platform_name(enum intel_platform platform);
>
> -void intel_device_info_runtime_init(struct intel_device_info *info);
> +void intel_device_info_runtime_init(struct drm_i915_private *dev_priv);
> void intel_device_info_dump(const struct intel_device_info *info,
> struct drm_printer *p);
> void intel_device_info_dump_flags(const struct intel_device_info *info,
> struct drm_printer *p);
> -void intel_device_info_dump_runtime(const struct intel_device_info *info,
> - struct drm_printer *p);
> +void
> +intel_device_info_dump_runtime(const struct intel_runtime_device_info *info,
> + struct drm_printer *p);
> void intel_device_info_dump_topology(const struct sseu_dev_info *sseu,
> struct drm_printer *p);
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index a7fa032310ae..cc30bf1172ad 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -13892,7 +13892,7 @@ static void intel_crtc_init_scalers(struct intel_crtc *crtc,
> struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> int i;
>
> - crtc->num_scalers = dev_priv->info.num_scalers[crtc->pipe];
> + crtc->num_scalers = dev_priv->runtime_info.num_scalers[crtc->pipe];
> if (!crtc->num_scalers)
> return;
>
> diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h
> index 5d50decbcbb5..607ddc4a0b11 100644
> --- a/drivers/gpu/drm/i915/intel_display.h
> +++ b/drivers/gpu/drm/i915/intel_display.h
> @@ -105,7 +105,7 @@ enum i9xx_plane_id {
> };
>
> #define plane_name(p) ((p) + 'A')
> -#define sprite_name(p, s) ((p) * INTEL_INFO(dev_priv)->num_sprites[(p)] + (s) + 'A')
> +#define sprite_name(p, s) ((p) * dev_priv->runtime_info.num_sprites[(p)] + (s) + 'A')
>
> /*
> * Per-pipe plane identifier.
> @@ -294,12 +294,12 @@ struct intel_link_m_n {
>
> #define for_each_universal_plane(__dev_priv, __pipe, __p) \
> for ((__p) = 0; \
> - (__p) < INTEL_INFO(__dev_priv)->num_sprites[(__pipe)] + 1; \
> + (__p) < (__dev_priv)->runtime_info.num_sprites[(__pipe)] + 1;\
> (__p)++)
>
> #define for_each_sprite(__dev_priv, __p, __s) \
> for ((__s) = 0; \
> - (__s) < INTEL_INFO(__dev_priv)->num_sprites[(__p)]; \
> + (__s) < (__dev_priv)->runtime_info.num_sprites[(__p)]; \
> (__s)++)
>
> #define for_each_port_masked(__port, __ports_mask) \
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index bc147d9e6c92..b464ee0afb85 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -365,7 +365,7 @@ int intel_engines_init_mmio(struct drm_i915_private *dev_priv)
> goto cleanup;
> }
>
> - device_info->num_rings = hweight32(mask);
> + dev_priv->runtime_info.num_rings = hweight32(mask);
>
> i915_check_and_clear_faults(dev_priv);
>
> @@ -807,7 +807,7 @@ const char *i915_cache_level_str(struct drm_i915_private *i915, int type)
>
> u32 intel_calculate_mcr_s_ss_select(struct drm_i915_private *dev_priv)
> {
> - const struct sseu_dev_info *sseu = &(INTEL_INFO(dev_priv)->sseu);
> + const struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> u32 mcr_s_ss_select;
> u32 slice = fls(sseu->slice_mask);
> u32 subslice = fls(sseu->subslice_mask[slice]);
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 08fd9b12e4d7..cc897f429635 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -2343,9 +2343,9 @@ int logical_xcs_ring_init(struct intel_engine_cs *engine)
> static u32
> make_rpcs(struct drm_i915_private *dev_priv)
> {
> - bool subslice_pg = INTEL_INFO(dev_priv)->sseu.has_subslice_pg;
> - u8 slices = hweight8(INTEL_INFO(dev_priv)->sseu.slice_mask);
> - u8 subslices = hweight8(INTEL_INFO(dev_priv)->sseu.subslice_mask[0]);
> + bool subslice_pg = dev_priv->runtime_info.sseu.has_subslice_pg;
> + u8 slices = hweight8(dev_priv->runtime_info.sseu.slice_mask);
> + u8 subslices = hweight8(dev_priv->runtime_info.sseu.subslice_mask[0]);
> u32 rpcs = 0;
>
> /*
> @@ -2393,7 +2393,7 @@ make_rpcs(struct drm_i915_private *dev_priv)
> * must make an explicit request through RPCS for full
> * enablement.
> */
> - if (INTEL_INFO(dev_priv)->sseu.has_slice_pg) {
> + if (dev_priv->runtime_info.sseu.has_slice_pg) {
> u32 mask, val = slices;
>
> if (INTEL_GEN(dev_priv) >= 11) {
> @@ -2421,17 +2421,17 @@ make_rpcs(struct drm_i915_private *dev_priv)
> rpcs |= GEN8_RPCS_ENABLE | GEN8_RPCS_SS_CNT_ENABLE | val;
> }
>
> - if (INTEL_INFO(dev_priv)->sseu.has_eu_pg) {
> + if (dev_priv->runtime_info.sseu.has_eu_pg) {
> u32 val;
>
> - val = INTEL_INFO(dev_priv)->sseu.eu_per_subslice <<
> + val = dev_priv->runtime_info.sseu.eu_per_subslice <<
> GEN8_RPCS_EU_MIN_SHIFT;
> GEM_BUG_ON(val & ~GEN8_RPCS_EU_MIN_MASK);
> val &= GEN8_RPCS_EU_MIN_MASK;
>
> rpcs |= val;
>
> - val = INTEL_INFO(dev_priv)->sseu.eu_per_subslice <<
> + val = dev_priv->runtime_info.sseu.eu_per_subslice <<
> GEN8_RPCS_EU_MAX_SHIFT;
> GEM_BUG_ON(val & ~GEN8_RPCS_EU_MAX_MASK);
> val &= GEN8_RPCS_EU_MAX_MASK;
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 5df7f6e1ab5e..17270d8f1880 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -7341,7 +7341,7 @@ static int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
>
> val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
>
> - switch (INTEL_INFO(dev_priv)->sseu.eu_total) {
> + switch (dev_priv->runtime_info.sseu.eu_total) {
> case 8:
> /* (2 * 4) config */
> rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS4EU_FUSE_SHIFT);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 87eebc13c0d8..fccebf773461 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -1566,7 +1566,7 @@ static inline int mi_set_context(struct i915_request *rq, u32 flags)
> const int num_rings =
> /* Use an extended w/a on gen7 if signalling from other rings */
> (HAS_LEGACY_SEMAPHORES(i915) && IS_GEN7(i915)) ?
> - INTEL_INFO(i915)->num_rings - 1 :
> + i915->runtime_info.num_rings - 1 :
> 0;
> bool force_restore = false;
> int len;
> @@ -2231,7 +2231,7 @@ static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
>
> engine->emit_breadcrumb = gen6_sema_emit_breadcrumb;
>
> - num_rings = INTEL_INFO(dev_priv)->num_rings - 1;
> + num_rings = dev_priv->runtime_info.num_rings - 1;
> engine->emit_breadcrumb_sz += num_rings * 3;
> if (num_rings & 1)
> engine->emit_breadcrumb_sz++;
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 8a2270b209b0..db2933d287b8 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -94,11 +94,11 @@ hangcheck_action_to_str(const enum intel_engine_hangcheck_action a)
>
> #define instdone_slice_mask(dev_priv__) \
> (IS_GEN7(dev_priv__) ? \
> - 1 : INTEL_INFO(dev_priv__)->sseu.slice_mask)
> + 1 : (dev_priv__)->runtime_info.sseu.slice_mask)
>
> #define instdone_subslice_mask(dev_priv__) \
> (IS_GEN7(dev_priv__) ? \
> - 1 : INTEL_INFO(dev_priv__)->sseu.subslice_mask[0])
> + 1 : (dev_priv__)->runtime_info.sseu.subslice_mask[0])
>
> #define for_each_instdone_slice_subslice(dev_priv__, slice__, subslice__) \
> for ((slice__) = 0, (subslice__) = 0; \
> diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c
> index d7176213e3ce..110556d0934f 100644
> --- a/drivers/gpu/drm/i915/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/intel_workarounds.c
> @@ -318,7 +318,7 @@ static int skl_tune_iz_hashing(struct drm_i915_private *dev_priv)
> * Only consider slices where one, and only one, subslice has 7
> * EUs
> */
> - if (!is_power_of_2(INTEL_INFO(dev_priv)->sseu.subslice_7eu[i]))
> + if (!is_power_of_2(dev_priv->runtime_info.sseu.subslice_7eu[i]))
> continue;
>
> /*
> @@ -327,7 +327,7 @@ static int skl_tune_iz_hashing(struct drm_i915_private *dev_priv)
> *
> * -> 0 <= ss <= 3;
> */
> - ss = ffs(INTEL_INFO(dev_priv)->sseu.subslice_7eu[i]) - 1;
> + ss = ffs(dev_priv->runtime_info.sseu.subslice_7eu[i]) - 1;
> vals[i] = 3 - ss;
> }
>
> @@ -732,7 +732,7 @@ static void cfl_gt_workarounds_apply(struct drm_i915_private *dev_priv)
>
> static void wa_init_mcr(struct drm_i915_private *dev_priv)
> {
> - const struct sseu_dev_info *sseu = &(INTEL_INFO(dev_priv)->sseu);
> + const struct sseu_dev_info *sseu = &dev_priv->runtime_info.sseu;
> u32 mcr;
> u32 mcr_slice_subslice_mask;
>
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> index 7d82043aff10..4ee3fcff815a 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -627,7 +627,7 @@ static int igt_ctx_exec(void *arg)
> ncontexts++;
> }
> pr_info("Submitted %lu contexts (across %u engines), filling %lu dwords\n",
> - ncontexts, INTEL_INFO(i915)->num_rings, ndwords);
> + ncontexts, i915->runtime_info.num_rings, ndwords);
>
> dw = 0;
> list_for_each_entry(obj, &objects, st_link) {
> @@ -732,7 +732,7 @@ static int igt_ctx_readonly(void *arg)
> }
> }
> pr_info("Submitted %lu dwords (across %u engines)\n",
> - ndwords, INTEL_INFO(i915)->num_rings);
> + ndwords, i915->runtime_info.num_rings);
>
> dw = 0;
> list_for_each_entry(obj, &objects, st_link) {
> @@ -1064,7 +1064,7 @@ static int igt_vm_isolation(void *arg)
> count += this;
> }
> pr_info("Checked %lu scratch offsets across %d engines\n",
> - count, INTEL_INFO(i915)->num_rings);
> + count, i915->runtime_info.num_rings);
>
> out_rpm:
> intel_runtime_pm_put(i915);
> diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> index 94fc0e5c8766..7237a2474805 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> @@ -719,7 +719,7 @@ static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags)
>
> pr_info("Submitted %lu crescendo:%x requests across %d engines and %d contexts\n",
> count, flags,
> - INTEL_INFO(smoke->i915)->num_rings, smoke->ncontext);
> + smoke->i915->runtime_info.num_rings, smoke->ncontext);
> return 0;
> }
>
> @@ -747,7 +747,7 @@ static int smoke_random(struct preempt_smoke *smoke, unsigned int flags)
>
> pr_info("Submitted %lu random:%x requests across %d engines and %d contexts\n",
> count, flags,
> - INTEL_INFO(smoke->i915)->num_rings, smoke->ncontext);
> + smoke->i915->runtime_info.num_rings, smoke->ncontext);
> return 0;
> }
>
> --
> 2.19.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Ville Syrjälä
Intel
More information about the Intel-gfx
mailing list