drm/ast: Set PCI config before accessing I/O registers
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 21 Jun 2023 12:53:40 +0000 (14:53 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 27 Jun 2023 12:26:30 +0000 (14:26 +0200)
Access to I/O registers is required to detect and set up the
device. Enable the rsp PCI config bits before. While at it,
convert the magic number to macro constants.

Enabling the PCI config bits was done after trying to detect
the device. It was probably too late at this point.

v2:
* use standard 16-bit PCI r/w access (Jingfeng)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Tested-by: Jocelyn Falempe <jfalempe@redhat.com> # AST2600
Reviewed-by: Sui Jingfeng <suijingfeng@loongson.cn>
Link: https://patchwork.freedesktop.org/patch/msgid/20230621130032.3568-7-tzimmermann@suse.de
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/ast/ast_post.c

index 0141705beaee9b2f112a4ce54dbe3dcd5c077355..630105feec18a766cc788bcb5080485a98ce8e47 100644 (file)
@@ -52,7 +52,6 @@
 #define PCI_CHIP_AST2000 0x2000
 #define PCI_CHIP_AST2100 0x2010
 
-
 enum ast_chip {
        AST2000,
        AST2100,
index c6987e04466180ab44b1c629463b300b693eab55..01f938c2da28f64f1d727a222a311429581ece9f 100644 (file)
 
 #include "ast_drv.h"
 
+static int ast_init_pci_config(struct pci_dev *pdev)
+{
+       int err;
+       u16 pcis04;
+
+       err = pci_read_config_word(pdev, PCI_COMMAND, &pcis04);
+       if (err)
+               goto out;
+
+       pcis04 |= PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
+
+       err = pci_write_config_word(pdev, PCI_COMMAND, pcis04);
+
+out:
+       return pcibios_err_to_errno(err);
+}
+
 static void ast_detect_config_mode(struct drm_device *dev, u32 *scu_rev)
 {
        struct device_node *np = dev->dev->of_node;
@@ -399,6 +416,10 @@ struct ast_device *ast_device_create(const struct drm_driver *drv,
                        return ERR_PTR(-EIO);
        }
 
+       ret = ast_init_pci_config(pdev);
+       if (ret)
+               return ERR_PTR(ret);
+
        if (!ast_is_vga_enabled(dev)) {
                drm_info(dev, "VGA not enabled on entry, requesting chip POST\n");
                need_post = true;
index aa3f2cb00f82c57380fb5e791c8b9575acc3a02c..2da5bdb4bac45bd670ddd032bd28615831f338b9 100644 (file)
@@ -361,12 +361,6 @@ static void ast_init_dram_reg(struct drm_device *dev)
 void ast_post_gpu(struct drm_device *dev)
 {
        struct ast_device *ast = to_ast_device(dev);
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       u32 reg;
-
-       pci_read_config_dword(pdev, 0x04, &reg);
-       reg |= 0x3;
-       pci_write_config_dword(pdev, 0x04, reg);
 
        ast_enable_vga(dev);
        ast_open_key(ast);