Commit fb18825f authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

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
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -115,6 +115,17 @@ static int mgag200_regs_init(struct mga_device *mdev)
	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)
{
	struct drm_device *dev = &mdev->base;
@@ -127,12 +138,8 @@ static int mgag200_device_init(struct mga_device *mdev, unsigned long flags)
	if (ret)
		return ret;

	/* stash G200 SE model number for later use */
	if (IS_G200_SE(mdev)) {
		mdev->unique_rev_id = RREG32(0x1e24);
		drm_dbg(dev, "G200 SE unique revision id is 0x%x\n",
			mdev->unique_rev_id);
	}
	if (IS_G200_SE(mdev))
		mgag200_g200se_init_unique_id(mdev);

	ret = mgag200_mm_init(mdev);
	if (ret)
+6 −2
Original line number Diff line number Diff line
@@ -166,8 +166,12 @@ struct mga_device {

	int fb_mtrr;

	union {
		struct {
			/* SE model number stored in reg 0x1e24 */
			u32 unique_rev_id;
		} g200se;
	} model;

	struct mga_connector connector;
	struct drm_simple_display_pipe display_pipe;
+11 −7
Original line number Diff line number Diff line
@@ -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)
{
	u32 unique_rev_id = mdev->model.g200se.unique_rev_id;
	unsigned int vcomax, vcomin, pllreffreq;
	unsigned int delta, tmpdelta, permitteddelta;
	unsigned int testp, testm, testn;
@@ -121,7 +122,7 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
	unsigned int fvv;
	unsigned int i;

	if (mdev->unique_rev_id <= 0x03) {
	if (unique_rev_id <= 0x03) {

		m = n = p = 0;
		vcomax = 320000;
@@ -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_P, p);

	if (mdev->unique_rev_id >= 0x04) {
	if (unique_rev_id >= 0x04) {
		WREG_DAC(0x1a, 0x09);
		msleep(20);
		WREG_DAC(0x1a, 0x01);
@@ -1183,12 +1184,13 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev,
					const struct drm_display_mode *mode,
					const struct drm_framebuffer *fb)
{
	u32 unique_rev_id = mdev->model.g200se.unique_rev_id;
	unsigned int hiprilvl;
	u8 crtcext6;

	if  (mdev->unique_rev_id >= 0x04) {
	if  (unique_rev_id >= 0x04) {
		hiprilvl = 0;
	} else if (mdev->unique_rev_id >= 0x02) {
	} else if (unique_rev_id >= 0x02) {
		unsigned int bpp;
		unsigned long mb;

@@ -1213,7 +1215,7 @@ static void mgag200_g200se_set_hiprilvl(struct mga_device *mdev,
		else
			hiprilvl = 5;

	} else if (mdev->unique_rev_id >= 0x01) {
	} else if (unique_rev_id >= 0x01) {
		hiprilvl = 3;
	} else {
		hiprilvl = 4;
@@ -1337,7 +1339,9 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
	int bpp = 32;

	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)
				return MODE_VIRTUAL_X;
			if (mode->vdisplay > 1200)
@@ -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)
				> (24400 * 1024))
				return MODE_BANDWIDTH;
		} else if (mdev->unique_rev_id == 0x02) {
		} else if (unique_rev_id == 0x02) {
			if (mode->hdisplay > 1920)
				return MODE_VIRTUAL_X;
			if (mode->vdisplay > 1200)