#ifndef _SET_MODE_H
#define _SET_MODE_H
typedef struct {
uint32 post_code;
uint32 post;
uint32 extra_post_code;
uint32 extra_post;
uint32 ref;
uint32 feedback;
uint32 freq;
} pll_dividers;
typedef struct {
uint32 freq;
uint16 h_total;
uint16 h_sync_len;
uint16 h_genclk_delay;
uint16 h_setup_delay;
uint16 h_active_delay;
uint16 h_active_len;
uint16 v_total;
uint16 v_active_lines;
uint16 v_field_total;
uint16 v_fields;
uint16 f_total;
uint16 frame_size_adjust;
uint32 scale;
} tv_timing;
typedef struct {
uint16 y_accum_init;
uint16 uv_accum_init;
uint16 uv_inc;
uint16 h_inc;
uint32 tv_clocks_to_active;
uint16 f_restart;
uint16 v_restart;
uint16 h_restart;
bool mode888;
uint16 y_saw_tooth_slope;
uint16 y_saw_tooth_amp;
uint16 y_rise_accum_init;
uint16 y_fall_accum_init;
bool y_coeff_enable;
uint8 y_coeff_value;
pll_dividers tv_dividers;
pll_dividers crt_dividers;
tv_timing timing;
} impactv_params;
typedef struct {
uint32 crtc_h_total_disp;
uint32 crtc_h_sync_strt_wid;
uint32 crtc_v_total_disp;
uint32 crtc_v_sync_strt_wid;
uint32 crtc_pitch;
uint32 crtc_gen_cntl;
uint32 crtc_offset_cntl;
} crtc_regs;
typedef struct {
uint32 ppll_div_3;
uint32 ppll_ref_div;
uint32 htotal_cntl;
uint32 dot_clock_freq;
uint32 pll_output_freq;
int feedback_div;
int post_div;
} pll_regs;
typedef struct {
uint32 fp_gen_cntl;
uint32 fp_panel_cntl;
uint32 lvds_gen_cntl;
uint32 tmds_pll_cntl;
uint32 tmds_trans_cntl;
uint32 fp_h_sync_strt_wid;
uint32 fp_v_sync_strt_wid;
uint32 fp2_gen_cntl;
uint32 fp2_h_sync_strt_wid;
uint32 fp2_v_sync_strt_wid;
uint32 fp_horz_stretch;
uint32 fp_vert_stretch;
uint32 bios_4_scratch;
uint32 bios_5_scratch;
uint32 bios_6_scratch;
} fp_regs;
#define RADEON_TV_TIMING_SIZE 32
#define RADEON_TV_UPSAMP_COEFF_NUM (5*3)
typedef struct {
uint32 tv_ftotal;
uint32 tv_vscaler_cntl1;
uint32 tv_y_saw_tooth_cntl;
uint32 tv_y_fall_cntl;
uint32 tv_y_rise_cntl;
uint32 tv_vscaler_cntl2;
uint32 tv_hrestart;
uint32 tv_vrestart;
uint32 tv_frestart;
uint32 tv_tv_pll_cntl;
uint32 tv_crt_pll_cntl;
uint32 tv_clock_sel_cntl;
uint32 tv_clkout_cntl;
uint32 tv_htotal;
uint32 tv_hsize;
uint32 tv_hdisp;
uint32 tv_hstart;
uint32 tv_vtotal;
uint32 tv_vdisp;
uint32 tv_sync_size;
uint32 tv_timing_cntl;
uint32 tv_modulator_cntl1;
uint32 tv_modulator_cntl2;
uint32 tv_data_delay_a;
uint32 tv_data_delay_b;
uint32 tv_frame_lock_cntl;
uint32 tv_pll_cntl1;
uint32 tv_rgb_cntl;
uint32 tv_pre_dac_mux_cntl;
uint32 tv_master_cntl;
uint32 tv_dac_cntl;
uint32 tv_uv_adr;
uint32 tv_pll_fine_cntl;
uint32 tv_gain_limit_settings;
uint32 tv_linear_gain_settings;
uint32 tv_upsamp_and_gain_cntl;
uint32 tv_crc_cntl;
uint16 tv_hor_timing[RADEON_TV_TIMING_SIZE];
uint16 tv_vert_timing[RADEON_TV_TIMING_SIZE];
uint32 tv_upsample_filter_coeff[RADEON_TV_UPSAMP_COEFF_NUM];
} impactv_regs;
typedef struct {
uint32 dac_cntl2;
uint32 dac_cntl;
uint32 tv_master_cntl;
uint32 tv_dac_cntl;
bool skip_tv_dac;
uint32 disp_hw_debug;
uint32 disp_output_cntl;
uint32 disp_tv_out_cntl;
uint32 crtc_ext_cntl;
uint32 crtc2_gen_cntl;
uint32 vclk_ecp_cntl;
uint32 pixclks_cntl;
uint32 gpiopad_a;
uint32 fp_gen_cntl;
uint32 fp2_gen_cntl;
} routing_regs;
uint16 Radeon_GetHSyncFudge( crtc_info *crtc, int datatype );
void Radeon_CalcCRTCRegisters( accelerator_info *ai, crtc_info *crtc,
display_mode *mode, crtc_regs *values );
void Radeon_ProgramCRTCRegisters( accelerator_info *ai, int crtc_idx,
crtc_regs *values );
void Radeon_CalcCRTPLLDividers( const general_pll_info *general_pll, const display_mode *mode, pll_dividers *dividers );
void Radeon_CalcPLLRegisters( const display_mode *mode, const pll_dividers *dividers, pll_regs *values );
void Radeon_ProgramPLL( accelerator_info *ai, int crtc_idx, pll_regs *values );
void Radeon_CalcPLLDividers( const pll_info *pll, uint32 freq, uint fixed_post_div, pll_dividers *dividers );
void Radeon_MatchCRTPLL(
const pll_info *pll,
uint32 tv_v_total, uint32 tv_h_total, uint32 tv_frame_size_adjust, uint32 freq,
const display_mode *mode, uint32 max_v_tweak, uint32 max_h_tweak,
uint32 max_frame_rate_drift, uint32 fixed_post_div,
pll_dividers *dividers,
display_mode *tweaked_mode );
void Radeon_GetTVPLLConfiguration( const general_pll_info *general_pll, pll_info *pll,
bool internal_encoder );
void Radeon_GetTVCRTPLLConfiguration( const general_pll_info *general_pll, pll_info *pll,
bool internal_tv_encoder );
void Radeon_ReadRMXRegisters( accelerator_info *ai, fp_regs *values );
void Radeon_CalcRMXRegisters( fp_info *flatpanel, display_mode *mode, bool use_rmx, fp_regs *values );
void Radeon_ProgramRMXRegisters( accelerator_info *ai, fp_regs *values );
void Radeon_ReadFPRegisters( accelerator_info *ai, fp_regs *values );
void Radeon_CalcFPRegisters( accelerator_info *ai, crtc_info *crtc,
fp_info *fp_port, crtc_regs *crtc_values, fp_regs *values );
void Radeon_ProgramFPRegisters( accelerator_info *ai, crtc_info *crtc,
fp_info *fp_port, fp_regs *values );
void Radeon_ReadMonitorRoutingRegs(
accelerator_info *ai, routing_regs *values );
void Radeon_CalcMonitorRouting(
accelerator_info *ai, const impactv_params *tv_parameters, routing_regs *values );
void Radeon_ProgramMonitorRouting(
accelerator_info *ai, routing_regs *values );
void Radeon_SetupDefaultMonitorRouting(
accelerator_info *ai, int whished_num_heads, bool use_laptop_panel );
typedef void (*impactv_write_FIFO) (
accelerator_info *ai, uint16 addr, uint32 value );
typedef uint32 (*impactv_read_FIFO) (
accelerator_info *ai, uint16 addr );
void Radeon_CalcImpacTVParams(
const general_pll_info *general_pll, impactv_params *params,
tv_standard_e tv_format, bool internal_encoder,
const display_mode *mode, display_mode *tweaked_mode );
void Radeon_CalcImpacTVRegisters(
accelerator_info *ai, display_mode *mode,
impactv_params *params, impactv_regs *values, int crtc_idx,
bool internal_encoder, tv_standard_e tv_format, display_device_e display_device );
void Radeon_ImpacTVwriteHorTimingTable(
accelerator_info *ai, impactv_write_FIFO write, impactv_regs *values, bool internal_encoder );
void Radeon_ImpacTVwriteVertTimingTable(
accelerator_info *ai, impactv_write_FIFO write, impactv_regs *values );
void Radeon_TheatreProgramTVRegisters( accelerator_info *ai, impactv_regs *values );
void Radeon_TheatreReadTVRegisters( accelerator_info *ai, impactv_regs *values );
uint32 Radeon_TheatreReadFIFO( accelerator_info *ai, uint16 addr );
void Radeon_TheatreWriteFIFO( accelerator_info *ai, uint16 addr, uint32 value );
void Radeon_InternalTVOutProgramRegisters( accelerator_info *ai, impactv_regs *values );
void Radeon_InternalTVOutReadRegisters( accelerator_info *ai, impactv_regs *values );
#endif