All of lore.kernel.org
 help / color / mirror / Atom feed
From: linux@armlinux.org.uk (Russell King - ARM Linux)
To: linux-arm-kernel@lists.infradead.org
Subject: [BUG] hdlcd gets confused about base address
Date: Mon, 21 Nov 2016 11:20:30 +0000	[thread overview]
Message-ID: <20161121112030.GC1041@n2100.armlinux.org.uk> (raw)
In-Reply-To: <20161121110604.GC1005@e106497-lin.cambridge.arm.com>

On Mon, Nov 21, 2016 at 11:06:04AM +0000, Liviu Dudau wrote:
> On Fri, Nov 18, 2016 at 11:37:33PM +0000, Russell King - ARM Linux wrote:
> > Hi,
> 
> Hi Russell,
> 
> > 
> > While testing HDMI with Xorg on the Juno board, I find that when Xorg
> > starts up or shuts down, the display is shifted significantly to the
> > right and wrapped in the active region.  (No sync bars are visible.)
> > The timings are correct, it behaves as if the start address has been
> > shifted many pixels _into_ the framebuffer.
> > 
> > This occurs whenever the display mode size is changed - using xrandr
> > in Xorg shows that changing the resolution triggers the problem
> > almost every time, but changing the refresh rate does not.
> 
> Thanks for reporting this. To double check your issue, you are booting
> with HDLCD using the native monitor resolution as detected via EDID
> and then using xrandr to change the display mode. When you do that you
> are seeing the image being shifted to the right. Is that a correct
> description? (I'm trying to reproduce it here and want to make sure 
> I've got the details right).

I first noticed it when booting with the buggy I2C EDID reading, so
DRM wasn't seeing a valid EDID.  Then when Xorg started up and shut
down, I noticed that the framebuffer console was shifted.  It's actually
shifted to the left because framebuffer pixel 0,0 is not displayed.

> > Using devmem2 to disable and re-enable the HDLCD resolves the issue,
> > and repeated disable/enable cycles do not make the issue re-appear.
> 
> Do you resize the display mode as well afer re-enabling HDLCD?

I quite literally just did:

./devmem2 0x7ff60230 w 0; ./devmem2 0x7ff60230 w 1

(with a devmem2 fixed for ARM64) which immediately fixed the issue.

> > What I think is going on is that the FIFO or address generator for
> > reading data from the AXI bus is not properly reset when changing the
> > resolution, and the enable-disable-enable cycle causes the HDLCD
> > hardware to sort itself out.
> 
> That is likely what is happening. According to the datasheet, changing
> the resolution should be done while the HDLCD command mode is disabled,
> which is what writing 0 into HDLCD_REG_COMMAND does.

That does not appear to be sufficient.

> > It's (eg) significantly out - for example,
> > to properly align the display, I have to program an address of
> > 0xf4ff0200 into the hardware rather than 0xf5000000 - that's 896 pixels
> > before the real start of the frame buffer.
> 
> What is the resolution you are using?

In the case I detailed here, 1920x1080.

> > With this patch, a patch to TDA998x to avoid the i2c-designware issue,
> > and xf86-video-armada, I have LXDE running on the Juno.
> 
> Can you tell me more about the TDA998x and i2c-designware issue?
> Also, I don't think you need to use xf86-video-armada, the mode-setting
> driver built into Xorg should be working fine (that is what I've used
> in my testing).

See the i2c-designware thread on lakml.  It's a spontaneous high
interrupt latency causing the Tx FIFO not to be loaded before it
empties, and the i2c-designware crap decides at that point to
immediately generate an I2C stop.  The I2C controller in Juno can
only work reliably in a system which has guaranteed low interrupt
latencies.

> > Something I also noticed is this:
> > 
> >         scanout_start = gem->paddr + plane->state->fb->offsets[0] +
> >                 plane->state->crtc_y * plane->state->fb->pitches[0] +
> >                 plane->state->crtc_x * bpp / 8;
> > 
> > Surely this should be using src_[xy] (which are the position in the
> > source - iow, memory, and not crtc_[xy] which is the position on the
> > CRTC displayed window.  To put it another way, the src_* define the
> > region of the source material that is mapped onto a rectangular area
> > on the display defined by crtc_*.
> 
> Yes, that is a bug and most likely the source of the issue that you are
> seeing if my understanding of your testing is correct.

It isn't the source of this issue at all.  gem->paddr is 0xf5000000, and
the value programmed originally into the register is the same.  So, from
those two pieces of information, we can reasonably assume that crtc_y
and crtc_x were both zero here.

> > Another note is that since the CRTC can't place the plane in arbitary
> > positions and sizes within the active area, should the atomic_check
> > ensure that crtc_x = crtc_y = 0, and the crtc width/height are the
> > size of the active area?
> 
> That should be the case, indeed. I'm going prepare a patch to do that.

I've already a patch along the lines of Daniel Vetter's response to this
point which I'm just testing.

> > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
> > index 48019ae22ddb..3e97acf6e2a7 100644
> > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c
> > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
> > @@ -150,6 +150,8 @@ static void hdlcd_crtc_enable(struct drm_crtc *crtc)
> >  	clk_prepare_enable(hdlcd->clk);
> >  	hdlcd_crtc_mode_set_nofb(crtc);
> >  	hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1);
> > +	hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0);
> > +	hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1);
> 
> I am not convinced that this is the right fix. If anything, I would put a
> hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0); line before hdlcd_crtc_mode_set_nofs(crtc);
> line to make sure the command mode is disabled before setting the mode, but
> again, I need to understand your use case to make sure that this indeed fixes it.

Maybe hdlcd shouldn't be implementing the ->enable callback but instead
the ->commit callback then?

I'll give it a try.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

WARNING: multiple messages have this Message-ID (diff)
From: Russell King - ARM Linux <linux@armlinux.org.uk>
To: Liviu Dudau <liviu.dudau@arm.com>
Cc: David Airlie <airlied@linux.ie>,
	Mali DP Maintainers <malidp@foss.arm.com>,
	Brian Starkey <brian.starkey@arm.com>,
	dri-devel@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [BUG] hdlcd gets confused about base address
Date: Mon, 21 Nov 2016 11:20:30 +0000	[thread overview]
Message-ID: <20161121112030.GC1041@n2100.armlinux.org.uk> (raw)
In-Reply-To: <20161121110604.GC1005@e106497-lin.cambridge.arm.com>

On Mon, Nov 21, 2016 at 11:06:04AM +0000, Liviu Dudau wrote:
> On Fri, Nov 18, 2016 at 11:37:33PM +0000, Russell King - ARM Linux wrote:
> > Hi,
> 
> Hi Russell,
> 
> > 
> > While testing HDMI with Xorg on the Juno board, I find that when Xorg
> > starts up or shuts down, the display is shifted significantly to the
> > right and wrapped in the active region.  (No sync bars are visible.)
> > The timings are correct, it behaves as if the start address has been
> > shifted many pixels _into_ the framebuffer.
> > 
> > This occurs whenever the display mode size is changed - using xrandr
> > in Xorg shows that changing the resolution triggers the problem
> > almost every time, but changing the refresh rate does not.
> 
> Thanks for reporting this. To double check your issue, you are booting
> with HDLCD using the native monitor resolution as detected via EDID
> and then using xrandr to change the display mode. When you do that you
> are seeing the image being shifted to the right. Is that a correct
> description? (I'm trying to reproduce it here and want to make sure 
> I've got the details right).

I first noticed it when booting with the buggy I2C EDID reading, so
DRM wasn't seeing a valid EDID.  Then when Xorg started up and shut
down, I noticed that the framebuffer console was shifted.  It's actually
shifted to the left because framebuffer pixel 0,0 is not displayed.

> > Using devmem2 to disable and re-enable the HDLCD resolves the issue,
> > and repeated disable/enable cycles do not make the issue re-appear.
> 
> Do you resize the display mode as well afer re-enabling HDLCD?

I quite literally just did:

./devmem2 0x7ff60230 w 0; ./devmem2 0x7ff60230 w 1

(with a devmem2 fixed for ARM64) which immediately fixed the issue.

> > What I think is going on is that the FIFO or address generator for
> > reading data from the AXI bus is not properly reset when changing the
> > resolution, and the enable-disable-enable cycle causes the HDLCD
> > hardware to sort itself out.
> 
> That is likely what is happening. According to the datasheet, changing
> the resolution should be done while the HDLCD command mode is disabled,
> which is what writing 0 into HDLCD_REG_COMMAND does.

That does not appear to be sufficient.

> > It's (eg) significantly out - for example,
> > to properly align the display, I have to program an address of
> > 0xf4ff0200 into the hardware rather than 0xf5000000 - that's 896 pixels
> > before the real start of the frame buffer.
> 
> What is the resolution you are using?

In the case I detailed here, 1920x1080.

> > With this patch, a patch to TDA998x to avoid the i2c-designware issue,
> > and xf86-video-armada, I have LXDE running on the Juno.
> 
> Can you tell me more about the TDA998x and i2c-designware issue?
> Also, I don't think you need to use xf86-video-armada, the mode-setting
> driver built into Xorg should be working fine (that is what I've used
> in my testing).

See the i2c-designware thread on lakml.  It's a spontaneous high
interrupt latency causing the Tx FIFO not to be loaded before it
empties, and the i2c-designware crap decides at that point to
immediately generate an I2C stop.  The I2C controller in Juno can
only work reliably in a system which has guaranteed low interrupt
latencies.

> > Something I also noticed is this:
> > 
> >         scanout_start = gem->paddr + plane->state->fb->offsets[0] +
> >                 plane->state->crtc_y * plane->state->fb->pitches[0] +
> >                 plane->state->crtc_x * bpp / 8;
> > 
> > Surely this should be using src_[xy] (which are the position in the
> > source - iow, memory, and not crtc_[xy] which is the position on the
> > CRTC displayed window.  To put it another way, the src_* define the
> > region of the source material that is mapped onto a rectangular area
> > on the display defined by crtc_*.
> 
> Yes, that is a bug and most likely the source of the issue that you are
> seeing if my understanding of your testing is correct.

It isn't the source of this issue at all.  gem->paddr is 0xf5000000, and
the value programmed originally into the register is the same.  So, from
those two pieces of information, we can reasonably assume that crtc_y
and crtc_x were both zero here.

> > Another note is that since the CRTC can't place the plane in arbitary
> > positions and sizes within the active area, should the atomic_check
> > ensure that crtc_x = crtc_y = 0, and the crtc width/height are the
> > size of the active area?
> 
> That should be the case, indeed. I'm going prepare a patch to do that.

I've already a patch along the lines of Daniel Vetter's response to this
point which I'm just testing.

> > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
> > index 48019ae22ddb..3e97acf6e2a7 100644
> > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c
> > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
> > @@ -150,6 +150,8 @@ static void hdlcd_crtc_enable(struct drm_crtc *crtc)
> >  	clk_prepare_enable(hdlcd->clk);
> >  	hdlcd_crtc_mode_set_nofb(crtc);
> >  	hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1);
> > +	hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0);
> > +	hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1);
> 
> I am not convinced that this is the right fix. If anything, I would put a
> hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0); line before hdlcd_crtc_mode_set_nofs(crtc);
> line to make sure the command mode is disabled before setting the mode, but
> again, I need to understand your use case to make sure that this indeed fixes it.

Maybe hdlcd shouldn't be implementing the ->enable callback but instead
the ->commit callback then?

I'll give it a try.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

  reply	other threads:[~2016-11-21 11:20 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-18 23:37 [BUG] hdlcd gets confused about base address Russell King - ARM Linux
2016-11-18 23:37 ` Russell King - ARM Linux
2016-11-21  9:44 ` Daniel Vetter
2016-11-21  9:44   ` Daniel Vetter
2016-11-21 11:06 ` Liviu Dudau
2016-11-21 11:06   ` Liviu Dudau
2016-11-21 11:20   ` Russell King - ARM Linux [this message]
2016-11-21 11:20     ` Russell King - ARM Linux
2016-11-21 11:32     ` Liviu Dudau
2016-11-21 11:32       ` Liviu Dudau
2016-11-21 12:25       ` Russell King - ARM Linux
2016-11-21 12:25         ` Russell King - ARM Linux
2016-11-21 12:56         ` Liviu Dudau
2016-11-21 12:56           ` Liviu Dudau
2016-11-21 13:24           ` Russell King - ARM Linux
2016-11-21 13:24             ` Russell King - ARM Linux
2016-11-21 13:50             ` Liviu Dudau
2016-11-21 13:50               ` Liviu Dudau
2016-11-21 14:03               ` Russell King - ARM Linux
2016-11-21 14:03                 ` Russell King - ARM Linux
2016-11-21 17:32                 ` Liviu Dudau
2016-11-21 17:32                   ` Liviu Dudau
2016-11-21 17:56                   ` Russell King - ARM Linux
2016-11-21 17:56                     ` Russell King - ARM Linux
2016-11-21 18:16                     ` Russell King - ARM Linux
2016-11-21 18:16                       ` Russell King - ARM Linux
2016-11-21 18:25                       ` Liviu Dudau
2016-11-21 18:25                         ` Liviu Dudau
2016-11-21 18:23                     ` Liviu Dudau
2016-11-21 18:23                       ` Liviu Dudau
2016-11-21 18:43                       ` Russell King - ARM Linux
2016-11-21 18:43                         ` Russell King - ARM Linux
2016-11-21 14:30             ` Russell King - ARM Linux
2016-11-21 14:30               ` Russell King - ARM Linux
2016-11-21 14:55               ` Russell King - ARM Linux
2016-11-21 14:55                 ` Russell King - ARM Linux
2016-11-22  7:02                 ` Daniel Vetter
2016-11-22  7:02                   ` Daniel Vetter
2017-02-20 12:16 ` Russell King - ARM Linux
2017-02-20 12:16   ` Russell King - ARM Linux
2017-02-20 17:53   ` Liviu Dudau
2017-02-20 17:53     ` Liviu Dudau
2017-02-20 17:57     ` Russell King - ARM Linux
2017-02-20 17:57       ` Russell King - ARM Linux
2017-02-20 18:05     ` Ville Syrjälä
2017-02-20 18:05       ` Ville Syrjälä
2017-02-20 18:59       ` Russell King - ARM Linux
2017-02-20 18:59         ` Russell King - ARM Linux
2017-02-22 15:42         ` Ville Syrjälä
2017-02-22 15:42           ` Ville Syrjälä
2017-02-26 19:31           ` Daniel Vetter
2017-02-26 19:31             ` Daniel Vetter
2017-02-22 15:15       ` Liviu Dudau
2017-02-22 15:15         ` Liviu Dudau
2017-02-22 15:30         ` Ville Syrjälä
2017-02-22 15:30           ` Ville Syrjälä
2017-03-08 16:30           ` [PATCH v2] drm: hdlcd: Fix the calculation of the scanout start address Liviu Dudau
2017-03-08 16:30             ` Liviu Dudau
2017-03-31  9:49             ` Russell King - ARM Linux
2017-03-31  9:49               ` Russell King - ARM Linux
2017-03-31  9:51               ` [PATCH 1/3] drm/arm: hdlcd: properly validate plane state Russell King
2017-03-31  9:51                 ` Russell King
2017-03-31 10:18                 ` Liviu Dudau
2017-03-31 10:18                   ` Liviu Dudau
2017-03-31 10:20                   ` Russell King - ARM Linux
2017-03-31 10:20                     ` Russell King - ARM Linux
2017-03-31 10:23                     ` Liviu Dudau
2017-03-31 10:23                       ` Liviu Dudau
2017-03-31 10:27                       ` Russell King - ARM Linux
2017-03-31 10:27                         ` Russell King - ARM Linux
2017-03-31 11:41                         ` Liviu Dudau
2017-03-31 11:41                           ` Liviu Dudau
2017-03-31 12:21                           ` Russell King - ARM Linux
2017-03-31 12:21                             ` Russell King - ARM Linux
2017-03-31  9:51               ` [PATCH 2/3] drm/arm: hdlcd: fix plane base address calculation Russell King
2017-03-31  9:51                 ` Russell King
2017-03-31 13:13                 ` Liviu Dudau
2017-03-31 13:13                   ` Liviu Dudau
2017-03-31  9:51               ` [PATCH 3/3] drm/arm: hdlcd: check for rotation Russell King
2017-03-31  9:51                 ` Russell King
2017-03-31 10:11                 ` Ville Syrjälä
2017-03-31 10:11                   ` Ville Syrjälä
2017-03-31 10:21                   ` Liviu Dudau
2017-03-31 10:21                     ` Liviu Dudau
2017-03-31 13:18               ` [PATCH v2] drm: hdlcd: Fix the calculation of the scanout start address Liviu Dudau
2017-03-31 13:18                 ` Liviu Dudau
2017-03-31 13:48                 ` Russell King - ARM Linux
2017-03-31 13:48                   ` Russell King - ARM Linux
2017-04-03 10:31                   ` Liviu Dudau
2017-04-03 10:31                     ` Liviu Dudau
2017-04-03 13:13                     ` Russell King - ARM Linux
2017-04-03 13:13                       ` Russell King - ARM Linux
2017-04-03 14:07                       ` Liviu Dudau
2017-04-03 14:07                         ` Liviu Dudau
2017-04-06 11:07                       ` Jani Nikula
2017-04-06 11:07                         ` Jani Nikula

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=20161121112030.GC1041@n2100.armlinux.org.uk \
    --to=linux@armlinux.org.uk \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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.