* [PATCH 01/16] drm/i915/display_device: Add Check HAS_DSC for bigjoiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:30 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 02/16] drm/i915/display_debugfs: Allow force joiner only if supported Ankit Nautiyal
` (14 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Bigjoiner needs DSC, add a check to reflect that.
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_device.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
index 5306bbd13e59..6a5bee59e6aa 100644
--- a/drivers/gpu/drm/i915/display/intel_display_device.h
+++ b/drivers/gpu/drm/i915/display/intel_display_device.h
@@ -118,7 +118,7 @@ enum intel_display_subplatform {
#define HAS_4TILE(i915) (IS_DG2(i915) || DISPLAY_VER(i915) >= 14)
#define HAS_ASYNC_FLIPS(i915) (DISPLAY_VER(i915) >= 5)
-#define HAS_BIGJOINER(i915) (DISPLAY_VER(i915) >= 11)
+#define HAS_BIGJOINER(i915) (DISPLAY_VER(i915) >= 11 && HAS_DSC(i915))
#define HAS_CDCLK_CRAWL(i915) (DISPLAY_INFO(i915)->has_cdclk_crawl)
#define HAS_CDCLK_SQUASH(i915) (DISPLAY_INFO(i915)->has_cdclk_squash)
#define HAS_CUR_FBC(i915) (!HAS_GMCH(i915) && IS_DISPLAY_VER(i915, 7, 13))
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 01/16] drm/i915/display_device: Add Check HAS_DSC for bigjoiner
2024-09-23 18:13 ` [PATCH 01/16] drm/i915/display_device: Add Check HAS_DSC for bigjoiner Ankit Nautiyal
@ 2024-09-23 18:30 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:30 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:21PM +0530, Ankit Nautiyal wrote:
> Bigjoiner needs DSC, add a check to reflect that.
Might want to point out here that DSC can be fused off, hence
the platform check itself is not sufficient.
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display_device.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
> index 5306bbd13e59..6a5bee59e6aa 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.h
> @@ -118,7 +118,7 @@ enum intel_display_subplatform {
>
> #define HAS_4TILE(i915) (IS_DG2(i915) || DISPLAY_VER(i915) >= 14)
> #define HAS_ASYNC_FLIPS(i915) (DISPLAY_VER(i915) >= 5)
> -#define HAS_BIGJOINER(i915) (DISPLAY_VER(i915) >= 11)
> +#define HAS_BIGJOINER(i915) (DISPLAY_VER(i915) >= 11 && HAS_DSC(i915))
> #define HAS_CDCLK_CRAWL(i915) (DISPLAY_INFO(i915)->has_cdclk_crawl)
> #define HAS_CDCLK_SQUASH(i915) (DISPLAY_INFO(i915)->has_cdclk_squash)
> #define HAS_CUR_FBC(i915) (!HAS_GMCH(i915) && IS_DISPLAY_VER(i915, 7, 13))
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 02/16] drm/i915/display_debugfs: Allow force joiner only if supported
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 01/16] drm/i915/display_device: Add Check HAS_DSC for bigjoiner Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:34 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 03/16] drm/i915/display: Modify debugfs for joiner to force n pipes Ankit Nautiyal
` (13 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Currently we support joiner only for DP encoder.
Do not create the debugfs for joiner if DP does not support the joiner.
This will also help avoiding cases where config has eDP MSO, with which
we do not support joiner.
v2: Check for intel_dp_has_joiner and avoid creating debugfs if not
supported. (Ville)
v3 : Remove HAS_BIGJOINER check. (Ville)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_debugfs.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 890ef7067b77..6ded0a22d401 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1328,6 +1328,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct dentry *root = connector->base.debugfs_entry;
int connector_type = connector->base.connector_type;
+ struct intel_dp *intel_dp = intel_attached_dp(connector);
/* The connector must have been registered beforehands. */
if (!root)
@@ -1362,7 +1363,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
connector, &i915_dsc_fractional_bpp_fops);
}
- if (HAS_BIGJOINER(i915) &&
+ if (intel_dp_has_joiner(intel_dp) &&
(connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
connector_type == DRM_MODE_CONNECTOR_eDP)) {
debugfs_create_bool("i915_bigjoiner_force_enable", 0644, root,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 02/16] drm/i915/display_debugfs: Allow force joiner only if supported
2024-09-23 18:13 ` [PATCH 02/16] drm/i915/display_debugfs: Allow force joiner only if supported Ankit Nautiyal
@ 2024-09-23 18:34 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:34 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:22PM +0530, Ankit Nautiyal wrote:
> Currently we support joiner only for DP encoder.
> Do not create the debugfs for joiner if DP does not support the joiner.
> This will also help avoiding cases where config has eDP MSO, with which
> we do not support joiner.
>
> v2: Check for intel_dp_has_joiner and avoid creating debugfs if not
> supported. (Ville)
> v3 : Remove HAS_BIGJOINER check. (Ville)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display_debugfs.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 890ef7067b77..6ded0a22d401 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -1328,6 +1328,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
> struct drm_i915_private *i915 = to_i915(connector->base.dev);
> struct dentry *root = connector->base.debugfs_entry;
> int connector_type = connector->base.connector_type;
> + struct intel_dp *intel_dp = intel_attached_dp(connector);
>
> /* The connector must have been registered beforehands. */
> if (!root)
> @@ -1362,7 +1363,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
> connector, &i915_dsc_fractional_bpp_fops);
> }
>
> - if (HAS_BIGJOINER(i915) &&
> + if (intel_dp_has_joiner(intel_dp) &&
> (connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
> connector_type == DRM_MODE_CONNECTOR_eDP)) {
I think you need to reverse the connector type vs. intel_dp_has_joiner()
checks, otherwise we already assume it's DP when calling
intel_dp_has_joiner().
> debugfs_create_bool("i915_bigjoiner_force_enable", 0644, root,
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 03/16] drm/i915/display: Modify debugfs for joiner to force n pipes
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 01/16] drm/i915/display_device: Add Check HAS_DSC for bigjoiner Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 02/16] drm/i915/display_debugfs: Allow force joiner only if supported Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:36 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 04/16] drm/i915/dp: Add helper to compute num pipes required Ankit Nautiyal
` (12 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
At the moment, the debugfs for joiner allows only to force enable/disable
pipe joiner for 2 pipes. Modify it to force join 'n' number of pipes,
where n is a valid pipe joiner configuration.
This will help in case of ultra joiner where 4 pipes are joined.
v2:
-Fix commit message to state that only valid joiner config can be
forced. (Suraj)
-Rename the identifiers to have INTEL_BIG/NONE_JOINER_PIPES. (Suraj)
v3:
-Avoid enum for joiner pipe counts, use bare numbers for better
readability. (Ville)
-Remove redundant prints from debugfs. (Ville)
v4: Return -EINVAL if joiner forced to an invalid value.
v5: Remove extra debug message. (Ville)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
.../drm/i915/display/intel_display_debugfs.c | 58 ++++++++++++++++++-
.../drm/i915/display/intel_display_types.h | 2 +-
drivers/gpu/drm/i915/display/intel_dp.c | 2 +-
3 files changed, 58 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 6ded0a22d401..80c499d642dc 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1316,6 +1316,60 @@ static int intel_crtc_pipe_show(struct seq_file *m, void *unused)
}
DEFINE_SHOW_ATTRIBUTE(intel_crtc_pipe);
+static int i915_joiner_show(struct seq_file *m, void *data)
+{
+ struct intel_connector *connector = m->private;
+
+ seq_printf(m, "%d\n", connector->force_joined_pipes);
+
+ return 0;
+}
+
+static ssize_t i915_joiner_write(struct file *file,
+ const char __user *ubuf,
+ size_t len, loff_t *offp)
+{
+ struct seq_file *m = file->private_data;
+ struct intel_connector *connector = m->private;
+ int force_joined_pipes = 0;
+ int ret;
+
+ if (len == 0)
+ return 0;
+
+ ret = kstrtoint_from_user(ubuf, len, 0, &force_joined_pipes);
+ if (ret < 0)
+ return ret;
+
+ switch (force_joined_pipes) {
+ case 0:
+ break;
+ case 2:
+ connector->force_joined_pipes = force_joined_pipes;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ *offp += len;
+
+ return len;
+}
+
+static int i915_joiner_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, i915_joiner_show, inode->i_private);
+}
+
+static const struct file_operations i915_joiner_fops = {
+ .owner = THIS_MODULE,
+ .open = i915_joiner_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+ .write = i915_joiner_write
+};
+
/**
* intel_connector_debugfs_add - add i915 specific connector debugfs files
* @connector: pointer to a registered intel_connector
@@ -1366,8 +1420,8 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
if (intel_dp_has_joiner(intel_dp) &&
(connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
connector_type == DRM_MODE_CONNECTOR_eDP)) {
- debugfs_create_bool("i915_bigjoiner_force_enable", 0644, root,
- &connector->force_bigjoiner_enable);
+ debugfs_create_file("i915_joiner_force_enable", 0644, root,
+ connector, &i915_joiner_fops);
}
if (connector_type == DRM_MODE_CONNECTOR_DSI ||
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index b1eed230285a..2a9806f93e63 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -524,7 +524,7 @@ struct intel_connector {
struct intel_dp *mst_port;
- bool force_bigjoiner_enable;
+ int force_joined_pipes;
struct {
struct drm_dp_aux *dsc_decompression_aux;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 16dc1d26d2a2..a1a64758d30d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1274,7 +1274,7 @@ bool intel_dp_need_joiner(struct intel_dp *intel_dp,
return false;
return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120 ||
- connector->force_bigjoiner_enable;
+ connector->force_joined_pipes == 2;
}
bool intel_dp_has_dsc(const struct intel_connector *connector)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 03/16] drm/i915/display: Modify debugfs for joiner to force n pipes
2024-09-23 18:13 ` [PATCH 03/16] drm/i915/display: Modify debugfs for joiner to force n pipes Ankit Nautiyal
@ 2024-09-23 18:36 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:36 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:23PM +0530, Ankit Nautiyal wrote:
> At the moment, the debugfs for joiner allows only to force enable/disable
> pipe joiner for 2 pipes. Modify it to force join 'n' number of pipes,
> where n is a valid pipe joiner configuration.
> This will help in case of ultra joiner where 4 pipes are joined.
>
> v2:
> -Fix commit message to state that only valid joiner config can be
> forced. (Suraj)
> -Rename the identifiers to have INTEL_BIG/NONE_JOINER_PIPES. (Suraj)
> v3:
> -Avoid enum for joiner pipe counts, use bare numbers for better
> readability. (Ville)
> -Remove redundant prints from debugfs. (Ville)
> v4: Return -EINVAL if joiner forced to an invalid value.
> v5: Remove extra debug message. (Ville)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> .../drm/i915/display/intel_display_debugfs.c | 58 ++++++++++++++++++-
> .../drm/i915/display/intel_display_types.h | 2 +-
> drivers/gpu/drm/i915/display/intel_dp.c | 2 +-
> 3 files changed, 58 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 6ded0a22d401..80c499d642dc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -1316,6 +1316,60 @@ static int intel_crtc_pipe_show(struct seq_file *m, void *unused)
> }
> DEFINE_SHOW_ATTRIBUTE(intel_crtc_pipe);
>
> +static int i915_joiner_show(struct seq_file *m, void *data)
> +{
> + struct intel_connector *connector = m->private;
> +
> + seq_printf(m, "%d\n", connector->force_joined_pipes);
> +
> + return 0;
> +}
> +
> +static ssize_t i915_joiner_write(struct file *file,
> + const char __user *ubuf,
> + size_t len, loff_t *offp)
> +{
> + struct seq_file *m = file->private_data;
> + struct intel_connector *connector = m->private;
> + int force_joined_pipes = 0;
> + int ret;
> +
> + if (len == 0)
> + return 0;
> +
> + ret = kstrtoint_from_user(ubuf, len, 0, &force_joined_pipes);
> + if (ret < 0)
> + return ret;
> +
> + switch (force_joined_pipes) {
> + case 0:
> + break;
The break shouldn't be here. We want to set connector->force_joined_pipes
for both values.
With that fixed
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> + case 2:
> + connector->force_joined_pipes = force_joined_pipes;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + *offp += len;
> +
> + return len;
> +}
> +
> +static int i915_joiner_open(struct inode *inode, struct file *file)
> +{
> + return single_open(file, i915_joiner_show, inode->i_private);
> +}
> +
> +static const struct file_operations i915_joiner_fops = {
> + .owner = THIS_MODULE,
> + .open = i915_joiner_open,
> + .read = seq_read,
> + .llseek = seq_lseek,
> + .release = single_release,
> + .write = i915_joiner_write
> +};
> +
> /**
> * intel_connector_debugfs_add - add i915 specific connector debugfs files
> * @connector: pointer to a registered intel_connector
> @@ -1366,8 +1420,8 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
> if (intel_dp_has_joiner(intel_dp) &&
> (connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
> connector_type == DRM_MODE_CONNECTOR_eDP)) {
> - debugfs_create_bool("i915_bigjoiner_force_enable", 0644, root,
> - &connector->force_bigjoiner_enable);
> + debugfs_create_file("i915_joiner_force_enable", 0644, root,
> + connector, &i915_joiner_fops);
> }
>
> if (connector_type == DRM_MODE_CONNECTOR_DSI ||
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index b1eed230285a..2a9806f93e63 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -524,7 +524,7 @@ struct intel_connector {
>
> struct intel_dp *mst_port;
>
> - bool force_bigjoiner_enable;
> + int force_joined_pipes;
>
> struct {
> struct drm_dp_aux *dsc_decompression_aux;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 16dc1d26d2a2..a1a64758d30d 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1274,7 +1274,7 @@ bool intel_dp_need_joiner(struct intel_dp *intel_dp,
> return false;
>
> return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120 ||
> - connector->force_bigjoiner_enable;
> + connector->force_joined_pipes == 2;
> }
>
> bool intel_dp_has_dsc(const struct intel_connector *connector)
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 04/16] drm/i915/dp: Add helper to compute num pipes required
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (2 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 03/16] drm/i915/display: Modify debugfs for joiner to force n pipes Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 05/16] drm/i915/display: Add debugfs support to avoid joiner Ankit Nautiyal
` (11 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Add a helper to compute the number of pipes required.
This will depend on whether the joiner is required or is forced through
the debugfs. If no joiner is required the helper returns 1.
v2:
-Return 1 if no joiner is required. (Ville)
-Change the suffix from joined_pipes to num_pipes. (Ville)
-Use number of pipes while calculating joined_pipe masks and
max_dotclk. (Ville)
v3: Simplify and rename the helper to intel_dp_num_joined_pipes(). Ville
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/intel_dp.c | 46 ++++++++++++---------
drivers/gpu/drm/i915/display/intel_dp.h | 6 +--
drivers/gpu/drm/i915/display/intel_dp_mst.c | 23 ++++-------
3 files changed, 39 insertions(+), 36 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index a1a64758d30d..e4b6594d870e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1264,17 +1264,30 @@ intel_dp_mode_valid_downstream(struct intel_connector *connector,
return MODE_OK;
}
-bool intel_dp_need_joiner(struct intel_dp *intel_dp,
- struct intel_connector *connector,
- int hdisplay, int clock)
+static
+bool intel_dp_needs_bigjoiner(struct intel_dp *intel_dp,
+ struct intel_connector *connector,
+ int hdisplay, int clock)
{
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
if (!intel_dp_has_joiner(intel_dp))
return false;
- return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120 ||
- connector->force_joined_pipes == 2;
+ return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120;
+}
+
+int intel_dp_num_joined_pipes(struct intel_dp *intel_dp,
+ struct intel_connector *connector,
+ int hdisplay, int clock)
+{
+ if (connector->force_joined_pipes)
+ return connector->force_joined_pipes;
+
+ if (intel_dp_needs_bigjoiner(intel_dp, connector, hdisplay, clock))
+ return 2;
+
+ return 1;
}
bool intel_dp_has_dsc(const struct intel_connector *connector)
@@ -1311,7 +1324,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
u16 dsc_max_compressed_bpp = 0;
u8 dsc_slice_count = 0;
enum drm_mode_status status;
- bool dsc = false, joiner = false;
+ bool dsc = false;
int num_joined_pipes;
status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
@@ -1333,13 +1346,9 @@ intel_dp_mode_valid(struct drm_connector *_connector,
target_clock = fixed_mode->clock;
}
- if (intel_dp_need_joiner(intel_dp, connector,
- mode->hdisplay, target_clock)) {
- joiner = true;
- max_dotclk *= 2;
- }
-
- num_joined_pipes = joiner ? 2 : 1;
+ num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, connector,
+ mode->hdisplay, target_clock);
+ max_dotclk *= num_joined_pipes;
if (target_clock > max_dotclk)
return MODE_CLOCK_HIGH;
@@ -2507,12 +2516,11 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
!intel_dp_supports_fec(intel_dp, connector, pipe_config))
return -EINVAL;
- if (intel_dp_need_joiner(intel_dp, connector,
- adjusted_mode->crtc_hdisplay,
- adjusted_mode->crtc_clock))
- pipe_config->joiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
-
- num_joined_pipes = intel_crtc_num_joined_pipes(pipe_config);
+ num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, connector,
+ adjusted_mode->crtc_hdisplay,
+ adjusted_mode->crtc_clock);
+ if (num_joined_pipes > 1)
+ pipe_config->joiner_pipes = GENMASK(crtc->pipe + num_joined_pipes - 1, crtc->pipe);
joiner_needs_dsc = intel_dp_joiner_needs_dsc(i915, num_joined_pipes);
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index 3b869429e575..39a031996c64 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -151,9 +151,9 @@ int intel_dp_dsc_sink_max_compressed_bpp(const struct intel_connector *connector
u8 intel_dp_dsc_get_slice_count(const struct intel_connector *connector,
int mode_clock, int mode_hdisplay,
int num_joined_pipes);
-bool intel_dp_need_joiner(struct intel_dp *intel_dp,
- struct intel_connector *connector,
- int hdisplay, int clock);
+int intel_dp_num_joined_pipes(struct intel_dp *intel_dp,
+ struct intel_connector *connector,
+ int hdisplay, int clock);
static inline unsigned int intel_dp_unused_lane_mask(int lane_count)
{
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 732d7543ad06..9250e1b2f19c 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -581,12 +581,11 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
return -EINVAL;
- if (intel_dp_need_joiner(intel_dp, connector,
- adjusted_mode->crtc_hdisplay,
- adjusted_mode->crtc_clock))
- pipe_config->joiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
-
- num_joined_pipes = intel_crtc_num_joined_pipes(pipe_config);
+ num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, connector,
+ adjusted_mode->crtc_hdisplay,
+ adjusted_mode->crtc_clock);
+ if (num_joined_pipes > 1)
+ pipe_config->joiner_pipes = GENMASK(crtc->pipe + num_joined_pipes - 1, crtc->pipe);
pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
@@ -1428,7 +1427,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
int max_dotclk = to_i915(connector->dev)->display.cdclk.max_dotclk_freq;
int max_rate, mode_rate, max_lanes, max_link_clock;
int ret;
- bool dsc = false, joiner = false;
+ bool dsc = false;
u16 dsc_max_compressed_bpp = 0;
u8 dsc_slice_count = 0;
int target_clock = mode->clock;
@@ -1472,13 +1471,9 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
* corresponding link capabilities of the sink) in case the
* stream is uncompressed for it by the last branch device.
*/
- if (intel_dp_need_joiner(intel_dp, intel_connector,
- mode->hdisplay, target_clock)) {
- joiner = true;
- max_dotclk *= 2;
- }
-
- num_joined_pipes = joiner ? 2 : 1;
+ num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, intel_connector,
+ mode->hdisplay, target_clock);
+ max_dotclk *= num_joined_pipes;
ret = drm_modeset_lock(&mgr->base.lock, ctx);
if (ret)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH 05/16] drm/i915/display: Add debugfs support to avoid joiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (3 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 04/16] drm/i915/dp: Add helper to compute num pipes required Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:38 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 06/16] drm/i915: Split current joiner hw state readout Ankit Nautiyal
` (10 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Currently debugfs for joiner can take a value of 0->dont care and
2->join 2 pipes. Add option to force to use only 1 pipe.
If debugfs is set to 1, force to exactly one pipe (ie. no
joiner despite what the automagic logic is saying).
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_debugfs.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 80c499d642dc..af164e340cb3 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1344,6 +1344,8 @@ static ssize_t i915_joiner_write(struct file *file,
switch (force_joined_pipes) {
case 0:
break;
+ case 1:
+ fallthrough;
case 2:
connector->force_joined_pipes = force_joined_pipes;
break;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 05/16] drm/i915/display: Add debugfs support to avoid joiner
2024-09-23 18:13 ` [PATCH 05/16] drm/i915/display: Add debugfs support to avoid joiner Ankit Nautiyal
@ 2024-09-23 18:38 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:38 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:25PM +0530, Ankit Nautiyal wrote:
> Currently debugfs for joiner can take a value of 0->dont care and
> 2->join 2 pipes. Add option to force to use only 1 pipe.
>
> If debugfs is set to 1, force to exactly one pipe (ie. no
> joiner despite what the automagic logic is saying).
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display_debugfs.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 80c499d642dc..af164e340cb3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -1344,6 +1344,8 @@ static ssize_t i915_joiner_write(struct file *file,
> switch (force_joined_pipes) {
> case 0:
> break;
> + case 1:
> + fallthrough;
The 'fallthrough' is still redundant.
> case 2:
> connector->force_joined_pipes = force_joined_pipes;
> break;
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 06/16] drm/i915: Split current joiner hw state readout
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (4 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 05/16] drm/i915/display: Add debugfs support to avoid joiner Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 07/16] drm/i915: Add bigjoiner and uncompressed joiner hw readout sanity checks Ankit Nautiyal
` (9 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
We need to add a new sanity checks and also do
some preparations for adding ultrajoiner hw state readout.
Lets first split reading of the uncompressed joiner and bigjoiner
bit masks into separate functions.
v2: Fixed checkpatch warnings (Ankit)
v3: Use struct intel_display in the new functions. (Ankit)
v4: Use check for bigjoiner before reading the regs. (Ville)
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 74 +++++++++++++++-----
1 file changed, 55 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 7136c80ac8cc..d2c992259476 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -3580,26 +3580,57 @@ static bool transcoder_ddi_func_is_enabled(struct drm_i915_private *dev_priv,
return tmp & TRANS_DDI_FUNC_ENABLE;
}
-static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
- u8 *primary_pipes, u8 *secondary_pipes)
+static void enabled_uncompressed_joiner_pipes(struct intel_display *display,
+ u8 *primary_pipes, u8 *secondary_pipes)
{
+ struct drm_i915_private *i915 = to_i915(display->drm);
struct intel_crtc *crtc;
*primary_pipes = 0;
*secondary_pipes = 0;
- if (!HAS_BIGJOINER(dev_priv))
+ if (!HAS_UNCOMPRESSED_JOINER(display))
return;
- for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc,
- joiner_pipes(dev_priv)) {
+ for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc,
+ joiner_pipes(i915)) {
enum intel_display_power_domain power_domain;
enum pipe pipe = crtc->pipe;
intel_wakeref_t wakeref;
- power_domain = intel_dsc_power_domain(crtc, (enum transcoder) pipe);
- with_intel_display_power_if_enabled(dev_priv, power_domain, wakeref) {
- u32 tmp = intel_de_read(dev_priv, ICL_PIPE_DSS_CTL1(pipe));
+ power_domain = POWER_DOMAIN_PIPE(pipe);
+ with_intel_display_power_if_enabled(i915, power_domain, wakeref) {
+ u32 tmp = intel_de_read(display, ICL_PIPE_DSS_CTL1(pipe));
+
+ if (tmp & UNCOMPRESSED_JOINER_PRIMARY)
+ *primary_pipes |= BIT(pipe);
+ if (tmp & UNCOMPRESSED_JOINER_SECONDARY)
+ *secondary_pipes |= BIT(pipe);
+ }
+ }
+}
+
+static void enabled_bigjoiner_pipes(struct intel_display *display,
+ u8 *primary_pipes, u8 *secondary_pipes)
+{
+ struct drm_i915_private *i915 = to_i915(display->drm);
+ struct intel_crtc *crtc;
+
+ *primary_pipes = 0;
+ *secondary_pipes = 0;
+
+ if (!HAS_BIGJOINER(display))
+ return;
+
+ for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc,
+ joiner_pipes(i915)) {
+ enum intel_display_power_domain power_domain;
+ enum pipe pipe = crtc->pipe;
+ intel_wakeref_t wakeref;
+
+ power_domain = intel_dsc_power_domain(crtc, (enum transcoder)pipe);
+ with_intel_display_power_if_enabled(i915, power_domain, wakeref) {
+ u32 tmp = intel_de_read(display, ICL_PIPE_DSS_CTL1(pipe));
if (!(tmp & BIG_JOINER_ENABLE))
continue;
@@ -3609,20 +3640,25 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
else
*secondary_pipes |= BIT(pipe);
}
+ }
+}
- if (!HAS_UNCOMPRESSED_JOINER(dev_priv))
- continue;
+static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
+ u8 *primary_pipes, u8 *secondary_pipes)
+{
+ struct intel_display *display = to_intel_display(&dev_priv->drm);
+ u8 primary_uncompressed_joiner_pipes, primary_bigjoiner_pipes;
+ u8 secondary_uncompressed_joiner_pipes, secondary_bigjoiner_pipes;
- power_domain = POWER_DOMAIN_PIPE(pipe);
- with_intel_display_power_if_enabled(dev_priv, power_domain, wakeref) {
- u32 tmp = intel_de_read(dev_priv, ICL_PIPE_DSS_CTL1(pipe));
+ enabled_uncompressed_joiner_pipes(display, &primary_uncompressed_joiner_pipes,
+ &secondary_uncompressed_joiner_pipes);
- if (tmp & UNCOMPRESSED_JOINER_PRIMARY)
- *primary_pipes |= BIT(pipe);
- if (tmp & UNCOMPRESSED_JOINER_SECONDARY)
- *secondary_pipes |= BIT(pipe);
- }
- }
+ enabled_bigjoiner_pipes(display, &primary_bigjoiner_pipes,
+ &secondary_bigjoiner_pipes);
+
+ *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes;
+
+ *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes;
/* Joiner pipes should always be consecutive primary and secondary */
drm_WARN(&dev_priv->drm, *secondary_pipes != *primary_pipes << 1,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH 07/16] drm/i915: Add bigjoiner and uncompressed joiner hw readout sanity checks
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (5 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 06/16] drm/i915: Split current joiner hw state readout Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 08/16] drm/i915/display: Add macro HAS_ULTRAJOINER() Ankit Nautiyal
` (8 subsequent siblings)
15 siblings, 0 replies; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Add sanity checks for primary and secondary bigjoiner/uncompressed
bitmasks, should make it easier to spot possible issues.
v2:
-Streamline the expected masks and add few more drm_WARNs. (Ville)
-Use %#x format specifier for printing joiner masks. (Ville)
-Use struct intel_display instead of struct drm_i915_private. (Ankit)
v3:
-Rename helper to get expected uncompressed joiner pipes. (Ville)
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com> (v1)
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 51 +++++++++++++++++++-
1 file changed, 49 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index d2c992259476..ee57e1e544af 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -3643,26 +3643,73 @@ static void enabled_bigjoiner_pipes(struct intel_display *display,
}
}
+static u8 expected_secondary_pipes(u8 primary_pipes, int num_pipes)
+{
+ u8 secondary_pipes = 0;
+
+ for (int i = 1; i < num_pipes; i++)
+ secondary_pipes |= primary_pipes << i;
+
+ return secondary_pipes;
+}
+
+static u8 expected_uncompressed_joiner_secondary_pipes(u8 uncompjoiner_primary_pipes)
+{
+ return expected_secondary_pipes(uncompjoiner_primary_pipes, 2);
+}
+
+static u8 expected_bigjoiner_secondary_pipes(u8 bigjoiner_primary_pipes)
+{
+ return expected_secondary_pipes(bigjoiner_primary_pipes, 2);
+}
+
static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
u8 *primary_pipes, u8 *secondary_pipes)
{
struct intel_display *display = to_intel_display(&dev_priv->drm);
u8 primary_uncompressed_joiner_pipes, primary_bigjoiner_pipes;
u8 secondary_uncompressed_joiner_pipes, secondary_bigjoiner_pipes;
+ u8 uncompressed_joiner_pipes, bigjoiner_pipes;
enabled_uncompressed_joiner_pipes(display, &primary_uncompressed_joiner_pipes,
&secondary_uncompressed_joiner_pipes);
+ drm_WARN_ON(display->drm,
+ (primary_uncompressed_joiner_pipes & secondary_uncompressed_joiner_pipes) != 0);
+
enabled_bigjoiner_pipes(display, &primary_bigjoiner_pipes,
&secondary_bigjoiner_pipes);
+ drm_WARN_ON(display->drm,
+ (primary_bigjoiner_pipes & secondary_bigjoiner_pipes) != 0);
+
+ uncompressed_joiner_pipes = primary_uncompressed_joiner_pipes |
+ secondary_uncompressed_joiner_pipes;
+ bigjoiner_pipes = primary_bigjoiner_pipes | secondary_bigjoiner_pipes;
+
+ drm_WARN(display->drm, (uncompressed_joiner_pipes & bigjoiner_pipes) != 0,
+ "Uncomressed joiner pipes(%#x) and bigjoiner pipes(%#x) can't intersect\n",
+ uncompressed_joiner_pipes, bigjoiner_pipes);
+
+ drm_WARN(display->drm, secondary_bigjoiner_pipes !=
+ expected_bigjoiner_secondary_pipes(primary_bigjoiner_pipes),
+ "Wrong secondary bigjoiner pipes(expected %#x, current %#x)\n",
+ expected_bigjoiner_secondary_pipes(primary_bigjoiner_pipes),
+ secondary_bigjoiner_pipes);
+
+ drm_WARN(display->drm, secondary_uncompressed_joiner_pipes !=
+ expected_uncompressed_joiner_secondary_pipes(primary_uncompressed_joiner_pipes),
+ "Wrong secondary uncompressed joiner pipes(expected %#x, current %#x)\n",
+ expected_uncompressed_joiner_secondary_pipes(primary_uncompressed_joiner_pipes),
+ secondary_uncompressed_joiner_pipes);
+
*primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes;
*secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes;
/* Joiner pipes should always be consecutive primary and secondary */
- drm_WARN(&dev_priv->drm, *secondary_pipes != *primary_pipes << 1,
- "Joiner misconfigured (primary pipes 0x%x, secondary pipes 0x%x)\n",
+ drm_WARN(display->drm, *secondary_pipes != *primary_pipes << 1,
+ "Joiner misconfigured (primary pipes %#x, secondary pipes %#x)\n",
*primary_pipes, *secondary_pipes);
}
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH 08/16] drm/i915/display: Add macro HAS_ULTRAJOINER()
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (6 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 07/16] drm/i915: Add bigjoiner and uncompressed joiner hw readout sanity checks Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:39 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 09/16] drm/i915: Implement hw state readout and checks for ultrajoiner Ankit Nautiyal
` (7 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Add macro to check if platform supports Ultrajoiner.
v2:
-Use check for DISPLAY_VER >= 20, and add bmg as a special case. (Ville)
-Add check for HAS_DSC. (Ville)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_device.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
index 6a5bee59e6aa..220cca6333ee 100644
--- a/drivers/gpu/drm/i915/display/intel_display_device.h
+++ b/drivers/gpu/drm/i915/display/intel_display_device.h
@@ -154,6 +154,9 @@ enum intel_display_subplatform {
#define HAS_TRANSCODER(i915, trans) ((DISPLAY_RUNTIME_INFO(i915)->cpu_transcoder_mask & \
BIT(trans)) != 0)
#define HAS_UNCOMPRESSED_JOINER(i915) (DISPLAY_VER(i915) >= 13)
+#define HAS_ULTRAJOINER(i915) ((DISPLAY_VER(i915) >= 20 || \
+ (IS_DGFX(i915) && DISPLAY_VER(i915) == 14)) && \
+ HAS_DSC(i915))
#define HAS_VRR(i915) (DISPLAY_VER(i915) >= 11)
#define HAS_AS_SDP(i915) (DISPLAY_VER(i915) >= 13)
#define HAS_CMRR(i915) (DISPLAY_VER(i915) >= 20)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 08/16] drm/i915/display: Add macro HAS_ULTRAJOINER()
2024-09-23 18:13 ` [PATCH 08/16] drm/i915/display: Add macro HAS_ULTRAJOINER() Ankit Nautiyal
@ 2024-09-23 18:39 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:39 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:28PM +0530, Ankit Nautiyal wrote:
> Add macro to check if platform supports Ultrajoiner.
>
> v2:
> -Use check for DISPLAY_VER >= 20, and add bmg as a special case. (Ville)
> -Add check for HAS_DSC. (Ville)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display_device.h | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
> index 6a5bee59e6aa..220cca6333ee 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.h
> @@ -154,6 +154,9 @@ enum intel_display_subplatform {
> #define HAS_TRANSCODER(i915, trans) ((DISPLAY_RUNTIME_INFO(i915)->cpu_transcoder_mask & \
> BIT(trans)) != 0)
> #define HAS_UNCOMPRESSED_JOINER(i915) (DISPLAY_VER(i915) >= 13)
> +#define HAS_ULTRAJOINER(i915) ((DISPLAY_VER(i915) >= 20 || \
> + (IS_DGFX(i915) && DISPLAY_VER(i915) == 14)) && \
> + HAS_DSC(i915))
> #define HAS_VRR(i915) (DISPLAY_VER(i915) >= 11)
> #define HAS_AS_SDP(i915) (DISPLAY_VER(i915) >= 13)
> #define HAS_CMRR(i915) (DISPLAY_VER(i915) >= 20)
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 09/16] drm/i915: Implement hw state readout and checks for ultrajoiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (7 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 08/16] drm/i915/display: Add macro HAS_ULTRAJOINER() Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:44 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 10/16] drm/i915/display: Refactor enable_joiner_pipes Ankit Nautiyal
` (6 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Ultrajoiner mode has some new bits and states to be
read out from the hw. Lets make changes accordingly.
v2: Fix checkpatch warnings. (Ankit)
v3: Add separate functions for computing expected secondary_big/ultrajoiner
pipes. (Ankit)
v4:
-Streamline the helpers for ultrajoiner. (Ville)
-Add fixup to accommodate PIPED check for ultrajoiner. (Ville)
-Add more Ultrajoiner drm_WARNs. (Ville)
v5: Remove spurious newline. (Ville)
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 87 ++++++++++++++++---
.../gpu/drm/i915/display/intel_vdsc_regs.h | 2 +
2 files changed, 79 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index ee57e1e544af..c42ba377d247 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -3663,13 +3663,58 @@ static u8 expected_bigjoiner_secondary_pipes(u8 bigjoiner_primary_pipes)
return expected_secondary_pipes(bigjoiner_primary_pipes, 2);
}
+static u8 expected_ultrajoiner_secondary_pipes(u8 ultrajoiner_primary_pipes)
+{
+ return expected_secondary_pipes(ultrajoiner_primary_pipes, 4);
+}
+
+static u8 fixup_ultrajoiner_secondary_pipes(u8 ultrajoiner_primary_pipes,
+ u8 ultrajoiner_secondary_pipes)
+{
+ return ultrajoiner_secondary_pipes | ultrajoiner_primary_pipes << 3;
+}
+
+static void enabled_ultrajoiner_pipes(struct drm_i915_private *i915,
+ u8 *primary_pipes, u8 *secondary_pipes)
+{
+ struct intel_crtc *crtc;
+
+ *primary_pipes = 0;
+ *secondary_pipes = 0;
+
+ if (!HAS_ULTRAJOINER(i915))
+ return;
+
+ for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc,
+ joiner_pipes(i915)) {
+ enum intel_display_power_domain power_domain;
+ enum pipe pipe = crtc->pipe;
+ intel_wakeref_t wakeref;
+
+ power_domain = intel_dsc_power_domain(crtc, (enum transcoder)pipe);
+ with_intel_display_power_if_enabled(i915, power_domain, wakeref) {
+ u32 tmp = intel_de_read(i915, ICL_PIPE_DSS_CTL1(pipe));
+
+ if (!(tmp & ULTRA_JOINER_ENABLE))
+ continue;
+
+ if (tmp & PRIMARY_ULTRA_JOINER_ENABLE)
+ *primary_pipes |= BIT(pipe);
+ else
+ *secondary_pipes |= BIT(pipe);
+ }
+ }
+}
+
static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
u8 *primary_pipes, u8 *secondary_pipes)
{
struct intel_display *display = to_intel_display(&dev_priv->drm);
u8 primary_uncompressed_joiner_pipes, primary_bigjoiner_pipes;
+ u8 primary_ultrajoiner_pipes;
u8 secondary_uncompressed_joiner_pipes, secondary_bigjoiner_pipes;
- u8 uncompressed_joiner_pipes, bigjoiner_pipes;
+ u8 secondary_ultrajoiner_pipes;
+ u8 uncompressed_joiner_pipes, bigjoiner_pipes, ultrajoiner_pipes;
enabled_uncompressed_joiner_pipes(display, &primary_uncompressed_joiner_pipes,
&secondary_uncompressed_joiner_pipes);
@@ -3683,14 +3728,35 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
drm_WARN_ON(display->drm,
(primary_bigjoiner_pipes & secondary_bigjoiner_pipes) != 0);
+ enabled_ultrajoiner_pipes(dev_priv, &primary_ultrajoiner_pipes,
+ &secondary_ultrajoiner_pipes);
+ /*
+ * For some strange reason the last pipe in the set of four
+ * shouldn't have ultrajoiner enable bit set in hardware.
+ * Set the bit anyway to make life easier.
+ */
+ drm_WARN_ON(&dev_priv->drm,
+ expected_secondary_pipes(primary_ultrajoiner_pipes, 3) !=
+ secondary_ultrajoiner_pipes);
+ secondary_ultrajoiner_pipes =
+ fixup_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes,
+ secondary_ultrajoiner_pipes);
+
+ drm_WARN_ON(&dev_priv->drm, (primary_ultrajoiner_pipes & secondary_ultrajoiner_pipes) != 0);
+
uncompressed_joiner_pipes = primary_uncompressed_joiner_pipes |
secondary_uncompressed_joiner_pipes;
bigjoiner_pipes = primary_bigjoiner_pipes | secondary_bigjoiner_pipes;
+ ultrajoiner_pipes = primary_ultrajoiner_pipes | secondary_ultrajoiner_pipes;
drm_WARN(display->drm, (uncompressed_joiner_pipes & bigjoiner_pipes) != 0,
"Uncomressed joiner pipes(%#x) and bigjoiner pipes(%#x) can't intersect\n",
uncompressed_joiner_pipes, bigjoiner_pipes);
+ drm_WARN(display->drm, (ultrajoiner_pipes & bigjoiner_pipes) != ultrajoiner_pipes,
+ "Ultrajoiner pipes(%#x) should be bigjoiner pipes(%#x)\n",
+ ultrajoiner_pipes, bigjoiner_pipes);
+
drm_WARN(display->drm, secondary_bigjoiner_pipes !=
expected_bigjoiner_secondary_pipes(primary_bigjoiner_pipes),
"Wrong secondary bigjoiner pipes(expected %#x, current %#x)\n",
@@ -3702,15 +3768,16 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
"Wrong secondary uncompressed joiner pipes(expected %#x, current %#x)\n",
expected_uncompressed_joiner_secondary_pipes(primary_uncompressed_joiner_pipes),
secondary_uncompressed_joiner_pipes);
-
- *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes;
-
- *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes;
-
- /* Joiner pipes should always be consecutive primary and secondary */
- drm_WARN(display->drm, *secondary_pipes != *primary_pipes << 1,
- "Joiner misconfigured (primary pipes %#x, secondary pipes %#x)\n",
- *primary_pipes, *secondary_pipes);
+ drm_WARN(display->drm, secondary_ultrajoiner_pipes !=
+ expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes),
+ "Wrong secondary ultrajoiner pipes(expected %x, current %x)\n",
+ expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes),
+ secondary_ultrajoiner_pipes);
+
+ *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes |
+ primary_ultrajoiner_pipes;
+ *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes |
+ secondary_ultrajoiner_pipes;
}
static enum pipe get_joiner_primary_pipe(enum pipe pipe, u8 primary_pipes, u8 secondary_pipes)
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc_regs.h b/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
index f921ad67b587..bf32a3b46fb1 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
@@ -37,6 +37,8 @@
#define SPLITTER_CONFIGURATION_MASK REG_GENMASK(26, 25)
#define SPLITTER_CONFIGURATION_2_SEGMENT REG_FIELD_PREP(SPLITTER_CONFIGURATION_MASK, 0)
#define SPLITTER_CONFIGURATION_4_SEGMENT REG_FIELD_PREP(SPLITTER_CONFIGURATION_MASK, 1)
+#define ULTRA_JOINER_ENABLE REG_BIT(23)
+#define PRIMARY_ULTRA_JOINER_ENABLE REG_BIT(22)
#define UNCOMPRESSED_JOINER_PRIMARY (1 << 21)
#define UNCOMPRESSED_JOINER_SECONDARY (1 << 20)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 09/16] drm/i915: Implement hw state readout and checks for ultrajoiner
2024-09-23 18:13 ` [PATCH 09/16] drm/i915: Implement hw state readout and checks for ultrajoiner Ankit Nautiyal
@ 2024-09-23 18:44 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:44 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:29PM +0530, Ankit Nautiyal wrote:
> From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
>
> Ultrajoiner mode has some new bits and states to be
> read out from the hw. Lets make changes accordingly.
>
> v2: Fix checkpatch warnings. (Ankit)
> v3: Add separate functions for computing expected secondary_big/ultrajoiner
> pipes. (Ankit)
> v4:
> -Streamline the helpers for ultrajoiner. (Ville)
> -Add fixup to accommodate PIPED check for ultrajoiner. (Ville)
> -Add more Ultrajoiner drm_WARNs. (Ville)
> v5: Remove spurious newline. (Ville)
>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 87 ++++++++++++++++---
> .../gpu/drm/i915/display/intel_vdsc_regs.h | 2 +
> 2 files changed, 79 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index ee57e1e544af..c42ba377d247 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -3663,13 +3663,58 @@ static u8 expected_bigjoiner_secondary_pipes(u8 bigjoiner_primary_pipes)
> return expected_secondary_pipes(bigjoiner_primary_pipes, 2);
> }
>
> +static u8 expected_ultrajoiner_secondary_pipes(u8 ultrajoiner_primary_pipes)
> +{
> + return expected_secondary_pipes(ultrajoiner_primary_pipes, 4);
> +}
> +
> +static u8 fixup_ultrajoiner_secondary_pipes(u8 ultrajoiner_primary_pipes,
> + u8 ultrajoiner_secondary_pipes)
> +{
> + return ultrajoiner_secondary_pipes | ultrajoiner_primary_pipes << 3;
> +}
> +
> +static void enabled_ultrajoiner_pipes(struct drm_i915_private *i915,
> + u8 *primary_pipes, u8 *secondary_pipes)
> +{
> + struct intel_crtc *crtc;
> +
> + *primary_pipes = 0;
> + *secondary_pipes = 0;
> +
> + if (!HAS_ULTRAJOINER(i915))
> + return;
> +
> + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc,
> + joiner_pipes(i915)) {
> + enum intel_display_power_domain power_domain;
> + enum pipe pipe = crtc->pipe;
> + intel_wakeref_t wakeref;
> +
> + power_domain = intel_dsc_power_domain(crtc, (enum transcoder)pipe);
> + with_intel_display_power_if_enabled(i915, power_domain, wakeref) {
> + u32 tmp = intel_de_read(i915, ICL_PIPE_DSS_CTL1(pipe));
> +
> + if (!(tmp & ULTRA_JOINER_ENABLE))
> + continue;
> +
> + if (tmp & PRIMARY_ULTRA_JOINER_ENABLE)
> + *primary_pipes |= BIT(pipe);
> + else
> + *secondary_pipes |= BIT(pipe);
> + }
> + }
> +}
> +
> static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
> u8 *primary_pipes, u8 *secondary_pipes)
> {
> struct intel_display *display = to_intel_display(&dev_priv->drm);
> u8 primary_uncompressed_joiner_pipes, primary_bigjoiner_pipes;
> + u8 primary_ultrajoiner_pipes;
> u8 secondary_uncompressed_joiner_pipes, secondary_bigjoiner_pipes;
> - u8 uncompressed_joiner_pipes, bigjoiner_pipes;
> + u8 secondary_ultrajoiner_pipes;
> + u8 uncompressed_joiner_pipes, bigjoiner_pipes, ultrajoiner_pipes;
>
> enabled_uncompressed_joiner_pipes(display, &primary_uncompressed_joiner_pipes,
> &secondary_uncompressed_joiner_pipes);
> @@ -3683,14 +3728,35 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
> drm_WARN_ON(display->drm,
> (primary_bigjoiner_pipes & secondary_bigjoiner_pipes) != 0);
>
> + enabled_ultrajoiner_pipes(dev_priv, &primary_ultrajoiner_pipes,
> + &secondary_ultrajoiner_pipes);
> + /*
> + * For some strange reason the last pipe in the set of four
> + * shouldn't have ultrajoiner enable bit set in hardware.
> + * Set the bit anyway to make life easier.
> + */
> + drm_WARN_ON(&dev_priv->drm,
> + expected_secondary_pipes(primary_ultrajoiner_pipes, 3) !=
> + secondary_ultrajoiner_pipes);
> + secondary_ultrajoiner_pipes =
> + fixup_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes,
> + secondary_ultrajoiner_pipes);
> +
> + drm_WARN_ON(&dev_priv->drm, (primary_ultrajoiner_pipes & secondary_ultrajoiner_pipes) != 0);
> +
> uncompressed_joiner_pipes = primary_uncompressed_joiner_pipes |
> secondary_uncompressed_joiner_pipes;
> bigjoiner_pipes = primary_bigjoiner_pipes | secondary_bigjoiner_pipes;
> + ultrajoiner_pipes = primary_ultrajoiner_pipes | secondary_ultrajoiner_pipes;
>
> drm_WARN(display->drm, (uncompressed_joiner_pipes & bigjoiner_pipes) != 0,
> "Uncomressed joiner pipes(%#x) and bigjoiner pipes(%#x) can't intersect\n",
> uncompressed_joiner_pipes, bigjoiner_pipes);
>
> + drm_WARN(display->drm, (ultrajoiner_pipes & bigjoiner_pipes) != ultrajoiner_pipes,
> + "Ultrajoiner pipes(%#x) should be bigjoiner pipes(%#x)\n",
> + ultrajoiner_pipes, bigjoiner_pipes);
> +
> drm_WARN(display->drm, secondary_bigjoiner_pipes !=
> expected_bigjoiner_secondary_pipes(primary_bigjoiner_pipes),
> "Wrong secondary bigjoiner pipes(expected %#x, current %#x)\n",
> @@ -3702,15 +3768,16 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
> "Wrong secondary uncompressed joiner pipes(expected %#x, current %#x)\n",
> expected_uncompressed_joiner_secondary_pipes(primary_uncompressed_joiner_pipes),
> secondary_uncompressed_joiner_pipes);
> -
> - *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes;
> -
> - *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes;
> -
> - /* Joiner pipes should always be consecutive primary and secondary */
> - drm_WARN(display->drm, *secondary_pipes != *primary_pipes << 1,
> - "Joiner misconfigured (primary pipes %#x, secondary pipes %#x)\n",
> - *primary_pipes, *secondary_pipes);
> + drm_WARN(display->drm, secondary_ultrajoiner_pipes !=
> + expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes),
> + "Wrong secondary ultrajoiner pipes(expected %x, current %x)\n",
> + expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes),
> + secondary_ultrajoiner_pipes);
> +
> + *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes |
> + primary_ultrajoiner_pipes;
> + *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes |
> + secondary_ultrajoiner_pipes;
I think these masks will turn to utter nonsense if ultrajoiner
is enabled. So we really need to adjust how we derive the
final primary/secondary pipes *before* we add ultrajoiner into
the mix. Looks like you have that stuff in the next patch, so
you should reverse these two patches.
> }
>
> static enum pipe get_joiner_primary_pipe(enum pipe pipe, u8 primary_pipes, u8 secondary_pipes)
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc_regs.h b/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
> index f921ad67b587..bf32a3b46fb1 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
> @@ -37,6 +37,8 @@
> #define SPLITTER_CONFIGURATION_MASK REG_GENMASK(26, 25)
> #define SPLITTER_CONFIGURATION_2_SEGMENT REG_FIELD_PREP(SPLITTER_CONFIGURATION_MASK, 0)
> #define SPLITTER_CONFIGURATION_4_SEGMENT REG_FIELD_PREP(SPLITTER_CONFIGURATION_MASK, 1)
> +#define ULTRA_JOINER_ENABLE REG_BIT(23)
> +#define PRIMARY_ULTRA_JOINER_ENABLE REG_BIT(22)
> #define UNCOMPRESSED_JOINER_PRIMARY (1 << 21)
> #define UNCOMPRESSED_JOINER_SECONDARY (1 << 20)
>
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 10/16] drm/i915/display: Refactor enable_joiner_pipes
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (8 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 09/16] drm/i915: Implement hw state readout and checks for ultrajoiner Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:52 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 11/16] drm/i915/display/vdsc: Add ultrajoiner support with DSC Ankit Nautiyal
` (5 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Pass the current pipe into enabled_joiner_pipes(), and let it figure out
the proper bitmasks for us.
v2:
-Simplify helper get_joiner_primary_pipes. (Ville)
-Nuke get_joiner_secondary_pipes. (Ville)
-Add more drm_WARNs and checks for final primary/secondary pipes.
(Ville)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 85 +++++++++++---------
1 file changed, 48 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index c42ba377d247..f35d1e1fdb8a 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -3706,7 +3706,14 @@ static void enabled_ultrajoiner_pipes(struct drm_i915_private *i915,
}
}
-static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
+static u8 get_joiner_primary_pipe(enum pipe pipe, u8 primary_pipes)
+{
+ primary_pipes &= GENMASK(pipe, 0);
+
+ return primary_pipes ? BIT(fls(primary_pipes) - 1) : 0;
+}
+
+static void enabled_joiner_pipes(struct drm_i915_private *dev_priv, enum pipe pipe,
u8 *primary_pipes, u8 *secondary_pipes)
{
struct intel_display *display = to_intel_display(&dev_priv->drm);
@@ -3774,41 +3781,47 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes),
secondary_ultrajoiner_pipes);
- *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes |
- primary_ultrajoiner_pipes;
- *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes |
- secondary_ultrajoiner_pipes;
-}
-
-static enum pipe get_joiner_primary_pipe(enum pipe pipe, u8 primary_pipes, u8 secondary_pipes)
-{
- if ((secondary_pipes & BIT(pipe)) == 0)
- return pipe;
-
- /* ignore everything above our pipe */
- primary_pipes &= ~GENMASK(7, pipe);
-
- /* highest remaining bit should be our primary pipe */
- return fls(primary_pipes) - 1;
-}
+ *primary_pipes = 0;
+ *secondary_pipes = 0;
-static u8 get_joiner_secondary_pipes(enum pipe pipe, u8 primary_pipes, u8 secondary_pipes)
-{
- enum pipe primary_pipe, next_primary_pipe;
+ if (ultrajoiner_pipes & BIT(pipe)) {
+ *primary_pipes = get_joiner_primary_pipe(pipe, primary_ultrajoiner_pipes);
+ *secondary_pipes = secondary_ultrajoiner_pipes &
+ expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes);
+ return;
+ }
- primary_pipe = get_joiner_primary_pipe(pipe, primary_pipes, secondary_pipes);
+ if (uncompressed_joiner_pipes & BIT(pipe)) {
+ *primary_pipes = get_joiner_primary_pipe(pipe, primary_uncompressed_joiner_pipes);
+ *secondary_pipes =
+ secondary_uncompressed_joiner_pipes &
+ expected_uncompressed_joiner_secondary_pipes(primary_uncompressed_joiner_pipes);
+ } else if (bigjoiner_pipes & BIT(pipe)) {
+ *primary_pipes = get_joiner_primary_pipe(pipe, primary_bigjoiner_pipes);
+ *secondary_pipes = secondary_bigjoiner_pipes &
+ expected_bigjoiner_secondary_pipes(primary_bigjoiner_pipes);
+ }
- if ((primary_pipes & BIT(primary_pipe)) == 0)
- return 0;
+ drm_WARN(display->drm,
+ expected_bigjoiner_secondary_pipes(*primary_pipes) != *secondary_pipes,
+ "Wrong bigjoiner secondary pipes for primary_pipes %#x (expected %#x, current %#x for)\n",
+ *primary_pipes,
+ expected_bigjoiner_secondary_pipes(*primary_pipes),
+ *secondary_pipes);
- /* ignore our primary pipe and everything below it */
- primary_pipes &= ~GENMASK(primary_pipe, 0);
- /* make sure a high bit is set for the ffs() */
- primary_pipes |= BIT(7);
- /* lowest remaining bit should be the next primary pipe */
- next_primary_pipe = ffs(primary_pipes) - 1;
+ drm_WARN(display->drm,
+ expected_uncompressed_joiner_secondary_pipes(*primary_pipes) != *secondary_pipes,
+ "Wrong uncompressed joiner secondary pipes for primary_pipes %#x (expected %#x, current %#x for)\n",
+ *primary_pipes,
+ expected_uncompressed_joiner_secondary_pipes(*primary_pipes),
+ *secondary_pipes);
- return secondary_pipes & GENMASK(next_primary_pipe - 1, primary_pipe);
+ drm_WARN(display->drm,
+ expected_ultrajoiner_secondary_pipes(*primary_pipes) != *secondary_pipes,
+ "Wrong ultrajoiner secondary pipes for primary_pipes %#x (expected %#x, current %#x for)\n",
+ *primary_pipes,
+ expected_ultrajoiner_secondary_pipes(*primary_pipes),
+ *secondary_pipes);
}
static u8 hsw_panel_transcoders(struct drm_i915_private *i915)
@@ -3880,10 +3893,10 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
enabled_transcoders |= BIT(cpu_transcoder);
/* joiner secondary -> consider the primary pipe's transcoder as well */
- enabled_joiner_pipes(dev_priv, &primary_pipes, &secondary_pipes);
+ enabled_joiner_pipes(dev_priv, crtc->pipe, &primary_pipes, &secondary_pipes);
if (secondary_pipes & BIT(crtc->pipe)) {
cpu_transcoder = (enum transcoder)
- get_joiner_primary_pipe(crtc->pipe, primary_pipes, secondary_pipes);
+ ffs(get_joiner_primary_pipe(crtc->pipe, primary_pipes)) - 1;
if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
enabled_transcoders |= BIT(cpu_transcoder);
}
@@ -4017,14 +4030,12 @@ static void intel_joiner_get_config(struct intel_crtc_state *crtc_state)
u8 primary_pipes, secondary_pipes;
enum pipe pipe = crtc->pipe;
- enabled_joiner_pipes(i915, &primary_pipes, &secondary_pipes);
+ enabled_joiner_pipes(i915, pipe, &primary_pipes, &secondary_pipes);
if (((primary_pipes | secondary_pipes) & BIT(pipe)) == 0)
return;
- crtc_state->joiner_pipes =
- BIT(get_joiner_primary_pipe(pipe, primary_pipes, secondary_pipes)) |
- get_joiner_secondary_pipes(pipe, primary_pipes, secondary_pipes);
+ crtc_state->joiner_pipes = primary_pipes | secondary_pipes;
}
static bool hsw_get_pipe_config(struct intel_crtc *crtc,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 10/16] drm/i915/display: Refactor enable_joiner_pipes
2024-09-23 18:13 ` [PATCH 10/16] drm/i915/display: Refactor enable_joiner_pipes Ankit Nautiyal
@ 2024-09-23 18:52 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:52 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:30PM +0530, Ankit Nautiyal wrote:
> Pass the current pipe into enabled_joiner_pipes(), and let it figure out
> the proper bitmasks for us.
>
> v2:
> -Simplify helper get_joiner_primary_pipes. (Ville)
> -Nuke get_joiner_secondary_pipes. (Ville)
> -Add more drm_WARNs and checks for final primary/secondary pipes.
> (Ville)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 85 +++++++++++---------
> 1 file changed, 48 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index c42ba377d247..f35d1e1fdb8a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -3706,7 +3706,14 @@ static void enabled_ultrajoiner_pipes(struct drm_i915_private *i915,
> }
> }
>
> -static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
> +static u8 get_joiner_primary_pipe(enum pipe pipe, u8 primary_pipes)
> +{
> + primary_pipes &= GENMASK(pipe, 0);
> +
> + return primary_pipes ? BIT(fls(primary_pipes) - 1) : 0;
> +}
> +
> +static void enabled_joiner_pipes(struct drm_i915_private *dev_priv, enum pipe pipe,
> u8 *primary_pipes, u8 *secondary_pipes)
> {
> struct intel_display *display = to_intel_display(&dev_priv->drm);
> @@ -3774,41 +3781,47 @@ static void enabled_joiner_pipes(struct drm_i915_private *dev_priv,
> expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes),
> secondary_ultrajoiner_pipes);
>
> - *primary_pipes = primary_uncompressed_joiner_pipes | primary_bigjoiner_pipes |
> - primary_ultrajoiner_pipes;
> - *secondary_pipes = secondary_uncompressed_joiner_pipes | secondary_bigjoiner_pipes |
> - secondary_ultrajoiner_pipes;
> -}
> -
> -static enum pipe get_joiner_primary_pipe(enum pipe pipe, u8 primary_pipes, u8 secondary_pipes)
> -{
> - if ((secondary_pipes & BIT(pipe)) == 0)
> - return pipe;
> -
> - /* ignore everything above our pipe */
> - primary_pipes &= ~GENMASK(7, pipe);
> -
> - /* highest remaining bit should be our primary pipe */
> - return fls(primary_pipes) - 1;
> -}
> + *primary_pipes = 0;
> + *secondary_pipes = 0;
>
> -static u8 get_joiner_secondary_pipes(enum pipe pipe, u8 primary_pipes, u8 secondary_pipes)
> -{
> - enum pipe primary_pipe, next_primary_pipe;
> + if (ultrajoiner_pipes & BIT(pipe)) {
> + *primary_pipes = get_joiner_primary_pipe(pipe, primary_ultrajoiner_pipes);
> + *secondary_pipes = secondary_ultrajoiner_pipes &
> + expected_ultrajoiner_secondary_pipes(primary_ultrajoiner_pipes);
^^^^^^^^^^^^^^^^^^^^^^^^^
That should be '*primary_pipes'.
This branch is missing the final WARN_ON you have in the
bigjoiner uncompressed joiner branches below.
> + return;
> + }
>
> - primary_pipe = get_joiner_primary_pipe(pipe, primary_pipes, secondary_pipes);
> + if (uncompressed_joiner_pipes & BIT(pipe)) {
> + *primary_pipes = get_joiner_primary_pipe(pipe, primary_uncompressed_joiner_pipes);
> + *secondary_pipes =
> + secondary_uncompressed_joiner_pipes &
> + expected_uncompressed_joiner_secondary_pipes(primary_uncompressed_joiner_pipes);
> + } else if (bigjoiner_pipes & BIT(pipe)) {
> + *primary_pipes = get_joiner_primary_pipe(pipe, primary_bigjoiner_pipes);
> + *secondary_pipes = secondary_bigjoiner_pipes &
> + expected_bigjoiner_secondary_pipes(primary_bigjoiner_pipes);
Same '*primary_pipes' thing in these two.
> + }
I would probably get rid of the if-else construct here, and just
handle each joiner type completely independently, just like ultrajoiner
above. Makes the code more regular and thus easier to reason about.
>
> - if ((primary_pipes & BIT(primary_pipe)) == 0)
> - return 0;
> + drm_WARN(display->drm,
> + expected_bigjoiner_secondary_pipes(*primary_pipes) != *secondary_pipes,
> + "Wrong bigjoiner secondary pipes for primary_pipes %#x (expected %#x, current %#x for)\n",
> + *primary_pipes,
> + expected_bigjoiner_secondary_pipes(*primary_pipes),
> + *secondary_pipes);
>
> - /* ignore our primary pipe and everything below it */
> - primary_pipes &= ~GENMASK(primary_pipe, 0);
> - /* make sure a high bit is set for the ffs() */
> - primary_pipes |= BIT(7);
> - /* lowest remaining bit should be the next primary pipe */
> - next_primary_pipe = ffs(primary_pipes) - 1;
> + drm_WARN(display->drm,
> + expected_uncompressed_joiner_secondary_pipes(*primary_pipes) != *secondary_pipes,
> + "Wrong uncompressed joiner secondary pipes for primary_pipes %#x (expected %#x, current %#x for)\n",
> + *primary_pipes,
> + expected_uncompressed_joiner_secondary_pipes(*primary_pipes),
> + *secondary_pipes);
>
> - return secondary_pipes & GENMASK(next_primary_pipe - 1, primary_pipe);
> + drm_WARN(display->drm,
> + expected_ultrajoiner_secondary_pipes(*primary_pipes) != *secondary_pipes,
> + "Wrong ultrajoiner secondary pipes for primary_pipes %#x (expected %#x, current %#x for)\n",
> + *primary_pipes,
> + expected_ultrajoiner_secondary_pipes(*primary_pipes),
> + *secondary_pipes);
I'm not quite sure what's happening here. We already bailed out for
ultrajoiner earlier.
The patch is pretty hard to read. Did you try --patience vs. not when
generating it in case one or the other makes for a more readalbe end
result?
> }
>
> static u8 hsw_panel_transcoders(struct drm_i915_private *i915)
> @@ -3880,10 +3893,10 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
> enabled_transcoders |= BIT(cpu_transcoder);
>
> /* joiner secondary -> consider the primary pipe's transcoder as well */
> - enabled_joiner_pipes(dev_priv, &primary_pipes, &secondary_pipes);
> + enabled_joiner_pipes(dev_priv, crtc->pipe, &primary_pipes, &secondary_pipes);
> if (secondary_pipes & BIT(crtc->pipe)) {
> cpu_transcoder = (enum transcoder)
> - get_joiner_primary_pipe(crtc->pipe, primary_pipes, secondary_pipes);
> + ffs(get_joiner_primary_pipe(crtc->pipe, primary_pipes)) - 1;
> if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
> enabled_transcoders |= BIT(cpu_transcoder);
> }
> @@ -4017,14 +4030,12 @@ static void intel_joiner_get_config(struct intel_crtc_state *crtc_state)
> u8 primary_pipes, secondary_pipes;
> enum pipe pipe = crtc->pipe;
>
> - enabled_joiner_pipes(i915, &primary_pipes, &secondary_pipes);
> + enabled_joiner_pipes(i915, pipe, &primary_pipes, &secondary_pipes);
>
> if (((primary_pipes | secondary_pipes) & BIT(pipe)) == 0)
> return;
>
> - crtc_state->joiner_pipes =
> - BIT(get_joiner_primary_pipe(pipe, primary_pipes, secondary_pipes)) |
> - get_joiner_secondary_pipes(pipe, primary_pipes, secondary_pipes);
> + crtc_state->joiner_pipes = primary_pipes | secondary_pipes;
> }
>
> static bool hsw_get_pipe_config(struct intel_crtc *crtc,
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 11/16] drm/i915/display/vdsc: Add ultrajoiner support with DSC
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (9 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 10/16] drm/i915/display: Refactor enable_joiner_pipes Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:54 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 12/16] drm/i915/dp: Modify compressed bpp limitations for ultrajoiner Ankit Nautiyal
` (4 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Add changes to DSC which are required for Ultrajoiner.
v2:
-Use correct helper for setting bits for bigjoiner secondary. (Ankit)
-Use primary/secondary instead of master/slave. (Suraj)
v3: Add the ultrajoiner helpers and use it for setting ultrajoiner
bits (Ankit)
v4: Use num_vdsc_instances *= num_joined_pipes (Ville)
v5: Align the helper to get ultrajoiner enabled pipes with other helpers
(Ville)
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 42 ++++++++++++++++++++
drivers/gpu/drm/i915/display/intel_display.h | 3 ++
drivers/gpu/drm/i915/display/intel_vdsc.c | 11 ++++-
3 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index f35d1e1fdb8a..22ff3e225140 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -312,6 +312,48 @@ u8 _intel_modeset_secondary_pipes(const struct intel_crtc_state *crtc_state)
return bigjoiner_secondary_pipes(crtc_state);
}
+bool intel_crtc_is_ultrajoiner(const struct intel_crtc_state *crtc_state)
+{
+ return intel_crtc_num_joined_pipes(crtc_state) >= 4;
+}
+
+static u8 ultrajoiner_primary_pipes(const struct intel_crtc_state *crtc_state)
+{
+ if (!intel_crtc_is_ultrajoiner(crtc_state))
+ return 0;
+
+ return crtc_state->joiner_pipes & (0b00010001 << joiner_primary_pipe(crtc_state));
+}
+
+bool intel_crtc_is_ultrajoiner_primary(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+ return intel_crtc_is_ultrajoiner(crtc_state) &&
+ BIT(crtc->pipe) & ultrajoiner_primary_pipes(crtc_state);
+}
+
+/*
+ * The ultrajoiner enable bit doesn't seem to follow primary/secondary logic or
+ * any other logic, so lets just add helper function to
+ * at least hide this hassle..
+ */
+static u8 ultrajoiner_enable_pipes(const struct intel_crtc_state *crtc_state)
+{
+ if (!intel_crtc_is_ultrajoiner(crtc_state))
+ return 0;
+
+ return crtc_state->joiner_pipes & (0b01110111 << joiner_primary_pipe(crtc_state));
+}
+
+bool intel_crtc_ultrajoiner_enable_needed(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+ return intel_crtc_is_ultrajoiner(crtc_state) &&
+ BIT(crtc->pipe) & ultrajoiner_enable_pipes(crtc_state);
+}
+
u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state)
{
if (crtc_state->joiner_pipes)
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index 1f0fed5ea7bc..61e1df878de9 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -441,6 +441,9 @@ bool intel_crtc_is_joiner_secondary(const struct intel_crtc_state *crtc_state);
bool intel_crtc_is_joiner_primary(const struct intel_crtc_state *crtc_state);
bool intel_crtc_is_bigjoiner_primary(const struct intel_crtc_state *crtc_state);
bool intel_crtc_is_bigjoiner_secondary(const struct intel_crtc_state *crtc_state);
+bool intel_crtc_is_ultrajoiner(const struct intel_crtc_state *crtc_state);
+bool intel_crtc_is_ultrajoiner_primary(const struct intel_crtc_state *crtc_state);
+bool intel_crtc_ultrajoiner_enable_needed(const struct intel_crtc_state *crtc_state);
u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state);
u8 _intel_modeset_primary_pipes(const struct intel_crtc_state *crtc_state);
u8 _intel_modeset_secondary_pipes(const struct intel_crtc_state *crtc_state);
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
index 8158e3702ed5..c3405234dc51 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -379,9 +379,9 @@ static int intel_dsc_get_vdsc_per_pipe(const struct intel_crtc_state *crtc_state
int intel_dsc_get_num_vdsc_instances(const struct intel_crtc_state *crtc_state)
{
int num_vdsc_instances = intel_dsc_get_vdsc_per_pipe(crtc_state);
+ int num_joined_pipes = intel_crtc_num_joined_pipes(crtc_state);
- if (crtc_state->joiner_pipes)
- num_vdsc_instances *= 2;
+ num_vdsc_instances *= num_joined_pipes;
return num_vdsc_instances;
}
@@ -770,7 +770,14 @@ void intel_dsc_enable(const struct intel_crtc_state *crtc_state)
dss_ctl1_val |= JOINER_ENABLE;
}
if (crtc_state->joiner_pipes) {
+ if (intel_crtc_ultrajoiner_enable_needed(crtc_state))
+ dss_ctl1_val |= ULTRA_JOINER_ENABLE;
+
+ if (intel_crtc_is_ultrajoiner_primary(crtc_state))
+ dss_ctl1_val |= PRIMARY_ULTRA_JOINER_ENABLE;
+
dss_ctl1_val |= BIG_JOINER_ENABLE;
+
if (intel_crtc_is_bigjoiner_primary(crtc_state))
dss_ctl1_val |= PRIMARY_BIG_JOINER_ENABLE;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 11/16] drm/i915/display/vdsc: Add ultrajoiner support with DSC
2024-09-23 18:13 ` [PATCH 11/16] drm/i915/display/vdsc: Add ultrajoiner support with DSC Ankit Nautiyal
@ 2024-09-23 18:54 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 18:54 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:31PM +0530, Ankit Nautiyal wrote:
> From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
>
> Add changes to DSC which are required for Ultrajoiner.
>
> v2:
> -Use correct helper for setting bits for bigjoiner secondary. (Ankit)
> -Use primary/secondary instead of master/slave. (Suraj)
> v3: Add the ultrajoiner helpers and use it for setting ultrajoiner
> bits (Ankit)
> v4: Use num_vdsc_instances *= num_joined_pipes (Ville)
> v5: Align the helper to get ultrajoiner enabled pipes with other helpers
> (Ville)
>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 42 ++++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_display.h | 3 ++
> drivers/gpu/drm/i915/display/intel_vdsc.c | 11 ++++-
> 3 files changed, 54 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index f35d1e1fdb8a..22ff3e225140 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -312,6 +312,48 @@ u8 _intel_modeset_secondary_pipes(const struct intel_crtc_state *crtc_state)
> return bigjoiner_secondary_pipes(crtc_state);
> }
>
> +bool intel_crtc_is_ultrajoiner(const struct intel_crtc_state *crtc_state)
> +{
> + return intel_crtc_num_joined_pipes(crtc_state) >= 4;
> +}
> +
> +static u8 ultrajoiner_primary_pipes(const struct intel_crtc_state *crtc_state)
> +{
> + if (!intel_crtc_is_ultrajoiner(crtc_state))
> + return 0;
> +
> + return crtc_state->joiner_pipes & (0b00010001 << joiner_primary_pipe(crtc_state));
> +}
> +
> +bool intel_crtc_is_ultrajoiner_primary(const struct intel_crtc_state *crtc_state)
> +{
> + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +
> + return intel_crtc_is_ultrajoiner(crtc_state) &&
> + BIT(crtc->pipe) & ultrajoiner_primary_pipes(crtc_state);
> +}
> +
> +/*
> + * The ultrajoiner enable bit doesn't seem to follow primary/secondary logic or
> + * any other logic, so lets just add helper function to
> + * at least hide this hassle..
> + */
> +static u8 ultrajoiner_enable_pipes(const struct intel_crtc_state *crtc_state)
> +{
> + if (!intel_crtc_is_ultrajoiner(crtc_state))
> + return 0;
> +
> + return crtc_state->joiner_pipes & (0b01110111 << joiner_primary_pipe(crtc_state));
> +}
> +
> +bool intel_crtc_ultrajoiner_enable_needed(const struct intel_crtc_state *crtc_state)
> +{
> + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +
> + return intel_crtc_is_ultrajoiner(crtc_state) &&
> + BIT(crtc->pipe) & ultrajoiner_enable_pipes(crtc_state);
> +}
> +
> u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state)
> {
> if (crtc_state->joiner_pipes)
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> index 1f0fed5ea7bc..61e1df878de9 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -441,6 +441,9 @@ bool intel_crtc_is_joiner_secondary(const struct intel_crtc_state *crtc_state);
> bool intel_crtc_is_joiner_primary(const struct intel_crtc_state *crtc_state);
> bool intel_crtc_is_bigjoiner_primary(const struct intel_crtc_state *crtc_state);
> bool intel_crtc_is_bigjoiner_secondary(const struct intel_crtc_state *crtc_state);
> +bool intel_crtc_is_ultrajoiner(const struct intel_crtc_state *crtc_state);
> +bool intel_crtc_is_ultrajoiner_primary(const struct intel_crtc_state *crtc_state);
> +bool intel_crtc_ultrajoiner_enable_needed(const struct intel_crtc_state *crtc_state);
> u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state);
> u8 _intel_modeset_primary_pipes(const struct intel_crtc_state *crtc_state);
> u8 _intel_modeset_secondary_pipes(const struct intel_crtc_state *crtc_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
> index 8158e3702ed5..c3405234dc51 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> @@ -379,9 +379,9 @@ static int intel_dsc_get_vdsc_per_pipe(const struct intel_crtc_state *crtc_state
> int intel_dsc_get_num_vdsc_instances(const struct intel_crtc_state *crtc_state)
> {
> int num_vdsc_instances = intel_dsc_get_vdsc_per_pipe(crtc_state);
> + int num_joined_pipes = intel_crtc_num_joined_pipes(crtc_state);
>
> - if (crtc_state->joiner_pipes)
> - num_vdsc_instances *= 2;
> + num_vdsc_instances *= num_joined_pipes;
>
> return num_vdsc_instances;
> }
> @@ -770,7 +770,14 @@ void intel_dsc_enable(const struct intel_crtc_state *crtc_state)
> dss_ctl1_val |= JOINER_ENABLE;
> }
> if (crtc_state->joiner_pipes) {
> + if (intel_crtc_ultrajoiner_enable_needed(crtc_state))
> + dss_ctl1_val |= ULTRA_JOINER_ENABLE;
> +
> + if (intel_crtc_is_ultrajoiner_primary(crtc_state))
> + dss_ctl1_val |= PRIMARY_ULTRA_JOINER_ENABLE;
> +
> dss_ctl1_val |= BIG_JOINER_ENABLE;
> +
> if (intel_crtc_is_bigjoiner_primary(crtc_state))
> dss_ctl1_val |= PRIMARY_BIG_JOINER_ENABLE;
> }
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 12/16] drm/i915/dp: Modify compressed bpp limitations for ultrajoiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (10 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 11/16] drm/i915/display/vdsc: Add ultrajoiner support with DSC Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 18:32 ` Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 13/16] drm/i915/dp: Modify helper to get slice count " Ankit Nautiyal
` (3 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Add compressed bpp limitations for ultrajoiner.
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dp.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index e4b6594d870e..a853f975bda1 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -865,24 +865,36 @@ u32 get_max_compressed_bpp_with_joiner(struct drm_i915_private *i915,
int num_joined_pipes)
{
u32 max_bpp_small_joiner_ram;
+ u32 max_bpp_bigjoiner;
+ u32 max_bpp;
/* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
max_bpp_small_joiner_ram = small_joiner_ram_size_bits(i915) / mode_hdisplay;
- if (num_joined_pipes == 2) {
+ if (num_joined_pipes > 1) {
int bigjoiner_interface_bits = DISPLAY_VER(i915) >= 14 ? 36 : 24;
/* With bigjoiner multiple dsc engines are used in parallel so PPC is 2 */
int ppc = 2;
- u32 max_bpp_bigjoiner =
- i915->display.cdclk.max_cdclk_freq * ppc * bigjoiner_interface_bits /
+ int num_bigjoiners = num_joined_pipes / 2;
+
+ max_bpp_bigjoiner =
+ i915->display.cdclk.max_cdclk_freq * ppc * bigjoiner_interface_bits *
intel_dp_mode_to_fec_clock(mode_clock);
- max_bpp_small_joiner_ram *= 2;
+ max_bpp_bigjoiner *= num_bigjoiners;
+
+ max_bpp_small_joiner_ram *= num_joined_pipes;
+ }
+
+ max_bpp = min(max_bpp_small_joiner_ram, max_bpp_bigjoiner);
+
+ if (num_joined_pipes == 4) {
+ u32 max_bpp_ultrajoiner_ram = (4 * 72 * 512) / mode_hdisplay;
- return min(max_bpp_small_joiner_ram, max_bpp_bigjoiner);
+ max_bpp = min(max_bpp, max_bpp_ultrajoiner_ram);
}
- return max_bpp_small_joiner_ram;
+ return max_bpp;
}
u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH 12/16] drm/i915/dp: Modify compressed bpp limitations for ultrajoiner
2024-09-23 18:13 ` [PATCH 12/16] drm/i915/dp: Modify compressed bpp limitations for ultrajoiner Ankit Nautiyal
@ 2024-09-23 18:32 ` Ankit Nautiyal
0 siblings, 0 replies; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:32 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe
Add compressed bpp limitations for ultrajoiner.
v2: Fix the case for 1 pipe. (Ankit)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index e4b6594d870e..b359d2e808aa 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -865,24 +865,39 @@ u32 get_max_compressed_bpp_with_joiner(struct drm_i915_private *i915,
int num_joined_pipes)
{
u32 max_bpp_small_joiner_ram;
+ u32 max_bpp_bigjoiner;
+ u32 max_bpp;
/* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
max_bpp_small_joiner_ram = small_joiner_ram_size_bits(i915) / mode_hdisplay;
- if (num_joined_pipes == 2) {
+ if (num_joined_pipes == 1)
+ return max_bpp_small_joiner_ram;
+
+ if (num_joined_pipes > 1) {
int bigjoiner_interface_bits = DISPLAY_VER(i915) >= 14 ? 36 : 24;
/* With bigjoiner multiple dsc engines are used in parallel so PPC is 2 */
int ppc = 2;
- u32 max_bpp_bigjoiner =
- i915->display.cdclk.max_cdclk_freq * ppc * bigjoiner_interface_bits /
+ int num_bigjoiners = num_joined_pipes / 2;
+
+ max_bpp_bigjoiner =
+ i915->display.cdclk.max_cdclk_freq * ppc * bigjoiner_interface_bits *
intel_dp_mode_to_fec_clock(mode_clock);
- max_bpp_small_joiner_ram *= 2;
+ max_bpp_bigjoiner *= num_bigjoiners;
+
+ max_bpp_small_joiner_ram *= num_joined_pipes;
+ }
+
+ max_bpp = min(max_bpp_small_joiner_ram, max_bpp_bigjoiner);
+
+ if (num_joined_pipes == 4) {
+ u32 max_bpp_ultrajoiner_ram = (4 * 72 * 512) / mode_hdisplay;
- return min(max_bpp_small_joiner_ram, max_bpp_bigjoiner);
+ max_bpp = min(max_bpp, max_bpp_ultrajoiner_ram);
}
- return max_bpp_small_joiner_ram;
+ return max_bpp;
}
u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 13/16] drm/i915/dp: Modify helper to get slice count for ultrajoiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (11 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 12/16] drm/i915/dp: Modify compressed bpp limitations for ultrajoiner Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 19:04 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 14/16] drm/i915: Compute config and mode valid changes " Ankit Nautiyal
` (2 subsequent siblings)
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
ultrajoiner needs 2 bigjoiners to be enabled, so modify the helper
intel_dp_dsc_get_slice_count for ultrajoiner.
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dp.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index a853f975bda1..115d8468bb91 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -996,8 +996,11 @@ u8 intel_dp_dsc_get_slice_count(const struct intel_connector *connector,
drm_dp_dsc_sink_max_slice_count(connector->dp.dsc_dpcd, false))
break;
- /* big joiner needs small joiner to be enabled */
- if (num_joined_pipes == 2 && test_slice_count < 4)
+ /*
+ * big joiner needs small joiner to be enabled,
+ * and ultrajoiner needs 2 bigjoiners to be enabled
+ */
+ if (num_joined_pipes > 1 && test_slice_count < num_joined_pipes * 2)
continue;
if (min_slice_count <= test_slice_count)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 13/16] drm/i915/dp: Modify helper to get slice count for ultrajoiner
2024-09-23 18:13 ` [PATCH 13/16] drm/i915/dp: Modify helper to get slice count " Ankit Nautiyal
@ 2024-09-23 19:04 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 19:04 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:33PM +0530, Ankit Nautiyal wrote:
> From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
>
> ultrajoiner needs 2 bigjoiners to be enabled, so modify the helper
> intel_dp_dsc_get_slice_count for ultrajoiner.
>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dp.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index a853f975bda1..115d8468bb91 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -996,8 +996,11 @@ u8 intel_dp_dsc_get_slice_count(const struct intel_connector *connector,
> drm_dp_dsc_sink_max_slice_count(connector->dp.dsc_dpcd, false))
> break;
>
> - /* big joiner needs small joiner to be enabled */
> - if (num_joined_pipes == 2 && test_slice_count < 4)
> + /*
> + * big joiner needs small joiner to be enabled,
> + * and ultrajoiner needs 2 bigjoiners to be enabled
> + */
> + if (num_joined_pipes > 1 && test_slice_count < num_joined_pipes * 2)
This is now
u8 test_slice_count = valid_dsc_slicecount[i] * num_joined_pipes;
if (num_joined_pipes > 1 && test_slice_count < num_joined_pipes * 2)
continue;
which we could simply to just
if (num_joined_pipes > 1 && valid_dsc_slicecount[i] < 2)
continue;
which might more clearly reflect what the original comment
"big joiner needs small joiner to be enabled" seems to
be trying to say (basically that we need at least two slices
per pipe) whenever bigjoiner is enabled. Ultrajoiner presumably
does not really change that fact in any way?
> continue;
>
> if (min_slice_count <= test_slice_count)
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 14/16] drm/i915: Compute config and mode valid changes for ultrajoiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (12 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 13/16] drm/i915/dp: Modify helper to get slice count " Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 19:06 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 15/16] drm/i915/display: Consider ultrajoiner for computing maxdotclock Ankit Nautiyal
2024-09-23 18:13 ` [PATCH 16/16] drm/i915/intel_dp: Add support for forcing ultrajoiner Ankit Nautiyal
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Implement required changes for mode validation and compute config,
to support Ultrajoiner.
v2:
-Drop changes for HDMI.
-Separate out DSC changes into another patch.
v3: Fix check in can_ultrajoiner. (Ankit)
v4:
-Unify helper to check joiner requirement. (Ville)
-Split patches for ultrajoiner changes for max dsc slices and compressed
bpp.(Ankit)
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dp.c | 26 +++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 115d8468bb91..8e0cb6c77c64 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1280,26 +1280,38 @@ intel_dp_mode_valid_downstream(struct intel_connector *connector,
}
static
-bool intel_dp_needs_bigjoiner(struct intel_dp *intel_dp,
- struct intel_connector *connector,
- int hdisplay, int clock)
+bool intel_dp_needs_joiner(struct intel_dp *intel_dp,
+ struct intel_connector *connector,
+ int hdisplay, int clock,
+ int num_joined_pipes)
{
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
if (!intel_dp_has_joiner(intel_dp))
return false;
- return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120;
+ num_joined_pipes /= 2;
+
+ return clock > num_joined_pipes * i915->display.cdclk.max_dotclk_freq ||
+ hdisplay > 5120;
}
int intel_dp_num_joined_pipes(struct intel_dp *intel_dp,
struct intel_connector *connector,
int hdisplay, int clock)
{
+ struct intel_display *display = to_intel_display(intel_dp);
+ struct drm_i915_private *i915 = to_i915(display->drm);
+
if (connector->force_joined_pipes)
return connector->force_joined_pipes;
- if (intel_dp_needs_bigjoiner(intel_dp, connector, hdisplay, clock))
+ if (HAS_ULTRAJOINER(i915) &&
+ intel_dp_needs_joiner(intel_dp, connector, hdisplay, clock, 4))
+ return 4;
+
+ if ((HAS_BIGJOINER(i915) || HAS_UNCOMPRESSED_JOINER(i915)) &&
+ intel_dp_needs_joiner(intel_dp, connector, hdisplay, clock, 2))
return 2;
return 1;
@@ -2505,8 +2517,10 @@ bool intel_dp_joiner_needs_dsc(struct drm_i915_private *i915,
* Pipe joiner needs compression up to display 12 due to bandwidth
* limitation. DG2 onwards pipe joiner can be enabled without
* compression.
+ * Ultrajoiner always needs compression.
*/
- return !HAS_UNCOMPRESSED_JOINER(i915) && num_joined_pipes == 2;
+ return (!HAS_UNCOMPRESSED_JOINER(i915) && num_joined_pipes == 2) ||
+ num_joined_pipes == 4;
}
static int
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 14/16] drm/i915: Compute config and mode valid changes for ultrajoiner
2024-09-23 18:13 ` [PATCH 14/16] drm/i915: Compute config and mode valid changes " Ankit Nautiyal
@ 2024-09-23 19:06 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 19:06 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:34PM +0530, Ankit Nautiyal wrote:
> From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
>
> Implement required changes for mode validation and compute config,
> to support Ultrajoiner.
>
> v2:
> -Drop changes for HDMI.
> -Separate out DSC changes into another patch.
> v3: Fix check in can_ultrajoiner. (Ankit)
> v4:
> -Unify helper to check joiner requirement. (Ville)
> -Split patches for ultrajoiner changes for max dsc slices and compressed
> bpp.(Ankit)
>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dp.c | 26 +++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 115d8468bb91..8e0cb6c77c64 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1280,26 +1280,38 @@ intel_dp_mode_valid_downstream(struct intel_connector *connector,
> }
>
> static
> -bool intel_dp_needs_bigjoiner(struct intel_dp *intel_dp,
> - struct intel_connector *connector,
> - int hdisplay, int clock)
> +bool intel_dp_needs_joiner(struct intel_dp *intel_dp,
> + struct intel_connector *connector,
> + int hdisplay, int clock,
> + int num_joined_pipes)
> {
> struct drm_i915_private *i915 = dp_to_i915(intel_dp);
>
> if (!intel_dp_has_joiner(intel_dp))
> return false;
>
> - return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120;
> + num_joined_pipes /= 2;
> +
> + return clock > num_joined_pipes * i915->display.cdclk.max_dotclk_freq ||
> + hdisplay > 5120;
'num_joined_pipes * 5120'
With that
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> }
>
> int intel_dp_num_joined_pipes(struct intel_dp *intel_dp,
> struct intel_connector *connector,
> int hdisplay, int clock)
> {
> + struct intel_display *display = to_intel_display(intel_dp);
> + struct drm_i915_private *i915 = to_i915(display->drm);
> +
> if (connector->force_joined_pipes)
> return connector->force_joined_pipes;
>
> - if (intel_dp_needs_bigjoiner(intel_dp, connector, hdisplay, clock))
> + if (HAS_ULTRAJOINER(i915) &&
> + intel_dp_needs_joiner(intel_dp, connector, hdisplay, clock, 4))
> + return 4;
> +
> + if ((HAS_BIGJOINER(i915) || HAS_UNCOMPRESSED_JOINER(i915)) &&
> + intel_dp_needs_joiner(intel_dp, connector, hdisplay, clock, 2))
> return 2;
>
> return 1;
> @@ -2505,8 +2517,10 @@ bool intel_dp_joiner_needs_dsc(struct drm_i915_private *i915,
> * Pipe joiner needs compression up to display 12 due to bandwidth
> * limitation. DG2 onwards pipe joiner can be enabled without
> * compression.
> + * Ultrajoiner always needs compression.
> */
> - return !HAS_UNCOMPRESSED_JOINER(i915) && num_joined_pipes == 2;
> + return (!HAS_UNCOMPRESSED_JOINER(i915) && num_joined_pipes == 2) ||
> + num_joined_pipes == 4;
> }
>
> static int
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 15/16] drm/i915/display: Consider ultrajoiner for computing maxdotclock
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (13 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 14/16] drm/i915: Compute config and mode valid changes " Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 19:08 ` Ville Syrjälä
2024-09-23 18:13 ` [PATCH 16/16] drm/i915/intel_dp: Add support for forcing ultrajoiner Ankit Nautiyal
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Use the check for ultrajoiner while computing maxdotclock.
v2: Add Check for HAS_UNCOMPRESSED_JOINER. (Ville)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 22ff3e225140..4c31d398ca4b 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -8189,8 +8189,10 @@ static int max_dotclock(struct drm_i915_private *i915)
{
int max_dotclock = i915->display.cdclk.max_dotclk_freq;
- /* icl+ might use joiner */
- if (HAS_BIGJOINER(i915))
+ if (HAS_ULTRAJOINER(i915))
+ max_dotclock *= 4;
+
+ else if (HAS_UNCOMPRESSED_JOINER(i915) || HAS_BIGJOINER(i915))
max_dotclock *= 2;
return max_dotclock;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 15/16] drm/i915/display: Consider ultrajoiner for computing maxdotclock
2024-09-23 18:13 ` [PATCH 15/16] drm/i915/display: Consider ultrajoiner for computing maxdotclock Ankit Nautiyal
@ 2024-09-23 19:08 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 19:08 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:35PM +0530, Ankit Nautiyal wrote:
> Use the check for ultrajoiner while computing maxdotclock.
>
> v2: Add Check for HAS_UNCOMPRESSED_JOINER. (Ville)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 22ff3e225140..4c31d398ca4b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -8189,8 +8189,10 @@ static int max_dotclock(struct drm_i915_private *i915)
> {
> int max_dotclock = i915->display.cdclk.max_dotclk_freq;
>
> - /* icl+ might use joiner */
> - if (HAS_BIGJOINER(i915))
> + if (HAS_ULTRAJOINER(i915))
> + max_dotclock *= 4;
> +
Extraneous newline. With that removed
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> + else if (HAS_UNCOMPRESSED_JOINER(i915) || HAS_BIGJOINER(i915))
> max_dotclock *= 2;
>
> return max_dotclock;
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 16/16] drm/i915/intel_dp: Add support for forcing ultrajoiner
2024-09-23 18:13 [PATCH 00/16] Ultrajoiner basic functionality series Ankit Nautiyal
` (14 preceding siblings ...)
2024-09-23 18:13 ` [PATCH 15/16] drm/i915/display: Consider ultrajoiner for computing maxdotclock Ankit Nautiyal
@ 2024-09-23 18:13 ` Ankit Nautiyal
2024-09-23 19:09 ` Ville Syrjälä
15 siblings, 1 reply; 30+ messages in thread
From: Ankit Nautiyal @ 2024-09-23 18:13 UTC (permalink / raw)
To: intel-gfx; +Cc: intel-xe, suraj.kandpal, ville.syrjala
Allow forcing ultrajoiner through debugfs.
v2: Minor refactoring of switch case logic. (Ville)
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_debugfs.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index af164e340cb3..01ddebc61944 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1331,6 +1331,7 @@ static ssize_t i915_joiner_write(struct file *file,
{
struct seq_file *m = file->private_data;
struct intel_connector *connector = m->private;
+ struct drm_i915_private *i915 = to_i915(connector->base.dev);
int force_joined_pipes = 0;
int ret;
@@ -1349,6 +1350,13 @@ static ssize_t i915_joiner_write(struct file *file,
case 2:
connector->force_joined_pipes = force_joined_pipes;
break;
+ case 4:
+ if (HAS_ULTRAJOINER(i915)) {
+ connector->force_joined_pipes = force_joined_pipes;
+ break;
+ }
+
+ fallthrough;
default:
return -EINVAL;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH 16/16] drm/i915/intel_dp: Add support for forcing ultrajoiner
2024-09-23 18:13 ` [PATCH 16/16] drm/i915/intel_dp: Add support for forcing ultrajoiner Ankit Nautiyal
@ 2024-09-23 19:09 ` Ville Syrjälä
0 siblings, 0 replies; 30+ messages in thread
From: Ville Syrjälä @ 2024-09-23 19:09 UTC (permalink / raw)
To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, suraj.kandpal
On Mon, Sep 23, 2024 at 11:43:36PM +0530, Ankit Nautiyal wrote:
> Allow forcing ultrajoiner through debugfs.
>
> v2: Minor refactoring of switch case logic. (Ville)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display_debugfs.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index af164e340cb3..01ddebc61944 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -1331,6 +1331,7 @@ static ssize_t i915_joiner_write(struct file *file,
> {
> struct seq_file *m = file->private_data;
> struct intel_connector *connector = m->private;
> + struct drm_i915_private *i915 = to_i915(connector->base.dev);
> int force_joined_pipes = 0;
> int ret;
>
> @@ -1349,6 +1350,13 @@ static ssize_t i915_joiner_write(struct file *file,
> case 2:
> connector->force_joined_pipes = force_joined_pipes;
> break;
> + case 4:
> + if (HAS_ULTRAJOINER(i915)) {
> + connector->force_joined_pipes = force_joined_pipes;
> + break;
> + }
> +
> + fallthrough;
> default:
> return -EINVAL;
> }
> --
> 2.45.2
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 30+ messages in thread