diff options
Diffstat (limited to 'shared-core')
| -rw-r--r-- | shared-core/i915_dma.c | 135 | ||||
| -rw-r--r-- | shared-core/i915_drv.h | 474 | 
2 files changed, 557 insertions, 52 deletions
diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index aed3eea1..a5f1473a 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -31,13 +31,6 @@  #include "i915_drm.h"  #include "i915_drv.h" -#define IS_I965G(dev)  (dev->pci_device == 0x2972 || \ -			dev->pci_device == 0x2982 || \ -			dev->pci_device == 0x2992 || \ -			dev->pci_device == 0x29A2 || \ -			dev->pci_device == 0x2A02) - -  /* Really want an OS-independent resettable timer.  Would like to have   * this loop run for (eg) 3 sec, but have the timer reset every time   * the head pointer changes, so that EBUSY only happens if the ring @@ -87,6 +80,7 @@ void i915_kernel_lost_context(drm_device_t * dev)  static int i915_dma_cleanup(drm_device_t * dev)  { +	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;  	/* Make sure interrupts are disabled here because the uninstall ioctl  	 * may not have been called from userspace and after dev_private  	 * is freed, it's too late. @@ -94,25 +88,16 @@ static int i915_dma_cleanup(drm_device_t * dev)  	if (dev->irq)  		drm_irq_uninstall(dev); -	if (dev->dev_private) { -		drm_i915_private_t *dev_priv = -		    (drm_i915_private_t *) dev->dev_private; - -		if (dev_priv->ring.virtual_start) { -			drm_core_ioremapfree(&dev_priv->ring.map, dev); -		} - -		if (dev_priv->status_page_dmah) { -			drm_pci_free(dev, dev_priv->status_page_dmah); -			/* Need to rewrite hardware status page */ -			I915_WRITE(0x02080, 0x1ffff000); -		} - -		drm_free(dev->dev_private, sizeof(drm_i915_private_t), -			 DRM_MEM_DRIVER); - -		dev->dev_private = NULL; +	if (dev_priv->status_page_dmah) { +		drm_pci_free(dev, dev_priv->status_page_dmah); +		dev_priv->status_page_dmah = NULL; +		dev_priv->hw_status_page = NULL; +		dev_priv->dma_status_page = 0; +		/* Need to rewrite hardware status page */ +		I915_WRITE(0x02080, 0x1ffff000);  	} +	 +	dev_priv->sarea_priv = NULL;  	return 0;  } @@ -121,8 +106,6 @@ static int i915_initialize(drm_device_t * dev,  			   drm_i915_private_t * dev_priv,  			   drm_i915_init_t * init)  { -	memset(dev_priv, 0, sizeof(drm_i915_private_t)); -  	DRM_GETSAREA();  	if (!dev_priv->sarea) {  		DRM_ERROR("can not find sarea!\n"); @@ -131,14 +114,6 @@ static int i915_initialize(drm_device_t * dev,  		return DRM_ERR(EINVAL);  	} -	dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset); -	if (!dev_priv->mmio_map) { -		dev->dev_private = (void *)dev_priv; -		i915_dma_cleanup(dev); -		DRM_ERROR("can not find mmio map!\n"); -		return DRM_ERR(EINVAL); -	} -  	dev_priv->sarea_priv = (drm_i915_sarea_t *)  	    ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset); @@ -195,7 +170,11 @@ static int i915_initialize(drm_device_t * dev,  	I915_WRITE(0x02080, dev_priv->dma_status_page);  	DRM_DEBUG("Enabled hardware status page\n"); -	dev->dev_private = (void *)dev_priv; + +	/* this probably doesn't belong here - TODO */ +	drm_framebuffer_set_object(dev, dev_priv->sarea_priv->front_handle); +	drm_set_desired_modes(dev); +  	return 0;  } @@ -237,7 +216,7 @@ static int i915_dma_resume(drm_device_t * dev)  static int i915_dma_init(DRM_IOCTL_ARGS)  {  	DRM_DEVICE; -	drm_i915_private_t *dev_priv; +	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;  	drm_i915_init_t init;  	int retcode = 0; @@ -246,10 +225,6 @@ static int i915_dma_init(DRM_IOCTL_ARGS)  	switch (init.func) {  	case I915_INIT_DMA: -		dev_priv = drm_alloc(sizeof(drm_i915_private_t), -				     DRM_MEM_DRIVER); -		if (dev_priv == NULL) -			return DRM_ERR(ENOMEM);  		retcode = i915_initialize(dev, dev_priv, &init);  		break;  	case I915_CLEANUP_DMA: @@ -882,6 +857,18 @@ static int i915_mmio(DRM_IOCTL_ARGS)  int i915_driver_load(drm_device_t *dev, unsigned long flags)  { +	drm_i915_private_t *dev_priv; +	int ret; +	unsigned long mmiobase, mmiolen; + +	dev_priv = drm_alloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER); +	if (dev_priv == NULL) +		return DRM_ERR(ENOMEM); + +	memset(dev_priv, 0, sizeof(drm_i915_private_t)); +	dev->dev_private = (void *)dev_priv; +//	dev_priv->flags = flags; +  	/* i915 has 4 more counters */  	dev->counters += 4;  	dev->types[6] = _DRM_STAT_IRQ; @@ -889,25 +876,55 @@ int i915_driver_load(drm_device_t *dev, unsigned long flags)  	dev->types[8] = _DRM_STAT_SECONDARY;  	dev->types[9] = _DRM_STAT_DMA; +	if (IS_I9XX(dev)) { +		dev_priv->mmiobase = drm_get_resource_start(dev, 0); +		dev_priv->mmiolen = drm_get_resource_len(dev, 0); +	} else if (drm_get_resource_start(dev, 1)) { +		dev_priv->mmiobase = drm_get_resource_start(dev, 1); +		dev_priv->mmiolen = drm_get_resource_len(dev, 1); +	} else { +		DRM_ERROR("Unable to find MMIO registers\n"); +		return -ENODEV; +	} + +	ret = drm_addmap(dev, dev_priv->mmiobase, dev_priv->mmiolen, +			 _DRM_REGISTERS, _DRM_READ_ONLY, &dev_priv->mmio_map); +	if (ret != 0) { +		DRM_ERROR("Cannot add mapping for MMIO registers\n"); +		return ret; +	} +  +	DRM_DEBUG("dev_priv->mmio map is %08X\n", dev_priv->mmio_map); +	intel_modeset_init(dev); +	return 0; +} + +int i915_driver_unload(drm_device_t *dev) +{ +	drm_i915_private_t *dev_priv = dev->dev_private; + +	intel_modeset_cleanup(dev); +	drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); + +	dev->dev_private = NULL;  	return 0;  }  void i915_driver_lastclose(drm_device_t * dev)  { -	if (dev->dev_private) { -		drm_i915_private_t *dev_priv = dev->dev_private; -		i915_do_cleanup_pageflip(dev); -		i915_mem_takedown(&(dev_priv->agp_heap)); -	} +	drm_i915_private_t *dev_priv = dev->dev_private; +	 +	i915_mem_takedown(&(dev_priv->agp_heap)); +  	i915_dma_cleanup(dev); + +	dev_priv->mmio_map = NULL;  }  void i915_driver_preclose(drm_device_t * dev, DRMFILE filp)  { -	if (dev->dev_private) { -		drm_i915_private_t *dev_priv = dev->dev_private; -		i915_mem_release(dev, filp, dev_priv->agp_heap); -	} +	drm_i915_private_t *dev_priv = dev->dev_private; +	i915_mem_release(dev, filp, dev_priv->agp_heap);  }  drm_ioctl_desc_t i915_ioctls[] = { @@ -950,8 +967,22 @@ int i915_driver_device_is_agp(drm_device_t * dev)  int i915_driver_firstopen(struct drm_device *dev)  { -#ifdef I915_HAVE_BUFFER +	drm_i915_private_t *dev_priv = dev->dev_private; +	int ret; +	DRM_DEBUG("\n");  	drm_bo_driver_init(dev); -#endif + +	if (!dev_priv->mmio_map) { +		ret = drm_addmap(dev, dev_priv->mmiobase, dev_priv->mmiolen, +				 _DRM_REGISTERS, _DRM_READ_ONLY, &dev_priv->mmio_map); +		if (ret != 0) { +			DRM_ERROR("Cannot add mapping for MMIO registers\n"); +			return ret; +		} +	} +  +	DRM_DEBUG("dev_priv->mmio map is %08X\n", dev_priv->mmio_map); +  	return 0;  } + diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index e8a7be29..f37f5873 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -92,6 +92,9 @@ typedef struct drm_i915_private {  	drm_local_map_t *sarea;  	drm_local_map_t *mmio_map; +	unsigned long mmiobase; +	unsigned long mmiolen; +  	drm_i915_sarea_t *sarea_priv;  	drm_i915_ring_buffer_t ring; @@ -145,6 +148,8 @@ extern int i915_max_ioctl;  				/* i915_dma.c */  extern void i915_kernel_lost_context(drm_device_t * dev);  extern int i915_driver_load(struct drm_device *, unsigned long flags); +extern int i915_driver_unload(drm_device_t *dev); +extern int i915_driver_firstopen(struct drm_device *dev);  extern void i915_driver_lastclose(drm_device_t * dev);  extern void i915_driver_preclose(drm_device_t * dev, DRMFILE filp);  extern int i915_driver_device_is_agp(drm_device_t * dev); @@ -206,6 +211,12 @@ extern int i915_move(drm_buffer_object_t *bo, int evict,  #endif + +/* modesetting */ +extern void intel_modeset_init(drm_device_t *dev); +extern void intel_modeset_cleanup(drm_device_t *dev); + +  #define I915_READ(reg)          DRM_READ32(dev_priv->mmio_map, (reg))  #define I915_WRITE(reg,val)     DRM_WRITE32(dev_priv->mmio_map, (reg), (val))  #define I915_READ16(reg) 	DRM_READ16(dev_priv->mmio_map, (reg)) @@ -273,6 +284,30 @@ extern int i915_wait_ring(drm_device_t * dev, int n, const char *caller);  #define I915_VBLANK_INTERRUPT_ENABLE	(1UL<<17)  #define I915_VBLANK_CLEAR		(1UL<<1) +#define GPIOA			0x5010 +#define GPIOB			0x5014 +#define GPIOC			0x5018 +#define GPIOD			0x501c +#define GPIOE			0x5020 +#define GPIOF			0x5024 +#define GPIOG			0x5028 +#define GPIOH			0x502c +# define GPIO_CLOCK_DIR_MASK		(1 << 0) +# define GPIO_CLOCK_DIR_IN		(0 << 1) +# define GPIO_CLOCK_DIR_OUT		(1 << 1) +# define GPIO_CLOCK_VAL_MASK		(1 << 2) +# define GPIO_CLOCK_VAL_OUT		(1 << 3) +# define GPIO_CLOCK_VAL_IN		(1 << 4) +# define GPIO_CLOCK_PULLUP_DISABLE	(1 << 5) +# define GPIO_DATA_DIR_MASK		(1 << 8) +# define GPIO_DATA_DIR_IN		(0 << 9) +# define GPIO_DATA_DIR_OUT		(1 << 9) +# define GPIO_DATA_VAL_MASK		(1 << 10) +# define GPIO_DATA_VAL_OUT		(1 << 11) +# define GPIO_DATA_VAL_IN		(1 << 12) +# define GPIO_DATA_PULLUP_DISABLE	(1 << 13) + +  #define SRX_INDEX		0x3c4  #define SRX_DATA		0x3c5  #define SR01			1 @@ -281,6 +316,8 @@ extern int i915_wait_ring(drm_device_t * dev, int n, const char *caller);  #define PPCR			0x61204  #define PPCR_ON			(1<<0) +#define DVOA			0x61120 +#define DVOA_ON			(1<<31)  #define DVOB			0x61140  #define DVOB_ON			(1<<31)  #define DVOC			0x61160 @@ -363,4 +400,441 @@ extern int i915_wait_ring(drm_device_t * dev, int n, const char *caller);  #define READ_BREADCRUMB(dev_priv)  (((volatile u32*)(dev_priv->hw_status_page))[5])  #define READ_HWSP(dev_priv, reg)  (((volatile u32*)(dev_priv->hw_status_page))[reg]) + +#define BLC_PWM_CTL		0x61254 +#define BACKLIGHT_MODULATION_FREQ_SHIFT		(17) +/** + * This is the most significant 15 bits of the number of backlight cycles in a + * complete cycle of the modulated backlight control. + * + * The actual value is this field multiplied by two. + */ +#define BACKLIGHT_MODULATION_FREQ_MASK		(0x7fff << 17) +#define BLM_LEGACY_MODE				(1 << 16) +/** + * This is the number of cycles out of the backlight modulation cycle for which + * the backlight is on. + * + * This field must be no greater than the number of cycles in the complete + * backlight modulation cycle. + */ +#define BACKLIGHT_DUTY_CYCLE_SHIFT		(0) +#define BACKLIGHT_DUTY_CYCLE_MASK		(0xffff) + +#define I915_GCFGC			0xf0 +#define I915_LOW_FREQUENCY_ENABLE		(1 << 7) +#define I915_DISPLAY_CLOCK_190_200_MHZ		(0 << 4) +#define I915_DISPLAY_CLOCK_333_MHZ		(4 << 4) +#define I915_DISPLAY_CLOCK_MASK			(7 << 4) + +#define I855_HPLLCC			0xc0 +#define I855_CLOCK_CONTROL_MASK			(3 << 0) +#define I855_CLOCK_133_200			(0 << 0) +#define I855_CLOCK_100_200			(1 << 0) +#define I855_CLOCK_100_133			(2 << 0) +#define I855_CLOCK_166_250			(3 << 0) + +/* I830 CRTC registers */ +#define HTOTAL_A	0x60000 +#define HBLANK_A	0x60004 +#define HSYNC_A 	0x60008 +#define VTOTAL_A	0x6000c +#define VBLANK_A	0x60010 +#define VSYNC_A 	0x60014 +#define PIPEASRC	0x6001c +#define BCLRPAT_A	0x60020 +#define VSYNCSHIFT_A	0x60028 + +#define HTOTAL_B	0x61000 +#define HBLANK_B	0x61004 +#define HSYNC_B 	0x61008 +#define VTOTAL_B	0x6100c +#define VBLANK_B	0x61010 +#define VSYNC_B 	0x61014 +#define PIPEBSRC	0x6101c +#define BCLRPAT_B	0x61020 +#define VSYNCSHIFT_B	0x61028 + +#define PP_STATUS	0x61200 +# define PP_ON					(1 << 31) +/** + * Indicates that all dependencies of the panel are on: + * + * - PLL enabled + * - pipe enabled + * - LVDS/DVOB/DVOC on + */ +# define PP_READY				(1 << 30) +# define PP_SEQUENCE_NONE			(0 << 28) +# define PP_SEQUENCE_ON				(1 << 28) +# define PP_SEQUENCE_OFF			(2 << 28) +# define PP_SEQUENCE_MASK			0x30000000 +#define PP_CONTROL	0x61204 +# define POWER_TARGET_ON			(1 << 0) + +#define LVDSPP_ON       0x61208 +#define LVDSPP_OFF      0x6120c +#define PP_CYCLE        0x61210 + +#define PFIT_CONTROL	0x61230 +# define PFIT_ENABLE				(1 << 31) +# define VERT_INTERP_DISABLE			(0 << 10) +# define VERT_INTERP_BILINEAR			(1 << 10) +# define VERT_INTERP_MASK			(3 << 10) +# define VERT_AUTO_SCALE			(1 << 9) +# define HORIZ_INTERP_DISABLE			(0 << 6) +# define HORIZ_INTERP_BILINEAR			(1 << 6) +# define HORIZ_INTERP_MASK			(3 << 6) +# define HORIZ_AUTO_SCALE			(1 << 5) +# define PANEL_8TO6_DITHER_ENABLE		(1 << 3) + +#define PFIT_PGM_RATIOS	0x61234 +# define PFIT_VERT_SCALE_MASK			0xfff00000 +# define PFIT_HORIZ_SCALE_MASK			0x0000fff0 + +#define PFIT_AUTO_RATIOS	0x61238 + + +#define DPLL_A		0x06014 +#define DPLL_B		0x06018 +# define DPLL_VCO_ENABLE			(1 << 31) +# define DPLL_DVO_HIGH_SPEED			(1 << 30) +# define DPLL_SYNCLOCK_ENABLE			(1 << 29) +# define DPLL_VGA_MODE_DIS			(1 << 28) +# define DPLLB_MODE_DAC_SERIAL			(1 << 26) /* i915 */ +# define DPLLB_MODE_LVDS			(2 << 26) /* i915 */ +# define DPLL_MODE_MASK				(3 << 26) +# define DPLL_DAC_SERIAL_P2_CLOCK_DIV_10	(0 << 24) /* i915 */ +# define DPLL_DAC_SERIAL_P2_CLOCK_DIV_5		(1 << 24) /* i915 */ +# define DPLLB_LVDS_P2_CLOCK_DIV_14		(0 << 24) /* i915 */ +# define DPLLB_LVDS_P2_CLOCK_DIV_7		(1 << 24) /* i915 */ +# define DPLL_P2_CLOCK_DIV_MASK			0x03000000 /* i915 */ +# define DPLL_FPA01_P1_POST_DIV_MASK		0x00ff0000 /* i915 */ +/** + *  The i830 generation, in DAC/serial mode, defines p1 as two plus this + * bitfield, or just 2 if PLL_P1_DIVIDE_BY_TWO is set. + */ +# define DPLL_FPA01_P1_POST_DIV_MASK_I830	0x001f0000 +/** + * The i830 generation, in LVDS mode, defines P1 as the bit number set within + * this field (only one bit may be set). + */ +# define DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS	0x003f0000 +# define DPLL_FPA01_P1_POST_DIV_SHIFT		16 +# define PLL_P2_DIVIDE_BY_4			(1 << 23) /* i830, required in DVO non-gang */ +# define PLL_P1_DIVIDE_BY_TWO			(1 << 21) /* i830 */ +# define PLL_REF_INPUT_DREFCLK			(0 << 13) +# define PLL_REF_INPUT_TVCLKINA			(1 << 13) /* i830 */ +# define PLL_REF_INPUT_TVCLKINBC		(2 << 13) /* SDVO TVCLKIN */ +# define PLLB_REF_INPUT_SPREADSPECTRUMIN	(3 << 13) +# define PLL_REF_INPUT_MASK			(3 << 13) +# define PLL_LOAD_PULSE_PHASE_SHIFT		9 +/* + * Parallel to Serial Load Pulse phase selection. + * Selects the phase for the 10X DPLL clock for the PCIe + * digital display port. The range is 4 to 13; 10 or more + * is just a flip delay. The default is 6 + */ +# define PLL_LOAD_PULSE_PHASE_MASK		(0xf << PLL_LOAD_PULSE_PHASE_SHIFT) +# define DISPLAY_RATE_SELECT_FPA1		(1 << 8) + +/** + * SDVO multiplier for 945G/GM. Not used on 965. + * + * \sa DPLL_MD_UDI_MULTIPLIER_MASK + */ +# define SDVO_MULTIPLIER_MASK			0x000000ff +# define SDVO_MULTIPLIER_SHIFT_HIRES		4 +# define SDVO_MULTIPLIER_SHIFT_VGA		0 + +/** @defgroup DPLL_MD + * @{ + */ +/** Pipe A SDVO/UDI clock multiplier/divider register for G965. */ +#define DPLL_A_MD		0x0601c +/** Pipe B SDVO/UDI clock multiplier/divider register for G965. */ +#define DPLL_B_MD		0x06020 +/** + * UDI pixel divider, controlling how many pixels are stuffed into a packet. + * + * Value is pixels minus 1.  Must be set to 1 pixel for SDVO. + */ +# define DPLL_MD_UDI_DIVIDER_MASK		0x3f000000 +# define DPLL_MD_UDI_DIVIDER_SHIFT		24 +/** UDI pixel divider for VGA, same as DPLL_MD_UDI_DIVIDER_MASK. */ +# define DPLL_MD_VGA_UDI_DIVIDER_MASK		0x003f0000 +# define DPLL_MD_VGA_UDI_DIVIDER_SHIFT		16 +/** + * SDVO/UDI pixel multiplier. + * + * SDVO requires that the bus clock rate be between 1 and 2 Ghz, and the bus + * clock rate is 10 times the DPLL clock.  At low resolution/refresh rate + * modes, the bus rate would be below the limits, so SDVO allows for stuffing + * dummy bytes in the datastream at an increased clock rate, with both sides of + * the link knowing how many bytes are fill. + * + * So, for a mode with a dotclock of 65Mhz, we would want to double the clock + * rate to 130Mhz to get a bus rate of 1.30Ghz.  The DPLL clock rate would be + * set to 130Mhz, and the SDVO multiplier set to 2x in this register and + * through an SDVO command. + * + * This register field has values of multiplication factor minus 1, with + * a maximum multiplier of 5 for SDVO. + */ +# define DPLL_MD_UDI_MULTIPLIER_MASK		0x00003f00 +# define DPLL_MD_UDI_MULTIPLIER_SHIFT		8 +/** SDVO/UDI pixel multiplier for VGA, same as DPLL_MD_UDI_MULTIPLIER_MASK.  + * This best be set to the default value (3) or the CRT won't work. No, + * I don't entirely understand what this does... + */ +# define DPLL_MD_VGA_UDI_MULTIPLIER_MASK	0x0000003f +# define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT	0 +/** @} */ + +#define DPLL_TEST		0x606c +# define DPLLB_TEST_SDVO_DIV_1			(0 << 22) +# define DPLLB_TEST_SDVO_DIV_2			(1 << 22) +# define DPLLB_TEST_SDVO_DIV_4			(2 << 22) +# define DPLLB_TEST_SDVO_DIV_MASK		(3 << 22) +# define DPLLB_TEST_N_BYPASS			(1 << 19) +# define DPLLB_TEST_M_BYPASS			(1 << 18) +# define DPLLB_INPUT_BUFFER_ENABLE		(1 << 16) +# define DPLLA_TEST_N_BYPASS			(1 << 3) +# define DPLLA_TEST_M_BYPASS			(1 << 2) +# define DPLLA_INPUT_BUFFER_ENABLE		(1 << 0) + +#define ADPA			0x61100 +#define ADPA_DAC_ENABLE 	(1<<31) +#define ADPA_DAC_DISABLE	0 +#define ADPA_PIPE_SELECT_MASK	(1<<30) +#define ADPA_PIPE_A_SELECT	0 +#define ADPA_PIPE_B_SELECT	(1<<30) +#define ADPA_USE_VGA_HVPOLARITY (1<<15) +#define ADPA_SETS_HVPOLARITY	0 +#define ADPA_VSYNC_CNTL_DISABLE (1<<11) +#define ADPA_VSYNC_CNTL_ENABLE	0 +#define ADPA_HSYNC_CNTL_DISABLE (1<<10) +#define ADPA_HSYNC_CNTL_ENABLE	0 +#define ADPA_VSYNC_ACTIVE_HIGH	(1<<4) +#define ADPA_VSYNC_ACTIVE_LOW	0 +#define ADPA_HSYNC_ACTIVE_HIGH	(1<<3) +#define ADPA_HSYNC_ACTIVE_LOW	0 + +#define FPA0		0x06040 +#define FPA1		0x06044 +#define FPB0		0x06048 +#define FPB1		0x0604c +# define FP_N_DIV_MASK				0x003f0000 +# define FP_N_DIV_SHIFT				16 +# define FP_M1_DIV_MASK				0x00003f00 +# define FP_M1_DIV_SHIFT			8 +# define FP_M2_DIV_MASK				0x0000003f +# define FP_M2_DIV_SHIFT			0 + + +#define PORT_HOTPLUG_EN		0x61110 +# define SDVOB_HOTPLUG_INT_EN			(1 << 26) +# define SDVOC_HOTPLUG_INT_EN			(1 << 25) +# define TV_HOTPLUG_INT_EN			(1 << 18) +# define CRT_HOTPLUG_INT_EN			(1 << 9) +# define CRT_HOTPLUG_FORCE_DETECT		(1 << 3) + +#define PORT_HOTPLUG_STAT	0x61114 +# define CRT_HOTPLUG_INT_STATUS			(1 << 11) +# define TV_HOTPLUG_INT_STATUS			(1 << 10) +# define CRT_HOTPLUG_MONITOR_MASK		(3 << 8) +# define CRT_HOTPLUG_MONITOR_COLOR		(3 << 8) +# define CRT_HOTPLUG_MONITOR_MONO		(2 << 8) +# define CRT_HOTPLUG_MONITOR_NONE		(0 << 8) +# define SDVOC_HOTPLUG_INT_STATUS		(1 << 7) +# define SDVOB_HOTPLUG_INT_STATUS		(1 << 6) + +#define SDVOB			0x61140 +#define SDVOC			0x61160 +#define SDVO_ENABLE				(1 << 31) +#define SDVO_PIPE_B_SELECT			(1 << 30) +#define SDVO_STALL_SELECT			(1 << 29) +#define SDVO_INTERRUPT_ENABLE			(1 << 26) +/** + * 915G/GM SDVO pixel multiplier. + * + * Programmed value is multiplier - 1, up to 5x. + * + * \sa DPLL_MD_UDI_MULTIPLIER_MASK + */ +#define SDVO_PORT_MULTIPLY_MASK			(7 << 23) +#define SDVO_PORT_MULTIPLY_SHIFT		23 +#define SDVO_PHASE_SELECT_MASK			(15 << 19) +#define SDVO_PHASE_SELECT_DEFAULT		(6 << 19) +#define SDVO_CLOCK_OUTPUT_INVERT		(1 << 18) +#define SDVOC_GANG_MODE				(1 << 16) +#define SDVO_BORDER_ENABLE			(1 << 7) +#define SDVOB_PCIE_CONCURRENCY			(1 << 3) +#define SDVO_DETECTED				(1 << 2) +/* Bits to be preserved when writing */ +#define SDVOB_PRESERVE_MASK			((1 << 17) | (1 << 16) | (1 << 14)) +#define SDVOC_PRESERVE_MASK			(1 << 17) + +/** @defgroup LVDS + * @{ + */ +/** + * This register controls the LVDS output enable, pipe selection, and data + * format selection. + * + * All of the clock/data pairs are force powered down by power sequencing. + */ +#define LVDS			0x61180 +/** + * Enables the LVDS port.  This bit must be set before DPLLs are enabled, as + * the DPLL semantics change when the LVDS is assigned to that pipe. + */ +# define LVDS_PORT_EN			(1 << 31) +/** Selects pipe B for LVDS data.  Must be set on pre-965. */ +# define LVDS_PIPEB_SELECT		(1 << 30) + +/** + * Enables the A0-A2 data pairs and CLKA, containing 18 bits of color data per + * pixel. + */ +# define LVDS_A0A2_CLKA_POWER_MASK	(3 << 8) +# define LVDS_A0A2_CLKA_POWER_DOWN	(0 << 8) +# define LVDS_A0A2_CLKA_POWER_UP	(3 << 8) +/** + * Controls the A3 data pair, which contains the additional LSBs for 24 bit + * mode.  Only enabled if LVDS_A0A2_CLKA_POWER_UP also indicates it should be + * on. + */ +# define LVDS_A3_POWER_MASK		(3 << 6) +# define LVDS_A3_POWER_DOWN		(0 << 6) +# define LVDS_A3_POWER_UP		(3 << 6) +/** + * Controls the CLKB pair.  This should only be set when LVDS_B0B3_POWER_UP + * is set. + */ +# define LVDS_CLKB_POWER_MASK		(3 << 4) +# define LVDS_CLKB_POWER_DOWN		(0 << 4) +# define LVDS_CLKB_POWER_UP		(3 << 4) + +/** + * Controls the B0-B3 data pairs.  This must be set to match the DPLL p2 + * setting for whether we are in dual-channel mode.  The B3 pair will + * additionally only be powered up when LVDS_A3_POWER_UP is set. + */ +# define LVDS_B0B3_POWER_MASK		(3 << 2) +# define LVDS_B0B3_POWER_DOWN		(0 << 2) +# define LVDS_B0B3_POWER_UP		(3 << 2) + +#define PIPEACONF 0x70008 +#define PIPEACONF_ENABLE	(1<<31) +#define PIPEACONF_DISABLE	0 +#define PIPEACONF_DOUBLE_WIDE	(1<<30) +#define I965_PIPECONF_ACTIVE	(1<<30) +#define PIPEACONF_SINGLE_WIDE	0 +#define PIPEACONF_PIPE_UNLOCKED 0 +#define PIPEACONF_PIPE_LOCKED	(1<<25) +#define PIPEACONF_PALETTE	0 +#define PIPEACONF_GAMMA 	(1<<24) +#define PIPECONF_FORCE_BORDER	(1<<25) +#define PIPECONF_PROGRESSIVE	(0 << 21) +#define PIPECONF_INTERLACE_W_FIELD_INDICATION	(6 << 21) +#define PIPECONF_INTERLACE_FIELD_0_ONLY		(7 << 21) + +#define PIPEBCONF 0x71008 +#define PIPEBCONF_ENABLE	(1<<31) +#define PIPEBCONF_DISABLE	0 +#define PIPEBCONF_DOUBLE_WIDE	(1<<30) +#define PIPEBCONF_DISABLE	0 +#define PIPEBCONF_GAMMA 	(1<<24) +#define PIPEBCONF_PALETTE	0 + +#define PIPEBGCMAXRED		0x71010 +#define PIPEBGCMAXGREEN		0x71014 +#define PIPEBGCMAXBLUE		0x71018 +#define PIPEBSTAT		0x71024 +#define PIPEBFRAMEHIGH		0x71040 +#define PIPEBFRAMEPIXEL		0x71044 + +#define DSPACNTR		0x70180 +#define DSPBCNTR		0x71180 +#define DISPLAY_PLANE_ENABLE 			(1<<31) +#define DISPLAY_PLANE_DISABLE			0 +#define DISPPLANE_GAMMA_ENABLE			(1<<30) +#define DISPPLANE_GAMMA_DISABLE			0 +#define DISPPLANE_PIXFORMAT_MASK		(0xf<<26) +#define DISPPLANE_8BPP				(0x2<<26) +#define DISPPLANE_15_16BPP			(0x4<<26) +#define DISPPLANE_16BPP				(0x5<<26) +#define DISPPLANE_32BPP_NO_ALPHA 		(0x6<<26) +#define DISPPLANE_32BPP				(0x7<<26) +#define DISPPLANE_STEREO_ENABLE			(1<<25) +#define DISPPLANE_STEREO_DISABLE		0 +#define DISPPLANE_SEL_PIPE_MASK			(1<<24) +#define DISPPLANE_SEL_PIPE_A			0 +#define DISPPLANE_SEL_PIPE_B			(1<<24) +#define DISPPLANE_SRC_KEY_ENABLE		(1<<22) +#define DISPPLANE_SRC_KEY_DISABLE		0 +#define DISPPLANE_LINE_DOUBLE			(1<<20) +#define DISPPLANE_NO_LINE_DOUBLE		0 +#define DISPPLANE_STEREO_POLARITY_FIRST		0 +#define DISPPLANE_STEREO_POLARITY_SECOND	(1<<18) +/* plane B only */ +#define DISPPLANE_ALPHA_TRANS_ENABLE		(1<<15) +#define DISPPLANE_ALPHA_TRANS_DISABLE		0 +#define DISPPLANE_SPRITE_ABOVE_DISPLAYA		0 +#define DISPPLANE_SPRITE_ABOVE_OVERLAY		(1) + +#define DSPABASE		0x70184 +#define DSPASTRIDE		0x70188 + +#define DSPBBASE		0x71184 +#define DSPBADDR		DSPBBASE +#define DSPBSTRIDE		0x71188 + +#define DSPAKEYVAL		0x70194 +#define DSPAKEYMASK		0x70198 + +#define DSPAPOS			0x7018C /* reserved */ +#define DSPASIZE		0x70190 +#define DSPBPOS			0x7118C +#define DSPBSIZE		0x71190 + +#define DSPASURF		0x7019C +#define DSPATILEOFF		0x701A4 + +#define DSPBSURF		0x7119C +#define DSPBTILEOFF		0x711A4 + +#define VGACNTRL		0x71400 +# define VGA_DISP_DISABLE			(1 << 31) +# define VGA_2X_MODE				(1 << 30) +# define VGA_PIPE_B_SELECT			(1 << 29) + +/* + * Palette registers + */ +#define PALETTE_A		0x0a000 +#define PALETTE_B		0x0a800 + +#define IS_I830(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82830_CGC) +#define IS_845G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82845G_IG) +#define IS_I85X(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82855GM_IG) +#define IS_I855(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82855GM_IG) +#define IS_I865G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82865_IG) + +#define IS_I915G(pI810) (dev->pci_device == PCI_DEVICE_ID_INTEL_82915G_IG)/* || dev->pci_device == PCI_DEVICE_ID_INTELPCI_CHIP_E7221_G)*/ +#define IS_I915GM(pI810) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82915GM_IG) +#define IS_I945G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82945G_IG) +#define IS_I945GM(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82945GM_IG) + +#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \ +		       (dev)->pci_device == 0x2982 || \ +		       (dev)->pci_device == 0x2992 || \ +		       (dev)->pci_device == 0x29A2) + + +#define IS_I9XX(pI810) (IS_I915G(pI810) || IS_I915GM(pI810) || IS_I945G(pI810) || IS_I945GM(pI810) || IS_I965G(pI810)) + +#define IS_MOBILE(pI810) (IS_I830(pI810) || IS_I85X(pI810) || IS_I915GM(pI810) || IS_I945GM(pI810)) +  #endif  | 
