Exemplo 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
}
Exemplo 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;
}
Exemplo 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
}
Exemplo n.º 4
0
G2D_STATUS_ENUM g2dGetHandle(G2D_HANDLE_STRUCT **handlePtr, G2D_CODEC_TYPE_ENUM codecType, G2D_GET_HANDLE_MODE_ENUM handleMode)
{
   G2D_HANDLE_STRUCT *handle = NULL;

   switch (codecType)
   {
      case G2D_CODEC_TYPE_HW:
         #if (defined(G2D_HW_SUPPORT) || defined(G2D_HW_SHARE_WITH_GOVL_SUPPORT))
         {
            *handlePtr = &_g2d_hw_handle;
            handle = *handlePtr;
            #if defined(__MTK_TARGET__)
               if(G2D_GET_HANDLE_MODE_BLOCKING_UNTIL_GET_HANDLE == handleMode)
               {
                  if (KAL_TRUE != INT_QueryExceptionStatus())
                  {
                     while(1)
                     {
                        g2d_mutex_lock(&g2d_mutex);
                        if(G2D_STATE_IDLE != (handle->g2dState))
                        {
                           ASSERT(0);
                        }
                        else
                        {
                           memset(handle, 0, sizeof(G2D_HANDLE_STRUCT));
                           handle->g2dState = G2D_STATE_SETTING_PARAMETER;
                           break;
                        }
                     }
                  }
                  else
                  {
                     while(1)
                     {
                        if(G2D_STATE_IDLE != (handle->g2dState))
                        {
                           kal_sleep_task(1); // 4.615 ms
                           continue;
                        }
                        else
                        {
                           break;
                        }
                     }
                     memset(handle, 0, sizeof(G2D_HANDLE_STRUCT));
                     handle->g2dState = G2D_STATE_SETTING_PARAMETER;
                  }

                  g2d_drv_power_on();
               }
               else
               {
                  if (KAL_TRUE != INT_QueryExceptionStatus())
                  {
                     if (KAL_FALSE == g2d_mutex_lock_fast(&g2d_mutex))
                     {
                        return G2D_STATUS_BUSY;
                     }
                     if(G2D_STATE_IDLE != (handle->g2dState))
                     {
                        ASSERT(0);
                        return G2D_STATUS_BUSY;
                     }
                     memset(handle, 0, sizeof(G2D_HANDLE_STRUCT));
                     handle->g2dState = G2D_STATE_SETTING_PARAMETER;
                  }
                  else
                  {
                     if(G2D_STATE_IDLE != (handle->g2dState))
                     {
                        return G2D_STATUS_BUSY;
                     }
                     memset(handle, 0, sizeof(G2D_HANDLE_STRUCT));
                     handle->g2dState = G2D_STATE_SETTING_PARAMETER;
                  }

                  g2d_drv_power_on();
               }
            #else
               if(G2D_GET_HANDLE_MODE_BLOCKING_UNTIL_GET_HANDLE == handleMode)
               {
                  while(1)
                  {
                     if(G2D_STATE_IDLE != (handle->g2dState))
                     {
                        continue;
                     }
                     else
                     {
                        break;
                     }
                  }
               }
               else
               {
                  if(G2D_STATE_IDLE != (handle->g2dState))
                  {
                     return G2D_STATUS_BUSY;
                  }
               }
               memset(handle, 0, sizeof(G2D_HANDLE_STRUCT));
               handle->g2dState = G2D_STATE_SETTING_PARAMETER;
            #endif
         }
         break;
         #else
            return G2D_STATUS_NOT_SUPPORT;
         #endif /// G2D_HW_SUPPORT
      #if !defined(G2D_FPGA)
         case G2D_CODEC_TYPE_SW:
            handle = (G2D_HANDLE_STRUCT *)malloc(sizeof(G2D_HANDLE_STRUCT));
            /// Can not memset to hw handle to 0
            memset(handle, 0, sizeof(G2D_HANDLE_STRUCT));
            handle->g2dState = G2D_STATE_SETTING_PARAMETER;
            *handlePtr = handle;
         break;
      #endif
      default:
         ASSERT(0);
         *handlePtr = NULL;
      break;
   }
   handle->type = codecType;

   return G2D_STATUS_OK;
}