intel.h revision 42542f5f
103b705cfSriastradh/**************************************************************************
203b705cfSriastradh
303b705cfSriastradhCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
403b705cfSriastradhCopyright © 2002 David Dawes
503b705cfSriastradh
603b705cfSriastradhAll Rights Reserved.
703b705cfSriastradh
803b705cfSriastradhPermission is hereby granted, free of charge, to any person obtaining a
903b705cfSriastradhcopy of this software and associated documentation files (the
1003b705cfSriastradh"Software"), to deal in the Software without restriction, including
1103b705cfSriastradhwithout limitation the rights to use, copy, modify, merge, publish,
1203b705cfSriastradhdistribute, sub license, and/or sell copies of the Software, and to
1303b705cfSriastradhpermit persons to whom the Software is furnished to do so, subject to
1403b705cfSriastradhthe following conditions:
1503b705cfSriastradh
1603b705cfSriastradhThe above copyright notice and this permission notice (including the
1703b705cfSriastradhnext paragraph) shall be included in all copies or substantial portions
1803b705cfSriastradhof the Software.
1903b705cfSriastradh
2003b705cfSriastradhTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2103b705cfSriastradhOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2203b705cfSriastradhMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2303b705cfSriastradhIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
2403b705cfSriastradhANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2503b705cfSriastradhTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2603b705cfSriastradhSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2703b705cfSriastradh
2803b705cfSriastradh**************************************************************************/
2903b705cfSriastradh
3003b705cfSriastradh/*
3103b705cfSriastradh * Authors:
3203b705cfSriastradh *   Keith Whitwell <keith@tungstengraphics.com>
3303b705cfSriastradh *   David Dawes <dawes@xfree86.org>
3403b705cfSriastradh *
3503b705cfSriastradh */
3603b705cfSriastradh
3703b705cfSriastradh#ifdef HAVE_CONFIG_H
3803b705cfSriastradh#include "config.h"
3903b705cfSriastradh#endif
4003b705cfSriastradh
4103b705cfSriastradh#if 0
4203b705cfSriastradh#define I830DEBUG
4303b705cfSriastradh#endif
4403b705cfSriastradh
4503b705cfSriastradh#include <stdint.h>
4603b705cfSriastradh
4703b705cfSriastradh#ifndef REMAP_RESERVED
4803b705cfSriastradh#define REMAP_RESERVED 0
4903b705cfSriastradh#endif
5003b705cfSriastradh
5103b705cfSriastradh#ifndef _I830_H_
5203b705cfSriastradh#define _I830_H_
5303b705cfSriastradh
5442542f5fSchristos#include "xorg-server.h"
5503b705cfSriastradh#include "xf86_OSproc.h"
5603b705cfSriastradh#include "compiler.h"
5703b705cfSriastradh#include "xf86Pci.h"
5803b705cfSriastradh#include "xf86Cursor.h"
5903b705cfSriastradh#include "xf86xv.h"
6003b705cfSriastradh#include "xf86Crtc.h"
6103b705cfSriastradh#include "xf86RandR12.h"
6203b705cfSriastradh
6303b705cfSriastradh#include "xorg-server.h"
6403b705cfSriastradh#include <pciaccess.h>
6503b705cfSriastradh
6603b705cfSriastradh#define _XF86DRI_SERVER_
6742542f5fSchristos#include "drm.h"
6803b705cfSriastradh#include "dri2.h"
6903b705cfSriastradh#include "intel_bufmgr.h"
7003b705cfSriastradh#include "i915_drm.h"
7103b705cfSriastradh
7203b705cfSriastradh#include "intel_driver.h"
7303b705cfSriastradh#include "intel_options.h"
7403b705cfSriastradh#include "intel_list.h"
7503b705cfSriastradh#include "compat-api.h"
7603b705cfSriastradh
7703b705cfSriastradh#if HAVE_UDEV
7803b705cfSriastradh#include <libudev.h>
7903b705cfSriastradh#endif
8003b705cfSriastradh
8142542f5fSchristos#if HAVE_DRI3
8242542f5fSchristos#include "misync.h"
8342542f5fSchristos#endif
8442542f5fSchristos
8503b705cfSriastradh/* remain compatible to xorg-server 1.6 */
8603b705cfSriastradh#ifndef MONITOR_EDID_COMPLETE_RAWDATA
8703b705cfSriastradh#define MONITOR_EDID_COMPLETE_RAWDATA EDID_COMPLETE_RAWDATA
8803b705cfSriastradh#endif
8903b705cfSriastradh
9003b705cfSriastradh#if XF86_CRTC_VERSION >= 5
9103b705cfSriastradh#define INTEL_PIXMAP_SHARING 1
9203b705cfSriastradh#endif
9303b705cfSriastradh
9442542f5fSchristos#define MAX_PIPES 4 /* consider making all users dynamic */
9542542f5fSchristos
9603b705cfSriastradhstruct intel_pixmap {
9703b705cfSriastradh	dri_bo *bo;
9803b705cfSriastradh
9903b705cfSriastradh	struct list batch;
10003b705cfSriastradh
10103b705cfSriastradh	uint16_t stride;
10203b705cfSriastradh	uint8_t tiling;
10303b705cfSriastradh	int8_t busy :2;
10403b705cfSriastradh	uint8_t dirty :1;
10503b705cfSriastradh	uint8_t offscreen :1;
10642542f5fSchristos	uint8_t pinned :5;
10703b705cfSriastradh#define PIN_SCANOUT 0x1
10842542f5fSchristos#define PIN_DRI2 0x2
10942542f5fSchristos#define PIN_DRI3 0x4
11042542f5fSchristos#define PIN_PRIME 0x8
11142542f5fSchristos#define PIN_GLAMOR 0x10
11203b705cfSriastradh};
11303b705cfSriastradh
11403b705cfSriastradh#if HAS_DEVPRIVATEKEYREC
11503b705cfSriastradhextern DevPrivateKeyRec uxa_pixmap_index;
11603b705cfSriastradh#else
11703b705cfSriastradhextern int uxa_pixmap_index;
11803b705cfSriastradh#endif
11903b705cfSriastradh
12003b705cfSriastradhstatic inline struct intel_pixmap *intel_get_pixmap_private(PixmapPtr pixmap)
12103b705cfSriastradh{
12203b705cfSriastradh#if HAS_DEVPRIVATEKEYREC
12303b705cfSriastradh	return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
12403b705cfSriastradh#else
12503b705cfSriastradh	return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
12603b705cfSriastradh#endif
12703b705cfSriastradh}
12803b705cfSriastradh
12903b705cfSriastradhstatic inline Bool intel_pixmap_is_busy(struct intel_pixmap *priv)
13003b705cfSriastradh{
13103b705cfSriastradh	if (priv->busy == -1)
13203b705cfSriastradh		priv->busy = drm_intel_bo_busy(priv->bo);
13303b705cfSriastradh	return priv->busy;
13403b705cfSriastradh}
13503b705cfSriastradh
13603b705cfSriastradhstatic inline void intel_set_pixmap_private(PixmapPtr pixmap, struct intel_pixmap *intel)
13703b705cfSriastradh{
13803b705cfSriastradh	dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, intel);
13903b705cfSriastradh}
14003b705cfSriastradh
14103b705cfSriastradhstatic inline Bool intel_pixmap_is_dirty(PixmapPtr pixmap)
14203b705cfSriastradh{
14303b705cfSriastradh	return pixmap && intel_get_pixmap_private(pixmap)->dirty;
14403b705cfSriastradh}
14503b705cfSriastradh
14603b705cfSriastradhstatic inline Bool intel_pixmap_tiled(PixmapPtr pixmap)
14703b705cfSriastradh{
14803b705cfSriastradh	return intel_get_pixmap_private(pixmap)->tiling != I915_TILING_NONE;
14903b705cfSriastradh}
15003b705cfSriastradh
15103b705cfSriastradhdri_bo *intel_get_pixmap_bo(PixmapPtr pixmap);
15203b705cfSriastradhvoid intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo);
15303b705cfSriastradh
15403b705cfSriastradh#include "common.h"
15503b705cfSriastradh
15603b705cfSriastradh#define PITCH_NONE 0
15703b705cfSriastradh
15803b705cfSriastradh/** enumeration of 3d consumers so some can maintain invariant state. */
15903b705cfSriastradhenum last_3d {
16003b705cfSriastradh	LAST_3D_OTHER,
16103b705cfSriastradh	LAST_3D_VIDEO,
16203b705cfSriastradh	LAST_3D_RENDER,
16303b705cfSriastradh	LAST_3D_ROTATION
16403b705cfSriastradh};
16503b705cfSriastradh
16603b705cfSriastradhenum dri_type {
16703b705cfSriastradh	DRI_DISABLED,
16803b705cfSriastradh	DRI_NONE,
16942542f5fSchristos	DRI_ACTIVE
17003b705cfSriastradh};
17103b705cfSriastradh
17203b705cfSriastradhtypedef struct intel_screen_private {
17303b705cfSriastradh	ScrnInfoPtr scrn;
17403b705cfSriastradh	int cpp;
17503b705cfSriastradh
17603b705cfSriastradh#define RENDER_BATCH			I915_EXEC_RENDER
17703b705cfSriastradh#define BLT_BATCH			I915_EXEC_BLT
17803b705cfSriastradh	unsigned int current_batch;
17903b705cfSriastradh
18003b705cfSriastradh	void *modes;
18103b705cfSriastradh	drm_intel_bo *front_buffer, *back_buffer;
18203b705cfSriastradh	PixmapPtr back_pixmap;
18303b705cfSriastradh	unsigned int back_name;
18403b705cfSriastradh	long front_pitch, front_tiling;
18503b705cfSriastradh
18603b705cfSriastradh	dri_bufmgr *bufmgr;
18703b705cfSriastradh
18803b705cfSriastradh	uint32_t batch_ptr[4096];
18903b705cfSriastradh	/** Byte offset in batch_ptr for the next dword to be emitted. */
19003b705cfSriastradh	unsigned int batch_used;
19103b705cfSriastradh	/** Position in batch_ptr at the start of the current BEGIN_BATCH */
19203b705cfSriastradh	unsigned int batch_emit_start;
19303b705cfSriastradh	/** Number of bytes to be emitted in the current BEGIN_BATCH. */
19403b705cfSriastradh	uint32_t batch_emitting;
19503b705cfSriastradh	dri_bo *batch_bo, *last_batch_bo[2];
19603b705cfSriastradh	/** Whether we're in a section of code that can't tolerate flushing */
19703b705cfSriastradh	Bool in_batch_atomic;
19803b705cfSriastradh	/** Ending batch_used that was verified by intel_start_batch_atomic() */
19903b705cfSriastradh	int batch_atomic_limit;
20003b705cfSriastradh	struct list batch_pixmaps;
20103b705cfSriastradh	drm_intel_bo *wa_scratch_bo;
20203b705cfSriastradh	OsTimerPtr cache_expire;
20303b705cfSriastradh
20403b705cfSriastradh	/* For Xvideo */
20503b705cfSriastradh	Bool use_overlay;
20603b705cfSriastradh#ifdef INTEL_XVMC
20703b705cfSriastradh	/* For XvMC */
20803b705cfSriastradh	Bool XvMCEnabled;
20903b705cfSriastradh#endif
21003b705cfSriastradh
21103b705cfSriastradh	CreateScreenResourcesProcPtr CreateScreenResources;
21203b705cfSriastradh
21303b705cfSriastradh	Bool shadow_present;
21403b705cfSriastradh
21503b705cfSriastradh	unsigned int tiling;
21603b705cfSriastradh#define INTEL_TILING_FB		0x1
21703b705cfSriastradh#define INTEL_TILING_2D		0x2
21803b705cfSriastradh#define INTEL_TILING_3D		0x4
21903b705cfSriastradh#define INTEL_TILING_ALL (~0)
22003b705cfSriastradh
22103b705cfSriastradh	Bool swapbuffers_wait;
22203b705cfSriastradh	Bool has_relaxed_fencing;
22303b705cfSriastradh
22403b705cfSriastradh	int Chipset;
22503b705cfSriastradh	EntityInfoPtr pEnt;
22603b705cfSriastradh	struct pci_device *PciInfo;
22703b705cfSriastradh	const struct intel_device_info *info;
22803b705cfSriastradh
22903b705cfSriastradh	unsigned int BR[20];
23003b705cfSriastradh
23103b705cfSriastradh	CloseScreenProcPtr CloseScreen;
23203b705cfSriastradh
23303b705cfSriastradh	void (*context_switch) (struct intel_screen_private *intel,
23403b705cfSriastradh				int new_mode);
23503b705cfSriastradh	void (*vertex_flush) (struct intel_screen_private *intel);
23603b705cfSriastradh	void (*batch_flush) (struct intel_screen_private *intel);
23703b705cfSriastradh	void (*batch_commit_notify) (struct intel_screen_private *intel);
23803b705cfSriastradh
23903b705cfSriastradh	struct _UxaDriver *uxa_driver;
24003b705cfSriastradh	int uxa_flags;
24103b705cfSriastradh	Bool need_sync;
24203b705cfSriastradh	int accel_pixmap_offset_alignment;
24303b705cfSriastradh	int accel_max_x;
24403b705cfSriastradh	int accel_max_y;
24503b705cfSriastradh	int max_bo_size;
24603b705cfSriastradh	int max_gtt_map_size;
24703b705cfSriastradh	int max_tiling_size;
24803b705cfSriastradh
24903b705cfSriastradh	Bool XvDisabled;	/* Xv disabled in PreInit. */
25003b705cfSriastradh	Bool XvEnabled;		/* Xv enabled for this generation. */
25103b705cfSriastradh	Bool XvPreferOverlay;
25203b705cfSriastradh
25303b705cfSriastradh	int colorKey;
25403b705cfSriastradh	XF86VideoAdaptorPtr adaptor;
25503b705cfSriastradh	ScreenBlockHandlerProcPtr BlockHandler;
25603b705cfSriastradh	Bool overlayOn;
25703b705cfSriastradh
25803b705cfSriastradh	struct {
25903b705cfSriastradh		drm_intel_bo *gen4_vs_bo;
26003b705cfSriastradh		drm_intel_bo *gen4_sf_bo;
26103b705cfSriastradh		drm_intel_bo *gen4_wm_packed_bo;
26203b705cfSriastradh		drm_intel_bo *gen4_wm_planar_bo;
26303b705cfSriastradh		drm_intel_bo *gen4_cc_bo;
26403b705cfSriastradh		drm_intel_bo *gen4_cc_vp_bo;
26503b705cfSriastradh		drm_intel_bo *gen4_sampler_bo;
26603b705cfSriastradh		drm_intel_bo *gen4_sip_kernel_bo;
26703b705cfSriastradh		drm_intel_bo *wm_prog_packed_bo;
26803b705cfSriastradh		drm_intel_bo *wm_prog_planar_bo;
26903b705cfSriastradh		drm_intel_bo *gen6_blend_bo;
27003b705cfSriastradh		drm_intel_bo *gen6_depth_stencil_bo;
27103b705cfSriastradh	} video;
27203b705cfSriastradh
27303b705cfSriastradh	/* Render accel state */
27403b705cfSriastradh	float scale_units[2][2];
27503b705cfSriastradh	/** Transform pointers for src/mask, or NULL if identity */
27603b705cfSriastradh	PictTransform *transform[2];
27703b705cfSriastradh
27803b705cfSriastradh	PixmapPtr render_source, render_mask, render_dest;
27903b705cfSriastradh	PicturePtr render_source_picture, render_mask_picture, render_dest_picture;
28003b705cfSriastradh	Bool needs_3d_invariant;
28103b705cfSriastradh	Bool needs_render_state_emit;
28203b705cfSriastradh	Bool needs_render_vertex_emit;
28303b705cfSriastradh
28403b705cfSriastradh	/* i830 render accel state */
28503b705cfSriastradh	uint32_t render_dest_format;
28603b705cfSriastradh	uint32_t cblend, ablend, s8_blendctl;
28703b705cfSriastradh
28803b705cfSriastradh	/* i915 render accel state */
28903b705cfSriastradh	PixmapPtr texture[2];
29003b705cfSriastradh	uint32_t mapstate[6];
29103b705cfSriastradh	uint32_t samplerstate[6];
29203b705cfSriastradh
29303b705cfSriastradh	struct {
29403b705cfSriastradh		int op;
29503b705cfSriastradh		uint32_t dst_format;
29603b705cfSriastradh	} i915_render_state;
29703b705cfSriastradh
29803b705cfSriastradh	struct {
29903b705cfSriastradh		int num_sf_outputs;
30003b705cfSriastradh		int drawrect;
30103b705cfSriastradh		uint32_t blend;
30203b705cfSriastradh		dri_bo *samplers;
30303b705cfSriastradh		dri_bo *kernel;
30403b705cfSriastradh	} gen6_render_state;
30503b705cfSriastradh
30603b705cfSriastradh	uint32_t prim_offset;
30703b705cfSriastradh	void (*prim_emit)(struct intel_screen_private *intel,
30803b705cfSriastradh			  int srcX, int srcY,
30903b705cfSriastradh			  int maskX, int maskY,
31003b705cfSriastradh			  int dstX, int dstY,
31103b705cfSriastradh			  int w, int h);
31203b705cfSriastradh	int floats_per_vertex;
31303b705cfSriastradh	int last_floats_per_vertex;
31403b705cfSriastradh	uint16_t vertex_offset;
31503b705cfSriastradh	uint16_t vertex_count;
31603b705cfSriastradh	uint16_t vertex_index;
31703b705cfSriastradh	uint16_t vertex_used;
31803b705cfSriastradh	uint32_t vertex_id;
31903b705cfSriastradh	float vertex_ptr[4*1024];
32003b705cfSriastradh	dri_bo *vertex_bo;
32103b705cfSriastradh
32203b705cfSriastradh	uint8_t surface_data[16*1024];
32303b705cfSriastradh	uint16_t surface_used;
32403b705cfSriastradh	uint16_t surface_table;
32503b705cfSriastradh	uint32_t surface_reloc;
32603b705cfSriastradh	dri_bo *surface_bo;
32703b705cfSriastradh
32803b705cfSriastradh	/* 965 render acceleration state */
32903b705cfSriastradh	struct gen4_render_state *gen4_render_state;
33003b705cfSriastradh
33142542f5fSchristos	/* DRI enabled this generation. */
33242542f5fSchristos	enum dri_type dri2, dri3;
33303b705cfSriastradh	int drmSubFD;
33403b705cfSriastradh	char *deviceName;
33503b705cfSriastradh
33603b705cfSriastradh	Bool use_pageflipping;
33703b705cfSriastradh	Bool use_triple_buffer;
33803b705cfSriastradh	Bool force_fallback;
33903b705cfSriastradh	Bool has_kernel_flush;
34003b705cfSriastradh	Bool needs_flush;
34103b705cfSriastradh
34242542f5fSchristos	struct _DRI2FrameEvent *pending_flip[MAX_PIPES];
34303b705cfSriastradh
34403b705cfSriastradh	/* Broken-out options. */
34503b705cfSriastradh	OptionInfoPtr Options;
34603b705cfSriastradh
34703b705cfSriastradh	/* Driver phase/state information */
34803b705cfSriastradh	Bool suspended;
34903b705cfSriastradh
35003b705cfSriastradh	enum last_3d last_3d;
35103b705cfSriastradh
35203b705cfSriastradh	/**
35303b705cfSriastradh	 * User option to print acceleration fallback info to the server log.
35403b705cfSriastradh	 */
35503b705cfSriastradh	Bool fallback_debug;
35603b705cfSriastradh	unsigned debug_flush;
35703b705cfSriastradh#if HAVE_UDEV
35803b705cfSriastradh	struct udev_monitor *uevent_monitor;
35942542f5fSchristos	pointer uevent_handler;
36003b705cfSriastradh#endif
36103b705cfSriastradh	Bool has_prime_vmap_flush;
36242542f5fSchristos
36342542f5fSchristos#if HAVE_DRI3
36442542f5fSchristos	SyncScreenFuncsRec save_sync_screen_funcs;
36542542f5fSchristos#endif
36642542f5fSchristos	void (*flush_rendering)(struct intel_screen_private *intel);
36703b705cfSriastradh} intel_screen_private;
36803b705cfSriastradh
36903b705cfSriastradh#define INTEL_INFO(intel) ((intel)->info)
37003b705cfSriastradh#define IS_GENx(intel, X) (INTEL_INFO(intel)->gen >= 8*(X) && INTEL_INFO(intel)->gen < 8*((X)+1))
37103b705cfSriastradh#define IS_GEN1(intel) IS_GENx(intel, 1)
37203b705cfSriastradh#define IS_GEN2(intel) IS_GENx(intel, 2)
37303b705cfSriastradh#define IS_GEN3(intel) IS_GENx(intel, 3)
37403b705cfSriastradh#define IS_GEN4(intel) IS_GENx(intel, 4)
37503b705cfSriastradh#define IS_GEN5(intel) IS_GENx(intel, 5)
37603b705cfSriastradh#define IS_GEN6(intel) IS_GENx(intel, 6)
37703b705cfSriastradh#define IS_GEN7(intel) IS_GENx(intel, 7)
37803b705cfSriastradh#define IS_HSW(intel) (INTEL_INFO(intel)->gen == 075)
37903b705cfSriastradh
38003b705cfSriastradh/* Some chips have specific errata (or limits) that we need to workaround. */
38103b705cfSriastradh#define IS_I830(intel) ((intel)->PciInfo->device_id == PCI_CHIP_I830_M)
38203b705cfSriastradh#define IS_845G(intel) ((intel)->PciInfo->device_id == PCI_CHIP_845_G)
38303b705cfSriastradh#define IS_I865G(intel) ((intel)->PciInfo->device_id == PCI_CHIP_I865_G)
38403b705cfSriastradh
38503b705cfSriastradh#define IS_I915G(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I915_G || (intel)->PciInfo->device_id == PCI_CHIP_E7221_G)
38603b705cfSriastradh#define IS_I915GM(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I915_GM)
38703b705cfSriastradh
38803b705cfSriastradh#define IS_965_Q(pI810) ((intel)->PciInfo->device_id == PCI_CHIP_I965_Q)
38903b705cfSriastradh
39003b705cfSriastradh/* supports Y tiled surfaces (pre-965 Mesa isn't ready yet) */
39103b705cfSriastradh#define SUPPORTS_YTILING(pI810) (INTEL_INFO(intel)->gen >= 040)
39203b705cfSriastradh#define HAS_BLT(pI810) (INTEL_INFO(intel)->gen >= 060)
39303b705cfSriastradh
39403b705cfSriastradh#ifndef I915_PARAM_HAS_PRIME_VMAP_FLUSH
39503b705cfSriastradh#define I915_PARAM_HAS_PRIME_VMAP_FLUSH 21
39603b705cfSriastradh#endif
39703b705cfSriastradh
39803b705cfSriastradhenum {
39903b705cfSriastradh	DEBUG_FLUSH_BATCHES = 0x1,
40003b705cfSriastradh	DEBUG_FLUSH_CACHES = 0x2,
40103b705cfSriastradh	DEBUG_FLUSH_WAIT = 0x4,
40203b705cfSriastradh};
40303b705cfSriastradh
40403b705cfSriastradhextern Bool intel_mode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp);
40503b705cfSriastradhextern void intel_mode_init(struct intel_screen_private *intel);
40603b705cfSriastradhextern void intel_mode_disable_unused_functions(ScrnInfoPtr scrn);
40703b705cfSriastradhextern void intel_mode_remove_fb(intel_screen_private *intel);
40803b705cfSriastradhextern void intel_mode_close(intel_screen_private *intel);
40903b705cfSriastradhextern void intel_mode_fini(intel_screen_private *intel);
41042542f5fSchristosextern int intel_mode_read_drm_events(intel_screen_private *intel);
41142542f5fSchristosextern void intel_mode_hotplug(intel_screen_private *intel);
41242542f5fSchristos
41342542f5fSchristostypedef void (*intel_drm_handler_proc)(ScrnInfoPtr scrn,
41442542f5fSchristos                                       xf86CrtcPtr crtc,
41542542f5fSchristos                                       uint64_t seq,
41642542f5fSchristos                                       uint64_t usec,
41742542f5fSchristos                                       void *data);
41842542f5fSchristos
41942542f5fSchristostypedef void (*intel_drm_abort_proc)(ScrnInfoPtr scrn,
42042542f5fSchristos                                     xf86CrtcPtr crtc,
42142542f5fSchristos                                     void *data);
42242542f5fSchristos
42342542f5fSchristosextern uint32_t intel_drm_queue_alloc(ScrnInfoPtr scrn, xf86CrtcPtr crtc, void *data, intel_drm_handler_proc handler, intel_drm_abort_proc abort);
42442542f5fSchristosextern void intel_drm_abort(ScrnInfoPtr scrn, Bool (*match)(void *data, void *match_data), void *match_data);
42503b705cfSriastradh
42603b705cfSriastradhextern int intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc);
42703b705cfSriastradhextern int intel_crtc_id(xf86CrtcPtr crtc);
42803b705cfSriastradhextern int intel_output_dpms_status(xf86OutputPtr output);
42903b705cfSriastradhextern void intel_copy_fb(ScrnInfoPtr scrn);
43003b705cfSriastradh
43142542f5fSchristosint
43242542f5fSchristosintel_get_crtc_msc_ust(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint64_t *msc, uint64_t *ust);
43342542f5fSchristos
43442542f5fSchristosuint32_t
43542542f5fSchristosintel_crtc_msc_to_sequence(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint64_t expect);
43642542f5fSchristos
43742542f5fSchristosuint64_t
43842542f5fSchristosintel_sequence_to_crtc_msc(xf86CrtcPtr crtc, uint32_t sequence);
43942542f5fSchristos
44003b705cfSriastradhenum DRI2FrameEventType {
44103b705cfSriastradh	DRI2_SWAP,
44203b705cfSriastradh	DRI2_SWAP_CHAIN,
44303b705cfSriastradh	DRI2_FLIP,
44403b705cfSriastradh	DRI2_WAITMSC,
44503b705cfSriastradh};
44603b705cfSriastradh
44703b705cfSriastradh#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,7,99,3,0)
44803b705cfSriastradhtypedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type,
44903b705cfSriastradh				 CARD64 ust, CARD64 msc, CARD64 sbc);
45003b705cfSriastradh#endif
45103b705cfSriastradh
45242542f5fSchristostypedef void (*intel_pageflip_handler_proc) (uint64_t frame,
45342542f5fSchristos                                             uint64_t usec,
45442542f5fSchristos                                             void *data);
45542542f5fSchristos
45642542f5fSchristostypedef void (*intel_pageflip_abort_proc) (void *data);
45742542f5fSchristos
45803b705cfSriastradhtypedef struct _DRI2FrameEvent {
45903b705cfSriastradh	struct intel_screen_private *intel;
46003b705cfSriastradh
46103b705cfSriastradh	XID drawable_id;
46203b705cfSriastradh	ClientPtr client;
46303b705cfSriastradh	enum DRI2FrameEventType type;
46403b705cfSriastradh	int frame;
46503b705cfSriastradh	int pipe;
46603b705cfSriastradh
46703b705cfSriastradh	struct list drawable_resource, client_resource;
46803b705cfSriastradh
46903b705cfSriastradh	/* for swaps & flips only */
47003b705cfSriastradh	DRI2SwapEventPtr event_complete;
47103b705cfSriastradh	void *event_data;
47203b705cfSriastradh	DRI2BufferPtr front;
47303b705cfSriastradh	DRI2BufferPtr back;
47403b705cfSriastradh
47503b705cfSriastradh	struct _DRI2FrameEvent *chain;
47603b705cfSriastradh} DRI2FrameEventRec, *DRI2FrameEventPtr;
47703b705cfSriastradh
47803b705cfSriastradhextern Bool intel_do_pageflip(intel_screen_private *intel,
47903b705cfSriastradh			      dri_bo *new_front,
48042542f5fSchristos			      int ref_crtc_hw_id,
48142542f5fSchristos			      Bool async,
48242542f5fSchristos			      void *pageflip_data,
48342542f5fSchristos			      intel_pageflip_handler_proc pageflip_handler,
48442542f5fSchristos			      intel_pageflip_abort_proc pageflip_abort);
48503b705cfSriastradh
48603b705cfSriastradhstatic inline intel_screen_private *
48703b705cfSriastradhintel_get_screen_private(ScrnInfoPtr scrn)
48803b705cfSriastradh{
48903b705cfSriastradh	return (intel_screen_private *)(scrn->driverPrivate);
49003b705cfSriastradh}
49103b705cfSriastradh
49203b705cfSriastradh#ifndef ARRAY_SIZE
49303b705cfSriastradh#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
49403b705cfSriastradh#endif
49503b705cfSriastradh
49603b705cfSriastradh#ifndef ALIGN
49703b705cfSriastradh#define ALIGN(i,m)	(((i) + (m) - 1) & ~((m) - 1))
49803b705cfSriastradh#endif
49903b705cfSriastradh
50003b705cfSriastradh#ifndef MIN
50103b705cfSriastradh#define MIN(a,b)	((a) < (b) ? (a) : (b))
50203b705cfSriastradh#endif
50303b705cfSriastradh
50403b705cfSriastradhstatic inline unsigned long intel_pixmap_pitch(PixmapPtr pixmap)
50503b705cfSriastradh{
50603b705cfSriastradh	return (unsigned long)pixmap->devKind;
50703b705cfSriastradh}
50803b705cfSriastradh
50903b705cfSriastradh/* Batchbuffer support macros and functions */
51003b705cfSriastradh#include "intel_batchbuffer.h"
51103b705cfSriastradh
51203b705cfSriastradh/* I830 specific functions */
51303b705cfSriastradhextern void IntelEmitInvarientState(ScrnInfoPtr scrn);
51403b705cfSriastradhextern void I830EmitInvarientState(ScrnInfoPtr scrn);
51503b705cfSriastradhextern void I915EmitInvarientState(ScrnInfoPtr scrn);
51603b705cfSriastradh
51703b705cfSriastradhextern void I830EmitFlush(ScrnInfoPtr scrn);
51803b705cfSriastradh
51903b705cfSriastradhextern void I830InitVideo(ScreenPtr pScreen);
52003b705cfSriastradhextern xf86CrtcPtr intel_covering_crtc(ScrnInfoPtr scrn, BoxPtr box,
52103b705cfSriastradh				      xf86CrtcPtr desired, BoxPtr crtc_box_ret);
52203b705cfSriastradh
52303b705cfSriastradhBool I830DRI2ScreenInit(ScreenPtr pScreen);
52403b705cfSriastradhvoid I830DRI2CloseScreen(ScreenPtr pScreen);
52503b705cfSriastradhvoid I830DRI2FrameEventHandler(unsigned int frame, unsigned int tv_sec,
52603b705cfSriastradh			       unsigned int tv_usec, DRI2FrameEventPtr flip_info);
52703b705cfSriastradhvoid I830DRI2FlipEventHandler(unsigned int frame, unsigned int tv_sec,
52803b705cfSriastradh			      unsigned int tv_usec, DRI2FrameEventPtr flip_info);
52903b705cfSriastradh
53042542f5fSchristos/* intel_dri3.c */
53142542f5fSchristosBool intel_dri3_screen_init(ScreenPtr screen);
53242542f5fSchristos
53303b705cfSriastradhextern Bool intel_crtc_on(xf86CrtcPtr crtc);
53403b705cfSriastradhint intel_crtc_to_pipe(xf86CrtcPtr crtc);
53503b705cfSriastradh
53603b705cfSriastradh/* intel_memory.c */
53703b705cfSriastradhunsigned long intel_get_fence_size(intel_screen_private *intel, unsigned long size);
53803b705cfSriastradhunsigned long intel_get_fence_pitch(intel_screen_private *intel, unsigned long pitch,
53903b705cfSriastradh				   uint32_t tiling_mode);
54042542f5fSchristosBool intel_check_display_stride(ScrnInfoPtr scrn, int stride, Bool tiling);
54142542f5fSchristosvoid intel_set_gem_max_sizes(ScrnInfoPtr scrn);
54203b705cfSriastradh
54303b705cfSriastradhdrm_intel_bo *intel_allocate_framebuffer(ScrnInfoPtr scrn,
54442542f5fSchristos					 int width, int height, int cpp,
54542542f5fSchristos					 int *out_stride,
54642542f5fSchristos					 uint32_t *out_tiling);
54703b705cfSriastradh
54803b705cfSriastradh/* i830_render.c */
54903b705cfSriastradhBool i830_check_composite(int op,
55003b705cfSriastradh			  PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
55103b705cfSriastradh			  int width, int height);
55203b705cfSriastradhBool i830_check_composite_target(PixmapPtr pixmap);
55303b705cfSriastradhBool i830_check_composite_texture(ScreenPtr screen, PicturePtr picture);
55403b705cfSriastradhBool i830_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
55503b705cfSriastradh			    PicturePtr dest, PixmapPtr sourcecPixmap,
55603b705cfSriastradh			    PixmapPtr maskPixmap, PixmapPtr destPixmap);
55703b705cfSriastradhvoid i830_composite(PixmapPtr dest, int srcX, int srcY,
55803b705cfSriastradh		    int maskX, int maskY, int dstX, int dstY, int w, int h);
55903b705cfSriastradhvoid i830_vertex_flush(intel_screen_private *intel);
56003b705cfSriastradh
56103b705cfSriastradh/* i915_render.c */
56203b705cfSriastradhBool i915_check_composite(int op,
56303b705cfSriastradh			  PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
56403b705cfSriastradh			  int width, int height);
56503b705cfSriastradhBool i915_check_composite_target(PixmapPtr pixmap);
56603b705cfSriastradhBool i915_check_composite_texture(ScreenPtr screen, PicturePtr picture);
56703b705cfSriastradhBool i915_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
56803b705cfSriastradh			    PicturePtr dest, PixmapPtr sourcecPixmap,
56903b705cfSriastradh			    PixmapPtr maskPixmap, PixmapPtr destPixmap);
57003b705cfSriastradhvoid i915_composite(PixmapPtr dest, int srcX, int srcY,
57103b705cfSriastradh		    int maskX, int maskY, int dstX, int dstY, int w, int h);
57203b705cfSriastradhvoid i915_vertex_flush(intel_screen_private *intel);
57303b705cfSriastradhvoid i915_batch_commit_notify(intel_screen_private *intel);
57403b705cfSriastradhvoid i830_batch_commit_notify(intel_screen_private *intel);
57503b705cfSriastradh/* i965_render.c */
57603b705cfSriastradhunsigned int gen4_render_state_size(ScrnInfoPtr scrn);
57703b705cfSriastradhvoid gen4_render_state_init(ScrnInfoPtr scrn);
57803b705cfSriastradhvoid gen4_render_state_cleanup(ScrnInfoPtr scrn);
57903b705cfSriastradhBool i965_check_composite(int op,
58003b705cfSriastradh			  PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
58103b705cfSriastradh			  int width, int height);
58203b705cfSriastradhBool i965_check_composite_texture(ScreenPtr screen, PicturePtr picture);
58303b705cfSriastradhBool i965_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
58403b705cfSriastradh			    PicturePtr dest, PixmapPtr sourcecPixmap,
58503b705cfSriastradh			    PixmapPtr maskPixmap, PixmapPtr destPixmap);
58603b705cfSriastradhvoid i965_composite(PixmapPtr dest, int srcX, int srcY,
58703b705cfSriastradh		    int maskX, int maskY, int dstX, int dstY, int w, int h);
58803b705cfSriastradh
58903b705cfSriastradhvoid i965_vertex_flush(intel_screen_private *intel);
59003b705cfSriastradhvoid i965_batch_flush(intel_screen_private *intel);
59103b705cfSriastradhvoid i965_batch_commit_notify(intel_screen_private *intel);
59203b705cfSriastradh
59303b705cfSriastradh/* i965_3d.c */
59403b705cfSriastradhvoid gen6_upload_invariant_states(intel_screen_private *intel);
59503b705cfSriastradhvoid gen6_upload_viewport_state_pointers(intel_screen_private *intel,
59603b705cfSriastradh					 drm_intel_bo *cc_vp_bo);
59703b705cfSriastradhvoid gen7_upload_viewport_state_pointers(intel_screen_private *intel,
59803b705cfSriastradh					 drm_intel_bo *cc_vp_bo);
59903b705cfSriastradhvoid gen6_upload_urb(intel_screen_private *intel);
60003b705cfSriastradhvoid gen7_upload_urb(intel_screen_private *intel);
60103b705cfSriastradhvoid gen6_upload_cc_state_pointers(intel_screen_private *intel,
60203b705cfSriastradh				   drm_intel_bo *blend_bo, drm_intel_bo *cc_bo,
60303b705cfSriastradh				   drm_intel_bo *depth_stencil_bo,
60403b705cfSriastradh				   uint32_t blend_offset);
60503b705cfSriastradhvoid gen7_upload_cc_state_pointers(intel_screen_private *intel,
60603b705cfSriastradh				   drm_intel_bo *blend_bo, drm_intel_bo *cc_bo,
60703b705cfSriastradh				   drm_intel_bo *depth_stencil_bo,
60803b705cfSriastradh				   uint32_t blend_offset);
60903b705cfSriastradhvoid gen6_upload_sampler_state_pointers(intel_screen_private *intel,
61003b705cfSriastradh					drm_intel_bo *sampler_bo);
61103b705cfSriastradhvoid gen7_upload_sampler_state_pointers(intel_screen_private *intel,
61203b705cfSriastradh					drm_intel_bo *sampler_bo);
61303b705cfSriastradhvoid gen7_upload_bypass_states(intel_screen_private *intel);
61403b705cfSriastradhvoid gen6_upload_gs_state(intel_screen_private *intel);
61503b705cfSriastradhvoid gen6_upload_vs_state(intel_screen_private *intel);
61603b705cfSriastradhvoid gen6_upload_clip_state(intel_screen_private *intel);
61703b705cfSriastradhvoid gen6_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset);
61803b705cfSriastradhvoid gen7_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset);
61903b705cfSriastradhvoid gen6_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset);
62003b705cfSriastradhvoid gen7_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset);
62103b705cfSriastradhvoid gen6_upload_depth_buffer_state(intel_screen_private *intel);
62203b705cfSriastradhvoid gen7_upload_depth_buffer_state(intel_screen_private *intel);
62303b705cfSriastradh
62403b705cfSriastradhBool intel_transform_is_affine(PictTransformPtr t);
62503b705cfSriastradhBool
62603b705cfSriastradhintel_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
62703b705cfSriastradh				 float *x_out, float *y_out);
62803b705cfSriastradh
62903b705cfSriastradhBool
63003b705cfSriastradhintel_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
63103b705cfSriastradh				    float *x_out, float *y_out, float *z_out);
63203b705cfSriastradh
63303b705cfSriastradhstatic inline void
63403b705cfSriastradhintel_debug_fallback(ScrnInfoPtr scrn, const char *format, ...) _X_ATTRIBUTE_PRINTF(2, 3);
63503b705cfSriastradh
63603b705cfSriastradhstatic inline void
63703b705cfSriastradhintel_debug_fallback(ScrnInfoPtr scrn, const char *format, ...)
63803b705cfSriastradh{
63903b705cfSriastradh	intel_screen_private *intel = intel_get_screen_private(scrn);
64003b705cfSriastradh	va_list ap;
64103b705cfSriastradh
64203b705cfSriastradh	va_start(ap, format);
64303b705cfSriastradh	if (intel->fallback_debug) {
64403b705cfSriastradh		xf86DrvMsg(scrn->scrnIndex, X_INFO, "fallback: ");
64503b705cfSriastradh		LogVMessageVerb(X_INFO, 1, format, ap);
64603b705cfSriastradh	}
64703b705cfSriastradh	va_end(ap);
64803b705cfSriastradh}
64903b705cfSriastradh
65003b705cfSriastradhstatic inline Bool
65103b705cfSriastradhintel_check_pitch_2d(PixmapPtr pixmap)
65203b705cfSriastradh{
65303b705cfSriastradh	uint32_t pitch = intel_pixmap_pitch(pixmap);
65403b705cfSriastradh	if (pitch > KB(32)) {
65503b705cfSriastradh		ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
65603b705cfSriastradh		intel_debug_fallback(scrn, "pitch exceeds 2d limit 32K\n");
65703b705cfSriastradh		return FALSE;
65803b705cfSriastradh	}
65903b705cfSriastradh	return TRUE;
66003b705cfSriastradh}
66103b705cfSriastradh
66203b705cfSriastradh/* For pre-965 chip only, as they have 8KB limit for 3D */
66303b705cfSriastradhstatic inline Bool
66403b705cfSriastradhintel_check_pitch_3d(PixmapPtr pixmap)
66503b705cfSriastradh{
66603b705cfSriastradh	uint32_t pitch = intel_pixmap_pitch(pixmap);
66703b705cfSriastradh	if (pitch > KB(8)) {
66803b705cfSriastradh		ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
66903b705cfSriastradh		intel_debug_fallback(scrn, "pitch exceeds 3d limit 8K\n");
67003b705cfSriastradh		return FALSE;
67103b705cfSriastradh	}
67203b705cfSriastradh	return TRUE;
67303b705cfSriastradh}
67403b705cfSriastradh
67503b705cfSriastradh/**
67603b705cfSriastradh * Little wrapper around drm_intel_bo_reloc to return the initial value you
67703b705cfSriastradh * should stuff into the relocation entry.
67803b705cfSriastradh *
67903b705cfSriastradh * If only we'd done this before settling on the library API.
68003b705cfSriastradh */
68103b705cfSriastradhstatic inline uint32_t
68203b705cfSriastradhintel_emit_reloc(drm_intel_bo * bo, uint32_t offset,
68303b705cfSriastradh		 drm_intel_bo * target_bo, uint32_t target_offset,
68403b705cfSriastradh		 uint32_t read_domains, uint32_t write_domain)
68503b705cfSriastradh{
68603b705cfSriastradh	drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset,
68703b705cfSriastradh				read_domains, write_domain);
68803b705cfSriastradh
68903b705cfSriastradh	return target_bo->offset + target_offset;
69003b705cfSriastradh}
69103b705cfSriastradh
69203b705cfSriastradhstatic inline drm_intel_bo *intel_bo_alloc_for_data(intel_screen_private *intel,
69303b705cfSriastradh						    const void *data,
69403b705cfSriastradh						    unsigned int size,
69503b705cfSriastradh						    const char *name)
69603b705cfSriastradh{
69703b705cfSriastradh	drm_intel_bo *bo;
69803b705cfSriastradh	int ret;
69903b705cfSriastradh
70003b705cfSriastradh	bo = drm_intel_bo_alloc(intel->bufmgr, name, size, 4096);
70103b705cfSriastradh	assert(bo);
70203b705cfSriastradh
70303b705cfSriastradh	ret = drm_intel_bo_subdata(bo, 0, size, data);
70403b705cfSriastradh	assert(ret == 0);
70503b705cfSriastradh
70603b705cfSriastradh	return bo;
70703b705cfSriastradh	(void)ret;
70803b705cfSriastradh}
70903b705cfSriastradh
71003b705cfSriastradhvoid intel_debug_flush(ScrnInfoPtr scrn);
71103b705cfSriastradh
71203b705cfSriastradhstatic inline PixmapPtr get_drawable_pixmap(DrawablePtr drawable)
71303b705cfSriastradh{
71403b705cfSriastradh	ScreenPtr screen = drawable->pScreen;
71503b705cfSriastradh
71603b705cfSriastradh	if (drawable->type == DRAWABLE_PIXMAP)
71703b705cfSriastradh		return (PixmapPtr) drawable;
71803b705cfSriastradh	else
71903b705cfSriastradh		return screen->GetWindowPixmap((WindowPtr) drawable);
72003b705cfSriastradh}
72103b705cfSriastradh
72203b705cfSriastradhstatic inline Bool pixmap_is_scanout(PixmapPtr pixmap)
72303b705cfSriastradh{
72403b705cfSriastradh	ScreenPtr screen = pixmap->drawable.pScreen;
72503b705cfSriastradh
72603b705cfSriastradh	return pixmap == screen->GetScreenPixmap(screen);
72703b705cfSriastradh}
72803b705cfSriastradh
72903b705cfSriastradhBool intel_uxa_init(ScreenPtr pScreen);
73003b705cfSriastradhBool intel_uxa_create_screen_resources(ScreenPtr pScreen);
73103b705cfSriastradhvoid intel_uxa_block_handler(intel_screen_private *intel);
73203b705cfSriastradhBool intel_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table,
73303b705cfSriastradh			      int num_bos);
73403b705cfSriastradh
73503b705cfSriastradhstatic inline Bool intel_pixmap_is_offscreen(PixmapPtr pixmap)
73603b705cfSriastradh{
73703b705cfSriastradh	struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
73803b705cfSriastradh	return priv && priv->offscreen;
73903b705cfSriastradh}
74003b705cfSriastradh
74142542f5fSchristos#if HAVE_DRI3
74242542f5fSchristosBool intel_sync_init(ScreenPtr screen);
74342542f5fSchristosvoid intel_sync_close(ScreenPtr screen);
74442542f5fSchristos#else
74542542f5fSchristosstatic inline Bool intel_sync_init(ScreenPtr screen) { return 0; }
74642542f5fSchristosvoid intel_sync_close(ScreenPtr screen);
74742542f5fSchristos#endif
74842542f5fSchristos
74942542f5fSchristos/*
75042542f5fSchristos * intel_present.c
75142542f5fSchristos */
75242542f5fSchristos
75342542f5fSchristos#if 0
75442542f5fSchristos#define DebugPresent(x) ErrorF x
75542542f5fSchristos#else
75642542f5fSchristos#define DebugPresent(x)
75742542f5fSchristos#endif
75842542f5fSchristos
75942542f5fSchristos#if HAVE_PRESENT
76042542f5fSchristosBool intel_present_screen_init(ScreenPtr screen);
76142542f5fSchristos#else
76242542f5fSchristosstatic inline Bool intel_present_screen_init(ScreenPtr screen) { return 0; }
76342542f5fSchristos#endif
76442542f5fSchristos
76503b705cfSriastradh#endif /* _I830_H_ */
766