static void tegra_overlay_flip_worker(struct work_struct *work) { struct tegra_overlay_flip_data *data = container_of(work, struct tegra_overlay_flip_data, work); struct tegra_overlay_info *overlay = data->overlay; struct tegra_dc_win *win; struct tegra_dc_win *wins[TEGRA_FB_FLIP_N_WINDOWS]; struct nvmap_handle_ref *unpin_handles[TEGRA_FB_FLIP_N_WINDOWS]; int i, nr_win = 0, nr_unpin = 0; data = container_of(work, struct tegra_overlay_flip_data, work); for (i = 0; i < TEGRA_FB_FLIP_N_WINDOWS; i++) { struct tegra_overlay_flip_win *flip_win = &data->win[i]; int idx = flip_win->attr.index; if (idx == -1) continue; win = tegra_dc_get_window(overlay->dc, idx); if (!win) continue; if (win->flags && win->cur_handle) unpin_handles[nr_unpin++] = win->cur_handle; tegra_overlay_set_windowattr(overlay, win, &data->win[i]); wins[nr_win++] = win; #if 0 if (flip_win->attr.pre_syncpt_id < 0) continue; printk("%08x %08x\n", flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val); nvhost_syncpt_wait_timeout(&overlay->ndev->host->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500)); #endif } tegra_dc_update_windows(wins, nr_win); /* TODO: implement swapinterval here */ tegra_dc_sync_windows(wins, nr_win); tegra_dc_incr_syncpt_min(overlay->dc, data->syncpt_max); /* unpin and deref previous front buffers */ for (i = 0; i < nr_unpin; i++) { nvmap_unpin(overlay->overlay_nvmap, unpin_handles[i]); nvmap_free(overlay->overlay_nvmap, unpin_handles[i]); } kfree(data); }
int nvhost_syncpt_wait_timeout_ext(struct platform_device *dev, u32 id, u32 thresh, u32 timeout, u32 *value, struct timespec *ts) { struct nvhost_master *master = nvhost_get_host(dev); struct nvhost_syncpt *sp = &master->syncpt; return nvhost_syncpt_wait_timeout(sp, id, thresh, timeout, value, ts, false); }
static int tegra_overlay_set_windowattr(struct tegra_overlay_info *overlay, struct tegra_dc_win *win, const struct tegra_overlay_flip_win *flip_win) { int xres, yres; if (flip_win->handle == NULL) { win->flags = 0; win->cur_handle = NULL; return 0; } xres = overlay->dc->mode.h_active; yres = overlay->dc->mode.v_active; win->flags = TEGRA_WIN_FLAG_ENABLED; if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_PREMULT) win->flags |= TEGRA_WIN_FLAG_BLEND_PREMULT; else if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_COVERAGE) win->flags |= TEGRA_WIN_FLAG_BLEND_COVERAGE; win->fmt = flip_win->attr.pixformat; win->x = flip_win->attr.x; win->y = flip_win->attr.y; win->w = flip_win->attr.w; win->h = flip_win->attr.h; win->out_x = flip_win->attr.out_x; win->out_y = flip_win->attr.out_y; win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; if (((win->out_x + win->out_w) > xres) && (win->out_x < xres)) win->out_w = xres - win->out_x; if (((win->out_y + win->out_h) > yres) && (win->out_y < yres)) win->out_h = yres - win->out_y; win->z = flip_win->attr.z; win->cur_handle = flip_win->handle; /* STOPSHIP verify that this won't read outside of the surface */ win->phys_addr = flip_win->phys_addr + flip_win->attr.offset; win->offset_u = flip_win->attr.offset_u + flip_win->attr.offset; win->offset_v = flip_win->attr.offset_v + flip_win->attr.offset; win->stride = flip_win->attr.stride; win->stride_uv = flip_win->attr.stride_uv; if (flip_win->attr.tiled) win->flags |= TEGRA_WIN_FLAG_TILED; if ((s32)flip_win->attr.pre_syncpt_id >= 0) { nvhost_syncpt_wait_timeout(&overlay->ndev->host->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500)); } return 0; }
static int tegra_dc_ext_set_windowattr(struct tegra_dc_ext *ext, struct tegra_dc_win *win, const struct tegra_dc_ext_flip_win *flip_win) { struct tegra_dc_ext_win *ext_win = &ext->win[win->idx]; if (flip_win->handle[TEGRA_DC_Y] == NULL) { win->flags = 0; memset(ext_win->cur_handle, 0, sizeof(ext_win->cur_handle)); return 0; } win->flags = TEGRA_WIN_FLAG_ENABLED; if (flip_win->attr.blend == TEGRA_DC_EXT_BLEND_PREMULT) win->flags |= TEGRA_WIN_FLAG_BLEND_PREMULT; else if (flip_win->attr.blend == TEGRA_DC_EXT_BLEND_COVERAGE) win->flags |= TEGRA_WIN_FLAG_BLEND_COVERAGE; win->fmt = flip_win->attr.pixformat; win->x.full = flip_win->attr.x; win->y.full = flip_win->attr.y; win->w.full = flip_win->attr.w; win->h.full = flip_win->attr.h; /* XXX verify that this doesn't go outside display's active region */ win->out_x = flip_win->attr.out_x; win->out_y = flip_win->attr.out_y; win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; win->z = flip_win->attr.z; memcpy(ext_win->cur_handle, flip_win->handle, sizeof(ext_win->cur_handle)); /* XXX verify that this won't read outside of the surface */ win->phys_addr = flip_win->phys_addr + flip_win->attr.offset; win->phys_addr_u = flip_win->handle[TEGRA_DC_U] ? flip_win->phys_addr_u : flip_win->phys_addr; win->phys_addr_u += flip_win->attr.offset_u; win->phys_addr_v = flip_win->handle[TEGRA_DC_V] ? flip_win->phys_addr_v : flip_win->phys_addr; win->phys_addr_v += flip_win->attr.offset_v; win->stride = flip_win->attr.stride; win->stride_uv = flip_win->attr.stride_uv; if ((s32)flip_win->attr.pre_syncpt_id >= 0) { nvhost_syncpt_wait_timeout(&ext->dc->ndev->host->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500), NULL); } return 0; }
int nvhost_syncpt_wait_timeout_ext(struct platform_device *dev, u32 id, u32 thresh, u32 timeout, u32 *value) { struct platform_device *pdev; struct nvhost_syncpt *sp; BUG_ON(!nvhost_get_parent(dev)); /* get the parent */ pdev = to_platform_device(dev->dev.parent); sp = &(nvhost_get_host(pdev)->syncpt); return nvhost_syncpt_wait_timeout(sp, id, thresh, timeout, value); }
int nvhost_syncpt_wait_timeout_ext(struct platform_device *dev, u32 id, u32 thresh, u32 timeout, u32 *value, struct timespec *ts) { struct platform_device *pdev; struct nvhost_syncpt *sp; if (!nvhost_get_parent(dev)) { dev_err(&dev->dev, "Wait called with wrong dev\n"); return -EINVAL; } /* get the parent */ pdev = to_platform_device(dev->dev.parent); sp = &(nvhost_get_host(pdev)->syncpt); return nvhost_syncpt_wait_timeout(sp, id, thresh, timeout, value, ts); }
static int nvhost_ioctl_ctrl_syncpt_waitex( struct nvhost_ctrl_userctx *ctx, struct nvhost_ctrl_syncpt_waitex_args *args) { u32 timeout; if (args->id >= ctx->dev->syncpt.nb_pts) return -EINVAL; if (args->timeout == NVHOST_NO_TIMEOUT) timeout = MAX_SCHEDULE_TIMEOUT; else timeout = (u32)msecs_to_jiffies(args->timeout); trace_nvhost_ioctl_ctrl_syncpt_wait(args->id, args->thresh, args->timeout); return nvhost_syncpt_wait_timeout(&ctx->dev->syncpt, args->id, args->thresh, timeout, &args->value); }
int nvhost_syncpt_wait_timeout_ext(struct nvhost_device *dev, u32 id, u32 thresh, u32 timeout, u32 *value) { struct nvhost_syncpt *sp = &(nvhost_get_host(dev)->syncpt); return nvhost_syncpt_wait_timeout(sp, id, thresh, timeout, value); }
static int tegra_dc_ext_set_windowattr(struct tegra_dc_ext *ext, struct tegra_dc_win *win, const struct tegra_dc_ext_flip_win *flip_win) { int err = 0; struct tegra_dc_ext_win *ext_win = &ext->win[win->idx]; if (flip_win->handle[TEGRA_DC_Y] == NULL) { win->flags = 0; memset(ext_win->cur_handle, 0, sizeof(ext_win->cur_handle)); return 0; } win->flags = TEGRA_WIN_FLAG_ENABLED; if (flip_win->attr.blend == TEGRA_DC_EXT_BLEND_PREMULT) win->flags |= TEGRA_WIN_FLAG_BLEND_PREMULT; else if (flip_win->attr.blend == TEGRA_DC_EXT_BLEND_COVERAGE) win->flags |= TEGRA_WIN_FLAG_BLEND_COVERAGE; if (flip_win->attr.flags & TEGRA_DC_EXT_FLIP_FLAG_TILED) win->flags |= TEGRA_WIN_FLAG_TILED; if (flip_win->attr.flags & TEGRA_DC_EXT_FLIP_FLAG_INVERT_H) win->flags |= TEGRA_WIN_FLAG_INVERT_H; if (flip_win->attr.flags & TEGRA_DC_EXT_FLIP_FLAG_INVERT_V) win->flags |= TEGRA_WIN_FLAG_INVERT_V; if (flip_win->attr.flags & TEGRA_DC_EXT_FLIP_FLAG_GLOBAL_ALPHA) win->global_alpha = flip_win->attr.global_alpha; else win->global_alpha = 255; win->fmt = flip_win->attr.pixformat; win->x.full = flip_win->attr.x; win->y.full = flip_win->attr.y; win->w.full = flip_win->attr.w; win->h.full = flip_win->attr.h; /* XXX verify that this doesn't go outside display's active region */ win->out_x = flip_win->attr.out_x; win->out_y = flip_win->attr.out_y; win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; win->z = flip_win->attr.z; memcpy(ext_win->cur_handle, flip_win->handle, sizeof(ext_win->cur_handle)); /* XXX verify that this won't read outside of the surface */ win->phys_addr = flip_win->phys_addr + flip_win->attr.offset; win->phys_addr_u = flip_win->handle[TEGRA_DC_U] ? flip_win->phys_addr_u : flip_win->phys_addr; win->phys_addr_u += flip_win->attr.offset_u; win->phys_addr_v = flip_win->handle[TEGRA_DC_V] ? flip_win->phys_addr_v : flip_win->phys_addr; win->phys_addr_v += flip_win->attr.offset_v; win->stride = flip_win->attr.stride; win->stride_uv = flip_win->attr.stride_uv; err = tegra_dc_ext_check_windowattr(ext, win); if (err < 0) dev_err(&ext->dc->ndev->dev, "Window atrributes are invalid.\n"); if ((s32)flip_win->attr.pre_syncpt_id >= 0) { nvhost_syncpt_wait_timeout( &nvhost_get_host(ext->dc->ndev)->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500), NULL); } return 0; }
static int tegra_overlay_set_windowattr(struct tegra_overlay_info *overlay, struct tegra_dc_win *win, const struct tegra_overlay_flip_win *flip_win) { int xres, yres; if (flip_win->handle == NULL) { win->flags = 0; win->cur_handle = NULL; return 0; } xres = overlay->dc->mode.h_active; yres = overlay->dc->mode.v_active; win->flags = TEGRA_WIN_FLAG_ENABLED; if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_PREMULT) win->flags |= TEGRA_WIN_FLAG_BLEND_PREMULT; else if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_COVERAGE) win->flags |= TEGRA_WIN_FLAG_BLEND_COVERAGE; win->fmt = flip_win->attr.pixformat; win->x = flip_win->attr.x; win->y = flip_win->attr.y; win->w = flip_win->attr.w; win->h = flip_win->attr.h; win->out_x = flip_win->attr.out_x; win->out_y = flip_win->attr.out_y; win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; WARN_ONCE(win->out_x >= xres, "%s:application window x offset(%d) exceeds display width(%d)\n", dev_name(&win->dc->ndev->dev), win->out_x, xres); WARN_ONCE(win->out_y >= yres, "%s:application window y offset(%d) exceeds display height(%d)\n", dev_name(&win->dc->ndev->dev), win->out_y, yres); WARN_ONCE(win->out_x + win->out_w > xres && win->out_x < xres, "%s:application window width(%d) exceeds display width(%d)\n", dev_name(&win->dc->ndev->dev), win->out_x + win->out_w, xres); WARN_ONCE(win->out_y + win->out_h > yres && win->out_y < yres, "%s:application window height(%d) exceeds display height(%d)\n", dev_name(&win->dc->ndev->dev), win->out_y + win->out_h, yres); if (((win->out_x + win->out_w) > xres) && (win->out_x < xres)) { long new_w = xres - win->out_x; win->w = win->w * new_w / win->out_w; win->out_w = new_w; } if (((win->out_y + win->out_h) > yres) && (win->out_y < yres)) { long new_h = yres - win->out_y; win->h = win->h * new_h / win->out_h; win->out_h = new_h; } #if 0 if ((((win->out_x + win->out_w) > xres) && (win->out_x < xres)) || (((win->out_y + win->out_h) > yres) && (win->out_y < yres))) { pr_warning("outside of FB: " "FB=(%d,%d,%d,%d) " "src=(%d,%d,%d,%d) " "dst=(%d,%d,%d,%d)", 0, 0, xres, yres, win->x, win->y, win->w, win->h, win->out_x, win->out_y, win->out_w, win->out_h); } /* crop the area out of the fb's width/height. src's rect needs to be cropped to avoid un-wanted stretching cause of the dst crop. The following code works only if src size is same as dst */ if (((win->out_x + win->out_w) > xres) && (win->out_x < xres)) { win->out_w = win->w = xres - win->out_x; } if (((win->out_y + win->out_h) > yres) && (win->out_y < yres)) { win->out_h = win->h = yres - win->out_y; } /* hopefully this catches stretching blit */ WARN_ON(win->h == win->out_h && win->w == win->out_h); #endif win->z = flip_win->attr.z; win->cur_handle = flip_win->handle; /* STOPSHIP verify that this won't read outside of the surface */ win->phys_addr = flip_win->phys_addr + flip_win->attr.offset; win->offset_u = flip_win->attr.offset_u + flip_win->attr.offset; win->offset_v = flip_win->attr.offset_v + flip_win->attr.offset; win->stride = flip_win->attr.stride; win->stride_uv = flip_win->attr.stride_uv; if (flip_win->attr.tiled) win->flags |= TEGRA_WIN_FLAG_TILED; if ((s32)flip_win->attr.pre_syncpt_id >= 0) { nvhost_syncpt_wait_timeout(&overlay->ndev->host->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500), NULL); } /* Store the blend state incase we need to reorder later */ overlay->blend.z[win->idx] = win->z; overlay->blend.flags[win->idx] = win->flags & TEGRA_WIN_BLEND_FLAGS_MASK; return 0; }
static void tegra_overlay_flip_worker(struct work_struct *work) { struct tegra_overlay_flip_data *data = container_of(work, struct tegra_overlay_flip_data, work); struct tegra_overlay_info *overlay = data->overlay; struct tegra_dc_win *win; struct tegra_dc_win *wins[TEGRA_FB_FLIP_N_WINDOWS]; struct nvmap_handle_ref *unpin_handles[TEGRA_FB_FLIP_N_WINDOWS]; int i, nr_win = 0, nr_unpin = 0; data = container_of(work, struct tegra_overlay_flip_data, work); for (i = 0; i < TEGRA_FB_FLIP_N_WINDOWS; i++) { struct tegra_overlay_flip_win *flip_win = &data->win[i]; int idx = flip_win->attr.index; if (idx == -1) continue; win = tegra_dc_get_window(overlay->dc, idx); if (!win) continue; if (win->flags && win->cur_handle && !data->didim_work) unpin_handles[nr_unpin++] = win->cur_handle; tegra_overlay_set_windowattr(overlay, win, &data->win[i]); wins[nr_win++] = win; #if 0 if (flip_win->attr.pre_syncpt_id < 0) continue; printk("%08x %08x\n", flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val); nvhost_syncpt_wait_timeout(&nvhost_get_host(overlay->ndev)->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500)); #endif } if (data->flags & TEGRA_OVERLAY_FLIP_FLAG_BLEND_REORDER) { struct tegra_dc_win *dcwins[DC_N_WINDOWS]; for (i = 0; i < DC_N_WINDOWS; i++) dcwins[i] = tegra_dc_get_window(overlay->dc, i); tegra_overlay_blend_reorder(&overlay->blend, dcwins); tegra_dc_update_windows(dcwins, DC_N_WINDOWS); tegra_dc_sync_windows(dcwins, DC_N_WINDOWS); } else { tegra_dc_update_windows(wins, nr_win); /* TODO: implement swapinterval here */ tegra_dc_sync_windows(wins, nr_win); } if ((overlay->dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE) && (overlay->dc->out->flags & TEGRA_DC_OUT_N_SHOT_MODE)) { tegra_overlay_n_shot(data, unpin_handles, &nr_unpin); } else { tegra_dc_incr_syncpt_min(overlay->dc, 0, data->syncpt_max); /* unpin and deref previous front buffers */ for (i = 0; i < nr_unpin; i++) { nvmap_unpin(overlay->overlay_nvmap, unpin_handles[i]); nvmap_free(overlay->overlay_nvmap, unpin_handles[i]); } kfree(data); } }
static int tegra_overlay_set_windowattr(struct tegra_overlay_info *overlay, struct tegra_dc_win *win, const struct tegra_overlay_flip_win *flip_win) { int xres, yres; if (flip_win->handle == NULL) { win->flags = 0; win->cur_handle = NULL; return 0; } xres = overlay->dc->mode.h_active; yres = overlay->dc->mode.v_active; win->flags = TEGRA_WIN_FLAG_ENABLED; if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_PREMULT) win->flags |= TEGRA_WIN_FLAG_BLEND_PREMULT; else if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_COVERAGE) win->flags |= TEGRA_WIN_FLAG_BLEND_COVERAGE; if (flip_win->attr.flags & TEGRA_FB_WIN_FLAG_INVERT_H) win->flags |= TEGRA_WIN_FLAG_INVERT_H; if (flip_win->attr.flags & TEGRA_FB_WIN_FLAG_INVERT_V) win->flags |= TEGRA_WIN_FLAG_INVERT_V; if (flip_win->attr.flags & TEGRA_FB_WIN_FLAG_TILED) win->flags |= TEGRA_WIN_FLAG_TILED; win->fmt = flip_win->attr.pixformat; win->x.full = dfixed_const(flip_win->attr.x); win->y.full = dfixed_const(flip_win->attr.y); win->w.full = dfixed_const(flip_win->attr.w); win->h.full = dfixed_const(flip_win->attr.h); win->out_x = flip_win->attr.out_x; win->out_y = flip_win->attr.out_y; win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; WARN_ONCE(win->out_x >= xres, "%s:application window x offset(%d) exceeds display width(%d)\n", dev_name(&win->dc->ndev->dev), win->out_x, xres); WARN_ONCE(win->out_y >= yres, "%s:application window y offset(%d) exceeds display height(%d)\n", dev_name(&win->dc->ndev->dev), win->out_y, yres); WARN_ONCE(win->out_x + win->out_w > xres && win->out_x < xres, "%s:application window width(%d) exceeds display width(%d)\n", dev_name(&win->dc->ndev->dev), win->out_x + win->out_w, xres); WARN_ONCE(win->out_y + win->out_h > yres && win->out_y < yres, "%s:application window height(%d) exceeds display height(%d)\n", dev_name(&win->dc->ndev->dev), win->out_y + win->out_h, yres); if (((win->out_x + win->out_w) > xres) && (win->out_x < xres)) { long new_w = xres - win->out_x; u64 in_w = win->w.full * new_w; do_div(in_w, win->out_w); win->w.full = lower_32_bits(in_w); win->out_w = new_w; } if (((win->out_y + win->out_h) > yres) && (win->out_y < yres)) { long new_h = yres - win->out_y; u64 in_h = win->h.full * new_h; do_div(in_h, win->out_h); win->h.full = lower_32_bits(in_h); win->out_h = new_h; } win->z = flip_win->attr.z; win->cur_handle = flip_win->handle; /* STOPSHIP verify that this won't read outside of the surface */ win->phys_addr = flip_win->phys_addr + flip_win->attr.offset; win->phys_addr_u = flip_win->phys_addr + flip_win->attr.offset_u; win->phys_addr_v = flip_win->phys_addr + flip_win->attr.offset_v; win->stride = flip_win->attr.stride; win->stride_uv = flip_win->attr.stride_uv; if ((s32)flip_win->attr.pre_syncpt_id >= 0) { nvhost_syncpt_wait_timeout(&nvhost_get_host(overlay->ndev)->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500), NULL); } /* Store the blend state incase we need to reorder later */ overlay->blend.z[win->idx] = win->z; overlay->blend.flags[win->idx] = win->flags & TEGRA_WIN_BLEND_FLAGS_MASK; return 0; }
static int tegra_overlay_set_windowattr(struct tegra_overlay_info *overlay, struct tegra_dc_win *win, const struct tegra_overlay_flip_win *flip_win) { int xres, yres; if (flip_win->handle == NULL) { win->flags = 0; win->cur_handle = NULL; return 0; } xres = overlay->dc->mode.h_active; yres = overlay->dc->mode.v_active; win->flags = TEGRA_WIN_FLAG_ENABLED; if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_PREMULT) win->flags |= TEGRA_WIN_FLAG_BLEND_PREMULT; else if (flip_win->attr.blend == TEGRA_FB_WIN_BLEND_COVERAGE) win->flags |= TEGRA_WIN_FLAG_BLEND_COVERAGE; if (flip_win->attr.flags & TEGRA_FB_WIN_FLAG_INVERT_H) win->flags |= TEGRA_WIN_FLAG_INVERT_H; if (flip_win->attr.flags & TEGRA_FB_WIN_FLAG_INVERT_V) win->flags |= TEGRA_WIN_FLAG_INVERT_V; win->fmt = flip_win->attr.pixformat; win->x = flip_win->attr.x; win->y = flip_win->attr.y; win->w = flip_win->attr.w; win->h = flip_win->attr.h; win->out_x = flip_win->attr.out_x; win->out_y = flip_win->attr.out_y; win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; if ((((win->out_x + win->out_w) > xres) && (win->out_x < xres)) || (((win->out_y + win->out_h) > yres) && (win->out_y < yres))) { pr_info("outside of FB: " "FB=(%d,%d,%d,%d) " "src=(%d,%d,%d,%d) " "dst=(%d,%d,%d,%d)", 0, 0, xres, yres, win->x, win->y, win->w, win->h, win->out_x, win->out_y, win->out_w, win->out_h); } win->z = flip_win->attr.z; win->cur_handle = flip_win->handle; /* STOPSHIP verify that this won't read outside of the surface */ win->phys_addr = flip_win->phys_addr + flip_win->attr.offset; win->offset_u = flip_win->attr.offset_u + flip_win->attr.offset; win->offset_v = flip_win->attr.offset_v + flip_win->attr.offset; win->stride = flip_win->attr.stride; win->stride_uv = flip_win->attr.stride_uv; if (flip_win->attr.tiled) win->flags |= TEGRA_WIN_FLAG_TILED; if ((s32)flip_win->attr.pre_syncpt_id >= 0) { nvhost_syncpt_wait_timeout(&overlay->ndev->host->syncpt, flip_win->attr.pre_syncpt_id, flip_win->attr.pre_syncpt_val, msecs_to_jiffies(500)); } /* Store the blend state incase we need to reorder later */ overlay->blend.z[win->idx] = win->z; overlay->blend.flags[win->idx] = win->flags & TEGRA_WIN_BLEND_FLAGS_MASK; return 0; }