Patch "drm/nouveau/bios/disp: fix handling of "match any protocol" entries" has been added to the 4.6-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
drm/nouveau/bios/disp: fix handling of "match any protocol" entries
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-nouveau-bios-disp-fix-handling-of-match-any-protocol-entries.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
bc9139d23f6b038e32bcd2dffdee70a8d76b3976Mon Sep 17 00:00:00 2001
From: Ben Skeggs <[email protected]>
Date: Wed, 25 May 2016 10:56:24 +1000
Subject: drm/nouveau/bios/disp: fix handling of "match any protocol" entries
From: Ben Skeggs <[email protected]>
commit bc9139d23f6b038e32bcd2dffdee70a8d76b3976 upstream.
As it turns out, a value of 0xff means "any protocol" and not "VGA".
--- drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h | 5 +++-- drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c | 13 +++++-------- drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c | 12 ++++-------- drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c | 8 +++++--- 4 files changed, 17 insertions(+), 21 deletions(-)
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h +3 -2
@@ -25,7 +25,8 @@ u16 nvbios_outp_match(struct nvkm_bios * u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_outp *);struct nvbios_ocfg { -u16 match; +u8 proto; +u8 flags;u16 clkcmp[2 ]; };
@@ -33,7 +34,7 @@ u16 nvbios_ocfg_entry(struct nvkm_bios * u8 *ver, u8 *hdr, u8 *cnt, u8 *len);u16 nvbios_ocfg_parse (struct nvkm_bios *,u16 outp,u8 idx,u8 *ver,u8 *hdr,u8 *cnt,u8 *len,struct nvbios_ocfg *); -u16 nvbios_ocfg_match (struct nvkm_bios *,u16 outp,u16 type, +u16 nvbios_ocfg_match (struct nvkm_bios *,u16 outp,u8 proto,u8 flags,u8 *ver,u8 *hdr,u8 *cnt,u8 *len,struct nvbios_ocfg *);u16 nvbios_oclk_match (struct nvkm_bios *,u16 cmp,u32 khz);#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c +5 -8
@@ -76,6 +76,7 @@ exec_lookup(struct nv50_disp *disp, int mask |=0x0001 << or; mask |=0x0100 << head; +list_for_each_entry (outp, &disp->base.outp, head) {if ((outp->info.hasht &0xff ) == type && (outp->info.hashm & mask) == mask) {
@@ -155,25 +156,21 @@ exec_clkcmp(struct nv50_disp *disp, intif (!outp)return NULL ; + *conf = (ctrl &0x00000f00 ) >>8 ;switch (outp->info.type) {case DCB_OUTPUT_TMDS : - *conf = (ctrl &0x00000f00 ) >>8 ;if (*conf ==5 ) *conf |=0x0100 ;break ;case DCB_OUTPUT_LVDS : - *conf = disp->sor.lvdsconf; -break ; -case DCB_OUTPUT_DP : - *conf = (ctrl &0x00000f00 ) >>8 ; + *conf |= disp->sor.lvdsconf;break ; -case DCB_OUTPUT_ANALOG :default : - *conf =0x00ff ;break ; } - data =nvbios_ocfg_match (bios, data, *conf, &ver, &hdr, &cnt, &len, &info2); + data =nvbios_ocfg_match (bios, data, *conf &0xff , *conf >>8 , + &ver, &hdr, &cnt, &len, &info2);if (data && id <0xff ) { data =nvbios_oclk_match (bios, info2.clkcmp[id], pclk);if (data) {
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c +4 -8
@@ -387,22 +387,17 @@ exec_clkcmp(struct nv50_disp *disp, intif (!outp)return NULL ; + *conf = (ctrl &0x00000f00 ) >>8 ;if (outp->info.location ==0 ) {switch (outp->info.type) {case DCB_OUTPUT_TMDS : - *conf = (ctrl &0x00000f00 ) >>8 ;if (*conf ==5 ) *conf |=0x0100 ;break ;case DCB_OUTPUT_LVDS : - *conf = disp->sor.lvdsconf; + *conf |= disp->sor.lvdsconf;break ; -case DCB_OUTPUT_DP : - *conf = (ctrl &0x00000f00 ) >>8 ; -break ; -case DCB_OUTPUT_ANALOG :default : - *conf =0x00ff ;break ; } }else {
@@ -410,7 +405,8 @@ exec_clkcmp(struct nv50_disp *disp, int pclk = pclk /2 ; } - data =nvbios_ocfg_match (bios, data, *conf, &ver, &hdr, &cnt, &len, &info2); + data =nvbios_ocfg_match (bios, data, *conf &0xff , *conf >>8 , + &ver, &hdr, &cnt, &len, &info2);if (data && id <0xff ) { data =nvbios_oclk_match (bios, info2.clkcmp[id], pclk);if (data) {
drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c +5 -3
@@ -141,7 +141,8 @@ nvbios_ocfg_parse(struct nvkm_bios *bios {u16 data =nvbios_ocfg_entry (bios, outp, idx, ver, hdr, cnt, len);if (data) { - info->match =nvbios_rd16 (bios, data +0x00 ); + info->proto =nvbios_rd08 (bios, data +0x00 ); + info->flags =nvbios_rd16 (bios, data +0x01 ); info->clkcmp[0 ] =nvbios_rd16 (bios, data +0x02 ); info->clkcmp[1 ] =nvbios_rd16 (bios, data +0x04 ); }
@@ -149,12 +150,13 @@ nvbios_ocfg_parse(struct nvkm_bios *bios }u16 -nvbios_ocfg_match (struct nvkm_bios *bios,u16 outp,u16 type, +nvbios_ocfg_match (struct nvkm_bios *bios,u16 outp,u8 proto,u8 flags,u8 *ver,u8 *hdr,u8 *cnt,u8 *len,struct nvbios_ocfg *info) {u16 data, idx =0 ;while ((data =nvbios_ocfg_parse (bios, outp, idx++, ver, hdr, cnt, len, info))) { -if (info->match == type) +if ((info->proto == proto || info->proto ==0xff ) && + (info->flags == flags))break ; }return data;
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/drm-nouveau-fix-for-disabled-fbdev-emulation.patch queue-4.6/drm-nouveau-disp-sor-gf119-both-links-use-the-same-training-register.patch queue-4.6/drm-nouveau-gr-gf100-update-sm-error-decoding-from-gk20a-nvgpu-headers.patch queue-4.6/drm-nouveau-revert-drm-nouveau-device-pci-set-as-non-cpu-coherent-on-arm64.patch queue-4.6/drm-nouveau-bios-disp-fix-handling-of-match-any-protocol-entries.patch queue-4.6/drm-nouveau-disp-sor-gf119-select-correct-sor-when-poking-training-pattern.patch queue-4.6/drm-nouveau-disp-sor-gm107-training-pattern-registers-are-like-gm200.patch queue-4.6/drm-nouveau-fbcon-fix-out-of-bounds-memory-accesses.patch queue-4.6/drm-nouveau-ltc-gm107-fix-typo-in-the-address-of-nv_pltcg_ltc0_lts0_intr.patch