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
This commit is contained in:
parent
85397f6bc4
commit
ce19021fd9
9 changed files with 100 additions and 55 deletions
|
@ -24,6 +24,32 @@ int mgag200_modeset = -1;
|
|||
MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
|
||||
module_param_named(modeset, mgag200_modeset, int, 0400);
|
||||
|
||||
int mgag200_init_pci_options(struct pci_dev *pdev, u32 option, u32 option2)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
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);
|
||||
}
|
||||
|
||||
err = pci_write_config_dword(pdev, PCI_MGA_OPTION, option);
|
||||
if (err != PCIBIOS_SUCCESSFUL) {
|
||||
dev_err(dev, "pci_write_config_dword(PCI_MGA_OPTION) failed: %d\n", err);
|
||||
return pcibios_err_to_errno(err);
|
||||
}
|
||||
|
||||
err = pci_write_config_dword(pdev, PCI_MGA_OPTION2, option2);
|
||||
if (err != PCIBIOS_SUCCESSFUL) {
|
||||
dev_err(dev, "pci_write_config_dword(PCI_MGA_OPTION2) failed: %d\n", err);
|
||||
return pcibios_err_to_errno(err);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* DRM driver
|
||||
*/
|
||||
|
@ -46,25 +72,10 @@ static const struct drm_driver mgag200_driver = {
|
|||
* DRM device
|
||||
*/
|
||||
|
||||
static bool mgag200_has_sgram(struct mga_device *mdev)
|
||||
{
|
||||
struct drm_device *dev = &mdev->base;
|
||||
struct pci_dev *pdev = to_pci_dev(dev->dev);
|
||||
u32 option;
|
||||
int ret;
|
||||
|
||||
ret = pci_read_config_dword(pdev, PCI_MGA_OPTION, &option);
|
||||
if (drm_WARN(dev, ret, "failed to read PCI config dword: %d\n", ret))
|
||||
return false;
|
||||
|
||||
return !!(option & PCI_MGA_OPTION_HARDPWMSK);
|
||||
}
|
||||
|
||||
int mgag200_regs_init(struct mga_device *mdev)
|
||||
{
|
||||
struct drm_device *dev = &mdev->base;
|
||||
struct pci_dev *pdev = to_pci_dev(dev->dev);
|
||||
u32 option, option2;
|
||||
u8 crtcext3;
|
||||
int ret;
|
||||
|
||||
|
@ -72,46 +83,6 @@ int mgag200_regs_init(struct mga_device *mdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
switch (mdev->type) {
|
||||
case G200_PCI:
|
||||
case G200_AGP:
|
||||
if (mgag200_has_sgram(mdev))
|
||||
option = 0x4049cd21;
|
||||
else
|
||||
option = 0x40499121;
|
||||
option2 = 0x00008000;
|
||||
break;
|
||||
case G200_SE_A:
|
||||
case G200_SE_B:
|
||||
option = 0x40049120;
|
||||
if (mgag200_has_sgram(mdev))
|
||||
option |= PCI_MGA_OPTION_HARDPWMSK;
|
||||
option2 = 0x00008000;
|
||||
break;
|
||||
case G200_WB:
|
||||
case G200_EW3:
|
||||
option = 0x41049120;
|
||||
option2 = 0x0000b000;
|
||||
break;
|
||||
case G200_EV:
|
||||
option = 0x00000120;
|
||||
option2 = 0x0000b000;
|
||||
break;
|
||||
case G200_EH:
|
||||
case G200_EH3:
|
||||
option = 0x00000120;
|
||||
option2 = 0x0000b000;
|
||||
break;
|
||||
default:
|
||||
option = 0;
|
||||
option2 = 0;
|
||||
}
|
||||
|
||||
if (option)
|
||||
pci_write_config_dword(pdev, PCI_MGA_OPTION, option);
|
||||
if (option2)
|
||||
pci_write_config_dword(pdev, PCI_MGA_OPTION2, option2);
|
||||
|
||||
/* BAR 1 contains registers */
|
||||
mdev->rmmio_base = pci_resource_start(pdev, 1);
|
||||
mdev->rmmio_size = pci_resource_len(pdev, 1);
|
||||
|
|
|
@ -256,6 +256,7 @@ static inline struct mgag200_g200se_device *to_mgag200_g200se_device(struct drm_
|
|||
}
|
||||
|
||||
/* mgag200_drv.c */
|
||||
int mgag200_init_pci_options(struct pci_dev *pdev, u32 option, u32 option2);
|
||||
int mgag200_regs_init(struct mga_device *mdev);
|
||||
|
||||
/* mgag200_<device type>.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;
|
||||
|
||||
|
|
|
@ -27,6 +27,10 @@ struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const stru
|
|||
mdev->flags = flags;
|
||||
mdev->type = type;
|
||||
|
||||
ret = mgag200_init_pci_options(pdev, 0x00000120, 0x0000b000);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ret = mgag200_regs_init(mdev);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
|
|
@ -28,6 +28,10 @@ struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev,
|
|||
mdev->flags = flags;
|
||||
mdev->type = type;
|
||||
|
||||
ret = mgag200_init_pci_options(pdev, 0x00000120, 0x0000b000);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ret = mgag200_regs_init(mdev);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
|
|
@ -24,6 +24,10 @@ struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const stru
|
|||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
ret = mgag200_init_pci_options(pdev, 0x00000120, 0x0000b000);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
mdev->flags = flags;
|
||||
mdev->type = type;
|
||||
|
||||
|
|
|
@ -25,6 +25,10 @@ struct mga_device *mgag200_g200ew3_device_create(struct pci_dev *pdev,
|
|||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
ret = mgag200_init_pci_options(pdev, 0x41049120, 0x0000b000);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
mdev->flags = flags;
|
||||
mdev->type = type;
|
||||
|
||||
|
|
|
@ -6,6 +6,28 @@
|
|||
|
||||
#include "mgag200_drv.h"
|
||||
|
||||
static int mgag200_g200se_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);
|
||||
|
||||
option = 0x40049120;
|
||||
if (has_sgram)
|
||||
option |= PCI_MGA_OPTION_HARDPWMSK;
|
||||
|
||||
return mgag200_init_pci_options(pdev, option, 0x00008000);
|
||||
}
|
||||
|
||||
/*
|
||||
* DRM device
|
||||
*/
|
||||
|
@ -37,6 +59,10 @@ struct mga_device *mgag200_g200se_device_create(struct pci_dev *pdev, const stru
|
|||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
ret = mgag200_g200se_init_pci_options(pdev);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
mdev->flags = flags;
|
||||
mdev->type = type;
|
||||
|
||||
|
|
|
@ -24,6 +24,10 @@ struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const stru
|
|||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
ret = mgag200_init_pci_options(pdev, 0x41049120, 0x0000b000);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
mdev->flags = flags;
|
||||
mdev->type = type;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue