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