34,11 → 34,12 |
#include <drm_mode.h> |
#include <drm_edid.h> |
#include <drm_dp_helper.h> |
#include <drm_fixed.h> |
#include <drm_crtc_helper.h> |
#include <linux/i2c.h> |
#include <linux/i2c-id.h> |
#include <linux/i2c-algo-bit.h> |
#include "radeon_fixed.h" |
|
struct radeon_bo; |
struct radeon_device; |
|
#define to_radeon_crtc(x) container_of(x, struct radeon_crtc, base) |
65,6 → 66,24 |
TV_STD_PAL_N, |
}; |
|
enum radeon_underscan_type { |
UNDERSCAN_OFF, |
UNDERSCAN_ON, |
UNDERSCAN_AUTO, |
}; |
|
enum radeon_hpd_id { |
RADEON_HPD_1 = 0, |
RADEON_HPD_2, |
RADEON_HPD_3, |
RADEON_HPD_4, |
RADEON_HPD_5, |
RADEON_HPD_6, |
RADEON_HPD_NONE = 0xff, |
}; |
|
#define RADEON_MAX_I2C_BUS 16 |
|
/* radeon gpio-based i2c |
* 1. "mask" reg and bits |
* grabs the gpio pins for software use |
84,7 → 103,7 |
/* id used by atom */ |
uint8_t i2c_id; |
/* id used by atom */ |
uint8_t hpd_id; |
enum radeon_hpd_id hpd; |
/* can be used with hw i2c engine */ |
bool hw_capable; |
/* uses multi-media i2c engine */ |
129,13 → 148,9 |
#define RADEON_PLL_USE_FRAC_FB_DIV (1 << 10) |
#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) |
#define RADEON_PLL_USE_POST_DIV (1 << 12) |
#define RADEON_PLL_IS_LCD (1 << 13) |
#define RADEON_PLL_PREFER_MINM_OVER_MAXP (1 << 14) |
|
/* pll algo */ |
enum radeon_pll_algo { |
PLL_ALGO_LEGACY, |
PLL_ALGO_NEW |
}; |
|
struct radeon_pll { |
/* reference frequency */ |
uint32_t reference_freq; |
149,6 → 164,8 |
uint32_t pll_in_max; |
uint32_t pll_out_min; |
uint32_t pll_out_max; |
uint32_t lcd_pll_out_min; |
uint32_t lcd_pll_out_max; |
uint32_t best_vco; |
|
/* divider limits */ |
166,21 → 183,14 |
|
/* pll id */ |
uint32_t id; |
/* pll algo */ |
enum radeon_pll_algo algo; |
}; |
|
struct i2c_algo_radeon_data { |
struct i2c_adapter bit_adapter; |
struct i2c_algo_bit_data bit_data; |
}; |
|
struct radeon_i2c_chan { |
struct i2c_adapter adapter; |
struct drm_device *dev; |
union { |
struct i2c_algo_bit_data bit; |
struct i2c_algo_dp_aux_data dp; |
struct i2c_algo_radeon_data radeon; |
} algo; |
struct radeon_i2c_bus_rec rec; |
}; |
187,7 → 197,7 |
|
/* mostly for macs, but really any system without connector tables */ |
enum radeon_connector_table { |
CT_NONE, |
CT_NONE = 0, |
CT_GENERIC, |
CT_IBOOK, |
CT_POWERBOOK_EXTERNAL, |
197,6 → 207,9 |
CT_MINI_INTERNAL, |
CT_IMAC_G5_ISIGHT, |
CT_EMAC, |
CT_RN50_POWER, |
CT_MAC_X800, |
CT_MAC_G5_9600, |
}; |
|
enum radeon_dvo_chip { |
204,6 → 217,8 |
DVO_SIL1178, |
}; |
|
struct radeon_fbdev; |
|
struct radeon_mode_info { |
struct atom_context *atom_context; |
struct card_info *atom_card_info; |
214,12 → 229,20 |
struct drm_property *coherent_mode_property; |
/* DAC enable load detect */ |
struct drm_property *load_detect_property; |
/* TV standard load detect */ |
/* TV standard */ |
struct drm_property *tv_std_property; |
/* legacy TMDS PLL detect */ |
struct drm_property *tmds_pll_property; |
/* underscan */ |
struct drm_property *underscan_property; |
struct drm_property *underscan_hborder_property; |
struct drm_property *underscan_vborder_property; |
/* hardcoded DFP edid from BIOS */ |
struct edid *bios_hardcoded_edid; |
int bios_hardcoded_edid_size; |
|
/* pointer to fbdev info structure */ |
struct radeon_fbdev *rfbdev; |
}; |
|
#define MAX_H_CODE_TIMING_LEN 32 |
251,6 → 274,8 |
uint32_t legacy_display_base_addr; |
uint32_t legacy_cursor_offset; |
enum radeon_rmx_type rmx_type; |
u8 h_border; |
u8 v_border; |
fixed20_12 vsc; |
fixed20_12 hsc; |
struct drm_display_mode native_mode; |
275,6 → 300,9 |
uint32_t lvds_gen_cntl; |
/* panel mode */ |
struct drm_display_mode native_mode; |
struct backlight_device *bl_dev; |
int dpms_mode; |
uint8_t backlight_level; |
}; |
|
struct radeon_encoder_tv_dac { |
308,23 → 336,29 |
struct radeon_atom_ss { |
uint16_t percentage; |
uint8_t type; |
uint8_t step; |
uint16_t step; |
uint8_t delay; |
uint8_t range; |
uint8_t refdiv; |
/* asic_ss */ |
uint16_t rate; |
uint16_t amount; |
}; |
|
struct radeon_encoder_atom_dig { |
bool linkb; |
/* atom dig */ |
bool coherent_mode; |
int dig_encoder; /* -1 disabled, 0 DIGA, 1 DIGB */ |
/* atom lvds */ |
uint32_t lvds_misc; |
int dig_encoder; /* -1 disabled, 0 DIGA, 1 DIGB, etc. */ |
/* atom lvds/edp */ |
uint32_t lcd_misc; |
uint16_t panel_pwr_delay; |
enum radeon_pll_algo pll_algo; |
struct radeon_atom_ss *ss; |
uint32_t lcd_ss_id; |
/* panel mode */ |
struct drm_display_mode native_mode; |
struct backlight_device *bl_dev; |
int dpms_mode; |
uint8_t backlight_level; |
}; |
|
struct radeon_encoder_atom_dac { |
333,6 → 367,7 |
|
struct radeon_encoder { |
struct drm_encoder base; |
uint32_t encoder_enum; |
uint32_t encoder_id; |
uint32_t devices; |
uint32_t active_device; |
339,16 → 374,22 |
uint32_t flags; |
uint32_t pixel_clock; |
enum radeon_rmx_type rmx_type; |
enum radeon_underscan_type underscan_type; |
uint32_t underscan_hborder; |
uint32_t underscan_vborder; |
struct drm_display_mode native_mode; |
void *enc_priv; |
int audio_polling_active; |
int hdmi_offset; |
int hdmi_config_offset; |
int hdmi_audio_workaround; |
int hdmi_buffer_status; |
bool is_ext_encoder; |
u16 caps; |
}; |
|
struct radeon_connector_atom_dig { |
uint32_t igp_lane_info; |
bool linkb; |
/* displayport */ |
struct radeon_i2c_chan *dp_i2c_bus; |
u8 dpcd[8]; |
355,6 → 396,7 |
u8 dp_sink_type; |
int dp_clock; |
int dp_lane_count; |
bool edp_on; |
}; |
|
struct radeon_gpio_rec { |
364,16 → 406,6 |
u32 mask; |
}; |
|
enum radeon_hpd_id { |
RADEON_HPD_NONE = 0, |
RADEON_HPD_1, |
RADEON_HPD_2, |
RADEON_HPD_3, |
RADEON_HPD_4, |
RADEON_HPD_5, |
RADEON_HPD_6, |
}; |
|
struct radeon_hpd { |
enum radeon_hpd_id hpd; |
u8 plugged_state; |
380,12 → 412,28 |
struct radeon_gpio_rec gpio; |
}; |
|
struct radeon_router { |
u32 router_id; |
struct radeon_i2c_bus_rec i2c_info; |
u8 i2c_addr; |
/* i2c mux */ |
bool ddc_valid; |
u8 ddc_mux_type; |
u8 ddc_mux_control_pin; |
u8 ddc_mux_state; |
/* clock/data mux */ |
bool cd_valid; |
u8 cd_mux_type; |
u8 cd_mux_control_pin; |
u8 cd_mux_state; |
}; |
|
struct radeon_connector { |
struct drm_connector base; |
uint32_t connector_id; |
uint32_t devices; |
struct radeon_i2c_chan *ddc_bus; |
/* some systems have a an hdmi and vga port with a shared ddc line */ |
/* some systems have an hdmi and vga port with a shared ddc line */ |
bool shared_ddc; |
bool use_digital; |
/* we need to mind the EDID between detect |
395,6 → 443,8 |
bool dac_load_detect; |
uint16_t connector_object_id; |
struct radeon_hpd hpd; |
struct radeon_router router; |
struct radeon_i2c_chan *router_bus; |
}; |
|
struct radeon_framebuffer { |
402,28 → 452,46 |
struct drm_gem_object *obj; |
}; |
|
|
extern enum radeon_tv_std |
radeon_combios_get_tv_info(struct radeon_device *rdev); |
extern enum radeon_tv_std |
radeon_atombios_get_tv_info(struct radeon_device *rdev); |
|
extern struct drm_connector * |
radeon_get_connector_for_encoder(struct drm_encoder *encoder); |
|
extern bool radeon_encoder_is_dp_bridge(struct drm_encoder *encoder); |
extern bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector); |
extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector); |
extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); |
|
extern void radeon_connector_hotplug(struct drm_connector *connector); |
extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); |
extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector, |
extern int radeon_dp_mode_valid_helper(struct drm_connector *connector, |
struct drm_display_mode *mode); |
extern void radeon_dp_set_link_config(struct drm_connector *connector, |
struct drm_display_mode *mode); |
extern void dp_link_train(struct drm_encoder *encoder, |
extern void radeon_dp_link_train(struct drm_encoder *encoder, |
struct drm_connector *connector); |
extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); |
extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); |
extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action); |
extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); |
extern void radeon_atom_encoder_init(struct radeon_device *rdev); |
extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder, |
int action, uint8_t lane_num, |
uint8_t lane_set); |
extern int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, |
uint8_t write_byte, uint8_t *read_byte); |
u8 write_byte, u8 *read_byte); |
|
extern void radeon_i2c_init(struct radeon_device *rdev); |
extern void radeon_i2c_fini(struct radeon_device *rdev); |
extern void radeon_combios_i2c_init(struct radeon_device *rdev); |
extern void radeon_atombios_i2c_init(struct radeon_device *rdev); |
extern void radeon_i2c_add(struct radeon_device *rdev, |
struct radeon_i2c_bus_rec *rec, |
const char *name); |
extern struct radeon_i2c_chan *radeon_i2c_lookup(struct radeon_device *rdev, |
struct radeon_i2c_bus_rec *i2c_bus); |
extern struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, |
struct radeon_i2c_bus_rec *rec, |
const char *name); |
431,7 → 499,6 |
struct radeon_i2c_bus_rec *rec, |
const char *name); |
extern void radeon_i2c_destroy(struct radeon_i2c_chan *i2c); |
extern void radeon_i2c_destroy_dp(struct radeon_i2c_chan *i2c); |
extern void radeon_i2c_get_byte(struct radeon_i2c_chan *i2c_bus, |
u8 slave_addr, |
u8 addr, |
440,12 → 507,21 |
u8 slave_addr, |
u8 addr, |
u8 val); |
extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); |
extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); |
extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); |
extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); |
|
extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); |
|
extern void radeon_compute_pll(struct radeon_pll *pll, |
extern bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, |
struct radeon_atom_ss *ss, |
int id); |
extern bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, |
struct radeon_atom_ss *ss, |
int id, u32 clock); |
|
extern void radeon_compute_pll_legacy(struct radeon_pll *pll, |
uint64_t freq, |
uint32_t *dot_clock_p, |
uint32_t *fb_div_p, |
453,6 → 529,14 |
uint32_t *ref_div_p, |
uint32_t *post_div_p); |
|
extern void radeon_compute_pll_avivo(struct radeon_pll *pll, |
u32 freq, |
u32 *dot_clock_p, |
u32 *fb_div_p, |
u32 *frac_fb_div_p, |
u32 *ref_div_p, |
u32 *post_div_p); |
|
extern void radeon_setup_encoder_clones(struct drm_device *dev); |
|
struct drm_encoder *radeon_encoder_legacy_lvds_add(struct drm_device *dev, int bios_index); |
460,14 → 544,19 |
struct drm_encoder *radeon_encoder_legacy_tv_dac_add(struct drm_device *dev, int bios_index, int with_tv); |
struct drm_encoder *radeon_encoder_legacy_tmds_int_add(struct drm_device *dev, int bios_index); |
struct drm_encoder *radeon_encoder_legacy_tmds_ext_add(struct drm_device *dev, int bios_index); |
extern void atombios_external_tmds_setup(struct drm_encoder *encoder, int action); |
extern void atombios_dvo_setup(struct drm_encoder *encoder, int action); |
extern void atombios_digital_setup(struct drm_encoder *encoder, int action); |
extern int atombios_get_encoder_mode(struct drm_encoder *encoder); |
extern bool atombios_set_edp_panel_power(struct drm_connector *connector, int action); |
extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); |
|
extern void radeon_crtc_load_lut(struct drm_crtc *crtc); |
extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, |
struct drm_framebuffer *old_fb); |
extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc, |
struct drm_framebuffer *fb, |
int x, int y, |
enum mode_set_atomic state); |
extern int atombios_crtc_mode_set(struct drm_crtc *crtc, |
struct drm_display_mode *mode, |
struct drm_display_mode *adjusted_mode, |
477,7 → 566,13 |
|
extern int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y, |
struct drm_framebuffer *old_fb); |
|
extern int radeon_crtc_set_base_atomic(struct drm_crtc *crtc, |
struct drm_framebuffer *fb, |
int x, int y, |
enum mode_set_atomic state); |
extern int radeon_crtc_do_set_base(struct drm_crtc *crtc, |
struct drm_framebuffer *fb, |
int x, int y, int atomic); |
extern int radeon_crtc_cursor_set(struct drm_crtc *crtc, |
struct drm_file *file_priv, |
uint32_t handle, |
486,9 → 581,12 |
extern int radeon_crtc_cursor_move(struct drm_crtc *crtc, |
int x, int y); |
|
extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, int crtc, |
int *vpos, int *hpos); |
|
extern bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev); |
extern struct edid * |
radeon_combios_get_hardcoded_edid(struct radeon_device *rdev); |
radeon_bios_get_hardcoded_edid(struct radeon_device *rdev); |
extern bool radeon_atom_get_clock_info(struct drm_device *dev); |
extern bool radeon_combios_get_clock_info(struct drm_device *dev); |
extern struct radeon_encoder_atom_dig * |
534,12 → 632,11 |
u16 blue, int regno); |
extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, |
u16 *blue, int regno); |
struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev, |
void radeon_framebuffer_init(struct drm_device *dev, |
struct radeon_framebuffer *rfb, |
struct drm_mode_fb_cmd *mode_cmd, |
struct drm_gem_object *obj); |
|
int radeonfb_probe(struct drm_device *dev); |
|
int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); |
bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev); |
bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev); |
556,10 → 653,11 |
void radeon_enc_destroy(struct drm_encoder *encoder); |
void radeon_copy_fb(struct drm_device *dev, struct drm_gem_object *dst_obj); |
void radeon_combios_asic_init(struct drm_device *dev); |
extern int radeon_static_clocks_init(struct drm_device *dev); |
bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc, |
struct drm_display_mode *mode, |
struct drm_display_mode *adjusted_mode); |
void radeon_panel_mode_fixup(struct drm_encoder *encoder, |
struct drm_display_mode *adjusted_mode); |
void atom_rv515_force_tv_scaler(struct radeon_device *rdev, struct radeon_crtc *radeon_crtc); |
|
/* legacy tv */ |
575,4 → 673,17 |
void radeon_legacy_tv_mode_set(struct drm_encoder *encoder, |
struct drm_display_mode *mode, |
struct drm_display_mode *adjusted_mode); |
|
/* fbdev layer */ |
int radeon_fbdev_init(struct radeon_device *rdev); |
void radeon_fbdev_fini(struct radeon_device *rdev); |
void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state); |
int radeon_fbdev_total_size(struct radeon_device *rdev); |
bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj); |
|
void radeon_fb_output_poll_changed(struct radeon_device *rdev); |
|
void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id); |
|
int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled); |
#endif |