From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65D5176026 for ; Mon, 17 Aug 2026 22:43:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787006633; cv=none; b=AGQkcWyrXRFp0m8yHwERXJ6Xepkdo3soyzIY4lbrhy4oPzxSGlHa64TDYVBIOEkFShDWWj+Vrx1Fu9oIBjL8Gg78/VKevSN9LdMV1TIDiFplCorQC9ZuX5JWQiLnHYdDL6e2mEWDYVtNu5YlB0JIFR5thm82Lr0o9TKjEm0ytJI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787006633; c=relaxed/simple; bh=diRzgh7J4irrojt0ByabHPDjMw0vzot/9CyiLHFeRk8=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=HQ42rjrUTH8FOupBOv/VfRnNNfbfbElW1xBB+UAkYVLljViYuuV0hc02wV/Mi4q5miwdyXvU3L1NqHX5ZmHZcxm2oq5eDuNE6QcxU+DeqOY7XO7LUmz2JNl1jBFkMQItkUfyS4xJBy6LcgREzNtTb/Ifia1m+zoPtTRiaT9Q3HQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=bEZoal9n; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=K5Vkx5Er; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="bEZoal9n"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="K5Vkx5Er" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787006630; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iBb4GI1JETzGycaeth8GVu7eys17B4CdM2QImPbvCqs=; b=bEZoal9nKGpUEt2ImlX5hPAsLbHaUJAl7YQ4jyL0TqHuUItMONmsAMDxOoSyx5vYaQxhZm r5t122LzCRAl+jcJfEtLdFoGjp0PN13DyxmfU+e5VpT3rG8VCFRqc3erkZXXiMLX7nEMxx ls8aKWvjgZK/M2SeohDpdQS8HAM2Gnc= Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-448-CPpf9gjIPd6hX7bpN5dmpg-1; Mon, 17 Aug 2026 18:43:38 -0400 X-MC-Unique: CPpf9gjIPd6hX7bpN5dmpg-1 X-Mimecast-MFC-AGG-ID: CPpf9gjIPd6hX7bpN5dmpg_1787006618 Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-526da7e3c9dso37707461cf.1 for ; Mon, 17 Aug 2026 15:43:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787006618; x=1787611418; darn=vger.kernel.org; h=mime-version:user-agent:content-transfer-encoding:content-type :references:in-reply-to:date:cc:to:from:subject:message-id:from:to :cc:subject:date:message-id:reply-to:content-type; bh=iBb4GI1JETzGycaeth8GVu7eys17B4CdM2QImPbvCqs=; b=K5Vkx5ErwFPRG5MaMQABcaZ+3ozt/1QReR1f+oLDagJC5jwPBcVXCDbJDrAwROVQIK n3hrrPUAzopCDqqFy92KqLjMY16mY1EVou9o/RpJoeqe36eiFHi52xHm9vB3XAhtsuLZ 1DAL5VTGLMlhge3xgwnKtqgJzUFUGXHA88XFRNg7brbK+/ApSX7veD5qydN+I7PW51HG IVpeec3rM0Q3vx+0DLznzSeBDPY7FAAdrUxwNdAYvhdSq/PdTN/pB9uCXbvnAOtnlEDo QipIwf8tmHwkck4rX96fVPp6BSy+jprqlPcinK/ovj7B91Nmx9JVHnR5IK9dtE7ZnoRh 9s6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787006618; x=1787611418; h=mime-version:user-agent:content-transfer-encoding:content-type :references:in-reply-to:date:cc:to:from:subject:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=iBb4GI1JETzGycaeth8GVu7eys17B4CdM2QImPbvCqs=; b=OHzqOAVfDN65bBZ7p9E40JQHWVcsJhLyGfF29jeQY7HZiYjN5hfIdv/vn+tNUejUh6 b4MfPUYNTixoVVCVz63Xx9cBZljFTyetnwPPrd6UKfiEhbHZEvGzXcjZleqeeWbed/kj SHbIg9paLsq1EKBQ04Tg2BdMpp29+it2Z1rJcZM0/n+4Nd3dPFcKFH5kHObIHbcSO2GL rpOKXfT8tb8XiDpxxokaJfy8GWoMGAT+BBYUfymFPFR4N907wOtFRMK9h+d4VVkaJJIt 3IKLbDm28n656aM0757fLTFzbUVOQeTLMSAfmnZxephjvT1YWGqnfzIzyhLx8IpFSzuX oGiA== X-Forwarded-Encrypted: i=1; AHgh+Rrvb4a3vVzu0ACpoDtEr18OA3m106NOORu54s6Yo5nPWjBNHJZT+1ncrMWjGA/lzc4CEU720MqOgz31hn0=@vger.kernel.org X-Gm-Message-State: AOJu0YwyWSyWqspMaPNIscW5As1BoarD/9E38Xmg+FVjKYALcMJ60KcY bbbA65AisA9UbXjtBYIZ9KXKwWi4GD5lA6kIr94iA+fJEQ4dWgAlPbowx/lRX8NQhbZb7ZqyiJT BM6MZvj1yKnWp59arE7wUMC0pIt7yGG8Chj8zcJfUh37LvgTzX/NgM3Ue1eiKE6bG5g== X-Gm-Gg: AR+sD10ldmMA5LYCV04mMX46jQu6zrhOPcT8EiTLB7urDKHCIKkmPAWxK2RNUYHkaBn 0aFR5qV7iUCue7Fgot+o8pgDWHSn7Dgl+PxqhNBkj5K1rbj82yAXAPMGwr7ChXRv2k/MJ3autwm B4UhlcR5FBYDqxpEIxcbDvLj7iLp4feEa87ucyamhmDseOfXDE+W06nY4RkFGzHcGUQ13HQrgAU /mVtnPaXkV5CrF+hYuo4xqAsetbOoYVvOX2I6IxeWHSPs25dJo4LkK7Ci65TbyuipH+pzttJ9N1 b0NjleOhNkotrTD/gnx96J53jEQzAg6VoRB68nXMijdYh/vN7YUC8d9NdwyfTkMHCnSE8ZzQ X-Received: by 2002:a05:622a:1aa1:b0:51c:1117:c7c with SMTP id d75a77b69052e-52d85439e1cmr283996111cf.25.1787006618171; Mon, 17 Aug 2026 15:43:38 -0700 (PDT) X-Received: by 2002:a05:622a:1aa1:b0:51c:1117:c7c with SMTP id d75a77b69052e-52d85439e1cmr283995771cf.25.1787006617649; Mon, 17 Aug 2026 15:43:37 -0700 (PDT) Received: from [192.168.8.4] ([100.0.180.93]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90c4593369csm18934786d6.29.2026.08.17.15.43.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 15:43:36 -0700 (PDT) Message-ID: <71b8aaed1153fe1b5562db4dd395bb205f04d0ec.camel@redhat.com> Subject: Re: [PATCH 6/7] nouveau/dispnv50: program pixel clocks above 2.147GHz on GB20x From: lyude@redhat.com To: Mohamed Ahmed , linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Danilo Krummrich , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Mary Guillemard , nouveau@lists.freedesktop.org Date: Mon, 17 Aug 2026 18:43:35 -0400 In-Reply-To: <20260814235705.59132-7-mohamedahmedegypt2001@gmail.com> References: <20260814235705.59132-1-mohamedahmedegypt2001@gmail.com> <20260814235705.59132-7-mohamedahmedegypt2001@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.58.3 (3.58.3-1.fc43) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 On Sat, 2026-08-15 at 03:57 +0400, Mohamed Ahmed wrote: > 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. >=20 > 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. >=20 > 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). >=20 > Signed-off-by: Mohamed Ahmed > --- > =C2=A0drivers/gpu/drm/nouveau/dispnv50/headca7d.c=C2=A0=C2=A0 | 21 ++++++= ++++++++++- > -- > =C2=A0.../drm/nouveau/include/nvhw/class/clca7d.h=C2=A0=C2=A0 |=C2=A0 4 += +++ > =C2=A02 files changed, 22 insertions(+), 3 deletions(-) >=20 > 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) > =C2=A0{ > =C2=A0 struct nvif_push *push =3D &head->disp->core->chan.push; > =C2=A0 struct nv50_head_mode *m =3D &asyh->mode; > + const u64 hz =3D (u64)m->clock * 1000; > =C2=A0 const int i =3D head->base.index; > =C2=A0 int ret; > =C2=A0 > - ret =3D PUSH_WAIT(push, 11); > + ret =3D PUSH_WAIT(push, 15); This can be 14, see below > =C2=A0 if (ret) > =C2=A0 return ret; > =C2=A0 > @@ -245,11 +246,25 @@ headca7d_mode(struct nv50_head *head, struct > nv50_head_atom *asyh) > =C2=A0 PUSH_MTHD(push, NVCA7D, HEAD_SET_CONTROL(i), > =C2=A0 =C2=A0 NVDEF(NVCA7D, HEAD_SET_CONTROL, STRUCTURE, > PROGRESSIVE)); > =C2=A0 > + /* 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. > + */ > =C2=A0 PUSH_MTHD(push, NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY(i), > - =C2=A0 NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY, > HERTZ, m->clock * 1000)); > + =C2=A0 NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY, > HERTZ, > + (u32)(hz & 0x7fffffff))); > =C2=A0 > =C2=A0 PUSH_MTHD(push, NVCA7D, > HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX(i), > - =C2=A0 NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX, > HERTZ, m->clock * 1000)); > + =C2=A0 NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX, > HERTZ, > + (u32)(hz & 0x7fffffff))); > + > + PUSH_MTHD(push, NVCA7D, > HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI(i), > + =C2=A0 NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI, > HERTZ, > + (u32)(hz >> 31))); > + > + PUSH_MTHD(push, NVCA7D, > HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX(i), > + =C2=A0 NVVAL(NVCA7D, > HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX, HERTZ, > + (u32)(hz >> 31))); These last two PUSH_MTHDs can be combined since each mthd comes one after the other: PUSH_MTHD(push, NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI(i), NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI, HERTZ, (u32)(hz >> 31)), HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX(i), NVVAL(NVCA7D, HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX(i), (u32 hz >> 31))); That also lets you go from 15 to 14 in the PUSH_WAIT above. > =C2=A0 > =C2=A0 return 0; > =C2=A0} > 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 @@ > =C2=A0#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX_ADJ1000DIV1001=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 31:31 > =C2=A0#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX_ADJ1000DIV1001_FALSE=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 (0x00000000) > =C2=A0#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_MAX_ADJ1000DIV1001_TRUE=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 (0x00000001) > +#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI(a)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 (0x000020C0 + (a)*0x00000800) > +#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_HERTZ=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 3:0 > +#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX(a)=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 (0x000020C4 + (a)*0x00000800) > +#define > NVCA7D_HEAD_SET_PIXEL_CLOCK_FREQUENCY_HI_MAX_HERTZ=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 3:0 > =C2=A0#define > NVCA7D_HEAD_SET_HEAD_USAGE_BOUNDS(a)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 > =C2=A0=C2=A0 (0x00002030 + (a)*0x00000800) > =C2=A0#define > NVCA7D_HEAD_SET_HEAD_USAGE_BOUNDS_CURSOR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0 2:0 > =C2=A0#define > NVCA7D_HEAD_SET_HEAD_USAGE_BOUNDS_CURSOR_USAGE_NONE=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 > =C2=A0=C2=A0 (0x00000000)