drm/ast: Enable and unlock device access early during init
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 21 Jun 2023 12:53:41 +0000 (14:53 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 27 Jun 2023 12:26:32 +0000 (14:26 +0200)
POST and memory management contains code to enable access to the
device's memory spaces. This is too late. Consolidate this code at
the beginning of the device initialization.

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

index 630105f..31fead3 100644 (file)
@@ -287,11 +287,6 @@ static inline void ast_set_index_reg_mask(struct ast_device *ast, u32 base, u8 i
        ast_set_index_reg(ast, base, index, tmp);
 }
 
-static inline void ast_open_key(struct ast_device *ast)
-{
-       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x80, 0xA8);
-}
-
 #define AST_VIDMEM_SIZE_8M    0x00800000
 #define AST_VIDMEM_SIZE_16M   0x01000000
 #define AST_VIDMEM_SIZE_32M   0x02000000
@@ -470,9 +465,6 @@ int ast_mode_config_init(struct ast_device *ast);
 int ast_mm_init(struct ast_device *ast);
 
 /* ast post */
-void ast_enable_vga(struct drm_device *dev);
-void ast_enable_mmio(struct drm_device *dev);
-bool ast_is_vga_enabled(struct drm_device *dev);
 void ast_post_gpu(struct drm_device *dev);
 u32 ast_mindwm(struct ast_device *ast, u32 r);
 void ast_moutdwm(struct ast_device *ast, u32 r, u32 v);
index 01f938c..031ff4e 100644 (file)
@@ -52,6 +52,36 @@ out:
        return pcibios_err_to_errno(err);
 }
 
+static bool ast_is_vga_enabled(struct drm_device *dev)
+{
+       struct ast_device *ast = to_ast_device(dev);
+       u8 ch;
+
+       ch = ast_io_read8(ast, AST_IO_VGA_ENABLE_PORT);
+
+       return !!(ch & 0x01);
+}
+
+static void ast_enable_vga(struct drm_device *dev)
+{
+       struct ast_device *ast = to_ast_device(dev);
+
+       ast_io_write8(ast, AST_IO_VGA_ENABLE_PORT, 0x01);
+       ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, 0x01);
+}
+
+static void ast_enable_mmio(struct drm_device *dev)
+{
+       struct ast_device *ast = to_ast_device(dev);
+
+       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa1, 0x06);
+}
+
+static void ast_open_key(struct ast_device *ast)
+{
+       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x80, 0xA8);
+}
+
 static void ast_detect_config_mode(struct drm_device *dev, u32 *scu_rev)
 {
        struct device_node *np = dev->dev->of_node;
index e16af60..bc174bd 100644 (file)
@@ -38,8 +38,6 @@ static u32 ast_get_vram_size(struct ast_device *ast)
        u8 jreg;
        u32 vram_size;
 
-       ast_open_key(ast);
-
        vram_size = AST_VIDMEM_DEFAULT_SIZE;
        jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xaa, 0xff);
        switch (jreg & 3) {
index 2da5bdb..b765eeb 100644 (file)
 static void ast_post_chip_2300(struct drm_device *dev);
 static void ast_post_chip_2500(struct drm_device *dev);
 
-void ast_enable_vga(struct drm_device *dev)
-{
-       struct ast_device *ast = to_ast_device(dev);
-
-       ast_io_write8(ast, AST_IO_VGA_ENABLE_PORT, 0x01);
-       ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, 0x01);
-}
-
-void ast_enable_mmio(struct drm_device *dev)
-{
-       struct ast_device *ast = to_ast_device(dev);
-
-       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa1, 0x06);
-}
-
-
-bool ast_is_vga_enabled(struct drm_device *dev)
-{
-       struct ast_device *ast = to_ast_device(dev);
-       u8 ch;
-
-       ch = ast_io_read8(ast, AST_IO_VGA_ENABLE_PORT);
-
-       return !!(ch & 0x01);
-}
-
 static const u8 extreginfo[] = { 0x0f, 0x04, 0x1c, 0xff };
 static const u8 extreginfo_ast2300[] = { 0x0f, 0x04, 0x1f, 0xff };
 
@@ -362,9 +336,6 @@ void ast_post_gpu(struct drm_device *dev)
 {
        struct ast_device *ast = to_ast_device(dev);
 
-       ast_enable_vga(dev);
-       ast_open_key(ast);
-       ast_enable_mmio(dev);
        ast_set_def_ext_reg(dev);
 
        if (ast->chip == AST2600) {