rk fb: add memsize check
authorhjc <hjc@rock-chips.com>
Mon, 9 Mar 2015 04:10:48 +0000 (12:10 +0800)
committerhjc <hjc@rock-chips.com>
Mon, 9 Mar 2015 06:54:05 +0000 (14:54 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index 0cd8e3036402a9fbd9f903affc4bc83d826274ba..1384b32299d661137aa4523e644edd1c03e9d1ec 100755 (executable)
@@ -1846,6 +1846,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
        u8 ppixel_a = 0, global_a = 0;
        ion_phys_addr_t phy_addr;
        int ret = 0;
+       int buff_len;
 
        reg_win_data->reg_area_data[0].smem_start = -1;
        reg_win_data->area_num = 0;
@@ -1887,6 +1888,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                                reg_win_data->reg_area_data[i].smem_start = phy_addr;
                                reg_win_data->area_buf_num++;
                                reg_win_data->reg_area_data[i].index_buf = 1;
+                               reg_win_data->reg_area_data[i].buff_len = len;
                        }
                }
        } else {
@@ -1991,6 +1993,26 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                                    xoffset * pixel_width / 8;
                        }
                }
+               if ((fb_data_fmt != YUV420) &&
+                   (fb_data_fmt != YUV420_NV21) &&
+                   (fb_data_fmt != YUV422) &&
+                    (fb_data_fmt != YUV444)) {
+                        buff_len = reg_win_data->reg_area_data[i].y_offset +
+                                reg_win_data->reg_area_data[i].xvir *
+                                reg_win_data->reg_area_data[i].yact *
+                                pixel_width / 8 -
+                                reg_win_data->reg_area_data[i].xoff*
+                                pixel_width / 8;
+                        if (buff_len > reg_win_data->reg_area_data[i].buff_len)
+                                pr_err("\n!!!!!!error: fmt=%d,xvir[%d]*"
+                                       "yact[%d]*bpp[%d]"
+                                       "=buff_len[0x%x]>>mmu len=0x%x\n",
+                                       fb_data_fmt,
+                                       reg_win_data->reg_area_data[i].xvir,
+                                       reg_win_data->reg_area_data[i].yact,
+                                       pixel_width, buff_len,
+                                       reg_win_data->reg_area_data[i].buff_len);
+               }
        }
 
        global_a = (win_par->g_alpha_val == 0) ? 0 : 1;
@@ -2060,6 +2082,23 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                                    uv_x_off * pixel_width / 8;
                        }
                }
+               buff_len = reg_win_data->reg_area_data[0].cbr_start +
+                       reg_win_data->reg_area_data[0].c_offset +
+                       reg_win_data->reg_area_data[0].xvir *
+                       reg_win_data->reg_area_data[0].yact *
+                       pixel_width / 16 -
+                       reg_win_data->reg_area_data[0].smem_start -
+                       reg_win_data->reg_area_data[0].xoff*
+                       pixel_width / 16 ;
+               if (buff_len > reg_win_data->reg_area_data[0].buff_len)
+                       pr_err("\n!!!!!!error: fmt=%d,xvir[%d]*"
+                              "yact[%d]*bpp[%d]"
+                              "=buff_len[0x%x]>>mmu len=0x%x\n",
+                              fb_data_fmt,
+                              reg_win_data->reg_area_data[0].xvir,
+                              reg_win_data->reg_area_data[0].yact,
+                              pixel_width, buff_len,
+                              reg_win_data->reg_area_data[0].buff_len);
        }
 
        /* record buffer information for rk_fb_disp_scale to prevent fence timeout
index 85d7b17f0346c206639bf9f70a8f163e3d789d11..c0bd7f19f21c02e7d2071274b75001ffc0ec9873 100644 (file)
@@ -523,6 +523,7 @@ struct rk_fb_reg_area_data {
        u32 c_offset;           /*cb cr offset--->LCDC_WINx_CBR_MSTx*/
        u32 y_vir_stride;
        u32 uv_vir_stride;
+       u32 buff_len;
        u16 xpos;               /*start point in panel  --->LCDC_WINx_DSP_ST*/
        u16 ypos;
        u16 xsize;              /* display window width/height  -->LCDC_WINx_DSP_INFO*/