All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: Lucas De Marchi <lucas.demarchi@intel.com>,
	intel-xe@lists.freedesktop.org
Cc: Lucas De Marchi <lucas.demarchi@intel.com>,
	Matt Roper <matthew.d.roper@intel.com>,
	maarten.lankhorst@intel.com,
	Rodrigo Vivi <rodrigo.vivi@intel.com>
Subject: Re: [Intel-xe] [PATCH 5/7] drm/xe/display: Move device info initialization to display
Date: Thu, 02 Mar 2023 16:44:01 +0200	[thread overview]
Message-ID: <87v8jjusb2.fsf@intel.com> (raw)
In-Reply-To: <87y1ofusbs.fsf@intel.com>

On Thu, 02 Mar 2023, Jani Nikula <jani.nikula@linux.intel.com> wrote:
> On Wed, 01 Mar 2023, Lucas De Marchi <lucas.demarchi@intel.com> wrote:
>> Instead of initializing the display info together with the platform in
>> xe_pci.c, let the display part initialize it. The small disadvantage is
>> that the description struct is not automatically mapped from the PCI ID,
>> but just doing a switch on the platform, that should already be set
>> during display initialization should be ok.
>
> Have we already given up on the idea that device info would be a pointer
> to rodata?
>
> The thing that was always problematic for i915 was that it was all too
> convenient to go fiddle with the device info runtime, based on some
> arbitrary needs.
>
> ---
>
> That said, there's really no requirement that the struct pci_device_id
> driver_data members in MODULE_DEVICE_TABLE() need to be pointers to some
> device info structures, at all. The initialization of device info could
> be done in completely different ways if we dropped that notion. The
> current macro "inheritance" in both i915 and xe is absolutely horrible.
>
> Anyway, going to block the patch, just checking on the direction here.

Sheesh, *NOT* going to. Sorry.


>
>
> BR,
> Jani.
>
>
>
>
>
>
>
>
>>
>> This allows to encapsulate the display details inside the display
>> compilation units.
>>
>> Also use __diag_push() / __diag_pop() like in xe_step to handle the few
>> places where -Woverride-init should be disabled.
>>
>> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
>> ---
>>  drivers/gpu/drm/xe/Makefile     |   3 -
>>  drivers/gpu/drm/xe/xe_display.c | 114 ++++++++++++++++++++++++++++++++
>>  drivers/gpu/drm/xe/xe_display.h |  15 ++---
>>  drivers/gpu/drm/xe/xe_pci.c     |  90 ++-----------------------
>>  4 files changed, 128 insertions(+), 94 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>> index 18257cd7227d..d1d255df74a1 100644
>> --- a/drivers/gpu/drm/xe/Makefile
>> +++ b/drivers/gpu/drm/xe/Makefile
>> @@ -24,9 +24,6 @@ subdir-ccflags-y += $(call cc-disable-warning, initializer-overrides)
>>  subdir-ccflags-y += $(call cc-disable-warning, frame-address)
>>  subdir-ccflags-$(CONFIG_DRM_XE_WERROR) += -Werror
>>  
>> -# Fine grained warnings disable
>> -CFLAGS_xe_pci.o = $(call cc-disable-warning, override-init)
>> -
>>  subdir-ccflags-y += -I$(srctree)/$(src)
>>  
>>  # Please keep these build lists sorted!
>> diff --git a/drivers/gpu/drm/xe/xe_display.c b/drivers/gpu/drm/xe/xe_display.c
>> index 34bdb2d60938..76e4fb6bd67c 100644
>> --- a/drivers/gpu/drm/xe/xe_display.c
>> +++ b/drivers/gpu/drm/xe/xe_display.c
>> @@ -10,6 +10,7 @@
>>  #include <linux/fb.h>
>>  
>>  #include <drm/drm_aperture.h>
>> +#include <drm/drm_drv.h>
>>  #include <drm/drm_managed.h>
>>  #include <drm/xe_drm.h>
>>  
>> @@ -383,4 +384,117 @@ void xe_display_pm_resume(struct xe_device *xe)
>>  	intel_power_domains_enable(xe);
>>  }
>>  
>> +/* Display info initialization */
>> +__diag_push();
>> +__diag_ignore_all("-Woverride-init", "Allow field overrides in table");
>> +
>> +#define __DISPLAY_DEFAULTS \
>> +	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) |			\
>> +		     BIT(PIPE_C) | BIT(PIPE_D),				\
>> +	.cpu_transcoder_mask =						\
>> +	BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |				\
>> +	BIT(TRANSCODER_C) | BIT(TRANSCODER_D) |				\
>> +	BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1),			\
>> +	.pipe_offsets = {						\
>> +		[TRANSCODER_A] = PIPE_A_OFFSET,				\
>> +		[TRANSCODER_B] = PIPE_B_OFFSET,				\
>> +		[TRANSCODER_C] = PIPE_C_OFFSET,				\
>> +		[TRANSCODER_D] = PIPE_D_OFFSET,				\
>> +		[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET,			\
>> +		[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET,			\
>> +	},								\
>> +	.trans_offsets = {						\
>> +		[TRANSCODER_A] = TRANSCODER_A_OFFSET,			\
>> +		[TRANSCODER_B] = TRANSCODER_B_OFFSET,			\
>> +		[TRANSCODER_C] = TRANSCODER_C_OFFSET,			\
>> +		[TRANSCODER_D] = TRANSCODER_D_OFFSET,			\
>> +		[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET,		\
>> +		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET,		\
>> +	}
>> +
>> +#define GEN12_DISPLAY \
>> +	__DISPLAY_DEFAULTS,						\
>> +	.ver = 12,							\
>> +	.abox_mask = GENMASK(2, 1),					\
>> +	.has_dmc = 1,							\
>> +	.has_dp_mst = 1,						\
>> +	.has_dsb = 0, /* FIXME: LUT load is broken with huge DSB */	\
>> +	.dbuf.size = 2048,						\
>> +	.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2),			\
>> +	.has_dsc = 1,							\
>> +	.fbc_mask = BIT(INTEL_FBC_A),					\
>> +	.has_fpga_dbg = 1,						\
>> +	.has_hdcp = 1,							\
>> +	.has_ipc = 1,							\
>> +	.has_psr = 1,							\
>> +	.has_psr_hw_tracking = 1,					\
>> +	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
>> +
>> +#define GEN13_DISPLAY							\
>> +	__DISPLAY_DEFAULTS,						\
>> +	.ver = 13,							\
>> +	.abox_mask = GENMASK(1, 0),					\
>> +	.color = {							\
>> +		.degamma_lut_size = 128, .gamma_lut_size = 1024,	\
>> +		.degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING |	\
>> +		DRM_COLOR_LUT_EQUAL_CHANNELS,				\
>> +	},								\
>> +	.dbuf.size = 4096,						\
>> +	.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) |	\
>> +	BIT(DBUF_S4),							\
>> +	.has_dmc = 1,							\
>> +	.has_dp_mst = 1,						\
>> +	.has_dsb = 1,							\
>> +	.has_dsc = 1,							\
>> +	.fbc_mask = BIT(INTEL_FBC_A),					\
>> +	.has_fpga_dbg = 1,						\
>> +	.has_hdcp = 1,							\
>> +	.has_ipc = 1,							\
>> +	.has_psr = 1
>> +
>> +void xe_display_info_init(struct xe_device *xe)
>> +{
>> +	if (!xe->info.enable_display)
>> +		return;
>> +
>> +	switch (xe->info.platform) {
>> +	case XE_TIGERLAKE:
>> +	case XE_DG1:
>> +		xe->info.display = (struct xe_device_display_info) { GEN12_DISPLAY };
>> +		break;
>> +	case XE_ALDERLAKE_S:
>> +	case XE_ALDERLAKE_P:
>> +		xe->info.display = (struct xe_device_display_info) {
>> +			GEN12_DISPLAY,
>> +			.has_hti = 1,
>> +			.has_psr_hw_tracking = 0,
>> +		};
>> +		break;
>> +	case XE_DG2:
>> +		xe->info.display = (struct xe_device_display_info) {
>> +			GEN13_DISPLAY,
>> +			.cpu_transcoder_mask =
>> +				BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
>> +				BIT(TRANSCODER_C) | BIT(TRANSCODER_D),
>> +		};
>> +		break;
>> +	case XE_METEORLAKE:
>> +		xe->info.display = (struct xe_device_display_info) {
>> +			GEN13_DISPLAY,
>> +			.ver = 14,
>> +			.has_cdclk_crawl = 1,
>> +			.has_cdclk_squash = 1,
>> +		};
>> +		break;
>> +	default:
>> +		/*
>> +		 * If platform doesn't have display, enable_display should
>> +		 * had been forced to false already at this point
>> +		 */
>> +		drm_WARN_ON(&xe->drm, 1);
>> +	}
>> +}
>> +
>> +__diag_pop();
>> +
>>  #endif
>> diff --git a/drivers/gpu/drm/xe/xe_display.h b/drivers/gpu/drm/xe/xe_display.h
>> index cb5298ceed3b..d1af8e3a5c0f 100644
>> --- a/drivers/gpu/drm/xe/xe_display.h
>> +++ b/drivers/gpu/drm/xe/xe_display.h
>> @@ -6,16 +6,18 @@
>>  #ifndef _XE_DISPLAY_H_
>>  #define _XE_DISPLAY_H_
>>  
>> -#include <drm/drm_drv.h>
>> -
>>  #include "xe_device.h"
>>  
>> +struct drm_driver;
>> +
>>  #if IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
>>  
>>  int xe_display_set_driver_hooks(struct pci_dev *pdev, struct drm_driver *driver);
>>  
>>  int xe_display_create(struct xe_device *xe);
>>  
>> +void xe_display_info_init(struct xe_device *xe);
>> +
>>  int xe_display_init_nommio(struct xe_device *xe);
>>  void xe_display_fini_nommio(struct drm_device *dev, void *dummy);
>>  
>> @@ -51,6 +53,8 @@ xe_display_set_driver_hooks(struct pci_dev *pdev, struct drm_driver *driver) { r
>>  static inline int
>>  xe_display_create(struct xe_device *xe) { return 0; }
>>  
>> +static inline void xe_display_info_init(struct xe_device *xe) { }
>> +
>>  static inline int
>>  xe_display_enable(struct pci_dev *pdev, struct drm_driver *driver) { return 0; };
>>  
>> @@ -58,12 +62,7 @@ static inline int
>>  xe_display_init_nommio(struct xe_device *xe) { return 0; };
>>  static inline void xe_display_fini_nommio(struct drm_device *dev, void *dummy) {};
>>  
>> -static inline int xe_display_init_noirq(struct xe_device *xe)
>> -{
>> -	if (xe->info.display.pipe_mask != 0)
>> -		drm_warn(&xe->drm, "CONFIG_DRM_XE_DISPLAY is unset, but device is display capable\n");
>> -	return 0;
>> -}
>> +static inline int xe_display_init_noirq(struct xe_device *xe) { return 0; }
>>  
>>  static inline void
>>  xe_display_fini_noirq(struct drm_device *dev, void *dummy) {};
>> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>> index 11dc0de66101..c4d9fd2e7b2b 100644
>> --- a/drivers/gpu/drm/xe/xe_pci.c
>> +++ b/drivers/gpu/drm/xe/xe_pci.c
>> @@ -16,6 +16,7 @@
>>  
>>  #include "regs/xe_regs.h"
>>  #include "xe_device.h"
>> +#include "xe_display.h"
>>  #include "xe_drv.h"
>>  #include "xe_macros.h"
>>  #include "xe_module.h"
>> @@ -62,8 +63,6 @@ struct xe_device_desc {
>>  	DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
>>  #undef DEFINE_FLAG
>>  
>> -	struct xe_device_display_info display;
>> -
>>  	u8 vram_flags;
>>  	u8 max_tiles;
>>  	u8 vm_max_level;
>> @@ -75,79 +74,15 @@ struct xe_device_desc {
>>  	bool has_asid;
>>  };
>>  
>> +__diag_push();
>> +__diag_ignore_all("-Woverride-init", "Allow field overrides in table");
>> +
>>  #define PLATFORM(x)		\
>>  	.platform = (x),	\
>>  	.platform_name = #x
>>  
>>  #define NOP(x)	x
>>  
>> -#define __DISPLAY_DEFAULTS \
>> -		.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \
>> -		.cpu_transcoder_mask = \
>> -			BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
>> -			BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | \
>> -			BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
>> -		.pipe_offsets = { \
>> -			[TRANSCODER_A] = PIPE_A_OFFSET, \
>> -			[TRANSCODER_B] = PIPE_B_OFFSET, \
>> -			[TRANSCODER_C] = PIPE_C_OFFSET, \
>> -			[TRANSCODER_D] = PIPE_D_OFFSET, \
>> -			[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
>> -			[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
>> -		}, \
>> -		.trans_offsets = { \
>> -			[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
>> -			[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
>> -			[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
>> -			[TRANSCODER_D] = TRANSCODER_D_OFFSET, \
>> -			[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
>> -			[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
>> -		}, \
>> -
>> -#define GEN12_DISPLAY \
>> -	.display = (struct xe_device_display_info){ \
>> -		__DISPLAY_DEFAULTS \
>> -		.ver = 12, \
>> -		.abox_mask = GENMASK(2, 1), \
>> -		.has_dmc = 1, \
>> -		.has_dp_mst = 1, \
>> -		.has_dsb = 0, /* FIXME: LUT load is broken with huge DSB */ \
>> -		.dbuf.size = 2048, \
>> -		.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2), \
>> -		.has_dsc = 1, \
>> -		.fbc_mask = BIT(INTEL_FBC_A), \
>> -		.has_fpga_dbg = 1, \
>> -		.has_hdcp = 1, \
>> -		.has_ipc = 1, \
>> -		.has_psr = 1, \
>> -		.has_psr_hw_tracking = 1, \
>> -		.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }, \
>> -	}
>> -
>> -#define GEN13_DISPLAY \
>> -	.display = (struct xe_device_display_info){ \
>> -		__DISPLAY_DEFAULTS \
>> -		.ver = 13,							\
>> -		.abox_mask = GENMASK(1, 0),					\
>> -		.color = {							\
>> -			.degamma_lut_size = 128, .gamma_lut_size = 1024,	\
>> -			.degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING |	\
>> -				     DRM_COLOR_LUT_EQUAL_CHANNELS,		\
>> -		},								\
>> -		.dbuf.size = 4096,						\
>> -		.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) |	\
>> -				   BIT(DBUF_S4),				\
>> -		.has_dmc = 1,							\
>> -		.has_dp_mst = 1,						\
>> -		.has_dsb = 1,							\
>> -		.has_dsc = 1,							\
>> -		.fbc_mask = BIT(INTEL_FBC_A),					\
>> -		.has_fpga_dbg = 1,						\
>> -		.has_hdcp = 1,							\
>> -		.has_ipc = 1,							\
>> -		.has_psr = 1,							\
>> -	}
>> -
>>  /* Keep in gen based order, and chronological order within a gen */
>>  #define GEN12_FEATURES \
>>  	.require_force_probe = true, \
>> @@ -160,20 +95,15 @@ struct xe_device_desc {
>>  
>>  static const struct xe_device_desc tgl_desc = {
>>  	GEN12_FEATURES,
>> -	GEN12_DISPLAY,
>>  	PLATFORM(XE_TIGERLAKE),
>>  	.platform_engine_mask =
>>  		BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0) |
>>  		BIT(XE_HW_ENGINE_VECS0) | BIT(XE_HW_ENGINE_VCS0) |
>>  		BIT(XE_HW_ENGINE_VCS2),
>> -	GEN12_DISPLAY,
>>  };
>>  
>>  static const struct xe_device_desc adl_s_desc = {
>>  	GEN12_FEATURES,
>> -	GEN12_DISPLAY,
>> -	.display.has_hti = 1,
>> -	.display.has_psr_hw_tracking = 0,
>>  	PLATFORM(XE_ALDERLAKE_S),
>>  	.platform_engine_mask =
>>  		BIT(XE_HW_ENGINE_RCS0) | BIT(XE_HW_ENGINE_BCS0) |
>> @@ -195,7 +125,6 @@ static const struct xe_device_desc adl_p_desc = {
>>  
>>  static const struct xe_device_desc dg1_desc = {
>>  	GEN12_FEATURES,
>> -	GEN12_DISPLAY,
>>  	DGFX_FEATURES,
>>  	.graphics_rel = 10,
>>  	PLATFORM(XE_DG1),
>> @@ -256,9 +185,6 @@ static const struct xe_device_desc dg2_desc = {
>>  	XE_HPM_FEATURES,
>>  
>>  	DG2_FEATURES,
>> -	GEN13_DISPLAY,
>> -	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
>> -				       BIT(TRANSCODER_C) | BIT(TRANSCODER_D),
>>  };
>>  
>>  #define PVC_ENGINES \
>> @@ -334,13 +260,10 @@ static const struct xe_device_desc mtl_desc = {
>>  	PLATFORM(XE_METEORLAKE),
>>  	.extra_gts = xelpmp_gts,
>>  	.platform_engine_mask = MTL_MAIN_ENGINES,
>> -	GEN13_DISPLAY,
>> -	.display.ver = 14,
>> -	.display.has_cdclk_crawl = 1,
>> -	.display.has_cdclk_squash = 1,
>>  };
>>  
>>  #undef PLATFORM
>> +__diag_pop();
>>  
>>  #define INTEL_VGA_DEVICE(id, info) {			\
>>  	PCI_DEVICE(PCI_VENDOR_ID_INTEL, id),		\
>> @@ -489,7 +412,6 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>>  	xe->info.has_asid = desc->has_asid;
>>  	xe->info.has_flat_ccs = desc->has_flat_ccs;
>>  	xe->info.has_4tile = desc->has_4tile;
>> -	xe->info.display = desc->display;
>>  	xe->info.has_range_tlb_invalidation = desc->has_range_tlb_invalidation;
>>  
>>  	spd = subplatform_get(xe, desc);
>> @@ -519,6 +441,8 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>>  		}
>>  	}
>>  
>> +	xe_display_info_init(xe);
>> +
>>  	drm_dbg(&xe->drm, "%s %s %04x:%04x dgfx:%d gfx100:%d media100:%d dma_m_s:%d tc:%d",
>>  		desc->platform_name, spd ? spd->name : "",
>>  		xe->info.devid, xe->info.revid,

-- 
Jani Nikula, Intel Open Source Graphics Center

  reply	other threads:[~2023-03-02 15:02 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-02  1:34 [Intel-xe] [PATCH 0/7] Encapsulate display Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 1/7] drm/xe: Fix typo persitent->persistent Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 2/7] drm/xe/display: Fix return code for deferred probing Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 3/7] drm/xe/display: Rename and clarify xe_display_enable() Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 4/7] drm/xe/display: Move display sw init to xe_display.c Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 5/7] drm/xe/display: Move device info initialization to display Lucas De Marchi
2023-03-02 14:43   ` Jani Nikula
2023-03-02 14:44     ` Jani Nikula [this message]
2023-03-02 15:23       ` Lucas De Marchi
2023-03-02 15:22     ` Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 6/7] drm/xe/display: Rename GEN13_DISPLAY Lucas De Marchi
2023-03-02  1:34 ` [Intel-xe] [PATCH 7/7] drm/xe: Remove i915 header dependency when building without display Lucas De Marchi
2023-03-02 11:56   ` Maarten Lankhorst
2023-03-03  1:22     ` Lucas De Marchi
2023-03-02  1:37 ` [Intel-xe] ✓ CI.Patch_applied: success for Encapsulate display Patchwork
2023-03-02  1:39 ` [Intel-xe] ✓ CI.KUnit: " Patchwork
2023-03-02  1:42 ` [Intel-xe] ✓ CI.Build: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87v8jjusb2.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=lucas.demarchi@intel.com \
    --cc=maarten.lankhorst@intel.com \
    --cc=matthew.d.roper@intel.com \
    --cc=rodrigo.vivi@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.