summaryrefslogtreecommitdiffstats
path: root/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'exynos4/hal/libhwcomposer/SecHWCUtils.cpp')
-rw-r--r--exynos4/hal/libhwcomposer/SecHWCUtils.cpp897
1 files changed, 40 insertions, 857 deletions
diff --git a/exynos4/hal/libhwcomposer/SecHWCUtils.cpp b/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
index 5214e40..6351bbf 100644
--- a/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
+++ b/exynos4/hal/libhwcomposer/SecHWCUtils.cpp
@@ -25,14 +25,8 @@
*/
#include "SecHWCUtils.h"
-
-#ifdef BOARD_USE_V4L2_ION
-#define V4L2_BUF_TYPE_OUTPUT V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
-#define V4L2_BUF_TYPE_CAPTURE V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
-#else
#define V4L2_BUF_TYPE_OUTPUT V4L2_BUF_TYPE_VIDEO_OUTPUT
#define V4L2_BUF_TYPE_CAPTURE V4L2_BUF_TYPE_VIDEO_CAPTURE
-#endif
#define EXYNOS4_ALIGN( value, base ) (((value) + ((base) - 1)) & ~((base) - 1))
@@ -40,7 +34,7 @@
#ifdef CHECK_FPS
#include <sys/time.h>
#include <unistd.h>
-#define CHK_FRAME_CNT 30
+#define CHK_FRAME_CNT 57
void check_fps()
{
@@ -59,7 +53,7 @@ void check_fps()
memcpy(&tick_old, &tick, sizeof(timeval));
if (cnt == (10 + CHK_FRAME_CNT)) {
FPS = 1000*CHK_FRAME_CNT/total;
- LOGE("[FPS]:%d\n", FPS);
+ ALOGE("[FPS]:%d\n", FPS);
total = 0;
cnt = 10;
}
@@ -77,10 +71,6 @@ struct yuv_fmt_list yuv_list[] = {
{ "V4L2_PIX_FMT_NV21X", "YUV420/2P/MSB_CBCR", V4L2_PIX_FMT_NV21X, 12, 2 },
{ "V4L2_PIX_FMT_NV12X", "YUV420/2P/MSB_CRCB", V4L2_PIX_FMT_NV12X, 12, 2 },
{ "V4L2_PIX_FMT_YUV420", "YUV420/3P", V4L2_PIX_FMT_YUV420, 12, 3 },
-#ifdef BOARD_USE_V4L2_ION
- { "V4L2_PIX_FMT_YUV420M", "YUV420/3P", V4L2_PIX_FMT_YUV420M, 12, 3 },
- { "V4L2_PIX_FMT_NV12M", "YUV420/2P", V4L2_PIX_FMT_NV12M, 12, 2 },
-#endif
{ "V4L2_PIX_FMT_YUYV", "YUV422/1P/YCBYCR", V4L2_PIX_FMT_YUYV, 16, 1 },
{ "V4L2_PIX_FMT_YVYU", "YUV422/1P/YCRYCB", V4L2_PIX_FMT_YVYU, 16, 1 },
{ "V4L2_PIX_FMT_UYVY", "YUV422/1P/CBYCRY", V4L2_PIX_FMT_UYVY, 16, 1 },
@@ -110,18 +100,10 @@ int window_open(struct hwc_win_info_t *win, int id)
switch (id) {
case 0:
-#ifdef BOARD_USE_V4L2_ION
- real_id = 2;
-#else
real_id = 3;
-#endif
break;
case 1:
-#ifdef BOARD_USE_V4L2_ION
- real_id = 1;
-#else
real_id = 4;
-#endif
break;
default:
SEC_HWC_Log(HWC_LOG_ERROR, "%s::id(%d) is weird", __func__, id);
@@ -166,11 +148,6 @@ int window_close(struct hwc_win_info_t *win)
if (0 < win->fd) {
-#ifdef BOARD_USE_V4L2_ION
- ion_unmap((void *)win->addr[0], ALIGN(win->size * NUM_OF_WIN_BUF, PAGE_SIZE));
- ion_free(win->ion_fd);
-#endif
-
#ifdef ENABLE_FIMD_VSYNC
int vsync = 0;
if (ioctl(win->fd, S3CFB_SET_VSYNC_INT, &vsync) < 0)
@@ -232,26 +209,9 @@ int window_get_info(struct hwc_win_info_t *win, int win_num)
win->size = win->fix_info.line_length * win->var_info.yres;
-#ifdef BOARD_USE_V4L2_ION
- struct s3c_fb_user_ion_client ion_handle;
- void *ion_start_addr;
-
- if (ioctl(win->fd, S3CFB_GET_ION_USER_HANDLE, &ion_handle) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Get fb ion client is failed\n");
- return -1;
- }
-
- win->ion_fd = ion_handle.fd;
- ion_start_addr = ion_map(win->ion_fd, ALIGN(win->size * NUM_OF_WIN_BUF, PAGE_SIZE), 0);
-#endif
-
for (int j = 0; j < NUM_OF_WIN_BUF; j++) {
temp_size = win->size * j;
-#ifdef BOARD_USE_V4L2_ION
- win->addr[j] = (uint32_t)ion_start_addr + temp_size;
-#else
win->addr[j] = win->fix_info.smem_start + temp_size;
-#endif
SEC_HWC_Log(HWC_LOG_DEBUG, "%s::win-%d add[%d] %x ",
__func__, win_num, j, win->addr[j]);
}
@@ -268,17 +228,10 @@ int window_pan_display(struct hwc_win_info_t *win)
struct fb_var_screeninfo *lcd_info = &(win->lcd_info);
#ifdef ENABLE_FIMD_VSYNC
-#ifdef BOARD_USE_V4L2_ION
- int fimd_num = 0;
- if (ioctl(win->fd, FBIO_WAITFORVSYNC, &fimd_num) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIO_WAITFORVSYNC fail(%s)",
- __func__, strerror(errno));
-#else
if (ioctl(win->fd, FBIO_WAITFORVSYNC, 0) < 0)
SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIO_WAITFORVSYNC fail(%s)",
__func__, strerror(errno));
#endif
-#endif
lcd_info->yoffset = lcd_info->yres * win->buf_index;
@@ -339,25 +292,10 @@ int fimc_v4l2_set_src(int fd, unsigned int hw_ver, s5p_fimc_img_info *src)
struct v4l2_crop crop;
struct v4l2_requestbuffers req;
-#ifdef BOARD_USE_V4L2_ION
- /* You MUST initialize structure for v4l2 */
- memset(&fmt, 0, sizeof(fmt));
- memset(&cropcap, 0, sizeof(cropcap));
- memset(&crop, 0, sizeof(crop));
- memset(&req, 0, sizeof(req));
-
- /* To set size & format for source image (DMA-INPUT) */
- fmt.fmt.pix_mp.num_planes = src->planes;
- fmt.fmt.pix_mp.width = src->full_width;
- fmt.fmt.pix_mp.height = src->full_height;
- fmt.fmt.pix_mp.pixelformat = src->color_space;
- fmt.fmt.pix_mp.field = V4L2_FIELD_ANY;
-#else
fmt.fmt.pix.width = src->full_width;
fmt.fmt.pix.height = src->full_height;
fmt.fmt.pix.pixelformat = src->color_space;
fmt.fmt.pix.field = V4L2_FIELD_NONE;
-#endif
fmt.type = V4L2_BUF_TYPE_OUTPUT;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
@@ -370,10 +308,6 @@ int fimc_v4l2_set_src(int fd, unsigned int hw_ver, s5p_fimc_img_info *src)
crop.type = V4L2_BUF_TYPE_OUTPUT;
crop.c.width = src->width;
crop.c.height = src->height;
-#ifdef BOARD_USE_V4L2_ION
- crop.c.left = src->start_x;
- crop.c.top = src->start_y;
-#else
if (0x50 <= hw_ver) {
crop.c.left = src->start_x;
crop.c.top = src->start_y;
@@ -382,8 +316,6 @@ int fimc_v4l2_set_src(int fd, unsigned int hw_ver, s5p_fimc_img_info *src)
crop.c.top = 0;
}
-#endif
-
if (ioctl(fd, VIDIOC_S_CROP, &crop) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_CROP :"
"crop.c.left : (%d), crop.c.top : (%d), crop.c.width : (%d), crop.c.height : (%d)",
@@ -410,27 +342,10 @@ int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
struct v4l2_format sFormat;
struct v4l2_control vc;
struct v4l2_framebuffer fbuf;
-#ifdef BOARD_USE_V4L2_ION
- struct v4l2_crop crop;
- struct v4l2_requestbuffers req;
-#endif
int ret;
-#ifdef BOARD_USE_V4L2_ION
- /* You MUST initialize structure for v4l2 */
- memset(&sFormat, 0, sizeof(sFormat));
- memset(&vc, 0, sizeof(vc));
- memset(&fbuf, 0, sizeof(fbuf));
- memset(&crop, 0, sizeof(crop));
- memset(&req, 0, sizeof(req));
-#endif
-
/* set rotation configuration */
-#ifdef BOARD_USE_V4L2_ION
- vc.id = V4L2_CID_ROTATE;
-#else
vc.id = V4L2_CID_ROTATION;
-#endif
vc.value = rotation;
ret = ioctl(fd, VIDIOC_S_CTRL, &vc);
@@ -463,45 +378,6 @@ int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
return -1;
}
-#ifdef BOARD_USE_V4L2_ION
- /* set destination */
- sFormat.type = V4L2_BUF_TYPE_CAPTURE;
- sFormat.fmt.pix_mp.width = dst->full_width;
- sFormat.fmt.pix_mp.height = dst->full_height;
- sFormat.fmt.pix_mp.pixelformat = dst->color_space;
- sFormat.fmt.pix_mp.num_planes = dst->planes;
- sFormat.fmt.pix.field = V4L2_FIELD_ANY;
-
- ret = ioctl(fd, VIDIOC_S_FMT, &sFormat);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_FMT (%d)", __func__, ret);
- return -1;
- }
-
- /* set destination window */
- crop.type = V4L2_BUF_TYPE_CAPTURE;
- crop.c.left = dst->start_x;
- crop.c.top = dst->start_y;
- crop.c.width = dst->width;
- crop.c.height = dst->height;
-
- ret = ioctl(fd, VIDIOC_S_CROP, &crop);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_CROP (%d)", __func__, ret);
- return -1;
- }
-
- /* input buffer type */
- req.count = 1;
- req.type = V4L2_BUF_TYPE_CAPTURE;
- req.memory = V4L2_MEMORY_USERPTR;
-
- ret = ioctl (fd, VIDIOC_REQBUFS, &req);
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in VIDIOC_REQBUFS (%d)", __func__, ret);
- return -1;
- }
-#else
/* set size, format & address for destination image (DMA-OUTPUT) */
ret = ioctl(fd, VIDIOC_G_FBUF, &fbuf);
if (ret < 0) {
@@ -532,7 +408,6 @@ int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_FMT (%d)", __func__, ret);
return -1;
}
-#endif
return 0;
}
@@ -549,34 +424,15 @@ int fimc_v4l2_stream_on(int fd, enum v4l2_buf_type type)
int fimc_v4l2_queue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type, int index)
{
-#ifdef BOARD_USE_V4L2_ION
- struct v4l2_plane plane[3];
- int i;
-#endif
struct v4l2_buffer buf;
int ret;
-#ifdef BOARD_USE_V4L2_ION
- buf.length = fimc_buf->planes;
-#else
buf.length = 0;
buf.m.userptr = (unsigned long)fimc_buf;
-#endif
buf.memory = V4L2_MEMORY_USERPTR;
buf.index = index;
buf.type = type;
-#ifdef BOARD_USE_V4L2_ION
- if (buf.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
- buf.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
- for (i = 0; i < buf.length; i++) {
- plane[i].m.userptr = fimc_buf->base[i];
- plane[i].length = fimc_buf->size[i];
- }
- }
- buf.m.planes = plane;
-#endif
-
ret = ioctl(fd, VIDIOC_QBUF, &buf);
if (0 > ret) {
SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_QBUF : (%d)", ret);
@@ -589,14 +445,7 @@ int fimc_v4l2_queue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type,
int fimc_v4l2_dequeue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type)
{
struct v4l2_buffer buf;
-#ifdef BOARD_USE_V4L2_ION
- struct v4l2_plane plane[3];
-#endif
-#ifdef BOARD_USE_V4L2_ION
- buf.m.planes = plane;
- buf.length = fimc_buf->planes;
-#endif
buf.memory = V4L2_MEMORY_USERPTR;
buf.type = type;
@@ -654,27 +503,6 @@ int fimc_handle_oneshot(int fd, struct fimc_buf *fimc_src_buf, struct fimc_buf *
check_fps();
#endif
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_queue(fd, fimc_src_buf, V4L2_BUF_TYPE_OUTPUT, 0) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_queue()");
- return -1;
- }
-
- if (fimc_v4l2_queue(fd, fimc_dst_buf, V4L2_BUF_TYPE_CAPTURE, 0) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_queue()");
- return -2;
- }
-
- if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_on()");
- return -3;
- }
-
- if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_CAPTURE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_stream_on()");
- return -4;
- }
-#else
if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_on()");
return -5;
@@ -684,38 +512,19 @@ int fimc_handle_oneshot(int fd, struct fimc_buf *fimc_src_buf, struct fimc_buf *
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_queue()");
goto STREAM_OFF;
}
-#endif
if (fimc_v4l2_dequeue(fd, fimc_src_buf, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_dequeue()");
return -6;
}
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_dequeue(fd, fimc_dst_buf, V4L2_BUF_TYPE_CAPTURE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_dequeue()");
- return -7;
- }
-#endif
STREAM_OFF:
if (fimc_v4l2_stream_off(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_off()");
return -8;
}
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_stream_off(fd, V4L2_BUF_TYPE_CAPTURE) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_stream_off()");
- return -9;
- }
-#endif
if (fimc_v4l2_clr_buf(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_clr_buf()");
return -10;
}
-#ifdef BOARD_USE_V4L2_ION
- if (fimc_v4l2_clr_buf(fd, V4L2_BUF_TYPE_CAPTURE)< 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_clr_buf()");
- return -11;
- }
-#endif
return 0;
}
@@ -823,17 +632,11 @@ static int get_src_phys_addr(struct hwc_context_t *ctx,
sec_img *src_img, sec_rect *src_rect)
{
s5p_fimc_t *fimc = &ctx->fimc;
- struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[0];
- struct s3c_mem_dma_param s3c_mem_dma;
-#ifdef USE_HW_PMEM
- sec_pmem_alloc_t *pm_alloc = &ctx->sec_pmem.sec_pmem_alloc[0];
-#endif
unsigned int src_virt_addr = 0;
unsigned int src_phys_addr = 0;
unsigned int src_frame_size = 0;
- struct pmem_region region;
ADDRS * addr;
// error check routine
@@ -884,61 +687,16 @@ static int get_src_phys_addr(struct hwc_context_t *ctx,
}
break;
default:
-#ifdef BOARD_USE_V4L2_ION
- fimc->params.src.buf_addr_phy_rgb_y = src_img->base;
- fimc->params.src.buf_addr_phy_cb = src_img->base + src_img->uoffset;
- fimc->params.src.buf_addr_phy_cr = src_img->base + src_img->uoffset + src_img->voffset;
- src_phys_addr = fimc->params.src.buf_addr_phy_rgb_y;
- break;
-#endif
if (src_img->usage & GRALLOC_USAGE_HW_FIMC1) {
fimc->params.src.buf_addr_phy_rgb_y = src_img->paddr;
fimc->params.src.buf_addr_phy_cb = src_img->paddr + src_img->uoffset;
fimc->params.src.buf_addr_phy_cr = src_img->paddr + src_img->uoffset + src_img->voffset;
src_phys_addr = fimc->params.src.buf_addr_phy_rgb_y;
- break;
- }
- // copy
- src_frame_size = FRAME_SIZE(src_img->format, src_img->w, src_img->h);
- if (src_frame_size == 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::FRAME_SIZE fail", __func__);
- return 0;
- }
-
-#ifdef USE_HW_PMEM
- if (0 <= checkPmem(&ctx->sec_pmem, 0, src_frame_size)) {
- src_virt_addr = pm_alloc->virt_addr;
- src_phys_addr = pm_alloc->phys_addr;
- pm_alloc->size = src_frame_size;
- } else
-#endif
- if (0 <= checkMem(&ctx->s3c_mem, 0, src_frame_size)) {
- src_virt_addr = ptr_mem_alloc->vir_addr;
- src_phys_addr = ptr_mem_alloc->phy_addr;
- ptr_mem_alloc->size = src_frame_size;
- } else {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::check_mem fail", __func__);
- return 0;
- }
- if ((src_img->format == HAL_PIXEL_FORMAT_YCbCr_420_P) ||
- (src_img->format == HAL_PIXEL_FORMAT_YV12) ||
- (src_img->format == HAL_PIXEL_FORMAT_YCbCr_420_SP) ||
- (src_img->format == HAL_PIXEL_FORMAT_YCrCb_420_SP)) {
- if (memcpy_rect((void *)src_virt_addr, (void*)((unsigned int)src_img->base),
- src_img->f_w, src_img->f_h, src_rect->w, src_rect->h, src_img->format) != 0)
- return 0;
} else {
- memcpy((void *)src_virt_addr, (void*)((unsigned int)src_img->base), src_frame_size);
+ SEC_HWC_Log(HWC_LOG_ERROR, "%s::\nformat = 0x%x : Not "
+ "GRALLOC_USAGE_HW_FIMC1 can not supported\n",
+ __func__, src_img->format);
}
-
-#ifdef USE_HW_PMEM
- if (pm_alloc->size == src_frame_size) {
- region.offset = 0;
- region.len = src_frame_size;
- if (ioctl(ctx->sec_pmem.pmem_master_fd, PMEM_CACHE_FLUSH, &region) < 0)
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::pmem cache flush fail ", __func__);
- }
-#endif
break;
}
}
@@ -946,19 +704,6 @@ static int get_src_phys_addr(struct hwc_context_t *ctx,
return src_phys_addr;
}
-static int get_dst_phys_addr(struct hwc_context_t *ctx, sec_img *dst_img,
- sec_rect *dst_rect, int *dst_memcpy_flag)
-{
- unsigned int dst_phys_addr = 0;
-
- if (HWC_PHYS_MEM_TYPE == dst_img->mem_type && 0 != dst_img->base)
- dst_phys_addr = dst_img->base;
- else
- dst_phys_addr = dst_img->base;
-
- return dst_phys_addr;
-}
-
static inline int rotateValueHAL2PP(unsigned char transform)
{
int rotate_flag = transform & 0x7;
@@ -1049,11 +794,7 @@ static inline int multipleOf16(int number)
static inline int widthOfPP(unsigned int ver, int pp_color_format, int number)
{
-#ifdef BOARD_USE_V4L2_ION
- if (1) {
-#else
if (0x50 <= ver) {
-#endif
switch (pp_color_format) {
/* 422 1/2/3 plane */
case V4L2_PIX_FMT_YUYV:
@@ -1156,7 +897,7 @@ static unsigned int get_yuv_planes(unsigned int fmt)
return yuv_list[sel].planes;
}
-static int runcFimcCore(struct hwc_context_t *ctx,
+static int runFimcCore(struct hwc_context_t *ctx,
unsigned int src_phys_addr, sec_img *src_img, sec_rect *src_rect,
uint32_t src_color_space,
unsigned int dst_phys_addr, sec_img *dst_img, sec_rect *dst_rect,
@@ -1168,18 +909,12 @@ static int runcFimcCore(struct hwc_context_t *ctx,
struct fimc_buf fimc_src_buf;
int src_bpp, src_planes;
-#ifdef BOARD_USE_V4L2_ION
- struct fimc_buf fimc_dst_buf;
- int dst_bpp, dst_planes;
- unsigned int src_frame_size = 0;
- unsigned int dst_frame_size = 0;
-#endif
unsigned int frame_size = 0;
bool src_cbcr_order = true;
int rotate_value = rotateValueHAL2PP(transform);
- int hflip = hflipValueHAL2PP(transform);
- int vflip = vflipValueHAL2PP(transform);
+ int hflip = 0;
+ int vflip = 0;
/* 1. param(fimc config)->src information
* - src_img,src_rect => s_fw,s_fh,s_w,s_h,s_x,s_y
@@ -1193,17 +928,6 @@ static int runcFimcCore(struct hwc_context_t *ctx,
params->src.color_space = src_color_space;
params->src.buf_addr_phy_rgb_y = src_phys_addr;
-#ifdef BOARD_USE_V4L2_ION
- params->dst.full_width = dst_img->f_w;
- params->dst.full_height = dst_img->f_h;
- params->dst.width = widthOfPP(fimc->hw_ver, dst_color_space, dst_rect->w);
- params->dst.height = heightOfPP(dst_color_space, dst_rect->h);
- params->dst.start_x = dst_rect->x;
- params->dst.start_y = dst_rect->y;
- params->dst.color_space = dst_color_space;
- params->dst.buf_addr_phy_rgb_y = dst_phys_addr;
-#endif
-
/* check src minimum */
if (src_rect->w < 16 || src_rect->h < 8) {
SEC_HWC_Log(HWC_LOG_ERROR,
@@ -1217,13 +941,13 @@ static int runcFimcCore(struct hwc_context_t *ctx,
return -1;
}
-#ifdef BOARD_USE_V4L2_ION
-#else
/* 2. param(fimc config)->dst information
* - dst_img,dst_rect,rot => d_fw,d_fh,d_w,d_h,d_x,d_y
*/
switch (rotate_value) {
case 0:
+ hflip = hflipValueHAL2PP(transform);
+ vflip = vflipValueHAL2PP(transform);
params->dst.full_width = dst_img->f_w;
params->dst.full_height = dst_img->f_h;
@@ -1235,6 +959,8 @@ static int runcFimcCore(struct hwc_context_t *ctx,
params->dst.height = heightOfPP(dst_color_space, dst_rect->h);
break;
case 90:
+ hflip = vflipValueHAL2PP(transform);
+ vflip = hflipValueHAL2PP(transform);
params->dst.full_width = dst_img->f_h;
params->dst.full_height = dst_img->f_w;
@@ -1277,10 +1003,9 @@ static int runcFimcCore(struct hwc_context_t *ctx,
break;
}
params->dst.color_space = dst_color_space;
-#endif
SEC_HWC_Log(HWC_LOG_DEBUG,
- "runcFimcCore()::"
+ "runFimcCore()::"
"SRC f.w(%d),f.h(%d),x(%d),y(%d),w(%d),h(%d)=>"
"DST f.w(%d),f.h(%d),x(%d),y(%d),w(%d),h(%d)",
params->src.full_width, params->src.full_height,
@@ -1320,35 +1045,6 @@ static int runcFimcCore(struct hwc_context_t *ctx,
* - set input buffer
* - set buffer type (V4L2_MEMORY_USERPTR)
*/
-#ifdef BOARD_USE_V4L2_ION
- switch (dst_img->format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_RGB_888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- dst_planes = 1;
- dst_bpp = 32;
- break;
-
- case HAL_PIXEL_FORMAT_RGB_565:
- case HAL_PIXEL_FORMAT_RGBA_5551:
- case HAL_PIXEL_FORMAT_RGBA_4444:
- dst_planes = 1;
- dst_bpp = 16;
- break;
- }
-
- dst_frame_size = params->dst.width * params->dst.height ;
- params->dst.planes = dst_planes;
-
- if (dst_planes == 1) {
- fimc_dst_buf.base[0] = params->dst.buf_addr_phy_rgb_y;
- if (dst_bpp == 32)
- fimc_dst_buf.size[0] = dst_frame_size * 4;
- else if (dst_bpp == 16)
- fimc_dst_buf.size[0] = dst_frame_size * 2;
- }
-#endif
if (fimc_v4l2_set_dst(fimc->dev_fd, &params->dst, rotate_value, hflip, vflip, dst_phys_addr) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_dst is failed\n");
@@ -1361,16 +1057,13 @@ static int runcFimcCore(struct hwc_context_t *ctx,
* - set input buffer
* - set buffer type (V4L2_MEMORY_USERPTR)
*/
-#ifndef BOARD_USE_V4L2_ION
if (fimc_v4l2_set_src(fimc->dev_fd, fimc->hw_ver, &params->src) < 0) {
SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_src is failed\n");
return -1;
}
-#endif
/* 5. Set input dma address (Y/RGB, Cb, Cr)
* - zero copy : mfc, camera
- * - memcpy to pmem : SW dec(420P), video editor(YV12)
*/
switch (src_img->format) {
case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
@@ -1390,32 +1083,9 @@ static int runcFimcCore(struct hwc_context_t *ctx,
case HAL_PIXEL_FORMAT_RGB_565:
case HAL_PIXEL_FORMAT_YV12:
default:
- if (src_img->format == HAL_PIXEL_FORMAT_YV12)
+ if (src_img->format == HAL_PIXEL_FORMAT_YV12){
src_cbcr_order = false;
-
-#ifdef BOARD_USE_V4L2_ION
- fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
- if (src_cbcr_order == true) {
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cr;
- } else {
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cr;
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cb;
}
- SEC_HWC_Log(HWC_LOG_DEBUG,
- "runFimcCore - Y=0x%X, U=0x%X, V=0x%X\n",
- fimc_src_buf.base[0], fimc_src_buf.base[1],fimc_src_buf.base[2]);
- src_frame_size = params->src.full_width * params->src.full_height;
- fimc_src_buf.size[0] = src_frame_size;
- fimc_src_buf.size[1] = src_frame_size >> 2;
- fimc_src_buf.size[2] = src_frame_size >> 2;
- SEC_HWC_Log(HWC_LOG_DEBUG,
- "runFimcCore - Y_length=%d, U_length=%d, V_length=%d\n",
- fimc_src_buf.size[0], fimc_src_buf.size[1],fimc_src_buf.size[2]);
- src_planes = get_yuv_planes(src_color_space);
-
- break;
-#endif
if (src_img->usage & GRALLOC_USAGE_HW_FIMC1) {
fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
@@ -1432,108 +1102,20 @@ static int runcFimcCore(struct hwc_context_t *ctx,
fimc_src_buf.base[0], fimc_src_buf.base[1],fimc_src_buf.base[2]);
break;
}
-
- /* set source Y image */
- fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
- /* set source Cb,Cr images for 2 or 3 planes */
- src_bpp = get_yuv_bpp(src_color_space);
- src_planes = get_yuv_planes(src_color_space);
- if (2 == src_planes) { /* 2 planes */
- frame_size = params->src.full_width * params->src.full_height;
- params->src.buf_addr_phy_cb =
- params->src.buf_addr_phy_rgb_y + frame_size;
- /* CbCr */
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
- } else if (3 == src_planes) { /* 3 planes */
- frame_size = params->src.full_width * params->src.full_height;
- params->src.buf_addr_phy_cb =
- params->src.buf_addr_phy_rgb_y + frame_size;
- if (12 == src_bpp)
- params->src.buf_addr_phy_cr =
- params->src.buf_addr_phy_cb + (frame_size >> 2);
- else
- params->src.buf_addr_phy_cr =
- params->src.buf_addr_phy_cb + (frame_size >> 1);
- /* Cb, Cr */
- if (src_cbcr_order == true) {
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cr;
- }
- else {
- fimc_src_buf.base[2] = params->src.buf_addr_phy_cb;
- fimc_src_buf.base[1] = params->src.buf_addr_phy_cr;
- }
- }
- break;
}
/* 6. Run FIMC
* - stream on => queue => dequeue => stream off => clear buf
*/
-#ifdef BOARD_USE_V4L2_ION
- int ret = 0;
- params->src.planes = src_planes;
-
- if (fimc_v4l2_set_src(fimc->dev_fd, fimc->hw_ver, &params->src) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_src is failed\n");
- return -1;
- }
-
- fimc_src_buf.planes = src_planes;
- fimc_dst_buf.planes = dst_planes;
-
- ret = fimc_handle_oneshot(fimc->dev_fd, &fimc_src_buf, &fimc_dst_buf);
-
- if (ret < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR,"fimc_handle_oneshot = %d\n",ret);
- if (ret == -2) {
- fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
- } else if (ret == -3) {
- fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
- fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_CAPTURE);
- }
- return ret;
- }
-#else
if (fimc_handle_oneshot(fimc->dev_fd, &fimc_src_buf, NULL) < 0) {
+ ALOGE("fimcrun fail");
fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
return -1;
}
-#endif
return 0;
}
-#ifdef SUB_TITLES_HWC
-int createG2d(sec_g2d_t *g2d)
-{
- g2d->dev_fd = open(SEC_G2D_DEV_NAME, O_RDWR);
-
- if (g2d->dev_fd <= 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::G2d open error (%d)", __func__, errno);
- goto err;
- }
-
- return 0;
-err:
- if (0 < g2d->dev_fd)
- close(g2d->dev_fd);
- g2d->dev_fd =0;
-
- return -1;
-}
-
-int destroyG2d(sec_g2d_t *g2d)
-{
- // close
- if (0 < g2d->dev_fd)
- close(g2d->dev_fd);
- g2d->dev_fd = 0;
-
- return 0;
-}
-#endif
-
int createFimc(s5p_fimc_t *fimc)
{
struct v4l2_capability cap;
@@ -1575,8 +1157,6 @@ int createFimc(s5p_fimc_t *fimc)
goto err;
}
-#ifdef BOARD_USE_V4L2_ION
-#else
vc.id = V4L2_CID_FIMC_VERSION;
vc.value = 0;
@@ -1585,7 +1165,6 @@ int createFimc(s5p_fimc_t *fimc)
goto err;
}
fimc->hw_ver = vc.value;
-#endif
return 0;
@@ -1622,7 +1201,6 @@ int runFimc(struct hwc_context_t *ctx,
unsigned int src_phys_addr = 0;
unsigned int dst_phys_addr = 0;
int rotate_value = 0;
- int flag_force_memcpy = 0;
int32_t src_color_space;
int32_t dst_color_space;
@@ -1632,7 +1210,7 @@ int runFimc(struct hwc_context_t *ctx,
return -1;
/* 2. destination address and size */
- dst_phys_addr = get_dst_phys_addr(ctx, dst_img, dst_rect, &flag_force_memcpy);
+ dst_phys_addr = dst_img->base;
if (0 == dst_phys_addr)
return -2;
@@ -1645,433 +1223,38 @@ int runFimc(struct hwc_context_t *ctx,
return -4;
/* 4. FIMC: src_rect of src_img => dst_rect of dst_img */
- if (runcFimcCore(ctx, src_phys_addr, src_img, src_rect,
+ if (runFimcCore(ctx, src_phys_addr, src_img, src_rect,
(uint32_t)src_color_space, dst_phys_addr, dst_img, dst_rect,
(uint32_t)dst_color_space, transform) < 0)
return -5;
- if (flag_force_memcpy == 1) {
-#ifdef USE_HW_PMEM
- if (0 != ctx->sec_pmem.sec_pmem_alloc[1].size) {
- struct s3c_mem_dma_param s3c_mem_dma;
-
- s3c_mem_dma.src_addr =
- (unsigned long)(ctx->sec_pmem.sec_pmem_alloc[1].virt_addr);
- s3c_mem_dma.size = ctx->sec_pmem.sec_pmem_alloc[1].size;
-
- ioctl(ctx->s3c_mem.fd, S3C_MEM_CACHE_INVAL, &s3c_mem_dma);
-
- memcpy((void*)((unsigned int)dst_img->base),
- (void *)(ctx->sec_pmem.sec_pmem_alloc[1].virt_addr),
- ctx->sec_pmem.sec_pmem_alloc[1].size);
- } else
-#endif
- {
- struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[1];
- struct s3c_mem_dma_param s3c_mem_dma;
-
- s3c_mem_dma.src_addr = (unsigned long)ptr_mem_alloc->vir_addr;
- s3c_mem_dma.size = ptr_mem_alloc->size;
-
- ioctl(ctx->s3c_mem.fd, S3C_MEM_CACHE_INVAL, &s3c_mem_dma);
-
- memcpy((void*)((unsigned int)dst_img->base),
- (void *)ptr_mem_alloc->vir_addr, ptr_mem_alloc->size);
- }
- }
-
return 0;
}
-#ifdef SUB_TITLES_HWC
-static int get_g2d_src_phys_addr(struct hwc_context_t *ctx, g2d_rect *src_rect)
-{
- sec_g2d_t *g2d = &ctx->g2d;
- struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[0];
-#ifdef USE_HW_PMEM
- sec_pmem_alloc_t *pm_alloc = &ctx->sec_pmem.sec_pmem_alloc[0];
-#endif
-
- unsigned int src_virt_addr = 0;
- unsigned int src_phys_addr = 0;
- unsigned int src_frame_size = 0;
-
- struct pmem_region region;
-
- // error check routine
- if (0 == src_rect->virt_addr) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s invalid src address\n", __func__);
- return 0;
- }
-
- src_frame_size = FRAME_SIZE(src_rect->color_format,
- src_rect->full_w, src_rect->full_h);
- if (src_frame_size == 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::FRAME_SIZE fail", __func__);
- return 0;
- }
-
-#ifdef USE_HW_PMEM
- if (0 <= checkPmem(&ctx->sec_pmem, 0, src_frame_size)) {
- src_virt_addr = pm_alloc->virt_addr;
- src_phys_addr = pm_alloc->phys_addr;
- pm_alloc->size = src_frame_size;
- } else
-#endif
- if (0 <= checkMem(&ctx->s3c_mem, 0, src_frame_size)) {
- src_virt_addr = ptr_mem_alloc->vir_addr;
- src_phys_addr = ptr_mem_alloc->phy_addr;
- ptr_mem_alloc->size = src_frame_size;
- } else {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::check_mem fail", __func__);
- return 0;
- }
- memcpy((void *)src_virt_addr, (void*)((unsigned int)src_rect->virt_addr), src_frame_size);
-
- return src_phys_addr;
-}
-
-int get_HAL_2_G2D_FORMAT(int format)
-{
- switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_8888: return G2D_ABGR_8888;
- case HAL_PIXEL_FORMAT_RGBX_8888: return G2D_XBGR_8888;
- case HAL_PIXEL_FORMAT_BGRA_8888: return G2D_ARGB_8888;
- case HAL_PIXEL_FORMAT_RGB_888: return G2D_PACKED_BGR_888;
- case HAL_PIXEL_FORMAT_RGB_565: return G2D_RGB_565;
- case HAL_PIXEL_FORMAT_RGBA_5551: return G2D_RGBA_5551;
- case HAL_PIXEL_FORMAT_RGBA_4444: return G2D_RGBA_4444;
- default:
- return -1;
- }
-}
-
-static inline int rotateValueHAL2G2D(unsigned char transform)
-{
- int rotate_flag = transform & 0x7;
-
- switch (rotate_flag) {
- case HAL_TRANSFORM_ROT_90: return G2D_ROT_90;
- case HAL_TRANSFORM_ROT_180: return G2D_ROT_180;
- case HAL_TRANSFORM_ROT_270: return G2D_ROT_270;
+int check_yuv_format(unsigned int color_format) {
+ switch (color_format) {
+ case HAL_PIXEL_FORMAT_YV12:
+ case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+ case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+ case HAL_PIXEL_FORMAT_YCbCr_422_I:
+ case HAL_PIXEL_FORMAT_YCbCr_422_P:
+ case HAL_PIXEL_FORMAT_YCbCr_420_P:
+ case HAL_PIXEL_FORMAT_YCbCr_420_I:
+ case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+ case HAL_PIXEL_FORMAT_CbYCrY_420_I:
+ case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+ case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+ case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+ case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+ case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+ return 1;
default:
- return G2D_ROT_0;
- }
-}
-
-int runG2d(struct hwc_context_t *ctx, g2d_rect *src_rect, g2d_rect *dst_rect,
- uint32_t transform)
-{
- sec_g2d_t * g2d = &ctx->g2d;
- g2d_flag flag = {G2D_ROT_0, G2D_ALPHA_BLENDING_OPAQUE, 0, 0, 0, 0, 0, 0};
- int rotate_value = 0;
-
- // 1 : source address and size
- src_rect->phys_addr = get_g2d_src_phys_addr(ctx, src_rect);
- if (0 == src_rect->phys_addr)
- return -1;
-
- // 2 : destination address and size
- if (0 == dst_rect->phys_addr)
- return -2;
-
- // check whether g2d supports the src format
- src_rect->color_format = get_HAL_2_G2D_FORMAT(src_rect->color_format);
- if (0 > src_rect->color_format)
- return -3;
-
- dst_rect->color_format = get_HAL_2_G2D_FORMAT(dst_rect->color_format);
- if (0 > dst_rect->color_format)
- return -4;
-
- flag.rotate_val = rotateValueHAL2G2D(transform);
-
- // scale and rotate and alpha with FIMG
- if(stretchSecFimg(src_rect, dst_rect, &flag) < 0)
- return -5;
-
- return 0;
-}
-#endif
-
-int createMem(struct s3c_mem_t *mem, unsigned int index, unsigned int size)
-{
- struct s3c_mem_alloc *ptr_mem_alloc;
- struct s3c_mem_alloc mem_alloc_info;
-
- if (index >= NUM_OF_MEM_OBJ) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalid index (%d >= %d)",
- __func__, index, NUM_OF_MEM_OBJ);
- goto err;
- }
-
- ptr_mem_alloc = &mem->mem_alloc[index];
-
- if (mem->fd <= 0) {
- mem->fd = open(S3C_MEM_DEV_NAME, O_RDWR);
- if (mem->fd <= 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::open(%s) fail(%s)",
- __func__, S3C_MEM_DEV_NAME, strerror(errno));
- goto err;
- }
- }
-
- // kcoolsw : what the hell of this line??
- if (0 == size)
return 0;
-
- mem_alloc_info.size = size;
-
- if (ioctl(mem->fd, S3C_MEM_CACHEABLE_ALLOC, &mem_alloc_info) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_ALLOC(size : %d) fail",
- __func__, mem_alloc_info.size);
- goto err;
}
-
- ptr_mem_alloc->phy_addr = mem_alloc_info.phy_addr;
- ptr_mem_alloc->vir_addr = mem_alloc_info.vir_addr;
- ptr_mem_alloc->size = mem_alloc_info.size;
-
- return 0;
-
-err:
- if (0 < mem->fd)
- close(mem->fd);
- mem->fd = 0;
-
- return 0;
-}
-
-int destroyMem(struct s3c_mem_t *mem)
-{
- int i;
- struct s3c_mem_alloc *ptr_mem_alloc;
-
- if (mem->fd <= 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalied fd(%d) fail", __func__, mem->fd);
- return -1;
- }
-
- for (i = 0; i < NUM_OF_MEM_OBJ; i++) {
- ptr_mem_alloc = &mem->mem_alloc[i];
-
- if (0 != ptr_mem_alloc->vir_addr) {
- if (ioctl(mem->fd, S3C_MEM_FREE, ptr_mem_alloc) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_FREE fail", __func__);
- return -1;
- }
-
- ptr_mem_alloc->phy_addr = 0;
- ptr_mem_alloc->vir_addr = 0;
- ptr_mem_alloc->size = 0;
- }
- }
-
- close(mem->fd);
- mem->fd = 0;
-
- return 0;
-}
-
-int checkMem(struct s3c_mem_t *mem, unsigned int index, unsigned int size)
-{
- int ret;
- struct s3c_mem_alloc *ptr_mem_alloc;
- struct s3c_mem_alloc mem_alloc_info;
-
- if (index >= NUM_OF_MEM_OBJ) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalid index (%d >= %d)", __func__,
- index, NUM_OF_MEM_OBJ);
- return -1;
- }
-
- if (mem->fd <= 0) {
- ret = createMem(mem, index, size);
- return ret;
- }
-
- ptr_mem_alloc = &mem->mem_alloc[index];
-
- if (ptr_mem_alloc->size < (int)size) {
- if (0 < ptr_mem_alloc->size) {
- // free allocated mem
- if (ioctl(mem->fd, S3C_MEM_FREE, ptr_mem_alloc) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_FREE fail", __func__);
- return -1;
- }
- }
-
- // allocate mem with requested size
- mem_alloc_info.size = size;
- if (ioctl(mem->fd, S3C_MEM_CACHEABLE_ALLOC, &mem_alloc_info) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_ALLOC(size : %d) fail",
- __func__, mem_alloc_info.size);
- return -1;
- }
-
- ptr_mem_alloc->phy_addr = mem_alloc_info.phy_addr;
- ptr_mem_alloc->vir_addr = mem_alloc_info.vir_addr;
- ptr_mem_alloc->size = mem_alloc_info.size;
- }
-
- return 0;
}
-
-#ifdef USE_HW_PMEM
-int createPmem(sec_pmem_t *pm, unsigned int buf_size)
-{
- int master_fd, err = 0, i;
- void *base;
- unsigned int phys_base;
- size_t size, sub_size[NUM_OF_MEM_OBJ];
- struct pmem_region region;
-
- master_fd = open(PMEM_DEVICE_DEV_NAME, O_RDWR, 0);
- if (master_fd < 0) {
- pm->pmem_master_fd = -1;
- if (EACCES == errno) {
- return 0;
- } else {
- SEC_HWC_Log(HWC_LOG_ERROR, "%s::open(%s) fail(%s)",
- __func__, PMEM_DEVICE_DEV_NAME, strerror(errno));
- return -errno;
- }
- }
-
- if (ioctl(master_fd, PMEM_GET_TOTAL_SIZE, &region) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "PMEM_GET_TOTAL_SIZE failed, default mode");
- size = 8<<20; // 8 MiB
- } else {
- size = region.len;
- }
-
- base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, master_fd, 0);
- if (base == MAP_FAILED) {
- SEC_HWC_Log(HWC_LOG_ERROR, "[%s] mmap failed : %d (%s)", __func__,
- errno, strerror(errno));
- base = 0;
- close(master_fd);
- master_fd = -1;
- return -errno;
- }
-
- if (ioctl(master_fd, PMEM_GET_PHYS, &region) < 0) {
- SEC_HWC_Log(HWC_LOG_ERROR, "PMEM_GET_PHYS failed, limp mode");
- region.offset = 0;
- }
-
- pm->pmem_master_fd = master_fd;
- pm->pmem_master_base = base;
- pm->pmem_total_size = size;
- //pm->pmem_master_phys_base = region.offset;
- phys_base = region.offset;
-
- // sec_pmem_alloc[0] for temporary buffer for source
- sub_size[0] = buf_size;
- sub_size[0] = roundUpToPageSize(sub_size[0]);
-
- for (i = 0; i < NUM_OF_MEM_OBJ; i++) {
- sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[i]);
- int fd, ret;
- int offset = i ? sub_size[i-1] : 0;
- struct pmem_region sub = { offset, sub_size[i] };
-
- // create the "sub-heap"
- if (0 > (fd = open(PMEM_DEVICE_DEV_NAME, O_RDWR, 0))) {
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] open failed (%dL) : %d (%s)",
- __func__, i, __LINE__, errno, strerror(errno));
- return -errno;
- }
-
- // connect to it
- if (0 != (ret = ioctl(fd, PMEM_CONNECT, pm->pmem_master_fd))) {
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] ioctl(PMEM_CONNECT) failed : %d (%s)",
- __func__, i, errno, strerror(errno));
- close(fd);
- return -errno;
- }
-
- // make it available to the client process
- if (0 != (ret = ioctl(fd, PMEM_MAP, &sub))) {
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] ioctl(PMEM_MAP) failed : %d (%s)",
- __func__, i, errno, strerror(errno));
- close(fd);
- return -errno;
- }
-
- pm_alloc->fd = fd;
- pm_alloc->total_size = sub_size[i];
- pm_alloc->offset = offset;
- pm_alloc->virt_addr = (unsigned int)base + (unsigned int)offset;
- pm_alloc->phys_addr = (unsigned int)phys_base + (unsigned int)offset;
-
-#if defined (PMEM_DEBUG)
- SEC_HWC_Log(HWC_LOG_DEBUG, "[%s] pm_alloc[%d] fd=%d total_size=%d "
- "offset=0x%x virt_addr=0x%x phys_addr=0x%x",
- __func__, i, pm_alloc->fd, pm_alloc->total_size,
- pm_alloc->offset, pm_alloc->virt_addr, pm_alloc->phys_addr);
-#endif
- }
-
- return err;
-}
-
-int destroyPmem(sec_pmem_t *pm)
-{
- int i, err;
-
- for (i=0; i<NUM_OF_MEM_OBJ; i++) {
- sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[i]);
-
- if (0 <= pm_alloc->fd) {
- struct pmem_region sub = { pm_alloc->offset, pm_alloc->total_size };
-
- if (0 > (err = ioctl(pm_alloc->fd, PMEM_UNMAP, &sub)))
- SEC_HWC_Log(HWC_LOG_ERROR,
- "[%s][index=%d] ioctl(PMEM_UNMAP) failed : %d (%s)",
- __func__, i, errno, strerror(errno));
-#if defined (PMEM_DEBUG)
- else
- SEC_HWC_Log(HWC_LOG_DEBUG,
- "[%s] pm_alloc[%d] unmap fd=%d total_size=%d offset=0x%x",
- __func__, i, pm_alloc->fd, pm_alloc->total_size,
- pm_alloc->offset);
-#endif
- close(pm_alloc->fd);
-
- pm_alloc->fd = -1;
- pm_alloc->total_size = 0;
- pm_alloc->offset = 0;
- pm_alloc->virt_addr = 0;
- pm_alloc->phys_addr = 0;
- }
- }
-
- if (0 <= pm->pmem_master_fd) {
- munmap(pm->pmem_master_base, pm->pmem_total_size);
- close(pm->pmem_master_fd);
- pm->pmem_master_fd = -1;
- }
-
- pm->pmem_master_base = 0;
- pm->pmem_total_size = 0;
-
- return 0;
-}
-
-int checkPmem(sec_pmem_t *pm, unsigned int index, unsigned int requested_size)
-{
- sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[index]);
-
- if (0 < pm_alloc->virt_addr &&
- requested_size <= (unsigned int)(pm_alloc->total_size))
- return 0;
-
- pm_alloc->size = 0;
- return -1;
-}
-
-#endif