Blob Blame History Raw
From b88afa43967578741e3b258c80e01969fddd5fe6 Mon Sep 17 00:00:00 2001
From: Ben Skeggs <bskeggs@redhat.com>
Date: Fri, 19 May 2017 23:59:34 +1000
Subject: [PATCH] drm/nouveau/bios/init: add or/link args separate from output path
Git-commit: b88afa43967578741e3b258c80e01969fddd5fe6
Patch-mainline: v4.13-rc1
References: bsc#1095094

As of DCB 4.1, these are not the same thing.

Compatibility temporarily in place until callers have been updated.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Acked-by: Takashi Iwai <tiwai@suse.de>

---
 drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/init.h |    2 ++
 drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c         |   14 ++++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/init.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/init.h
@@ -7,6 +7,8 @@ struct nvbios_init {
 	u32 offset;
 
 	struct dcb_output *outp;
+	int or;
+	int link;
 	union {
 		int head;
 		int crtc;
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c
@@ -87,8 +87,8 @@ static inline int
 init_or(struct nvbios_init *init)
 {
 	if (init_exec(init)) {
-		if (init->outp)
-			return ffs(init->outp->or) - 1;
+		if (init->or >= 0)
+			return init->or;
 		error("script needs OR!!\n");
 	}
 	return 0;
@@ -98,8 +98,8 @@ static inline int
 init_link(struct nvbios_init *init)
 {
 	if (init_exec(init)) {
-		if (init->outp)
-			return !(init->outp->sorconf.link & 1);
+		if (init->link)
+			return init->link == 2;
 		error("script needs OR link\n");
 	}
 	return 0;
@@ -2277,6 +2277,12 @@ int
 nvbios_exec(struct nvbios_init *init)
 {
 	struct nvkm_bios *bios = init->subdev->device->bios;
+
+	if (init->bios) {
+		init->or = init->outp ? ffs(init->outp->or) - 1 : -1;
+		init->link = init->outp ? init->outp->sorconf.link : 0;
+	}
+
 	init->nested++;
 	while (init->offset) {
 		u8 opcode = nvbios_rd08(bios, init->offset);