[Intel-gfx] [PATCH] drm/i915/tgl: Program BW_BUDDY registers during display init
Lisovskiy, Stanislav
stanislav.lisovskiy at intel.com
Thu Dec 5 08:34:48 UTC 2019
On Wed, 2019-12-04 at 12:51 -0800, Matt Roper wrote:
> Gen12 can improve bandwidth efficiency by pairing up memory requests
> with similar addresses. We need to program the BW_BUDDY1 and
> BW_BUDDY2
> registers according to the memory configuration during display
> initialization to take advantage of this capability.
>
> The magic numbers we program here feel like something that could
> definitely change on future platforms, so let's use a table-based
> programming scheme to make this easy to extend in the future.
>
> Bspec: 49189
> Bspec: 49218
> Cc: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
> .../drm/i915/display/intel_display_power.c | 40
> +++++++++++++++++++
> drivers/gpu/drm/i915/i915_reg.h | 8 ++++
> 2 files changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c
> b/drivers/gpu/drm/i915/display/intel_display_power.c
> index ce1b64f4dd44..1d26f741b5b4 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -4781,6 +4781,42 @@ static void cnl_display_core_uninit(struct
> drm_i915_private *dev_priv)
> intel_combo_phy_uninit(dev_priv);
> }
>
> +struct buddy_page_mask {
> + u8 num_channels;
> + enum intel_dram_type type;
> + u32 page_mask;
> +};
> +
> +const struct buddy_page_mask tgl_buddy_page_masks[] = {
> + { 1, INTEL_DRAM_LPDDR4, 0xE },
> + { 1, INTEL_DRAM_DDR4, 0xF },
> + { 2, INTEL_DRAM_LPDDR4, 0x1C },
> + { 2, INTEL_DRAM_DDR4, 0x1F },
> + {}
> +};
> +
> +static void tgl_arbiter_init(struct drm_i915_private *dev_priv)
> +{
> + enum intel_dram_type type = dev_priv->dram_info.type;
> + u8 num_channels = dev_priv->dram_info.num_channels;
> + const struct buddy_page_mask *table = tgl_buddy_page_masks;
> + int i;
> +
> + for (i = 0; table[i].page_mask != 0; i++)
> + if (table[i].num_channels == num_channels &&
> + table[i].type == type)
> + break;
> +
> + if (table[i].page_mask == 0) {
> + DRM_DEBUG_DRIVER("Unknown memory configuration;
> disabling address buddy logic.\n");
> + I915_WRITE(BW_BUDDY1_CTL, BW_BUDDY_DISABLE);
> + I915_WRITE(BW_BUDDY2_CTL, BW_BUDDY_DISABLE);
> + } else {
> + I915_WRITE(BW_BUDDY1_PAGE_MASK, table[i].page_mask);
> + I915_WRITE(BW_BUDDY2_PAGE_MASK, table[i].page_mask);
> + }
> +}
Great idea to implement this, I already had actually patch for that
for almost a month as were using it for joint debug with Windows team,
but was a bit in a doubt whether I can send it because of secrecy
issues.
However there is one more thing: it seems that what that there is
already a workaround (check BSpec workaround 1409767108), which
instructs to set up those in a completely different way from what has
been set in BSpec initially.
Stan
> +
> static void icl_display_core_init(struct drm_i915_private *dev_priv,
> bool resume)
> {
> @@ -4813,6 +4849,10 @@ static void icl_display_core_init(struct
> drm_i915_private *dev_priv,
> /* 6. Setup MBUS. */
> icl_mbus_init(dev_priv);
>
> + /* 7. Program arbiter BW_BUDDY registers */
> + if (INTEL_GEN(dev_priv) >= 12)
> + tgl_arbiter_init(dev_priv);
> +
> if (resume && dev_priv->csr.dmc_payload)
> intel_csr_load_program(dev_priv);
> }
> diff --git a/drivers/gpu/drm/i915/i915_reg.h
> b/drivers/gpu/drm/i915/i915_reg.h
> index 1a6376a97d48..082190c2dc48 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -7765,6 +7765,14 @@ enum {
> #define GEN7_MSG_CTL _MMIO(0x45010)
> #define WAIT_FOR_PCH_RESET_ACK (1 << 1)
> #define WAIT_FOR_PCH_FLR_ACK (1 << 0)
> +
> +#define BW_BUDDY1_CTL _MMIO(0x45140)
> +#define BW_BUDDY2_CTL _MMIO(0x45150)
> +#define BW_BUDDY_DISABLE REG_BIT(31)
> +
> +#define BW_BUDDY1_PAGE_MASK _MMIO(0x45144)
> +#define BW_BUDDY2_PAGE_MASK _MMIO(0x45154)
> +
> #define HSW_NDE_RSTWRN_OPT _MMIO(0x46408)
> #define RESET_PCH_HANDSHAKE_ENABLE (1 << 4)
>
More information about the Intel-gfx
mailing list