From: Sam Ravnborg <sam@ravnborg.org>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: john.p.donnelly@oracle.com, dri-devel@lists.freedesktop.org,
kraxel@redhat.com, airlied@redhat.com
Subject: Re: [PATCH 08/17] drm/mgag200: Split MISC register update into PLL selection, SYNC and I/O
Date: Sun, 3 May 2020 17:34:32 +0200 [thread overview]
Message-ID: <20200503153432.GA23105@ravnborg.org> (raw)
In-Reply-To: <20200429143238.10115-9-tzimmermann@suse.de>
Hi Thomas.
On Wed, Apr 29, 2020 at 04:32:29PM +0200, Thomas Zimmermann wrote:
> Set different fields in MISC in their rsp location in the code. This
> patch also fixes a bug in the original code where the mode's SYNC flags
> were never written into the MISC register.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/mgag200/mgag200_mode.c | 37 ++++++++++++++++++--------
> drivers/gpu/drm/mgag200/mgag200_reg.h | 5 +++-
> 2 files changed, 30 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
> index 749ba6e420ac7..b5bb02e9f05d6 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> @@ -704,6 +704,8 @@ static int mga_g200er_set_plls(struct mga_device *mdev, long clock)
>
> static int mga_crtc_set_plls(struct mga_device *mdev, long clock)
> {
> + uint8_t misc;
General comment.
uint8_t and friends are for uapi stuff.
kernel internal prefer u8 and friends.
Would be good to clean this up in the drivire, maybe as a follow-up
patch after is becomes atomic.
> +
> switch(mdev->type) {
> case G200_SE_A:
> case G200_SE_B:
> @@ -724,6 +726,12 @@ static int mga_crtc_set_plls(struct mga_device *mdev, long clock)
> return mga_g200er_set_plls(mdev, clock);
> break;
> }
> +
> + misc = RREG8(MGA_MISC_IN);
> + misc &= ~GENMASK(3, 2);
The code would be easier to read if we had a
#define MGAREG_MISC_CLK_SEL_MASK GENMASK(3, 2)
So the above became:
misc &= ~MGAREG_MISC_CLK_SEL_MASK;
Then it is more clear that the CLK_SEL bits are clared and then
MGA_MSK is set.
> + misc |= MGAREG_MISC_CLK_SEL_MGA_MSK;
> + WREG8(MGA_MISC_OUT, misc);
> +
> return 0;
> }
>
> @@ -916,7 +924,7 @@ static void mgag200_set_mode_regs(struct mga_device *mdev,
> {
> unsigned int hdisplay, hsyncstart, hsyncend, htotal;
> unsigned int vdisplay, vsyncstart, vsyncend, vtotal;
> - uint8_t misc = 0;
> + uint8_t misc;
> uint8_t crtcext1, crtcext2, crtcext5;
>
> hdisplay = mode->hdisplay / 8 - 1;
> @@ -933,10 +941,17 @@ static void mgag200_set_mode_regs(struct mga_device *mdev,
> vsyncend = mode->vsync_end - 1;
> vtotal = mode->vtotal - 2;
>
> + misc = RREG8(MGA_MISC_IN);
> +
> if (mode->flags & DRM_MODE_FLAG_NHSYNC)
> - misc |= 0x40;
> + misc |= MGAREG_MISC_HSYNCPOL;
> + else
> + misc &= ~MGAREG_MISC_HSYNCPOL;
> +
So the code just assumes DRM_MODE_FLAG_PHSYNC if
DRM_MODE_FLAG_NHSYNC is not set.
I think that is fine, but it also indicate how hoorible the
flags definitions are in mode->flags
> if (mode->flags & DRM_MODE_FLAG_NVSYNC)
> - misc |= 0x80;
> + misc |= MGAREG_MISC_VSYNCPOL;
> + else
> + misc &= ~MGAREG_MISC_VSYNCPOL;
And this code was touched in previous patch, but I gess it is better
to update it here.
>
> crtcext1 = (((htotal - 4) & 0x100) >> 8) |
> ((hdisplay & 0x100) >> 7) |
> @@ -982,6 +997,10 @@ static void mgag200_set_mode_regs(struct mga_device *mdev,
> WREG_ECRT(0x01, crtcext1);
> WREG_ECRT(0x02, crtcext2);
> WREG_ECRT(0x05, crtcext5);
> +
> + WREG8(MGA_MISC_OUT, misc);
> +
> + mga_crtc_set_plls(mdev, mode->clock);
> }
>
> static int mga_crtc_mode_set(struct drm_crtc *crtc,
> @@ -1140,12 +1159,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,
> ext_vga[3] = ((1 << bppshift) - 1) | 0x80;
> ext_vga[4] = 0;
>
> - /* Set pixel clocks */
> - misc = 0x2d;
> - WREG8(MGA_MISC_OUT, misc);
> -
> - mga_crtc_set_plls(mdev, mode->clock);
> -
> WREG_ECRT(0, ext_vga[0]);
> WREG_ECRT(3, ext_vga[3]);
> WREG_ECRT(4, ext_vga[4]);
> @@ -1161,9 +1174,11 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,
> }
>
> WREG_ECRT(0, ext_vga[0]);
> - /* Enable mga pixel clock */
> - misc = 0x2d;
>
> + misc = RREG8(MGA_MISC_IN);
> + misc |= MGAREG_MISC_IOADSEL |
> + MGAREG_MISC_RAMMAPEN |
> + MGAREG_MISC_HIGH_PG_SEL;
> WREG8(MGA_MISC_OUT, misc);
I am left puzzeled why there is several writes to MGA_MISC_OUT.
The driver needs to read back and then write again.
Would it be simpler to have one function that only took care of
misc register update?
>
> mga_crtc_do_set_base(mdev, fb, old_fb);
> diff --git a/drivers/gpu/drm/mgag200/mgag200_reg.h b/drivers/gpu/drm/mgag200/mgag200_reg.h
> index c096a9d6bcbc1..89e12c55153cf 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_reg.h
> +++ b/drivers/gpu/drm/mgag200/mgag200_reg.h
> @@ -16,10 +16,11 @@
> * MGA1064SG Mystique register file
> */
>
> -
> #ifndef _MGA_REG_H_
> #define _MGA_REG_H_
>
> +#include <linux/bits.h>
> +
> #define MGAREG_DWGCTL 0x1c00
> #define MGAREG_MACCESS 0x1c04
> /* the following is a mystique only register */
> @@ -227,6 +228,8 @@
> #define MGAREG_MISC_CLK_SEL_MGA_MSK (0x3 << 2)
> #define MGAREG_MISC_VIDEO_DIS (0x1 << 4)
> #define MGAREG_MISC_HIGH_PG_SEL (0x1 << 5)
> +#define MGAREG_MISC_HSYNCPOL BIT(6)
> +#define MGAREG_MISC_VSYNCPOL BIT(7)
I like BIT(), but mixing (1 << N) and BIT() does not look nice.
Oh, and do not get me started on GENMASK() :-)
Sam
>
> /* MMIO VGA registers */
> #define MGAREG_SEQ_INDEX 0x1fc4
> --
> 2.26.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2020-05-03 15:34 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-29 14:32 [PATCH 00/17] drm/mgag200: Convert to atomic modesetting Thomas Zimmermann
2020-04-29 14:32 ` [PATCH 01/17] drm/mgag200: Remove HW cursor Thomas Zimmermann
2020-04-29 17:51 ` Sam Ravnborg
2020-04-30 7:03 ` Gerd Hoffmann
2020-04-30 8:10 ` Thomas Zimmermann
2020-04-30 9:19 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 02/17] drm/mgag200: Remove unused fields from struct mga_device Thomas Zimmermann
2020-04-29 17:49 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 03/17] drm/mgag200: Embed connector instance in " Thomas Zimmermann
2020-04-29 15:24 ` Ruhl, Michael J
2020-04-29 17:49 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 04/17] drm/mgag200: Use managed mode-config initialization Thomas Zimmermann
2020-04-29 17:55 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 05/17] drm/mgag200: Clean up mga_set_start_address() Thomas Zimmermann
2020-04-29 18:20 ` Sam Ravnborg
2020-04-30 8:23 ` Thomas Zimmermann
2020-05-11 12:41 ` Thomas Zimmermann
2020-04-29 14:32 ` [PATCH 06/17] drm/mgag200: Clean up mga_crtc_do_set_base() Thomas Zimmermann
2020-04-29 18:23 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 07/17] drm/mgag200: Move mode-setting code into separate helper function Thomas Zimmermann
2020-04-29 18:24 ` Sam Ravnborg
2020-04-30 8:27 ` Thomas Zimmermann
2020-04-29 14:32 ` [PATCH 08/17] drm/mgag200: Split MISC register update into PLL selection, SYNC and I/O Thomas Zimmermann
2020-05-03 15:34 ` Sam Ravnborg [this message]
2020-05-04 13:03 ` Thomas Zimmermann
2020-05-04 14:25 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 09/17] drm/mgag200: Update mode registers after plane registers Thomas Zimmermann
2020-05-03 15:34 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 10/17] drm/mgag200: Set pitch in a separate helper function Thomas Zimmermann
2020-05-03 15:42 ` Sam Ravnborg
2020-05-04 13:10 ` Thomas Zimmermann
2020-04-29 14:32 ` [PATCH 11/17] drm/mgag200: Set primary plane's format in " Thomas Zimmermann
2020-04-29 14:32 ` [PATCH 12/17] drm/mgag200: Move TAGFIFO reset into separate function Thomas Zimmermann
2020-05-03 16:25 ` Sam Ravnborg
2020-05-04 13:11 ` Thomas Zimmermann
2020-05-04 14:29 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 13/17] drm/mgag200: Move hiprilvl setting into separate functions Thomas Zimmermann
2020-05-03 17:23 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 14/17] drm/mgag200: Move register initialization into separate function Thomas Zimmermann
2020-05-03 17:25 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 15/17] drm/mgag200: Remove waiting from DPMS code Thomas Zimmermann
2020-05-04 12:10 ` Daniel Vetter
2020-05-04 12:40 ` Thomas Zimmermann
2020-04-29 14:32 ` [PATCH 16/17] drm/mgag200: Convert to simple KMS helper Thomas Zimmermann
2020-05-03 17:36 ` Sam Ravnborg
2020-04-29 14:32 ` [PATCH 17/17] drm/mgag200: Replace VRAM helpers with SHMEM helpers Thomas Zimmermann
2020-05-04 12:29 ` Emil Velikov
2020-05-04 12:45 ` Thomas Zimmermann
2020-04-30 0:11 ` [PATCH 00/17] drm/mgag200: Convert to atomic modesetting John Donnelly
2020-04-30 8:29 ` Thomas Zimmermann
2020-04-30 12:09 ` John Donnelly
2020-05-04 13:39 ` Thomas Zimmermann
2020-05-04 20:39 ` John Donnelly
2020-05-05 12:20 ` John Donnelly
2020-05-06 7:29 ` Thomas Zimmermann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200503153432.GA23105@ravnborg.org \
--to=sam@ravnborg.org \
--cc=airlied@redhat.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=john.p.donnelly@oracle.com \
--cc=kraxel@redhat.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.