1145132Sanholt/* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- 2145132Sanholt */ 3152909Sanholt/* 4182080Srnoland * 5145132Sanholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 6145132Sanholt * All Rights Reserved. 7182080Srnoland * 8152909Sanholt * Permission is hereby granted, free of charge, to any person obtaining a 9152909Sanholt * copy of this software and associated documentation files (the 10152909Sanholt * "Software"), to deal in the Software without restriction, including 11152909Sanholt * without limitation the rights to use, copy, modify, merge, publish, 12152909Sanholt * distribute, sub license, and/or sell copies of the Software, and to 13152909Sanholt * permit persons to whom the Software is furnished to do so, subject to 14152909Sanholt * the following conditions: 15182080Srnoland * 16152909Sanholt * The above copyright notice and this permission notice (including the 17152909Sanholt * next paragraph) shall be included in all copies or substantial portions 18152909Sanholt * of the Software. 19182080Srnoland * 20152909Sanholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21152909Sanholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22152909Sanholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 23152909Sanholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 24152909Sanholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25152909Sanholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26152909Sanholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27182080Srnoland * 28152909Sanholt */ 29145132Sanholt 30152909Sanholt#include <sys/cdefs.h> 31152909Sanholt__FBSDID("$FreeBSD$"); 32152909Sanholt 33145132Sanholt#ifndef _I915_DRV_H_ 34145132Sanholt#define _I915_DRV_H_ 35145132Sanholt 36203287Srnoland#include "dev/drm/drm_mm.h" 37189049Srnoland#include "dev/drm/i915_reg.h" 38189049Srnoland 39145132Sanholt/* General customization: 40145132Sanholt */ 41145132Sanholt 42145132Sanholt#define DRIVER_AUTHOR "Tungsten Graphics, Inc." 43145132Sanholt 44145132Sanholt#define DRIVER_NAME "i915" 45145132Sanholt#define DRIVER_DESC "Intel Graphics" 46183573Srnoland#define DRIVER_DATE "20080730" 47145132Sanholt 48189049Srnolandenum pipe { 49189049Srnoland PIPE_A = 0, 50189049Srnoland PIPE_B, 51189049Srnoland}; 52182080Srnoland 53189130Srnoland#define I915_NUM_PIPE 2 54189130Srnoland 55145132Sanholt/* Interface history: 56145132Sanholt * 57145132Sanholt * 1.1: Original. 58145132Sanholt * 1.2: Add Power Management 59157617Sanholt * 1.3: Add vblank support 60157617Sanholt * 1.4: Fix cmdbuffer path, add heap destroy 61162132Sanholt * 1.5: Add vblank pipe configuration 62182080Srnoland * 1.6: - New ioctl for scheduling buffer swaps on vertical blank 63182080Srnoland * - Support vertical blank on secondary display pipe 64145132Sanholt */ 65145132Sanholt#define DRIVER_MAJOR 1 66182080Srnoland#define DRIVER_MINOR 6 67145132Sanholt#define DRIVER_PATCHLEVEL 0 68145132Sanholt 69183573Srnoland#define WATCH_COHERENCY 0 70183573Srnoland#define WATCH_BUF 0 71183573Srnoland#define WATCH_EXEC 0 72183573Srnoland#define WATCH_LRU 0 73183573Srnoland#define WATCH_RELOC 0 74183573Srnoland#define WATCH_INACTIVE 0 75183573Srnoland#define WATCH_PWRITE 0 76183573Srnoland 77145132Sanholttypedef struct _drm_i915_ring_buffer { 78145132Sanholt int tail_mask; 79145132Sanholt unsigned long Size; 80145132Sanholt u8 *virtual_start; 81145132Sanholt int head; 82145132Sanholt int tail; 83145132Sanholt int space; 84145132Sanholt drm_local_map_t map; 85183573Srnoland struct drm_gem_object *ring_obj; 86145132Sanholt} drm_i915_ring_buffer_t; 87145132Sanholt 88145132Sanholtstruct mem_block { 89145132Sanholt struct mem_block *next; 90145132Sanholt struct mem_block *prev; 91145132Sanholt int start; 92145132Sanholt int size; 93182080Srnoland struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */ 94145132Sanholt}; 95145132Sanholt 96182080Srnolandstruct opregion_header; 97182080Srnolandstruct opregion_acpi; 98182080Srnolandstruct opregion_swsci; 99182080Srnolandstruct opregion_asle; 100182080Srnoland 101182080Srnolandstruct intel_opregion { 102182080Srnoland struct opregion_header *header; 103182080Srnoland struct opregion_acpi *acpi; 104182080Srnoland struct opregion_swsci *swsci; 105182080Srnoland struct opregion_asle *asle; 106182080Srnoland int enabled; 107182080Srnoland}; 108182080Srnoland 109145132Sanholttypedef struct drm_i915_private { 110183573Srnoland struct drm_device *dev; 111183573Srnoland 112145132Sanholt drm_local_map_t *sarea; 113145132Sanholt drm_local_map_t *mmio_map; 114145132Sanholt 115145132Sanholt drm_i915_sarea_t *sarea_priv; 116145132Sanholt drm_i915_ring_buffer_t ring; 117145132Sanholt 118152909Sanholt drm_dma_handle_t *status_page_dmah; 119145132Sanholt void *hw_status_page; 120152909Sanholt dma_addr_t dma_status_page; 121182080Srnoland uint32_t counter; 122182080Srnoland unsigned int status_gfx_addr; 123182080Srnoland drm_local_map_t hws_map; 124183573Srnoland struct drm_gem_object *hws_obj; 125145132Sanholt 126182080Srnoland unsigned int cpp; 127189049Srnoland int back_offset; 128189049Srnoland int front_offset; 129189049Srnoland int current_page; 130189049Srnoland int page_flipping; 131145132Sanholt 132145132Sanholt wait_queue_head_t irq_queue; 133189049Srnoland /** Protects user_irq_refcount and irq_mask_reg */ 134189049Srnoland DRM_SPINTYPE user_irq_lock; 135189049Srnoland /** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */ 136189049Srnoland int user_irq_refcount; 137189049Srnoland /** Cached value of IER to avoid reads in updating the bitfield */ 138189049Srnoland u32 irq_mask_reg; 139189049Srnoland u32 pipestat[2]; 140145132Sanholt 141145132Sanholt int tex_lru_log_granularity; 142145132Sanholt int allow_batchbuffer; 143145132Sanholt struct mem_block *agp_heap; 144145132Sanholt unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; 145162132Sanholt int vblank_pipe; 146182080Srnoland 147182080Srnoland struct intel_opregion opregion; 148182080Srnoland 149182080Srnoland /* Register state */ 150182080Srnoland u8 saveLBB; 151182080Srnoland u32 saveDSPACNTR; 152182080Srnoland u32 saveDSPBCNTR; 153182080Srnoland u32 saveDSPARB; 154190020Srnoland u32 saveRENDERSTANDBY; 155190020Srnoland u32 saveHWS; 156182080Srnoland u32 savePIPEACONF; 157182080Srnoland u32 savePIPEBCONF; 158182080Srnoland u32 savePIPEASRC; 159182080Srnoland u32 savePIPEBSRC; 160182080Srnoland u32 saveFPA0; 161182080Srnoland u32 saveFPA1; 162182080Srnoland u32 saveDPLL_A; 163182080Srnoland u32 saveDPLL_A_MD; 164182080Srnoland u32 saveHTOTAL_A; 165182080Srnoland u32 saveHBLANK_A; 166182080Srnoland u32 saveHSYNC_A; 167182080Srnoland u32 saveVTOTAL_A; 168182080Srnoland u32 saveVBLANK_A; 169182080Srnoland u32 saveVSYNC_A; 170182080Srnoland u32 saveBCLRPAT_A; 171182080Srnoland u32 savePIPEASTAT; 172182080Srnoland u32 saveDSPASTRIDE; 173182080Srnoland u32 saveDSPASIZE; 174182080Srnoland u32 saveDSPAPOS; 175182080Srnoland u32 saveDSPAADDR; 176182080Srnoland u32 saveDSPASURF; 177182080Srnoland u32 saveDSPATILEOFF; 178182080Srnoland u32 savePFIT_PGM_RATIOS; 179182080Srnoland u32 saveBLC_PWM_CTL; 180182080Srnoland u32 saveBLC_PWM_CTL2; 181182080Srnoland u32 saveFPB0; 182182080Srnoland u32 saveFPB1; 183182080Srnoland u32 saveDPLL_B; 184182080Srnoland u32 saveDPLL_B_MD; 185182080Srnoland u32 saveHTOTAL_B; 186182080Srnoland u32 saveHBLANK_B; 187182080Srnoland u32 saveHSYNC_B; 188182080Srnoland u32 saveVTOTAL_B; 189182080Srnoland u32 saveVBLANK_B; 190182080Srnoland u32 saveVSYNC_B; 191182080Srnoland u32 saveBCLRPAT_B; 192182080Srnoland u32 savePIPEBSTAT; 193182080Srnoland u32 saveDSPBSTRIDE; 194182080Srnoland u32 saveDSPBSIZE; 195182080Srnoland u32 saveDSPBPOS; 196182080Srnoland u32 saveDSPBADDR; 197182080Srnoland u32 saveDSPBSURF; 198182080Srnoland u32 saveDSPBTILEOFF; 199182080Srnoland u32 saveVGA0; 200182080Srnoland u32 saveVGA1; 201182080Srnoland u32 saveVGA_PD; 202182080Srnoland u32 saveVGACNTRL; 203182080Srnoland u32 saveADPA; 204182080Srnoland u32 saveLVDS; 205182080Srnoland u32 savePP_ON_DELAYS; 206182080Srnoland u32 savePP_OFF_DELAYS; 207182080Srnoland u32 saveDVOA; 208182080Srnoland u32 saveDVOB; 209182080Srnoland u32 saveDVOC; 210182080Srnoland u32 savePP_ON; 211182080Srnoland u32 savePP_OFF; 212182080Srnoland u32 savePP_CONTROL; 213182080Srnoland u32 savePP_DIVISOR; 214182080Srnoland u32 savePFIT_CONTROL; 215182080Srnoland u32 save_palette_a[256]; 216182080Srnoland u32 save_palette_b[256]; 217182080Srnoland u32 saveFBC_CFB_BASE; 218182080Srnoland u32 saveFBC_LL_BASE; 219182080Srnoland u32 saveFBC_CONTROL; 220182080Srnoland u32 saveFBC_CONTROL2; 221182080Srnoland u32 saveIER; 222182080Srnoland u32 saveIIR; 223182080Srnoland u32 saveIMR; 224182080Srnoland u32 saveCACHE_MODE_0; 225182080Srnoland u32 saveD_STATE; 226182080Srnoland u32 saveCG_2D_DIS; 227182080Srnoland u32 saveMI_ARB_STATE; 228182080Srnoland u32 saveSWF0[16]; 229182080Srnoland u32 saveSWF1[16]; 230182080Srnoland u32 saveSWF2[3]; 231182080Srnoland u8 saveMSR; 232182080Srnoland u8 saveSR[8]; 233182080Srnoland u8 saveGR[25]; 234182080Srnoland u8 saveAR_INDEX; 235182080Srnoland u8 saveAR[21]; 236182080Srnoland u8 saveDACMASK; 237182080Srnoland u8 saveCR[37]; 238190020Srnoland 239183573Srnoland struct { 240183573Srnoland struct drm_mm gtt_space; 241203287Srnoland 242183573Srnoland /** 243183573Srnoland * List of objects currently involved in rendering from the 244183573Srnoland * ringbuffer. 245183573Srnoland * 246183573Srnoland * A reference is held on the buffer while on this list. 247183573Srnoland */ 248183573Srnoland struct list_head active_list; 249183573Srnoland 250183573Srnoland /** 251183573Srnoland * List of objects which are not in the ringbuffer but which 252183573Srnoland * still have a write_domain which needs to be flushed before 253183573Srnoland * unbinding. 254183573Srnoland * 255183573Srnoland * A reference is held on the buffer while on this list. 256183573Srnoland */ 257183573Srnoland struct list_head flushing_list; 258183573Srnoland 259183573Srnoland /** 260183573Srnoland * LRU list of objects which are not in the ringbuffer and 261183573Srnoland * are ready to unbind, but are still in the GTT. 262183573Srnoland * 263183573Srnoland * A reference is not held on the buffer while on this list, 264183573Srnoland * as merely being GTT-bound shouldn't prevent its being 265183573Srnoland * freed, and we'll pull it off the list in the free path. 266183573Srnoland */ 267183573Srnoland struct list_head inactive_list; 268183573Srnoland 269183573Srnoland /** 270183573Srnoland * List of breadcrumbs associated with GPU requests currently 271183573Srnoland * outstanding. 272183573Srnoland */ 273183573Srnoland struct list_head request_list; 274183573Srnoland#ifdef __linux__ 275183573Srnoland /** 276183573Srnoland * We leave the user IRQ off as much as possible, 277183573Srnoland * but this means that requests will finish and never 278183573Srnoland * be retired once the system goes idle. Set a timer to 279183573Srnoland * fire periodically while the ring is running. When it 280183573Srnoland * fires, go retire requests. 281183573Srnoland */ 282183573Srnoland struct delayed_work retire_work; 283183573Srnoland#endif 284183573Srnoland uint32_t next_gem_seqno; 285183573Srnoland 286183573Srnoland /** 287183573Srnoland * Waiting sequence number, if any 288183573Srnoland */ 289183573Srnoland uint32_t waiting_gem_seqno; 290183573Srnoland 291183573Srnoland /** 292183573Srnoland * Last seq seen at irq time 293183573Srnoland */ 294183573Srnoland uint32_t irq_gem_seqno; 295183573Srnoland 296183573Srnoland /** 297183573Srnoland * Flag if the X Server, and thus DRM, is not currently in 298183573Srnoland * control of the device. 299183573Srnoland * 300183573Srnoland * This is set between LeaveVT and EnterVT. It needs to be 301183573Srnoland * replaced with a semaphore. It also needs to be 302183573Srnoland * transitioned away from for kernel modesetting. 303183573Srnoland */ 304183573Srnoland int suspended; 305183573Srnoland 306183573Srnoland /** 307183573Srnoland * Flag if the hardware appears to be wedged. 308183573Srnoland * 309183573Srnoland * This is set when attempts to idle the device timeout. 310183573Srnoland * It prevents command submission from occuring and makes 311183573Srnoland * every pending request fail 312183573Srnoland */ 313183573Srnoland int wedged; 314183573Srnoland 315183573Srnoland /** Bit 6 swizzling required for X tiling */ 316183573Srnoland uint32_t bit_6_swizzle_x; 317183573Srnoland /** Bit 6 swizzling required for Y tiling */ 318183573Srnoland uint32_t bit_6_swizzle_y; 319183573Srnoland } mm; 320145132Sanholt} drm_i915_private_t; 321145132Sanholt 322182080Srnolandenum intel_chip_family { 323182080Srnoland CHIP_I8XX = 0x01, 324182080Srnoland CHIP_I9XX = 0x02, 325182080Srnoland CHIP_I915 = 0x04, 326182080Srnoland CHIP_I965 = 0x08, 327182080Srnoland}; 328182080Srnoland 329183573Srnoland/** driver private structure attached to each drm_gem_object */ 330183573Srnolandstruct drm_i915_gem_object { 331183573Srnoland struct drm_gem_object *obj; 332183573Srnoland 333183573Srnoland /** Current space allocated to this object in the GTT, if any. */ 334183573Srnoland struct drm_mm_node *gtt_space; 335183573Srnoland 336183573Srnoland /** This object's place on the active/flushing/inactive lists */ 337183573Srnoland struct list_head list; 338183573Srnoland 339183573Srnoland /** 340183573Srnoland * This is set if the object is on the active or flushing lists 341183573Srnoland * (has pending rendering), and is not set if it's on inactive (ready 342183573Srnoland * to be unbound). 343183573Srnoland */ 344183573Srnoland int active; 345183573Srnoland 346183573Srnoland /** 347183573Srnoland * This is set if the object has been written to since last bound 348183573Srnoland * to the GTT 349183573Srnoland */ 350183573Srnoland int dirty; 351183573Srnoland 352183573Srnoland /** AGP memory structure for our GTT binding. */ 353183573Srnoland DRM_AGP_MEM *agp_mem; 354183573Srnoland 355183573Srnoland struct page **page_list; 356183573Srnoland 357183573Srnoland /** 358183573Srnoland * Current offset of the object in GTT space. 359183573Srnoland * 360183573Srnoland * This is the same as gtt_space->start 361183573Srnoland */ 362183573Srnoland uint32_t gtt_offset; 363183573Srnoland 364183573Srnoland /** Boolean whether this object has a valid gtt offset. */ 365183573Srnoland int gtt_bound; 366183573Srnoland 367183573Srnoland /** How many users have pinned this object in GTT space */ 368183573Srnoland int pin_count; 369183573Srnoland 370183573Srnoland /** Breadcrumb of last rendering to the buffer. */ 371183573Srnoland uint32_t last_rendering_seqno; 372183573Srnoland 373183573Srnoland /** Current tiling mode for the object. */ 374183573Srnoland uint32_t tiling_mode; 375183573Srnoland 376189049Srnoland /** AGP mapping type (AGP_USER_MEMORY or AGP_USER_CACHED_MEMORY */ 377189049Srnoland uint32_t agp_type; 378189049Srnoland 379183573Srnoland /** 380183573Srnoland * Flagging of which individual pages are valid in GEM_DOMAIN_CPU when 381183573Srnoland * GEM_DOMAIN_CPU is not in the object's read domain. 382183573Srnoland */ 383183573Srnoland uint8_t *page_cpu_valid; 384183573Srnoland}; 385183573Srnoland 386183573Srnoland/** 387183573Srnoland * Request queue structure. 388183573Srnoland * 389183573Srnoland * The request queue allows us to note sequence numbers that have been emitted 390183573Srnoland * and may be associated with active buffers to be retired. 391183573Srnoland * 392183573Srnoland * By keeping this list, we can avoid having to do questionable 393183573Srnoland * sequence-number comparisons on buffer last_rendering_seqnos, and associate 394183573Srnoland * an emission time with seqnos for tracking how far ahead of the GPU we are. 395183573Srnoland */ 396183573Srnolandstruct drm_i915_gem_request { 397183573Srnoland /** GEM sequence number associated with this request. */ 398183573Srnoland uint32_t seqno; 399183573Srnoland 400183573Srnoland /** Time at which this request was emitted, in jiffies. */ 401183573Srnoland unsigned long emitted_jiffies; 402183573Srnoland 403183573Srnoland /** Cache domains that were flushed at the start of the request. */ 404183573Srnoland uint32_t flush_domains; 405183573Srnoland 406183573Srnoland struct list_head list; 407183573Srnoland}; 408183573Srnoland 409189049Srnolandstruct drm_i915_file_private { 410189049Srnoland struct { 411189049Srnoland uint32_t last_gem_seqno; 412189049Srnoland uint32_t last_gem_throttle_seqno; 413189049Srnoland } mm; 414189049Srnoland}; 415189049Srnoland 416182080Srnolandextern struct drm_ioctl_desc i915_ioctls[]; 417152909Sanholtextern int i915_max_ioctl; 418152909Sanholt 419145132Sanholt /* i915_dma.c */ 420182080Srnolandextern void i915_kernel_lost_context(struct drm_device * dev); 421152909Sanholtextern int i915_driver_load(struct drm_device *, unsigned long flags); 422182080Srnolandextern int i915_driver_unload(struct drm_device *); 423189049Srnolandextern int i915_driver_open(struct drm_device *dev, struct drm_file *file_priv); 424182080Srnolandextern void i915_driver_lastclose(struct drm_device * dev); 425182080Srnolandextern void i915_driver_preclose(struct drm_device *dev, 426182080Srnoland struct drm_file *file_priv); 427183573Srnolandextern void i915_driver_postclose(struct drm_device *dev, 428183573Srnoland struct drm_file *file_priv); 429182080Srnolandextern int i915_driver_device_is_agp(struct drm_device * dev); 430152909Sanholtextern long i915_compat_ioctl(struct file *filp, unsigned int cmd, 431152909Sanholt unsigned long arg); 432189049Srnolandextern int i915_emit_box(struct drm_device *dev, 433189049Srnoland struct drm_clip_rect __user *boxes, 434189049Srnoland int i, int DR1, int DR4); 435145132Sanholt 436145132Sanholt/* i915_irq.c */ 437182080Srnolandextern int i915_irq_emit(struct drm_device *dev, void *data, 438182080Srnoland struct drm_file *file_priv); 439182080Srnolandextern int i915_irq_wait(struct drm_device *dev, void *data, 440182080Srnoland struct drm_file *file_priv); 441189049Srnolandvoid i915_user_irq_get(struct drm_device *dev); 442189049Srnolandvoid i915_user_irq_put(struct drm_device *dev); 443145132Sanholt 444145132Sanholtextern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); 445182080Srnolandextern void i915_driver_irq_preinstall(struct drm_device * dev); 446189049Srnolandextern int i915_driver_irq_postinstall(struct drm_device *dev); 447182080Srnolandextern void i915_driver_irq_uninstall(struct drm_device * dev); 448182080Srnolandextern int i915_vblank_pipe_set(struct drm_device *dev, void *data, 449182080Srnoland struct drm_file *file_priv); 450182080Srnolandextern int i915_vblank_pipe_get(struct drm_device *dev, void *data, 451182080Srnoland struct drm_file *file_priv); 452182080Srnolandextern int i915_enable_vblank(struct drm_device *dev, int crtc); 453182080Srnolandextern void i915_disable_vblank(struct drm_device *dev, int crtc); 454182080Srnolandextern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc); 455194540Srnolandextern u32 g45_get_vblank_counter(struct drm_device *dev, int crtc); 456182080Srnolandextern int i915_vblank_swap(struct drm_device *dev, void *data, 457182080Srnoland struct drm_file *file_priv); 458145132Sanholt 459189049Srnolandvoid 460189049Srnolandi915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); 461189049Srnoland 462189049Srnolandvoid 463189049Srnolandi915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); 464189049Srnoland 465189049Srnoland 466145132Sanholt/* i915_mem.c */ 467182080Srnolandextern int i915_mem_alloc(struct drm_device *dev, void *data, 468182080Srnoland struct drm_file *file_priv); 469182080Srnolandextern int i915_mem_free(struct drm_device *dev, void *data, 470182080Srnoland struct drm_file *file_priv); 471182080Srnolandextern int i915_mem_init_heap(struct drm_device *dev, void *data, 472182080Srnoland struct drm_file *file_priv); 473182080Srnolandextern int i915_mem_destroy_heap(struct drm_device *dev, void *data, 474182080Srnoland struct drm_file *file_priv); 475145132Sanholtextern void i915_mem_takedown(struct mem_block **heap); 476182080Srnolandextern void i915_mem_release(struct drm_device * dev, 477189049Srnoland struct drm_file *file_priv, struct mem_block *heap); 478189049Srnoland#ifdef I915_HAVE_GEM 479183573Srnoland/* i915_gem.c */ 480183573Srnolandint i915_gem_init_ioctl(struct drm_device *dev, void *data, 481183573Srnoland struct drm_file *file_priv); 482183573Srnolandint i915_gem_create_ioctl(struct drm_device *dev, void *data, 483183573Srnoland struct drm_file *file_priv); 484183573Srnolandint i915_gem_pread_ioctl(struct drm_device *dev, void *data, 485183573Srnoland struct drm_file *file_priv); 486183573Srnolandint i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, 487183573Srnoland struct drm_file *file_priv); 488183573Srnolandint i915_gem_mmap_ioctl(struct drm_device *dev, void *data, 489183573Srnoland struct drm_file *file_priv); 490183573Srnolandint i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, 491183573Srnoland struct drm_file *file_priv); 492183573Srnolandint i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, 493183573Srnoland struct drm_file *file_priv); 494183573Srnolandint i915_gem_execbuffer(struct drm_device *dev, void *data, 495183573Srnoland struct drm_file *file_priv); 496183573Srnolandint i915_gem_pin_ioctl(struct drm_device *dev, void *data, 497183573Srnoland struct drm_file *file_priv); 498183573Srnolandint i915_gem_unpin_ioctl(struct drm_device *dev, void *data, 499183573Srnoland struct drm_file *file_priv); 500183573Srnolandint i915_gem_busy_ioctl(struct drm_device *dev, void *data, 501183573Srnoland struct drm_file *file_priv); 502183573Srnolandint i915_gem_throttle_ioctl(struct drm_device *dev, void *data, 503183573Srnoland struct drm_file *file_priv); 504183573Srnolandint i915_gem_entervt_ioctl(struct drm_device *dev, void *data, 505183573Srnoland struct drm_file *file_priv); 506183573Srnolandint i915_gem_leavevt_ioctl(struct drm_device *dev, void *data, 507183573Srnoland struct drm_file *file_priv); 508183573Srnolandint i915_gem_set_tiling(struct drm_device *dev, void *data, 509183573Srnoland struct drm_file *file_priv); 510183573Srnolandint i915_gem_get_tiling(struct drm_device *dev, void *data, 511183573Srnoland struct drm_file *file_priv); 512183573Srnolandvoid i915_gem_load(struct drm_device *dev); 513183573Srnolandint i915_gem_proc_init(struct drm_minor *minor); 514183573Srnolandvoid i915_gem_proc_cleanup(struct drm_minor *minor); 515183573Srnolandint i915_gem_init_object(struct drm_gem_object *obj); 516183573Srnolandvoid i915_gem_free_object(struct drm_gem_object *obj); 517183573Srnolandint i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment); 518183573Srnolandvoid i915_gem_object_unpin(struct drm_gem_object *obj); 519183573Srnolandvoid i915_gem_lastclose(struct drm_device *dev); 520183573Srnolanduint32_t i915_get_gem_seqno(struct drm_device *dev); 521183573Srnolandvoid i915_gem_retire_requests(struct drm_device *dev); 522183573Srnolandvoid i915_gem_retire_work_handler(struct work_struct *work); 523183573Srnolandvoid i915_gem_clflush_object(struct drm_gem_object *obj); 524182080Srnoland 525183573Srnoland/* i915_gem_tiling.c */ 526183573Srnolandvoid i915_gem_detect_bit_6_swizzle(struct drm_device *dev); 527183573Srnoland 528183573Srnoland/* i915_gem_debug.c */ 529189049Srnolandvoid i915_gem_dump_object(struct drm_gem_object *obj, int len, 530189049Srnoland const char *where, uint32_t mark); 531183573Srnoland#if WATCH_INACTIVE 532183573Srnolandvoid i915_verify_inactive(struct drm_device *dev, char *file, int line); 533183573Srnoland#else 534189049Srnoland#define i915_verify_inactive(dev, file, line) 535182080Srnoland#endif 536183573Srnolandvoid i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle); 537183573Srnolandvoid i915_gem_dump_object(struct drm_gem_object *obj, int len, 538183573Srnoland const char *where, uint32_t mark); 539183573Srnolandvoid i915_dump_lru(struct drm_device *dev, const char *where); 540189049Srnoland#endif /* I915_HAVE_GEM */ 541182080Srnoland 542189049Srnoland/* i915_suspend.c */ 543189049Srnolandextern int i915_save_state(struct drm_device *dev); 544189049Srnolandextern int i915_restore_state(struct drm_device *dev); 545189049Srnoland 546182080Srnoland/* i915_opregion.c */ 547182080Srnolandextern int intel_opregion_init(struct drm_device *dev); 548182080Srnolandextern void intel_opregion_free(struct drm_device *dev); 549182080Srnolandextern void opregion_asle_intr(struct drm_device *dev); 550182080Srnolandextern void opregion_enable_asle(struct drm_device *dev); 551182080Srnoland 552189049Srnoland/** 553189049Srnoland * Lock test for when it's just for synchronization of ring access. 554189049Srnoland * 555189049Srnoland * In that case, we don't need to do it when GEM is initialized as nobody else 556189049Srnoland * has access to the ring. 557189049Srnoland */ 558189049Srnoland#define RING_LOCK_TEST_WITH_RETURN(dev, file_priv) do { \ 559189049Srnoland if (((drm_i915_private_t *)dev->dev_private)->ring.ring_obj == NULL) \ 560189049Srnoland LOCK_TEST_WITH_RETURN(dev, file_priv); \ 561189049Srnoland} while (0) 562189049Srnoland 563228443Smdf#if defined(__FreeBSD__) && !defined(__bool_true_false_are_defined) 564189049Srnolandtypedef boolean_t bool; 565182080Srnoland#endif 566182080Srnoland 567189049Srnoland#define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg)) 568189049Srnoland#define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val)) 569182080Srnoland#define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, (reg)) 570145132Sanholt#define I915_WRITE16(reg,val) DRM_WRITE16(dev_priv->mmio_map, (reg), (val)) 571182080Srnoland#define I915_READ8(reg) DRM_READ8(dev_priv->mmio_map, (reg)) 572182080Srnoland#define I915_WRITE8(reg,val) DRM_WRITE8(dev_priv->mmio_map, (reg), (val)) 573145132Sanholt 574145132Sanholt#define I915_VERBOSE 0 575145132Sanholt 576145132Sanholt#define RING_LOCALS unsigned int outring, ringmask, outcount; \ 577189049Srnoland volatile char *virt; 578145132Sanholt 579145132Sanholt#define BEGIN_LP_RING(n) do { \ 580145132Sanholt if (I915_VERBOSE) \ 581189049Srnoland DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n)); \ 582189049Srnoland if (dev_priv->ring.space < (n)*4) \ 583189049Srnoland i915_wait_ring(dev, (n)*4, __func__); \ 584145132Sanholt outcount = 0; \ 585145132Sanholt outring = dev_priv->ring.tail; \ 586145132Sanholt ringmask = dev_priv->ring.tail_mask; \ 587145132Sanholt virt = dev_priv->ring.virtual_start; \ 588145132Sanholt} while (0) 589145132Sanholt 590145132Sanholt#define OUT_RING(n) do { \ 591145132Sanholt if (I915_VERBOSE) DRM_DEBUG(" OUT_RING %x\n", (int)(n)); \ 592189049Srnoland *(volatile unsigned int *)(virt + outring) = (n); \ 593189049Srnoland outcount++; \ 594145132Sanholt outring += 4; \ 595145132Sanholt outring &= ringmask; \ 596145132Sanholt} while (0) 597145132Sanholt 598145132Sanholt#define ADVANCE_LP_RING() do { \ 599145132Sanholt if (I915_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING %x\n", outring); \ 600145132Sanholt dev_priv->ring.tail = outring; \ 601145132Sanholt dev_priv->ring.space -= outcount * 4; \ 602182080Srnoland I915_WRITE(PRB0_TAIL, outring); \ 603145132Sanholt} while(0) 604145132Sanholt 605183573Srnoland/** 606183573Srnoland * Reads a dword out of the status page, which is written to from the command 607183573Srnoland * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or 608183573Srnoland * MI_STORE_DATA_IMM. 609183573Srnoland * 610183573Srnoland * The following dwords have a reserved meaning: 611189049Srnoland * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes. 612189049Srnoland * 0x04: ring 0 head pointer 613189049Srnoland * 0x05: ring 1 head pointer (915-class) 614189049Srnoland * 0x06: ring 2 head pointer (915-class) 615189049Srnoland * 0x10-0x1b: Context status DWords (GM45) 616189049Srnoland * 0x1f: Last written status offset. (GM45) 617183573Srnoland * 618189049Srnoland * The area from dword 0x20 to 0x3ff is available for driver usage. 619183573Srnoland */ 620183573Srnoland#define READ_HWSP(dev_priv, reg) (((volatile u32*)(dev_priv->hw_status_page))[reg]) 621189049Srnoland#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) 622189049Srnoland#define I915_GEM_HWS_INDEX 0x20 623189049Srnoland#define I915_BREADCRUMB_INDEX 0x21 624183573Srnoland 625189049Srnolandextern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); 626183573Srnoland 627182080Srnoland#define IS_I830(dev) ((dev)->pci_device == 0x3577) 628182080Srnoland#define IS_845G(dev) ((dev)->pci_device == 0x2562) 629182080Srnoland#define IS_I85X(dev) ((dev)->pci_device == 0x3582) 630182080Srnoland#define IS_I855(dev) ((dev)->pci_device == 0x3582) 631182080Srnoland#define IS_I865G(dev) ((dev)->pci_device == 0x2572) 632182080Srnoland 633182080Srnoland#define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a) 634182080Srnoland#define IS_I915GM(dev) ((dev)->pci_device == 0x2592) 635182080Srnoland#define IS_I945G(dev) ((dev)->pci_device == 0x2772) 636182080Srnoland#define IS_I945GM(dev) ((dev)->pci_device == 0x27A2 ||\ 637182080Srnoland (dev)->pci_device == 0x27AE) 638182080Srnoland#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \ 639182080Srnoland (dev)->pci_device == 0x2982 || \ 640182080Srnoland (dev)->pci_device == 0x2992 || \ 641182080Srnoland (dev)->pci_device == 0x29A2 || \ 642182080Srnoland (dev)->pci_device == 0x2A02 || \ 643182080Srnoland (dev)->pci_device == 0x2A12 || \ 644182080Srnoland (dev)->pci_device == 0x2A42 || \ 645182080Srnoland (dev)->pci_device == 0x2E02 || \ 646182080Srnoland (dev)->pci_device == 0x2E12 || \ 647197951Srnoland (dev)->pci_device == 0x2E22 || \ 648197951Srnoland (dev)->pci_device == 0x2E32) 649182080Srnoland 650182080Srnoland#define IS_I965GM(dev) ((dev)->pci_device == 0x2A02) 651182080Srnoland 652182080Srnoland#define IS_GM45(dev) ((dev)->pci_device == 0x2A42) 653182080Srnoland 654182080Srnoland#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \ 655182080Srnoland (dev)->pci_device == 0x2E12 || \ 656190020Srnoland (dev)->pci_device == 0x2E22 || \ 657197951Srnoland (dev)->pci_device == 0x2E32 || \ 658190020Srnoland IS_GM45(dev)) 659182080Srnoland 660205120Srnoland#define IS_IGDG(dev) ((dev)->pci_device == 0xa001) 661205120Srnoland#define IS_IGDGM(dev) ((dev)->pci_device == 0xa011) 662205120Srnoland#define IS_IGD(dev) (IS_IGDG(dev) || IS_IGDGM(dev)) 663205120Srnoland 664182080Srnoland#define IS_G33(dev) ((dev)->pci_device == 0x29C2 || \ 665182080Srnoland (dev)->pci_device == 0x29B2 || \ 666205120Srnoland (dev)->pci_device == 0x29D2 || \ 667205126Srnoland IS_IGD(dev)) 668182080Srnoland 669182080Srnoland#define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \ 670182080Srnoland IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev)) 671182080Srnoland 672182080Srnoland#define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \ 673205120Srnoland IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev) || \ 674205120Srnoland IS_IGD(dev)) 675182080Srnoland 676182080Srnoland#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev)) 677182080Srnoland 678189049Srnoland#define PRIMARY_RINGBUFFER_SIZE (128*1024) 679189049Srnoland 680145132Sanholt#endif 681