From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0BBA510E897 for ; Tue, 28 Mar 2023 12:36:11 +0000 (UTC) From: Bhanuprakash Modem To: igt-dev@lists.freedesktop.org, swati2.sharma@intel.com, ankit.k.nautiyal@intel.com, karthik.b.s@intel.com Date: Tue, 28 Mar 2023 18:02:05 +0530 Message-Id: <20230328123210.3781976-2-bhanuprakash.modem@intel.com> In-Reply-To: <20230328123210.3781976-1-bhanuprakash.modem@intel.com> References: <20230328123210.3781976-1-bhanuprakash.modem@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [igt-dev] [i-g-t V2 1/6] lib/igt_kms: Fix Bigjoiner checks List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" List-ID: Bigjoiner will come in the picture when the resolution > 5K or clock > max dot-clock. Add a support to check the selected mode clock is greater than the max dot-clock. V2: - Update helper comments (Ankit) - New helper to check Bigjoiner requirement (Ankit) Signed-off-by: Bhanuprakash Modem Reviewed-by: Ankit Nautiyal --- lib/igt_kms.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++---- lib/igt_kms.h | 2 ++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/lib/igt_kms.c b/lib/igt_kms.c index c12823d318e..c4d9fcc5ddd 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -5780,6 +5780,51 @@ bool igt_max_bpc_constraint(igt_display_t *display, enum pipe pipe, return false; } +/* + * igt_get_max_dotclock: + * @fd: A drm file descriptor + * + * Get the Max pixel clock frequency from intel specific debugfs + * "i915_frequency_info". + * + * Returns: Max supported pixel clock frequency. + */ +int igt_get_max_dotclock(int fd) +{ + char buf[4096]; + char *s; + int max_dotclock = 0; + + if (!is_i915_device(fd)) + return max_dotclock; + + igt_debugfs_read(fd, "i915_frequency_info", buf); + s = strstr(buf, "Max pixel clock frequency:"); + igt_assert(s); + igt_assert_eq(sscanf(s, "Max pixel clock frequency: %d kHz", &max_dotclock), 1); + + /* 100 Mhz to 5 GHz seem like reasonable values to expect */ + igt_assert_lt(max_dotclock, 5000000); + igt_assert_lt(100000, max_dotclock); + + return max_dotclock; +} + +/* igt_bigjoiner_possible: + * @mode: libdrm mode + * @max_dotclock: Max pixel clock frequency + * + * Bigjoiner will come into the picture, when the requested + * mode resolution > 5K or mode clock > max_dotclock. + * + * Returns: True if mode requires Bigjoiner, else False. + */ +bool igt_bigjoiner_possible(drmModeModeInfo *mode, int max_dotclock) +{ + return (mode->hdisplay > MAX_HDISPLAY_PER_PIPE || + mode->clock > max_dotclock); +} + /* * igt_check_bigjoiner_support: * @display: a pointer to an #igt_display_t structure @@ -5802,6 +5847,7 @@ bool igt_check_bigjoiner_support(igt_display_t *display) enum pipe idx; drmModeModeInfo *mode; } pipes[IGT_MAX_PIPES]; + int max_dotclock; /* Get total enabled pipes. */ for_each_pipe(display, p) @@ -5825,22 +5871,24 @@ bool igt_check_bigjoiner_support(igt_display_t *display) return true; } + max_dotclock = igt_get_max_dotclock(display->drm_fd); + /* - * if mode.hdisplay > 5120, then ignore + * if mode resolution > 5K (or) mode.clock > max dot-clock, then ignore * - if the consecutive pipe is not available * - last crtc in single/multi-connector config * - consecutive crtcs in multi-connector config * * in multi-connector config ignore if - * - previous crtc mode.hdisplay > 5120 and + * - previous crtc (mode resolution > 5K or mode.clock > max dot-clock) and * - current & previous crtcs are consecutive */ for (i = 0; i < pipes_in_use; i++) { - if (((pipes[i].mode->hdisplay > MAX_HDISPLAY_PER_PIPE) && + if ((igt_bigjoiner_possible(pipes[i].mode, max_dotclock) && ((pipes[i].idx >= (total_pipes - 1)) || (!display->pipes[pipes[i].idx + 1].enabled) || ((i < (pipes_in_use - 1)) && (abs(pipes[i + 1].idx - pipes[i].idx) <= 1)))) || - ((i > 0) && (pipes[i - 1].mode->hdisplay > MAX_HDISPLAY_PER_PIPE) && + ((i > 0) && igt_bigjoiner_possible(pipes[i - 1].mode, max_dotclock) && ((!display->pipes[pipes[i - 1].idx + 1].enabled) || (abs(pipes[i].idx - pipes[i - 1].idx) <= 1)))) { igt_debug("Pipe/Output combo is not possible with selected mode(s).\n"); diff --git a/lib/igt_kms.h b/lib/igt_kms.h index 2b917925158..df90bb2330d 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -990,6 +990,8 @@ void igt_sort_connector_modes(drmModeConnector *connector, bool igt_max_bpc_constraint(igt_display_t *display, enum pipe pipe, igt_output_t *output, int bpc); +int igt_get_max_dotclock(int fd); +bool igt_bigjoiner_possible(drmModeModeInfo *mode, int max_dotclock); bool igt_check_bigjoiner_support(igt_display_t *display); bool igt_parse_mode_string(const char *mode_string, drmModeModeInfo *mode); bool i915_pipe_output_combo_valid(igt_display_t *display); -- 2.40.0