From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 432CE3E716F for ; Fri, 14 Aug 2026 23:59:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786751948; cv=none; b=cG0arSSOiOhF2utoxTjCZokZkOFV0XqHu4xtp7W+XQ1c61RvskstarKtndu1erz1iCgTkwApl8kNsQ20MbNaFxeGP4WSB5gG5QKgBZhwn8rO5usjmjKrZOb0//JOC4WTEc2wL1zYZX2C3Qlj1eJQiKzD/3NB5E75AUE/s9yvSzE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786751948; c=relaxed/simple; bh=Gzb3+XNiGb9vRGBtUAyI7fkXKy5EB0PAdVam5qmz+Qw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WDoP1Qhd6f2fxCM9P4nhMWM9IbTIc5Q9sB5fX8dxJximDL/7yBshnSv5VStzlT73iXA4jQuNMv/l617o85chRTYxSMQi49F/5D3KOUfB71O8XO6Hr8MjyYX01GzSCB2sKgsRuyid/DVjcnyNH1+ArYj55ENAuizY2/KBhkTZOy0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=o9665Pqb; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="o9665Pqb" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-4957eefd361so11840995e9.1 for ; Fri, 14 Aug 2026 16:59:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786751945; x=1787356745; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=wjOzV0q5U0Ngoj2QziahFo4rb8HC53Ty4Vt3SiFJTto=; b=o9665PqbKBsIudkNa4zJsPcyBrdo913vrejXALzWrzmMhWGkeFwTFBWl5ejLqWQH9G Gwcp08n7G9kkLq0eU+7y1iXk9k1Fow4odnaa+ncsb0ZbeVqSCgsm2d+/Zyg3bfjSOu3N 2b97HMd0LLXkMcCCpipY8IGvFtO4KMM/lkhdcwxHCFP3m4aU0T75oCCHA5NYvu5qZlzW +FDam+EnTpsFeyGIoEq+dME9sgfbq9/Z7lie87+tjAFdkFQSmtwExfehkHub4bDYABZi G8swTL/pDEUus6UYMyTklGidID4+ySUD567TOwgZKqesaQLoggFXRL5pZjVL/DKj3oep vFXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786751945; x=1787356745; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=wjOzV0q5U0Ngoj2QziahFo4rb8HC53Ty4Vt3SiFJTto=; b=DcYIAXL8GqkSFu9JofSgvQrwQP41/xCEmBO5z8kq+Rq32y266RKDSM2B6X1NMX9vL0 FF7V/4BTV/Xt0ivT2d5vISgSUVYMKOraPtSNnbAG0OfHSSB8T/pJAMEiSGbop6KxGHJP v99t32xClbR0ZuEGLFIYHBy1wJx010oHZo1HSjMDuVAlh5R7U/HDX6tP4xNU/B16j3/B cIR+DeAWLENd11hPvF4nYAa+AMabYOgU6Bkg850i4VHOtUKFJFf4K9BulQHQ0lMujsRm srzwmCiCVlk70Th0K5cXtch9W5NYBXw0vXWGgIqwHqqCAKepkj6nWMIW/7v7xg3ajRc5 v/5Q== X-Gm-Message-State: AOJu0Yzj1YgbvI/D5nqqpsCxpsPgBkWuzS9KXuBuhO1RmQ8blZHvogAN y2H48xqEedOjVsMcHpfUKNO52B/fGY2VKwAVxvjzpxs3D2ebi9Abph7lwZwOKWMTwSI= X-Gm-Gg: AR+sD11UCswlLgVPCS18HwgYM7OMy4Y2qJs6LYqiOEn9PsGfeYnM0vVFBd8Zpe8pxeU LXff4MpFkLePx4EiLFic1svlydNY8bdRjhhdS56oj/bVw794C907VNh6oGsM5LTdRZx0g4upicP jmF19EFiOayvqWzeN2IzViLpRW1Oejs08JvVd95C46mXVSM91b1pGe+Ab4yfSZnO53wzwkNhNLt 9QaTeyEYOTAwB4yJxcn7PiCKsxSl73gnBu4+k1icfiybRXWMjnwcKf8aRzjpkGNdu7ZR14bWr0F /aYipSmltR+B5ES1fm2iHCjxxhb61lnoJmcSpEVLViGfe+/WuQXl42kg0pRhjrgUBz7hByjNpvA TTVR8nfeExFP1k+jwVzvh2Igfy6+XhxrRakVfKHZSBkvjiOa2WnvOc8WaedB7izu/UTk/i7Mhdp /S+Dy1KMTYU68CLFfddDpwlMhIUAr/VUGq4A20u3vs4a09ZmqnFOSZO1x79RP/9WlqeM0= X-Received: by 2002:a05:600c:3114:b0:499:84fe:5f3e with SMTP id 5b1f17b1804b1-4998795c12bmr121642805e9.9.1786751945540; Fri, 14 Aug 2026 16:59:05 -0700 (PDT) Received: from fedora ([5.31.134.170]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499899753ccsm77751245e9.0.2026.08.14.16.59.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Aug 2026 16:59:04 -0700 (PDT) From: Mohamed Ahmed To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Lyude Paul , Danilo Krummrich , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Mary Guillemard , nouveau@lists.freedesktop.org, Mohamed Ahmed Subject: [PATCH 6/7] nouveau/dispnv50: program pixel clocks above 2.147GHz on GB20x Date: Sat, 15 Aug 2026 03:57:04 +0400 Message-ID: <20260814235705.59132-7-mohamedahmedegypt2001@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814235705.59132-1-mohamedahmedegypt2001@gmail.com> References: <20260814235705.59132-1-mohamedahmedegypt2001@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The HEAD_SET_PIXEL_CLOCK_FREQUENCY(_MAX) methods carry only 31 HERTZ bits. Starting with C97D the upper bits live in separate HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI(_MAX) methods, which nouveau never programmed and headca7d_mode() computed m->clock * 1000 into the 31-bit field. NVVAL's mask then silently truncates anything past 2^31 Hz, which means that every mode scanned out at pclk modulo 2^31. No mode nouveau can currently commit crosses the boundary (an uncompressed HDMI FRL mode tops out around 1.78GHz at 8bpc), but this is a prerequisite for the upcoming DSC work, which makes 2.147GHz+ modes reachable. Program the full value split across the low and HI methods, exactly as OpenRM's EvoSetRasterParams9() does (nvkms-evo4.c, 31-bit low word plus the 4 HI HERTZ bits, giving 35 bits of range). Signed-off-by: Mohamed Ahmed --- drivers/gpu/drm/nouveau/dispnv50/headca7d.c | 21 ++++++++++++++++--- .../drm/nouveau/include/nvhw/class/clca7d.h | 4 ++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/nouveau/dispnv50/headca7d.c b/drivers/gpu/drm/nouveau/dispnv50/headca7d.c index eeaeb15aa664..2046e38a4d79 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/headca7d.c +++ b/drivers/gpu/drm/nouveau/dispnv50/headca7d.c @@ -219,10 +219,11 @@ headca7d_mode(struct nv50_head *head, struct nv50_head_atom *asyh) { struct nvif_push *push = &head->disp->core->chan.push; struct nv50_head_mode *m = &asyh->mode; + const u64 hz = (u64)m->clock * 1000; const int i = head->base.index; int ret; - ret = PUSH_WAIT(push, 11); + ret = PUSH_WAIT(push, 15); if (ret) return ret; @@ -245,11 +246,25 @@ headca7d_mode(struct nv50_head *head, struct nv50_head_atom *asyh) PUSH_MTHD(push, NVCA7D, HEAD_SET_CONTROL(i), NVDEF(NVCA7D, HEAD_SET_CONTROL, STRUCTURE, PROGRESSIVE)); + /* The FREQUENCY methods carry only 31 HERTZ bits; the upper bits + * of anything past 2.147GHz live in the HI methods + * (EvoSetRasterParams9()). Truncation here scans out at pclk modulo 2^31. + */ PUSH_MTHD(push, NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY(i), - NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY, HERTZ, m->clock * 1000)); + NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY, HERTZ, + (u32)(hz & 0x7fffffff))); PUSH_MTHD(push, NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX(i), - NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX, HERTZ, m->clock * 1000)); + NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX, HERTZ, + (u32)(hz & 0x7fffffff))); + + PUSH_MTHD(push, NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI(i), + NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI, HERTZ, + (u32)(hz >> 31))); + + PUSH_MTHD(push, NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX(i), + NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX, HERTZ, + (u32)(hz >> 31))); return 0; } diff --git a/drivers/gpu/drm/nouveau/include/nvhw/class/clca7d.h b/drivers/gpu/drm/nouveau/include/nvhw/class/clca7d.h index 0fec6fc21d44..1ab12d91c9d9 100644 --- a/drivers/gpu/drm/nouveau/include/nvhw/class/clca7d.h +++ b/drivers/gpu/drm/nouveau/include/nvhw/class/clca7d.h @@ -653,6 +653,10 @@ #define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX_ADJ1000DIV1001 31:31 #define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX_ADJ1000DIV1001_FALSE (0x00000000) #define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX_ADJ1000DIV1001_TRUE (0x00000001) +#define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI(a) (0x000020C0 + (a)*0x00000800) +#define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_HERTZ 3:0 +#define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX(a) (0x000020C4 + (a)*0x00000800) +#define NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX_HERTZ 3:0 #define NVCA7D_HEAD_SET_HEAD_USAGE_BOUNDS(a) (0x00002030 + (a)*0x00000800) #define NVCA7D_HEAD_SET_HEAD_USAGE_BOUNDS_CURSOR 2:0 #define NVCA7D_HEAD_SET_HEAD_USAGE_BOUNDS_CURSOR_USAGE_NONE (0x00000000) -- 2.55.0