1 /************************************************************************** 2 3 Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 4 Copyright 2002 David Dawes 5 6 All Rights Reserved. 7 8 Permission is hereby granted, free of charge, to any person obtaining a 9 copy of this software and associated documentation files (the 10 "Software"), to deal in the Software without restriction, including 11 without limitation the rights to use, copy, modify, merge, publish, 12 distribute, sub license, and/or sell copies of the Software, and to 13 permit persons to whom the Software is furnished to do so, subject to 14 the following conditions: 15 16 The above copyright notice and this permission notice (including the 17 next paragraph) shall be included in all copies or substantial portions 18 of the Software. 19 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 23 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 24 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 28 **************************************************************************/ 29 30 /* 31 * Authors: 32 * Keith Whitwell <keith (at) tungstengraphics.com> 33 * David Dawes <dawes (at) xfree86.org> 34 * 35 */ 36 37 #if 0 38 #define I830DEBUG 39 #endif 40 41 #include <stdint.h> 42 43 #ifndef REMAP_RESERVED 44 #define REMAP_RESERVED 0 45 #endif 46 47 #ifndef _I830_H_ 48 #define _I830_H_ 49 50 #include "xorg-server.h" 51 #include "xf86_OSproc.h" 52 #include "compiler.h" 53 #include "xf86PciInfo.h" 54 #include "xf86Pci.h" 55 #include "i810_reg.h" 56 #include "xf86Cursor.h" 57 #include "xf86xv.h" 58 #include "vgaHW.h" 59 #include "xf86Crtc.h" 60 #include "xf86RandR12.h" 61 62 #include "xorg-server.h" 63 #include <pciaccess.h> 64 65 #include "xf86drm.h" 66 #include "sarea.h" 67 #define _XF86DRI_SERVER_ 68 #include "dri.h" 69 #include "GL/glxint.h" 70 #include "i830_dri.h" 71 #include "intel_bufmgr.h" 72 #include "i915_drm.h" 73 74 #include "uxa.h" 75 Bool i830_uxa_init(ScreenPtr pScreen); 76 void i830_uxa_create_screen_resources(ScreenPtr pScreen); 77 void i830_uxa_block_handler (ScreenPtr pScreen); 78 Bool i830_get_aperture_space(ScrnInfoPtr pScrn, drm_intel_bo **bo_table, 79 int num_bos); 80 81 dri_bo *i830_get_pixmap_bo (PixmapPtr pixmap); 82 void i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo); 83 84 typedef struct _I830OutputRec I830OutputRec, *I830OutputPtr; 85 86 #include "common.h" 87 #include "i830_sdvo.h" 88 #include "i2c_vid.h" 89 90 #ifdef XvMCExtension 91 #ifdef ENABLE_XVMC 92 #define INTEL_XVMC 1 93 #endif 94 #endif 95 96 #define ALWAYS_SYNC 0 97 #define ALWAYS_FLUSH 0 98 99 typedef struct _I830Rec *I830Ptr; 100 101 typedef void (*I830WriteIndexedByteFunc)(I830Ptr pI830, IOADDRESS addr, 102 uint8_t index, uint8_t value); 103 typedef uint8_t(*I830ReadIndexedByteFunc)(I830Ptr pI830, IOADDRESS addr, 104 uint8_t index); 105 typedef void (*I830WriteByteFunc)(I830Ptr pI830, IOADDRESS addr, 106 uint8_t value); 107 typedef uint8_t(*I830ReadByteFunc)(I830Ptr pI830, IOADDRESS addr); 108 109 enum tile_format { 110 TILE_NONE, 111 TILE_XMAJOR, 112 TILE_YMAJOR 113 }; 114 115 #define PITCH_NONE 0 116 117 /** Record of a linear allocation in the aperture. */ 118 typedef struct _i830_memory i830_memory; 119 struct _i830_memory { 120 /** Offset of the allocation in card VM */ 121 unsigned long offset; 122 /** End of the allocation in card VM */ 123 unsigned long end; 124 /** 125 * Requested size of the allocation: doesn't count padding. 126 * 127 * Any bound memory will cover offset to (offset + size). 128 */ 129 unsigned long size; 130 /** 131 * Allocated aperture size, taking into account padding to allow for 132 * tiling. 133 */ 134 unsigned long allocated_size; 135 /** 136 * Physical (or more properly, bus) address of the allocation. 137 * Only set if requested during allocation. 138 */ 139 uint64_t bus_addr; 140 /** AGP memory handle */ 141 int key; 142 /** 143 * Whether or not the AGP memory (if any) is currently bound. 144 */ 145 Bool bound; 146 /** 147 * Offset that the AGP-allocated memory (if any) is to be bound to. 148 * 149 * This is either @offset or pI830->stolen_size 150 */ 151 unsigned long agp_offset; 152 153 enum tile_format tiling; 154 /** 155 * Index of the fence register representing the tiled surface, when 156 * bound. 157 */ 158 int fence_nr; 159 /** Pitch value in bytes for tiled surfaces */ 160 unsigned int pitch; 161 162 /** Description of the allocation, for logging */ 163 char *name; 164 165 /** @{ 166 * Memory allocator linked list pointers 167 */ 168 i830_memory *next; 169 i830_memory *prev; 170 /** @} */ 171 172 dri_bo *bo; 173 uint32_t alignment; 174 uint32_t gem_name; 175 Bool lifetime_fixed_offset; 176 }; 177 178 typedef struct { 179 int tail_mask; 180 i830_memory *mem; 181 unsigned char *virtual_start; 182 int head; 183 int tail; 184 int space; 185 } I830RingBuffer; 186 187 /* store information about an Ixxx DVO */ 188 /* The i830->i865 use multiple DVOs with multiple i2cs */ 189 /* the i915, i945 have a single sDVO i2c bus - which is different */ 190 #define MAX_OUTPUTS 6 191 192 #define I830_I2C_BUS_DVO 1 193 #define I830_I2C_BUS_SDVO 2 194 195 /* these are outputs from the chip - integrated only 196 external chips are via DVO or SDVO output */ 197 #define I830_OUTPUT_UNUSED 0 198 #define I830_OUTPUT_ANALOG 1 199 #define I830_OUTPUT_DVO_TMDS 2 200 #define I830_OUTPUT_DVO_LVDS 3 201 #define I830_OUTPUT_DVO_TVOUT 4 202 #define I830_OUTPUT_SDVO 5 203 #define I830_OUTPUT_LVDS 6 204 #define I830_OUTPUT_TVOUT 7 205 #define I830_OUTPUT_HDMI 8 206 207 struct _I830DVODriver { 208 int type; 209 char *modulename; 210 char *fntablename; 211 unsigned int dvo_reg; 212 uint32_t gpio; 213 int address; 214 I830I2CVidOutputRec *vid_rec; 215 void *dev_priv; 216 pointer modhandle; 217 }; 218 219 typedef struct _I830CrtcPrivateRec { 220 int pipe; 221 int plane; 222 223 Bool enabled; 224 225 int dpms_mode; 226 227 int x, y; 228 229 /* Lookup table values to be set when the CRTC is enabled */ 230 uint8_t lut_r[256], lut_g[256], lut_b[256]; 231 232 i830_memory *rotate_mem; 233 /* Card virtual address of the cursor */ 234 unsigned long cursor_offset; 235 unsigned long cursor_argb_offset; 236 /* Physical or virtual addresses of the cursor for setting in the cursor 237 * registers. 238 */ 239 uint64_t cursor_addr; 240 unsigned long cursor_argb_addr; 241 Bool cursor_is_argb; 242 } I830CrtcPrivateRec, *I830CrtcPrivatePtr; 243 244 #define I830CrtcPrivate(c) ((I830CrtcPrivatePtr) (c)->driver_private) 245 246 typedef struct _I830OutputPrivateRec { 247 int type; 248 I2CBusPtr pI2CBus; 249 I2CBusPtr pDDCBus; 250 struct _I830DVODriver *i2c_drv; 251 Bool load_detect_temp; 252 Bool needs_tv_clock; 253 uint32_t lvds_bits; 254 int pipe_mask; 255 int clone_mask; 256 /** Output-private structure. Should replace i2c_drv */ 257 void *dev_priv; 258 } I830OutputPrivateRec, *I830OutputPrivatePtr; 259 260 #define I830OutputPrivate(o) ((I830OutputPrivatePtr) (o)->driver_private) 261 262 /** enumeration of 3d consumers so some can maintain invariant state. */ 263 enum last_3d { 264 LAST_3D_OTHER, 265 LAST_3D_VIDEO, 266 LAST_3D_RENDER, 267 LAST_3D_ROTATION 268 }; 269 270 /* 271 * Backlight control has some unfortunate properties: 272 * - many machines won't give us brightness change notifications 273 * o brightness hotkeys 274 * o events like AC plug/unplug (can be controlled via _DOS setting) 275 * o ambient light sensor triggered changes 276 * - some machines use the so-called "legacy" backlight interface 277 * o resulting brightness is a combo of LBB and PWM values 278 * o LBB sits in config space 279 * - some machines have ACPI methods for changing brightness 280 * o one of the few ways the X server and firmware can stay in sync 281 * - new machines have the IGD OpRegion interface available 282 * o a reliable way of keeping the firmware and X in sync 283 * 284 * So the real problem is on machines where ACPI or OpRegion methods aren't 285 * available. In that case, problems can occur: 286 * 1) the BIOS and X will have different ideas of what the brightness is, 287 * leading to unexpected results when the brightness is increased or 288 * decreased via hotkey or X protocol 289 * 2) unless X takes the legacy register into account, machines using it 290 * may prevent X from raising the brightness above 0 if the firmware 291 * set LBB to 0 292 * Given these problems, we provide the user with a selection of methods, 293 * so they can choose an ideal one for their platform (assuming our quirk 294 * code picks the wrong one). 295 * 296 * Four different backlight control methods are available: 297 * BCM_NATIVE: only ever touch the native backlight control registers 298 * This method may be susceptible to problem (2) above if the firmware 299 * modifies the legacy registers. 300 * BCM_LEGACY: only ever touch the legacy backlight control registers 301 * This method may be susceptible to problem (1) above if the firmware 302 * also modifies the legacy registers. 303 * BCM_COMBO: try to use both sets 304 * In this case, the driver will try to modify both sets of registers 305 * if needed. To avoid problem (2) above it may set the LBB register 306 * to a non-zero value if the brightness is to be increased. It's still 307 * susceptible to problem (1), but to a lesser extent than the LEGACY only 308 * method. 309 * BCM_KERNEL: use kernel methods for controlling the backlight 310 * This is only available on some platforms, but where present this can 311 * provide the best user experience. 312 */ 313 314 enum backlight_control { 315 BCM_NATIVE = 0, 316 BCM_LEGACY, 317 BCM_COMBO, 318 BCM_KERNEL, 319 }; 320 321 enum dri_type { 322 DRI_DISABLED, 323 DRI_NONE, 324 DRI_DRI2 325 }; 326 struct sdvo_device_mapping { 327 uint8_t dvo_port; 328 uint8_t slave_addr; 329 uint8_t dvo_wiring; 330 uint8_t initialized; 331 }; 332 typedef struct _I830Rec { 333 unsigned char *MMIOBase; 334 unsigned char *GTTBase; 335 unsigned char *FbBase; 336 int cpp; 337 338 unsigned int bufferOffset; /* for I830SelectBuffer */ 339 340 /* These are set in PreInit and never changed. */ 341 long FbMapSize; 342 long GTTMapSize; 343 344 /** 345 * Linked list of video memory allocations. The head and tail are 346 * dummy entries that bound the allocation area. 347 */ 348 i830_memory *memory_list; 349 /** Linked list of buffer object memory allocations */ 350 i830_memory *bo_list; 351 long stolen_size; /**< bytes of pre-bound stolen memory */ 352 int gtt_acquired; /**< whether we currently own the AGP */ 353 354 i830_memory *front_buffer; 355 i830_memory *compressed_front_buffer; 356 i830_memory *compressed_ll_buffer; 357 /* One big buffer for all cursors for kernels that support this */ 358 i830_memory *cursor_mem; 359 /* separate small buffers for kernels that support this */ 360 i830_memory *cursor_mem_classic[2]; 361 i830_memory *cursor_mem_argb[2]; 362 i830_memory *fake_bufmgr_mem; 363 364 /* Regions allocated either from the above pools, or from agpgart. */ 365 I830RingBuffer ring; 366 367 /** Number of bytes being emitted in the current BEGIN_LP_RING */ 368 unsigned int ring_emitting; 369 /** Number of bytes that have been emitted in the current BEGIN_LP_RING */ 370 unsigned int ring_used; 371 /** Offset in the ring for the next DWORD emit */ 372 uint32_t ring_next; 373 374 dri_bufmgr *bufmgr; 375 376 uint8_t *batch_ptr; 377 /** Byte offset in batch_ptr for the next dword to be emitted. */ 378 unsigned int batch_used; 379 /** Position in batch_ptr at the start of the current BEGIN_BATCH */ 380 unsigned int batch_emit_start; 381 /** Number of bytes to be emitted in the current BEGIN_BATCH. */ 382 uint32_t batch_emitting; 383 dri_bo *batch_bo; 384 dri_bo *last_batch_bo; 385 /** Whether we're in a section of code that can't tolerate flushing */ 386 Bool in_batch_atomic; 387 /** Ending batch_used that was verified by i830_start_batch_atomic() */ 388 int batch_atomic_limit; 389 390 /* For Xvideo */ 391 i830_memory *overlay_regs; 392 void *offscreenImages; /**< remembered memory block for release */ 393 #ifdef INTEL_XVMC 394 /* For XvMC */ 395 Bool XvMCEnabled; 396 #endif 397 398 XF86ModReqInfo shadowReq; /* to test for later libshadow */ 399 400 CreateScreenResourcesProcPtr CreateScreenResources; 401 402 i830_memory *power_context; 403 404 i830_memory *memory_manager; /**< DRI memory manager aperture */ 405 406 Bool have_gem; 407 Bool need_mi_flush; 408 409 Bool tiling; 410 Bool fb_compression; 411 Bool swapbuffers_wait; 412 413 Bool CursorNeedsPhysical; 414 415 int Chipset; 416 unsigned long LinearAddr; 417 unsigned long MMIOAddr; 418 unsigned int MMIOSize; 419 IOADDRESS ioBase; 420 EntityInfoPtr pEnt; 421 struct pci_device *PciInfo; 422 uint8_t variant; 423 424 unsigned int BR[20]; 425 426 Bool fence_used[FENCE_NEW_NR]; 427 428 CloseScreenProcPtr CloseScreen; 429 430 void (*batch_flush_notify)(ScrnInfoPtr pScrn); 431 432 uxa_driver_t *uxa_driver; 433 Bool need_flush; 434 PixmapPtr pSrcPixmap; 435 int accel_pixmap_pitch_alignment; 436 int accel_pixmap_offset_alignment; 437 int accel_max_x; 438 int accel_max_y; 439 int max_gtt_map_size; 440 441 I830WriteIndexedByteFunc writeControl; 442 I830ReadIndexedByteFunc readControl; 443 I830WriteByteFunc writeStandard; 444 I830ReadByteFunc readStandard; 445 446 Bool XvDisabled; /* Xv disabled in PreInit. */ 447 Bool XvEnabled; /* Xv enabled for this generation. */ 448 Bool XvPreferOverlay; 449 450 int colorKey; 451 XF86VideoAdaptorPtr adaptor; 452 ScreenBlockHandlerProcPtr BlockHandler; 453 Bool overlayOn; 454 455 struct { 456 drm_intel_bo *gen4_vs_bo; 457 drm_intel_bo *gen4_sf_bo; 458 drm_intel_bo *gen4_wm_packed_bo; 459 drm_intel_bo *gen4_wm_planar_bo; 460 drm_intel_bo *gen4_cc_bo; 461 drm_intel_bo *gen4_cc_vp_bo; 462 drm_intel_bo *gen4_sampler_bo; 463 drm_intel_bo *gen4_sip_kernel_bo; 464 } video; 465 466 /* Render accel state */ 467 float scale_units[2][2]; 468 /** Transform pointers for src/mask, or NULL if identity */ 469 PictTransform *transform[2]; 470 float dst_coord_adjust; 471 float src_coord_adjust; 472 float mask_coord_adjust; 473 474 /* i830 render accel state */ 475 PixmapPtr render_src, render_mask, render_dst; 476 PicturePtr render_src_picture, render_mask_picture, render_dst_picture; 477 uint32_t render_dst_format; 478 Bool needs_render_state_emit; 479 uint32_t cblend, ablend, s8_blendctl; 480 481 /* i915 render accel state */ 482 uint32_t mapstate[6]; 483 uint32_t samplerstate[6]; 484 485 struct { 486 int op; 487 uint32_t dst_format; 488 Bool needs_emit; 489 } i915_render_state; 490 491 /* 965 render acceleration state */ 492 struct gen4_render_state *gen4_render_state; 493 494 enum dri_type directRenderingType; /* DRI enabled this generation. */ 495 496 Bool directRenderingOpen; 497 int drmSubFD; 498 char deviceName[64]; 499 500 /* Broken-out options. */ 501 OptionInfoPtr Options; 502 503 Bool lvds_24_bit_mode; 504 Bool lvds_use_ssc; 505 int lvds_ssc_freq; /* in MHz */ 506 Bool lvds_dither; 507 DisplayModePtr lvds_fixed_mode; 508 DisplayModePtr sdvo_lvds_fixed_mode; 509 Bool skip_panel_detect; 510 Bool integrated_lvds; /* LVDS config from driver feature BDB */ 511 512 Bool tv_present; /* TV connector present (from VBIOS) */ 513 514 /* Driver phase/state information */ 515 Bool preinit; 516 Bool starting; 517 Bool closing; 518 Bool suspended; 519 Bool leaving; 520 521 unsigned int SaveGeneration; 522 523 OsTimerPtr devicesTimer; 524 525 int ddc2; 526 527 enum backlight_control backlight_control_method; 528 529 uint32_t saveDSPARB; 530 uint32_t saveDSPACNTR; 531 uint32_t saveDSPBCNTR; 532 uint32_t savePIPEACONF; 533 uint32_t savePIPEBCONF; 534 uint32_t savePIPEASRC; 535 uint32_t savePIPEBSRC; 536 uint32_t saveFPA0; 537 uint32_t saveFPA1; 538 uint32_t saveDPLL_A; 539 uint32_t saveDPLL_A_MD; 540 uint32_t saveHTOTAL_A; 541 uint32_t saveHBLANK_A; 542 uint32_t saveHSYNC_A; 543 uint32_t saveVTOTAL_A; 544 uint32_t saveVBLANK_A; 545 uint32_t saveVSYNC_A; 546 uint32_t saveBCLRPAT_A; 547 uint32_t saveDSPASTRIDE; 548 uint32_t saveDSPASIZE; 549 uint32_t saveDSPAPOS; 550 uint32_t saveDSPABASE; 551 uint32_t saveDSPASURF; 552 uint32_t saveDSPATILEOFF; 553 uint32_t saveFPB0; 554 uint32_t saveFPB1; 555 uint32_t saveDPLL_B; 556 uint32_t saveDPLL_B_MD; 557 uint32_t saveHTOTAL_B; 558 uint32_t saveHBLANK_B; 559 uint32_t saveHSYNC_B; 560 uint32_t saveVTOTAL_B; 561 uint32_t saveVBLANK_B; 562 uint32_t saveVSYNC_B; 563 uint32_t saveBCLRPAT_B; 564 uint32_t saveDSPBSTRIDE; 565 uint32_t saveDSPBSIZE; 566 uint32_t saveDSPBPOS; 567 uint32_t saveDSPBBASE; 568 uint32_t saveDSPBSURF; 569 uint32_t saveDSPBTILEOFF; 570 uint32_t saveVCLK_DIVISOR_VGA0; 571 uint32_t saveVCLK_DIVISOR_VGA1; 572 uint32_t saveVCLK_POST_DIV; 573 uint32_t saveVGACNTRL; 574 uint32_t saveCURSOR_A_CONTROL; 575 uint32_t saveCURSOR_A_BASE; 576 uint32_t saveCURSOR_A_POSITION; 577 uint32_t saveCURSOR_B_CONTROL; 578 uint32_t saveCURSOR_B_BASE; 579 uint32_t saveCURSOR_B_POSITION; 580 uint32_t saveADPA; 581 uint32_t saveLVDS; 582 uint32_t saveDVOA; 583 uint32_t saveDVOB; 584 uint32_t saveDVOC; 585 uint32_t savePP_ON; 586 uint32_t savePP_OFF; 587 uint32_t savePP_CONTROL; 588 uint32_t savePP_DIVISOR; 589 uint32_t savePFIT_CONTROL; 590 uint32_t savePaletteA[256]; 591 uint32_t savePaletteB[256]; 592 uint32_t saveSWF[17]; 593 uint32_t saveBLC_PWM_CTL; 594 uint32_t saveBLC_PWM_CTL2; 595 uint32_t saveFBC_CFB_BASE; 596 uint32_t saveFBC_LL_BASE; 597 uint32_t saveFBC_CONTROL2; 598 uint32_t saveFBC_CONTROL; 599 uint32_t saveFBC_FENCE_OFF; 600 uint32_t saveRENCLK_GATE_D1; 601 uint32_t saveRENCLK_GATE_D2; 602 uint32_t saveDSPCLK_GATE_D; 603 uint32_t saveRAMCLK_GATE_D; 604 uint32_t savePWRCTXA; 605 606 enum last_3d last_3d; 607 608 Bool use_drm_mode; 609 Bool kernel_exec_fencing; 610 611 /** Enables logging of debug output related to mode switching. */ 612 Bool debug_modes; 613 unsigned int quirk_flag; 614 615 /** User option to print acceleration fallback info to the server log. */ 616 Bool fallback_debug; 617 struct sdvo_device_mapping sdvo_mappings[2]; 618 } I830Rec; 619 620 #define I830PTR(p) ((I830Ptr)((p)->driverPrivate)) 621 622 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 623 #define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1)) 624 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 625 626 #define I830_SELECT_FRONT 0 627 #define I830_SELECT_BACK 1 628 #define I830_SELECT_DEPTH 2 629 #define I830_SELECT_THIRD 3 630 631 unsigned long intel_get_pixmap_offset(PixmapPtr pPix); 632 unsigned long intel_get_pixmap_pitch(PixmapPtr pPix); 633 634 /* Batchbuffer support macros and functions */ 635 #include "i830_batchbuffer.h" 636 637 /* I830 specific functions */ 638 extern int I830WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis); 639 extern void I830SetPIOAccess(I830Ptr pI830); 640 extern void I830SetMMIOAccess(I830Ptr pI830); 641 extern void I830Sync(ScrnInfoPtr pScrn); 642 extern void I830InitHWCursor(ScrnInfoPtr pScrn); 643 extern void I830SetPipeCursor (xf86CrtcPtr crtc, Bool force); 644 extern Bool I830CursorInit(ScreenPtr pScreen); 645 extern void IntelEmitInvarientState(ScrnInfoPtr pScrn); 646 extern void I830EmitInvarientState(ScrnInfoPtr pScrn); 647 extern void I915EmitInvarientState(ScrnInfoPtr pScrn); 648 extern Bool I830SelectBuffer(ScrnInfoPtr pScrn, int buffer); 649 void i830_update_cursor_offsets(ScrnInfoPtr pScrn); 650 651 /* CRTC-based cursor functions */ 652 void 653 i830_crtc_load_cursor_image (xf86CrtcPtr crtc, unsigned char *src); 654 655 #ifdef ARGB_CURSOR 656 void 657 i830_crtc_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image); 658 #endif 659 660 void 661 i830_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y); 662 663 void 664 i830_crtc_show_cursor (xf86CrtcPtr crtc); 665 666 void 667 i830_crtc_hide_cursor (xf86CrtcPtr crtc); 668 669 void 670 i830_crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg); 671 672 extern void i830_refresh_ring(ScrnInfoPtr pScrn); 673 extern void I830EmitFlush(ScrnInfoPtr pScrn); 674 675 extern void I830InitVideo(ScreenPtr pScreen); 676 extern void i830_crtc_dpms_video(xf86CrtcPtr crtc, Bool on); 677 extern xf86CrtcPtr i830_covering_crtc (ScrnInfoPtr pScrn, BoxPtr box, 678 xf86CrtcPtr desired, 679 BoxPtr crtc_box_ret); 680 int 681 i830_crtc_pipe (xf86CrtcPtr crtc); 682 683 extern xf86CrtcPtr i830_pipe_to_crtc(ScrnInfoPtr pScrn, int pipe); 684 685 Bool 686 i830_pipe_a_require_activate (ScrnInfoPtr scrn); 687 688 void 689 i830_pipe_a_require_deactivate (ScrnInfoPtr scrn); 690 691 Bool I830DRI2ScreenInit(ScreenPtr pScreen); 692 void I830DRI2CloseScreen(ScreenPtr pScreen); 693 694 extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp); 695 extern int drmmode_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc); 696 extern void drmmode_closefb(ScrnInfoPtr scrn); 697 extern int drmmode_output_dpms_status(xf86OutputPtr output); 698 void 699 drmmode_crtc_set_cursor_bo(xf86CrtcPtr crtc, dri_bo *cursor); 700 701 extern Bool i830_crtc_on(xf86CrtcPtr crtc); 702 extern int i830_crtc_to_pipe(xf86CrtcPtr crtc); 703 extern Bool I830AccelInit(ScreenPtr pScreen); 704 extern void I830SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, 705 int ydir, int rop, 706 unsigned int planemask, 707 int trans_color); 708 extern void I830SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX, 709 int srcY, int dstX, int dstY, 710 int w, int h); 711 extern void I830SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, 712 unsigned int planemask); 713 extern void I830SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, 714 int w, int h); 715 716 Bool i830_allocator_init(ScrnInfoPtr pScrn, unsigned long size); 717 void i830_allocator_fini(ScrnInfoPtr pScrn); 718 i830_memory * i830_allocate_memory(ScrnInfoPtr pScrn, const char *name, 719 unsigned long size, unsigned long pitch, 720 unsigned long alignment, int flags, 721 enum tile_format tile_format); 722 void i830_describe_allocations(ScrnInfoPtr pScrn, int verbosity, 723 const char *prefix); 724 void i830_reset_allocations(ScrnInfoPtr pScrn); 725 void i830_free_3d_memory(ScrnInfoPtr pScrn); 726 void i830_free_memory(ScrnInfoPtr pScrn, i830_memory *mem); 727 extern long I830CheckAvailableMemory(ScrnInfoPtr pScrn); 728 Bool i830_allocate_2d_memory(ScrnInfoPtr pScrn); 729 Bool i830_allocate_pwrctx(ScrnInfoPtr pScrn); 730 Bool i830_allocate_3d_memory(ScrnInfoPtr pScrn); 731 void i830_init_bufmgr(ScrnInfoPtr pScrn); 732 #ifdef INTEL_XVMC 733 Bool i830_allocate_xvmc_buffer(ScrnInfoPtr pScrn, const char *name, 734 i830_memory **buffer, unsigned long size, int flags); 735 void i830_free_xvmc_buffer(ScrnInfoPtr pScrn, i830_memory *buffer); 736 #endif 737 extern uint32_t i830_create_new_fb(ScrnInfoPtr pScrn, int width, int height, 738 int *pitch); 739 740 Bool 741 i830_tiled_width(I830Ptr i830, int *width, int cpp); 742 743 int 744 i830_pad_drawable_width(int width, int cpp); 745 746 747 extern Bool I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg, 748 char *name); 749 750 /* i830_display.c */ 751 Bool 752 i830PipeHasType (xf86CrtcPtr crtc, int type); 753 754 /* i830_crt.c */ 755 void i830_crt_init(ScrnInfoPtr pScrn); 756 757 /* i830_dvo.c */ 758 void i830_dvo_init(ScrnInfoPtr pScrn); 759 760 /* i830_hdmi.c */ 761 void i830_hdmi_init(ScrnInfoPtr pScrn, int output_reg); 762 763 /* i830_lvds.c */ 764 void i830_lvds_init(ScrnInfoPtr pScrn); 765 766 /* i830_memory.c */ 767 Bool i830_bind_all_memory(ScrnInfoPtr pScrn); 768 Bool i830_unbind_all_memory(ScrnInfoPtr pScrn); 769 unsigned long i830_get_fence_size(I830Ptr pI830, unsigned long size); 770 unsigned long i830_get_fence_pitch(I830Ptr pI830, unsigned long pitch, int format); 771 void i830_set_max_gtt_map_size(ScrnInfoPtr pScrn); 772 773 Bool I830BindAGPMemory(ScrnInfoPtr pScrn); 774 Bool I830UnbindAGPMemory(ScrnInfoPtr pScrn); 775 776 i830_memory * 777 i830_allocate_framebuffer(ScrnInfoPtr pScrn); 778 779 /* i830_modes.c */ 780 DisplayModePtr i830_ddc_get_modes(xf86OutputPtr output); 781 782 /* i830_tv.c */ 783 void i830_tv_init(ScrnInfoPtr pScrn); 784 785 /* i830_render.c */ 786 Bool i830_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, 787 PicturePtr pDst); 788 Bool i830_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, 789 PicturePtr pDst, PixmapPtr pSrcPixmap, 790 PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); 791 Bool 792 i830_transform_is_affine (PictTransformPtr t); 793 794 void i830_composite(PixmapPtr pDst, int srcX, int srcY, 795 int maskX, int maskY, int dstX, int dstY, int w, int h); 796 void i830_done_composite(PixmapPtr pDst); 797 /* i915_render.c */ 798 Bool i915_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, 799 PicturePtr pDst); 800 Bool i915_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, 801 PicturePtr pDst, PixmapPtr pSrcPixmap, 802 PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); 803 void i915_composite(PixmapPtr pDst, int srcX, int srcY, 804 int maskX, int maskY, int dstX, int dstY, int w, int h); 805 void i915_batch_flush_notify(ScrnInfoPtr pScrn); 806 void i830_batch_flush_notify(ScrnInfoPtr scrn); 807 /* i965_render.c */ 808 unsigned int gen4_render_state_size(ScrnInfoPtr pScrn); 809 void gen4_render_state_init(ScrnInfoPtr pScrn); 810 void gen4_render_state_cleanup(ScrnInfoPtr pScrn); 811 Bool i965_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, 812 PicturePtr pDst); 813 Bool i965_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, 814 PicturePtr pDst, PixmapPtr pSrcPixmap, 815 PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); 816 void i965_composite(PixmapPtr pDst, int srcX, int srcY, 817 int maskX, int maskY, int dstX, int dstY, int w, int h); 818 819 void 820 i965_batch_flush_notify(ScrnInfoPtr pScrn); 821 822 Bool 823 i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, 824 float *x_out, float *y_out); 825 826 Bool 827 i830_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform, 828 float *x_out, float *y_out, float *z_out); 829 830 void i830_enter_render(ScrnInfoPtr); 831 832 static inline void 833 i830_wait_ring_idle(ScrnInfoPtr pScrn) 834 { 835 I830Ptr pI830 = I830PTR(pScrn); 836 837 I830WaitLpRing(pScrn, pI830->ring.mem->size - 8, 0); 838 } 839 840 static inline int i830_fb_compression_supported(I830Ptr pI830) 841 { 842 if (!IS_MOBILE(pI830)) 843 return FALSE; 844 if (IS_I810(pI830) || IS_I815(pI830) || IS_I830(pI830)) 845 return FALSE; 846 if (IS_IGD(pI830)) 847 return FALSE; 848 if (IS_IGDNG(pI830)) 849 return FALSE; 850 /* fbc depends on tiled surface. 851 */ 852 if (!pI830->tiling) 853 return FALSE; 854 /* We have not gotten FBC to work consistently on 965GM. Our best 855 * working theory right now is that FBC simply isn't reliable on 856 * that device. See this bug report for more details: 857 * https://bugs.freedesktop.org/show_bug.cgi?id=16257 858 */ 859 if (IS_I965GM(pI830)) 860 return FALSE; 861 return TRUE; 862 } 863 864 #define I830FALLBACK(s, arg...) \ 865 do { \ 866 if (I830PTR(pScrn)->fallback_debug) { \ 867 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 868 "fallback: " s "\n", ##arg); \ 869 } \ 870 return FALSE; \ 871 } while(0) 872 873 Bool i830_pixmap_tiled(PixmapPtr p); 874 875 #define i830_exa_check_pitch_2d(p) do {\ 876 uint32_t pitch = intel_get_pixmap_pitch(p);\ 877 if (pitch > KB(32)) I830FALLBACK("pitch exceeds 2d limit 32K\n");\ 878 } while(0) 879 880 /* For pre-965 chip only, as they have 8KB limit for 3D */ 881 #define i830_exa_check_pitch_3d(p) do {\ 882 uint32_t pitch = intel_get_pixmap_pitch(p);\ 883 if (pitch > KB(8)) I830FALLBACK("pitch exceeds 3d limit 8K\n");\ 884 } while(0) 885 886 /** 887 * Little wrapper around drm_intel_bo_reloc to return the initial value you 888 * should stuff into the relocation entry. 889 * 890 * If only we'd done this before settling on the library API. 891 */ 892 static inline uint32_t 893 intel_emit_reloc(drm_intel_bo *bo, uint32_t offset, 894 drm_intel_bo *target_bo, uint32_t target_offset, 895 uint32_t read_domains, uint32_t write_domain) 896 { 897 drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset, 898 read_domains, write_domain); 899 900 return target_bo->offset + target_offset; 901 } 902 903 static inline drm_intel_bo * 904 intel_bo_alloc_for_data(ScrnInfoPtr scrn, const void *data, unsigned int size, 905 char *name) 906 { 907 I830Ptr pI830 = I830PTR(scrn); 908 drm_intel_bo *bo; 909 910 bo = drm_intel_bo_alloc(pI830->bufmgr, name, size, 4096); 911 if (!bo) 912 return NULL; 913 drm_intel_bo_subdata(bo, 0, size, data); 914 915 return bo; 916 } 917 918 extern const int I830PatternROP[16]; 919 extern const int I830CopyROP[16]; 920 921 /* Flags for memory allocation function */ 922 #define NEED_PHYSICAL_ADDR 0x00000001 923 #define ALIGN_BOTH_ENDS 0x00000002 924 #define NEED_NON_STOLEN 0x00000004 925 #define NEED_LIFETIME_FIXED 0x00000008 926 #define ALLOW_SHARING 0x00000010 927 #define DISABLE_REUSE 0x00000020 928 929 /* Chipset registers for VIDEO BIOS memory RW access */ 930 #define _855_DRAM_RW_CONTROL 0x58 931 #define _845_DRAM_RW_CONTROL 0x90 932 #define DRAM_WRITE 0x33330000 933 934 /* quirk flag definition */ 935 #define QUIRK_IGNORE_TV 0x00000001 936 #define QUIRK_IGNORE_LVDS 0x00000002 937 #define QUIRK_IGNORE_MACMINI_LVDS 0x00000004 938 #define QUIRK_PIPEA_FORCE 0x00000008 939 #define QUIRK_IVCH_NEED_DVOB 0x00000010 940 #define QUIRK_RESET_MODES 0x00000020 941 #define QUIRK_PFIT_SAFE 0x00000040 942 #define QUIRK_IGNORE_CRT 0x00000080 943 #define QUIRK_BROKEN_ACPI_LID 0x00000100 944 extern void i830_fixup_devices(ScrnInfoPtr); 945 946 /** 947 * Hints to CreatePixmap to tell the driver how the pixmap is going to be 948 * used. 949 * 950 * Compare to CREATE_PIXMAP_USAGE_* in the server. 951 */ 952 enum { 953 INTEL_CREATE_PIXMAP_TILING_X = 0x10000000, 954 INTEL_CREATE_PIXMAP_TILING_Y, 955 }; 956 957 #if (ALWAYS_FLUSH | ALWAYS_SYNC) 958 void 959 i830_debug_sync(ScrnInfoPtr scrn); 960 #else 961 static inline void 962 i830_debug_sync(ScrnInfoPtr scrn) 963 { 964 } 965 #endif 966 967 static inline PixmapPtr 968 get_drawable_pixmap(DrawablePtr drawable) 969 { 970 ScreenPtr screen = drawable->pScreen; 971 972 if (drawable->type == DRAWABLE_PIXMAP) 973 return (PixmapPtr)drawable; 974 else 975 return screen->GetWindowPixmap((WindowPtr)drawable); 976 } 977 978 static inline Bool 979 pixmap_is_scanout(PixmapPtr pixmap) 980 { 981 ScreenPtr screen = pixmap->drawable.pScreen; 982 983 return pixmap == screen->GetScreenPixmap(screen); 984 } 985 986 #endif /* _I830_H_ */ 987