Sorry, have to send this from gmail right now. WOO, suspend works! I'll keep testing this week.
On Tue, Sep 26, 2017 at 4:07 PM, Robert Nagy <rob...@openbsd.org> wrote: > > Hi > > This is an updated diff for preliminary kabylake support for 6.2, > this needs extensive testing on all inteldrm variants. > > This diff is also in snapshots now so please, test, test test! > > Thank you > > Index: sys/dev/pci/drm/i915_pciids.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915_pciids.h,v > retrieving revision 1.3 > diff -u -p -u -r1.3 i915_pciids.h > --- sys/dev/pci/drm/i915_pciids.h 1 Jul 2017 16:14:10 -0000 1.3 > +++ sys/dev/pci/drm/i915_pciids.h 26 Sep 2017 14:57:52 -0000 > @@ -295,4 +295,40 @@ > INTEL_VGA_DEVICE(0x5A84, info), /* APL HD Graphics 505 */ \ > INTEL_VGA_DEVICE(0x5A85, info) /* APL HD Graphics 500 */ > > +#define INTEL_KBL_GT1_IDS(info) \ > + INTEL_VGA_DEVICE(0x5913, info), /* ULT GT1.5 */ \ > + INTEL_VGA_DEVICE(0x5915, info), /* ULX GT1.5 */ \ > + INTEL_VGA_DEVICE(0x5917, info), /* DT GT1.5 */ \ > + INTEL_VGA_DEVICE(0x5906, info), /* ULT GT1 */ \ > + INTEL_VGA_DEVICE(0x590E, info), /* ULX GT1 */ \ > + INTEL_VGA_DEVICE(0x5902, info), /* DT GT1 */ \ > + INTEL_VGA_DEVICE(0x590B, info), /* Halo GT1 */ \ > + INTEL_VGA_DEVICE(0x590A, info) /* SRV GT1 */ > + > +#define INTEL_KBL_GT2_IDS(info) \ > + INTEL_VGA_DEVICE(0x5916, info), /* ULT GT2 */ \ > + INTEL_VGA_DEVICE(0x5921, info), /* ULT GT2F */ \ > + INTEL_VGA_DEVICE(0x591E, info), /* ULX GT2 */ \ > + INTEL_VGA_DEVICE(0x5912, info), /* DT GT2 */ \ > + INTEL_VGA_DEVICE(0x591B, info), /* Halo GT2 */ \ > + INTEL_VGA_DEVICE(0x591A, info), /* SRV GT2 */ \ > + INTEL_VGA_DEVICE(0x591D, info) /* WKS GT2 */ > + > +#define INTEL_KBL_GT3_IDS(info) \ > + INTEL_VGA_DEVICE(0x5926, info), /* ULT GT3 */ \ > + INTEL_VGA_DEVICE(0x592B, info), /* Halo GT3 */ \ > + INTEL_VGA_DEVICE(0x592A, info) /* SRV GT3 */ > + > +#define INTEL_KBL_GT4_IDS(info) \ > + INTEL_VGA_DEVICE(0x5932, info), /* DT GT4 */ \ > + INTEL_VGA_DEVICE(0x593B, info), /* Halo GT4 */ \ > + INTEL_VGA_DEVICE(0x593A, info), /* SRV GT4 */ \ > + INTEL_VGA_DEVICE(0x593D, info) /* WKS GT4 */ > + > +#define INTEL_KBL_IDS(info) \ > + INTEL_KBL_GT1_IDS(info), \ > + INTEL_KBL_GT2_IDS(info), \ > + INTEL_KBL_GT3_IDS(info), \ > + INTEL_KBL_GT4_IDS(info) > + > #endif /* _I915_PCIIDS_H */ > Index: sys/dev/pci/drm/i915/i915_devlist.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_devlist.h,v > retrieving revision 1.6 > diff -u -p -u -r1.6 i915_devlist.h > --- sys/dev/pci/drm/i915/i915_devlist.h 6 Jul 2017 10:09:26 -0000 > 1.6 > +++ sys/dev/pci/drm/i915/i915_devlist.h 26 Sep 2017 14:57:52 -0000 > @@ -154,4 +154,26 @@ static const struct pci_matchid i915_dev > { 0x8086, 0x1a85 }, > { 0x8086, 0x5a84 }, > { 0x8086, 0x5a85 }, > + { 0x8086, 0x5913 }, > + { 0x8086, 0x5915 }, > + { 0x8086, 0x5917 }, > + { 0x8086, 0x5906 }, > + { 0x8086, 0x590e }, > + { 0x8086, 0x5902 }, > + { 0x8086, 0x590b }, > + { 0x8086, 0x590a }, > + { 0x8086, 0x5916 }, > + { 0x8086, 0x5921 }, > + { 0x8086, 0x591e }, > + { 0x8086, 0x5912 }, > + { 0x8086, 0x591b }, > + { 0x8086, 0x591a }, > + { 0x8086, 0x591d }, > + { 0x8086, 0x5926 }, > + { 0x8086, 0x592b }, > + { 0x8086, 0x592a }, > + { 0x8086, 0x5932 }, > + { 0x8086, 0x593b }, > + { 0x8086, 0x593a }, > + { 0x8086, 0x593d }, > }; > Index: sys/dev/pci/drm/i915/i915_dma.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_dma.c,v > retrieving revision 1.25 > diff -u -p -u -r1.25 i915_dma.c > --- sys/dev/pci/drm/i915/i915_dma.c 1 Jul 2017 16:14:10 -0000 > 1.25 > +++ sys/dev/pci/drm/i915/i915_dma.c 26 Sep 2017 14:57:52 -0000 > @@ -712,7 +712,8 @@ static void gen9_sseu_info_init(struct d > * supports EU power gating on devices with more than one EU > * pair per subslice. > */ > - info->has_slice_pg = (IS_SKYLAKE(dev) && (info->slice_total > 1)); > + info->has_slice_pg = ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) && > + (info->slice_total > 1)); > info->has_subslice_pg = (IS_BROXTON(dev) && (info->subslice_total > > 1)); > info->has_eu_pg = (info->eu_per_subslice > 2); > } > @@ -858,6 +859,37 @@ static void intel_device_info_runtime_in > DRM_INFO("Display fused off, disabling\n"); > info->num_pipes = 0; > } > + } else if (info->num_pipes > 0 && INTEL_INFO(dev)->gen == 9) { > + u32 dfsm = I915_READ(SKL_DFSM); > + u8 disabled_mask = 0; > + bool invalid; > + int num_bits; > + > + if (dfsm & SKL_DFSM_PIPE_A_DISABLE) > + disabled_mask |= BIT(PIPE_A); > + if (dfsm & SKL_DFSM_PIPE_B_DISABLE) > + disabled_mask |= BIT(PIPE_B); > + if (dfsm & SKL_DFSM_PIPE_C_DISABLE) > + disabled_mask |= BIT(PIPE_C); > + > + num_bits = hweight8(disabled_mask); > + > + switch (disabled_mask) { > + case BIT(PIPE_A): > + case BIT(PIPE_B): > + case BIT(PIPE_A) | BIT(PIPE_B): > + case BIT(PIPE_A) | BIT(PIPE_C): > + invalid = true; > + break; > + default: > + invalid = false; > + } > + > + if (num_bits > info->num_pipes || invalid) > + DRM_ERROR("invalid pipe fuse configuration: > 0x%x\n", > + disabled_mask); > + else > + info->num_pipes -= num_bits; > } > > /* Initialize slice/subslice/EU info */ > Index: sys/dev/pci/drm/i915/i915_drv.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v > retrieving revision 1.107 > diff -u -p -u -r1.107 i915_drv.c > --- sys/dev/pci/drm/i915/i915_drv.c 19 Aug 2017 20:12:22 -0000 > 1.107 > +++ sys/dev/pci/drm/i915/i915_drv.c 26 Sep 2017 14:57:53 -0000 > @@ -388,6 +388,7 @@ static const struct intel_device_info in > > static const struct intel_device_info intel_broxton_info = { > .is_preliminary = 1, > + .is_broxton = 1, > .gen = 9, > .need_gfx_hws = 1, .has_hotplug = 1, > .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, > @@ -399,6 +400,34 @@ static const struct intel_device_info in > IVB_CURSOR_OFFSETS, > }; > > +static const struct intel_device_info intel_kabylake_info = { > + .is_kabylake = 1, > + .gen = 9, > + .num_pipes = 3, > + .need_gfx_hws = 1, .has_hotplug = 1, > + .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, > + .has_llc = 1, > + .has_ddi = 1, > + .has_fpga_dbg = 1, > + .has_fbc = 1, > + GEN_DEFAULT_PIPEOFFSETS, > + IVB_CURSOR_OFFSETS, > +}; > + > +static const struct intel_device_info intel_kabylake_gt3_info = { > + .is_kabylake = 1, > + .gen = 9, > + .num_pipes = 3, > + .need_gfx_hws = 1, .has_hotplug = 1, > + .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | > BSD2_RING, > + .has_llc = 1, > + .has_ddi = 1, > + .has_fpga_dbg = 1, > + .has_fbc = 1, > + GEN_DEFAULT_PIPEOFFSETS, > + IVB_CURSOR_OFFSETS, > +}; > + > /* > * Make sure any device matches here are from most specific to most > * general. For example, since the Quanta match is based on the subsystem > @@ -439,7 +468,11 @@ static const struct intel_device_info in > INTEL_SKL_GT1_IDS(&intel_skylake_info), \ > INTEL_SKL_GT2_IDS(&intel_skylake_info), \ > INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info), \ > - INTEL_BXT_IDS(&intel_broxton_info) > + INTEL_BXT_IDS(&intel_broxton_info), \ > + INTEL_KBL_GT1_IDS(&intel_kabylake_info), \ > + INTEL_KBL_GT2_IDS(&intel_kabylake_info), \ > + INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info), \ > + INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info) > > static const struct drm_pcidev pciidlist[] = { /* aka */ > INTEL_PCI_IDS, > @@ -469,7 +502,7 @@ static enum intel_pch intel_virt_detect_ > } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { > ret = PCH_LPT; > DRM_DEBUG_KMS("Assuming LynxPoint PCH\n"); > - } else if (IS_SKYLAKE(dev)) { > + } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > ret = PCH_SPT; > DRM_DEBUG_KMS("Assuming SunrisePoint PCH\n"); > } > @@ -543,11 +576,17 @@ void intel_detect_pch(struct drm_device > } else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) { > dev_priv->pch_type = PCH_SPT; > DRM_DEBUG_KMS("Found SunrisePoint PCH\n"); > - WARN_ON(!IS_SKYLAKE(dev)); > + WARN_ON(!IS_SKYLAKE(dev) && > + !IS_KABYLAKE(dev)); > } else if (id == INTEL_PCH_SPT_LP_DEVICE_ID_TYPE) > { > dev_priv->pch_type = PCH_SPT; > DRM_DEBUG_KMS("Found SunrisePoint LP > PCH\n"); > - WARN_ON(!IS_SKYLAKE(dev)); > + WARN_ON(!IS_SKYLAKE(dev) && > + !IS_KABYLAKE(dev)); > + } else if (id == INTEL_PCH_KBP_DEVICE_ID_TYPE) { > + dev_priv->pch_type = PCH_KBP; > + DRM_DEBUG_KMS("Found KabyPoint PCH\n"); > + WARN_ON(!IS_KABYLAKE(dev)); > #ifdef notyet > } else if ((id == INTEL_PCH_P2X_DEVICE_ID_TYPE) || > ((id == INTEL_PCH_QEMU_DEVICE_ID_TYPE) > && > @@ -866,7 +905,7 @@ static int i915_drm_resume_early(struct > > if (IS_BROXTON(dev)) > ret = bxt_resume_prepare(dev_priv); > - else if (IS_SKYLAKE(dev_priv)) > + else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) > ret = skl_resume_prepare(dev_priv); > else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) > hsw_disable_pc8(dev_priv); > @@ -1605,7 +1644,7 @@ static int intel_runtime_resume(struct d > > if (IS_BROXTON(dev)) > ret = bxt_resume_prepare(dev_priv); > - else if (IS_SKYLAKE(dev)) > + else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > ret = skl_resume_prepare(dev_priv); > else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) > hsw_disable_pc8(dev_priv); > @@ -1650,7 +1689,7 @@ static int intel_suspend_complete(struct > > if (IS_BROXTON(dev_priv)) > ret = bxt_suspend_complete(dev_priv); > - else if (IS_SKYLAKE(dev_priv)) > + else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) > ret = skl_suspend_complete(dev_priv); > else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) > ret = hsw_suspend_complete(dev_priv); > Index: sys/dev/pci/drm/i915/i915_drv.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.h,v > retrieving revision 1.77 > diff -u -p -u -r1.77 i915_drv.h > --- sys/dev/pci/drm/i915/i915_drv.h 19 Jul 2017 22:05:58 -0000 > 1.77 > +++ sys/dev/pci/drm/i915/i915_drv.h 26 Sep 2017 14:57:53 -0000 > @@ -849,6 +849,8 @@ struct intel_csr { > func(is_valleyview) sep \ > func(is_haswell) sep \ > func(is_skylake) sep \ > + func(is_broxton) sep \ > + func(is_kabylake) sep \ > func(is_preliminary) sep \ > func(has_fbc) sep \ > func(has_pipe_cxsr) sep \ > @@ -1076,6 +1078,7 @@ enum intel_pch { > PCH_CPT, /* Cougarpoint PCH */ > PCH_LPT, /* Lynxpoint PCH */ > PCH_SPT, /* Sunrisepoint PCH */ > + PCH_KBP, /* Kabypoint PCH */ > PCH_NOP, > }; > > @@ -2565,6 +2568,16 @@ struct drm_i915_cmd_table { > #define INTEL_DEVID(p) (INTEL_INFO(p)->device_id) > #define INTEL_REVID(p) (__I915__(p)->dev->pdev->revision) > > +#define REVID_FOREVER (0xff) > + > +/* > + * Return true if revision is in range [since,until] inclusive. > + * > + * Use 0 for open-ended since, and REVID_FOREVER for open-ended until. > + */ > +#define IS_REVID(p, since, until) \ > + (INTEL_REVID(p) >= (since) && INTEL_REVID(p) <= (until)) > + > #define IS_I830(dev) (INTEL_DEVID(dev) == 0x3577) > #define IS_845G(dev) (INTEL_DEVID(dev) == 0x2562) > #define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) > @@ -2591,7 +2604,8 @@ struct drm_i915_cmd_table { > #define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell) > #define IS_BROADWELL(dev) (!INTEL_INFO(dev)->is_valleyview && > IS_GEN8(dev)) > #define IS_SKYLAKE(dev) (INTEL_INFO(dev)->is_skylake) > -#define IS_BROXTON(dev) (!INTEL_INFO(dev)->is_skylake && > IS_GEN9(dev)) > +#define IS_BROXTON(dev) (INTEL_INFO(dev)->is_broxton) > +#define IS_KABYLAKE(dev) (INTEL_INFO(dev)->is_kabylake) > #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) > #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ > (INTEL_DEVID(dev) & 0xFF00) == 0x0C00) > @@ -2619,6 +2633,14 @@ struct drm_i915_cmd_table { > #define IS_SKL_ULX(dev) (INTEL_DEVID(dev) == 0x190E || \ > INTEL_DEVID(dev) == 0x1915 || \ > INTEL_DEVID(dev) == 0x191E) > +#define IS_KBL_ULT(dev) (INTEL_DEVID(dev) == 0x5906 || \ > + INTEL_DEVID(dev) == 0x5913 || \ > + INTEL_DEVID(dev) == 0x5916 || \ > + INTEL_DEVID(dev) == 0x5921 || \ > + INTEL_DEVID(dev) == 0x5926) > +#define IS_KBL_ULX(dev) (INTEL_DEVID(dev) == 0x590E || \ > + INTEL_DEVID(dev) == 0x5915 || \ > + INTEL_DEVID(dev) == 0x591E) > #define IS_SKL_GT3(dev) (IS_SKYLAKE(dev) && \ > (INTEL_DEVID(dev) & 0x00F0) == 0x0020) > #define IS_SKL_GT4(dev) (IS_SKYLAKE(dev) && \ > @@ -2633,10 +2655,23 @@ struct drm_i915_cmd_table { > #define SKL_REVID_E0 (0x4) > #define SKL_REVID_F0 (0x5) > > +#define IS_SKL_REVID(p, since, until) (IS_SKYLAKE(p) && IS_REVID(p, > since, until)) > + > #define BXT_REVID_A0 (0x0) > +#define BXT_REVID_A1 (0x1) > #define BXT_REVID_B0 (0x3) > #define BXT_REVID_C0 (0x9) > > +#define IS_BXT_REVID(p, since, until) (IS_BROXTON(p) && IS_REVID(p, > since, until)) > + > +#define KBL_REVID_A0 (0x0) > +#define KBL_REVID_B0 (0x1) > +#define KBL_REVID_C0 (0x2) > +#define KBL_REVID_D0 (0x3) > +#define KBL_REVID_E0 (0x4) > + > +#define IS_KBL_REVID(p, since, until) (IS_KABYLAKE(p) && IS_REVID(p, > since, until)) > + > /* > * The genX designation typically refers to the render engine, so render > * capability related checks should use IS_GEN, while display and other > checks > @@ -2707,17 +2742,17 @@ struct drm_i915_cmd_table { > #define HAS_FPGA_DBG_UNCLAIMED(dev) (INTEL_INFO(dev)->has_fpga_dbg) > #define HAS_PSR(dev) (IS_HASWELL(dev) || IS_BROADWELL(dev) || \ > IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev) > || \ > - IS_SKYLAKE(dev)) > + IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > #define HAS_RUNTIME_PM(dev) (IS_GEN6(dev) || IS_HASWELL(dev) || \ > IS_BROADWELL(dev) || IS_VALLEYVIEW(dev) > || \ > - IS_SKYLAKE(dev)) > + IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > #define HAS_RC6(dev) (INTEL_INFO(dev)->gen >= 6) > #define HAS_RC6p(dev) (INTEL_INFO(dev)->gen == 6 || > IS_IVYBRIDGE(dev)) > > #define HAS_CSR(dev) (IS_GEN9(dev)) > > -#define HAS_GUC_UCODE(dev) (IS_GEN9(dev)) > -#define HAS_GUC_SCHED(dev) (IS_GEN9(dev)) > +#define HAS_GUC_UCODE(dev) (IS_GEN9(dev) && !IS_KABYLAKE(dev)) > +#define HAS_GUC_SCHED(dev) (IS_GEN9(dev) && !IS_KABYLAKE(dev)) > > #define HAS_RESOURCE_STREAMER(dev) (IS_HASWELL(dev) || \ > INTEL_INFO(dev)->gen >= 8) > @@ -2733,10 +2768,12 @@ struct drm_i915_cmd_table { > #define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE 0x9c00 > #define INTEL_PCH_SPT_DEVICE_ID_TYPE 0xA100 > #define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE 0x9D00 > +#define INTEL_PCH_KBP_DEVICE_ID_TYPE 0xA200 > #define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100 > #define INTEL_PCH_QEMU_DEVICE_ID_TYPE 0x2900 /* qemu q35 has > 2918 */ > > #define INTEL_PCH_TYPE(dev) (__I915__(dev)->pch_type) > +#define HAS_PCH_KBP(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_KBP) > #define HAS_PCH_SPT(dev) (INTEL_PCH_TYPE(dev) == PCH_SPT) > #define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT) > #define HAS_PCH_LPT_LP(dev) (__I915__(dev)->pch_id == > INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) > Index: sys/dev/pci/drm/i915/i915_gem.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_gem.c,v > retrieving revision 1.109 > diff -u -p -u -r1.109 i915_gem.c > --- sys/dev/pci/drm/i915/i915_gem.c 27 Jul 2017 15:57:00 -0000 > 1.109 > +++ sys/dev/pci/drm/i915/i915_gem.c 26 Sep 2017 14:57:53 -0000 > @@ -4363,7 +4363,7 @@ int i915_gem_set_caching_ioctl(struct dr > * cacheline, whereas normally such cachelines would get > * invalidated. > */ > - if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) > return -ENODEV; > > level = I915_CACHE_LLC; > Index: sys/dev/pci/drm/i915/i915_gem_stolen.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_gem_stolen.c,v > retrieving revision 1.2 > diff -u -p -u -r1.2 i915_gem_stolen.c > --- sys/dev/pci/drm/i915/i915_gem_stolen.c 1 Jul 2017 16:14:10 > -0000 1.2 > +++ sys/dev/pci/drm/i915/i915_gem_stolen.c 26 Sep 2017 14:57:53 -0000 > @@ -56,7 +56,8 @@ int i915_gem_stolen_insert_node_in_range > > /* See the comment at the drm_mm_init() call for more about this > check. > * WaSkipStolenMemoryFirstPage:bdw,chv (incomplete) */ > - if (INTEL_INFO(dev_priv)->gen == 8 && start < 4096) > + if (start < 4096 && (IS_GEN8(dev_priv) || > + IS_KBL_REVID(dev_priv, 0, KBL_REVID_A0))) > start = 4096; > > mutex_lock(&dev_priv->mm.stolen_lock); > @@ -448,7 +449,8 @@ int i915_gem_init_stolen(struct drm_devi > &reserved_size); > break; > default: > - if (IS_BROADWELL(dev_priv) || IS_SKYLAKE(dev_priv)) > + if (IS_BROADWELL(dev_priv) || > + IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev)) > bdw_get_stolen_reserved(dev_priv, &reserved_base, > &reserved_size); > else > Index: sys/dev/pci/drm/i915/i915_guc_submission.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_guc_submission.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 i915_guc_submission.c > --- sys/dev/pci/drm/i915/i915_guc_submission.c 1 Jul 2017 16:14:10 > -0000 1.1 > +++ sys/dev/pci/drm/i915/i915_guc_submission.c 26 Sep 2017 14:57:53 -0000 > @@ -165,9 +165,9 @@ static int host2guc_sample_forcewake(str > data[0] = HOST2GUC_ACTION_SAMPLE_FORCEWAKE; > /* WaRsDisableCoarsePowerGating:skl,bxt */ > if (!intel_enable_rc6(dev_priv->dev) || > - (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) || > - (IS_SKL_GT3(dev) && (INTEL_REVID(dev) <= SKL_REVID_E0)) || > - (IS_SKL_GT4(dev) && (INTEL_REVID(dev) <= SKL_REVID_E0))) > + IS_BXT_REVID(dev, 0, BXT_REVID_A1) || > + (IS_SKL_GT3(dev) && IS_SKL_REVID(dev, 0, SKL_REVID_E0)) || > + (IS_SKL_GT4(dev) && IS_SKL_REVID(dev, 0, SKL_REVID_E0))) > data[1] = 0; > else > /* bit 0 and 1 are for Render and Media domain separately > */ > Index: sys/dev/pci/drm/i915/i915_irq.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_irq.c,v > retrieving revision 1.31 > diff -u -p -u -r1.31 i915_irq.c > --- sys/dev/pci/drm/i915/i915_irq.c 1 Jul 2017 16:14:10 -0000 > 1.31 > +++ sys/dev/pci/drm/i915/i915_irq.c 26 Sep 2017 14:57:54 -0000 > @@ -2349,7 +2349,7 @@ static irqreturn_t gen8_irq_handler(int > I915_WRITE(SDEIIR, pch_iir); > ret = IRQ_HANDLED; > > - if (HAS_PCH_SPT(dev_priv)) > + if (HAS_PCH_SPT(dev_priv) || HAS_PCH_KBP(dev_priv)) > spt_irq_handler(dev, pch_iir); > else > cpt_irq_handler(dev, pch_iir); > @@ -4457,7 +4457,7 @@ void intel_irq_init(struct drm_i915_priv > dev->driver->disable_vblank = gen8_disable_vblank; > if (IS_BROXTON(dev)) > dev_priv->display.hpd_irq_setup = > bxt_hpd_irq_setup; > - else if (HAS_PCH_SPT(dev)) > + else if (HAS_PCH_SPT(dev) || HAS_PCH_KBP(dev)) > dev_priv->display.hpd_irq_setup = > spt_hpd_irq_setup; > else > dev_priv->display.hpd_irq_setup = > ilk_hpd_irq_setup; > Index: sys/dev/pci/drm/i915/i915_reg.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_reg.h,v > retrieving revision 1.13 > diff -u -p -u -r1.13 i915_reg.h > --- sys/dev/pci/drm/i915/i915_reg.h 1 Jul 2017 16:14:10 -0000 > 1.13 > +++ sys/dev/pci/drm/i915/i915_reg.h 26 Sep 2017 14:57:54 -0000 > @@ -1585,6 +1585,12 @@ enum skl_disp_power_wells { > > #define GEN7_TLB_RD_ADDR 0x4700 > > +#define GAMT_CHKN_BIT_REG 0x4ab8 > +#define GAMT_CHKN_DISABLE_DYNAMIC_CREDIT_SHARING (1<<28) > + > +#define GEN9_GAMT_ECO_REG_RW_IA 0x4ab0 > +#define GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS (1<<18) > + > #if 0 > #define PRB0_TAIL 0x02030 > #define PRB0_HEAD 0x02034 > @@ -1707,6 +1713,10 @@ enum skl_disp_power_wells { > #define GEN9_IZ_HASHING_MASK(slice) (0x3 << ((slice) * > 2)) > #define GEN9_IZ_HASHING(slice, val) ((val) << ((slice) > * 2)) > > +/* chicken reg for WaConextSwitchWithConcurrentTLBInvalidate */ > +#define GEN9_CSFE_CHICKEN1_RCS 0x20D4 > +#define GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE (1 << 2) > + > #define GFX_MODE 0x02520 > #define GFX_MODE_GEN7 0x0229c > #define RING_MODE_GEN7(ring) ((ring)->mmio_base+0x29c) > @@ -5897,6 +5907,7 @@ enum skl_disp_power_wells { > #define CHICKEN_PIPESL_1(pipe) _PIPE(pipe, _CHICKEN_PIPESL_1_A, > _CHICKEN_PIPESL_1_B) > > #define DISP_ARB_CTL 0x45000 > +#define DISP_FBC_MEMORY_WAKE (1<<31) > #define DISP_TILE_SURFACE_SWIZZLING (1<<13) > #define DISP_FBC_WM_DIS (1<<15) > #define DISP_ARB_CTL2 0x45004 > @@ -5916,6 +5927,9 @@ enum skl_disp_power_wells { > #define SKL_DFSM_CDCLK_LIMIT_540 (1 << 23) > #define SKL_DFSM_CDCLK_LIMIT_450 (2 << 23) > #define SKL_DFSM_CDCLK_LIMIT_337_5 (3 << 23) > +#define SKL_DFSM_PIPE_A_DISABLE (1 << 30) > +#define SKL_DFSM_PIPE_B_DISABLE (1 << 21) > +#define SKL_DFSM_PIPE_C_DISABLE (1 << 28) > > #define FF_SLICE_CS_CHICKEN2 0x20e4 > #define GEN9_TSG_BARRIER_ACK_DISABLE (1<<8) > @@ -5925,6 +5939,7 @@ enum skl_disp_power_wells { > # define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) > # define GEN9_RHWO_OPTIMIZATION_DISABLE (1<<14) > #define COMMON_SLICE_CHICKEN2 0x7014 > +# define GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION (1<<8) > # define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1<<0) > > #define HIZ_CHICKEN 0x7018 > @@ -6761,6 +6776,7 @@ enum skl_disp_power_wells { > > #define GEN7_UCGCTL4 0x940c > #define GEN7_L3BANK2X_CLOCK_GATE_DISABLE (1<<25) > +#define GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE (1<<14) > > #define GEN6_RCGCTL1 0x9410 > #define GEN6_RCGCTL2 0x9414 > Index: sys/dev/pci/drm/i915/intel_csr.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_csr.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 intel_csr.c > --- sys/dev/pci/drm/i915/intel_csr.c 1 Jul 2017 16:14:10 -0000 > 1.1 > +++ sys/dev/pci/drm/i915/intel_csr.c 26 Sep 2017 14:57:54 -0000 > @@ -43,9 +43,11 @@ > * be moved to FW_FAILED. > */ > > +#define I915_CSR_KBL "i915/kbl_dmc_ver1.bin" > #define I915_CSR_SKL "i915/skl_dmc_ver1.bin" > #define I915_CSR_BXT "i915/bxt_dmc_ver1.bin" > > +MODULE_FIRMWARE(I915_CSR_KBL); > MODULE_FIRMWARE(I915_CSR_SKL); > MODULE_FIRMWARE(I915_CSR_BXT); > > @@ -180,6 +182,14 @@ struct stepping_info { > char substepping; > }; > > +/* > + * Kabylake derivated from Skylake H0, so SKL H0 > + * is the right firmware for KBL A0 (revid 0). > + */ > +static const struct stepping_info kbl_stepping_info[] = { > + {'H', '0'}, {'I', '0'} > +}; > + > static const struct stepping_info skl_stepping_info[] = { > {'A', '0'}, {'B', '0'}, {'C', '0'}, > {'D', '0'}, {'E', '0'}, {'F', '0'}, > @@ -194,7 +204,10 @@ static struct stepping_info bxt_stepping > > static char intel_get_stepping(struct drm_device *dev) > { > - if (IS_SKYLAKE(dev) && (dev->pdev->revision < > + if (IS_KABYLAKE(dev) && (dev->pdev->revision < > + ARRAY_SIZE(kbl_stepping_info))) > + return kbl_stepping_info[dev->pdev->revision].stepping; > + else if (IS_SKYLAKE(dev) && (dev->pdev->revision < > ARRAY_SIZE(skl_stepping_info))) > return skl_stepping_info[dev->pdev->revision].stepping; > else if (IS_BROXTON(dev) && (dev->pdev->revision < > @@ -206,7 +219,10 @@ static char intel_get_stepping(struct dr > > static char intel_get_substepping(struct drm_device *dev) > { > - if (IS_SKYLAKE(dev) && (dev->pdev->revision < > + if (IS_KABYLAKE(dev) && (dev->pdev->revision < > + ARRAY_SIZE(kbl_stepping_info))) > + return kbl_stepping_info[dev->pdev->revision].substepping; > + else if (IS_SKYLAKE(dev) && (dev->pdev->revision < > ARRAY_SIZE(skl_stepping_info))) > return skl_stepping_info[dev->pdev->revision].substepping; > else if (IS_BROXTON(dev) && (dev->pdev->revision < > @@ -435,7 +451,9 @@ void intel_csr_ucode_init(struct drm_dev > if (!HAS_CSR(dev)) > return; > > - if (IS_SKYLAKE(dev)) > + if (IS_KABYLAKE(dev)) > + csr->fw_path = I915_CSR_KBL; > + else if (IS_SKYLAKE(dev)) > csr->fw_path = I915_CSR_SKL; > else if (IS_BROXTON(dev_priv)) > csr->fw_path = I915_CSR_BXT; > Index: sys/dev/pci/drm/i915/intel_ddi.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_ddi.c,v > retrieving revision 1.16 > diff -u -p -u -r1.16 intel_ddi.c > --- sys/dev/pci/drm/i915/intel_ddi.c 1 Jul 2017 16:14:10 -0000 > 1.16 > +++ sys/dev/pci/drm/i915/intel_ddi.c 26 Sep 2017 14:57:55 -0000 > @@ -353,10 +353,10 @@ static const struct ddi_buf_trans *skl_g > { > const struct ddi_buf_trans *ddi_translations; > > - if (IS_SKL_ULX(dev)) { > + if (IS_SKL_ULX(dev) || IS_KBL_ULX(dev)) { > ddi_translations = skl_y_ddi_translations_dp; > *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp); > - } else if (IS_SKL_ULT(dev)) { > + } else if (IS_SKL_ULT(dev) || IS_KBL_ULT(dev)) { > ddi_translations = skl_u_ddi_translations_dp; > *n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp); > } else { > @@ -373,7 +373,7 @@ static const struct ddi_buf_trans *skl_g > struct drm_i915_private *dev_priv = dev->dev_private; > const struct ddi_buf_trans *ddi_translations; > > - if (IS_SKL_ULX(dev)) { > + if (IS_SKL_ULX(dev) || IS_KBL_ULX(dev)) { > if (dev_priv->edp_low_vswing) { > ddi_translations = skl_y_ddi_translations_edp; > *n_entries = ARRAY_SIZE(skl_y_ddi_ > translations_edp); > @@ -381,7 +381,7 @@ static const struct ddi_buf_trans *skl_g > ddi_translations = skl_y_ddi_translations_dp; > *n_entries = ARRAY_SIZE(skl_y_ddi_ > translations_dp); > } > - } else if (IS_SKL_ULT(dev)) { > + } else if (IS_SKL_ULT(dev) || IS_KBL_ULT(dev)) { > if (dev_priv->edp_low_vswing) { > ddi_translations = skl_u_ddi_translations_edp; > *n_entries = ARRAY_SIZE(skl_u_ddi_ > translations_edp); > @@ -408,7 +408,7 @@ skl_get_buf_trans_hdmi(struct drm_device > { > const struct ddi_buf_trans *ddi_translations; > > - if (IS_SKL_ULX(dev)) { > + if (IS_SKL_ULX(dev) || IS_KBL_ULX(dev)) { > ddi_translations = skl_y_ddi_translations_hdmi; > *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi); > } else { > @@ -448,7 +448,7 @@ static void intel_prepare_ddi_buffers(st > bxt_ddi_vswing_sequence(dev, hdmi_level, port, > INTEL_OUTPUT_HDMI); > return; > - } else if (IS_SKYLAKE(dev)) { > + } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > ddi_translations_fdi = NULL; > ddi_translations_dp = > skl_get_buf_trans_dp(dev, &n_dp_entries); > @@ -1192,7 +1192,7 @@ void intel_ddi_clock_get(struct intel_en > > if (INTEL_INFO(dev)->gen <= 8) > hsw_ddi_clock_get(encoder, pipe_config); > - else if (IS_SKYLAKE(dev)) > + else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > skl_ddi_clock_get(encoder, pipe_config); > else if (IS_BROXTON(dev)) > bxt_ddi_clock_get(encoder, pipe_config); > @@ -1789,7 +1789,7 @@ bool intel_ddi_pll_select(struct intel_c > struct intel_encoder *intel_encoder = > intel_ddi_get_crtc_new_encoder(crtc_state); > > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > return skl_ddi_pll_select(intel_crtc, crtc_state, > intel_encoder); > else if (IS_BROXTON(dev)) > @@ -2272,7 +2272,7 @@ uint32_t ddi_signal_levels(struct intel_ > > level = translate_signal_level(signal_levels); > > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > skl_ddi_set_iboost(dev, level, port, encoder->type); > else if (IS_BROXTON(dev)) > bxt_ddi_vswing_sequence(dev, level, port, encoder->type); > @@ -2295,7 +2295,7 @@ static void intel_ddi_pre_enable(struct > intel_edp_panel_on(intel_dp); > } > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > uint32_t dpll = crtc->config->ddi_pll_sel; > uint32_t val; > > @@ -2390,7 +2390,7 @@ static void intel_ddi_post_disable(struc > intel_edp_panel_off(intel_dp); > } > > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) | > DPLL_CTRL2_DDI_CLK_OFF(port))); > else if (INTEL_INFO(dev)->gen < 9) > @@ -3001,14 +3001,14 @@ void intel_ddi_pll_init(struct drm_devic > struct drm_i915_private *dev_priv = dev->dev_private; > uint32_t val = I915_READ(LCPLL_CTL); > > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > skl_shared_dplls_init(dev_priv); > else if (IS_BROXTON(dev)) > bxt_shared_dplls_init(dev_priv); > else > hsw_shared_dplls_init(dev_priv); > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > int cdclk_freq; > > cdclk_freq = dev_priv->display.get_display_ > clock_speed(dev); > @@ -3307,8 +3307,7 @@ void intel_ddi_init(struct drm_device *d > * On BXT A0/A1, sw needs to activate DDIA HPD logic and > * interrupts to check the external panel connection. > */ > - if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < > BXT_REVID_B0) > - && port == PORT_B) > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1) && port == PORT_B) > dev_priv->hotplug.irq_port[PORT_A] = > intel_dig_port; > else > dev_priv->hotplug.irq_port[port] = intel_dig_port; > Index: sys/dev/pci/drm/i915/intel_display.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_display.c,v > retrieving revision 1.61 > diff -u -p -u -r1.61 intel_display.c > --- sys/dev/pci/drm/i915/intel_display.c 19 Jul 2017 22:05:58 > -0000 1.61 > +++ sys/dev/pci/drm/i915/intel_display.c 26 Sep 2017 14:57:57 -0000 > @@ -5406,7 +5406,7 @@ static void intel_update_max_cdclk(struc > { > struct drm_i915_private *dev_priv = dev->dev_private; > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > u32 limit = I915_READ(SKL_DFSM) & > SKL_DFSM_CDCLK_LIMIT_MASK; > > if (limit == SKL_DFSM_CDCLK_LIMIT_675) > @@ -9846,7 +9846,7 @@ static void haswell_get_ddi_port_state(s > > port = (tmp & TRANS_DDI_PORT_MASK) >> TRANS_DDI_PORT_SHIFT; > > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > skylake_get_ddi_pll(dev_priv, port, pipe_config); > else if (IS_BROXTON(dev)) > bxt_get_ddi_pll(dev_priv, port, pipe_config); > @@ -12101,7 +12101,7 @@ static void intel_dump_pipe_config(struc > pipe_config->dpll_hw_state.pll9, > pipe_config->dpll_hw_state.pll10, > pipe_config->dpll_hw_state.pcsdw12); > - } else if (IS_SKYLAKE(dev)) { > + } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > DRM_DEBUG_KMS("ddi_pll_sel: %u; dpll_hw_state: " > "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n", > pipe_config->ddi_pll_sel, > @@ -14127,7 +14127,7 @@ static void intel_setup_outputs(struct d > */ > found = I915_READ(DDI_BUF_CTL(PORT_A)) & > DDI_INIT_DISPLAY_DETECTED; > /* WaIgnoreDDIAStrap: skl */ > - if (found || IS_SKYLAKE(dev)) > + if (found || IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > intel_ddi_init(dev, PORT_A); > > /* DDI B, C and D detection is indicated by the SFUSE_STRAP > @@ -14143,7 +14143,7 @@ static void intel_setup_outputs(struct d > /* > * On SKL we don't have a way to detect DDI-E so we rely > on VBT. > */ > - if (IS_SKYLAKE(dev) && > + if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) && > (dev_priv->vbt.ddi_port_info[PORT_E].supports_dp || > dev_priv->vbt.ddi_port_info[PORT_E].supports_dvi || > dev_priv->vbt.ddi_port_info[PORT_E].supports_hdmi)) > @@ -14601,7 +14601,7 @@ static void intel_init_display(struct dr > } > > /* Returns the core display clock speed */ > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > dev_priv->display.get_display_clock_speed = > skylake_get_display_clock_speed; > else if (IS_BROXTON(dev)) > Index: sys/dev/pci/drm/i915/intel_dp.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_dp.c,v > retrieving revision 1.28 > diff -u -p -u -r1.28 intel_dp.c > --- sys/dev/pci/drm/i915/intel_dp.c 1 Jul 2017 16:14:10 -0000 > 1.28 > +++ sys/dev/pci/drm/i915/intel_dp.c 26 Sep 2017 14:57:58 -0000 > @@ -1024,7 +1024,7 @@ intel_dp_aux_init(struct intel_dp *intel > /* On SKL we don't have Aux for port E so we rely on VBT to set > * a proper alternate aux channel. > */ > - if (IS_SKYLAKE(dev) && port == PORT_E) { > + if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) && port == PORT_E) { > switch (info->alternate_aux_channel) { > case DP_AUX_B: > porte_aux_ctl_reg = DPB_AUX_CH_CTL; > @@ -1199,7 +1199,7 @@ intel_dp_sink_rates(struct intel_dp *int > static bool intel_dp_source_supports_hbr2(struct drm_device *dev) > { > /* WaDisableHBR2:skl */ > - if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) > + if (IS_SKL_REVID(dev, 0, SKL_REVID_B0)) > return false; > > if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) || > @@ -1217,7 +1217,7 @@ intel_dp_source_rates(struct drm_device > if (IS_BROXTON(dev)) { > *source_rates = bxt_rates; > size = ARRAY_SIZE(bxt_rates); > - } else if (IS_SKYLAKE(dev)) { > + } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > *source_rates = skl_rates; > size = ARRAY_SIZE(skl_rates); > } else { > @@ -1537,7 +1537,7 @@ found: > &pipe_config->dp_m2_n2); > } > > - if (IS_SKYLAKE(dev) && is_edp(intel_dp)) > + if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) && is_edp(intel_dp)) > skl_edp_set_pll_config(pipe_config); > else if (IS_BROXTON(dev)) > /* handled in ddi */; > @@ -6056,7 +6056,7 @@ intel_dp_init_connector(struct intel_dig > break; > case PORT_B: > intel_encoder->hpd_pin = HPD_PORT_B; > - if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < > BXT_REVID_B0)) > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) > intel_encoder->hpd_pin = HPD_PORT_A; > break; > case PORT_C: > Index: sys/dev/pci/drm/i915/intel_fbc.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_fbc.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 intel_fbc.c > --- sys/dev/pci/drm/i915/intel_fbc.c 1 Jul 2017 16:14:10 -0000 > 1.1 > +++ sys/dev/pci/drm/i915/intel_fbc.c 26 Sep 2017 14:57:58 -0000 > @@ -581,7 +581,8 @@ static int find_compression_threshold(st > * reserved range size, so it always assumes the maximum (8mb) is > used. > * If we enable FBC using a CFB on that memory range we'll get FIFO > * underruns, even if that range is not reserved by the BIOS. */ > - if (IS_BROADWELL(dev_priv) || IS_SKYLAKE(dev_priv)) > + if (IS_BROADWELL(dev_priv) || > + IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) > end = dev_priv->gtt.stolen_size - 8 * 1024 * 1024; > else > end = dev_priv->gtt.stolen_usable_size; > Index: sys/dev/pci/drm/i915/intel_guc_loader.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_guc_loader.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 intel_guc_loader.c > --- sys/dev/pci/drm/i915/intel_guc_loader.c 1 Jul 2017 16:14:10 > -0000 1.1 > +++ sys/dev/pci/drm/i915/intel_guc_loader.c 26 Sep 2017 14:57:59 -0000 > @@ -66,6 +66,9 @@ > #define I915_SKL_GUC_UCODE "i915/skl_guc_ver4.bin" > MODULE_FIRMWARE(I915_SKL_GUC_UCODE); > > +#define I915_KBL_GUC_UCODE "i915/kbl_guc_ver9_14.bin" > +MODULE_FIRMWARE(I915_KBL_GUC_UCODE); > + > /* User-friendly representation of an enum */ > const char *intel_guc_fw_status_repr(enum intel_guc_fw_status status) > { > @@ -326,8 +329,8 @@ static int guc_ucode_xfer(struct drm_i91 > I915_WRITE(GUC_SHIM_CONTROL, GUC_SHIM_CONTROL_VALUE); > > /* WaDisableMinuteIaClockGating:skl,bxt */ > - if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) == BXT_REVID_A0)) { > + if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > I915_WRITE(GUC_SHIM_CONTROL, (I915_READ(GUC_SHIM_CONTROL) & > > ~GUC_ENABLE_MIA_CLOCK_GATING)); > } > @@ -565,7 +568,11 @@ void intel_guc_ucode_init(struct drm_dev > fw_path = I915_SKL_GUC_UCODE; > guc_fw->guc_fw_major_wanted = 4; > guc_fw->guc_fw_minor_wanted = 3; > - } else { > + } else if (IS_KABYLAKE(dev)) { > + fw_path = I915_KBL_GUC_UCODE; > + guc_fw->guc_fw_major_wanted = 9; > + guc_fw->guc_fw_minor_wanted = 14; > + } else { > i915.enable_guc_submission = false; > fw_path = ""; /* unknown device */ > } > Index: sys/dev/pci/drm/i915/intel_hdmi.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_hdmi.c,v > retrieving revision 1.14 > diff -u -p -u -r1.14 intel_hdmi.c > --- sys/dev/pci/drm/i915/intel_hdmi.c 1 Jul 2017 16:14:10 -0000 > 1.14 > +++ sys/dev/pci/drm/i915/intel_hdmi.c 26 Sep 2017 14:57:59 -0000 > @@ -2074,7 +2074,7 @@ void intel_hdmi_init_connector(struct in > * On BXT A0/A1, sw needs to activate DDIA HPD logic and > * interrupts to check the external panel connection. > */ > - if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < > BXT_REVID_B0)) > + if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) > intel_encoder->hpd_pin = HPD_PORT_A; > else > intel_encoder->hpd_pin = HPD_PORT_B; > Index: sys/dev/pci/drm/i915/intel_i2c.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_i2c.c,v > retrieving revision 1.11 > diff -u -p -u -r1.11 intel_i2c.c > --- sys/dev/pci/drm/i915/intel_i2c.c 3 Jul 2017 13:26:04 -0000 > 1.11 > +++ sys/dev/pci/drm/i915/intel_i2c.c 26 Sep 2017 14:57:59 -0000 > @@ -112,7 +112,7 @@ static const struct gmbus_pin *get_gmbus > { > if (IS_BROXTON(dev_priv)) > return &gmbus_pins_bxt[pin]; > - else if (IS_SKYLAKE(dev_priv)) > + else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) > return &gmbus_pins_skl[pin]; > else if (IS_BROADWELL(dev_priv)) > return &gmbus_pins_bdw[pin]; > @@ -127,7 +127,7 @@ bool intel_gmbus_is_valid_pin(struct drm > > if (IS_BROXTON(dev_priv)) > size = ARRAY_SIZE(gmbus_pins_bxt); > - else if (IS_SKYLAKE(dev_priv)) > + else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) > size = ARRAY_SIZE(gmbus_pins_skl); > else if (IS_BROADWELL(dev_priv)) > size = ARRAY_SIZE(gmbus_pins_bdw); > Index: sys/dev/pci/drm/i915/intel_lrc.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_lrc.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 intel_lrc.c > --- sys/dev/pci/drm/i915/intel_lrc.c 1 Jul 2017 16:14:10 -0000 > 1.1 > +++ sys/dev/pci/drm/i915/intel_lrc.c 26 Sep 2017 14:58:00 -0000 > @@ -284,8 +284,8 @@ static bool disable_lite_restore_wa(stru > { > struct drm_device *dev = ring->dev; > > - return ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) == BXT_REVID_A0)) && > + return (IS_SKL_REVID(dev, 0, SKL_REVID_B0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A0)) && > (ring->id == VCS || ring->id == VCS2); > } > > @@ -1144,12 +1144,13 @@ static inline int gen8_emit_flush_cohere > uint32_t l3sqc4_flush = (0x40400000 | GEN8_LQSC_FLUSH_COHERENT_ > LINES); > > /* > - * WaDisableLSQCROPERFforOCL:skl > + * WaDisableLSQCROPERFforOCL:skl,kbl > * This WA is implemented in skl_init_clock_gating() but since > * this batch updates GEN8_L3SQCREG4 with default value we need to > * set this bit here to retain the WA during flush. > */ > - if (IS_SKYLAKE(ring->dev) && INTEL_REVID(ring->dev) <= > SKL_REVID_E0) > + if (IS_SKL_REVID(ring->dev, 0, SKL_REVID_E0) || > + IS_KBL_REVID(ring->dev, 0, KBL_REVID_E0)) > l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; > > wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | > @@ -1314,8 +1315,8 @@ static int gen9_init_indirectctx_bb(stru > uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); > > /* WaDisableCtxRestoreArbitration:skl,bxt */ > - if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_D0)) || > - (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) > + if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A0)) > wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE); > > /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt */ > @@ -1340,8 +1341,8 @@ static int gen9_init_perctx_bb(struct in > uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); > > /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt > */ > - if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_B0)) || > - (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) { > + if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A0)) { > wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); > wa_ctx_emit(batch, index, GEN9_SLICE_COMMON_ECO_CHICKEN0); > wa_ctx_emit(batch, index, > @@ -1350,8 +1351,8 @@ static int gen9_init_perctx_bb(struct in > } > > /* WaDisableCtxRestoreArbitration:skl,bxt */ > - if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_D0)) || > - (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) > + if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A0)) > wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_ENABLE); > > wa_ctx_emit(batch, index, MI_BATCH_BUFFER_END); > @@ -1973,7 +1974,7 @@ static int logical_render_ring_init(stru > ring->init_hw = gen8_init_render_ring; > ring->init_context = gen8_init_rcs_context; > ring->cleanup = intel_fini_pipe_control; > - if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > ring->get_seqno = bxt_a_get_seqno; > ring->set_seqno = bxt_a_set_seqno; > } else { > @@ -2025,7 +2026,7 @@ static int logical_bsd_ring_init(struct > GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; > > ring->init_hw = gen8_init_common_ring; > - if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > ring->get_seqno = bxt_a_get_seqno; > ring->set_seqno = bxt_a_set_seqno; > } else { > @@ -2080,7 +2081,7 @@ static int logical_blt_ring_init(struct > GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT; > > ring->init_hw = gen8_init_common_ring; > - if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > ring->get_seqno = bxt_a_get_seqno; > ring->set_seqno = bxt_a_set_seqno; > } else { > @@ -2110,7 +2111,7 @@ static int logical_vebox_ring_init(struc > GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT; > > ring->init_hw = gen8_init_common_ring; > - if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > ring->get_seqno = bxt_a_get_seqno; > ring->set_seqno = bxt_a_set_seqno; > } else { > Index: sys/dev/pci/drm/i915/intel_mocs.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_mocs.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 intel_mocs.c > --- sys/dev/pci/drm/i915/intel_mocs.c 1 Jul 2017 16:14:10 -0000 > 1.1 > +++ sys/dev/pci/drm/i915/intel_mocs.c 26 Sep 2017 14:58:00 -0000 > @@ -143,7 +143,7 @@ static bool get_mocs_settings(struct drm > { > bool result = false; > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > table->size = ARRAY_SIZE(skylake_mocs_table); > table->table = skylake_mocs_table; > result = true; > @@ -154,6 +154,16 @@ static bool get_mocs_settings(struct drm > } else { > WARN_ONCE(INTEL_INFO(dev)->gen >= 9, > "Platform that should have a MOCS table does > not.\n"); > + } > + > + /* WaDisableSkipCaching:skl,bxt,kbl */ > + if (IS_GEN9(dev)) { > + int i; > + > + for (i = 0; i < table->size; i++) > + if (WARN_ON(table->table[i].l3cc_value & > + (L3_ESC(1) || L3_SCC(0x7)))) > + return false; > } > > return result; > Index: sys/dev/pci/drm/i915/intel_panel.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_panel.c,v > retrieving revision 1.14 > diff -u -p -u -r1.14 intel_panel.c > --- sys/dev/pci/drm/i915/intel_panel.c 5 Jul 2017 20:30:13 -0000 > 1.14 > +++ sys/dev/pci/drm/i915/intel_panel.c 26 Sep 2017 14:58:00 -0000 > @@ -1779,7 +1779,8 @@ intel_panel_init_backlight_funcs(struct > panel->backlight.disable = bxt_disable_backlight; > panel->backlight.set = bxt_set_backlight; > panel->backlight.get = bxt_get_backlight; > - } else if (HAS_PCH_LPT(dev) || HAS_PCH_SPT(dev)) { > + } else if (HAS_PCH_LPT(dev_priv) || HAS_PCH_SPT(dev_priv) || > + HAS_PCH_KBP(dev_priv)) { > panel->backlight.setup = lpt_setup_backlight; > panel->backlight.enable = lpt_enable_backlight; > panel->backlight.disable = lpt_disable_backlight; > Index: sys/dev/pci/drm/i915/intel_pm.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_pm.c,v > retrieving revision 1.41 > diff -u -p -u -r1.41 intel_pm.c > --- sys/dev/pci/drm/i915/intel_pm.c 1 Jul 2017 16:14:10 -0000 > 1.41 > +++ sys/dev/pci/drm/i915/intel_pm.c 26 Sep 2017 14:58:02 -0000 > @@ -4436,7 +4436,7 @@ static void gen6_set_rps(struct drm_devi > struct drm_i915_private *dev_priv = dev->dev_private; > > /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */ > - if (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) > return; > > WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); > @@ -4712,7 +4712,8 @@ static void gen6_init_rps_frequencies(st > dev_priv->rps.max_freq = dev_priv->rps.rp0_freq; > > dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq; > - if (IS_HASWELL(dev) || IS_BROADWELL(dev) || IS_SKYLAKE(dev)) { > + if (IS_HASWELL(dev) || IS_BROADWELL(dev) || > + IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > ret = sandybridge_pcode_read(dev_priv, > HSW_PCODE_DYNAMIC_DUTY_CYCLE_ > CONTROL, > &ddcc_status); > @@ -4724,7 +4725,7 @@ static void gen6_init_rps_frequencies(st > dev_priv->rps.max_freq); > } > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > /* Store the frequency values in 16.66 MHZ units, which is > the natural hardware unit for SKL */ > dev_priv->rps.rp0_freq *= GEN9_FREQ_SCALER; > @@ -4761,7 +4762,7 @@ static void gen9_enable_rps(struct drm_d > gen6_init_rps_frequencies(dev); > > /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */ > - if (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); > return; > } > @@ -4829,8 +4830,8 @@ static void gen9_enable_rc6(struct drm_d > DRM_INFO("RC6 %s\n", (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ? > "on" : "off"); > /* WaRsUseTimeoutMode */ > - if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_D0) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) <= BXT_REVID_A0)) { > + if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A0)) { > I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us */ > I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE | > GEN7_RC_CTL_TO_MODE | > @@ -4846,8 +4847,9 @@ static void gen9_enable_rc6(struct drm_d > * 3b: Enable Coarse Power Gating only when RC6 is enabled. > * WaRsDisableCoarsePowerGating:skl,bxt - Render/Media PG need to > be disabled with RC6. > */ > - if ((IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) || > - ((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && (INTEL_REVID(dev) <= > SKL_REVID_F0))) > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A1) || > + ((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && > + IS_SKL_REVID(dev, 0, SKL_REVID_E0))) > I915_WRITE(GEN9_PG_ENABLE, 0); > else > I915_WRITE(GEN9_PG_ENABLE, (rc6_mask & > GEN6_RC_CTL_RC6_ENABLE) ? > @@ -5085,7 +5087,7 @@ static void __gen6_update_ring_freq(stru > /* convert DDR frequency from units of 266.6MHz to bandwidth */ > min_ring_freq = mult_frac(min_ring_freq, 8, 3); > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > /* Convert GT frequency to 50 HZ units */ > min_gpu_freq = dev_priv->rps.min_freq / GEN9_FREQ_SCALER; > max_gpu_freq = dev_priv->rps.max_freq / GEN9_FREQ_SCALER; > @@ -5103,7 +5105,7 @@ static void __gen6_update_ring_freq(stru > int diff = max_gpu_freq - gpu_freq; > unsigned int ia_freq = 0, ring_freq = 0; > > - if (IS_SKYLAKE(dev)) { > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) { > /* > * ring_freq = 2 * GT. ring_freq is in 100MHz units > * No floor required for ring frequency on SKL. > @@ -6237,7 +6239,7 @@ static void intel_gen6_powersave_work(st > } else if (INTEL_INFO(dev)->gen >= 9) { > gen9_enable_rc6(dev); > gen9_enable_rps(dev); > - if (IS_SKYLAKE(dev)) > + if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > __gen6_update_ring_freq(dev); > } else if (IS_BROADWELL(dev)) { > gen8_enable_rps(dev); > @@ -6376,9 +6378,11 @@ static void ironlake_init_clock_gating(s > (I915_READ(ILK_DISPLAY_CHICKEN2) | > ILK_DPARB_GATE | ILK_VSDPFD_FULL)); > dspclk_gate |= ILK_DPARBUNIT_CLOCK_GATE_ENABLE; > - I915_WRITE(DISP_ARB_CTL, > - (I915_READ(DISP_ARB_CTL) | > - DISP_FBC_WM_DIS)); > + > + /* WaFbcWakeMemOn:skl,bxt,kbl */ > + I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) | > + DISP_FBC_WM_DIS | > + DISP_FBC_MEMORY_WAKE); > > ilk_init_lp_watermarks(dev); > > Index: sys/dev/pci/drm/i915/intel_ringbuffer.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_ringbuffer.c,v > retrieving revision 1.33 > diff -u -p -u -r1.33 intel_ringbuffer.c > --- sys/dev/pci/drm/i915/intel_ringbuffer.c 19 Jul 2017 22:05:58 > -0000 1.33 > +++ sys/dev/pci/drm/i915/intel_ringbuffer.c 26 Sep 2017 14:58:03 -0000 > @@ -908,35 +908,33 @@ static int gen9_init_workarounds(struct > { > struct drm_device *dev = ring->dev; > struct drm_i915_private *dev_priv = dev->dev_private; > - uint32_t tmp; > > - /* WaEnableLbsSlaRetryTimerDecrement:skl */ > + /* WaConextSwitchWithConcurrentTLBInvalidate:skl,bxt,kbl */ > + I915_WRITE(GEN9_CSFE_CHICKEN1_RCS, _MASKED_BIT_ENABLE(GEN9_ > PREEMPT_GPGPU_SYNC_SWITCH_DISABLE)); > + > + /* WaEnableLbsSlaRetryTimerDecrement:skl,bxt,kbl */ > I915_WRITE(BDW_SCRATCH1, I915_READ(BDW_SCRATCH1) | > GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE); > > - /* WaDisableKillLogic:bxt,skl */ > + /* WaDisableKillLogic:bxt,skl,kbl */ > I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | > ECOCHK_DIS_TLB); > > - /* WaDisablePartialInstShootdown:skl,bxt */ > + /* WaDisablePartialInstShootdown:skl,bxt,kbl */ > WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN, > PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE); > > - /* Syncing dependencies between camera and graphics:skl,bxt */ > + /* Syncing dependencies between camera and graphics:skl,bxt,kbl */ > WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, > GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC); > > - if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) == SKL_REVID_A0 || > - INTEL_REVID(dev) == SKL_REVID_B0)) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0)) { > - /* WaDisableDgMirrorFixInHalfSliceChicken5:skl,bxt */ > - WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, > - GEN9_DG_MIRROR_FIX_ENABLE); > - } > + /* WaDisableDgMirrorFixInHalfSliceChicken5:skl,bxt,kbl */ > + WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, > + GEN9_DG_MIRROR_FIX_ENABLE); > > - if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0)) { > - /* WaSetDisablePixMaskCammingAndR > hwoInCommonSliceChicken:skl,bxt */ > + /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt > */ > + if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A1)) { > WA_SET_BIT_MASKED(GEN7_COMMON_SLICE_CHICKEN1, > GEN9_RHWO_OPTIMIZATION_DISABLE); > /* > @@ -946,43 +944,60 @@ static int gen9_init_workarounds(struct > */ > } > > - if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) >= SKL_REVID_C0) || > - IS_BROXTON(dev)) { > - /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt */ > - WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, > - GEN9_ENABLE_YV12_BUGFIX); > - } > + /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl */ > + WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, > + GEN9_ENABLE_YV12_BUGFIX); > > - /* Wa4x4STCOptimizationDisable:skl,bxt */ > - /* WaDisablePartialResolveInVc:skl,bxt */ > + /* Wa4x4STCOptimizationDisable:skl,bxt,kbl */ > + /* WaDisablePartialResolveInVc:skl,bxt,kbl */ > WA_SET_BIT_MASKED(CACHE_MODE_1, (GEN8_4x4_STC_OPTIMIZATION_DISABLE > | > GEN9_PARTIAL_RESOLVE_IN_VC_ > DISABLE)); > > - /* WaCcsTlbPrefetchDisable:skl,bxt */ > + /* WaCcsTlbPrefetchDisable:skl,bxt,kbl */ > WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, > GEN9_CCS_TLB_PREFETCH_ENABLE); > > - /* WaDisableMaskBasedCammingInRCC:skl,bxt */ > - if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) == SKL_REVID_C0) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0)) > + /* WaDisableMaskBasedCammingInRCC:skl,bxt,kbl */ > + if (IS_SKL_REVID(dev, SKL_REVID_C0, SKL_REVID_C0) || > + IS_BXT_REVID(dev, 0, BXT_REVID_A1)) > WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0, > PIXEL_MASK_CAMMING_DISABLE); > > - /* WaForceContextSaveRestoreNonCoherent:skl,bxt */ > - tmp = HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT; > - if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) == SKL_REVID_F0) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) >= BXT_REVID_B0)) > - tmp |= HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE; > - WA_SET_BIT_MASKED(HDC_CHICKEN0, tmp); > - > - /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt */ > - if (IS_SKYLAKE(dev) || > - (IS_BROXTON(dev) && INTEL_REVID(dev) <= BXT_REVID_B0)) { > + /* WaForceContextSaveRestoreNonCoherent:skl,bxt,kbl */ > + WA_SET_BIT_MASKED(HDC_CHICKEN0, > + HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT | > + HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE); > + > + /* WaForceEnableNonCoherent and WaDisableHDCInvalidation are > + * both tied to WaForceContextSaveRestoreNonCoherent > + * in some hsds for skl. We keep the tie for all gen9. The > + * documentation is a bit hazy and so we want to get common > behaviour, > + * even though there is no clear evidence we would need both on > kbl/bxt. > + * This area has been source of system hangs so we play it safe > + * and mimic the skl regardless of what bspec says. > + * > + * Use Force Non-Coherent whenever executing a 3D context. This > + * is a workaround for a possible hang in the unlikely event > + * a TLB invalidation occurs during a PSD flush. > + */ > + > + /* WaForceEnableNonCoherent:skl,bxt,kbl */ > + WA_SET_BIT_MASKED(HDC_CHICKEN0, > + HDC_FORCE_NON_COHERENT); > + > + /* WaDisableHDCInvalidation:skl,bxt,kbl */ > + I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | > + BDW_DISABLE_HDC_INVALIDATION); > + > + > + /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt,kbl */ > + if (IS_SKYLAKE(dev_priv) || > + IS_KABYLAKE(dev_priv) || > + IS_BXT_REVID(dev, 0, BXT_REVID_B0)) > WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, > GEN8_SAMPLER_POWER_BYPASS_DIS); > - } > > - /* WaDisableSTUnitPowerOptimization:skl,bxt */ > + /* WaDisableSTUnitPowerOptimization:skl,bxt,kbl */ > WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE); > > return 0; > @@ -1040,7 +1055,7 @@ static int skl_init_workarounds(struct i > if (ret) > return ret; > > - if (INTEL_REVID(dev) <= SKL_REVID_D0) { > + if (IS_SKL_REVID(dev, 0, SKL_REVID_D0)) { > /* WaDisableHDCInvalidation:skl */ > I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | > BDW_DISABLE_HDC_INVALIDATION); > @@ -1053,46 +1068,33 @@ static int skl_init_workarounds(struct i > /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes > * involving this register should also be added to WA batch as > required. > */ > - if (INTEL_REVID(dev) <= SKL_REVID_E0) > + if (IS_SKL_REVID(dev, 0, SKL_REVID_E0)) > /* WaDisableLSQCROPERFforOCL:skl */ > I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | > GEN8_LQSC_RO_PERF_DIS); > > /* WaEnableGapsTsvCreditFix:skl */ > - if (IS_SKYLAKE(dev) && (INTEL_REVID(dev) >= SKL_REVID_C0)) { > + if (IS_SKL_REVID(dev, SKL_REVID_C0, REVID_FOREVER)) { > I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) | > GEN9_GAPS_TSV_CREDIT_DISABLE)); > } > > /* WaDisablePowerCompilerClockGating:skl */ > - if (INTEL_REVID(dev) == SKL_REVID_B0) > + if (IS_SKL_REVID(dev, SKL_REVID_B0, SKL_REVID_B0)) > WA_SET_BIT_MASKED(HIZ_CHICKEN, > BDW_HIZ_POWER_COMPILER_CLOCK_ > GATING_DISABLE); > > - if (INTEL_REVID(dev) <= SKL_REVID_D0) { > - /* > - *Use Force Non-Coherent whenever executing a 3D context. > This > - * is a workaround for a possible hang in the unlikely > event > - * a TLB invalidation occurs during a PSD flush. > - */ > - /* WaForceEnableNonCoherent:skl */ > - WA_SET_BIT_MASKED(HDC_CHICKEN0, > - HDC_FORCE_NON_COHERENT); > - } > - > - if (INTEL_REVID(dev) == SKL_REVID_C0 || > - INTEL_REVID(dev) == SKL_REVID_D0) > - /* WaBarrierPerformanceFixDisable:skl */ > + /* WaBarrierPerformanceFixDisable:skl */ > + if (IS_SKL_REVID(dev, SKL_REVID_C0, SKL_REVID_D0)) > WA_SET_BIT_MASKED(HDC_CHICKEN0, > HDC_FENCE_DEST_SLM_DISABLE | > HDC_BARRIER_PERFORMANCE_DISABLE); > > /* WaDisableSbeCacheDispatchPortSharing:skl */ > - if (INTEL_REVID(dev) <= SKL_REVID_F0) { > + if (IS_SKL_REVID(dev, 0, SKL_REVID_F0)) > WA_SET_BIT_MASKED( > GEN7_HALF_SLICE_CHICKEN1, > GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); > - } > > return skl_tune_iz_hashing(ring); > } > @@ -1109,11 +1111,11 @@ static int bxt_init_workarounds(struct i > > /* WaStoreMultiplePTEenable:bxt */ > /* This is a requirement according to Hardware specification */ > - if (INTEL_REVID(dev) == BXT_REVID_A0) > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A0)) > I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_TLBPF); > > /* WaSetClckGatingDisableMedia:bxt */ > - if (INTEL_REVID(dev) == BXT_REVID_A0) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_A0)) { > I915_WRITE(GEN7_MISCCPCTL, (I915_READ(GEN7_MISCCPCTL) & > ~GEN8_DOP_CLOCK_GATE_MEDIA_ > ENABLE)); > } > @@ -1123,7 +1125,7 @@ static int bxt_init_workarounds(struct i > STALL_DOP_GATING_DISABLE); > > /* WaDisableSbeCacheDispatchPortSharing:bxt */ > - if (INTEL_REVID(dev) <= BXT_REVID_B0) { > + if (IS_BXT_REVID(dev, 0, BXT_REVID_B0)) { > WA_SET_BIT_MASKED( > GEN7_HALF_SLICE_CHICKEN1, > GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); > @@ -1132,6 +1134,65 @@ static int bxt_init_workarounds(struct i > return 0; > } > > +static int kbl_init_workarounds(struct intel_engine_cs *ring) > +{ > + struct drm_device *dev = ring->dev; > + struct drm_i915_private *dev_priv = dev->dev_private; > + int ret; > + > + ret = gen9_init_workarounds(ring); > + if (ret) > + return ret; > + > + /* WaEnableGapsTsvCreditFix:kbl */ > + I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) | > + GEN9_GAPS_TSV_CREDIT_DISABLE)); > + > + /* WaDisableDynamicCreditSharing:kbl */ > + if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_B0)) > + WA_SET_BIT(GAMT_CHKN_BIT_REG, > + GAMT_CHKN_DISABLE_DYNAMIC_CREDIT_SHARING); > + > + /* WaDisableFenceDestinationToSLM:kbl (pre-prod) */ > + if (IS_KBL_REVID(dev_priv, KBL_REVID_A0, KBL_REVID_A0)) > + WA_SET_BIT_MASKED(HDC_CHICKEN0, > + HDC_FENCE_DEST_SLM_DISABLE); > + > + /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes > + * involving this register should also be added to WA batch as > required. > + */ > + if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0)) > + /* WaDisableLSQCROPERFforOCL:kbl */ > + I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | > + GEN8_LQSC_RO_PERF_DIS); > + > + /* WaToEnableHwFixForPushConstHWBug:kbl */ > + if (IS_KBL_REVID(dev_priv, KBL_REVID_C0, REVID_FOREVER)) > + WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, > + GEN8_SBE_DISABLE_REPLAY_BUF_ > OPTIMIZATION); > + > + /* WaDisableGafsUnitClkGating:kbl */ > + WA_SET_BIT(GEN7_UCGCTL4, GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE); > + > + /* WaDisableSbeCacheDispatchPortSharing:kbl */ > + WA_SET_BIT_MASKED( > + GEN7_HALF_SLICE_CHICKEN1, > + GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); > + > + /* WaInPlaceDecompressionHang:kbl */ > + WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, > + GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); > + > +#ifdef notyet > + /* WaDisableLSQCROPERFforOCL:kbl */ > + ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); > + if (ret) > + return ret; > +#endif > + > + return 0; > +} > + > int init_workarounds_ring(struct intel_engine_cs *ring) > { > struct drm_device *dev = ring->dev; > @@ -1152,6 +1213,9 @@ int init_workarounds_ring(struct intel_e > > if (IS_BROXTON(dev)) > return bxt_init_workarounds(ring); > + > + if (IS_KABYLAKE(dev)) > + return kbl_init_workarounds(ring); > > return 0; > } > Index: sys/dev/pci/drm/i915/intel_runtime_pm.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_runtime_pm.c,v > retrieving revision 1.1 > diff -u -p -u -r1.1 intel_runtime_pm.c > --- sys/dev/pci/drm/i915/intel_runtime_pm.c 1 Jul 2017 16:14:10 > -0000 1.1 > +++ sys/dev/pci/drm/i915/intel_runtime_pm.c 26 Sep 2017 14:58:03 -0000 > @@ -52,7 +52,7 @@ > */ > > #define GEN9_ENABLE_DC5(dev) 0 > -#define SKL_ENABLE_DC6(dev) IS_SKYLAKE(dev) > +#define SKL_ENABLE_DC6(dev) (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) > > #define for_each_power_well(i, power_well, domain_mask, power_domains) \ > for (i = 0; \ > @@ -475,7 +475,8 @@ static void assert_can_enable_dc5(struct > bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv, > SKL_DISP_PW_2); > > - WARN_ONCE(!IS_SKYLAKE(dev), "Platform doesn't support DC5.\n"); > + WARN_ONCE(!IS_SKYLAKE(dev) && !IS_KABYLAKE(dev), > + "Platform doesn't support DC5.\n"); > WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n"); > WARN_ONCE(pg2_enabled, "PG2 not disabled to enable DC5.\n"); > > @@ -538,7 +539,8 @@ static void assert_can_enable_dc6(struct > { > struct drm_device *dev = dev_priv->dev; > > - WARN_ONCE(!IS_SKYLAKE(dev), "Platform doesn't support DC6.\n"); > + WARN_ONCE(!IS_SKYLAKE(dev) && !IS_KABYLAKE(dev), > + "Platform doesn't support DC6.\n"); > WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n"); > WARN_ONCE(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE, > "Backlight is not disabled.\n"); > @@ -668,7 +670,7 @@ static void skl_set_power_well(struct dr > } > } else { > if (enable_requested) { > - if (IS_SKYLAKE(dev) && > + if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) && > (power_well->data == SKL_DISP_PW_1) && > (intel_csr_load_status_get(dev_priv) == > FW_LOADED)) > DRM_DEBUG_KMS("Not Disabling PW1, dmc will > handle\n"); > @@ -1830,7 +1832,7 @@ sanitize_disable_power_well_option(const > if (disable_power_well >= 0) > return !!disable_power_well; > > - if (IS_SKYLAKE(dev_priv)) { > + if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { > DRM_DEBUG_KMS("Disabling display power well support\n"); > return 0; > } > @@ -1869,7 +1871,7 @@ int intel_power_domains_init(struct drm_ > set_power_wells(power_domains, hsw_power_wells); > } else if (IS_BROADWELL(dev_priv->dev)) { > set_power_wells(power_domains, bdw_power_wells); > - } else if (IS_SKYLAKE(dev_priv->dev)) { > + } else if (IS_SKYLAKE(dev_priv->dev) || > IS_KABYLAKE(dev_priv->dev)) { > set_power_wells(power_domains, skl_power_wells); > } else if (IS_BROXTON(dev_priv->dev)) { > set_power_wells(power_domains, bxt_power_wells); > >