Blob Blame History Raw
From 7bd3bc15a64ae364aab1309d3503f3f04a390a60 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Wed, 21 Apr 2021 13:12:48 +0200
Subject: [PATCH 04/11] drm/ast: drm/ast: Fix boot address for AST2500
Patch-mainline: Never, temporary fixes until upstream resolution
References: bsc#1174416

A code snippet forward-ported from A-Speed downstream driver.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

---
 drivers/gpu/drm/ast/ast_dp501.c | 34 ++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_dp501.c b/drivers/gpu/drm/ast/ast_dp501.c
index 4b85a504825a..8427bc8a9bd1 100644
--- a/drivers/gpu/drm/ast/ast_dp501.c
+++ b/drivers/gpu/drm/ast/ast_dp501.c
@@ -167,7 +167,10 @@ void ast_set_dp501_video_output(struct drm_device *dev, u8 mode)
 
 static u32 get_fw_base(struct ast_private *ast)
 {
-	return ast_mindwm(ast, 0x1e6e2104) & 0x7fffffff;
+	if (ast->chip == AST2500)
+		return ast_mindwm(ast, 0x1e6e2104) & 0xfffffffe;
+	else
+		return ast_mindwm(ast, 0x1e6e2104) & 0x7fffffff;
 }
 
 bool ast_backup_fw(struct drm_device *dev, u8 *addr, u32 size)
@@ -211,21 +214,15 @@ static bool ast_launch_m68k(struct drm_device *dev)
 		/* Get BootAddress */
 		ast_moutdwm(ast, 0x1e6e2000, 0x1688a8a8);
 		data = ast_mindwm(ast, 0x1e6e0004);
-		switch (data & 0x03) {
-		case 0:
-			boot_address = 0x44000000;
-			break;
-		default:
-		case 1:
-			boot_address = 0x48000000;
-			break;
-		case 2:
-			boot_address = 0x50000000;
-			break;
-		case 3:
-			boot_address = 0x60000000;
-			break;
-		}
+		if (ast->chip == AST2500)
+			boot_address = 0x8000000;               /* 128MB */
+		else
+			boot_address = 0x4000000;               /* 64MB */
+		boot_address <<= (data & 0x03);
+		if (ast->chip == AST2500)
+			boot_address |= 0x80000000;             /* Base = 0x80000000 */
+		else
+			boot_address |= 0x40000000;             /* Base = 0x40000000 */
 		boot_address -= 0x200000; /* -2MB */
 
 		/* copy image to buffer */
@@ -238,7 +235,10 @@ static bool ast_launch_m68k(struct drm_device *dev)
 		ast_moutdwm(ast, 0x1e6e2000, 0x1688a8a8);
 
 		/* Launch FW */
-		ast_moutdwm(ast, 0x1e6e2104, 0x80000000 + boot_address);
+		if (ast->chip == AST2500)
+			ast_moutdwm(ast, 0x1e6e2104, boot_address | 0x00000001);
+		else
+			ast_moutdwm(ast, 0x1e6e2104, boot_address | 0x80000000);
 		ast_moutdwm(ast, 0x1e6e2100, 1);
 
 		/* Update Scratch */
-- 
2.26.2