1235783Skib/* 2235783Skib * Copyright (c) 2006 Dave Airlie <airlied@linux.ie> 3235783Skib * Copyright (c) 2007-2008 Intel Corporation 4235783Skib * Jesse Barnes <jesse.barnes@intel.com> 5235783Skib * 6235783Skib * Permission is hereby granted, free of charge, to any person obtaining a 7235783Skib * copy of this software and associated documentation files (the "Software"), 8235783Skib * to deal in the Software without restriction, including without limitation 9235783Skib * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10235783Skib * and/or sell copies of the Software, and to permit persons to whom the 11235783Skib * Software is furnished to do so, subject to the following conditions: 12235783Skib * 13235783Skib * The above copyright notice and this permission notice (including the next 14235783Skib * paragraph) shall be included in all copies or substantial portions of the 15235783Skib * Software. 16235783Skib * 17235783Skib * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18235783Skib * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19235783Skib * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20235783Skib * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21235783Skib * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22235783Skib * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23235783Skib * IN THE SOFTWARE. 24235783Skib * 25235783Skib * $FreeBSD$ 26235783Skib */ 27235783Skib 28235783Skib#ifndef DRM_INTEL_DRV_H 29235783Skib#define DRM_INTEL_DRV_H 30235783Skib 31235783Skib#include <dev/drm2/i915/i915_drm.h> 32235783Skib#include <dev/drm2/i915/i915_drv.h> 33235783Skib#include <dev/drm2/drm_crtc.h> 34235783Skib#include <dev/drm2/drm_crtc_helper.h> 35235783Skib#include <dev/drm2/drm_fb_helper.h> 36235783Skib 37235783Skib#define _intel_wait_for(DEV, COND, MS, W, WMSG) \ 38235783Skib({ \ 39235783Skib int end, ret; \ 40235783Skib \ 41235783Skib end = ticks + (MS) * hz / 1000; \ 42235783Skib ret = 0; \ 43235783Skib \ 44235783Skib while (!(COND)) { \ 45235783Skib if (time_after(ticks, end)) { \ 46235783Skib ret = -ETIMEDOUT; \ 47235783Skib break; \ 48235783Skib } \ 49235783Skib if (W) \ 50235783Skib pause((WMSG), 1); \ 51235783Skib else \ 52235783Skib DELAY(1000); \ 53235783Skib } \ 54235783Skib \ 55235783Skib ret; \ 56235783Skib}) 57235783Skib 58235783Skib#define KHz(x) (1000*x) 59235783Skib#define MHz(x) KHz(1000*x) 60235783Skib 61235783Skib/* store information about an Ixxx DVO */ 62235783Skib/* The i830->i865 use multiple DVOs with multiple i2cs */ 63235783Skib/* the i915, i945 have a single sDVO i2c bus - which is different */ 64235783Skib#define MAX_OUTPUTS 6 65235783Skib/* maximum connectors per crtcs in the mode set */ 66235783Skib#define INTELFB_CONN_LIMIT 4 67235783Skib 68235783Skib#define INTEL_I2C_BUS_DVO 1 69235783Skib#define INTEL_I2C_BUS_SDVO 2 70235783Skib 71235783Skib/* these are outputs from the chip - integrated only 72235783Skib external chips are via DVO or SDVO output */ 73235783Skib#define INTEL_OUTPUT_UNUSED 0 74235783Skib#define INTEL_OUTPUT_ANALOG 1 75235783Skib#define INTEL_OUTPUT_DVO 2 76235783Skib#define INTEL_OUTPUT_SDVO 3 77235783Skib#define INTEL_OUTPUT_LVDS 4 78235783Skib#define INTEL_OUTPUT_TVOUT 5 79235783Skib#define INTEL_OUTPUT_HDMI 6 80235783Skib#define INTEL_OUTPUT_DISPLAYPORT 7 81235783Skib#define INTEL_OUTPUT_EDP 8 82235783Skib 83235783Skib/* Intel Pipe Clone Bit */ 84235783Skib#define INTEL_HDMIB_CLONE_BIT 1 85235783Skib#define INTEL_HDMIC_CLONE_BIT 2 86235783Skib#define INTEL_HDMID_CLONE_BIT 3 87235783Skib#define INTEL_HDMIE_CLONE_BIT 4 88235783Skib#define INTEL_HDMIF_CLONE_BIT 5 89235783Skib#define INTEL_SDVO_NON_TV_CLONE_BIT 6 90235783Skib#define INTEL_SDVO_TV_CLONE_BIT 7 91235783Skib#define INTEL_SDVO_LVDS_CLONE_BIT 8 92235783Skib#define INTEL_ANALOG_CLONE_BIT 9 93235783Skib#define INTEL_TV_CLONE_BIT 10 94235783Skib#define INTEL_DP_B_CLONE_BIT 11 95235783Skib#define INTEL_DP_C_CLONE_BIT 12 96235783Skib#define INTEL_DP_D_CLONE_BIT 13 97235783Skib#define INTEL_LVDS_CLONE_BIT 14 98235783Skib#define INTEL_DVO_TMDS_CLONE_BIT 15 99235783Skib#define INTEL_DVO_LVDS_CLONE_BIT 16 100235783Skib#define INTEL_EDP_CLONE_BIT 17 101235783Skib 102235783Skib#define INTEL_DVO_CHIP_NONE 0 103235783Skib#define INTEL_DVO_CHIP_LVDS 1 104235783Skib#define INTEL_DVO_CHIP_TMDS 2 105235783Skib#define INTEL_DVO_CHIP_TVOUT 4 106235783Skib 107235783Skib/* drm_display_mode->private_flags */ 108235783Skib#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0) 109235783Skib#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT) 110235783Skib#define INTEL_MODE_DP_FORCE_6BPC (0x10) 111235783Skib/* This flag must be set by the encoder's mode_fixup if it changes the crtc 112235783Skib * timings in the mode to prevent the crtc fixup from overwriting them. 113235783Skib * Currently only lvds needs that. */ 114235783Skib#define INTEL_MODE_CRTC_TIMINGS_SET (0x20) 115235783Skib 116235783Skibstatic inline void 117235783Skibintel_mode_set_pixel_multiplier(struct drm_display_mode *mode, 118235783Skib int multiplier) 119235783Skib{ 120235783Skib mode->clock *= multiplier; 121235783Skib mode->private_flags |= multiplier; 122235783Skib} 123235783Skib 124235783Skibstatic inline int 125235783Skibintel_mode_get_pixel_multiplier(const struct drm_display_mode *mode) 126235783Skib{ 127235783Skib return (mode->private_flags & INTEL_MODE_PIXEL_MULTIPLIER_MASK) >> INTEL_MODE_PIXEL_MULTIPLIER_SHIFT; 128235783Skib} 129235783Skib 130235783Skibstruct intel_framebuffer { 131235783Skib struct drm_framebuffer base; 132235783Skib struct drm_i915_gem_object *obj; 133235783Skib}; 134235783Skib 135235783Skibstruct intel_fbdev { 136235783Skib struct drm_fb_helper helper; 137235783Skib struct intel_framebuffer ifb; 138235783Skib struct list_head fbdev_list; 139235783Skib struct drm_display_mode *our_mode; 140235783Skib}; 141235783Skib 142235783Skibstruct intel_encoder { 143235783Skib struct drm_encoder base; 144235783Skib int type; 145235783Skib bool needs_tv_clock; 146235783Skib void (*hot_plug)(struct intel_encoder *); 147235783Skib int crtc_mask; 148235783Skib int clone_mask; 149235783Skib}; 150235783Skib 151235783Skibstruct intel_connector { 152235783Skib struct drm_connector base; 153235783Skib struct intel_encoder *encoder; 154235783Skib}; 155235783Skib 156235783Skibstruct intel_crtc { 157235783Skib struct drm_crtc base; 158235783Skib enum pipe pipe; 159235783Skib enum plane plane; 160235783Skib u8 lut_r[256], lut_g[256], lut_b[256]; 161235783Skib int dpms_mode; 162235783Skib bool active; /* is the crtc on? independent of the dpms mode */ 163235783Skib bool busy; /* is scanout buffer being updated frequently? */ 164235783Skib struct callout idle_callout; 165235783Skib bool lowfreq_avail; 166235783Skib struct intel_overlay *overlay; 167235783Skib struct intel_unpin_work *unpin_work; 168235783Skib int fdi_lanes; 169235783Skib 170235783Skib struct drm_i915_gem_object *cursor_bo; 171235783Skib uint32_t cursor_addr; 172235783Skib int16_t cursor_x, cursor_y; 173235783Skib int16_t cursor_width, cursor_height; 174235783Skib bool cursor_visible; 175235783Skib unsigned int bpp; 176235783Skib 177235783Skib bool no_pll; /* tertiary pipe for IVB */ 178235783Skib bool use_pll_a; 179235783Skib}; 180235783Skib 181235783Skibstruct intel_plane { 182235783Skib struct drm_plane base; 183235783Skib enum pipe pipe; 184235783Skib struct drm_i915_gem_object *obj; 185235783Skib bool primary_disabled; 186235783Skib int max_downscale; 187235783Skib u32 lut_r[1024], lut_g[1024], lut_b[1024]; 188235783Skib void (*update_plane)(struct drm_plane *plane, 189235783Skib struct drm_framebuffer *fb, 190235783Skib struct drm_i915_gem_object *obj, 191235783Skib int crtc_x, int crtc_y, 192235783Skib unsigned int crtc_w, unsigned int crtc_h, 193235783Skib uint32_t x, uint32_t y, 194235783Skib uint32_t src_w, uint32_t src_h); 195235783Skib void (*disable_plane)(struct drm_plane *plane); 196235783Skib int (*update_colorkey)(struct drm_plane *plane, 197235783Skib struct drm_intel_sprite_colorkey *key); 198235783Skib void (*get_colorkey)(struct drm_plane *plane, 199235783Skib struct drm_intel_sprite_colorkey *key); 200235783Skib}; 201235783Skib 202235783Skib#define to_intel_crtc(x) container_of(x, struct intel_crtc, base) 203235783Skib#define to_intel_connector(x) container_of(x, struct intel_connector, base) 204235783Skib#define to_intel_encoder(x) container_of(x, struct intel_encoder, base) 205235783Skib#define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base) 206235783Skib#define to_intel_plane(x) container_of(x, struct intel_plane, base) 207235783Skib 208235783Skib#define DIP_HEADER_SIZE 5 209235783Skib 210235783Skib#define DIP_TYPE_AVI 0x82 211235783Skib#define DIP_VERSION_AVI 0x2 212235783Skib#define DIP_LEN_AVI 13 213235783Skib 214235783Skib#define DIP_TYPE_SPD 0x83 215235783Skib#define DIP_VERSION_SPD 0x1 216235783Skib#define DIP_LEN_SPD 25 217235783Skib#define DIP_SPD_UNKNOWN 0 218235783Skib#define DIP_SPD_DSTB 0x1 219235783Skib#define DIP_SPD_DVDP 0x2 220235783Skib#define DIP_SPD_DVHS 0x3 221235783Skib#define DIP_SPD_HDDVR 0x4 222235783Skib#define DIP_SPD_DVC 0x5 223235783Skib#define DIP_SPD_DSC 0x6 224235783Skib#define DIP_SPD_VCD 0x7 225235783Skib#define DIP_SPD_GAME 0x8 226235783Skib#define DIP_SPD_PC 0x9 227235783Skib#define DIP_SPD_BD 0xa 228235783Skib#define DIP_SPD_SCD 0xb 229235783Skib 230235783Skibstruct dip_infoframe { 231235783Skib uint8_t type; /* HB0 */ 232235783Skib uint8_t ver; /* HB1 */ 233235783Skib uint8_t len; /* HB2 - body len, not including checksum */ 234235783Skib uint8_t ecc; /* Header ECC */ 235235783Skib uint8_t checksum; /* PB0 */ 236235783Skib union { 237235783Skib struct { 238235783Skib /* PB1 - Y 6:5, A 4:4, B 3:2, S 1:0 */ 239235783Skib uint8_t Y_A_B_S; 240235783Skib /* PB2 - C 7:6, M 5:4, R 3:0 */ 241235783Skib uint8_t C_M_R; 242235783Skib /* PB3 - ITC 7:7, EC 6:4, Q 3:2, SC 1:0 */ 243235783Skib uint8_t ITC_EC_Q_SC; 244235783Skib /* PB4 - VIC 6:0 */ 245235783Skib uint8_t VIC; 246235783Skib /* PB5 - PR 3:0 */ 247235783Skib uint8_t PR; 248235783Skib /* PB6 to PB13 */ 249235783Skib uint16_t top_bar_end; 250235783Skib uint16_t bottom_bar_start; 251235783Skib uint16_t left_bar_end; 252235783Skib uint16_t right_bar_start; 253235783Skib } avi; 254235783Skib struct { 255235783Skib uint8_t vn[8]; 256235783Skib uint8_t pd[16]; 257235783Skib uint8_t sdi; 258235783Skib } spd; 259235783Skib uint8_t payload[27]; 260235783Skib } __attribute__ ((packed)) body; 261235783Skib} __attribute__((packed)); 262235783Skib 263235783Skibstatic inline struct drm_crtc * 264235783Skibintel_get_crtc_for_pipe(struct drm_device *dev, int pipe) 265235783Skib{ 266235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 267235783Skib return dev_priv->pipe_to_crtc_mapping[pipe]; 268235783Skib} 269235783Skib 270235783Skibstatic inline struct drm_crtc * 271235783Skibintel_get_crtc_for_plane(struct drm_device *dev, int plane) 272235783Skib{ 273235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 274235783Skib return dev_priv->plane_to_crtc_mapping[plane]; 275235783Skib} 276235783Skib 277235783Skibstruct intel_unpin_work { 278235783Skib struct task task; 279235783Skib struct drm_device *dev; 280235783Skib struct drm_i915_gem_object *old_fb_obj; 281235783Skib struct drm_i915_gem_object *pending_flip_obj; 282235783Skib struct drm_pending_vblank_event *event; 283235783Skib int pending; 284235783Skib bool enable_stall_check; 285235783Skib}; 286235783Skib 287235783Skibstruct intel_fbc_work { 288235783Skib struct timeout_task task; 289235783Skib struct drm_crtc *crtc; 290235783Skib struct drm_framebuffer *fb; 291235783Skib int interval; 292235783Skib}; 293235783Skib 294235783Skibint intel_ddc_get_modes(struct drm_connector *c, device_t adapter); 295235783Skibextern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus); 296235783Skib 297235783Skibextern void intel_attach_force_audio_property(struct drm_connector *connector); 298235783Skibextern void intel_attach_broadcast_rgb_property(struct drm_connector *connector); 299235783Skib 300235783Skibextern void intel_crt_init(struct drm_device *dev); 301235783Skibextern void intel_hdmi_init(struct drm_device *dev, int sdvox_reg); 302235783Skibvoid intel_dip_infoframe_csum(struct dip_infoframe *avi_if); 303235783Skibextern bool intel_sdvo_init(struct drm_device *dev, int output_device); 304235783Skibextern void intel_dvo_init(struct drm_device *dev); 305235783Skibextern void intel_tv_init(struct drm_device *dev); 306235783Skibextern void intel_mark_busy(struct drm_device *dev, 307235783Skib struct drm_i915_gem_object *obj); 308235783Skibextern bool intel_lvds_init(struct drm_device *dev); 309235783Skibextern void intel_dp_init(struct drm_device *dev, int dp_reg); 310235783Skibvoid 311235783Skibintel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, 312235783Skib struct drm_display_mode *adjusted_mode); 313235783Skibextern bool intel_dpd_is_edp(struct drm_device *dev); 314235783Skibextern void intel_edp_link_config(struct intel_encoder *, int *, int *); 315235783Skibextern bool intel_encoder_is_pch_edp(struct drm_encoder *encoder); 316235783Skibextern int intel_plane_init(struct drm_device *dev, enum pipe pipe); 317235783Skib 318235783Skib/* intel_panel.c */ 319235783Skibextern void intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, 320235783Skib struct drm_display_mode *adjusted_mode); 321235783Skibextern void intel_pch_panel_fitting(struct drm_device *dev, 322235783Skib int fitting_mode, 323254797Sdumbbell const struct drm_display_mode *mode, 324235783Skib struct drm_display_mode *adjusted_mode); 325235783Skibextern u32 intel_panel_get_max_backlight(struct drm_device *dev); 326235783Skibextern u32 intel_panel_get_backlight(struct drm_device *dev); 327235783Skibextern void intel_panel_set_backlight(struct drm_device *dev, u32 level); 328235783Skibextern int intel_panel_setup_backlight(struct drm_device *dev); 329235783Skibextern void intel_panel_enable_backlight(struct drm_device *dev); 330235783Skibextern void intel_panel_disable_backlight(struct drm_device *dev); 331235783Skibextern void intel_panel_destroy_backlight(struct drm_device *dev); 332235783Skibextern enum drm_connector_status intel_panel_detect(struct drm_device *dev); 333235783Skib 334235783Skibextern void intel_crtc_load_lut(struct drm_crtc *crtc); 335235783Skibextern void intel_encoder_prepare(struct drm_encoder *encoder); 336235783Skibextern void intel_encoder_commit(struct drm_encoder *encoder); 337235783Skibextern void intel_encoder_destroy(struct drm_encoder *encoder); 338235783Skib 339235783Skibstatic inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector) 340235783Skib{ 341235783Skib return to_intel_connector(connector)->encoder; 342235783Skib} 343235783Skib 344235783Skibextern void intel_connector_attach_encoder(struct intel_connector *connector, 345235783Skib struct intel_encoder *encoder); 346235783Skibextern struct drm_encoder *intel_best_encoder(struct drm_connector *connector); 347235783Skib 348235783Skibextern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, 349235783Skib struct drm_crtc *crtc); 350235783Skibint intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, 351235783Skib struct drm_file *file_priv); 352235783Skibextern void intel_wait_for_vblank(struct drm_device *dev, int pipe); 353235783Skibextern void intel_wait_for_pipe_off(struct drm_device *dev, int pipe); 354235783Skib 355235783Skibstruct intel_load_detect_pipe { 356235783Skib struct drm_framebuffer *release_fb; 357235783Skib bool load_detect_temp; 358235783Skib int dpms_mode; 359235783Skib}; 360235783Skibextern bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, 361235783Skib struct drm_connector *connector, 362235783Skib struct drm_display_mode *mode, 363235783Skib struct intel_load_detect_pipe *old); 364235783Skibextern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, 365235783Skib struct drm_connector *connector, 366235783Skib struct intel_load_detect_pipe *old); 367235783Skib 368235783Skibextern void intelfb_restore(void); 369235783Skibextern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, 370235783Skib u16 blue, int regno); 371235783Skibextern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, 372235783Skib u16 *blue, int regno); 373235783Skibextern void intel_enable_clock_gating(struct drm_device *dev); 374235783Skibextern void ironlake_enable_drps(struct drm_device *dev); 375235783Skibextern void ironlake_disable_drps(struct drm_device *dev); 376235783Skibextern void gen6_enable_rps(struct drm_i915_private *dev_priv); 377235783Skibextern void gen6_update_ring_freq(struct drm_i915_private *dev_priv); 378235783Skibextern void gen6_disable_rps(struct drm_device *dev); 379235783Skibextern void intel_init_emon(struct drm_device *dev); 380235783Skib 381235783Skibextern int intel_pin_and_fence_fb_obj(struct drm_device *dev, 382235783Skib struct drm_i915_gem_object *obj, 383235783Skib struct intel_ring_buffer *pipelined); 384235783Skibextern void intel_unpin_fb_obj(struct drm_i915_gem_object *obj); 385235783Skib 386235783Skibextern int intel_framebuffer_init(struct drm_device *dev, 387235783Skib struct intel_framebuffer *ifb, 388235783Skib struct drm_mode_fb_cmd2 *mode_cmd, 389235783Skib struct drm_i915_gem_object *obj); 390235783Skibextern int intel_fbdev_init(struct drm_device *dev); 391235783Skibextern void intel_fbdev_fini(struct drm_device *dev); 392235783Skib 393235783Skibextern void intel_prepare_page_flip(struct drm_device *dev, int plane); 394235783Skibextern void intel_finish_page_flip(struct drm_device *dev, int pipe); 395235783Skibextern void intel_finish_page_flip_plane(struct drm_device *dev, int plane); 396235783Skib 397235783Skibextern void intel_setup_overlay(struct drm_device *dev); 398235783Skibextern void intel_cleanup_overlay(struct drm_device *dev); 399235783Skibextern int intel_overlay_switch_off(struct intel_overlay *overlay); 400235783Skibextern int intel_overlay_put_image(struct drm_device *dev, void *data, 401235783Skib struct drm_file *file_priv); 402235783Skibextern int intel_overlay_attrs(struct drm_device *dev, void *data, 403235783Skib struct drm_file *file_priv); 404235783Skib 405235783Skibextern void intel_fb_output_poll_changed(struct drm_device *dev); 406235783Skibextern void intel_fb_restore_mode(struct drm_device *dev); 407235783Skib 408235783Skibextern void assert_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, 409235783Skib bool state); 410235783Skib#define assert_pipe_enabled(d, p) assert_pipe(d, p, true) 411235783Skib#define assert_pipe_disabled(d, p) assert_pipe(d, p, false) 412235783Skib 413235783Skibextern void intel_init_clock_gating(struct drm_device *dev); 414235783Skibextern void intel_write_eld(struct drm_encoder *encoder, 415235783Skib struct drm_display_mode *mode); 416235783Skibextern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe); 417235783Skib 418235783Skib/* For use by IVB LP watermark workaround in intel_sprite.c */ 419235783Skibextern void sandybridge_update_wm(struct drm_device *dev); 420235783Skibextern void intel_update_sprite_watermarks(struct drm_device *dev, int pipe, 421235783Skib uint32_t sprite_width, 422235783Skib int pixel_size); 423235783Skibextern int intel_sprite_set_colorkey(struct drm_device *dev, void *data, 424235783Skib struct drm_file *file_priv); 425235783Skibextern int intel_sprite_get_colorkey(struct drm_device *dev, void *data, 426235783Skib struct drm_file *file_priv); 427235783Skib 428235783Skib#endif 429