drm/ast: Fix AST2400 POST failure without BMC FW or VBIOS
authorY.C. Chen <yc_chen@aspeedtech.com>
Thu, 23 Feb 2017 07:52:33 +0000 (15:52 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Mar 2017 01:57:14 +0000 (09:57 +0800)
commit 3856081eede297b617560b85e948cfb00bb395ec upstream.

The current POST code for the AST2300/2400 family doesn't work properly
if the chip hasn't been initialized previously by either the BMC own FW
or the VBIOS. This fixes it.

Signed-off-by: Y.C. Chen <yc_chen@aspeedtech.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Tested-by: Y.C. Chen <yc_chen@aspeedtech.com>
Acked-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/ast/ast_post.c

index 50836e5498670e50a18d9f578516bd1e19d7a667..30672a3df8a9b73e8434af6acdac52050a59c0c5 100644 (file)
@@ -1626,12 +1626,44 @@ static void ast_init_dram_2300(struct drm_device *dev)
                temp |= 0x73;
                ast_write32(ast, 0x12008, temp);
 
+               param.dram_freq = 396;
                param.dram_type = AST_DDR3;
+               temp = ast_mindwm(ast, 0x1e6e2070);
                if (temp & 0x01000000)
                        param.dram_type = AST_DDR2;
-               param.dram_chipid = ast->dram_type;
-               param.dram_freq = ast->mclk;
-               param.vram_size = ast->vram_size;
+                switch (temp & 0x18000000) {
+               case 0:
+                       param.dram_chipid = AST_DRAM_512Mx16;
+                       break;
+               default:
+               case 0x08000000:
+                       param.dram_chipid = AST_DRAM_1Gx16;
+                       break;
+               case 0x10000000:
+                       param.dram_chipid = AST_DRAM_2Gx16;
+                       break;
+               case 0x18000000:
+                       param.dram_chipid = AST_DRAM_4Gx16;
+                       break;
+               }
+                switch (temp & 0x0c) {
+                default:
+               case 0x00:
+                       param.vram_size = AST_VIDMEM_SIZE_8M;
+                       break;
+
+               case 0x04:
+                       param.vram_size = AST_VIDMEM_SIZE_16M;
+                       break;
+
+               case 0x08:
+                       param.vram_size = AST_VIDMEM_SIZE_32M;
+                       break;
+
+               case 0x0c:
+                       param.vram_size = AST_VIDMEM_SIZE_64M;
+                       break;
+               }
 
                if (param.dram_type == AST_DDR3) {
                        get_ddr3_info(ast, &param);