]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/ast: astdp: Test firmware status once during probing
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 17 Jul 2024 14:24:17 +0000 (16:24 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 30 Jul 2024 10:15:37 +0000 (12:15 +0200)
Test for running ASTDP firmware during probe. Do not bother testing
this later. We cannot do much anyway if the firmware fails. Do not
initialize the ASTDP conenctor if the test fails during device probing.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reported-by: Shixiong Ou <oushixiong@kylinos.cn>
Tested-by: Shixiong Ou <oushixiong@kylinos.cn>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240717143319.104012-3-tzimmermann@suse.de
drivers/gpu/drm/ast/ast_dp.c
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/ast/ast_post.c
drivers/gpu/drm/ast/ast_reg.h

index 1e9259416980ec49cce1b7fc080f562f002e29c5..fba74e55cda783fef6dafcf4ac83499d9d55899c 100644 (file)
@@ -9,8 +9,6 @@
 
 bool ast_astdp_is_connected(struct ast_device *ast)
 {
-       if (!ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, ASTDP_MCU_FW_EXECUTING))
-               return false;
        if (!ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDF, ASTDP_HPD))
                return false;
        if (!ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDC, ASTDP_LINK_SUCCESS))
@@ -24,13 +22,11 @@ int ast_astdp_read_edid(struct drm_device *dev, u8 *ediddata)
        u8 i = 0, j = 0;
 
        /*
-        * CRD1[b5]: DP MCU FW is executing
         * CRDC[b0]: DP link success
         * CRDF[b0]: DP HPD
         * CRE5[b0]: Host reading EDID process is done
         */
-       if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, ASTDP_MCU_FW_EXECUTING) &&
-               ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDC, ASTDP_LINK_SUCCESS) &&
+       if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDC, ASTDP_LINK_SUCCESS) &&
                ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDF, ASTDP_HPD) &&
                ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xE5,
                                                                ASTDP_HOST_EDID_READ_DONE_MASK))) {
@@ -64,9 +60,7 @@ int ast_astdp_read_edid(struct drm_device *dev, u8 *ediddata)
                         */
                        mdelay(j+1);
 
-                       if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1,
-                                                       ASTDP_MCU_FW_EXECUTING) &&
-                               ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDC,
+                       if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDC,
                                                        ASTDP_LINK_SUCCESS) &&
                                ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDF, ASTDP_HPD))) {
                                goto err_astdp_jump_out_loop_of_edid;
@@ -115,8 +109,6 @@ err_astdp_jump_out_loop_of_edid:
        return (~(j+256) + 1);
 
 err_astdp_edid_not_ready:
-       if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, ASTDP_MCU_FW_EXECUTING)))
-               return (~0xD1 + 1);
        if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDC, ASTDP_LINK_SUCCESS)))
                return (~0xDC + 1);
        if (!(ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xDF, ASTDP_HPD)))
@@ -130,32 +122,29 @@ err_astdp_edid_not_ready:
 /*
  * Launch Aspeed DP
  */
-void ast_dp_launch(struct drm_device *dev)
+int ast_dp_launch(struct ast_device *ast)
 {
-       u32 i = 0;
-       u8 bDPExecute = 1;
-       struct ast_device *ast = to_ast_device(dev);
+       struct drm_device *dev = &ast->base;
+       unsigned int i = 10;
 
-       // Wait one second then timeout.
-       while (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, ASTDP_MCU_FW_EXECUTING) !=
-               ASTDP_MCU_FW_EXECUTING) {
-               i++;
-               // wait 100 ms
-               msleep(100);
+       while (i) {
+               u8 vgacrd1 = ast_get_index_reg(ast, AST_IO_VGACRI, 0xd1);
 
-               if (i >= 10) {
-                       // DP would not be ready.
-                       bDPExecute = 0;
+               if (vgacrd1 & AST_IO_VGACRD1_MCU_FW_EXECUTING)
                        break;
-               }
+               --i;
+               msleep(100);
        }
-
-       if (!bDPExecute)
+       if (!i) {
                drm_err(dev, "Wait DPMCU executing timeout\n");
+               return -ENODEV;
+       }
 
        ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xE5,
                               (u8) ~ASTDP_HOST_EDID_READ_DONE_MASK,
                               ASTDP_HOST_EDID_READ_DONE);
+
+       return 0;
 }
 
 
index ba3d86973995fd0444f1b9934e4cc26fd5e769fb..80e968f15fc9eebcd7f8b62f2337eff5e66883bb 100644 (file)
@@ -471,7 +471,7 @@ void ast_init_3rdtx(struct drm_device *dev);
 /* aspeed DP */
 bool ast_astdp_is_connected(struct ast_device *ast);
 int ast_astdp_read_edid(struct drm_device *dev, u8 *ediddata);
-void ast_dp_launch(struct drm_device *dev);
+int ast_dp_launch(struct ast_device *ast);
 void ast_dp_power_on_off(struct drm_device *dev, bool no);
 void ast_dp_set_on_off(struct drm_device *dev, bool no);
 void ast_dp_set_mode(struct drm_crtc *crtc, struct ast_vbios_mode_info *vbios_mode);
index 0637abb70361c9a74d481d8ef8b59262aff83d28..d836f2a4f9f3e0e6aac70d5eea0f2b9f0ade4ca8 100644 (file)
@@ -115,8 +115,10 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post)
        } else if (IS_AST_GEN7(ast)) {
                if (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, TX_TYPE_MASK) ==
                    ASTDP_DPMCU_TX) {
-                       ast->tx_chip_types = AST_TX_ASTDP_BIT;
-                       ast_dp_launch(&ast->base);
+                       int ret = ast_dp_launch(ast);
+
+                       if (!ret)
+                               ast->tx_chip_types = AST_TX_ASTDP_BIT;
                }
        }
 
index 22f548805dfb05a78305125391f5391996c8f4fa..65755798ab94a503fd8522aa8f435fc70b07e7aa 100644 (file)
@@ -351,7 +351,7 @@ void ast_post_gpu(struct drm_device *dev)
 
        if (IS_AST_GEN7(ast)) {
                if (ast->tx_chip_types & AST_TX_ASTDP_BIT)
-                       ast_dp_launch(dev);
+                       ast_dp_launch(ast);
        } else if (ast->config_mode == ast_use_p2a) {
                if (IS_AST_GEN6(ast))
                        ast_post_chip_2500(dev);
index 75671d345057e445368a27173e7bc641b8a0936e..569de318819147b4dbabd13ec6374b8a6cd44d17 100644 (file)
@@ -37,6 +37,8 @@
 #define AST_IO_VGACRCB_HWC_16BPP       BIT(0) /* set: ARGB4444, cleared: 2bpp palette */
 #define AST_IO_VGACRCB_HWC_ENABLED     BIT(1)
 
+#define AST_IO_VGACRD1_MCU_FW_EXECUTING        BIT(5)
+
 #define AST_IO_VGAIR1_R                        (0x5A)
 #define AST_IO_VGAIR1_VREFRESH         BIT(3)
 
 #define AST_DP_VIDEO_ENABLE            BIT(0)
 
 /*
- * CRD1[b5]: DP MCU FW is executing
  * CRDC[b0]: DP link success
  * CRDF[b0]: DP HPD
  * CRE5[b0]: Host reading EDID process is done
  */
-#define ASTDP_MCU_FW_EXECUTING         BIT(5)
 #define ASTDP_LINK_SUCCESS             BIT(0)
 #define ASTDP_HPD                      BIT(0)
 #define ASTDP_HOST_EDID_READ_DONE      BIT(0)