#endif
/* Define i/o and api values. */
-
-#if 0
-enum codec_io_cmd {
-// CODEC_CMD_COPY_TO_DEVICE_MEM = 5, // user and driver
-// CODEC_CMD_COPY_FROM_DEVICE_MEM,
- CODEC_CMD_API_INDEX = 10, // driver and device
- CODEC_CMD_CONTEXT_INDEX,
- CODEC_CMD_FILE_INDEX,
- CODEC_CMD_DEVICE_MEM_OFFSET,
- CODEC_CMD_GET_THREAD_STATE,
- CODEC_CMD_GET_QUEUE,
- CODEC_CMD_POP_WRITE_QUEUE,
- CODEC_CMD_RELEASE_AVCONTEXT,
- CODEC_CMD_GET_VERSION = 20, // user, driver and device
- CODEC_CMD_GET_ELEMENT_INFO,
- CODEC_CMD_GET_CONTEXT_INDEX,
- CODEC_CMD_SECURE_MEMORY= 30,
- CODEC_CMD_RELEASE_MEMORY,
- CODEC_CMD_USE_DEVICE_MEM,
- CODEC_CMD_REQ_FROM_SMALL_MEMORY,
- CODEC_CMD_REQ_FROM_MEDIUM_MEMORY,
- CODEC_CMD_REQ_FROM_LARGE_MEMORY,
- CODEC_CMD_S_SECURE_BUFFER,
- CODEC_CMD_M_SECURE_BUFFER,
- CODEC_CMD_L_SECURE_BUFFER,
-};
-#endif
-
enum codec_io_cmd {
CODEC_CMD_API_INDEX = 10, // driver and device
CODEC_CMD_CONTEXT_INDEX,
};
enum codec_api_index {
- CODEC_INIT = 0,
- CODEC_DECODE_VIDEO,
- CODEC_ENCODE_VIDEO,
- CODEC_DECODE_AUDIO,
- CODEC_ENCODE_AUDIO,
- CODEC_PICTURE_COPY,
- CODEC_DEINIT,
+ CODEC_INIT = 0,
+ CODEC_DECODE_VIDEO,
+ CODEC_ENCODE_VIDEO,
+ CODEC_DECODE_AUDIO,
+ CODEC_ENCODE_AUDIO,
+ CODEC_PICTURE_COPY,
+ CODEC_DEINIT,
+ CODEC_FLUSH_BUFFERS,
};
struct codec_param {
elem->occupied = false;
list_move_tail(&elem->entry, &maru_brill_codec->avail_s_memblk);
- up(&s_buffer_sema);
+ up(&s_buffer_sema);
DEBUG("unlock s_buffer_sema: %d\n", s_buffer_sema.count);
break;
elem->occupied = false;
list_move_tail(&elem->entry, &maru_brill_codec->avail_m_memblk);
- up(&m_buffer_sema);
+ up(&m_buffer_sema);
DEBUG("unlock m_buffer_sema: %d\n", m_buffer_sema.count);
break;
elem->blk_id = 0;
elem->occupied = false;
- list_move(&elem->entry, &maru_brill_codec->avail_l_memblk);
+ list_move_tail(&elem->entry, &maru_brill_codec->avail_l_memblk);
- up(&l_buffer_sema);
+ up(&l_buffer_sema);
DEBUG("up l_buffer_semaphore: %d\n", l_buffer_sema.count);
break;
if (mem_offset < (16 * 1024 * 1024)) {
DEBUG("release small size of memory\n");
release_s_device_memory(mem_offset);
- } else if (mem_offset - (24 * 1024 * 1024)) {
+ } else if (mem_offset < (24 * 1024 * 1024)) {
DEBUG("release medium size of memory\n");
release_m_device_memory(mem_offset);
} else {
if (copy_to_user((void *)arg, &maru_brill_codec->version, sizeof(int))) {
ERROR("ioctl: failed to copy data to user\n");
ret = -EIO;
- }
+ }
break;
case CODEC_CMD_GET_ELEMENT_INFO:
DEBUG("request a device to get codec elements\n");
} else if (copy_to_user((void *)arg, &value, sizeof(int))) {
ERROR("ioctl: failed to copy data to user\n");
ret = -EIO;
- }
+ }
break;
- case CODEC_CMD_SECURE_MEMORY:
+ case CODEC_CMD_SECURE_MEMORY:
value =
secure_device_memory((uint32_t)file);
if (value < 0) {
ret = -EIO;
}
}
- break;
- case CODEC_CMD_RELEASE_MEMORY:
- {
+ break;
+ case CODEC_CMD_RELEASE_MEMORY:
+ {
uint32_t mem_offset;
if (copy_from_user(&mem_offset, (void *)arg, sizeof(uint32_t))) {
break;
}
release_device_memory(mem_offset);
- }
- break;
- case CODEC_CMD_USE_DEVICE_MEM:
+ }
+ break;
+ case CODEC_CMD_USE_DEVICE_MEM:
{
uint32_t mem_offset;
}
break;
case CODEC_CMD_REQ_FROM_MEDIUM_MEMORY:
- DEBUG("read large size of data from device memory\n");
+ DEBUG("read medium size of data from device memory\n");
value =
secure_m_device_memory((uint32_t)file);
}
}
break;
- case CODEC_CMD_S_SECURE_BUFFER:
+ case CODEC_CMD_S_SECURE_BUFFER:
value =
secure_s_device_memory((uint32_t)file);
if (value < 0) {
ret = -EIO;
}
}
- break;
- case CODEC_CMD_M_SECURE_BUFFER:
+ break;
+ case CODEC_CMD_M_SECURE_BUFFER:
value =
secure_m_device_memory((uint32_t)file);
if (value < 0) {
ret = -EIO;
}
}
- break;
- case CODEC_CMD_L_SECURE_BUFFER:
+ break;
+ case CODEC_CMD_L_SECURE_BUFFER:
value =
secure_l_device_memory((uint32_t)file);
if (value < 0) {
ret = -EIO;
}
}
- break;
+ break;
default:
DEBUG("no available command.");
ret = -EINVAL;
}
break;
case CODEC_CMD_GET_DATA_FROM_MEDIUM_BUFFER:
- DEBUG("read large size of data from device memory\n");
+ DEBUG("read medium size of data from device memory\n");
value =
secure_m_device_memory((uint32_t)file);
if (copy_from_user(&ioparam, buf, sizeof(struct codec_param))) {
ERROR("failed to get codec parameter info from user\n");
return -EIO;
- }
+ }
DEBUG("enter %s. %p\n", __func__, file);
api_index = ioparam.api_index;
- ctx_index = ioparam.ctx_index;
+ ctx_index = ioparam.ctx_index;
switch (api_index) {
case CODEC_INIT:
maru_brill_codec->ioaddr + CODEC_CMD_API_INDEX);
LEAVE_CRITICAL_SECTION;
- if (api_index == CODEC_ENCODE_VIDEO) {
- // in case of medium and large size of data
- release_device_memory(ioparam.mem_offset);
- } else {
- // in case of small size of data
- release_s_device_memory(ioparam.mem_offset);
- }
+ release_device_memory(ioparam.mem_offset);
wait_event_interruptible(wait_queue, context_flags[ctx_index] != 0);
context_flags[ctx_index] = 0;
maru_brill_codec->ioaddr + CODEC_CMD_API_INDEX);
LEAVE_CRITICAL_SECTION;
- wait_event_interruptible(wait_queue, context_flags[ctx_index] != 0);
- context_flags[ctx_index] = 0;
+ wait_event_interruptible(wait_queue, context_flags[ctx_index] != 0);
+ context_flags[ctx_index] = 0;
}
break;
case CODEC_DEINIT:
maru_brill_codec->ioaddr + CODEC_CMD_API_INDEX);
LEAVE_CRITICAL_SECTION;
break;
+ case CODEC_FLUSH_BUFFERS:
+ ENTER_CRITICAL_SECTION;
+ writel((uint32_t)file,
+ maru_brill_codec->ioaddr + CODEC_CMD_FILE_INDEX);
+ writel((int32_t)ioparam.ctx_index,
+ maru_brill_codec->ioaddr + CODEC_CMD_CONTEXT_INDEX);
+ writel((int32_t)ioparam.api_index,
+ maru_brill_codec->ioaddr + CODEC_CMD_API_INDEX);
+ LEAVE_CRITICAL_SECTION;
+ break;
+
default:
- ERROR("wrong api command: %d", api_index);
+ ERROR("invalid api command: %d", api_index);
}
return 0;