bool dce110_vblank_set( struct irq_service *irq_service, const struct irq_source_info *info, bool enable) { struct dc_context *dc_ctx = irq_service->ctx; struct dc *core_dc = irq_service->ctx->dc; enum dc_irq_source dal_irq_src = dc_interrupt_to_irq_source( irq_service->ctx->dc, info->src_id, info->ext_id); uint8_t pipe_offset = dal_irq_src - IRQ_TYPE_VBLANK; struct timing_generator *tg = core_dc->current_state->res_ctx.pipe_ctx[pipe_offset].stream_res.tg; if (enable) { if (!tg || !tg->funcs->arm_vert_intr(tg, 2)) { DC_ERROR("Failed to get VBLANK!\n"); return false; } } dal_irq_service_set_generic(irq_service, info, enable); return true; }
void dc_commit_updates_for_stream(struct dc *dc, struct dc_surface_update *srf_updates, int surface_count, struct dc_stream_state *stream, struct dc_stream_update *stream_update, struct dc_plane_state **plane_states, struct dc_state *state) { const struct dc_stream_status *stream_status; enum surface_update_type update_type; struct dc_state *context; struct dc_context *dc_ctx = dc->ctx; int i, j; stream_status = dc_stream_get_status(stream); context = dc->current_state; update_type = dc_check_update_surfaces_for_stream( dc, srf_updates, surface_count, stream_update, stream_status); if (update_type >= update_surface_trace_level) update_surface_trace(dc, srf_updates, surface_count); if (update_type >= UPDATE_TYPE_FULL) { /* initialize scratch memory for building context */ context = dc_create_state(); if (context == NULL) { DC_ERROR("Failed to allocate new validate context!\n"); return; } dc_resource_state_copy_construct(state, context); } for (i = 0; i < surface_count; i++) { struct dc_plane_state *surface = srf_updates[i].surface; /* TODO: On flip we don't build the state, so it still has the * old address. Which is why we are updating the address here */ if (srf_updates[i].flip_addr) { surface->address = srf_updates[i].flip_addr->address; surface->flip_immediate = srf_updates[i].flip_addr->flip_immediate; } if (update_type >= UPDATE_TYPE_MED) { for (j = 0; j < dc->res_pool->pipe_count; j++) { struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; if (pipe_ctx->plane_state != surface) continue; resource_build_scaling_params(pipe_ctx); } } } commit_planes_for_stream( dc, srf_updates, surface_count, stream, stream_update, update_type, context); if (update_type >= UPDATE_TYPE_FULL) dc_post_update_surfaces_to_stream(dc); if (dc->current_state != context) { struct dc_state *old = dc->current_state; dc->current_state = context; dc_release_state(old); } return; }