2017-12-22 05:57:32 +08:00
|
|
|
/*
|
|
|
|
* Copyright © 2014-2017 Intel Corporation
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
|
|
* IN THE SOFTWARE.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _INTEL_DEVICE_INFO_H_
|
|
|
|
#define _INTEL_DEVICE_INFO_H_
|
|
|
|
|
2018-09-27 04:12:22 +08:00
|
|
|
#include <uapi/drm/i915_drm.h>
|
|
|
|
|
2019-06-13 16:44:16 +08:00
|
|
|
#include "display/intel_display.h"
|
|
|
|
|
2019-04-25 01:48:39 +08:00
|
|
|
#include "gt/intel_engine_types.h"
|
|
|
|
#include "gt/intel_context_types.h"
|
|
|
|
#include "gt/intel_sseu.h"
|
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
struct drm_printer;
|
|
|
|
struct drm_i915_private;
|
|
|
|
|
|
|
|
/* Keep in gen based order, and chronological order within a gen */
|
|
|
|
enum intel_platform {
|
|
|
|
INTEL_PLATFORM_UNINITIALIZED = 0,
|
|
|
|
/* gen2 */
|
|
|
|
INTEL_I830,
|
|
|
|
INTEL_I845G,
|
|
|
|
INTEL_I85X,
|
|
|
|
INTEL_I865G,
|
|
|
|
/* gen3 */
|
|
|
|
INTEL_I915G,
|
|
|
|
INTEL_I915GM,
|
|
|
|
INTEL_I945G,
|
|
|
|
INTEL_I945GM,
|
|
|
|
INTEL_G33,
|
|
|
|
INTEL_PINEVIEW,
|
|
|
|
/* gen4 */
|
|
|
|
INTEL_I965G,
|
|
|
|
INTEL_I965GM,
|
|
|
|
INTEL_G45,
|
|
|
|
INTEL_GM45,
|
|
|
|
/* gen5 */
|
|
|
|
INTEL_IRONLAKE,
|
|
|
|
/* gen6 */
|
|
|
|
INTEL_SANDYBRIDGE,
|
|
|
|
/* gen7 */
|
|
|
|
INTEL_IVYBRIDGE,
|
|
|
|
INTEL_VALLEYVIEW,
|
|
|
|
INTEL_HASWELL,
|
|
|
|
/* gen8 */
|
|
|
|
INTEL_BROADWELL,
|
|
|
|
INTEL_CHERRYVIEW,
|
|
|
|
/* gen9 */
|
|
|
|
INTEL_SKYLAKE,
|
|
|
|
INTEL_BROXTON,
|
|
|
|
INTEL_KABYLAKE,
|
|
|
|
INTEL_GEMINILAKE,
|
|
|
|
INTEL_COFFEELAKE,
|
2020-06-02 22:05:40 +08:00
|
|
|
INTEL_COMETLAKE,
|
2017-12-22 05:57:32 +08:00
|
|
|
/* gen10 */
|
|
|
|
INTEL_CANNONLAKE,
|
2018-01-12 02:00:04 +08:00
|
|
|
/* gen11 */
|
|
|
|
INTEL_ICELAKE,
|
2019-03-23 01:58:43 +08:00
|
|
|
INTEL_ELKHARTLAKE,
|
2020-10-14 03:29:48 +08:00
|
|
|
INTEL_JASPERLAKE,
|
2019-07-12 01:30:56 +08:00
|
|
|
/* gen12 */
|
|
|
|
INTEL_TIGERLAKE,
|
2020-05-05 06:52:06 +08:00
|
|
|
INTEL_ROCKETLAKE,
|
2020-07-14 02:23:17 +08:00
|
|
|
INTEL_DG1,
|
2017-12-22 05:57:32 +08:00
|
|
|
INTEL_MAX_PLATFORMS
|
|
|
|
};
|
|
|
|
|
2019-03-27 22:23:28 +08:00
|
|
|
/*
|
|
|
|
* Subplatform bits share the same namespace per parent platform. In other words
|
|
|
|
* it is fine for the same bit to be used on multiple parent platforms.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define INTEL_SUBPLATFORM_BITS (3)
|
|
|
|
|
|
|
|
/* HSW/BDW/SKL/KBL/CFL */
|
|
|
|
#define INTEL_SUBPLATFORM_ULT (0)
|
|
|
|
#define INTEL_SUBPLATFORM_ULX (1)
|
|
|
|
|
|
|
|
/* CNL/ICL */
|
|
|
|
#define INTEL_SUBPLATFORM_PORTF (0)
|
|
|
|
|
2019-03-15 06:38:36 +08:00
|
|
|
enum intel_ppgtt_type {
|
2018-09-27 04:12:22 +08:00
|
|
|
INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE,
|
|
|
|
INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING,
|
|
|
|
INTEL_PPGTT_FULL = I915_GEM_PPGTT_FULL,
|
|
|
|
};
|
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
#define DEV_INFO_FOR_EACH_FLAG(func) \
|
|
|
|
func(is_mobile); \
|
|
|
|
func(is_lp); \
|
2019-05-06 21:48:01 +08:00
|
|
|
func(require_force_probe); \
|
2019-10-25 03:51:19 +08:00
|
|
|
func(is_dgfx); \
|
2017-12-22 05:57:32 +08:00
|
|
|
/* Keep has_* in alphabetical order */ \
|
|
|
|
func(has_64bit_reloc); \
|
2019-01-03 19:21:04 +08:00
|
|
|
func(gpu_reset_clobbers_display); \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(has_reset_engine); \
|
|
|
|
func(has_fpga_dbg); \
|
2019-07-31 02:04:06 +08:00
|
|
|
func(has_global_mocs); \
|
2019-07-25 08:18:06 +08:00
|
|
|
func(has_gt_uc); \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(has_l3_dpf); \
|
|
|
|
func(has_llc); \
|
|
|
|
func(has_logical_ring_contexts); \
|
2018-03-03 00:14:59 +08:00
|
|
|
func(has_logical_ring_elsq); \
|
2020-07-14 02:23:16 +08:00
|
|
|
func(has_master_unit_irq); \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(has_pooled_eu); \
|
|
|
|
func(has_rc6); \
|
|
|
|
func(has_rc6p); \
|
2019-04-19 21:48:36 +08:00
|
|
|
func(has_rps); \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(has_runtime_pm); \
|
|
|
|
func(has_snoop); \
|
2018-07-20 18:19:10 +08:00
|
|
|
func(has_coherent_ggtt); \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(unfenced_needs_alignment); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(hws_needs_physical);
|
|
|
|
|
|
|
|
#define DEV_INFO_DISPLAY_FOR_EACH_FLAG(func) \
|
|
|
|
/* Keep in alphabetical order */ \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(cursor_needs_physical); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(has_csr); \
|
|
|
|
func(has_ddi); \
|
|
|
|
func(has_dp_mst); \
|
2019-09-20 19:59:21 +08:00
|
|
|
func(has_dsb); \
|
2019-10-26 08:13:23 +08:00
|
|
|
func(has_dsc); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(has_fbc); \
|
2019-02-05 06:25:38 +08:00
|
|
|
func(has_gmch); \
|
2019-10-26 08:13:20 +08:00
|
|
|
func(has_hdcp); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(has_hotplug); \
|
2020-07-17 06:05:50 +08:00
|
|
|
func(has_hti); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(has_ipc); \
|
2019-07-12 13:57:05 +08:00
|
|
|
func(has_modular_fia); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(has_overlay); \
|
|
|
|
func(has_psr); \
|
2020-06-04 05:15:28 +08:00
|
|
|
func(has_psr_hw_tracking); \
|
2017-12-22 05:57:32 +08:00
|
|
|
func(overlay_needs_physical); \
|
2018-12-01 07:20:48 +08:00
|
|
|
func(supports_tv);
|
2017-12-22 05:57:32 +08:00
|
|
|
|
|
|
|
struct intel_device_info {
|
|
|
|
u16 gen_mask;
|
|
|
|
|
|
|
|
u8 gen;
|
|
|
|
u8 gt; /* GT number, 0 if undefined */
|
2020-07-08 08:39:47 +08:00
|
|
|
intel_engine_mask_t platform_engine_mask; /* Engines supported by the HW */
|
2017-12-22 05:57:32 +08:00
|
|
|
|
|
|
|
enum intel_platform platform;
|
|
|
|
|
2020-04-18 03:51:07 +08:00
|
|
|
unsigned int dma_mask_size; /* available DMA address bits */
|
|
|
|
|
2019-03-15 06:38:36 +08:00
|
|
|
enum intel_ppgtt_type ppgtt_type;
|
|
|
|
unsigned int ppgtt_size; /* log2, e.g. 31/32/48 bits */
|
|
|
|
|
2018-02-22 19:16:58 +08:00
|
|
|
unsigned int page_sizes; /* page sizes supported by the HW */
|
2019-10-18 17:07:49 +08:00
|
|
|
|
|
|
|
u32 memory_regions; /* regions supported by the HW */
|
2018-02-22 19:16:58 +08:00
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
u32 display_mmio_offset;
|
|
|
|
|
2019-09-12 04:29:08 +08:00
|
|
|
u8 pipe_mask;
|
2020-03-19 01:02:35 +08:00
|
|
|
u8 cpu_transcoder_mask;
|
2017-12-22 05:57:32 +08:00
|
|
|
|
2020-06-06 10:57:34 +08:00
|
|
|
u8 abox_mask;
|
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
#define DEFINE_FLAG(name) u8 name:1
|
|
|
|
DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
|
|
|
|
#undef DEFINE_FLAG
|
2018-12-01 07:20:48 +08:00
|
|
|
|
|
|
|
struct {
|
|
|
|
#define DEFINE_FLAG(name) u8 name:1
|
|
|
|
DEV_INFO_DISPLAY_FOR_EACH_FLAG(DEFINE_FLAG);
|
|
|
|
#undef DEFINE_FLAG
|
|
|
|
} display;
|
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
u16 ddb_size; /* in blocks */
|
drm/i915: Manipulate DBuf slices properly
Start manipulating DBuf slices as a mask,
but not as a total number, as current approach
doesn't give us full control on all combinations
of slices, which we might need(like enabling S2
only can't enabled by setting enabled_slices=1).
Removed wrong code from intel_get_ddb_size as
it doesn't match to BSpec. For now still just
use DBuf slice until proper algorithm is implemented.
Other minor code refactoring to get prepared
for major DBuf assignment changes landed:
- As now enabled slices contain a mask
we still need some value which should
reflect how much DBuf slices are supported
by the platform, now device info contains
num_supported_dbuf_slices.
- Removed unneeded assertion as we are now
manipulating slices in a more proper way.
v2: Start using enabled_slices in dev_priv
v3: "enabled_slices" is now "enabled_dbuf_slices_mask",
as this now sits in dev_priv independently.
v4: - Fixed debug print formatting to hex(Matt Roper)
- Optimized dbuf slice updates to be used only
if slice union is different from current conf(Matt Roper)
- Fixed some functions to be static(Matt Roper)
- Created a parameterized version for DBUF_CTL to
simplify DBuf programming cycle(Matt Roper)
- Removed unrequred field from GEN10_FEATURES(Matt Roper)
v5: - Removed redundant programming dbuf slices helper(Ville Syrjälä)
- Started to use parameterized loop for hw readout to get slices
(Ville Syrjälä)
- Added back assertion checking amount of DBUF slices enabled
after DC states 5/6 transition, also added new assertion
as starting from ICL DMC seems to restore the last DBuf
power state set, rather than power up all dbuf slices
as assertion was previously expecting(Ville Syrjälä)
v6: - Now using enum for DBuf slices in this patch (Ville Syrjälä)
- Removed gen11_assert_dbuf_enabled and put gen9_assert_dbuf_enabled
back, as we really need to have a single unified assert here
however currently enabling always slice 1 is enforced by BSpec,
so we will have to OR enabled slices mask with 1 in order
to be consistent with BSpec, that way we can unify that
assertion and against the actual state from the driver, but
not some hardcoded value.(concluded with Ville)
- Remove parameterized DBUF_CTL version, to extract it to another
patch.(Ville Syrjälä)
v7:
- Removed unneeded hardcoded return value for older gens from
intel_enabled_dbuf_slices_mask - this now is handled in a
unified manner since device info anyway returns max dbuf slices
as 1 for older platforms(Matthew Roper)
- Now using INTEL_INFO(dev_priv)->num_supported_dbuf_slices instead
of intel_dbuf_max_slices function as it is trivial(Matthew Roper)
v8: - Fixed icl_dbuf_disable to disable all dbufs still(Ville Syrjälä)
v9: - Renamed _DBUF_CTL_S to DBUF_CTL_S(Ville Syrjälä)
- Now using power_domain mutex to protect from race condition, which
can occur because intel_dbuf_slices_update might be running in
parallel to gen9_dc_off_power_well_enable being called from
intel_dp_detect for instance, which causes assertion triggered by
race condition, as gen9_assert_dbuf_enabled might preempt this
when registers were already updated, while dev_priv was not.
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200202230630.8975-6-stanislav.lisovskiy@intel.com
2020-02-03 07:06:29 +08:00
|
|
|
u8 num_supported_dbuf_slices; /* number of DBuf slices */
|
2017-12-22 05:57:32 +08:00
|
|
|
|
|
|
|
/* Register offsets for the various display pipes and transcoders */
|
|
|
|
int pipe_offsets[I915_MAX_TRANSCODERS];
|
|
|
|
int trans_offsets[I915_MAX_TRANSCODERS];
|
|
|
|
int cursor_offsets[I915_MAX_PIPES];
|
|
|
|
|
2018-12-31 22:56:41 +08:00
|
|
|
struct color_luts {
|
2019-06-12 14:44:57 +08:00
|
|
|
u32 degamma_lut_size;
|
|
|
|
u32 gamma_lut_size;
|
2019-01-31 02:10:22 +08:00
|
|
|
u32 degamma_lut_tests;
|
|
|
|
u32 gamma_lut_tests;
|
2018-12-31 22:56:41 +08:00
|
|
|
} color;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct intel_runtime_info {
|
2019-03-27 22:23:28 +08:00
|
|
|
/*
|
|
|
|
* Platform mask is used for optimizing or-ed IS_PLATFORM calls into
|
|
|
|
* into single runtime conditionals, and also to provide groundwork
|
|
|
|
* for future per platform, or per SKU build optimizations.
|
|
|
|
*
|
|
|
|
* Array can be extended when necessary if the corresponding
|
|
|
|
* BUILD_BUG_ON is hit.
|
|
|
|
*/
|
|
|
|
u32 platform_mask[2];
|
|
|
|
|
2018-12-31 22:56:41 +08:00
|
|
|
u16 device_id;
|
|
|
|
|
|
|
|
u8 num_sprites[I915_MAX_PIPES];
|
|
|
|
u8 num_scalers[I915_MAX_PIPES];
|
|
|
|
|
2020-02-17 00:34:45 +08:00
|
|
|
u32 rawclk_freq;
|
2017-12-22 05:57:32 +08:00
|
|
|
};
|
|
|
|
|
2018-02-08 05:05:43 +08:00
|
|
|
struct intel_driver_caps {
|
|
|
|
unsigned int scheduler;
|
2018-07-06 18:14:41 +08:00
|
|
|
bool has_logical_contexts:1;
|
2018-02-08 05:05:43 +08:00
|
|
|
};
|
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
const char *intel_platform_name(enum intel_platform platform);
|
|
|
|
|
2019-03-27 22:23:28 +08:00
|
|
|
void intel_device_info_subplatform_init(struct drm_i915_private *dev_priv);
|
2018-12-31 22:56:43 +08:00
|
|
|
void intel_device_info_runtime_init(struct drm_i915_private *dev_priv);
|
2019-12-08 02:29:37 +08:00
|
|
|
|
|
|
|
void intel_device_info_print_static(const struct intel_device_info *info,
|
2017-12-22 05:57:34 +08:00
|
|
|
struct drm_printer *p);
|
2019-12-08 02:29:37 +08:00
|
|
|
void intel_device_info_print_runtime(const struct intel_runtime_info *info,
|
2018-03-06 20:28:54 +08:00
|
|
|
struct drm_printer *p);
|
2017-12-22 05:57:32 +08:00
|
|
|
|
2018-02-08 05:05:43 +08:00
|
|
|
void intel_driver_caps_print(const struct intel_driver_caps *caps,
|
|
|
|
struct drm_printer *p);
|
|
|
|
|
2017-12-22 05:57:32 +08:00
|
|
|
#endif
|