From 41963d19c9b937bc529e1a9e994b63495d1b09d2 Mon Sep 17 00:00:00 2001 From: Binglin Chen Date: Thu, 22 Dec 2011 11:41:13 -0800 Subject: [PATCH] psb_video: implement reset function by power up/down MSVDX When MSVDX FW uploading is done by PUNIT, just after MSVDX power up operation, In order to reset HW, driver need to do one power off and power on, and wait for PUNIT re-upload FW again. This patch will enable driver to reset HW when there is a request. Signed-off-by: Binglin Chen Signed-off-by: Daniel Charles Acked-by: Sean V Kelley Signed-off-by: Kirill A. Shutemov --- drivers/staging/mrst/imgv/psb_fence.c | 3 ++- drivers/staging/mrst/imgv/psb_msvdx.c | 5 +++-- drivers/staging/mrst/imgv/psb_msvdx.h | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/staging/mrst/imgv/psb_fence.c b/drivers/staging/mrst/imgv/psb_fence.c index 8ebf7c9..429e1d8 100644 --- a/drivers/staging/mrst/imgv/psb_fence.c +++ b/drivers/staging/mrst/imgv/psb_fence.c @@ -138,7 +138,8 @@ static void psb_fence_lockup(struct ttm_fence_object *fence, fence->sequence, fence_types, -EBUSY); write_unlock(&fc->lock); - msvdx_priv->msvdx_needs_reset = 1; + msvdx_priv->msvdx_needs_reset |= MSVDX_RESET_NEEDS_REUPLOAD_FW | + MSVDX_RESET_NEEDS_INIT_FW; } else DRM_ERROR("Unsupported fence class\n"); } diff --git a/drivers/staging/mrst/imgv/psb_msvdx.c b/drivers/staging/mrst/imgv/psb_msvdx.c index f9e2376..4b3ef73 100644 --- a/drivers/staging/mrst/imgv/psb_msvdx.c +++ b/drivers/staging/mrst/imgv/psb_msvdx.c @@ -843,7 +843,8 @@ loop: /* just for coding style check */ " - resetting and ignoring error\n", fence); - msvdx_priv->msvdx_needs_reset = 1; + msvdx_priv->msvdx_needs_reset |= MSVDX_RESET_NEEDS_REUPLOAD_FW | + MSVDX_RESET_NEEDS_INIT_FW; if (msg_id == VA_MSGID_CMD_HW_PANIC) { diff = msvdx_priv->msvdx_current_sequence @@ -1418,7 +1419,7 @@ int psb_msvdx_save_context(struct drm_device *dev) struct msvdx_private *msvdx_priv = dev_priv->msvdx_private; int offset = 0; - msvdx_priv->msvdx_needs_reset = 1; + msvdx_priv->msvdx_needs_reset = MSVDX_RESET_NEEDS_INIT_FW; for (offset = 0; offset < VEC_LOCAL_MEM_BYTE_SIZE / 4; ++offset) msvdx_priv->vec_local_mem_data[offset] = diff --git a/drivers/staging/mrst/imgv/psb_msvdx.h b/drivers/staging/mrst/imgv/psb_msvdx.h index ef3d987..45fee69 100644 --- a/drivers/staging/mrst/imgv/psb_msvdx.h +++ b/drivers/staging/mrst/imgv/psb_msvdx.h @@ -662,6 +662,8 @@ MSVDX_CORE_CR_MSVDX_MAN_CLK_ENABLE_CR_MTX_MAN_CLK_ENABLE_MASK) #define FW_DEVA_INIT_RENDEC_SIZE0_SHIFT 0 #define FW_DEVA_INIT_RENDEC_SIZE0_SIGNED_FIELD IMG_FALSE +#define MSVDX_RESET_NEEDS_REUPLOAD_FW 0x2 +#define MSVDX_RESET_NEEDS_INIT_FW 0x1 -- 2.7.4