/*! * This function is directly exported. When compiled without the init * module the function does nothing and returns 0. When the full init * module is included this function calls _init_set_param and returns * the result. * * @param driver_handle * @param id * @param value * * @return 0 */ int igd_set_param(igd_driver_h driver_handle, unsigned long id, unsigned long value) { igd_context_t *context = (igd_context_t *)driver_handle; EMGD_ASSERT(context, "Null Driver Handle", -IGD_ERROR_INVAL); OPT_MICRO_CALL(_init_set_param(context, id, value)); return 0; }
/*! * This function is directly exported. When compiled without the init * module the function calls the DD layer get_param function. When the * full init module is included this function calls _init_get_param to * first get the DI parameters then calls the DD layer. * * @param driver_handle * @param id * @param value * * @return get_param() */ int igd_get_param(igd_driver_h driver_handle, unsigned long id, unsigned long *value) { igd_context_t *context = (igd_context_t *)driver_handle; EMGD_ASSERT(context, "Null Driver Handle", -IGD_ERROR_INVAL); EMGD_ASSERT(value, "Null Value", -IGD_ERROR_INVAL); OPT_MICRO_CALL(_init_get_param(driver_handle, id, value)); return init_dispatch->get_param(context, id, value); }
/*! * Return either a pointer to the live mode list or a copy of the mode list * for the requested display. This will be the mode list for the master port * on the pipe. * * @note Currently (AS of 3.3 development) the mode list is * described as a igd_display_info_t. However IT IS NOT, this * pointer must be cast to a igd_timing_info_t to be used. After * 3.3 the igd_display_info_t will be altered to match the * igd_timing_info_t with the exception of the private pointers. * * @param driver_handle handle returned from a successful call to * igd_driver_init(). * @param dc Display configuration that will determine which port * controlls the pipe timings and thus, which set of timings to return. * @param mode_list The returned mode list. This data may be LIVE. If * a live list is returned, care should be taken to not free or alter * the data. * @param flags The flags will determine which display to query (primary * or secondary) and if the mode list returned should be the live list. * * @return 0 on success. * @return -IGD_INVAL if an error occured (memory allocation failed) */ int igd_query_mode_list(igd_driver_h driver_handle, unsigned long dc, igd_display_info_t **mode_list, unsigned long flags) { igd_context_t *context; unsigned short port_number; igd_display_port_t *port; EMGD_TRACE_ENTER; context = (igd_context_t *)driver_handle; *mode_list = NULL; /* given the DC and flags, which port number to check? */ port_number = (flags & IGD_QUERY_SECONDARY_MODES) ? DC_PORT_NUMBER(dc, 5) : DC_PORT_NUMBER(dc, 1); port = context->mod_dispatch.dsp_port_list[port_number]; if (port) { if (flags & IGD_QUERY_LIVE_MODES) { /* * FIXME: * timing_table is not an igd_dislay_info_t structure but * eventually it will be? */ *mode_list = (igd_display_info_t *)port->timing_table; } else { OPT_MICRO_CALL(full_mode_query(driver_handle, dc, mode_list, port)); } } if (*mode_list == NULL) { EMGD_DEBUG("No port on requested pipe"); return -IGD_ERROR_INVAL; } EMGD_TRACE_EXIT; return 0; }
/*! * This function is used to initialize any module/dsp * module specific structures or tables etc. * * @param context SS level igd_context. * * @return 0 on success. * @return -IGD_INVAL or -IGD_ERROR_NODEV on failure */ int mode_init(igd_context_t *context) { igd_dispatch_t *dispatch = &context->dispatch; inter_module_dispatch_t *md; EMGD_TRACE_ENTER; EMGD_DEBUG("Allocating a mode context..."); /* Clear the allocated memory for mode context */ OS_MEMSET((void *)mode_context, 0, sizeof(mode_context_t)); /* Set the pointer to igd level context */ mode_context->context = context; mode_context->first_alter = TRUE; mode_context->display_color = context->mod_dispatch.init_params->display_color; mode_context->ref_freq = context->mod_dispatch.init_params->ref_freq; mode_context->tuning_wa = context->mod_dispatch.init_params->tuning_wa; /* Get mode's dispatch table */ mode_context->dispatch = (mode_dispatch_t *) dispatch_acquire(context, mode_dispatch); if(!mode_context->dispatch) { EMGD_ERROR_EXIT("Unsupported Device"); return -IGD_ERROR_NODEV; } md = &context->mod_dispatch; /* Set the fw_info to 0 */ mode_context->fw_info = NULL; /* Hook up the IGD dispatch table entires for mode */ dispatch->get_EDID_block = igd_get_EDID_block; dispatch->power_display = igd_power_display; dispatch->query_mode_list = igd_query_mode_list; dispatch->alter_displays = igd_alter_displays; OPT_MICRO_CALL(full_mode_init(context, mode_context)); /* Hook up inter-module dispatch functions */ md->mode_get_gpio_sets = mode_context->dispatch->get_gpio_sets; md->mode_reset_plane_pipe_ports = mode_context->dispatch->reset_plane_pipe_ports; md->filter_modes = mode_context->dispatch->filter_modes; /* Hook up Core specific IGD dispatch table entries */ dispatch->set_palette_entries = mode_context->dispatch->full->set_palette_entries; dispatch->set_palette_entry = mode_context->dispatch->set_palette_entry; dispatch->get_palette_entry = mode_context->dispatch->get_palette_entry; dispatch->wait_vblank = mode_context->dispatch->wait_vblank; /* Initialize dsp module */ if (dsp_init(context)) { EMGD_ERROR("dsp_init() failed."); return -IGD_INVAL; } /* Initialze port interface (pi) module */ if (pi_init(context)) { EMGD_ERROR_EXIT("pi_init() failed."); if(md->dsp_shutdown) { md->dsp_shutdown(context); } return -IGD_ERROR_INVAL; } if (mode_context->dispatch->full && md->reg_get_mod_state) { /* Save mode state */ module_state_h *state = NULL; unsigned long *flags = NULL; md->reg_get_mod_state(REG_MODE_STATE, &state, &flags); md->mode_save(context, state, flags); } /* Initialize the Display Configuration List */ /* FIXME: This should be done in dsp init */ dsp_dc_init(context); EMGD_TRACE_EXIT; return 0; }