Skip to content

Commit

Permalink
drm/mgag200: Move DAC-register setup into model-specific code
Browse files Browse the repository at this point in the history
Provide an init function for each model's DAC registers. Remove
the shared helper.

The code for initializing the DAC registers consisted of a large
table of default value, plus many exceptions for the various G200
models. Providing a per-model implementation makes if more readable.
At some point, some of the initialization should probably move into
the modesetting code.

v2:
	* don't duplicate DAC values unnecessarily (Sam, Jocelyn)

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/20220728124103.30159-3-tzimmermann@suse.de
  • Loading branch information
Thomas Zimmermann committed Jul 29, 2022
1 parent 4437315 commit 1ee181f
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 79 deletions.
30 changes: 30 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,33 @@
#define MGA_MISC_OUT 0x1fc2
#define MGA_MISC_IN 0x1fcc

/*
* TODO: This is a pretty large set of default values for all kinds of
* settings. It should be split and set in the various DRM helpers,
* such as the CRTC reset or atomic_enable helpers. The PLL values
* probably belong to each model's PLL code.
*/
#define MGAG200_DAC_DEFAULT(xvrefctrl, xpixclkctrl, xmiscctrl, xsyspllm, xsysplln, xsyspllp) \
/* 0x00: */ 0, 0, 0, 0, 0, 0, 0x00, 0, \
/* 0x08: */ 0, 0, 0, 0, 0, 0, 0, 0, \
/* 0x10: */ 0, 0, 0, 0, 0, 0, 0, 0, \
/* 0x18: */ (xvrefctrl), \
/* 0x19: */ 0, \
/* 0x1a: */ (xpixclkctrl), \
/* 0x1b: */ 0xff, 0xbf, 0x20, \
/* 0x1e: */ (xmiscctrl), \
/* 0x1f: */ 0x20, \
/* 0x20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
/* 0x28: */ 0x00, 0x00, 0x00, 0x00, \
/* 0x2c: */ (xsyspllm), \
/* 0x2d: */ (xsysplln), \
/* 0x2e: */ (xsyspllp), \
/* 0x2f: */ 0x40, \
/* 0x30: */ 0x00, 0xb0, 0x00, 0xc2, 0x34, 0x14, 0x02, 0x83, \
/* 0x38: */ 0x00, 0x93, 0x00, 0x77, 0x00, 0x00, 0x00, 0x3a, \
/* 0x40: */ 0, 0, 0, 0, 0, 0, 0, 0, \
/* 0x48: */ 0, 0, 0, 0, 0, 0, 0, 0 \

#define MGAG200_MAX_FB_HEIGHT 4096
#define MGAG200_MAX_FB_WIDTH 4096

Expand Down Expand Up @@ -295,10 +322,12 @@ struct mga_device *mgag200_g200_device_create(struct pci_dev *pdev, const struct
enum mga_type type);
struct mga_device *mgag200_g200se_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type);
void mgag200_g200wb_init_registers(struct mga_device *mdev);
struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type);
struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type);
void mgag200_g200eh_init_registers(struct mga_device *mdev);
struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type);
struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
Expand All @@ -310,6 +339,7 @@ struct mga_device *mgag200_g200ew3_device_create(struct pci_dev *pdev, const str

/* mgag200_mode.c */
resource_size_t mgag200_device_probe_vram(struct mga_device *mdev);
void mgag200_init_registers(struct mga_device *mdev);
int mgag200_modeset_init(struct mga_device *mdev, resource_size_t vram_fb_available);

/* mgag200_i2c.c */
Expand Down
25 changes: 25 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,29 @@ static int mgag200_g200_init_pci_options(struct pci_dev *pdev)
return mgag200_init_pci_options(pdev, option, 0x00008000);
}

static void mgag200_g200_init_registers(struct mgag200_g200_device *g200)
{
static const u8 dacvalue[] = {
MGAG200_DAC_DEFAULT(0x00, 0xc9, 0x1f,
0x04, 0x2d, 0x19)
};

struct mga_device *mdev = &g200->base;
size_t i;

for (i = 0; i < ARRAY_SIZE(dacvalue); ++i) {
if ((i <= 0x17) ||
(i == 0x1b) ||
(i == 0x1c) ||
((i >= 0x1f) && (i <= 0x29)) ||
((i >= 0x30) && (i <= 0x37)))
continue;
WREG_DAC(i, dacvalue[i]);
}

mgag200_init_registers(mdev);
}

/*
* DRM Device
*/
Expand Down Expand Up @@ -191,6 +214,8 @@ struct mga_device *mgag200_g200_device_create(struct pci_dev *pdev, const struct
if (ret)
return ERR_PTR(ret);

mgag200_g200_init_registers(g200);

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
26 changes: 26 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,30 @@

#include "mgag200_drv.h"

void mgag200_g200eh_init_registers(struct mga_device *mdev)
{
static const u8 dacvalue[] = {
MGAG200_DAC_DEFAULT(0x00, 0xc9,
MGA1064_MISC_CTL_VGA8 | MGA1064_MISC_CTL_DAC_RAM_CS,
0x00, 0x00, 0x00)
};

size_t i;

for (i = 0; i < ARRAY_SIZE(dacvalue); i++) {
if ((i <= 0x17) ||
(i == 0x1b) ||
(i == 0x1c) ||
((i >= 0x1f) && (i <= 0x29)) ||
((i >= 0x30) && (i <= 0x37)) ||
((i >= 0x44) && (i <= 0x4e)))
continue;
WREG_DAC(i, dacvalue[i]);
}

mgag200_init_registers(mdev);
}

/*
* DRM device
*/
Expand Down Expand Up @@ -40,6 +64,8 @@ struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const stru
if (ret)
return ERR_PTR(ret);

mgag200_g200eh_init_registers(mdev);

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200eh3.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev,
if (ret)
return ERR_PTR(ret);

mgag200_g200eh_init_registers(mdev); // same as G200EH

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
25 changes: 25 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200er.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,29 @@

#include "mgag200_drv.h"

static void mgag200_g200er_init_registers(struct mga_device *mdev)
{
static const u8 dacvalue[] = {
MGAG200_DAC_DEFAULT(0x00, 0xc9, 0x1f, 0x00, 0x00, 0x00)
};

size_t i;

for (i = 0; i < ARRAY_SIZE(dacvalue); i++) {
if ((i <= 0x17) ||
(i == 0x1b) ||
(i == 0x1c) ||
((i >= 0x1f) && (i <= 0x29)) ||
((i >= 0x30) && (i <= 0x37)))
continue;
WREG_DAC(i, dacvalue[i]);
}

WREG_DAC(0x90, 0); /* G200ER specific */

mgag200_init_registers(mdev);
}

/*
* DRM device
*/
Expand Down Expand Up @@ -36,6 +59,8 @@ struct mga_device *mgag200_g200er_device_create(struct pci_dev *pdev, const stru
if (ret)
return ERR_PTR(ret);

mgag200_g200er_init_registers(mdev);

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
27 changes: 27 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200ev.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,31 @@

#include "mgag200_drv.h"

static void mgag200_g200ev_init_registers(struct mga_device *mdev)
{
static const u8 dacvalue[] = {
MGAG200_DAC_DEFAULT(0x00,
MGA1064_PIX_CLK_CTL_SEL_PLL,
MGA1064_MISC_CTL_VGA8 | MGA1064_MISC_CTL_DAC_RAM_CS,
0x00, 0x00, 0x00)
};

size_t i;

for (i = 0; i < ARRAY_SIZE(dacvalue); i++) {
if ((i <= 0x17) ||
(i == 0x1b) ||
(i == 0x1c) ||
((i >= 0x1f) && (i <= 0x29)) ||
((i >= 0x30) && (i <= 0x37)) ||
((i >= 0x44) && (i <= 0x4e)))
continue;
WREG_DAC(i, dacvalue[i]);
}

mgag200_init_registers(mdev);
}

/*
* DRM device
*/
Expand Down Expand Up @@ -40,6 +65,8 @@ struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const stru
if (ret)
return ERR_PTR(ret);

mgag200_g200ev_init_registers(mdev);

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200ew3.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ struct mga_device *mgag200_g200ew3_device_create(struct pci_dev *pdev,
if (ret)
return ERR_PTR(ret);

mgag200_g200wb_init_registers(mdev); // same as G200WB

vram_available = mgag200_g200ew3_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
30 changes: 30 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200se.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,34 @@ static int mgag200_g200se_init_pci_options(struct pci_dev *pdev)
return mgag200_init_pci_options(pdev, option, 0x00008000);
}

static void mgag200_g200se_init_registers(struct mgag200_g200se_device *g200se)
{
static const u8 dacvalue[] = {
MGAG200_DAC_DEFAULT(0x03,
MGA1064_PIX_CLK_CTL_SEL_PLL,
MGA1064_MISC_CTL_DAC_EN |
MGA1064_MISC_CTL_VGA8 |
MGA1064_MISC_CTL_DAC_RAM_CS,
0x00, 0x00, 0x00)
};

struct mga_device *mdev = &g200se->base;
size_t i;

for (i = 0; i < ARRAY_SIZE(dacvalue); i++) {
if ((i <= 0x17) ||
(i == 0x1b) ||
(i == 0x1c) ||
((i >= 0x1f) && (i <= 0x29)) ||
((i == 0x2c) || (i == 0x2d) || (i == 0x2e)) ||
((i >= 0x30) && (i <= 0x37)))
continue;
WREG_DAC(i, dacvalue[i]);
}

mgag200_init_registers(mdev);
}

/*
* DRM device
*/
Expand Down Expand Up @@ -120,6 +148,8 @@ struct mga_device *mgag200_g200se_device_create(struct pci_dev *pdev, const stru
if (ret)
return ERR_PTR(ret);

mgag200_g200se_init_registers(g200se);

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
24 changes: 24 additions & 0 deletions drivers/gpu/drm/mgag200/mgag200_g200wb.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,28 @@

#include "mgag200_drv.h"

void mgag200_g200wb_init_registers(struct mga_device *mdev)
{
static const u8 dacvalue[] = {
MGAG200_DAC_DEFAULT(0x07, 0xc9, 0x1f, 0x00, 0x00, 0x00)
};

size_t i;

for (i = 0; i < ARRAY_SIZE(dacvalue); i++) {
if ((i <= 0x17) ||
(i == 0x1b) ||
(i == 0x1c) ||
((i >= 0x1f) && (i <= 0x29)) ||
((i >= 0x30) && (i <= 0x37)) ||
((i >= 0x44) && (i <= 0x4e)))
continue;
WREG_DAC(i, dacvalue[i]);
}

mgag200_init_registers(mdev);
}

/*
* DRM device
*/
Expand Down Expand Up @@ -40,6 +62,8 @@ struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const stru
if (ret)
return ERR_PTR(ret);

mgag200_g200wb_init_registers(mdev);

vram_available = mgag200_device_probe_vram(mdev);

ret = mgag200_modeset_init(mdev, vram_available);
Expand Down
Loading

0 comments on commit 1ee181f

Please sign in to comment.