Commit fb18825f authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/mgag200: Move G200SE's unique id into model-specific data

The unique revision id is only useful for G200SE devices. Store the
value in model-specific data within struct mga_device. While at it,
the patch also adds an init helper for the value.
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200730102844.10995-8-tzimmermann@suse.de
parent 9053cad2
...@@ -115,6 +115,17 @@ static int mgag200_regs_init(struct mga_device *mdev) ...@@ -115,6 +115,17 @@ static int mgag200_regs_init(struct mga_device *mdev)
return 0; return 0;
} }
static void mgag200_g200se_init_unique_id(struct mga_device *mdev)
{
struct drm_device *dev = &mdev->base;
/* stash G200 SE model number for later use */
mdev->model.g200se.unique_rev_id = RREG32(0x1e24);
drm_dbg(dev, "G200 SE unique revision id is 0x%x\n",
mdev->model.g200se.unique_rev_id);
}
static int mgag200_device_init(struct mga_device *mdev, unsigned long flags) static int mgag200_device_init(struct mga_device *mdev, unsigned long flags)
{ {
struct drm_device *dev = &mdev->base; struct drm_device *dev = &mdev->base;
...@@ -127,12 +138,8 @@ static int mgag200_device_init(struct mga_device *mdev, unsigned long flags) ...@@ -127,12 +138,8 @@ static int mgag200_device_init(struct mga_device *mdev, unsigned long flags)
if (ret) if (ret)
return ret; return ret;
/* stash G200 SE model number for later use */ if (IS_G200_SE(mdev))
if (IS_G200_SE(mdev)) { mgag200_g200se_init_unique_id(mdev);
mdev->unique_rev_id = RREG32(0x1e24);
drm_dbg(dev, "G200 SE unique revision id is 0x%x\n",
mdev->unique_rev_id);
}
ret = mgag200_mm_init(mdev); ret = mgag200_mm_init(mdev);
if (ret) if (ret)
......
...@@ -166,8 +166,12 @@ struct mga_device { ...@@ -166,8 +166,12 @@ struct mga_device {
int fb_mtrr; int fb_mtrr;
/* SE model number stored in reg 0x1e24 */ union {
u32 unique_rev_id; struct {
/* SE model number stored in reg 0x1e24 */
u32 unique_rev_id;
} g200se;
} model;
struct mga_connector connector; struct mga_connector connector;
struct drm_simple_display_pipe display_pipe; struct drm_simple_display_pipe display_pipe;
......
...@@ -112,6 +112,7 @@ static inline void mga_wait_busy(struct mga_device *mdev) ...@@ -112,6 +112,7 @@ static inline void mga_wait_busy(struct mga_device *mdev)
static int mga_g200se_set_plls(struct mga_device *mdev, long clock) static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
{ {
u32 unique_rev_id = mdev->model.g200se.unique_rev_id;
unsigned int vcomax, vcomin, pllreffreq; unsigned int vcomax, vcomin, pllreffreq;
unsigned int delta, tmpdelta, permitteddelta; unsigned int delta, tmpdelta, permitteddelta;
unsigned int testp, testm, testn; unsigned int testp, testm, testn;
...@@ -121,7 +122,7 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock) ...@@ -121,7 +122,7 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
unsigned int fvv; unsigned int fvv;
unsigned int i; unsigned int i;
if (mdev->unique_rev_id <= 0x03) { if (unique_rev_id <= 0x03) {
m = n = p = 0; m = n = p = 0;
vcomax = 320000; vcomax = 320000;
...@@ -219,7 +220,7 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock) ...@@ -219,7 +220,7 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
WREG_DAC(MGA1064_PIX_PLLC_N, n); WREG_DAC(MGA1064_PIX_PLLC_N, n);
WREG_DAC(MGA1064_PIX_PLLC_P, p); WREG_DAC(MGA1064_PIX_PLLC_P, p);
if (mdev->unique_rev_id >= 0x04) { if (unique_rev_id >= 0x04) {
WREG_DAC(0x1a, 0x09); WREG_DAC(0x1a, 0x09);
msleep(20); msleep(20);
WREG_DAC(0x1a, 0x01); WREG_DAC(0x1a, 0x01);
...@@ -1183,12 +1184,13 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev, ...@@ -1183,12 +1184,13 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
const struct drm_framebuffer *fb) const struct drm_framebuffer *fb)
{ {
u32 unique_rev_id = mdev->model.g200se.unique_rev_id;
unsigned int hiprilvl; unsigned int hiprilvl;
u8 crtcext6; u8 crtcext6;
if (mdev->unique_rev_id >= 0x04) { if (unique_rev_id >= 0x04) {
hiprilvl = 0; hiprilvl = 0;
} else if (mdev->unique_rev_id >= 0x02) { } else if (unique_rev_id >= 0x02) {
unsigned int bpp; unsigned int bpp;
unsigned long mb; unsigned long mb;
...@@ -1213,7 +1215,7 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev, ...@@ -1213,7 +1215,7 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev,
else else
hiprilvl = 5; hiprilvl = 5;
} else if (mdev->unique_rev_id >= 0x01) { } else if (unique_rev_id >= 0x01) {
hiprilvl = 3; hiprilvl = 3;
} else { } else {
hiprilvl = 4; hiprilvl = 4;
...@@ -1337,7 +1339,9 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector, ...@@ -1337,7 +1339,9 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
int bpp = 32; int bpp = 32;
if (IS_G200_SE(mdev)) { if (IS_G200_SE(mdev)) {
if (mdev->unique_rev_id == 0x01) { u32 unique_rev_id = mdev->model.g200se.unique_rev_id;
if (unique_rev_id == 0x01) {
if (mode->hdisplay > 1600) if (mode->hdisplay > 1600)
return MODE_VIRTUAL_X; return MODE_VIRTUAL_X;
if (mode->vdisplay > 1200) if (mode->vdisplay > 1200)
...@@ -1345,7 +1349,7 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector, ...@@ -1345,7 +1349,7 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
if (mga_vga_calculate_mode_bandwidth(mode, bpp) if (mga_vga_calculate_mode_bandwidth(mode, bpp)
> (24400 * 1024)) > (24400 * 1024))
return MODE_BANDWIDTH; return MODE_BANDWIDTH;
} else if (mdev->unique_rev_id == 0x02) { } else if (unique_rev_id == 0x02) {
if (mode->hdisplay > 1920) if (mode->hdisplay > 1920)
return MODE_VIRTUAL_X; return MODE_VIRTUAL_X;
if (mode->vdisplay > 1200) if (mode->vdisplay > 1200)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment