[Intel-gfx] [PATCH] Revert "drm/i915: Don't save/restore hardware status page address register"
Zhenyu Wang
zhenyuw at linux.intel.com
Thu Mar 24 02:41:27 CET 2011
On 2011.03.23 18:16:55 +0000, Chris Wilson wrote:
> This reverts commit a7a75c8f70d6f6a2f16c9f627f938bbee2d32718.
>
> There are two different variations on how Intel hardware addresses the
> "Hardware Status Page". One as a location in physical memory and the
> other as an offset into the virtual memory of the GPU, used in more
> recent chipsets. (The HWS itself is a cacheable region of memory which
> the GPU can write to without requiring CPU synchronisation, used for
> updating various details of hardware state, such as the position of
> the GPU head in the ringbuffer, the last breadcrumb seqno, etc).
>
> These two types of addresses were updated in different locations of code
> - one inline with the ringbuffer initialisation, and the other during
> device initialisation. (The HWS page is logically associated with
> the rings, and there is one HWS page per ring.) During resume, only the
> ringbuffers were being re-initialised along with the virtual HWS page,
> leaving the older physical address HWS untouched. This then caused a
> hang on the older gen3/4 (915GM, 945GM, 965GM) the first time we tried
> to synchronise the GPU as the breadcrumbs were never being updated.
oops, right, I ignored those old devices.
>
> Reported-by: Linus Torvalds <torvalds at linux-foundation.org>
> Reported-by: Jan Niehusmann <jan at gondor.com>
> Reported-by: Justin P. Mattock <justinmattock at gmail.com>
> Reported-and-tested-by: Michael "brot" Groh <brot at minad.de>
> Cc: Zhenyu Wang <zhenyuw at linux.intel.com>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 1 +
> drivers/gpu/drm/i915/i915_suspend.c | 6 ++++++
> 2 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 4496505..5004724 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -383,6 +383,7 @@ typedef struct drm_i915_private {
> u32 saveDSPACNTR;
> u32 saveDSPBCNTR;
> u32 saveDSPARB;
> + u32 saveHWS;
> u32 savePIPEACONF;
> u32 savePIPEBCONF;
> u32 savePIPEASRC;
> diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
> index 7e992a8..da47415 100644
> --- a/drivers/gpu/drm/i915/i915_suspend.c
> +++ b/drivers/gpu/drm/i915/i915_suspend.c
> @@ -796,6 +796,9 @@ int i915_save_state(struct drm_device *dev)
>
> pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
>
> + /* Hardware status page */
> + dev_priv->saveHWS = I915_READ(HWS_PGA);
> +
> i915_save_display(dev);
>
> /* Interrupt state */
> @@ -842,6 +845,9 @@ int i915_restore_state(struct drm_device *dev)
>
> pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);
>
> + /* Hardware status page */
> + I915_WRITE(HWS_PGA, dev_priv->saveHWS);
> +
We'd better only save/restore this for !I915_NEED_GFX_HWS(dev),
note that HWS_PGA is not valid hw status register for new chip, e.g gen6.
> i915_restore_display(dev);
>
> /* Interrupt state */
> --
> 1.7.4.1
--
Open Source Technology Center, Intel ltd.
$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20110324/fc0392fa/attachment.sig>
More information about the Intel-gfx
mailing list