summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/mgag200/mgag200_g200.c
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2022-06-01 14:25:15 +0300
committerThomas Zimmermann <tzimmermann@suse.de>2022-06-07 10:39:47 +0300
commitce19021fd99ab2c915f2b44b0df39bef75f11d18 (patch)
tree7ccc0b665e190dde7196c386d5e84646da6cf27b /drivers/gpu/drm/mgag200/mgag200_g200.c
parent85397f6bc4ff13a6bc5259facb8ebebb1986d666 (diff)
downloadlinux-ce19021fd99ab2c915f2b44b0df39bef75f11d18.tar.xz
drm/mgag200: Move PCI-option setup into model-specific code
Split the PCI code into a single call for each model. G200 and G200SE each contain a dedicated helper with additional instructions. Noteably, the G200ER has no code for PCI setup. In a later patch, the magic numbers should be replaced by descriptive constants. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Tested-by: Jocelyn Falempe <jfalempe@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220601112522.5774-4-tzimmermann@suse.de
Diffstat (limited to 'drivers/gpu/drm/mgag200/mgag200_g200.c')
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_g200.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/mgag200/mgag200_g200.c b/drivers/gpu/drm/mgag200/mgag200_g200.c
index ca9522daf6e1..b9ec6367719c 100644
--- a/drivers/gpu/drm/mgag200/mgag200_g200.c
+++ b/drivers/gpu/drm/mgag200/mgag200_g200.c
@@ -6,6 +6,29 @@
#include "mgag200_drv.h"
+static int mgag200_g200_init_pci_options(struct pci_dev *pdev)
+{
+ struct device *dev = &pdev->dev;
+ bool has_sgram;
+ u32 option;
+ int err;
+
+ err = pci_read_config_dword(pdev, PCI_MGA_OPTION, &option);
+ if (err != PCIBIOS_SUCCESSFUL) {
+ dev_err(dev, "pci_read_config_dword(PCI_MGA_OPTION) failed: %d\n", err);
+ return pcibios_err_to_errno(err);
+ }
+
+ has_sgram = !!(option & PCI_MGA_OPTION_HARDPWMSK);
+
+ if (has_sgram)
+ option = 0x4049cd21;
+ else
+ option = 0x40499121;
+
+ return mgag200_init_pci_options(pdev, option, 0x00008000);
+}
+
/*
* DRM Device
*/
@@ -149,6 +172,10 @@ struct mga_device *mgag200_g200_device_create(struct pci_dev *pdev, const struct
pci_set_drvdata(pdev, dev);
+ ret = mgag200_g200_init_pci_options(pdev);
+ if (ret)
+ return ERR_PTR(ret);
+
mdev->flags = flags;
mdev->type = type;