+
+ dentry = kern_path_create(AT_FDCWD, DUMP_BUF_PATH, &path,
+ LOOKUP_DIRECTORY);
+ if (!IS_ERR(dentry)) {
+ err = vfs_mkdir(path.dentry->d_inode, dentry, 700);
+ if (err)
+ dev_err(dev, "can't create %s err%d\n",
+ DUMP_BUF_PATH, err);
+ done_path_create(&path, dentry);
+ } else if (PTR_ERR(dentry) != -EEXIST) {
+ dev_err(dev, "can't create PATH %s err%d\n",
+ DUMP_BUF_PATH, err);
+ return PTR_ERR(dentry);
+ }
+
+ if (!num_frames) {
+ mutex_lock(&dev_drv->front_lock);
+
+ if (!dev_drv->front_regs) {
+ u16 xact, yact;
+ int data_format;
+ u32 dsp_addr;
+ int ymirror;
+
+ mutex_unlock(&dev_drv->front_lock);
+
+ if (dev_drv->ops->get_dspbuf_info)
+ dev_drv->ops->get_dspbuf_info(dev_drv, &xact,
+ &yact, &data_format, &dsp_addr,
+ &ymirror);
+
+ dump_win(NULL, NULL, dsp_addr, xact, yact, data_format,
+ 0, 0, 0, is_bmp, false);
+ goto out;
+ }
+ front_regs = kmalloc(sizeof(*front_regs), GFP_KERNEL);
+ if (!front_regs)
+ return -ENOMEM;
+ memcpy(front_regs, dev_drv->front_regs, sizeof(*front_regs));
+
+ for (i = 0; i < front_regs->win_num; i++) {
+ if (mask_win && !(mask_win & (1 << i)))
+ continue;
+ for (j = 0; j < RK_WIN_MAX_AREA; j++) {
+ if (mask_area && !(mask_area & (1 << j)))
+ continue;
+ win_data = &front_regs->reg_win_data[i];
+ area_data = &win_data->reg_area_data[j];
+ if (area_data->ion_handle)
+ ion_handle_get(area_data->ion_handle);
+ }
+ }
+
+ for (i = 0; i < front_regs->win_num; i++) {
+ if (mask_win && !(mask_win & (1 << i)))
+ continue;
+ for (j = 0; j < RK_WIN_MAX_AREA; j++) {
+ if (mask_area && !(mask_area & (1 << j)))
+ continue;
+
+ win_data = &front_regs->reg_win_data[i];
+ area_data = &win_data->reg_area_data[j];
+
+ dump_win(rk_fb->ion_client,
+ area_data->ion_handle,
+ area_data->smem_start,
+ area_data->xvir, area_data->yvir,
+ area_data->data_format,
+ trace->count_frame,
+ i, j, trace->is_bmp, trace->is_append);
+ if (area_data->ion_handle)
+ ion_handle_put(area_data->ion_handle);