diff options
| -rw-r--r-- | linux-core/i915_drv.c | 59 | ||||
| -rw-r--r-- | linux-core/i915_fence.c | 2 | ||||
| -rw-r--r-- | linux-core/intel_display.c | 52 | ||||
| -rw-r--r-- | linux-core/intel_lvds.c | 12 | ||||
| -rw-r--r-- | linux-core/intel_tv.c | 18 | ||||
| -rw-r--r-- | shared-core/i915_dma.c | 14 | ||||
| -rw-r--r-- | shared-core/i915_drv.h | 1531 | ||||
| -rw-r--r-- | shared-core/i915_init.c | 25 | ||||
| -rw-r--r-- | shared-core/i915_irq.c | 160 | 
9 files changed, 782 insertions, 1091 deletions
diff --git a/linux-core/i915_drv.c b/linux-core/i915_drv.c index ec91fb93..27c239d0 100644 --- a/linux-core/i915_drv.c +++ b/linux-core/i915_drv.c @@ -67,11 +67,6 @@ static struct drm_bo_driver i915_bo_driver = {  };  #endif -enum pipe { -    PIPE_A = 0, -    PIPE_B, -}; -  static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe)  {  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -308,13 +303,13 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)  	dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE);  	dev_priv->saveDSPASIZE = I915_READ(DSPASIZE);  	dev_priv->saveDSPAPOS = I915_READ(DSPAPOS); -	dev_priv->saveDSPABASE = I915_READ(DSPABASE); +	dev_priv->saveDSPAADDR = I915_READ(DSPAADDR);  	if (IS_I965G(dev)) {  		dev_priv->saveDSPASURF = I915_READ(DSPASURF);  		dev_priv->saveDSPATILEOFF = I915_READ(DSPATILEOFF);  	}  	i915_save_palette(dev, PIPE_A); -	dev_priv->savePIPEASTAT = I915_READ(I915REG_PIPEASTAT); +	dev_priv->savePIPEASTAT = I915_READ(PIPEASTAT);  	/* Pipe & plane B info */  	dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); @@ -336,13 +331,13 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)  	dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE);  	dev_priv->saveDSPBSIZE = I915_READ(DSPBSIZE);  	dev_priv->saveDSPBPOS = I915_READ(DSPBPOS); -	dev_priv->saveDSPBBASE = I915_READ(DSPBBASE); +	dev_priv->saveDSPBADDR = I915_READ(DSPBADDR);  	if (IS_I965GM(dev) || IS_IGD_GM(dev)) {  		dev_priv->saveDSPBSURF = I915_READ(DSPBSURF);  		dev_priv->saveDSPBTILEOFF = I915_READ(DSPBTILEOFF);  	}  	i915_save_palette(dev, PIPE_B); -	dev_priv->savePIPEBSTAT = I915_READ(I915REG_PIPEBSTAT); +	dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT);  	/* CRT state */  	dev_priv->saveADPA = I915_READ(ADPA); @@ -357,9 +352,9 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)  		dev_priv->saveLVDS = I915_READ(LVDS);  	if (!IS_I830(dev) && !IS_845G(dev))  		dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); -	dev_priv->saveLVDSPP_ON = I915_READ(LVDSPP_ON); -	dev_priv->saveLVDSPP_OFF = I915_READ(LVDSPP_OFF); -	dev_priv->savePP_CYCLE = I915_READ(PP_CYCLE); +	dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); +	dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); +	dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR);  	/* FIXME: save TV & SDVO state */ @@ -370,19 +365,19 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)  	dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL);  	/* Interrupt state */ -	dev_priv->saveIIR = I915_READ(I915REG_INT_IDENTITY_R); -	dev_priv->saveIER = I915_READ(I915REG_INT_ENABLE_R); -	dev_priv->saveIMR = I915_READ(I915REG_INT_MASK_R); +	dev_priv->saveIIR = I915_READ(IIR); +	dev_priv->saveIER = I915_READ(IER); +	dev_priv->saveIMR = I915_READ(IMR);  	/* VGA state */ -	dev_priv->saveVCLK_DIVISOR_VGA0 = I915_READ(VCLK_DIVISOR_VGA0); -	dev_priv->saveVCLK_DIVISOR_VGA1 = I915_READ(VCLK_DIVISOR_VGA1); -	dev_priv->saveVCLK_POST_DIV = I915_READ(VCLK_POST_DIV); +	dev_priv->saveVGA0 = I915_READ(VGA0); +	dev_priv->saveVGA1 = I915_READ(VGA1); +	dev_priv->saveVGA_PD = I915_READ(VGA_PD);  	dev_priv->saveVGACNTRL = I915_READ(VGACNTRL);  	/* Clock gating state */  	dev_priv->saveD_STATE = I915_READ(D_STATE); -	dev_priv->saveDSPCLK_GATE_D = I915_READ(DSPCLK_GATE_D); +	dev_priv->saveCG_2D_DIS = I915_READ(CG_2D_DIS);  	/* Cache mode state */  	dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); @@ -419,6 +414,8 @@ static int i915_resume(struct drm_device *dev)  	if (pci_enable_device(dev->pdev))  		return -1; +	DRM_INFO("resuming i915\n"); +  	pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);  	I915_WRITE(DSPARB, dev_priv->saveDSPARB); @@ -452,7 +449,7 @@ static int i915_resume(struct drm_device *dev)  	I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE);  	I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS);  	I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC); -	I915_WRITE(DSPABASE, dev_priv->saveDSPABASE); +	I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR);  	I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE);  	if (IS_I965G(dev)) {  		I915_WRITE(DSPASURF, dev_priv->saveDSPASURF); @@ -464,10 +461,11 @@ static int i915_resume(struct drm_device *dev)  	i915_restore_palette(dev, PIPE_A);  	/* Enable the plane */  	I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR); -	I915_WRITE(DSPABASE, I915_READ(DSPABASE)); +	I915_WRITE(DSPAADDR, I915_READ(DSPAADDR));  	/* Pipe & plane B info */  	if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { +		DRM_INFO("restoring DPLL_B: 0x%08x\n", dev_priv->saveDPLL_B);  		I915_WRITE(DPLL_B, dev_priv->saveDPLL_B &  			   ~DPLL_VCO_ENABLE);  		udelay(150); @@ -476,6 +474,7 @@ static int i915_resume(struct drm_device *dev)  	I915_WRITE(FPB1, dev_priv->saveFPB1);  	/* Actually enable it */  	I915_WRITE(DPLL_B, dev_priv->saveDPLL_B); +	DRM_INFO("restoring DPLL_B: 0x%08x\n", dev_priv->saveDPLL_B);  	udelay(150);  	if (IS_I965G(dev))  		I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); @@ -494,7 +493,7 @@ static int i915_resume(struct drm_device *dev)  	I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE);  	I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS);  	I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC); -	I915_WRITE(DSPBBASE, dev_priv->saveDSPBBASE); +	I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR);  	I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE);  	if (IS_I965G(dev)) {  		I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF); @@ -506,7 +505,7 @@ static int i915_resume(struct drm_device *dev)  	i915_restore_palette(dev, PIPE_B);  	/* Enable the plane */  	I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR); -	I915_WRITE(DSPBBASE, I915_READ(DSPBBASE)); +	I915_WRITE(DSPBADDR, I915_READ(DSPBADDR));  	/* CRT state */  	I915_WRITE(ADPA, dev_priv->saveADPA); @@ -521,9 +520,9 @@ static int i915_resume(struct drm_device *dev)  	I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS);  	I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); -	I915_WRITE(LVDSPP_ON, dev_priv->saveLVDSPP_ON); -	I915_WRITE(LVDSPP_OFF, dev_priv->saveLVDSPP_OFF); -	I915_WRITE(PP_CYCLE, dev_priv->savePP_CYCLE); +	I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); +	I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); +	I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR);  	I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL);  	/* FIXME: restore TV & SDVO state */ @@ -536,14 +535,14 @@ static int i915_resume(struct drm_device *dev)  	/* VGA state */  	I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); -	I915_WRITE(VCLK_DIVISOR_VGA0, dev_priv->saveVCLK_DIVISOR_VGA0); -	I915_WRITE(VCLK_DIVISOR_VGA1, dev_priv->saveVCLK_DIVISOR_VGA1); -	I915_WRITE(VCLK_POST_DIV, dev_priv->saveVCLK_POST_DIV); +	I915_WRITE(VGA0, dev_priv->saveVGA0); +	I915_WRITE(VGA1, dev_priv->saveVGA1); +	I915_WRITE(VGA_PD, dev_priv->saveVGA_PD);  	udelay(150);  	/* Clock gating state */  	I915_WRITE (D_STATE, dev_priv->saveD_STATE); -	I915_WRITE (DSPCLK_GATE_D, dev_priv->saveDSPCLK_GATE_D); +	I915_WRITE (CG_2D_DIS, dev_priv->saveCG_2D_DIS);  	/* Cache mode state */  	I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); diff --git a/linux-core/i915_fence.c b/linux-core/i915_fence.c index 3ca8403f..436b7e1f 100644 --- a/linux-core/i915_fence.c +++ b/linux-core/i915_fence.c @@ -46,7 +46,7 @@ static inline void i915_initiate_rwflush(struct drm_i915_private *dev_priv,  		dev_priv->flush_sequence = (uint32_t) READ_BREADCRUMB(dev_priv);  		dev_priv->flush_flags = fc->pending_flush;  		dev_priv->saved_flush_status = READ_HWSP(dev_priv, 0); -		I915_WRITE(I915REG_INSTPM, (1 << 5) | (1 << 21)); +		I915_WRITE(INSTPM, (1 << 5) | (1 << 21));  		dev_priv->flush_pending = 1;  		fc->pending_flush &= ~DRM_I915_FENCE_TYPE_RW;  	} diff --git a/linux-core/intel_display.c b/linux-core/intel_display.c index f66570c2..273f76d0 100644 --- a/linux-core/intel_display.c +++ b/linux-core/intel_display.c @@ -367,7 +367,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y)  	struct intel_crtc *intel_crtc = crtc->driver_private;  	int pipe = intel_crtc->pipe;  	unsigned long Start, Offset; -	int dspbase = (pipe == 0 ? DSPABASE : DSPBBASE); +	int dspbase = (pipe == 0 ? DSPAADDR : DSPBADDR);  	int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF);  	int dspstride = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE;  	int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR; @@ -456,7 +456,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)  	int pipe = intel_crtc->pipe;  	int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;  	int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR; -	int dspbase_reg = (pipe == 0) ? DSPABASE : DSPBBASE; +	int dspbase_reg = (pipe == 0) ? DSPAADDR : DSPBADDR;  	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;  	u32 temp;  	bool enabled; @@ -617,16 +617,16 @@ static int intel_get_core_clock_speed(struct drm_device *dev)  	else if (IS_I915GM(dev)) {  		u16 gcfgc = 0; -		pci_read_config_word(dev->pdev, I915_GCFGC, &gcfgc); +		pci_read_config_word(dev->pdev, GCFGC, &gcfgc); -		if (gcfgc & I915_LOW_FREQUENCY_ENABLE) +		if (gcfgc & GC_LOW_FREQUENCY_ENABLE)  			return 133000;  		else { -			switch (gcfgc & I915_DISPLAY_CLOCK_MASK) { -			case I915_DISPLAY_CLOCK_333_MHZ: +			switch (gcfgc & GC_DISPLAY_CLOCK_MASK) { +			case GC_DISPLAY_CLOCK_333_MHZ:  				return 333000;  			default: -			case I915_DISPLAY_CLOCK_190_200_MHZ: +			case GC_DISPLAY_CLOCK_190_200_MHZ:  				return 190000;  			}  		} @@ -635,20 +635,20 @@ static int intel_get_core_clock_speed(struct drm_device *dev)  	else if (IS_I855(dev)) {  #if 0  		PCITAG bridge = pciTag(0, 0, 0); /* This is always the host bridge */ -		u16 hpllcc = pciReadWord(bridge, I855_HPLLCC); +		u16 hpllcc = pciReadWord(bridge, HPLLCC);  #endif  		u16 hpllcc = 0;  		/* Assume that the hardware is in the high speed state.  This  		 * should be the default.  		 */ -		switch (hpllcc & I855_CLOCK_CONTROL_MASK) { -		case I855_CLOCK_133_200: -		case I855_CLOCK_100_200: +		switch (hpllcc & GC_CLOCK_CONTROL_MASK) { +		case GC_CLOCK_133_200: +		case GC_CLOCK_100_200:  			return 200000; -		case I855_CLOCK_166_250: +		case GC_CLOCK_166_250:  			return 250000; -		case I855_CLOCK_100_133: +		case GC_CLOCK_100_133:  			return 133000;  		}  	} else /* 852, 830 */ @@ -961,24 +961,6 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)  	}  } -#define CURSOR_A_CONTROL        0x70080 -#define CURSOR_A_BASE           0x70084 -#define CURSOR_A_POSITION       0x70088 - -#define CURSOR_B_CONTROL        0x700C0 -#define CURSOR_B_BASE           0x700C4 -#define CURSOR_B_POSITION       0x700C8 - -#define CURSOR_MODE_DISABLE     0x00 -#define CURSOR_MODE_64_32B_AX   0x07 -#define CURSOR_MODE_64_ARGB_AX  ((1 << 5) | CURSOR_MODE_64_32B_AX) -#define MCURSOR_GAMMA_ENABLE    (1 << 26) - -#define CURSOR_POS_MASK         0x007FF -#define CURSOR_POS_SIGN         0x8000 -#define CURSOR_X_SHIFT          0 -#define CURSOR_Y_SHIFT          16 -  static int intel_crtc_cursor_set(struct drm_crtc *crtc,  				 struct drm_buffer_object *bo,  				 uint32_t width, uint32_t height) @@ -987,8 +969,8 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct intel_crtc *intel_crtc = crtc->driver_private;  	int pipe = intel_crtc->pipe; -	uint32_t control = (pipe == 0) ? CURSOR_A_CONTROL : CURSOR_B_CONTROL; -	uint32_t base = (pipe == 0) ? CURSOR_A_BASE : CURSOR_B_BASE; +	uint32_t control = (pipe == 0) ? CURACNTR : CURBCNTR; +	uint32_t base = (pipe == 0) ? CURABASE : CURBBASE;  	uint32_t temp;  	size_t addr; @@ -1063,8 +1045,8 @@ static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)  	temp |= ((y & CURSOR_POS_MASK) << CURSOR_Y_SHIFT);  	adder = intel_crtc->cursor_addr; -	I915_WRITE((pipe == 0) ? CURSOR_A_POSITION : CURSOR_B_POSITION, temp); -	I915_WRITE((pipe == 0) ? CURSOR_A_BASE : CURSOR_B_BASE, adder); +	I915_WRITE((pipe == 0) ? CURAPOS : CURBPOS, temp); +	I915_WRITE((pipe == 0) ? CURABASE : CURBBASE, adder);  	return 0;  } diff --git a/linux-core/intel_lvds.c b/linux-core/intel_lvds.c index 92a1d600..1da95e18 100644 --- a/linux-core/intel_lvds.c +++ b/linux-core/intel_lvds.c @@ -106,10 +106,10 @@ static void intel_lvds_save(struct drm_output *output)  	struct drm_device *dev = output->dev;  	struct drm_i915_private *dev_priv = dev->dev_private; -	dev_priv->savePP_ON = I915_READ(LVDSPP_ON); -	dev_priv->savePP_OFF = I915_READ(LVDSPP_OFF); +	dev_priv->savePP_ON = I915_READ(PP_ON_DELAYS); +	dev_priv->savePP_OFF = I915_READ(PP_OFF_DELAYS);  	dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); -	dev_priv->savePP_CYCLE = I915_READ(PP_CYCLE); +	dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR);  	dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);  	dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL &  				       BACKLIGHT_DUTY_CYCLE_MASK); @@ -128,9 +128,9 @@ static void intel_lvds_restore(struct drm_output *output)  	struct drm_i915_private *dev_priv = dev->dev_private;  	I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); -	I915_WRITE(LVDSPP_ON, dev_priv->savePP_ON); -	I915_WRITE(LVDSPP_OFF, dev_priv->savePP_OFF); -	I915_WRITE(PP_CYCLE, dev_priv->savePP_CYCLE); +	I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON); +	I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF); +	I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR);  	I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL);  	if (dev_priv->savePP_CONTROL & POWER_TARGET_ON)  		intel_lvds_set_power(dev, true); diff --git a/linux-core/intel_tv.c b/linux-core/intel_tv.c index 865e27b9..42f4b10b 100644 --- a/linux-core/intel_tv.c +++ b/linux-core/intel_tv.c @@ -1012,7 +1012,7 @@ intel_tv_restore(struct drm_output *output)  		int pipeconf = I915_READ(pipeconf_reg);  		int dspcntr = I915_READ(dspcntr_reg);  		int dspbase_reg = (intel_crtc->plane == 0) ? -			DSPABASE : DSPBBASE; +			DSPAADDR : DSPBADDR;  		/* Pipe must be off here */  		I915_WRITE(dspcntr_reg, dspcntr & ~DISPLAY_PLANE_ENABLE);  		/* Flush the plane changes */ @@ -1277,7 +1277,7 @@ intel_tv_mode_set(struct drm_output *output, struct drm_display_mode *mode,  		int pipeconf = I915_READ(pipeconf_reg);  		int dspcntr = I915_READ(dspcntr_reg);  		int dspbase_reg = (intel_crtc->plane == 0) ? -			DSPABASE : DSPBBASE; +			DSPAADDR : DSPBADDR;  		int xpos = 0x0, ypos = 0x0;  		unsigned int xsize, ysize;  		/* Pipe must be off here */ @@ -1368,12 +1368,12 @@ intel_tv_detect_type (struct drm_crtc *crtc, struct drm_output *output)  	tv_dac = I915_READ(TV_DAC);  	/* Disable TV interrupts around load detect or we'll recurse */ -	pipeastat = I915_READ(I915REG_PIPEASTAT); +	pipeastat = I915_READ(PIPEASTAT);  	pipeastat_save = pipeastat; -	pipeastat &= ~I915_HOTPLUG_INTERRUPT_ENABLE; -	pipeastat &= ~I915_HOTPLUG_TV_INTERRUPT_ENABLE; -	I915_WRITE(I915REG_PIPEASTAT, pipeastat | I915_HOTPLUG_TV_CLEAR | -		   I915_HOTPLUG_CLEAR); +	pipeastat &= ~PIPE_HOTPLUG_INTERRUPT_ENABLE; +	pipeastat &= ~PIPE_HOTPLUG_TV_INTERRUPT_ENABLE; +	I915_WRITE(PIPEASTAT, pipeastat | PIPE_HOTPLUG_TV_INTERRUPT_STATUS | +		   PIPE_HOTPLUG_INTERRUPT_STATUS);  	/*  	 * Detect TV by polling) @@ -1423,8 +1423,8 @@ intel_tv_detect_type (struct drm_crtc *crtc, struct drm_output *output)  	}  	/* Restore interrupt config */ -	I915_WRITE(I915REG_PIPEASTAT, pipeastat_save | I915_HOTPLUG_TV_CLEAR | -		   I915_HOTPLUG_CLEAR); +	I915_WRITE(PIPEASTAT, pipeastat_save | PIPE_HOTPLUG_TV_INTERRUPT_STATUS | +		   PIPE_HOTPLUG_INTERRUPT_STATUS);  	return type;  } diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 9bec85a1..e1417388 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -40,11 +40,11 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)  {  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct drm_i915_ring_buffer *ring = &(dev_priv->ring); -	u32 last_head = I915_READ(LP_RING + RING_HEAD) & HEAD_ADDR; +	u32 last_head = I915_READ(PRB0_HEAD) & HEAD_ADDR;  	int i;  	for (i = 0; i < 10000; i++) { -		ring->head = I915_READ(LP_RING + RING_HEAD) & HEAD_ADDR; +		ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR;  		ring->space = ring->head - (ring->tail + 8);  		if (ring->space < 0)  			ring->space += ring->Size; @@ -71,8 +71,8 @@ void i915_kernel_lost_context(struct drm_device * dev)  	if (drm_core_check_feature(dev, DRIVER_MODESET))  		return; -	ring->head = I915_READ(LP_RING + RING_HEAD) & HEAD_ADDR; -	ring->tail = I915_READ(LP_RING + RING_TAIL) & TAIL_ADDR; +	ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR; +	ring->tail = I915_READ(PRB0_TAIL) & TAIL_ADDR;  	ring->space = ring->head - (ring->tail + 8);  	if (ring->space < 0)  		ring->space += ring->Size; @@ -510,7 +510,7 @@ void i915_emit_breadcrumb(struct drm_device *dev)  	master_priv->sarea_priv->last_enqueue = dev_priv->counter;  	BEGIN_LP_RING(4); -	OUT_RING(CMD_STORE_DWORD_IDX); +	OUT_RING(MI_STORE_DWORD_INDEX);  	OUT_RING(20);  	OUT_RING(dev_priv->counter);  	OUT_RING(0); @@ -521,7 +521,7 @@ void i915_emit_breadcrumb(struct drm_device *dev)  int i915_emit_mi_flush(struct drm_device *dev, uint32_t flush)  {  	struct drm_i915_private *dev_priv = dev->dev_private; -	uint32_t flush_cmd = CMD_MI_FLUSH; +	uint32_t flush_cmd = MI_FLUSH;  	RING_LOCALS;  	flush_cmd |= flush; @@ -1022,7 +1022,7 @@ static int i915_set_status_page(struct drm_device *dev, void *data,  	dev_priv->hw_status_page = dev_priv->hws_map.handle;  	memset(dev_priv->hw_status_page, 0, PAGE_SIZE); -	I915_WRITE(I915REG_HWS_PGA, dev_priv->status_gfx_addr); +	I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);  	DRM_DEBUG("load hws 0x2080 with gfx mem 0x%x\n",  			dev_priv->status_gfx_addr);  	DRM_DEBUG("load hws at %p\n", dev_priv->hw_status_page); diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index 10e08c55..84cc60f3 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -69,6 +69,11 @@  #endif  #define DRIVER_PATCHLEVEL	0 +enum pipe { +    PIPE_A = 0, +    PIPE_B, +}; +  #ifdef I915_HAVE_BUFFER  #define I915_MAX_VALIDATE_BUFFERS 4096  struct drm_i915_validate_buffer; @@ -202,7 +207,7 @@ struct drm_i915_private {  	u32 saveDSPASTRIDE;  	u32 saveDSPASIZE;  	u32 saveDSPAPOS; -	u32 saveDSPABASE; +	u32 saveDSPAADDR;  	u32 saveDSPASURF;  	u32 saveDSPATILEOFF;  	u32 savePFIT_PGM_RATIOS; @@ -223,24 +228,24 @@ struct drm_i915_private {  	u32 saveDSPBSTRIDE;  	u32 saveDSPBSIZE;  	u32 saveDSPBPOS; -	u32 saveDSPBBASE; +	u32 saveDSPBADDR;  	u32 saveDSPBSURF;  	u32 saveDSPBTILEOFF; -	u32 saveVCLK_DIVISOR_VGA0; -	u32 saveVCLK_DIVISOR_VGA1; -	u32 saveVCLK_POST_DIV; +	u32 saveVGA0; +	u32 saveVGA1; +	u32 saveVGA_PD;  	u32 saveVGACNTRL;  	u32 saveADPA;  	u32 saveLVDS; -	u32 saveLVDSPP_ON; -	u32 saveLVDSPP_OFF; +	u32 savePP_ON_DELAYS; +	u32 savePP_OFF_DELAYS;  	u32 saveDVOA;  	u32 saveDVOB;  	u32 saveDVOC;  	u32 savePP_ON;  	u32 savePP_OFF;  	u32 savePP_CONTROL; -	u32 savePP_CYCLE; +	u32 savePP_DIVISOR;  	u32 savePFIT_CONTROL;  	u32 save_palette_a[256];  	u32 save_palette_b[256]; @@ -253,7 +258,7 @@ struct drm_i915_private {  	u32 saveIMR;  	u32 saveCACHE_MODE_0;  	u32 saveD_STATE; -	u32 saveDSPCLK_GATE_D; +	u32 saveCG_2D_DIS;  	u32 saveMI_ARB_STATE;  	u32 saveSWF0[16];  	u32 saveSWF1[16]; @@ -382,6 +387,8 @@ extern void intel_modeset_cleanup(struct drm_device *dev);  #define I915_VERBOSE 0 +#define PRIMARY_RINGBUFFER_SIZE         (128*1024) +  #define RING_LOCALS	unsigned int outring, ringmask, outcount; \  			volatile char *virt; @@ -409,10 +416,14 @@ extern void intel_modeset_cleanup(struct drm_device *dev);  	if (I915_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING %x\n", outring);	\  	dev_priv->ring.tail = outring;					\  	dev_priv->ring.space -= outcount * 4;				\ -	I915_WRITE(LP_RING + RING_TAIL, outring);			\ +	I915_WRITE(PRB0_TAIL, outring);			\  } while(0) -#define MI_NOOP	(0x00 << 23) +#define BREADCRUMB_BITS 31 +#define BREADCRUMB_MASK ((1U << BREADCRUMB_BITS) - 1) + +#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])  extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); @@ -437,8 +448,20 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  #define INTEL_915G_GMCH_GMS_STOLEN_48M	(0x6 << 4)  #define INTEL_915G_GMCH_GMS_STOLEN_64M	(0x7 << 4) -/* Extended config space */ -#define LBB 0xf4 +/* PCI config space */ + +#define HPLLCC	0xc0 /* 855 only */ +#define   GC_CLOCK_CONTROL_MASK		(3 << 0) +#define   GC_CLOCK_133_200		(0 << 0) +#define   GC_CLOCK_100_200		(1 << 0) +#define   GC_CLOCK_100_133		(2 << 0) +#define   GC_CLOCK_166_250		(3 << 0) +#define GCFGC	0xf0 /* 915+ only */ +#define   GC_LOW_FREQUENCY_ENABLE	(1 << 7) +#define   GC_DISPLAY_CLOCK_190_200_MHZ	(0 << 4) +#define   GC_DISPLAY_CLOCK_333_MHZ	(4 << 4) +#define   GC_DISPLAY_CLOCK_MASK		(7 << 4) +#define LBB	0xf4  /* VGA stuff */ @@ -481,32 +504,146 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  #define VGA_CR_INDEX_CGA 0x3d4  #define VGA_CR_DATA_CGA 0x3d5 -#define GFX_OP_USER_INTERRUPT		((0<<29)|(2<<23)) -#define GFX_OP_BREAKPOINT_INTERRUPT	((0<<29)|(1<<23)) -#define CMD_REPORT_HEAD			(7<<23) -#define CMD_STORE_DWORD_IMM             ((0x20<<23) | (0x1 << 22) | 0x1) -#define CMD_STORE_DWORD_IDX		((0x21<<23) | 0x1) -#define CMD_OP_BATCH_BUFFER  ((0x0<<29)|(0x30<<23)|0x1) - -#define CMD_MI_FLUSH         (0x04 << 23) -#define MI_NO_WRITE_FLUSH    (1 << 2) -#define MI_READ_FLUSH        (1 << 0) -#define MI_EXE_FLUSH         (1 << 1) -#define MI_END_SCENE         (1 << 4) /* flush binner and incr scene count */ -#define MI_SCENE_COUNT       (1 << 3) /* just increment scene count */ - -/* Packet to load a register value from the ring/batch command stream: +/* + * Memory interface instructions used by the kernel + */ +#define MI_INSTR(opcode, flags) (((opcode) << 23) | (flags)) + +#define MI_NOOP			MI_INSTR(0, 0) +#define MI_USER_INTERRUPT	MI_INSTR(0x02, 0) +#define MI_WAIT_FOR_EVENT       MI_INSTR(0x03, 0) +#define   MI_WAIT_FOR_PLANE_B_FLIP      (1<<6) +#define   MI_WAIT_FOR_PLANE_A_FLIP      (1<<2) +#define   MI_WAIT_FOR_PLANE_A_SCANLINES (1<<1) +#define MI_FLUSH		MI_INSTR(0x04, 0) +#define   MI_READ_FLUSH		(1 << 0) +#define   MI_EXE_FLUSH		(1 << 1) +#define   MI_NO_WRITE_FLUSH	(1 << 2) +#define   MI_SCENE_COUNT	(1 << 3) /* just increment scene count */ +#define   MI_END_SCENE		(1 << 4) /* flush binner and incr scene count */ +#define MI_BATCH_BUFFER_END	MI_INSTR(0x0a, 0) +#define MI_REPORT_HEAD		MI_INSTR(0x07, 0) +#define MI_LOAD_SCAN_LINES_INCL MI_INSTR(0x12, 0) +#define MI_STORE_DWORD_IMM	MI_INSTR(0x20, 1) /* used to have 1<<22? */ +#define MI_STORE_DWORD_INDEX	MI_INSTR(0x21, 1) +#define MI_LOAD_REGISTER_IMM	MI_INSTR(0x22, 1) +#define MI_BATCH_BUFFER		MI_INSTR(0x30, 1) +#define   MI_BATCH_NON_SECURE	(1) +#define   MI_BATCH_NON_SECURE_I965 (1<<8) +#define MI_BATCH_BUFFER_START	MI_INSTR(0x31, 0) + +/* + * 3D instructions used by the kernel   */ -#define CMD_MI_LOAD_REGISTER_IMM	((0x22 << 23)|0x1) +#define GFX_INSTR(opcode, flags) ((0x3 << 29) | ((opcode) << 24) | (flags)) -#define BB1_START_ADDR_MASK   (~0x7) -#define BB1_PROTECTED         (1<<0) -#define BB1_UNPROTECTED       (0<<0) -#define BB2_END_ADDR_MASK     (~0x7) +#define GFX_OP_RASTER_RULES    ((0x3<<29)|(0x7<<24)) +#define GFX_OP_SCISSOR         ((0x3<<29)|(0x1c<<24)|(0x10<<19)) +#define   SC_UPDATE_SCISSOR       (0x1<<1) +#define   SC_ENABLE_MASK          (0x1<<0) +#define   SC_ENABLE               (0x1<<0) +#define GFX_OP_LOAD_INDIRECT   ((0x3<<29)|(0x1d<<24)|(0x7<<16)) +#define GFX_OP_SCISSOR_INFO    ((0x3<<29)|(0x1d<<24)|(0x81<<16)|(0x1)) +#define   SCI_YMIN_MASK      (0xffff<<16) +#define   SCI_XMIN_MASK      (0xffff<<0) +#define   SCI_YMAX_MASK      (0xffff<<16) +#define   SCI_XMAX_MASK      (0xffff<<0) +#define GFX_OP_SCISSOR_ENABLE	 ((0x3<<29)|(0x1c<<24)|(0x10<<19)) +#define GFX_OP_SCISSOR_RECT	 ((0x3<<29)|(0x1d<<24)|(0x81<<16)|1) +#define GFX_OP_COLOR_FACTOR      ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0) +#define GFX_OP_STIPPLE           ((0x3<<29)|(0x1d<<24)|(0x83<<16)) +#define GFX_OP_MAP_INFO          ((0x3<<29)|(0x1d<<24)|0x4) +#define GFX_OP_DESTBUFFER_VARS   ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0) +#define GFX_OP_DRAWRECT_INFO     ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3)) +#define GFX_OP_DRAWRECT_INFO_I965  ((0x7900<<16)|0x2) +#define SRC_COPY_BLT_CMD                ((2<<29)|(0x43<<22)|4) +#define XY_SRC_COPY_BLT_CMD		((2<<29)|(0x53<<22)|6) +#define XY_MONO_SRC_COPY_IMM_BLT	((2<<29)|(0x71<<22)|5) +#define XY_SRC_COPY_BLT_WRITE_ALPHA	(1<<21) +#define XY_SRC_COPY_BLT_WRITE_RGB	(1<<20) +#define   BLT_DEPTH_8			(0<<24) +#define   BLT_DEPTH_16_565		(1<<24) +#define   BLT_DEPTH_16_1555		(2<<24) +#define   BLT_DEPTH_32			(3<<24) +#define   BLT_ROP_GXCOPY		(0xcc<<16) +#define XY_SRC_COPY_BLT_SRC_TILED	(1<<15) +#define XY_SRC_COPY_BLT_DST_TILED	(1<<11) +#define CMD_OP_DISPLAYBUFFER_INFO ((0x0<<29)|(0x14<<23)|2) +#define   ASYNC_FLIP                (1<<22) +#define   DISPLAY_PLANE_A           (0<<20) +#define   DISPLAY_PLANE_B           (1<<20) -#define I915REG_HWS_PGA		0x02080 +/* + * Instruction and interrupt control regs + */ + +#define PRB0_TAIL	0x02030 +#define PRB0_HEAD	0x02034 +#define PRB0_START	0x02038 +#define PRB0_CTL	0x0203c +#define   TAIL_ADDR		0x001FFFF8 +#define   HEAD_WRAP_COUNT	0xFFE00000 +#define   HEAD_WRAP_ONE		0x00200000 +#define   HEAD_ADDR		0x001FFFFC +#define   START_ADDR		0x0xFFFFF000 +#define   RING_NR_PAGES		0x001FF000 +#define   RING_REPORT_MASK	0x00000006 +#define   RING_REPORT_64K	0x00000002 +#define   RING_REPORT_128K	0x00000004 +#define   RING_NO_REPORT	0x00000000 +#define   RING_VALID_MASK	0x00000001 +#define   RING_VALID		0x00000001 +#define   RING_INVALID		0x00000000 +#define PRB1_TAIL	0x02040 /* 915+ only */ +#define PRB1_HEAD	0x02044 /* 915+ only */ +#define PRB1_START	0x02048 /* 915+ only */ +#define PRB1_CTL	0x0204c /* 915+ only */ +#define HWS_PGA		0x02080 +#define IPEIR		0x02088 +#define NOPID		0x02094 +#define HWSTAM		0x02098 +#define SCPD0		0x0209c /* 915+ only */ +#define IER		0x020a0 +#define IIR		0x020a4 +#define IMR		0x020a8 +#define ISR		0x020ac +#define   I915_PIPE_CONTROL_NOTIFY_INTERRUPT		(1<<18) +#define   I915_DISPLAY_PORT_INTERRUPT			(1<<17) +#define   I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT	(1<<15) +#define   I915_GMCH_THERMAL_SENSOR_EVENT_INTERRUPT	(1<<14) +#define   I915_HWB_OOM_INTERRUPT			(1<<13) +#define   I915_SYNC_STATUS_INTERRUPT			(1<<12) +#define   I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT	(1<<11) +#define   I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT	(1<<10) +#define   I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT	(1<<9) +#define   I915_DISPLAY_PLANE_C_FLIP_PENDING_INTERRUPT	(1<<8) +#define   I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT		(1<<7) +#define   I915_DISPLAY_PIPE_A_EVENT_INTERRUPT		(1<<6) +#define   I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT		(1<<5) +#define   I915_DISPLAY_PIPE_B_EVENT_INTERRUPT		(1<<4) +#define   I915_DEBUG_INTERRUPT				(1<<2) +#define   I915_USER_INTERRUPT				(1<<1) +#define EIR		0x020b0 +#define EMR		0x020b4 +#define ESR		0x020b8 +#define INSTPM	        0x020c0 +#define FW_BLC		0x020d8 +#define FW_BLC_SELF	0x020e0 /* 915+ only */ +#define MI_ARB_STATE	0x020e4 /* 915+ only */ +#define CACHE_MODE_0	0x02120 /* 915+ only */ +#define   CM0_MASK_SHIFT          16 +#define   CM0_IZ_OPT_DISABLE      (1<<6) +#define   CM0_ZR_OPT_DISABLE      (1<<5) +#define   CM0_DEPTH_EVICT_DISABLE (1<<4) +#define   CM0_COLOR_EVICT_DISABLE (1<<3) +#define   CM0_DEPTH_WRITE_DISABLE (1<<1) +#define   CM0_RC_OP_FLUSH_DISABLE (1<<0) +#define GFX_FLSH_CNTL	0x02170 /* 915+ only */ + +/* + * Framebuffer compression (915+ only) + */ -/* Framebuffer compression */  #define FBC_CFB_BASE		0x03200 /* 4k page aligned */  #define FBC_LL_BASE		0x03204 /* 4k page aligned */  #define FBC_CONTROL		0x03208 @@ -535,77 +672,10 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  #define FBC_FENCE_OFF		0x0321b  #define FBC_LL_SIZE		(1536) -#define FBC_LL_PAD		(32) - -/* Interrupt bits: - */ -#define I915_PIPE_CONTROL_NOTIFY_INTERRUPT		(1<<18) -#define I915_DISPLAY_PORT_INTERRUPT			(1<<17) -#define I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT	(1<<15) -#define I915_GMCH_THERMAL_SENSOR_EVENT_INTERRUPT	(1<<14) -#define I915_HWB_OOM_INTERRUPT				(1<<13) /* binner out of memory */ -#define I915_SYNC_STATUS_INTERRUPT			(1<<12) -#define I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT	(1<<11) -#define I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT	(1<<10) -#define I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT	(1<<9) -#define I915_DISPLAY_PLANE_C_FLIP_PENDING_INTERRUPT	(1<<8) -#define I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT		(1<<7) -#define I915_DISPLAY_PIPE_A_EVENT_INTERRUPT		(1<<6) -#define I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT		(1<<5) -#define I915_DISPLAY_PIPE_B_EVENT_INTERRUPT		(1<<4) -#define I915_DEBUG_INTERRUPT				(1<<2) -#define I915_USER_INTERRUPT				(1<<1) - - -#define I915REG_HWSTAM		0x02098 -#define I915REG_INT_IDENTITY_R	0x020a4 -#define I915REG_INT_MASK_R	0x020a8 -#define I915REG_INT_ENABLE_R	0x020a0 -#define I915REG_INSTPM	        0x020c0 - -#define PIPEADSL		0x70000 -#define PIPEBDSL		0x71000 - -#define I915REG_PIPEASTAT	0x70024 -#define I915REG_PIPEBSTAT	0x71024 - -#define I915_VBLANK_INTERRUPT_ENABLE	(1UL<<17) -#define I915_HOTPLUG_INTERRUPT_ENABLE	(1UL<<26) -#define I915_HOTPLUG_TV_INTERRUPT_ENABLE (1UL<<18) -#define I915_HOTPLUG_CLEAR		(1UL<<10) -#define I915_HOTPLUG_TV_CLEAR		(1UL<<2) -#define I915_VBLANK_CLEAR		(1UL<<1) - -/* - * The two pipe frame counter registers are not synchronized, so - * reading a stable value is somewhat tricky. The following code  - * should work: - * - *  do { - *    high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >> - *             PIPE_FRAME_HIGH_SHIFT; - *    low1 =  ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >> - *             PIPE_FRAME_LOW_SHIFT); - *    high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >> - *             PIPE_FRAME_HIGH_SHIFT); - *  } while (high1 != high2); - *  frame = (high1 << 8) | low1; - */ -#define PIPEAFRAMEHIGH          0x70040 -#define PIPEBFRAMEHIGH		0x71040 -#define PIPE_FRAME_HIGH_MASK    0x0000ffff -#define PIPE_FRAME_HIGH_SHIFT   0 -#define PIPEAFRAMEPIXEL         0x70044 -#define PIPEBFRAMEPIXEL		0x71044 -#define PIPE_FRAME_LOW_MASK     0xff000000 -#define PIPE_FRAME_LOW_SHIFT    24  /* - * Pixel within the current frame is counted in the PIPEAFRAMEPIXEL register - * and is 24 bits wide. + * GPIO regs   */ -#define PIPE_PIXEL_MASK         0x00ffffff -#define PIPE_PIXEL_SHIFT        0  #define GPIOA			0x5010  #define GPIOB			0x5014 @@ -630,520 +700,82 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  # define GPIO_DATA_VAL_IN		(1 << 12)  # define GPIO_DATA_PULLUP_DISABLE	(1 << 13) -/* p317, 319 - */ -#define VCLK2_VCO_M        0x6008 /* treat as 16 bit? (includes msbs) */ -#define VCLK2_VCO_N        0x600a -#define VCLK2_VCO_DIV_SEL  0x6012 - -#define VCLK_DIVISOR_VGA0   0x6000 -#define VCLK_DIVISOR_VGA1   0x6004 -#define VCLK_POST_DIV	    0x6010 -/** Selects a post divisor of 4 instead of 2. */ -# define VGA1_PD_P2_DIV_4	(1 << 15) -/** Overrides the p2 post divisor field */ -# define VGA1_PD_P1_DIV_2	(1 << 13) -# define VGA1_PD_P1_SHIFT	8 -/** P1 value is 2 greater than this field */ -# define VGA1_PD_P1_MASK	(0x1f << 8) -/** Selects a post divisor of 4 instead of 2. */ -# define VGA0_PD_P2_DIV_4	(1 << 7) -/** Overrides the p2 post divisor field */ -# define VGA0_PD_P1_DIV_2	(1 << 5) -# define VGA0_PD_P1_SHIFT	0 -/** P1 value is 2 greater than this field */ -# define VGA0_PD_P1_MASK	(0x1f << 0) - -#define POST_DIV_SELECT        0x70 -#define POST_DIV_1             0x00 -#define POST_DIV_2             0x10 -#define POST_DIV_4             0x20 -#define POST_DIV_8             0x30 -#define POST_DIV_16            0x40 -#define POST_DIV_32            0x50 -#define VCO_LOOP_DIV_BY_4M     0x00 -#define VCO_LOOP_DIV_BY_16M    0x04 - -#define I915_FIFO_UNDERRUN_STATUS		(1UL<<31) -#define I915_CRC_ERROR_ENABLE			(1UL<<29) -#define I915_CRC_DONE_ENABLE			(1UL<<28) -#define I915_GMBUS_EVENT_ENABLE			(1UL<<27) -#define I915_HOTPLUG_INTERRUPT_ENABLE		(1UL<<26) -#define I915_VSYNC_INTERRUPT_ENABLE		(1UL<<25) -#define I915_DISPLAY_LINE_COMPARE_ENABLE	(1UL<<24) -#define I915_DPST_EVENT_ENABLE			(1UL<<23) -#define I915_LEGACY_BLC_EVENT_ENABLE		(1UL<<22) -#define I915_ODD_FIELD_INTERRUPT_ENABLE		(1UL<<21) -#define I915_EVEN_FIELD_INTERRUPT_ENABLE	(1UL<<20) -#define I915_START_VBLANK_INTERRUPT_ENABLE	(1UL<<18)	/* 965 or later */ -#define I915_VBLANK_INTERRUPT_ENABLE		(1UL<<17) -#define I915_OVERLAY_UPDATED_ENABLE		(1UL<<16) -#define I915_CRC_ERROR_INTERRUPT_STATUS		(1UL<<13) -#define I915_CRC_DONE_INTERRUPT_STATUS		(1UL<<12) -#define I915_GMBUS_INTERRUPT_STATUS		(1UL<<11) -#define I915_HOTPLUG_INTERRUPT_STATUS		(1UL<<10) -#define I915_VSYNC_INTERRUPT_STATUS		(1UL<<9) -#define I915_DISPLAY_LINE_COMPARE_STATUS	(1UL<<8) -#define I915_DPST_EVENT_STATUS			(1UL<<7) -#define I915_LEGACY_BLC_EVENT_STATUS		(1UL<<6) -#define I915_ODD_FIELD_INTERRUPT_STATUS		(1UL<<5) -#define I915_EVEN_FIELD_INTERRUPT_STATUS	(1UL<<4) -#define I915_HOTPLUG_TV_INTERRUPT_STATUS	(1UL<<2) -#define I915_START_VBLANK_INTERRUPT_STATUS	(1UL<<2)	/* 965 or later */ -#define I915_VBLANK_INTERRUPT_STATUS		(1UL<<1) -#define I915_OVERLAY_UPDATED_STATUS		(1UL<<0) - -#define SRX_INDEX		0x3c4 -#define SRX_DATA		0x3c5 -#define SR01			1 -#define SR01_SCREEN_OFF		(1<<5) - -#define PPCR			0x61204 -#define PPCR_ON			(1<<0) - -#define DVOA			0x61120 -#define DVOB			0x61140 -#define DVOC			0x61160 -#define DVO_ENABLE			(1 << 31) -#define DVO_PIPE_B_SELECT		(1 << 30) -#define DVO_PIPE_STALL_UNUSED		(0 << 28) -#define DVO_PIPE_STALL			(1 << 28) -#define DVO_PIPE_STALL_TV		(2 << 28) -#define DVO_PIPE_STALL_MASK		(3 << 28) -#define DVO_USE_VGA_SYNC		(1 << 15) -#define DVO_DATA_ORDER_I740		(0 << 14) -#define DVO_DATA_ORDER_FP		(1 << 14) -#define DVO_VSYNC_DISABLE		(1 << 11) -#define DVO_HSYNC_DISABLE		(1 << 10) -#define DVO_VSYNC_TRISTATE		(1 << 9) -#define DVO_HSYNC_TRISTATE		(1 << 8) -#define DVO_BORDER_ENABLE		(1 << 7) -#define DVO_DATA_ORDER_GBRG		(1 << 6) -#define DVO_DATA_ORDER_RGGB		(0 << 6) -#define DVO_DATA_ORDER_GBRG_ERRATA	(0 << 6) -#define DVO_DATA_ORDER_RGGB_ERRATA	(1 << 6) -#define DVO_VSYNC_ACTIVE_HIGH		(1 << 4) -#define DVO_HSYNC_ACTIVE_HIGH		(1 << 3) -#define DVO_BLANK_ACTIVE_HIGH		(1 << 2) -#define DVO_OUTPUT_CSTATE_PIXELS	(1 << 1)	/* SDG only */ -#define DVO_OUTPUT_SOURCE_SIZE_PIXELS	(1 << 0)	/* SDG only */ -#define DVO_PRESERVE_MASK	(0x7<<24) - -#define DVOA_SRCDIM		0x61124 -#define DVOB_SRCDIM		0x61144 -#define DVOC_SRCDIM		0x61164 -#define DVO_SRCDIM_HORIZONTAL_SHIFT	12 -#define DVO_SRCDIM_VERTICAL_SHIFT	0 - -#define LVDS			0x61180 -#define LVDS_ON			(1<<31) - -#define ADPA			0x61100 -#define ADPA_DPMS_MASK		(~(3<<10)) -#define ADPA_DPMS_ON		(0<<10) -#define ADPA_DPMS_SUSPEND	(1<<10) -#define ADPA_DPMS_STANDBY	(2<<10) -#define ADPA_DPMS_OFF		(3<<10) - -#define NOPID                   0x2094 -#define LP_RING			0x2030 -#define HP_RING			0x2040 -/* The binner has its own ring buffer: - */ -#define HWB_RING		0x2400 - -#define RING_TAIL		0x00 -#define TAIL_ADDR		0x001FFFF8 -#define RING_HEAD		0x04 -#define HEAD_WRAP_COUNT		0xFFE00000 -#define HEAD_WRAP_ONE		0x00200000 -#define HEAD_ADDR		0x001FFFFC -#define RING_START		0x08 -#define START_ADDR		0x0xFFFFF000 -#define RING_LEN		0x0C -#define RING_NR_PAGES		0x001FF000 -#define RING_REPORT_MASK	0x00000006 -#define RING_REPORT_64K		0x00000002 -#define RING_REPORT_128K	0x00000004 -#define RING_NO_REPORT		0x00000000 -#define RING_VALID_MASK		0x00000001 -#define RING_VALID		0x00000001 -#define RING_INVALID		0x00000000 - -/* Instruction parser error reg: - */ -#define IPEIR			0x2088 - -/* Scratch pad debug 0 reg: - */ -#define SCPD0			0x209c - -/* Error status reg: - */ -#define ESR			0x20b8 - -/* Secondary DMA fetch address debug reg: - */ -#define DMA_FADD_S		0x20d4 - -/* Memory Interface Arbitration State - */ -#define MI_ARB_STATE		0x20e4 - -/* Cache mode 0 reg. - *  - Manipulating render cache behaviour is central - *    to the concept of zone rendering, tuning this reg can help avoid - *    unnecessary render cache reads and even writes (for z/stencil) - *    at beginning and end of scene. - * - * - To change a bit, write to this reg with a mask bit set and the - * bit of interest either set or cleared.  EG: (BIT<<16) | BIT to set. - */ -#define Cache_Mode_0		0x2120 -#define CACHE_MODE_0		0x2120 -#define CM0_MASK_SHIFT          16 -#define CM0_IZ_OPT_DISABLE      (1<<6) -#define CM0_ZR_OPT_DISABLE      (1<<5) -#define CM0_DEPTH_EVICT_DISABLE (1<<4) -#define CM0_COLOR_EVICT_DISABLE (1<<3) -#define CM0_DEPTH_WRITE_DISABLE (1<<1) -#define CM0_RC_OP_FLUSH_DISABLE (1<<0) - - -/* Graphics flush control.  A CPU write flushes the GWB of all writes. - * The data is discarded. - */ -#define GFX_FLSH_CNTL		0x2170 - -/* Binner control.  Defines the location of the bin pointer list: - */ -#define BINCTL			0x2420 -#define BC_MASK			(1 << 9) - -/* Binned scene info. - */ -#define BINSCENE		0x2428 -#define BS_OP_LOAD		(1 << 8) -#define BS_MASK			(1 << 22) - -/* Bin command parser debug reg: - */ -#define BCPD			0x2480 - -/* Bin memory control debug reg: - */ -#define BMCD			0x2484 - -/* Bin data cache debug reg: - */ -#define BDCD			0x2488 - -/* Binner pointer cache debug reg: - */ -#define BPCD			0x248c - -/* Binner scratch pad debug reg: - */ -#define BINSKPD			0x24f0 - -/* HWB scratch pad debug reg: - */ -#define HWBSKPD			0x24f4 - -/* Binner memory pool reg: - */ -#define BMP_BUFFER		0x2430 -#define BMP_PAGE_SIZE_4K	(0 << 10) -#define BMP_BUFFER_SIZE_SHIFT	1 -#define BMP_ENABLE		(1 << 0) - -/* Get/put memory from the binner memory pool: - */ -#define BMP_GET			0x2438 -#define BMP_PUT			0x2440 -#define BMP_OFFSET_SHIFT	5 - -/* 3D state packets: - */ -#define GFX_OP_RASTER_RULES    ((0x3<<29)|(0x7<<24)) - -#define GFX_OP_SCISSOR         ((0x3<<29)|(0x1c<<24)|(0x10<<19)) -#define SC_UPDATE_SCISSOR       (0x1<<1) -#define SC_ENABLE_MASK          (0x1<<0) -#define SC_ENABLE               (0x1<<0) - -#define GFX_OP_LOAD_INDIRECT   ((0x3<<29)|(0x1d<<24)|(0x7<<16)) - -#define GFX_OP_SCISSOR_INFO    ((0x3<<29)|(0x1d<<24)|(0x81<<16)|(0x1)) -#define SCI_YMIN_MASK      (0xffff<<16) -#define SCI_XMIN_MASK      (0xffff<<0) -#define SCI_YMAX_MASK      (0xffff<<16) -#define SCI_XMAX_MASK      (0xffff<<0) - -#define GFX_OP_SCISSOR_ENABLE	 ((0x3<<29)|(0x1c<<24)|(0x10<<19)) -#define GFX_OP_SCISSOR_RECT	 ((0x3<<29)|(0x1d<<24)|(0x81<<16)|1) -#define GFX_OP_COLOR_FACTOR      ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0) -#define GFX_OP_STIPPLE           ((0x3<<29)|(0x1d<<24)|(0x83<<16)) -#define GFX_OP_MAP_INFO          ((0x3<<29)|(0x1d<<24)|0x4) -#define GFX_OP_DESTBUFFER_VARS   ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0) -#define GFX_OP_DRAWRECT_INFO     ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3)) - -#define GFX_OP_DRAWRECT_INFO_I965  ((0x7900<<16)|0x2) - -#define SRC_COPY_BLT_CMD                ((2<<29)|(0x43<<22)|4) -#define XY_SRC_COPY_BLT_CMD		((2<<29)|(0x53<<22)|6) -#define XY_MONO_SRC_COPY_IMM_BLT	((2<<29)|(0x71<<22)|5) -#define XY_SRC_COPY_BLT_WRITE_ALPHA	(1<<21) -#define XY_SRC_COPY_BLT_WRITE_RGB	(1<<20) -#define   BLT_DEPTH_8			(0<<24) -#define   BLT_DEPTH_16_565		(1<<24) -#define   BLT_DEPTH_16_1555		(2<<24) -#define   BLT_DEPTH_32			(3<<24) -#define   BLT_ROP_GXCOPY		(0xcc<<16) -#define XY_SRC_COPY_BLT_SRC_TILED	(1<<15) -#define XY_SRC_COPY_BLT_DST_TILED	(1<<11) - -#define MI_BATCH_BUFFER		((0x30<<23)|1) -#define MI_BATCH_BUFFER_START	(0x31<<23) -#define MI_BATCH_BUFFER_END	(0xA<<23) -#define MI_BATCH_NON_SECURE	(1) - -#define MI_BATCH_NON_SECURE_I965 (1<<8) - -#define MI_WAIT_FOR_EVENT       ((0x3<<23)) -#define MI_WAIT_FOR_PLANE_B_FLIP      (1<<6) -#define MI_WAIT_FOR_PLANE_A_FLIP      (1<<2) -#define MI_WAIT_FOR_PLANE_A_SCANLINES (1<<1) - -#define MI_LOAD_SCAN_LINES_INCL  ((0x12<<23)) - -#define CMD_OP_DISPLAYBUFFER_INFO ((0x0<<29)|(0x14<<23)|2) -#define ASYNC_FLIP                (1<<22) -#define DISPLAY_PLANE_A           (0<<20) -#define DISPLAY_PLANE_B           (1<<20) - -/* Display regs */ -#define DSPACNTR                0x70180 -#define DSPBCNTR                0x71180 -#define DISPPLANE_SEL_PIPE_MASK                 (1<<24) - -/* Define the region of interest for the binner: - */ -#define CMD_OP_BIN_CONTROL	 ((0x3<<29)|(0x1d<<24)|(0x84<<16)|4) - -#define CMD_OP_DESTBUFFER_INFO	 ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1) - -#define BREADCRUMB_BITS 31 -#define BREADCRUMB_MASK ((1U << BREADCRUMB_BITS) - 1) - -#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) - -#define BLC_PWM_CTL2		0x61250 - -/** - * 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) - -/* p317, 319 - */ -#define VCLK2_VCO_M        0x6008 /* treat as 16 bit? (includes msbs) */ -#define VCLK2_VCO_N        0x600a -#define VCLK2_VCO_DIV_SEL  0x6012 - -#define VCLK_DIVISOR_VGA0   0x6000 -#define VCLK_DIVISOR_VGA1   0x6004 -#define VCLK_POST_DIV	    0x6010 -/** Selects a post divisor of 4 instead of 2. */ -# define VGA1_PD_P2_DIV_4	(1 << 15) -/** Overrides the p2 post divisor field */ -# define VGA1_PD_P1_DIV_2	(1 << 13) -# define VGA1_PD_P1_SHIFT	8 -/** P1 value is 2 greater than this field */ -# define VGA1_PD_P1_MASK	(0x1f << 8) -/** Selects a post divisor of 4 instead of 2. */ -# define VGA0_PD_P2_DIV_4	(1 << 7) -/** Overrides the p2 post divisor field */ -# define VGA0_PD_P1_DIV_2	(1 << 5) -# define VGA0_PD_P1_SHIFT	0 -/** P1 value is 2 greater than this field */ -# define VGA0_PD_P1_MASK	(0x1f << 0) - -/* PCI D state control register */ -#define D_STATE		0x6104 -#define DSPCLK_GATE_D	0x6200 - -/* 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 HACTIVE_MASK	0x00000fff -#define VTOTAL_MASK	0x00001fff -#define VTOTAL_SHIFT	16 -#define VACTIVE_MASK	0x00000fff -#define VBLANK_END_MASK	0x00001fff -#define VBLANK_END_SHIFT 16 -#define VBLANK_START_MASK 0x00001fff - -#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 PFIT_PIPE_MASK				(3 << 29) -# define PFIT_PIPE_SHIFT			29 -# 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 */ -/** +/* + * Clock control & power management + */ + +#define VGA0	0x6000 +#define VGA1	0x6004 +#define VGA_PD	0x6010 +#define   VGA0_PD_P2_DIV_4	(1 << 7) +#define   VGA0_PD_P1_DIV_2	(1 << 5) +#define   VGA0_PD_P1_SHIFT	0 +#define   VGA0_PD_P1_MASK	(0x1f << 0) +#define   VGA1_PD_P2_DIV_4	(1 << 15) +#define   VGA1_PD_P1_DIV_2	(1 << 13) +#define   VGA1_PD_P1_SHIFT	8 +#define   VGA1_PD_P1_MASK	(0x1f << 8) +#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 -/** +#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 +#define   DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS	0x003f0000 +#define   DPLL_FPA01_P1_POST_DIV_SHIFT	16 +/* i830, required in DVO non-gang */ +#define   PLL_P2_DIVIDE_BY_4		(1 << 23) +#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) - -/** +#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 -/** +#define   SDVO_MULTIPLIER_MASK			0x000000ff +#define   SDVO_MULTIPLIER_SHIFT_HIRES		4 +#define   SDVO_MULTIPLIER_SHIFT_VGA		0 +#define DPLL_A_MD 0x0601c /* 965+ only */ +/*   * 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 -/** +#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 @@ -1160,80 +792,134 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   * 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. +#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   DPLL_MD_VGA_UDI_MULTIPLIER_MASK	0x0000003f +#define   DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT	0 +#define DPLL_B_MD 0x06020 /* 965+ only */ +#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 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 D_STATE		0x6104 +#define CG_2D_DIS	0x6200 +#define CG_3D_DIS	0x6204 -#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 +/* + * Palette regs + */ + +#define PALETTE_A		0x0a000 +#define PALETTE_B		0x0a800 + +/* + * Overlay regs + */ + +#define OVADD			0x30000 +#define DOVSTA			0x30008 +#define OC_BUF			(0x3<<20) +#define OGAMC5			0x30010 +#define OGAMC4			0x30014 +#define OGAMC3			0x30018 +#define OGAMC2			0x3001c +#define OGAMC1			0x30020 +#define OGAMC0			0x30024 + +/* + * Display engine regs + */ + +/* Pipe A timing regs */ +#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 +/* Pipe B timing regs */ +#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 +/* VGA port control */ +#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   ADPA_DPMS_MASK	(~(3<<10)) +#define   ADPA_DPMS_ON		(0<<10) +#define   ADPA_DPMS_SUSPEND	(1<<10) +#define   ADPA_DPMS_STANDBY	(2<<10) +#define   ADPA_DPMS_OFF		(3<<10) + +/* Hotplug control (945+ only) */  #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   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   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) + +/* SDVO port control */  #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) +#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.   * @@ -1241,69 +927,156 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   *   * \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) +#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) | (1 << 26)) -#define SDVOC_PRESERVE_MASK			((1 << 17) | (1 << 26)) +#define   SDVOB_PRESERVE_MASK ((1 << 17) | (1 << 16) | (1 << 14) | (1 << 26)) +#define   SDVOC_PRESERVE_MASK ((1 << 17) | (1 << 26)) -/** @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. - */ +/* DVO port control */ +#define DVOA			0x61120 +#define DVOB			0x61140 +#define DVOC			0x61160 +#define   DVO_ENABLE			(1 << 31) +#define   DVO_PIPE_B_SELECT		(1 << 30) +#define   DVO_PIPE_STALL_UNUSED		(0 << 28) +#define   DVO_PIPE_STALL		(1 << 28) +#define   DVO_PIPE_STALL_TV		(2 << 28) +#define   DVO_PIPE_STALL_MASK		(3 << 28) +#define   DVO_USE_VGA_SYNC		(1 << 15) +#define   DVO_DATA_ORDER_I740		(0 << 14) +#define   DVO_DATA_ORDER_FP		(1 << 14) +#define   DVO_VSYNC_DISABLE		(1 << 11) +#define   DVO_HSYNC_DISABLE		(1 << 10) +#define   DVO_VSYNC_TRISTATE		(1 << 9) +#define   DVO_HSYNC_TRISTATE		(1 << 8) +#define   DVO_BORDER_ENABLE		(1 << 7) +#define   DVO_DATA_ORDER_GBRG		(1 << 6) +#define   DVO_DATA_ORDER_RGGB		(0 << 6) +#define   DVO_DATA_ORDER_GBRG_ERRATA	(0 << 6) +#define   DVO_DATA_ORDER_RGGB_ERRATA	(1 << 6) +#define   DVO_VSYNC_ACTIVE_HIGH		(1 << 4) +#define   DVO_HSYNC_ACTIVE_HIGH		(1 << 3) +#define   DVO_BLANK_ACTIVE_HIGH		(1 << 2) +#define   DVO_OUTPUT_CSTATE_PIXELS	(1 << 1)	/* SDG only */ +#define   DVO_OUTPUT_SOURCE_SIZE_PIXELS	(1 << 0)	/* SDG only */ +#define   DVO_PRESERVE_MASK		(0x7<<24) +#define DVOA_SRCDIM		0x61124 +#define DVOB_SRCDIM		0x61144 +#define DVOC_SRCDIM		0x61164 +#define   DVO_SRCDIM_HORIZONTAL_SHIFT	12 +#define   DVO_SRCDIM_VERTICAL_SHIFT	0 + +/* LVDS port control */  #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) - -/** +#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) -/** +#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) -/** +#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) - -/** +#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   LVDS_B0B3_POWER_MASK		(3 << 2) +#define   LVDS_B0B3_POWER_DOWN		(0 << 2) +#define   LVDS_B0B3_POWER_UP		(3 << 2) + +/* Panel power sequencing */ +#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 PP_ON_DELAYS	0x61208 +#define PP_OFF_DELAYS	0x6120c +#define PP_DIVISOR	0x61210 + +/* Panel fitting */ +#define PFIT_CONTROL	0x61230 +#define   PFIT_ENABLE		(1 << 31) +#define   PFIT_PIPE_MASK	(3 << 29) +#define   PFIT_PIPE_SHIFT	29 +#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 +/* Backlight control */ +#define BLC_PWM_CTL		0x61254 +#define   BACKLIGHT_MODULATION_FREQ_SHIFT		(17) +#define BLC_PWM_CTL2		0x61250 /* 965+ only */ +/* + * 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) + +/* TV port control */  #define TV_CTL			0x68000  /** Enables the TV encoder */  # define TV_ENC_ENABLE			(1 << 31) @@ -1370,11 +1143,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_TEST_MODE_MONITOR_DETECT	(7 << 0)  # define TV_TEST_MODE_MASK		(7 << 0) -/** @} */ -/** @defgroup TV_DAC - * @{ - */  #define TV_DAC			0x68004  /**   * Reports that DAC state change logic has reported change (RO). @@ -1418,7 +1187,6 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  # define DAC_C_1_1_V			(1 << 0)  # define DAC_C_0_7_V			(2 << 0)  # define DAC_C_OFF			(3 << 0) -/** @} */  /**   * CSC coefficients are stored in a floating point format with 9 bits of @@ -1477,9 +1245,6 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  # define TV_AV_MASK			0x000007ff  # define TV_AV_SHIFT			0 -/** @defgroup TV_CSC_KNOBS - * @{ - */  #define TV_CLR_KNOBS		0x68028  /** 2s-complement brightness adjustment */  # define TV_BRIGHTNESS_MASK		0xff000000 @@ -1493,11 +1258,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Hue adjustment, as an integer phase angle in degrees */  # define TV_HUE_MASK			0x000000ff  # define TV_HUE_SHIFT			0 -/** @} */ -/** @defgroup TV_CLR_LEVEL - * @{ - */  #define TV_CLR_LEVEL		0x6802c  /** Controls the DAC level for black */  # define TV_BLACK_LEVEL_MASK		0x01ff0000 @@ -1505,11 +1266,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Controls the DAC level for blanking */  # define TV_BLANK_LEVEL_MASK		0x000001ff  # define TV_BLANK_LEVEL_SHIFT		0 -/* @} */ -/** @defgroup TV_H_CTL_1 - * @{ - */  #define TV_H_CTL_1		0x68030  /** Number of pixels in the hsync. */  # define TV_HSYNC_END_MASK		0x1fff0000 @@ -1517,11 +1274,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Total number of pixels minus one in the line (display and blanking). */  # define TV_HTOTAL_MASK			0x00001fff  # define TV_HTOTAL_SHIFT		0 -/** @} */ -/** @defgroup TV_H_CTL_2 - * @{ - */  #define TV_H_CTL_2		0x68034  /** Enables the colorburst (needed for non-component color) */  # define TV_BURST_ENA			(1 << 31) @@ -1531,11 +1284,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Length of the colorburst */  # define TV_HBURST_LEN_SHIFT		0  # define TV_HBURST_LEN_MASK		0x0001fff -/** @} */ -/** @defgroup TV_H_CTL_3 - * @{ - */  #define TV_H_CTL_3		0x68038  /** End of hblank, measured in pixels minus one from start of hsync */  # define TV_HBLANK_END_SHIFT		16 @@ -1543,11 +1292,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Start of hblank, measured in pixels minus one from start of hsync */  # define TV_HBLANK_START_SHIFT		0  # define TV_HBLANK_START_MASK		0x0001fff -/** @} */ -/** @defgroup TV_V_CTL_1 - * @{ - */  #define TV_V_CTL_1		0x6803c  /** XXX */  # define TV_NBR_END_SHIFT		16 @@ -1558,11 +1303,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** XXX */  # define TV_VI_END_F2_SHIFT		0  # define TV_VI_END_F2_MASK		0x0000003f -/** @} */ -/** @defgroup TV_V_CTL_2 - * @{ - */  #define TV_V_CTL_2		0x68040  /** Length of vsync, in half lines */  # define TV_VSYNC_LEN_MASK		0x07ff0000 @@ -1578,11 +1319,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VSYNC_START_F2_MASK		0x0000007f  # define TV_VSYNC_START_F2_SHIFT	0 -/** @} */ -/** @defgroup TV_V_CTL_3 - * @{ - */  #define TV_V_CTL_3		0x68044  /** Enables generation of the equalization signal */  # define TV_EQUAL_ENA			(1 << 31) @@ -1600,11 +1337,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VEQ_START_F2_MASK		0x000007f  # define TV_VEQ_START_F2_SHIFT		0 -/** @} */ -/** @defgroup TV_V_CTL_4 - * @{ - */  #define TV_V_CTL_4		0x68048  /**   * Offset to start of vertical colorburst, measured in one less than the @@ -1618,11 +1351,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VBURST_END_F1_MASK		0x000000ff  # define TV_VBURST_END_F1_SHIFT		0 -/** @} */ -/** @defgroup TV_V_CTL_5 - * @{ - */  #define TV_V_CTL_5		0x6804c  /**   * Offset to start of vertical colorburst, measured in one less than the @@ -1636,11 +1365,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VBURST_END_F2_MASK		0x000000ff  # define TV_VBURST_END_F2_SHIFT		0 -/** @} */ -/** @defgroup TV_V_CTL_6 - * @{ - */  #define TV_V_CTL_6		0x68050  /**   * Offset to start of vertical colorburst, measured in one less than the @@ -1654,11 +1379,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VBURST_END_F3_MASK		0x000000ff  # define TV_VBURST_END_F3_SHIFT		0 -/** @} */ -/** @defgroup TV_V_CTL_7 - * @{ - */  #define TV_V_CTL_7		0x68054  /**   * Offset to start of vertical colorburst, measured in one less than the @@ -1672,11 +1393,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VBURST_END_F4_MASK		0x000000ff  # define TV_VBURST_END_F4_SHIFT		0 -/** @} */ -/** @defgroup TV_SC_CTL_1 - * @{ - */  #define TV_SC_CTL_1		0x68060  /** Turns on the first subcarrier phase generation DDA */  # define TV_SC_DDA1_EN			(1 << 31) @@ -1698,11 +1415,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Sets the increment of the first subcarrier phase generation DDA */  # define TV_SCDDA1_INC_MASK		0x00000fff  # define TV_SCDDA1_INC_SHIFT		0 -/** @} */ -/** @defgroup TV_SC_CTL_2 - * @{ - */  #define TV_SC_CTL_2		0x68064  /** Sets the rollover for the second subcarrier phase generation DDA */  # define TV_SCDDA2_SIZE_MASK		0x7fff0000 @@ -1710,11 +1423,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Sets the increent of the second subcarrier phase generation DDA */  # define TV_SCDDA2_INC_MASK		0x00007fff  # define TV_SCDDA2_INC_SHIFT		0 -/** @} */ -/** @defgroup TV_SC_CTL_3 - * @{ - */  #define TV_SC_CTL_3		0x68068  /** Sets the rollover for the third subcarrier phase generation DDA */  # define TV_SCDDA3_SIZE_MASK		0x7fff0000 @@ -1722,11 +1431,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Sets the increent of the third subcarrier phase generation DDA */  # define TV_SCDDA3_INC_MASK		0x00007fff  # define TV_SCDDA3_INC_SHIFT		0 -/** @} */ -/** @defgroup TV_WIN_POS - * @{ - */  #define TV_WIN_POS		0x68070  /** X coordinate of the display from the start of horizontal active */  # define TV_XPOS_MASK			0x1fff0000 @@ -1734,11 +1439,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Y coordinate of the display from the start of vertical active (NBR) */  # define TV_YPOS_MASK			0x00000fff  # define TV_YPOS_SHIFT			0 -/** @} */ -/** @defgroup TV_WIN_SIZE - * @{ - */  #define TV_WIN_SIZE		0x68074  /** Horizontal size of the display window, measured in pixels*/  # define TV_XSIZE_MASK			0x1fff0000 @@ -1750,11 +1451,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_YSIZE_MASK			0x00000fff  # define TV_YSIZE_SHIFT			0 -/** @} */ -/** @defgroup TV_FILTER_CTL_1 - * @{ - */  #define TV_FILTER_CTL_1		0x68080  /**   * Enables automatic scaling calculation. @@ -1787,11 +1484,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_HSCALE_FRAC_MASK		0x00003fff  # define TV_HSCALE_FRAC_SHIFT		0 -/** @} */ -/** @defgroup TV_FILTER_CTL_2 - * @{ - */  #define TV_FILTER_CTL_2		0x68084  /**   * Sets the integer part of the 3.15 fixed-point vertical scaling factor. @@ -1807,11 +1500,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VSCALE_FRAC_MASK		0x00007fff  # define TV_VSCALE_FRAC_SHIFT		0 -/** @} */ -/** @defgroup TV_FILTER_CTL_3 - * @{ - */  #define TV_FILTER_CTL_3		0x68088  /**   * Sets the integer part of the 3.15 fixed-point vertical scaling factor. @@ -1831,11 +1520,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);   */  # define TV_VSCALE_IP_FRAC_MASK		0x00007fff  # define TV_VSCALE_IP_FRAC_SHIFT		0 -/** @} */ -/** @defgroup TV_CC_CONTROL - * @{ - */  #define TV_CC_CONTROL		0x68090  # define TV_CC_ENABLE			(1 << 31)  /** @@ -1851,11 +1536,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** Sets the vertical position of the CC data.  Usually 21 */  # define TV_CC_LINE_MASK		0x0000003f  # define TV_CC_LINE_SHIFT		0 -/** @} */ -/** @defgroup TV_CC_DATA - * @{ - */  #define TV_CC_DATA		0x68094  # define TV_CC_RDY			(1 << 31)  /** Second word of CC data to be transmitted. */ @@ -1864,10 +1545,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  /** First word of CC data to be transmitted. */  # define TV_CC_DATA_1_MASK		0x0000007f  # define TV_CC_DATA_1_SHIFT		0 -/** @} - */ -/** @{ */  #define TV_H_LUMA_0		0x68100  #define TV_H_LUMA_59		0x681ec  #define TV_H_CHROMA_0		0x68200 @@ -1877,102 +1555,131 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  #define TV_V_CHROMA_0		0x68400  #define TV_V_CHROMA_42		0x684a8 -#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 DSPARB	  0x70030 -#define DSPARB_CSTART_MASK	(0x7f << 7) -#define DSPARB_CSTART_SHIFT	7 -#define DSPARB_BSTART_MASK	(0x7f)		  -#define DSPARB_BSTART_SHIFT	0 - -#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 +/* Display & cursor control */ -#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 +/* Pipe A */ +#define PIPEADSL		0x70000 +#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 PIPEASTAT		0x70024 +#define   PIPE_FIFO_UNDERRUN_STATUS		(1UL<<31) +#define   PIPE_CRC_ERROR_ENABLE			(1UL<<29) +#define   PIPE_CRC_DONE_ENABLE			(1UL<<28) +#define   PIPE_GMBUS_EVENT_ENABLE		(1UL<<27) +#define   PIPE_HOTPLUG_INTERRUPT_ENABLE		(1UL<<26) +#define   PIPE_VSYNC_INTERRUPT_ENABLE		(1UL<<25) +#define   PIPE_DISPLAY_LINE_COMPARE_ENABLE	(1UL<<24) +#define   PIPE_DPST_EVENT_ENABLE		(1UL<<23) +#define   PIPE_LEGACY_BLC_EVENT_ENABLE		(1UL<<22) +#define   PIPE_ODD_FIELD_INTERRUPT_ENABLE	(1UL<<21) +#define   PIPE_EVEN_FIELD_INTERRUPT_ENABLE	(1UL<<20) +#define   PIPE_HOTPLUG_TV_INTERRUPT_ENABLE	(1UL<<18) /* pre-965 */ +#define   PIPE_START_VBLANK_INTERRUPT_ENABLE	(1UL<<18) /* 965 or later */ +#define   PIPE_VBLANK_INTERRUPT_ENABLE		(1UL<<17) +#define   PIPE_OVERLAY_UPDATED_ENABLE		(1UL<<16) +#define   PIPE_CRC_ERROR_INTERRUPT_STATUS	(1UL<<13) +#define   PIPE_CRC_DONE_INTERRUPT_STATUS	(1UL<<12) +#define   PIPE_GMBUS_INTERRUPT_STATUS		(1UL<<11) +#define   PIPE_HOTPLUG_INTERRUPT_STATUS		(1UL<<10) +#define   PIPE_VSYNC_INTERRUPT_STATUS		(1UL<<9) +#define   PIPE_DISPLAY_LINE_COMPARE_STATUS	(1UL<<8) +#define   PIPE_DPST_EVENT_STATUS		(1UL<<7) +#define   PIPE_LEGACY_BLC_EVENT_STATUS		(1UL<<6) +#define   PIPE_ODD_FIELD_INTERRUPT_STATUS	(1UL<<5) +#define   PIPE_EVEN_FIELD_INTERRUPT_STATUS	(1UL<<4) +#define   PIPE_HOTPLUG_TV_INTERRUPT_STATUS	(1UL<<2) /* pre-965 */ +#define   PIPE_START_VBLANK_INTERRUPT_STATUS	(1UL<<2) /* 965 or later */ +#define   PIPE_VBLANK_INTERRUPT_STATUS		(1UL<<1) +#define   PIPE_OVERLAY_UPDATED_STATUS		(1UL<<0) + +#define DSPARB			0x70030 +#define   DSPARB_CSTART_MASK	(0x7f << 7) +#define   DSPARB_CSTART_SHIFT	7 +#define   DSPARB_BSTART_MASK	(0x7f)		  +#define   DSPARB_BSTART_SHIFT	0 +/* + * The two pipe frame counter registers are not synchronized, so + * reading a stable value is somewhat tricky. The following code  + * should work: + * + *  do { + *    high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >> + *             PIPE_FRAME_HIGH_SHIFT; + *    low1 =  ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >> + *             PIPE_FRAME_LOW_SHIFT); + *    high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >> + *             PIPE_FRAME_HIGH_SHIFT); + *  } while (high1 != high2); + *  frame = (high1 << 8) | low1; + */ +#define PIPEAFRAMEHIGH          0x70040 +#define   PIPE_FRAME_HIGH_MASK    0x0000ffff +#define   PIPE_FRAME_HIGH_SHIFT   0 +#define PIPEAFRAMEPIXEL         0x70044 +#define   PIPE_FRAME_LOW_MASK     0xff000000 +#define   PIPE_FRAME_LOW_SHIFT    24 +#define   PIPE_PIXEL_MASK         0x00ffffff +#define   PIPE_PIXEL_SHIFT        0 + +/* Cursor A & B regs */ +#define CURACNTR		0x70080 +#define   CURSOR_MODE_DISABLE   0x00 +#define   CURSOR_MODE_64_32B_AX 0x07 +#define   CURSOR_MODE_64_ARGB_AX ((1 << 5) | CURSOR_MODE_64_32B_AX) +#define   MCURSOR_GAMMA_ENABLE  (1 << 26) +#define CURABASE		0x70084 +#define CURAPOS			0x70088 +#define   CURSOR_POS_MASK       0x007FF +#define   CURSOR_POS_SIGN       0x8000 +#define   CURSOR_X_SHIFT        0 +#define   CURSOR_Y_SHIFT        16 +#define CURBCNTR		0x700c0 +#define CURBBASE		0x700c4 +#define CURBPOS			0x700c8 + +/* Display A control */ +#define DSPACNTR                0x70180 +#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) +#define DSPAADDR		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) - -/* - * Some BIOS scratch area registers.  The 845 (and 830?) store the amount - * of video memory available to the BIOS in SWF1. - */ +#define DSPASURF		0x7019C /* 965+ only */ +#define DSPATILEOFF		0x701A4 /* 965+ only */ +/* VBIOS flags */  #define SWF0			0x71410  #define SWF1			0x71414  #define SWF2			0x71418 @@ -1986,27 +1693,33 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  #define SWF31			0x72418  #define SWF32			0x7241c -/* - * Overlay registers.  These are overlay registers accessed via MMIO. - * Those loaded via the overlay register page are defined in i830_video.c. - */ -#define OVADD			0x30000 +/* Pipe B */ +#define PIPEBDSL		0x71000 +#define PIPEBCONF		0x71008 +#define PIPEBSTAT		0x71024 +#define PIPEBFRAMEHIGH		0x71040 +#define PIPEBFRAMEPIXEL		0x71044 -#define DOVSTA			0x30008 -#define OC_BUF			(0x3<<20) +/* Display B control */ +#define DSPBCNTR		0x71180 +#define   DISPPLANE_ALPHA_TRANS_ENABLE		(1<<15) +#define   DISPPLANE_ALPHA_TRANS_DISABLE		0 +#define   DISPPLANE_SPRITE_ABOVE_DISPLAY	0 +#define   DISPPLANE_SPRITE_ABOVE_OVERLAY	(1) +#define DSPBADDR		0x71184 +#define DSPBSTRIDE		0x71188 +#define DSPBPOS			0x7118C +#define DSPBSIZE		0x71190 +#define DSPBSURF		0x7119C +#define DSPBTILEOFF		0x711A4 -#define OGAMC5			0x30010 -#define OGAMC4			0x30014 -#define OGAMC3			0x30018 -#define OGAMC2			0x3001c -#define OGAMC1			0x30020 -#define OGAMC0			0x30024 +/* VBIOS regs */ +#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 +/* Chipset type macros */  #define IS_I830(dev) ((dev)->pci_device == 0x3577)  #define IS_845G(dev) ((dev)->pci_device == 0x2562) @@ -2043,6 +1756,4 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);  #define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev)) -#define PRIMARY_RINGBUFFER_SIZE         (128*1024) -  #endif diff --git a/shared-core/i915_init.c b/shared-core/i915_init.c index 22577c7f..0bbad65e 100644 --- a/shared-core/i915_init.c +++ b/shared-core/i915_init.c @@ -112,9 +112,9 @@ int i915_load_modeset_init(struct drm_device *dev)  	drm_bo_init_mm(dev, DRM_BO_MEM_VRAM, 0, prealloc_size >> PAGE_SHIFT, 1);  	drm_bo_init_mm(dev, DRM_BO_MEM_TT, prealloc_size >> PAGE_SHIFT,  		       (agp_size - prealloc_size) >> PAGE_SHIFT, 1); -	I915_WRITE(LP_RING + RING_LEN, 0); -	I915_WRITE(LP_RING + RING_HEAD, 0); -	I915_WRITE(LP_RING + RING_TAIL, 0); +	I915_WRITE(PRB0_CTL, 0); +	I915_WRITE(PRB0_HEAD, 0); +	I915_WRITE(PRB0_TAIL, 0);  	size = PRIMARY_RINGBUFFER_SIZE;  	ret = drm_buffer_object_create(dev, size, drm_bo_type_kernel, @@ -146,10 +146,9 @@ int i915_load_modeset_init(struct drm_device *dev)  			dev_priv->ring.virtual_start, dev_priv->ring.Size);  	memset((void *)(dev_priv->ring.virtual_start), 0, dev_priv->ring.Size); -	I915_WRITE(LP_RING + RING_START, dev_priv->ring.Start); -	I915_WRITE(LP_RING + RING_LEN, -			((dev_priv->ring.Size - 4096) & RING_NR_PAGES) | -			(RING_NO_REPORT | RING_VALID)); +	I915_WRITE(PRB0_START, dev_priv->ring.Start); +	I915_WRITE(PRB0_CTL, ((dev_priv->ring.Size - 4096) & RING_NR_PAGES) | +		   (RING_NO_REPORT | RING_VALID));  	/* We are using separate values as placeholders for mechanisms for  	 * private backbuffer/depthbuffer usage. @@ -175,7 +174,7 @@ int i915_load_modeset_init(struct drm_device *dev)  		memset(dev_priv->hw_status_page, 0, PAGE_SIZE); -		I915_WRITE(I915REG_HWS_PGA, dev_priv->dma_status_page); +		I915_WRITE(HWS_PGA, dev_priv->dma_status_page);  	} else {  		size = 4 * 1024;  		ret = drm_buffer_object_create(dev, size, @@ -210,7 +209,7 @@ int i915_load_modeset_init(struct drm_device *dev)  		}  		dev_priv->hw_status_page = dev_priv->hws_map.handle;  		memset(dev_priv->hw_status_page, 0, PAGE_SIZE); -		I915_WRITE(I915REG_HWS_PGA, dev_priv->status_gfx_addr); +		I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);  	}  	DRM_DEBUG("Enabled hardware status page\n"); @@ -261,7 +260,7 @@ destroy_hws:  		if (dev_priv->hws_bo)  			drm_bo_usage_deref_unlocked(&dev_priv->hws_bo);  	} -	I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); +	I915_WRITE(HWS_PGA, 0x1ffff000);  destroy_ringbuffer:  	if (dev_priv->ring.virtual_start)  		drm_mem_reg_iounmap(dev, &dev_priv->ring_buffer->mem, @@ -381,7 +380,7 @@ int i915_driver_unload(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; -	I915_WRITE(LP_RING + RING_LEN, 0); +	I915_WRITE(PRB0_CTL, 0);  	if (drm_core_check_feature(dev, DRIVER_MODESET)) {  		drm_irq_uninstall(dev); @@ -413,14 +412,14 @@ int i915_driver_unload(struct drm_device *dev)  		dev_priv->hw_status_page = NULL;  		dev_priv->dma_status_page = 0;  		/* Need to rewrite hardware status page */ -		I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); +		I915_WRITE(HWS_PGA, 0x1ffff000);  	}  	if (dev_priv->status_gfx_addr) {  		dev_priv->status_gfx_addr = 0;  		drm_core_ioremapfree(&dev_priv->hws_map, dev);  		drm_bo_usage_deref_unlocked(&dev_priv->hws_bo); -		I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); +		I915_WRITE(HWS_PGA, 0x1ffff000);  	}  	if (drm_core_check_feature(dev, DRIVER_MODESET)) { diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index 4aef568e..38995421 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -636,9 +636,9 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)  	/* On i8xx/i915 hw the IIR and IER are 16bit on i9xx its 32bit */  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -		iir = I915_READ(I915REG_INT_IDENTITY_R); +		iir = I915_READ(IIR);  	else -		iir = I915_READ16(I915REG_INT_IDENTITY_R); +		iir = I915_READ16(IIR);  	iir &= (dev_priv->irq_enable_reg | I915_USER_INTERRUPT); @@ -649,10 +649,10 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)  #if 0  		DRM_DEBUG ("iir 0x%08x im 0x%08x ie 0x%08x pipea 0x%08x pipeb 0x%08x\n",  			   iir, -			   I915_READ(I915REG_INT_MASK_R), -			   I915_READ(I915REG_INT_ENABLE_R), -			   I915_READ(I915REG_PIPEASTAT), -			   I915_READ(I915REG_PIPEBSTAT)); +			   I915_READ(IMR), +			   I915_READ(IER), +			   I915_READ(PIPEASTAT), +			   I915_READ(PIPEBSTAT));  #endif  		return IRQ_NONE;  	} @@ -662,19 +662,19 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)  	 * we may get extra interrupts.  	 */  	if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) { -		pipea_stats = I915_READ(I915REG_PIPEASTAT); -		if (pipea_stats & (I915_START_VBLANK_INTERRUPT_STATUS| -				   I915_VBLANK_INTERRUPT_STATUS)) +		pipea_stats = I915_READ(PIPEASTAT); +		if (pipea_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| +				   PIPE_VBLANK_INTERRUPT_STATUS))  		{  			vblank++;  			drm_handle_vblank(dev, i915_get_plane(dev, 0));  		}  		/* This is a global event, and not a pipe A event */ -		if (pipea_stats & I915_HOTPLUG_INTERRUPT_STATUS) +		if (pipea_stats & PIPE_HOTPLUG_INTERRUPT_STATUS)  			hotplug = 1; -		if (pipea_stats & I915_HOTPLUG_TV_INTERRUPT_STATUS) { +		if (pipea_stats & PIPE_HOTPLUG_TV_INTERRUPT_STATUS) {  			hotplug = 1;  			/* Toggle hotplug detection to clear hotplug status */  			tvdac = I915_READ(TV_DAC); @@ -682,27 +682,27 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)  			I915_WRITE(TV_DAC, tvdac | TVDAC_STATE_CHG_EN);  		} -		I915_WRITE(I915REG_PIPEASTAT, pipea_stats); +		I915_WRITE(PIPEASTAT, pipea_stats);  	}  	if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) { -		pipeb_stats = I915_READ(I915REG_PIPEBSTAT); -		if (pipeb_stats & (I915_START_VBLANK_INTERRUPT_STATUS| -				   I915_VBLANK_INTERRUPT_STATUS)) +		pipeb_stats = I915_READ(PIPEBSTAT); +		if (pipeb_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| +				   PIPE_VBLANK_INTERRUPT_STATUS))  		{  			vblank++;  			drm_handle_vblank(dev, i915_get_plane(dev, 1));  		} -		I915_WRITE(I915REG_PIPEBSTAT, pipeb_stats); +		I915_WRITE(PIPEBSTAT, pipeb_stats);  	}  	/* Clear the generated interrupt */  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) { -		I915_WRITE(I915REG_INT_IDENTITY_R, iir); -		(void) I915_READ(I915REG_INT_IDENTITY_R); +		I915_WRITE(IIR, iir); +		(void) I915_READ(IIR);  	} else { -		I915_WRITE16(I915REG_INT_IDENTITY_R, iir); -		(void) I915_READ16(I915REG_INT_IDENTITY_R); +		I915_WRITE16(IIR, iir); +		(void) I915_READ16(IIR);  	}  	if (dev->primary->master) { @@ -728,10 +728,10 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)  		DRM_INFO("Hotplug event received\n");  		if (!IS_I9XX(dev) || IS_I915G(dev) || IS_I915GM(dev)) { -			if (pipea_stats & I915_HOTPLUG_INTERRUPT_STATUS) +			if (pipea_stats & PIPE_HOTPLUG_INTERRUPT_STATUS)  				temp2 |= SDVOB_HOTPLUG_INT_STATUS |  					SDVOC_HOTPLUG_INT_STATUS; -			if (pipea_stats & I915_HOTPLUG_TV_INTERRUPT_STATUS) +			if (pipea_stats & PIPE_HOTPLUG_TV_INTERRUPT_STATUS)  				temp2 |= TV_HOTPLUG_INT_STATUS;  		} else {  			temp2 = I915_READ(PORT_HOTPLUG_STAT); @@ -757,7 +757,7 @@ int i915_emit_irq(struct drm_device *dev)  	BEGIN_LP_RING(2);  	OUT_RING(0); -	OUT_RING(GFX_OP_USER_INTERRUPT); +	OUT_RING(MI_USER_INTERRUPT);  	ADVANCE_LP_RING();  	return dev_priv->counter; @@ -771,9 +771,9 @@ void i915_user_irq_on(struct drm_device *dev)  	if (dev_priv->irq_enabled && (++dev_priv->user_irq_refcount == 1)){  		dev_priv->irq_enable_reg |= I915_USER_INTERRUPT;  		if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -			I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +			I915_WRITE(IER, dev_priv->irq_enable_reg);  		else -			I915_WRITE16(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +			I915_WRITE16(IER, dev_priv->irq_enable_reg);  	}  	DRM_SPINUNLOCK(&dev_priv->user_irq_lock); @@ -787,9 +787,9 @@ void i915_user_irq_off(struct drm_device *dev)  	if (dev_priv->irq_enabled && (--dev_priv->user_irq_refcount == 0)) {  		//		dev_priv->irq_enable_reg &= ~I915_USER_INTERRUPT;  		//		if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -		//			I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		//			I915_WRITE(IER, dev_priv->irq_enable_reg);  		//		else -		//			I915_WRITE16(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		//			I915_WRITE16(IER, dev_priv->irq_enable_reg);  	}  	DRM_SPINUNLOCK(&dev_priv->user_irq_lock);  } @@ -876,11 +876,11 @@ int i915_enable_vblank(struct drm_device *dev, int plane)  	switch (pipe) {  	case 0: -		pipestat_reg = I915REG_PIPEASTAT; +		pipestat_reg = PIPEASTAT;  		dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;  		break;  	case 1: -		pipestat_reg = I915REG_PIPEBSTAT; +		pipestat_reg = PIPEBSTAT;  		dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;  		break;  	default: @@ -897,21 +897,21 @@ int i915_enable_vblank(struct drm_device *dev, int plane)  		 * but   		 */  		if (IS_I965G (dev)) -			pipestat |= I915_START_VBLANK_INTERRUPT_ENABLE; +			pipestat |= PIPE_START_VBLANK_INTERRUPT_ENABLE;  		else -			pipestat |= I915_VBLANK_INTERRUPT_ENABLE; +			pipestat |= PIPE_VBLANK_INTERRUPT_ENABLE;  		/*  		 * Clear any pending status  		 */ -		pipestat |= (I915_START_VBLANK_INTERRUPT_STATUS | -			     I915_VBLANK_INTERRUPT_STATUS); +		pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | +			     PIPE_VBLANK_INTERRUPT_STATUS);  		I915_WRITE(pipestat_reg, pipestat);  	}  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -		I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		I915_WRITE(IER, dev_priv->irq_enable_reg);  	else -		I915_WRITE16(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		I915_WRITE16(IER, dev_priv->irq_enable_reg);  	return 0; @@ -926,11 +926,11 @@ void i915_disable_vblank(struct drm_device *dev, int plane)  	switch (pipe) {  	case 0: -		pipestat_reg = I915REG_PIPEASTAT; +		pipestat_reg = PIPEASTAT;  		dev_priv->irq_enable_reg &= ~I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;  		break;  	case 1: -		pipestat_reg = I915REG_PIPEBSTAT; +		pipestat_reg = PIPEBSTAT;  		dev_priv->irq_enable_reg &= ~I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;  		break;  	default: @@ -940,20 +940,20 @@ void i915_disable_vblank(struct drm_device *dev, int plane)  	}  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -		I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		I915_WRITE(IER, dev_priv->irq_enable_reg);  	else -		I915_WRITE16(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		I915_WRITE16(IER, dev_priv->irq_enable_reg);  	if (pipestat_reg)  	{  		pipestat = I915_READ (pipestat_reg); -		pipestat &= ~(I915_START_VBLANK_INTERRUPT_ENABLE | -			      I915_VBLANK_INTERRUPT_ENABLE); +		pipestat &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | +			      PIPE_VBLANK_INTERRUPT_ENABLE);  		/*  		 * Clear any pending status  		 */ -		pipestat |= (I915_START_VBLANK_INTERRUPT_STATUS | -			     I915_VBLANK_INTERRUPT_STATUS); +		pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | +			     PIPE_VBLANK_INTERRUPT_STATUS);  		I915_WRITE(pipestat_reg, pipestat);  	}  } @@ -973,11 +973,11 @@ void i915_enable_interrupt (struct drm_device *dev)  			dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;  		/* Enable global interrupts for hotplug - not a pipeA event */ -		I915_WRITE(I915REG_PIPEASTAT, I915_READ(I915REG_PIPEASTAT) | -			   I915_HOTPLUG_INTERRUPT_ENABLE | -			   I915_HOTPLUG_TV_INTERRUPT_ENABLE | -			   I915_HOTPLUG_TV_CLEAR | -			   I915_HOTPLUG_CLEAR); +		I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) | +			   PIPE_HOTPLUG_INTERRUPT_ENABLE | +			   PIPE_HOTPLUG_TV_INTERRUPT_ENABLE | +			   PIPE_HOTPLUG_TV_INTERRUPT_STATUS | +			   PIPE_HOTPLUG_INTERRUPT_STATUS);  	}  	if (dev_priv->irq_enable_reg & (I915_DISPLAY_PORT_INTERRUPT | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT)) { @@ -1025,9 +1025,9 @@ void i915_enable_interrupt (struct drm_device *dev)  	}  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -		I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		I915_WRITE(IER, dev_priv->irq_enable_reg);  	else -		I915_WRITE16(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg); +		I915_WRITE16(IER, dev_priv->irq_enable_reg);  	dev_priv->irq_enabled = 1;  } @@ -1068,9 +1068,9 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,  	}  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) -		flag = I915_READ(I915REG_INT_ENABLE_R); +		flag = I915_READ(IER);  	else -		flag = I915_READ16(I915REG_INT_ENABLE_R); +		flag = I915_READ16(IER);  	pipe->pipe = 0;  	if (flag & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) @@ -1249,23 +1249,23 @@ void i915_driver_irq_preinstall(struct drm_device * dev)  	struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;  	u32 tmp; -	tmp = I915_READ(I915REG_PIPEASTAT); -	I915_WRITE(I915REG_PIPEASTAT, tmp); -	tmp = I915_READ(I915REG_PIPEBSTAT); -	I915_WRITE(I915REG_PIPEBSTAT, tmp); +	tmp = I915_READ(PIPEASTAT); +	I915_WRITE(PIPEASTAT, tmp); +	tmp = I915_READ(PIPEBSTAT); +	I915_WRITE(PIPEBSTAT, tmp); -	I915_WRITE16(I915REG_HWSTAM, 0xeffe); +	I915_WRITE16(HWSTAM, 0xeffe);  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) { -		I915_WRITE(I915REG_INT_MASK_R, 0x0); -		I915_WRITE(I915REG_INT_ENABLE_R, 0x0); -		tmp = I915_READ(I915REG_INT_IDENTITY_R); -		I915_WRITE(I915REG_INT_IDENTITY_R, tmp); +		I915_WRITE(IMR, 0x0); +		I915_WRITE(IER, 0x0); +		tmp = I915_READ(IIR); +		I915_WRITE(IIR, tmp);  	} else { -		I915_WRITE16(I915REG_INT_MASK_R, 0x0); -		I915_WRITE16(I915REG_INT_ENABLE_R, 0x0); -		tmp = I915_READ16(I915REG_INT_IDENTITY_R); -		I915_WRITE16(I915REG_INT_IDENTITY_R, tmp); +		I915_WRITE16(IMR, 0x0); +		I915_WRITE16(IER, 0x0); +		tmp = I915_READ16(IIR); +		I915_WRITE16(IIR, tmp);  	}  } @@ -1300,7 +1300,7 @@ int i915_driver_irq_postinstall(struct drm_device * dev)  	 * Initialize the hardware status page IRQ location.  	 */ -	I915_WRITE(I915REG_INSTPM, (1 << 5) | (1 << 21)); +	I915_WRITE(INSTPM, (1 << 5) | (1 << 21));  	return 0;  } @@ -1314,23 +1314,23 @@ void i915_driver_irq_uninstall(struct drm_device * dev)  	dev_priv->irq_enabled = 0; -	temp = I915_READ(I915REG_PIPEASTAT); -	I915_WRITE(I915REG_PIPEASTAT, temp); -	temp = I915_READ(I915REG_PIPEBSTAT); -	I915_WRITE(I915REG_PIPEBSTAT, temp); +	temp = I915_READ(PIPEASTAT); +	I915_WRITE(PIPEASTAT, temp); +	temp = I915_READ(PIPEBSTAT); +	I915_WRITE(PIPEBSTAT, temp);  	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) { -		I915_WRITE(I915REG_HWSTAM, 0xffffffff); -		I915_WRITE(I915REG_INT_MASK_R, 0xffffffff); -		I915_WRITE(I915REG_INT_ENABLE_R, 0x0); +		I915_WRITE(HWSTAM, 0xffffffff); +		I915_WRITE(IMR, 0xffffffff); +		I915_WRITE(IER, 0x0); -		temp = I915_READ(I915REG_INT_IDENTITY_R); -		I915_WRITE(I915REG_INT_IDENTITY_R, temp); +		temp = I915_READ(IIR); +		I915_WRITE(IIR, temp);  	} else { -		I915_WRITE16(I915REG_HWSTAM, 0xffff); -		I915_WRITE16(I915REG_INT_MASK_R, 0xffff); -		I915_WRITE16(I915REG_INT_ENABLE_R, 0x0); +		I915_WRITE16(HWSTAM, 0xffff); +		I915_WRITE16(IMR, 0xffff); +		I915_WRITE16(IER, 0x0); -		temp = I915_READ16(I915REG_INT_IDENTITY_R); -		I915_WRITE16(I915REG_INT_IDENTITY_R, temp); +		temp = I915_READ16(IIR); +		I915_WRITE16(IIR, temp);  	}  }  | 
