예제 #1
0
static __s32 sprite_set_sprite_block_para(__u32 sel, __u32 id, __u32 next_id,
					  __disp_sprite_block_para_t *para)
{
	__u32 bpp, addr;

	bpp = DE_BE_Format_To_Bpp(gsprite[sel].format);

	addr = DE_BE_Offset_To_Addr((__u32) para->fb.addr[0],
				    para->fb.size.width,
				    para->src_win.x, para->src_win.y, bpp);
	DE_BE_Sprite_Block_Set_fb(sel, id, __phys_to_bus(addr),
				  para->fb.size.width * (bpp >> 3));
	DE_BE_Sprite_Block_Set_Pos(sel, id, para->scn_win.x, para->scn_win.y);
	DE_BE_Sprite_Block_Set_Size(sel, id, para->scn_win.width,
				    para->scn_win.height);
	DE_BE_Sprite_Block_Set_Next_Id(sel, id, next_id);

	return 0;
}
예제 #2
0
int mem_map_ext_wrapper(struct mali_session_data *session_data, _mali_uk_map_external_mem_s __user * argument)
{
	_mali_uk_map_external_mem_s uk_args;
	_mali_osk_errcode_t err_code;

	/* validate input */
	/* the session_data pointer was validated by caller */
    MALI_CHECK_NON_NULL( argument, -EINVAL);

	/* get call arguments from user space. copy_from_user returns how many bytes which where NOT copied */
	if ( 0 != copy_from_user(&uk_args, (void __user *)argument, sizeof(_mali_uk_map_external_mem_s)) )
	{
		return -EFAULT;
	}

	uk_args.ctx = session_data;
	uk_args.phys_addr = __phys_to_bus(uk_args.phys_addr);

	err_code = _mali_ukk_map_external_mem( &uk_args );

	if (0 != put_user(uk_args.cookie, &argument->cookie))
	{
        if (_MALI_OSK_ERR_OK == err_code)
        {
            /* Rollback */
           	_mali_uk_unmap_external_mem_s uk_args_unmap;

            uk_args_unmap.ctx = session_data;
            uk_args_unmap.cookie = uk_args.cookie;
            err_code = _mali_ukk_unmap_external_mem( &uk_args_unmap );
            if (_MALI_OSK_ERR_OK != err_code)
            {
                MALI_DEBUG_PRINT(4, ("reverting _mali_ukk_unmap_external_mem, as a result of failing put_user(), failed\n"));
            }
        }
        return -EFAULT;
    }

    /* Return the error that _mali_ukk_free_big_block produced */
	return map_errcode(err_code);
}
예제 #3
0
/*
 * setting source x/y offset
 */
__s32 BSP_disp_sprite_block_set_src_win(__u32 sel, __s32 hid,
					__disp_rect_t *src_win)
{
	__s32 id = 0;
	list_head_t *node = NULL;
	__u32 bpp, addr;

	id = Sprite_Hid_To_Id(sel, hid);
	if (gsprite[sel].block_status[id] & SPRITE_BLOCK_USED) {
		node = List_Find_Sprite_Block(sel, id);

		bpp = DE_BE_Format_To_Bpp(gsprite[sel].format);
		addr =
		    DE_BE_Offset_To_Addr(node->data->address,
					 node->data->size.width, src_win->x,
					 src_win->y, bpp);
		DE_BE_Sprite_Block_Set_fb(sel, id, __phys_to_bus(addr),
					  node->data->size.width * (bpp >> 3));

		node->data->src_win.x = src_win->x;
		node->data->src_win.y = src_win->y;

		return DIS_SUCCESS;
	} else {