Ben Skeggs e372080
From 2120b3b32d96d523b18c82beb99a2d1c6135eb49 Mon Sep 17 00:00:00 2001
Ben Skeggs e372080
From: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs e372080
Date: Mon, 21 Mar 2011 21:31:21 +1000
Ben Skeggs e372080
Subject: [PATCH] drm/nouveau: implement init table opcode 0x5c
Ben Skeggs e372080
Ben Skeggs e372080
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs e372080
---
Ben Skeggs e372080
 drivers/gpu/drm/nouveau/nouveau_bios.c |   27 ++++++++++++++++++++++++---
Ben Skeggs e372080
 1 files changed, 24 insertions(+), 3 deletions(-)
Ben Skeggs e372080
Ben Skeggs e372080
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
Ben Skeggs e372080
index 8314a49..eca191a 100644
Ben Skeggs e372080
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
Ben Skeggs e372080
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
Ben Skeggs e372080
@@ -269,7 +269,7 @@ struct init_tbl_entry {
Ben Skeggs e372080
 	int (*handler)(struct nvbios *, uint16_t, struct init_exec *);
Ben Skeggs e372080
 };
Ben Skeggs e372080
 
Ben Skeggs e372080
-static int parse_init_table(struct nvbios *, unsigned int, struct init_exec *);
Ben Skeggs e372080
+static int parse_init_table(struct nvbios *, uint16_t, struct init_exec *);
Ben Skeggs e372080
 
Ben Skeggs e372080
 #define MACRO_INDEX_SIZE	2
Ben Skeggs e372080
 #define MACRO_SIZE		8
Ben Skeggs e372080
@@ -2011,6 +2011,27 @@ init_sub_direct(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
Ben Skeggs e372080
 }
Ben Skeggs e372080
 
Ben Skeggs e372080
 static int
Ben Skeggs e372080
+init_jump(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
Ben Skeggs e372080
+{
Ben Skeggs e372080
+	/*
Ben Skeggs e372080
+	 * INIT_JUMP   opcode: 0x5C ('\')
Ben Skeggs e372080
+	 *
Ben Skeggs e372080
+	 * offset      (8  bit): opcode
Ben Skeggs e372080
+	 * offset + 1  (16 bit): offset (in bios)
Ben Skeggs e372080
+	 *
Ben Skeggs e372080
+	 * Continue execution of init table from 'offset'
Ben Skeggs e372080
+	 */
Ben Skeggs e372080
+
Ben Skeggs e372080
+	uint16_t jmp_offset = ROM16(bios->data[offset + 1]);
Ben Skeggs e372080
+
Ben Skeggs e372080
+	if (!iexec->execute)
Ben Skeggs e372080
+		return 3;
Ben Skeggs e372080
+
Ben Skeggs e372080
+	BIOSLOG(bios, "0x%04X: Jump to 0x%04X\n", offset, jmp_offset);
Ben Skeggs e372080
+	return jmp_offset - offset;
Ben Skeggs e372080
+}
Ben Skeggs e372080
+
Ben Skeggs e372080
+static int
Ben Skeggs e372080
 init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
Ben Skeggs e372080
 {
Ben Skeggs e372080
 	/*
Ben Skeggs e372080
@@ -3659,6 +3680,7 @@ static struct init_tbl_entry itbl_entry[] = {
Ben Skeggs e372080
 	{ "INIT_ZM_REG_SEQUENCE"              , 0x58, init_zm_reg_sequence            },
Ben Skeggs e372080
 	/* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */
Ben Skeggs e372080
 	{ "INIT_SUB_DIRECT"                   , 0x5B, init_sub_direct                 },
Ben Skeggs e372080
+	{ "INIT_JUMP"                         , 0x5C, init_jump                       },
Ben Skeggs e372080
 	{ "INIT_I2C_IF"                       , 0x5E, init_i2c_if                     },
Ben Skeggs e372080
 	{ "INIT_COPY_NV_REG"                  , 0x5F, init_copy_nv_reg                },
Ben Skeggs e372080
 	{ "INIT_ZM_INDEX_IO"                  , 0x62, init_zm_index_io                },
Ben Skeggs e372080
@@ -3700,8 +3722,7 @@ static struct init_tbl_entry itbl_entry[] = {
Ben Skeggs e372080
 #define MAX_TABLE_OPS 1000
Ben Skeggs e372080
 
Ben Skeggs e372080
 static int
Ben Skeggs e372080
-parse_init_table(struct nvbios *bios, unsigned int offset,
Ben Skeggs e372080
-		 struct init_exec *iexec)
Ben Skeggs e372080
+parse_init_table(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
Ben Skeggs e372080
 {
Ben Skeggs e372080
 	/*
Ben Skeggs e372080
 	 * Parses all commands in an init table.
Ben Skeggs e372080
-- 
Ben Skeggs e372080
1.7.4.1
Ben Skeggs e372080