Esempio n. 1
0
void _g2d_command_handler(g2d_command_t *cmd)
{
    G2D_DBG("start to handle command (0x%04x)\n", cmd->ctx.flag);

    switch (cmd->ctx.flag)
    {
    case G2D_FLAG_END_OF_FRAME:
        g2d_drv_fb_queue_buffer(cmd->ctx.fb_id);
        break;

    case G2D_FLAG_FLUSH:
        break;

    case G2D_FLAG_MIRROR_FRONT_FB:
        if (g2d_drv_fb_fill_mirror_cmd(&cmd->ctx) != 0) break;
    default:
        {
#ifdef G2D_PROFILE
            struct timeval t1, t2;
            do_gettimeofday(&t1);
#endif
            g2d_drv_power_on();

            g2d_drv_run(&cmd->ctx);

            while (g2d_drv_get_status())
            {
                wait_event_interruptible_timeout(isr_wait_queue, !g2d_drv_get_status(), (30 * HZ / 1000));
                if (g2d_drv_get_status()) G2D_ERR("TIMEOUT: G2D is still busy");
            }

#ifdef G2D_PROFILE
            do_gettimeofday(&t2);
            G2D_INF("process time (%u)\n", (t2.tv_sec - t1.tv_sec) * 1000000 + (t2.tv_usec - t1.tv_usec));
#endif

#ifdef G2D_DEBUG
            _g2d_reg_dump();
#endif

            g2d_drv_reset();

            g2d_drv_power_off();
        }
        break;
    }

    G2D_DBG("handle command (0x%04x) W2M(0x%08x) L0(0x%08x) L1(0x%08x) L2(0x%08x) L3(0x%08x) done\n", cmd->ctx.flag, ioread32(0xF20C5044), ioread32(0xF20C5084), ioread32(0xF20C50C4), ioread32(0xF20C5104), ioread32(0xF20C5144));

    memset(&cmd->ctx, 0, sizeof(g2d_context_t));

#ifdef G2D_QUEUE
    if (cmd->sync_cmd)
    {
        cmd->sync_cmd = false;
        up(&cmd->sync);
    }
    up(&cmd->lock);
#endif
}
Esempio n. 2
0
G2D_STATUS_ENUM g2dInit(void)
{
   #if (defined(G2D_HW_SUPPORT) || defined(G2D_HW_SHARE_WITH_GOVL_SUPPORT))
      #if defined(__MTK_TARGET__)
         if (NULL == g2d_state_mutex)
         {
            g2d_state_mutex = kal_create_mutex("G2D State");
            ASSERT(g2d_state_mutex != NULL);
            g2d_mutex_init(&g2d_mutex);
         }
      #endif
      /// we can't call mutex before task being initialized
      /// kal_take_mutex(g2d_state_mutex);
      /// kal_give_mutex(g2d_state_mutex);
      #if defined(__MTK_TARGET__) || defined(G2D_FPGA)
         g2d_drv_power_on();
         g2d_drv_init();
         g2d_drv_power_off();
      #endif

   #endif

#if defined(__MTK_TARGET__)
   /* register bb reg dump */
   g2d_dump.regions = (kal_uint32*)g2d_dump_regions;
   g2d_dump.num = sizeof(g2d_dump_regions) / (sizeof(kal_uint32) * 3);
   g2d_dump.bbreg_dump_callback = NULL;
   EX_REGISTER_BBREG_DUMP(&g2d_dump);
#endif /* __MTK_TARGET__ */

   return G2D_STATUS_OK;
}
Esempio n. 3
0
void _g2d_command_handler(g2d_command_t *cmd)
{
    G2D_DBG("start to handle command\n");

#ifdef G2D_QUEUE
    if (cmd->ctx.end_of_frame)
    {
        g2d_drv_fb_queue_buffer(cmd->ctx.fb_id);
        up(&cmd->lock);
        return;
    }
#endif

    g2d_drv_power_on();

    g2d_drv_run(&cmd->ctx);

    wait_event_interruptible(isr_wait_queue, !g2d_drv_get_status());

#ifdef G2D_DEBUG
    _g2d_reg_dump();
#endif

    g2d_drv_power_off();

    G2D_DBG("handle command done\n");

#ifdef G2D_QUEUE
    up(&cmd->lock);
#endif
}
Esempio n. 4
0
G2D_STATUS_ENUM g2dReleaseHandle(G2D_HANDLE_STRUCT *handle)
{
   switch (handle->type)
   {
      case G2D_CODEC_TYPE_HW:
         #if (defined(G2D_HW_SUPPORT) || defined(G2D_HW_SHARE_WITH_GOVL_SUPPORT))
         {
            #if defined(__DYNAMIC_SWITCH_CACHEABILITY__) && defined(__MTK_TARGET__)
            {
               kal_int32 colorSize, colorSizeMax;
               G2D_CANVAS_INFO_STRUCT *dstCanvas = &(handle->dstCanvas);
               
               if (GFX_CACHE_SWITCH_BEHAVIOR_TRY_SWITCH == handle->dstCanvasCacheSwitchBehavior)
               {
                  if(G2D_MEMORY_TYPE_SWITCH_TO_NONCACHEABLE == (handle->dstCanvasType))
                  {
                     G2D_CANVAS_INFO_STRUCT *dstCanvas = &(handle->dstCanvas);
                     drv_gfx_dynamic_switch_cacheable(&(dstCanvas->RGBBufferAddr), dstCanvas->RGBBufferSize, KAL_FALSE);
                     handle->dstCanvasType = G2D_MEMORY_TYPE_NO_SWITCH;
                  }
               }

               if (GFX_CACHE_SWITCH_BEHAVIOR_TRY_SWITCH == handle->srcCanvasCacheSwitchBehavior)
               {
                  #if defined(G2D_HW_SUPPORT)
                  if(G2D_MEMORY_TYPE_SWITCH_TO_NONCACHEABLE == (handle->srcBitbltRGBCanvasType))
                  {
                     G2D_CANVAS_INFO_STRUCT *srcCanvas = &(handle->bitbltFunc.srcCanvas);

                     drv_gfx_dynamic_switch_cacheable(&(srcCanvas->RGBBufferAddr), srcCanvas->RGBBufferSize, KAL_FALSE);
                     handle->srcBitbltRGBCanvasType = G2D_MEMORY_TYPE_NO_SWITCH;
                  }
                  #endif

                  if(G2D_MEMORY_TYPE_SWITCH_TO_NONCACHEABLE == (handle->srcRectFillOverlayRGBCanvasType))
                  {
                     G2D_CANVAS_INFO_STRUCT *srcCanvas = &(handle->rectFillFunc.srcCanvas);

                     drv_gfx_dynamic_switch_cacheable(&(srcCanvas->RGBBufferAddr), srcCanvas->RGBBufferSize, KAL_FALSE);
                     handle->srcRectFillOverlayRGBCanvasType = G2D_MEMORY_TYPE_NO_SWITCH;
                  }

                  if(G2D_MEMORY_TYPE_SWITCH_TO_NONCACHEABLE == (handle->srcLtRGBCanvasType))
                  {
                     G2D_CANVAS_INFO_STRUCT *srcCanvas = &(handle->ltFunc.srcCanvas);

                     drv_gfx_dynamic_switch_cacheable(&(srcCanvas->RGBBufferAddr), srcCanvas->RGBBufferSize, KAL_FALSE);
                     handle->srcLtRGBCanvasType = G2D_MEMORY_TYPE_NO_SWITCH;
                  }

                  if(G2D_COLOR_FORMAT_UYVY422 == handle->ltFunc.srcCanvas.colorFormat)
                  {
                     colorSizeMax = 1;
                  }
                  else
                  {
                     colorSizeMax = 3;
                  }
                  for(colorSize = 0; colorSize < colorSizeMax; colorSize++)
                  {
                     if(G2D_MEMORY_TYPE_SWITCH_TO_NONCACHEABLE == (handle->srcLtYUVCanvasType[colorSize]))
                     {
                        G2D_CANVAS_INFO_STRUCT *srcCanvas = &(handle->ltFunc.srcCanvas);
                        if(0 != (srcCanvas->YUVBufferSize[colorSize]))
                        {
                           drv_gfx_dynamic_switch_cacheable(&(srcCanvas->YUVBufferAddr[colorSize]), srcCanvas->YUVBufferSize[colorSize], KAL_FALSE);
                           handle->srcLtYUVCanvasType[colorSize] = G2D_MEMORY_TYPE_NO_SWITCH;
                        }
                     }
                  }
               }

            }
            #endif
            #if defined(__MTK_TARGET__)
               if(g2dGetStatus(handle))
                  return G2D_STATUS_BUSY;

               g2d_drv_power_off();

               if (KAL_TRUE != INT_QueryExceptionStatus())
               {
                  handle->g2dState = G2D_STATE_IDLE;
                  g2d_mutex_unlock(&g2d_mutex);
               }
               else
               {
                  handle->g2dState = G2D_STATE_IDLE;
               }
               g2d_mutex_wakeup_wait_task();
            #else
               handle->g2dState = G2D_STATE_IDLE;
            #endif
         }
         break;
         #else
            return G2D_STATUS_NOT_SUPPORT;
         #endif /// G2D_HW_SUPPORT
      #if !defined(G2D_FPGA)
         case G2D_CODEC_TYPE_SW:
            free(handle);
         break;
      #endif
      default:
         ASSERT(0);
      break;
   }

   return G2D_STATUS_OK;
}