static DEVICE_ATTR(msvdx_pmstate, 0444, psb_msvdx_pmstate_show, NULL);
-static void psb_msvdx_conceal_mb(char * ec_start, char * ref_start,
- uint32_t start_err_mb, uint32_t end_err_mb,
- uint32_t pic_width_mb, uint32_t stride,
- uint32_t mb_width, uint32_t mb_height)
-{
- int i, offset_start, offset_end, size, full_line_start, full_line_end, extra_line_start, extra_line_end;
- char *src, *dst;
-
- (void)offset_end;
- (void)offset_start;
-
- full_line_start = (start_err_mb / pic_width_mb) * stride * mb_height;
- full_line_end = ((end_err_mb + 1) / pic_width_mb) * stride * mb_height;
- extra_line_start = (start_err_mb % pic_width_mb) * mb_width;
- extra_line_end = (end_err_mb + 1) % pic_width_mb * mb_width;
- if (extra_line_start != 0) {
- size = stride - extra_line_start;
- src = ref_start + full_line_start + extra_line_start;
- dst = ec_start + full_line_start + extra_line_start;
- for (i = 0; i < mb_height; i++) {
- memcpy(dst, src, size);
- //memset(dst, 255, size);
- src += stride;
- dst += stride;
- }
- full_line_start += stride * mb_height;
- }
- src = ref_start + full_line_start;
- dst = ec_start + full_line_start;
- size = full_line_end - full_line_start;
- memcpy(dst, src, size);
- //memset(dst, 255, size);
- if (extra_line_end != 0) {
- size = extra_line_end;
- src = ref_start + full_line_end;
- dst = ec_start + full_line_end;
- for (i = 0; i < mb_height; i++) {
- memcpy(dst, src, size);
- //memset(dst, 255, size);
- src += stride;
- dst += stride;
- }
- }
-}
-
-
-static void psb_msvdx_error_concealment(struct work_struct *data)
-{
- uint32_t i;
- int ret;
- struct msvdx_private *msvdx_priv = container_of(data, struct msvdx_private, ec_work);
- drm_psb_msvdx_frame_info_t *ec_frame = NULL;
- drm_psb_msvdx_frame_info_t *ref_frame = NULL;
- static struct ttm_bo_kmap_obj ec_kmap, ref_kmap;
- struct ttm_buffer_object *ec_bo = NULL;
- struct ttm_buffer_object *ref_bo = NULL;
- struct ttm_object_file *tfile = msvdx_priv->tfile;
- drm_psb_msvdx_decode_status_t *decode_status = NULL;
- bool is_iomem;
- char *ec_start, *ref_start;
-
- if (msvdx_priv->ec_fence > 0)
- msvdx_priv->ref_pic_fence = msvdx_priv->ec_fence - 1;
- else {
- DRM_ERROR("Can't do error concealment for the first frame.\n");
- return;
- }
-
- /*get the frame_info struct for error concealment frame*/
- for (i = 0; i < MAX_DECODE_BUFFERS; i++) {
- if (msvdx_priv->frame_info[i].fence == msvdx_priv->ec_fence) {
- ec_frame = &msvdx_priv->frame_info[i];
- break;
- }
- }
- if (!ec_frame) {
- DRM_ERROR("MSVDX: didn't find frame_info which matched the ec fence\n");
- return;
- }
- decode_status = &ec_frame->decode_status;
- ec_bo = ttm_buffer_object_lookup(tfile, ec_frame->handle);
- if (unlikely(ec_bo == NULL)) {
- printk(KERN_ERR " : Could not find buffer object for setstatus.\n");
- return;
- }
- ret = ttm_bo_reserve(ec_bo, true, true, false, 0);
- if (ret) {
- DRM_ERROR("MSVDX ERROR CONCEALMENT: reserver failed.\n");
- return;
- }
- ret = ttm_bo_kmap(ec_bo,
- 0,
- (ec_frame->buffer_size +
- PAGE_SIZE - 1) >> PAGE_SHIFT,
- &ec_kmap);
- if (ret) {
- printk("MSVDX ERROR CONCEALMENT: ec kmap failed, %d.\n", ret);
- return;
- }
- ec_start = (unsigned char *) ttm_kmap_obj_virtual(&ec_kmap,
- &is_iomem);
-
- /*get the frame_info struct for reference frame*/
- for (i = 0; i < MAX_DECODE_BUFFERS; i++) {
- if (msvdx_priv->frame_info[i].fence == msvdx_priv->ref_pic_fence) {
- ref_frame = &msvdx_priv->frame_info[i];
- break;
- }
- }
- if (!ref_frame) {
- DRM_ERROR("MSVDX: didn't find frame_info which matched the ref fence\n");
- return;
- }
- ref_bo = ttm_buffer_object_lookup(tfile, ref_frame->handle);
- if (unlikely(ref_bo == NULL)) {
- printk(KERN_ERR " : Could not find buffer object for setstatus.\n");
- }
- ret = ttm_bo_reserve(ref_bo, true, true, false, 0);
- if (ret) {
- DRM_ERROR("MSVDX ERROR CONCEALMENT: reserver failed.\n");
- return;
- }
- ret = ttm_bo_kmap(ref_bo,
- 0,
- (ref_frame->buffer_size +
- PAGE_SIZE - 1) >> PAGE_SHIFT,
- &ref_kmap);
- if (ret) {
- printk("MSVDX ERROR CONCEALMENT: ref kmap failed, %d.\n", ret);
- return;
- }
- ref_start = (unsigned char *) ttm_kmap_obj_virtual(&ref_kmap,
- &is_iomem);
-
- /*copy missing mb from ref picture to ec picture*/
- for (i = 0; i < decode_status->num_error_slice; i++) {
- if ((decode_status->start_error_mb_list[i] >= ec_frame->size_mb) ||
- (decode_status->end_error_mb_list[i] >= ec_frame->size_mb) ||
- (decode_status->start_error_mb_list[i] > decode_status->end_error_mb_list[i]))
- continue;
- psb_msvdx_conceal_mb(ec_start, ref_start,
- decode_status->start_error_mb_list[i],
- decode_status->end_error_mb_list[i],
- ec_frame->picture_width_mb, ec_frame->buffer_stride,
- 16, 16);
- psb_msvdx_conceal_mb(ec_start + ec_frame->buffer_size * 2 / 3,
- ref_start + ec_frame->buffer_size * 2 / 3,
- decode_status->start_error_mb_list[i],
- decode_status->end_error_mb_list[i],
- ec_frame->picture_width_mb, ec_frame->buffer_stride,
- 16, 8);
- }
-
- ttm_bo_kunmap(&ec_kmap);
- ttm_bo_kunmap(&ref_kmap);
- ttm_bo_unreserve(ec_bo);
- ttm_bo_unreserve(ref_bo);
-
- if (ec_bo)
- ttm_bo_unref(&ec_bo);
- if (ref_bo)
- ttm_bo_unref(&ref_bo);
-
-}
-
int psb_msvdx_init(struct drm_device *dev)
{
struct drm_psb_private *dev_priv = dev->dev_private;