mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-13 01:52:36 -04:00
drm/nouveau/disp/r535: Add scanline position support + head state support
That's right! It looks like this never actually got finished, something which I just noticed today when I saw this fun message spamming one of my test machine's kernel logs when enabling display debug output for nouveau: [drm:drm_crtc_vblank_helper_get_vblank_timestamp_internal] crtc 0 : scanoutpos query failed. So it looks like we've been falling back to DRM's core fallback for a while now, whoops. So, while it seems that we do have the option of doing this through GSP - that doesn't seem like a great idea. Mainly because reading this from GSP would involve a lot more latency then we should have for vblank handling due to the RPC communication. So instead of implementing that, just use gv100_head_state and gv100_head_rgpos for implementing .state and .rgpos. It seems to work perfectly fine! Fixes:9e99444490("drm/nouveau/disp/r535: initial support") Cc: Ben Skeggs <bskeggs@redhat.com> Cc: Dave Airlie <airlied@redhat.com> Cc: Timur Tabi <ttabi@nvidia.com> Cc: Ben Skeggs <bskeggs@nvidia.com> Cc: James Jones <jajones@nvidia.com> Cc: Faith Ekstrand <faith.ekstrand@collabora.com> Cc: Suraj Kandpal <suraj.kandpal@intel.com> Cc: Lyude Paul <lyude@redhat.com> Cc: Aaron Kling <webgeek1234@gmail.com> Cc: Danilo Krummrich <dakr@kernel.org> Cc: Zhang Enpei <zhang.enpei@zte.com.cn> Cc: <stable@vger.kernel.org> # v6.7+ Signed-off-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Link: https://patch.msgid.link/20260429030348.3930866-1-lyude@redhat.com (cherry picked from commit804cb093b2) Signed-off-by: Lyude Paul <lyude@redhat.com>
This commit is contained in:
@@ -253,7 +253,7 @@ gv100_head_vblank_get(struct nvkm_head *head)
|
||||
nvkm_mask(device, 0x611d80 + (head->id * 4), 0x00000004, 0x00000004);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
gv100_head_rgpos(struct nvkm_head *head, u16 *hline, u16 *vline)
|
||||
{
|
||||
struct nvkm_device *device = head->disp->engine.subdev.device;
|
||||
@@ -263,7 +263,7 @@ gv100_head_rgpos(struct nvkm_head *head, u16 *hline, u16 *vline)
|
||||
*hline = nvkm_rd32(device, 0x616334 + hoff) & 0x0000ffff;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
gv100_head_state(struct nvkm_head *head, struct nvkm_head_state *state)
|
||||
{
|
||||
struct nvkm_device *device = head->disp->engine.subdev.device;
|
||||
|
||||
@@ -53,6 +53,8 @@ void gf119_head_rgclk(struct nvkm_head *, int);
|
||||
|
||||
int gv100_head_cnt(struct nvkm_disp *, unsigned long *);
|
||||
int gv100_head_new(struct nvkm_disp *, int id);
|
||||
void gv100_head_state(struct nvkm_head *head, struct nvkm_head_state *state);
|
||||
void gv100_head_rgpos(struct nvkm_head *head, u16 *hline, u16 *vline);
|
||||
|
||||
#define HEAD_MSG(h,l,f,a...) do { \
|
||||
struct nvkm_head *_h = (h); \
|
||||
|
||||
@@ -625,14 +625,10 @@ r535_head_vblank_get(struct nvkm_head *head)
|
||||
nvkm_mask(device, 0x611d80 + (head->id * 4), 0x00000002, 0x00000002);
|
||||
}
|
||||
|
||||
static void
|
||||
r535_head_state(struct nvkm_head *head, struct nvkm_head_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
static const struct nvkm_head_func
|
||||
r535_head = {
|
||||
.state = r535_head_state,
|
||||
.state = gv100_head_state,
|
||||
.rgpos = gv100_head_rgpos,
|
||||
.vblank_get = r535_head_vblank_get,
|
||||
.vblank_put = r535_head_vblank_put,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user