162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright © 2019 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __INTEL_GT__
762306a36Sopenharmony_ci#define __INTEL_GT__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "i915_drv.h"
1062306a36Sopenharmony_ci#include "intel_engine_types.h"
1162306a36Sopenharmony_ci#include "intel_gt_types.h"
1262306a36Sopenharmony_ci#include "intel_reset.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct drm_i915_private;
1562306a36Sopenharmony_cistruct drm_printer;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define GT_TRACE(gt, fmt, ...) do {					\
1862306a36Sopenharmony_ci	const struct intel_gt *gt__ __maybe_unused = (gt);		\
1962306a36Sopenharmony_ci	GEM_TRACE("%s " fmt, dev_name(gt__->i915->drm.dev),		\
2062306a36Sopenharmony_ci		  ##__VA_ARGS__);					\
2162306a36Sopenharmony_ci} while (0)
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic inline bool gt_is_root(struct intel_gt *gt)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	return !gt->info.id;
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic inline bool intel_gt_needs_wa_22016122933(struct intel_gt *gt)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	return MEDIA_VER_FULL(gt->i915) == IP_VER(13, 0) && gt->type == GT_MEDIA;
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic inline struct intel_gt *uc_to_gt(struct intel_uc *uc)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	return container_of(uc, struct intel_gt, uc);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic inline struct intel_gt *guc_to_gt(struct intel_guc *guc)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	return container_of(guc, struct intel_gt, uc.guc);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic inline struct intel_gt *huc_to_gt(struct intel_huc *huc)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	return container_of(huc, struct intel_gt, uc.huc);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic inline struct intel_gt *gsc_uc_to_gt(struct intel_gsc_uc *gsc_uc)
4962306a36Sopenharmony_ci{
5062306a36Sopenharmony_ci	return container_of(gsc_uc, struct intel_gt, uc.gsc);
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline struct intel_gt *gsc_to_gt(struct intel_gsc *gsc)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	return container_of(gsc, struct intel_gt, gsc);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_civoid intel_gt_common_init_early(struct intel_gt *gt);
5962306a36Sopenharmony_ciint intel_root_gt_init_early(struct drm_i915_private *i915);
6062306a36Sopenharmony_ciint intel_gt_assign_ggtt(struct intel_gt *gt);
6162306a36Sopenharmony_ciint intel_gt_init_mmio(struct intel_gt *gt);
6262306a36Sopenharmony_ciint __must_check intel_gt_init_hw(struct intel_gt *gt);
6362306a36Sopenharmony_ciint intel_gt_init(struct intel_gt *gt);
6462306a36Sopenharmony_civoid intel_gt_driver_register(struct intel_gt *gt);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_civoid intel_gt_driver_unregister(struct intel_gt *gt);
6762306a36Sopenharmony_civoid intel_gt_driver_remove(struct intel_gt *gt);
6862306a36Sopenharmony_civoid intel_gt_driver_release(struct intel_gt *gt);
6962306a36Sopenharmony_civoid intel_gt_driver_late_release_all(struct drm_i915_private *i915);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ciint intel_gt_wait_for_idle(struct intel_gt *gt, long timeout);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_civoid intel_gt_check_and_clear_faults(struct intel_gt *gt);
7462306a36Sopenharmony_cii915_reg_t intel_gt_perf_limit_reasons_reg(struct intel_gt *gt);
7562306a36Sopenharmony_civoid intel_gt_clear_error_registers(struct intel_gt *gt,
7662306a36Sopenharmony_ci				    intel_engine_mask_t engine_mask);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_civoid intel_gt_flush_ggtt_writes(struct intel_gt *gt);
7962306a36Sopenharmony_civoid intel_gt_chipset_flush(struct intel_gt *gt);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline u32 intel_gt_scratch_offset(const struct intel_gt *gt,
8262306a36Sopenharmony_ci					  enum intel_gt_scratch_field field)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	return i915_ggtt_offset(gt->scratch) + field;
8562306a36Sopenharmony_ci}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic inline bool intel_gt_has_unrecoverable_error(const struct intel_gt *gt)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	return test_bit(I915_WEDGED_ON_INIT, &gt->reset.flags) ||
9062306a36Sopenharmony_ci	       test_bit(I915_WEDGED_ON_FINI, &gt->reset.flags);
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistatic inline bool intel_gt_is_wedged(const struct intel_gt *gt)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	GEM_BUG_ON(intel_gt_has_unrecoverable_error(gt) &&
9662306a36Sopenharmony_ci		   !test_bit(I915_WEDGED, &gt->reset.flags));
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	return unlikely(test_bit(I915_WEDGED, &gt->reset.flags));
9962306a36Sopenharmony_ci}
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciint intel_gt_probe_all(struct drm_i915_private *i915);
10262306a36Sopenharmony_ciint intel_gt_tiles_init(struct drm_i915_private *i915);
10362306a36Sopenharmony_civoid intel_gt_release_all(struct drm_i915_private *i915);
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define for_each_gt(gt__, i915__, id__) \
10662306a36Sopenharmony_ci	for ((id__) = 0; \
10762306a36Sopenharmony_ci	     (id__) < I915_MAX_GT; \
10862306a36Sopenharmony_ci	     (id__)++) \
10962306a36Sopenharmony_ci		for_each_if(((gt__) = (i915__)->gt[(id__)]))
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_civoid intel_gt_info_print(const struct intel_gt_info *info,
11262306a36Sopenharmony_ci			 struct drm_printer *p);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_civoid intel_gt_watchdog_work(struct work_struct *work);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cienum i915_map_type intel_gt_coherent_map_type(struct intel_gt *gt,
11762306a36Sopenharmony_ci					      struct drm_i915_gem_object *obj,
11862306a36Sopenharmony_ci					      bool always_coherent);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci#endif /* __INTEL_GT_H__ */
121