diff options
3 files changed, 2113 insertions, 2283 deletions
| diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch new file mode 100644 index 0000000000..1841a681d2 --- /dev/null +++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/i915_split.patch @@ -0,0 +1,1627 @@ +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_tv.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_tv.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_tv.c	2009-02-19 12:59:28.000000000 +0000 +@@ -902,7 +902,7 @@ + intel_tv_dpms(struct drm_encoder *encoder, int mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	switch(mode) { + 	case DRM_MODE_DPMS_ON: +@@ -920,7 +920,7 @@ + intel_tv_save(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_tv_priv *tv_priv = intel_output->dev_priv; + 	int i; +@@ -970,7 +970,7 @@ + intel_tv_restore(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_tv_priv *tv_priv = intel_output->dev_priv; + 	struct drm_crtc *crtc = connector->encoder->crtc; +@@ -1117,7 +1117,7 @@ + 		  struct drm_display_mode *adjusted_mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_crtc *crtc = encoder->crtc; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	struct intel_output *intel_output = enc_to_intel_output(encoder); +@@ -1362,6 +1362,7 @@ + 	struct drm_encoder *encoder = &intel_output->enc; + 	struct drm_device *dev = encoder->dev; + 	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	unsigned long irqflags; + 	u32 tv_ctl, save_tv_ctl; + 	u32 tv_dac, save_tv_dac; +@@ -1626,6 +1627,7 @@ + intel_tv_init(struct drm_device *dev) + { + 	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_connector *connector; + 	struct intel_output *intel_output; + 	struct intel_tv_priv *tv_priv; +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_modes.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_modes.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_modes.c	2009-02-19 12:59:28.000000000 +0000 +@@ -81,3 +81,6 @@ +  + 	return ret; + } ++EXPORT_SYMBOL(intel_ddc_get_modes); ++ ++MODULE_LICENSE("GPL and additional rights"); +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_i2c.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_i2c.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_i2c.c	2009-02-20 14:50:20.000000000 +0000 +@@ -43,7 +43,7 @@ + static int get_clock(void *data) + { + 	struct intel_i2c_chan *chan = data; +-	struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private; + 	u32 val; +  + 	val = I915_READ(chan->reg); +@@ -53,7 +53,7 @@ + static int get_data(void *data) + { + 	struct intel_i2c_chan *chan = data; +-	struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private; + 	u32 val; +  + 	val = I915_READ(chan->reg); +@@ -64,7 +64,7 @@ + { + 	struct intel_i2c_chan *chan = data; + 	struct drm_device *dev = chan->drm_dev; +-	struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private; + 	u32 reserved = 0, clock_bits; +  + 	/* On most chips, these bits must be preserved in software. */ +@@ -85,7 +85,7 @@ + { + 	struct intel_i2c_chan *chan = data; + 	struct drm_device *dev = chan->drm_dev; +-	struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = chan->drm_dev->dev_private; + 	u32 reserved = 0, data_bits; +  + 	/* On most chips, these bits must be preserved in software. */ +@@ -167,6 +167,7 @@ + 	kfree(chan); + 	return NULL; + } ++EXPORT_SYMBOL(intel_i2c_create); +  + /** +  * intel_i2c_destroy - unregister and free i2c bus resources +@@ -182,3 +183,4 @@ + 	i2c_del_adapter(&chan->adapter); + 	kfree(chan); + } ++EXPORT_SYMBOL(intel_i2c_destroy); +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_dvo.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_dvo.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_dvo.c	2009-02-19 15:14:20.000000000 +0000 +@@ -78,7 +78,7 @@ +  + static void intel_dvo_dpms(struct drm_encoder *encoder, int mode) + { +-	struct drm_i915_private *dev_priv = encoder->dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = encoder->dev->dev_private; + 	struct intel_output *intel_output = enc_to_intel_output(encoder); + 	struct intel_dvo_device *dvo = intel_output->dev_priv; + 	u32 dvo_reg = dvo->dvo_reg; +@@ -98,15 +98,16 @@ + static void intel_dvo_save(struct drm_connector *connector) + { + 	struct drm_i915_private *dev_priv = connector->dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = connector->dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_dvo_device *dvo = intel_output->dev_priv; +  + 	/* Each output should probably just save the registers it touches, + 	 * but for now, use more overkill. + 	 */ +-	dev_priv->saveDVOA = I915_READ(DVOA); +-	dev_priv->saveDVOB = I915_READ(DVOB); +-	dev_priv->saveDVOC = I915_READ(DVOC); ++	dev_priv->common.saveDVOA = I915_READ(DVOA); ++	dev_priv->common.saveDVOB = I915_READ(DVOB); ++	dev_priv->common.saveDVOC = I915_READ(DVOC); +  + 	dvo->dev_ops->save(dvo); + } +@@ -114,14 +115,15 @@ + static void intel_dvo_restore(struct drm_connector *connector) + { + 	struct drm_i915_private *dev_priv = connector->dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = connector->dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_dvo_device *dvo = intel_output->dev_priv; +  + 	dvo->dev_ops->restore(dvo); +  +-	I915_WRITE(DVOA, dev_priv->saveDVOA); +-	I915_WRITE(DVOB, dev_priv->saveDVOB); +-	I915_WRITE(DVOC, dev_priv->saveDVOC); ++	I915_WRITE(DVOA, dev_priv->common.saveDVOA); ++	I915_WRITE(DVOB, dev_priv->common.saveDVOB); ++	I915_WRITE(DVOC, dev_priv->common.saveDVOC); + } +  + static int intel_dvo_mode_valid(struct drm_connector *connector, +@@ -183,7 +185,7 @@ + 			       struct drm_display_mode *adjusted_mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); + 	struct intel_output *intel_output = enc_to_intel_output(encoder); + 	struct intel_dvo_device *dvo = intel_output->dev_priv; +@@ -349,7 +351,7 @@ + intel_dvo_get_current_mode (struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_dvo_device *dvo = intel_output->dev_priv; + 	uint32_t dvo_reg = dvo->dvo_reg; +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_hdmi.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_hdmi.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_hdmi.c	2009-02-19 12:59:28.000000000 +0000 +@@ -46,7 +46,7 @@ + 				struct drm_display_mode *adjusted_mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_crtc *crtc = encoder->crtc; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	struct intel_output *intel_output = enc_to_intel_output(encoder); +@@ -71,7 +71,7 @@ + static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = enc_to_intel_output(encoder); + 	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; + 	u32 temp; +@@ -89,7 +89,7 @@ + static void intel_hdmi_save(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; +  +@@ -99,7 +99,7 @@ + static void intel_hdmi_restore(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; +  +@@ -132,7 +132,7 @@ + intel_hdmi_detect(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; + 	u32 temp, bit; +@@ -220,7 +220,7 @@ +  + void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_connector *connector; + 	struct intel_output *intel_output; + 	struct intel_hdmi_priv *hdmi_priv; +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_suspend.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_suspend.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_suspend.c	2009-02-19 12:59:28.000000000 +0000 +@@ -31,7 +31,7 @@ +  + static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	if (pipe == PIPE_A) + 		return (I915_READ(DPLL_A) & DPLL_VCO_ENABLE); +@@ -41,7 +41,7 @@ +  + static void i915_save_palette(struct drm_device *dev, enum pipe pipe) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); + 	u32 *array; + 	int i; +@@ -50,9 +50,9 @@ + 		return; +  + 	if (pipe == PIPE_A) +-		array = dev_priv->save_palette_a; ++		array = dev_priv_common->save_palette_a; + 	else +-		array = dev_priv->save_palette_b; ++		array = dev_priv_common->save_palette_b; +  + 	for(i = 0; i < 256; i++) + 		array[i] = I915_READ(reg + (i << 2)); +@@ -60,7 +60,7 @@ +  + static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); + 	u32 *array; + 	int i; +@@ -69,9 +69,9 @@ + 		return; +  + 	if (pipe == PIPE_A) +-		array = dev_priv->save_palette_a; ++		array = dev_priv_common->save_palette_a; + 	else +-		array = dev_priv->save_palette_b; ++		array = dev_priv_common->save_palette_b; +  + 	for(i = 0; i < 256; i++) + 		I915_WRITE(reg + (i << 2), array[i]); +@@ -79,7 +79,7 @@ +  + static u8 i915_read_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	I915_WRITE8(index_port, reg); + 	return I915_READ8(data_port); +@@ -87,7 +87,7 @@ +  + static u8 i915_read_ar(struct drm_device *dev, u16 st01, u8 reg, u16 palette_enable) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	I915_READ8(st01); + 	I915_WRITE8(VGA_AR_INDEX, palette_enable | reg); +@@ -96,7 +96,7 @@ +  + static void i915_write_ar(struct drm_device *dev, u16 st01, u8 reg, u8 val, u16 palette_enable) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	I915_READ8(st01); + 	I915_WRITE8(VGA_AR_INDEX, palette_enable | reg); +@@ -105,7 +105,7 @@ +  + static void i915_write_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg, u8 val) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	I915_WRITE8(index_port, reg); + 	I915_WRITE8(data_port, val); +@@ -113,7 +113,8 @@ +  + static void i915_save_vga(struct drm_device *dev) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++	struct drm_i915_common_private *dev_priv = dev->dev_private; + 	int i; + 	u16 cr_index, cr_data, st01; +  +@@ -176,7 +177,8 @@ +  + static void i915_restore_vga(struct drm_device *dev) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++	struct drm_i915_common_private *dev_priv = dev->dev_private; + 	int i; + 	u16 cr_index, cr_data, st01; +  +@@ -235,7 +237,8 @@ +  + int i915_save_state(struct drm_device *dev) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++	struct drm_i915_common_private *dev_priv = dev->dev_private; + 	int i; +  + 	pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); +@@ -367,7 +370,8 @@ +  + int i915_restore_state(struct drm_device *dev) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++	struct drm_i915_common_private *dev_priv = dev->dev_private; + 	int i; +  + 	pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_opregion.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_opregion.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_opregion.c	2009-02-19 12:59:28.000000000 +0000 +@@ -139,6 +139,7 @@ + static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) + { + 	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct opregion_asle *asle = dev_priv->opregion.asle; + 	u32 blc_pwm_ctl, blc_pwm_ctl2; +  +@@ -172,7 +173,8 @@ +  + static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++ + 	if (pfmb & ASLE_PFMB_PWM_VALID) { + 		u32 blc_pwm_ctl = I915_READ(BLC_PWM_CTL); + 		u32 pwm = pfmb & ASLE_PFMB_PWM_MASK; +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_gem.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_gem.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_gem.c	2009-02-19 12:59:28.000000000 +0000 +@@ -877,6 +877,7 @@ + i915_add_request(struct drm_device *dev, uint32_t flush_domains) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_gem_request *request; + 	uint32_t seqno; + 	int was_empty; +@@ -942,6 +943,7 @@ + static uint32_t + i915_retire_commands(struct drm_device *dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = dev->dev_private; + 	uint32_t cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; + 	uint32_t flush_domains = 0; +@@ -1049,12 +1051,14 @@ + void + i915_gem_retire_work_handler(struct work_struct *work) + { ++	struct drm_i915_common_private *dev_priv_common; + 	drm_i915_private_t *dev_priv; + 	struct drm_device *dev; +  + 	dev_priv = container_of(work, drm_i915_private_t, + 				mm.retire_work.work); + 	dev = dev_priv->dev; ++	dev_priv_common = dev->dev_private; +  + 	mutex_lock(&dev->struct_mutex); + 	i915_gem_retire_requests(dev); +@@ -1109,6 +1113,7 @@ + 	       uint32_t invalidate_domains, + 	       uint32_t flush_domains) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = dev->dev_private; + 	uint32_t cmd; + 	RING_LOCALS; +@@ -1422,7 +1427,7 @@ + { + 	struct drm_gem_object *obj = reg->obj; + 	struct drm_device *dev = obj->dev; +-	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_gem_object *obj_priv = obj->driver_private; + 	int regnum = obj_priv->fence_reg; + 	uint64_t val; +@@ -1442,8 +1447,8 @@ + { + 	struct drm_gem_object *obj = reg->obj; + 	struct drm_device *dev = obj->dev; +-	drm_i915_private_t *dev_priv = dev->dev_private; + 	struct drm_i915_gem_object *obj_priv = obj->driver_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	int regnum = obj_priv->fence_reg; + 	uint32_t val; + 	uint32_t pitch_val; +@@ -1475,7 +1480,7 @@ + { + 	struct drm_gem_object *obj = reg->obj; + 	struct drm_device *dev = obj->dev; +-	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_gem_object *obj_priv = obj->driver_private; + 	int regnum = obj_priv->fence_reg; + 	uint32_t val; +@@ -1605,6 +1610,7 @@ + { + 	struct drm_device *dev = obj->dev; + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_gem_object *obj_priv = obj->driver_private; +  + 	if (IS_I965G(dev)) +@@ -2327,6 +2333,7 @@ + 			      uint64_t exec_offset) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_clip_rect __user *boxes = (struct drm_clip_rect __user *) + 					     (uintptr_t) exec->cliprects_ptr; + 	int nbox = exec->num_cliprects; +@@ -3035,6 +3042,7 @@ + i915_gem_init_hws(struct drm_device *dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_gem_object *obj; + 	struct drm_i915_gem_object *obj_priv; + 	int ret; +@@ -3081,6 +3089,7 @@ + i915_gem_init_ringbuffer(struct drm_device *dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_gem_object *obj; + 	struct drm_i915_gem_object *obj_priv; + 	drm_i915_ring_buffer_t *ring = &dev_priv->ring; +@@ -3186,6 +3195,7 @@ + void + i915_gem_cleanup_ringbuffer(struct drm_device *dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = dev->dev_private; +  + 	if (dev_priv->ring.ring_obj == NULL) +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_gem_proc.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_gem_proc.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_gem_proc.c	2009-02-19 12:59:28.000000000 +0000 +@@ -213,6 +213,7 @@ + 	struct drm_minor *minor = (struct drm_minor *) data; + 	struct drm_device *dev = minor->dev; + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	int len = 0; +  + 	if (offset > DRM_PROC_LIMIT) { +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_gem_tiling.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_gem_tiling.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_gem_tiling.c	2009-02-19 12:59:28.000000000 +0000 +@@ -87,6 +87,7 @@ + i915_gem_detect_bit_6_swizzle(struct drm_device *dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	uint32_t swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; + 	uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; +  +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_irq.c	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c	2009-02-20 14:53:08.000000000 +0000 +@@ -64,6 +64,8 @@ + void + i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) + { ++	struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv; ++ + 	if ((dev_priv->irq_mask_reg & mask) != 0) { + 		dev_priv->irq_mask_reg &= ~mask; + 		I915_WRITE(IMR, dev_priv->irq_mask_reg); +@@ -74,6 +76,8 @@ + static inline void + i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask) + { ++	struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv; ++ + 	if ((dev_priv->irq_mask_reg & mask) != mask) { + 		dev_priv->irq_mask_reg |= mask; + 		I915_WRITE(IMR, dev_priv->irq_mask_reg); +@@ -94,6 +98,8 @@ + void + i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) + { ++	struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv; ++ + 	if ((dev_priv->pipestat[pipe] & mask) != mask) { + 		u32 reg = i915_pipestat(pipe); +  +@@ -107,6 +113,8 @@ + void + i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) + { ++	struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv; ++ + 	if ((dev_priv->pipestat[pipe] & mask) != 0) { + 		u32 reg = i915_pipestat(pipe); +  +@@ -128,7 +136,7 @@ + static int + i915_pipe_enabled(struct drm_device *dev, int pipe) + { +-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF; +  + 	if (I915_READ(pipeconf) & PIPEACONF_ENABLE) +@@ -142,7 +150,7 @@ +  */ + u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) + { +-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	unsigned long high_frame; + 	unsigned long low_frame; + 	u32 high1, high2, low, count; +@@ -178,6 +186,7 @@ + { + 	struct drm_device *dev = (struct drm_device *) arg; + 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_master_private *master_priv; + 	u32 iir, new_iir; + 	u32 pipea_stats, pipeb_stats; +@@ -284,6 +293,7 @@ + static int i915_emit_irq(struct drm_device * dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; + 	RING_LOCALS; +  +@@ -409,6 +419,7 @@ +  */ + int i915_enable_vblank(struct drm_device *dev, int pipe) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + 	unsigned long irqflags; + 	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; +@@ -510,6 +521,7 @@ + */ + void i915_driver_irq_preinstall(struct drm_device * dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; +  + 	atomic_set(&dev_priv->irq_received, 0); +@@ -554,6 +566,7 @@ +  + void i915_driver_irq_uninstall(struct drm_device * dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; +  + 	if (!dev_priv) +Index: linux-2.6.28/drivers/gpu/drm/i915/Makefile +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/Makefile	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/Makefile	2009-02-19 12:59:28.000000000 +0000 +@@ -9,24 +9,29 @@ + 	  i915_gem_debug.o \ + 	  i915_gem_proc.o \ + 	  i915_gem_tiling.o \ +-	  intel_display.o \ +-	  intel_crt.o \ +-	  intel_lvds.o \ + 	  intel_bios.o \ +-	  intel_hdmi.o \ +-	  intel_sdvo.o \ +-	  intel_modes.o \ +-	  intel_i2c.o \ + 	  intel_fb.o \ + 	  intel_tv.o \ ++ ++intel_gfx_common-y := \ ++	  intel_display.o \ ++	  intel_modes.o \ ++	  intel_i2c.o \ ++	  intel_crt.o \ + 	  intel_dvo.o \ ++	  intel_hdmi.o \ ++	  intel_lvds.o \ ++	  intel_sdvo.o \ + 	  dvo_ch7xxx.o \ + 	  dvo_ch7017.o \ + 	  dvo_ivch.o \ + 	  dvo_tfp410.o \ + 	  dvo_sil164.o +  ++ + i915-$(CONFIG_ACPI)	+= i915_opregion.o + i915-$(CONFIG_COMPAT)   += i915_ioc32.o +  + obj-$(CONFIG_DRM_I915)  += i915.o ++ ++obj-$(CONFIG_DRM_INTEL_COMMON) += intel_gfx_common.o +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_common.h +=================================================================== +--- /dev/null	1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_common.h	2009-02-20 14:49:42.000000000 +0000 +@@ -0,0 +1,184 @@ ++/* ++ * ++ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. ++ * All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sub license, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial portions ++ * of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ++ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR ++ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ * ++ */ ++ ++#ifndef _I915_COMMON_H_ ++#define _I915_COMMON_H_ ++ ++typedef struct drm_i915_common_private { ++	//struct drm_device *dev; ++ ++	void __iomem *regs; ++ ++	//drm_dma_handle_t *status_page_dmah; ++	//void *hw_status_page; ++	//dma_addr_t dma_status_page; ++	//uint32_t counter; ++	//unsigned int status_gfx_addr; ++	//drm_local_map_t hws_map; ++	//struct drm_gem_object *hws_obj; ++ ++	//unsigned int cpp; ++	//int back_offset; ++	//int front_offset; ++	//int current_page; ++	//int page_flipping; ++ ++	//wait_queue_head_t irq_queue; ++	//atomic_t irq_received; ++	/** Protects user_irq_refcount and irq_mask_reg */ ++	//spinlock_t user_irq_lock; ++	/** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */ ++	//int user_irq_refcount; ++	/** Cached value of IMR to avoid reads in updating the bitfield */ ++	//u32 irq_mask_reg; ++	//u32 pipestat[2]; ++ ++	//int tex_lru_log_granularity; ++	//int allow_batchbuffer; ++	//struct mem_block *agp_heap; ++	//unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; ++	//int vblank_pipe; ++ ++	//bool cursor_needs_physical; ++ ++	//struct drm_mm vram; ++ ++	//int irq_enabled; ++ ++	/* LVDS info */ ++	int backlight_duty_cycle;  /* restore backlight to this value */ ++	bool panel_wants_dither; ++	struct drm_display_mode *panel_fixed_mode; ++	//struct drm_display_mode *vbt_mode; /* if any */ ++ ++	/* Feature bits from the VBIOS */ ++	//unsigned int int_tv_support:1; ++	//unsigned int lvds_dither:1; ++	//unsigned int lvds_vbt:1; ++	//unsigned int int_crt_support:1; ++ ++	//int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ ++	//int num_fence_regs; /* 8 on pre-965, 16 otherwise */ ++ ++	/* Register state */ ++	u8 saveLBB; ++	u32 saveDSPACNTR; ++	u32 saveDSPBCNTR; ++	u32 saveDSPARB; ++	u32 saveRENDERSTANDBY; ++	u32 saveHWS; ++	u32 savePIPEACONF; ++	u32 savePIPEBCONF; ++	u32 savePIPEASRC; ++	u32 savePIPEBSRC; ++	u32 saveFPA0; ++	u32 saveFPA1; ++	u32 saveDPLL_A; ++	u32 saveDPLL_A_MD; ++	u32 saveHTOTAL_A; ++	u32 saveHBLANK_A; ++	u32 saveHSYNC_A; ++	u32 saveVTOTAL_A; ++	u32 saveVBLANK_A; ++	u32 saveVSYNC_A; ++	u32 saveBCLRPAT_A; ++	u32 savePIPEASTAT; ++	u32 saveDSPASTRIDE; ++	u32 saveDSPASIZE; ++	u32 saveDSPAPOS; ++	u32 saveDSPAADDR; ++	u32 saveDSPASURF; ++	u32 saveDSPATILEOFF; ++	u32 savePFIT_PGM_RATIOS; ++	u32 saveBLC_PWM_CTL; ++	u32 saveBLC_PWM_CTL2; ++	u32 saveFPB0; ++	u32 saveFPB1; ++	u32 saveDPLL_B; ++	u32 saveDPLL_B_MD; ++	u32 saveHTOTAL_B; ++	u32 saveHBLANK_B; ++	u32 saveHSYNC_B; ++	u32 saveVTOTAL_B; ++	u32 saveVBLANK_B; ++	u32 saveVSYNC_B; ++	u32 saveBCLRPAT_B; ++	u32 savePIPEBSTAT; ++	u32 saveDSPBSTRIDE; ++	u32 saveDSPBSIZE; ++	u32 saveDSPBPOS; ++	u32 saveDSPBADDR; ++	u32 saveDSPBSURF; ++	u32 saveDSPBTILEOFF; ++	u32 saveVGA0; ++	u32 saveVGA1; ++	u32 saveVGA_PD; ++	u32 saveVGACNTRL; ++	u32 saveADPA; ++	u32 saveLVDS; ++	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_DIVISOR; ++	u32 savePFIT_CONTROL; ++	u32 save_palette_a[256]; ++	u32 save_palette_b[256]; ++	u32 saveFBC_CFB_BASE; ++	u32 saveFBC_LL_BASE; ++	u32 saveFBC_CONTROL; ++	u32 saveFBC_CONTROL2; ++	u32 saveIER; ++	u32 saveIIR; ++	u32 saveIMR; ++	u32 saveCACHE_MODE_0; ++	u32 saveD_STATE; ++	u32 saveCG_2D_DIS; ++	u32 saveMI_ARB_STATE; ++	u32 saveSWF0[16]; ++	u32 saveSWF1[16]; ++	u32 saveSWF2[3]; ++	u8 saveMSR; ++	u8 saveSR[8]; ++	u8 saveGR[25]; ++	u8 saveAR_INDEX; ++	u8 saveAR[21]; ++	u8 saveDACMASK; ++	u8 saveDACDATA[256*3]; /* 256 3-byte colors */ ++	u8 saveCR[37]; ++} drm_i915_common_private_t; ++ ++struct drm_i915_master_private { ++	drm_local_map_t *sarea; ++	struct _drm_i915_sarea *sarea_priv; ++}; ++ ++#endif +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_drv.h +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_drv.h	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_drv.h	2009-02-19 16:30:19.000000000 +0000 +@@ -32,6 +32,7 @@ +  + #include "i915_reg.h" + #include "intel_bios.h" ++#include "i915_common.h" + #include <linux/io-mapping.h> +  + /* General customization: +@@ -116,10 +117,6 @@ + 	int enabled; + }; +  +-struct drm_i915_master_private { +-	drm_local_map_t *sarea; +-	struct _drm_i915_sarea *sarea_priv; +-}; + #define I915_FENCE_REG_NONE -1 +  + struct drm_i915_fence_reg { +@@ -127,12 +124,15 @@ + }; +  + typedef struct drm_i915_private { +-	struct drm_device *dev; ++	/* common is assumed to be the first item in this structure */ ++	struct drm_i915_common_private common; +  +-	void __iomem *regs; +- +-	drm_i915_ring_buffer_t ring; ++	struct drm_device *dev; +  ++	//void __iomem *regs; ++  ++ 	drm_i915_ring_buffer_t ring; ++  + 	drm_dma_handle_t *status_page_dmah; + 	void *hw_status_page; + 	dma_addr_t dma_status_page; +@@ -169,12 +169,12 @@ +  + 	int irq_enabled; +  +-	struct intel_opregion opregion; +- ++ 	struct intel_opregion opregion; ++  + 	/* LVDS info */ +-	int backlight_duty_cycle;  /* restore backlight to this value */ +-	bool panel_wants_dither; +-	struct drm_display_mode *panel_fixed_mode; ++	//int backlight_duty_cycle;  /* restore backlight to this value */ ++	//bool panel_wants_dither; ++	//struct drm_display_mode *panel_fixed_mode; + 	struct drm_display_mode *vbt_mode; /* if any */ +  + 	/* Feature bits from the VBIOS */ +@@ -183,101 +183,10 @@ + 	unsigned int lvds_vbt:1; + 	unsigned int int_crt_support:1; +  +-	struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ ++ 	struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ + 	int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ + 	int num_fence_regs; /* 8 on pre-965, 16 otherwise */ +  +-	/* Register state */ +-	u8 saveLBB; +-	u32 saveDSPACNTR; +-	u32 saveDSPBCNTR; +-	u32 saveDSPARB; +-	u32 saveRENDERSTANDBY; +-	u32 saveHWS; +-	u32 savePIPEACONF; +-	u32 savePIPEBCONF; +-	u32 savePIPEASRC; +-	u32 savePIPEBSRC; +-	u32 saveFPA0; +-	u32 saveFPA1; +-	u32 saveDPLL_A; +-	u32 saveDPLL_A_MD; +-	u32 saveHTOTAL_A; +-	u32 saveHBLANK_A; +-	u32 saveHSYNC_A; +-	u32 saveVTOTAL_A; +-	u32 saveVBLANK_A; +-	u32 saveVSYNC_A; +-	u32 saveBCLRPAT_A; +-	u32 savePIPEASTAT; +-	u32 saveDSPASTRIDE; +-	u32 saveDSPASIZE; +-	u32 saveDSPAPOS; +-	u32 saveDSPAADDR; +-	u32 saveDSPASURF; +-	u32 saveDSPATILEOFF; +-	u32 savePFIT_PGM_RATIOS; +-	u32 saveBLC_PWM_CTL; +-	u32 saveBLC_PWM_CTL2; +-	u32 saveFPB0; +-	u32 saveFPB1; +-	u32 saveDPLL_B; +-	u32 saveDPLL_B_MD; +-	u32 saveHTOTAL_B; +-	u32 saveHBLANK_B; +-	u32 saveHSYNC_B; +-	u32 saveVTOTAL_B; +-	u32 saveVBLANK_B; +-	u32 saveVSYNC_B; +-	u32 saveBCLRPAT_B; +-	u32 savePIPEBSTAT; +-	u32 saveDSPBSTRIDE; +-	u32 saveDSPBSIZE; +-	u32 saveDSPBPOS; +-	u32 saveDSPBADDR; +-	u32 saveDSPBSURF; +-	u32 saveDSPBTILEOFF; +-	u32 saveVGA0; +-	u32 saveVGA1; +-	u32 saveVGA_PD; +-	u32 saveVGACNTRL; +-	u32 saveADPA; +-	u32 saveLVDS; +-	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_DIVISOR; +-	u32 savePFIT_CONTROL; +-	u32 save_palette_a[256]; +-	u32 save_palette_b[256]; +-	u32 saveFBC_CFB_BASE; +-	u32 saveFBC_LL_BASE; +-	u32 saveFBC_CONTROL; +-	u32 saveFBC_CONTROL2; +-	u32 saveIER; +-	u32 saveIIR; +-	u32 saveIMR; +-	u32 saveCACHE_MODE_0; +-	u32 saveD_STATE; +-	u32 saveCG_2D_DIS; +-	u32 saveMI_ARB_STATE; +-	u32 saveSWF0[16]; +-	u32 saveSWF1[16]; +-	u32 saveSWF2[3]; +-	u8 saveMSR; +-	u8 saveSR[8]; +-	u8 saveGR[25]; +-	u8 saveAR_INDEX; +-	u8 saveAR[21]; +-	u8 saveDACMASK; +-	u8 saveDACDATA[256*3]; /* 256 3-byte colors */ +-	u8 saveCR[37]; +- + 	struct { + 		struct drm_mm gtt_space; +  +@@ -672,17 +581,18 @@ + 		LOCK_TEST_WITH_RETURN(dev, file_priv);			\ + } while (0) +  +-#define I915_READ(reg)          readl(dev_priv->regs + (reg)) +-#define I915_WRITE(reg, val)     writel(val, dev_priv->regs + (reg)) +-#define I915_READ16(reg)	readw(dev_priv->regs + (reg)) +-#define I915_WRITE16(reg, val)	writel(val, dev_priv->regs + (reg)) +-#define I915_READ8(reg)		readb(dev_priv->regs + (reg)) +-#define I915_WRITE8(reg, val)	writeb(val, dev_priv->regs + (reg)) ++ ++#define I915_READ(reg)          readl(dev_priv_common->regs + (reg)) ++#define I915_WRITE(reg, val)     writel(val, dev_priv_common->regs + (reg)) ++#define I915_READ16(reg)	readw(dev_priv_common->regs + (reg)) ++#define I915_WRITE16(reg, val)	writel(val, dev_priv_common->regs + (reg)) ++#define I915_READ8(reg)		readb(dev_priv_common->regs + (reg)) ++#define I915_WRITE8(reg, val)	writeb(val, dev_priv_common->regs + (reg)) + #ifdef writeq +-#define I915_WRITE64(reg, val)	writeq(val, dev_priv->regs + (reg)) ++#define I915_WRITE64(reg, val)	writeq(val, dev_priv_common->regs + (reg)) + #else +-#define I915_WRITE64(reg, val)	(writel(val, dev_priv->regs + (reg)), \ +-				 writel(upper_32_bits(val), dev_priv->regs + \ ++#define I915_WRITE64(reg, val)	(writel(val, dev_priv_common->regs + (reg)), \ ++				 writel(upper_32_bits(val), dev_priv_common->regs + \ + 					(reg) + 4)) + #endif + #define POSTING_READ(reg)	(void)I915_READ(reg) +@@ -776,10 +686,15 @@ + 			(dev)->pci_device == 0x29D2) +  + #define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \ +-		      IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev)) ++		      IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev) || \ ++		      IS_POULSBO(dev)) ++ ++#define IS_POULSBO(dev) (((dev)->pci_device == 0x8108) || \ ++			 ((dev)->pci_device == 0x8109)) +  + #define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \ +-			IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev)) ++			IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev) || \ ++			IS_POULSBO(dev)) +  + #define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev)) + #define SUPPORTS_INTEGRATED_HDMI(dev)	(IS_G4X(dev)) +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_display.c	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_display.c	2009-02-20 14:53:08.000000000 +0000 +@@ -282,7 +282,7 @@ + 				int refclk, intel_clock_t *best_clock) + { + 	struct drm_device *dev = crtc->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	intel_clock_t clock; + 	const intel_limit_t *limit = intel_limit(crtc); + 	int err = target; +@@ -475,7 +475,7 @@ + { + 	struct drm_device *dev = crtc->dev; + 	struct drm_i915_master_private *master_priv; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	int pipe = intel_crtc->pipe; + 	int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; +@@ -613,6 +613,7 @@ + 	/* lvds has its own version of prepare see intel_lvds_prepare */ + 	encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF); + } ++EXPORT_SYMBOL(intel_encoder_prepare); +  + void intel_encoder_commit (struct drm_encoder *encoder) + { +@@ -620,6 +621,7 @@ + 	/* lvds has its own version of commit see intel_lvds_commit */ + 	encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); + } ++EXPORT_SYMBOL(intel_encoder_commit); +  + static bool intel_crtc_mode_fixup(struct drm_crtc *crtc, + 				  struct drm_display_mode *mode, +@@ -687,7 +689,7 @@ +  */ + static int intel_panel_fitter_pipe (struct drm_device *dev) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	u32  pfit_control; +  + 	/* i830 doesn't have a panel fitter */ +@@ -715,7 +717,7 @@ + 				struct drm_framebuffer *old_fb) + { + 	struct drm_device *dev = crtc->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	int pipe = intel_crtc->pipe; + 	int fp_reg = (pipe == 0) ? FPA0 : FPB0; +@@ -980,7 +982,7 @@ + 				 uint32_t width, uint32_t height) + { + 	struct drm_device *dev = crtc->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	struct drm_gem_object *bo; + 	struct drm_i915_gem_object *obj_priv; +@@ -1071,7 +1073,7 @@ + static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) + { + 	struct drm_device *dev = crtc->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	int pipe = intel_crtc->pipe; + 	uint32_t temp = 0; +@@ -1106,6 +1108,7 @@ + 	intel_crtc->lut_g[regno] = green >> 8; + 	intel_crtc->lut_b[regno] = blue >> 8; + } ++EXPORT_SYMBOL(intel_crtc_fb_gamma_set); +  + static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, + 				 u16 *blue, uint32_t size) +@@ -1228,6 +1231,7 @@ +  + 	return crtc; + } ++EXPORT_SYMBOL(intel_get_load_detect_pipe); +  + void intel_release_load_detect_pipe(struct intel_output *intel_output, int dpms_mode) + { +@@ -1251,11 +1255,12 @@ + 		crtc_funcs->dpms(crtc, dpms_mode); + 	} + } ++EXPORT_SYMBOL(intel_release_load_detect_pipe); +  + /* Returns the clock of the currently programmed mode of the given pipe. */ + static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	int pipe = intel_crtc->pipe; + 	u32 dpll = I915_READ((pipe == 0) ? DPLL_A : DPLL_B); +@@ -1333,7 +1338,7 @@ + struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, + 					     struct drm_crtc *crtc) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	int pipe = intel_crtc->pipe; + 	struct drm_display_mode *mode; +@@ -1361,6 +1366,7 @@ +  + 	return mode; + } ++EXPORT_SYMBOL(intel_crtc_mode_get); +  + static void intel_crtc_destroy(struct drm_crtc *crtc) + { +@@ -1415,11 +1421,6 @@ + 	intel_crtc->mode_set.connectors = (struct drm_connector **)(intel_crtc + 1); + 	intel_crtc->mode_set.num_connectors = 0; +  +-	if (i915_fbpercrtc) { +- +- +- +-	} + } +  + struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe) +@@ -1433,6 +1434,7 @@ + 	} + 	return crtc; + } ++EXPORT_SYMBOL(intel_get_crtc_from_pipe); +  + static int intel_connector_clones(struct drm_device *dev, int type_mask) + { +@@ -1575,7 +1577,7 @@ +  + 	return 0; + } +- ++EXPORT_SYMBOL(intel_framebuffer_create); +  + static struct drm_framebuffer * + intel_user_framebuffer_create(struct drm_device *dev, +@@ -1643,12 +1645,13 @@ +  + 	intel_setup_outputs(dev); + } ++EXPORT_SYMBOL(intel_modeset_init); +  + void intel_modeset_cleanup(struct drm_device *dev) + { + 	drm_mode_config_cleanup(dev); + } +- ++EXPORT_SYMBOL(intel_modeset_cleanup); +  + /* current intel driver doesn't take advantage of encoders +    always give back the encoder for the connector +@@ -1659,3 +1662,5 @@ +  + 	return &intel_output->enc; + } ++EXPORT_SYMBOL(intel_best_encoder); ++ +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_crt.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_crt.c	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_crt.c	2009-02-20 14:53:08.000000000 +0000 +@@ -36,7 +36,7 @@ + static void intel_crt_dpms(struct drm_encoder *encoder, int mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	u32 temp; +  + 	temp = I915_READ(ADPA); +@@ -88,7 +88,7 @@ + 	struct drm_device *dev = encoder->dev; + 	struct drm_crtc *crtc = encoder->crtc; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	int dpll_md_reg; + 	u32 adpa, dpll_md; +  +@@ -132,7 +132,7 @@ + static bool intel_crt_detect_hotplug(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	u32 temp; +  + 	unsigned long timeout = jiffies + msecs_to_jiffies(1000); +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_dma.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_dma.c	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_dma.c	2009-02-20 12:12:41.000000000 +0000 +@@ -41,6 +41,7 @@ + int i915_wait_ring(struct drm_device * dev, int n, const char *caller) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; + 	drm_i915_ring_buffer_t *ring = &(dev_priv->ring); + 	u32 acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD; +@@ -82,6 +83,7 @@ + static int i915_init_phys_hws(struct drm_device *dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	/* Program Hardware Status Page */ + 	dev_priv->status_page_dmah = + 		drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff); +@@ -107,6 +109,8 @@ + static void i915_free_hws(struct drm_device *dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++ + 	if (dev_priv->status_page_dmah) { + 		drm_pci_free(dev, dev_priv->status_page_dmah); + 		dev_priv->status_page_dmah = NULL; +@@ -124,6 +128,7 @@ + void i915_kernel_lost_context(struct drm_device * dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_master_private *master_priv; + 	drm_i915_ring_buffer_t *ring = &(dev_priv->ring); +  +@@ -231,6 +236,7 @@ + static int i915_dma_resume(struct drm_device * dev) + { + 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  + 	DRM_DEBUG("%s\n", __func__); +  +@@ -358,6 +364,7 @@ +  + static int i915_emit_cmds(struct drm_device * dev, int __user * buffer, int dwords) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = dev->dev_private; + 	int i; + 	RING_LOCALS; +@@ -401,6 +408,7 @@ + 	      int i, int DR1, int DR4) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_clip_rect box; + 	RING_LOCALS; +  +@@ -442,6 +450,7 @@ + static void i915_emit_breadcrumb(struct drm_device *dev) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; + 	RING_LOCALS; +  +@@ -495,6 +504,7 @@ + 				     drm_i915_batchbuffer_t * batch) + { + 	drm_i915_private_t *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_clip_rect __user *boxes = batch->cliprects; + 	int nbox = batch->num_cliprects; + 	int i = 0, count; +@@ -544,6 +554,7 @@ +  + static int i915_dispatch_flip(struct drm_device * dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = dev->dev_private; + 	struct drm_i915_master_private *master_priv = + 		dev->primary->master->driver_priv; +@@ -775,6 +786,7 @@ + static int i915_set_status_page(struct drm_device *dev, void *data, + 				struct drm_file *file_priv) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = dev->dev_private; + 	drm_i915_hws_addr_t *hws = data; +  +@@ -930,6 +942,7 @@ +  + static int i915_load_modeset_init(struct drm_device *dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_i915_private *dev_priv = dev->dev_private; + 	unsigned long agp_size, prealloc_size; + 	int fb_bar = IS_I9XX(dev) ? 2 : 0; +@@ -1073,8 +1086,8 @@ + 	base = drm_get_resource_start(dev, mmio_bar); + 	size = drm_get_resource_len(dev, mmio_bar); +  +-	dev_priv->regs = ioremap(base, size); +-	if (!dev_priv->regs) { ++	dev_priv->common.regs = ioremap(base, size); ++	if (!dev_priv->common.regs) { + 		DRM_ERROR("failed to map registers\n"); + 		ret = -EIO; + 		goto free_priv; +@@ -1126,7 +1139,7 @@ + 	return 0; +  + out_rmmap: +-	iounmap(dev_priv->regs); ++	iounmap(dev_priv->common.regs); + free_priv: + 	drm_free(dev_priv, sizeof(struct drm_i915_private), DRM_MEM_DRIVER); + 	return ret; +@@ -1144,8 +1157,8 @@ + 	if (dev->pdev->msi_enabled) + 		pci_disable_msi(dev->pdev); +  +-	if (dev_priv->regs != NULL) +-		iounmap(dev_priv->regs); ++	if (dev_priv->common.regs != NULL) ++		iounmap(dev_priv->common.regs); +  + 	intel_opregion_free(dev); +  +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_sdvo.c	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c	2009-02-20 14:53:08.000000000 +0000 +@@ -62,7 +62,7 @@ + static void intel_sdvo_write_sdvox(struct intel_output *intel_output, u32 val) + { + 	struct drm_device *dev = intel_output->base.dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_sdvo_priv   *sdvo_priv = intel_output->dev_priv; + 	u32 bval = val, cval = val; + 	int i; +@@ -552,7 +552,7 @@ + 				struct drm_display_mode *adjusted_mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct drm_crtc *crtc = encoder->crtc; + 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + 	struct intel_output *intel_output = enc_to_intel_output(encoder); +@@ -659,7 +659,7 @@ + 	if (IS_I965G(dev)) { + 		/* done in crtc_mode_set as the dpll_md reg must be written + 		   early */ +-	} else if (IS_I945G(dev) || IS_I945GM(dev)) { ++	} else if (IS_POULSBO(dev) || IS_I945G(dev) || IS_I945GM(dev)) { + 		/* done in crtc_mode_set as it lives inside the + 		   dpll register */ + 	} else { +@@ -672,7 +672,7 @@ + static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = enc_to_intel_output(encoder); + 	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; + 	u32 temp; +@@ -722,7 +722,7 @@ + static void intel_sdvo_save(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; + 	int o; +@@ -759,7 +759,7 @@ + static void intel_sdvo_restore(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_output *intel_output = to_intel_output(connector); + 	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; + 	int o; +Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_lvds.c	2009-02-19 12:59:23.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c	2009-02-20 14:53:08.000000000 +0000 +@@ -67,7 +67,7 @@ +  */ + static void intel_lvds_set_power(struct drm_device *dev, bool on) + { +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	u32 pp_status; +  + 	if (on) { +@@ -104,35 +104,35 @@ + static void intel_lvds_save(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  +-	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_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 & ++	dev_priv_common->savePP_ON = I915_READ(PP_ON_DELAYS); ++	dev_priv_common->savePP_OFF = I915_READ(PP_OFF_DELAYS); ++	dev_priv_common->savePP_CONTROL = I915_READ(PP_CONTROL); ++	dev_priv_common->savePP_DIVISOR = I915_READ(PP_DIVISOR); ++	dev_priv_common->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); ++	dev_priv_common->backlight_duty_cycle = (dev_priv_common->saveBLC_PWM_CTL & + 				       BACKLIGHT_DUTY_CYCLE_MASK); +  + 	/* + 	 * If the light is off at server startup, just make it full brightness + 	 */ +-	if (dev_priv->backlight_duty_cycle == 0) +-		dev_priv->backlight_duty_cycle = ++	if (dev_priv_common->backlight_duty_cycle == 0) ++		lvds_backlight= + 			intel_lvds_get_max_backlight(dev); + } +  + static void intel_lvds_restore(struct drm_connector *connector) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  +-	I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); +-	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) ++	I915_WRITE(BLC_PWM_CTL, dev_priv_common->saveBLC_PWM_CTL); ++	I915_WRITE(PP_ON_DELAYS, dev_priv_common->savePP_ON); ++	I915_WRITE(PP_OFF_DELAYS, dev_priv_common->savePP_OFF); ++	I915_WRITE(PP_DIVISOR, dev_priv_common->savePP_DIVISOR); ++	I915_WRITE(PP_CONTROL, dev_priv_common->savePP_CONTROL); ++	if (dev_priv_common->savePP_CONTROL & POWER_TARGET_ON) + 		intel_lvds_set_power(dev, true); + 	else + 		intel_lvds_set_power(dev, false); +@@ -142,8 +142,8 @@ + 				 struct drm_display_mode *mode) + { + 	struct drm_device *dev = connector->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; +-	struct drm_display_mode *fixed_mode = dev_priv->panel_fixed_mode; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; ++	struct drm_display_mode *fixed_mode = dev_priv_common->panel_fixed_mode; +  + 	if (fixed_mode)	{ + 		if (mode->hdisplay > fixed_mode->hdisplay) +@@ -160,7 +160,7 @@ + 				  struct drm_display_mode *adjusted_mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); + 	struct drm_encoder *tmp_encoder; +  +@@ -240,7 +240,7 @@ + 				struct drm_display_mode *adjusted_mode) + { + 	struct drm_device *dev = encoder->dev; +-	struct drm_i915_private *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); + 	u32 pfit_control; +  +@@ -264,7 +264,7 @@ + 		pfit_control = 0; +  + 	if (!IS_I965G(dev)) { +-		if (dev_priv->panel_wants_dither) ++		if (dev_priv_common->panel_wants_dither) + 			pfit_control |= PANEL_8TO6_DITHER_ENABLE; + 	} + 	else +@@ -475,16 +475,16 @@ + 	crtc = intel_get_crtc_from_pipe(dev, pipe); +  + 	if (crtc && (lvds & LVDS_PORT_EN)) { +-		dev_priv->panel_fixed_mode = intel_crtc_mode_get(dev, crtc); +-		if (dev_priv->panel_fixed_mode) { +-			dev_priv->panel_fixed_mode->type |= ++		dev_priv_common->panel_fixed_mode = intel_crtc_mode_get(dev, crtc); ++		if (dev_priv_common->panel_fixed_mode) { ++			dev_priv_common->panel_fixed_mode->type |= + 				DRM_MODE_TYPE_PREFERRED; + 			goto out; /* FIXME: check for quirks */ + 		} + 	} +  + 	/* If we still don't have a mode after all that, give up. */ +-	if (!dev_priv->panel_fixed_mode) ++	if (!dev_priv_common->panel_fixed_mode) + 		goto failed; +  + 	/* FIXME: detect aopen & mac mini type stuff automatically? */ +@@ -509,9 +509,9 @@ + 			 * 800x600 display. + 			 */ +  +-			if (dev_priv->panel_fixed_mode != NULL && +-			    dev_priv->panel_fixed_mode->hdisplay == 800 && +-			    dev_priv->panel_fixed_mode->vdisplay == 600) { ++			if (dev_priv_common->panel_fixed_mode != NULL && ++			    dev_priv_common->panel_fixed_mode->hdisplay == 800 && ++			    dev_priv_common->panel_fixed_mode->vdisplay == 600) { + 				DRM_DEBUG("Suspected Mac Mini, ignoring the LVDS\n"); + 				goto failed; + 			} +Index: linux-2.6.28/drivers/gpu/drm/Kconfig +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/Kconfig	2009-02-19 12:59:22.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/Kconfig	2009-02-20 14:53:08.000000000 +0000 +@@ -43,6 +43,11 @@ +  + 	  If M is selected, the module will be called radeon. +  ++config DRM_INTEL_COMMON ++	tristate ++	help ++	  Code common to several Intel drivers (autoselected) ++ + config DRM_I810 + 	tristate "Intel I810" + 	depends on DRM && AGP && AGP_INTEL +@@ -70,6 +75,7 @@ + 	select FB_CFB_FILLRECT + 	select FB_CFB_COPYAREA + 	select FB_CFB_IMAGEBLIT ++	select DRM_INTEL_COMMON + 	depends on FB + 	tristate "i915 driver" + 	help diff --git a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch index ca449c6cf5..5b20badffa 100644 --- a/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch +++ b/meta-moblin/packages/linux/linux-moblin-2.6.28+2.6.29-rc2/psb-driver.patch @@ -1,7 +1,7 @@  Index: linux-2.6.28/include/drm/drm.h  =================================================================== ---- linux-2.6.28.orig/include/drm/drm.h	2009-02-12 09:14:40.000000000 +0000 -+++ linux-2.6.28/include/drm/drm.h	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/include/drm/drm.h	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/include/drm/drm.h	2009-02-20 12:23:06.000000000 +0000  @@ -174,6 +174,7 @@   	_DRM_SCATTER_GATHER = 4,  /**< Scatter/gather memory for PCI DMA */   	_DRM_CONSISTENT = 5,	  /**< Consistent memory for PCI DMA */ @@ -336,8 +336,8 @@ Index: linux-2.6.28/include/drm/drm.h   #endif  Index: linux-2.6.28/include/drm/drmP.h  =================================================================== ---- linux-2.6.28.orig/include/drm/drmP.h	2009-02-12 09:14:40.000000000 +0000 -+++ linux-2.6.28/include/drm/drmP.h	2009-02-12 15:59:51.000000000 +0000 +--- linux-2.6.28.orig/include/drm/drmP.h	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/include/drm/drmP.h	2009-02-20 12:30:10.000000000 +0000  @@ -57,6 +57,7 @@   #include <linux/dma-mapping.h>   #include <linux/mm.h> @@ -422,60 +422,7 @@ Index: linux-2.6.28/include/drm/drmP.h   /**    * DRM driver structure. This structure represent the common code for    * a family of cards. There will one drm_device for each card present -@@ -684,50 +723,8 @@ - 	void (*kernel_context_switch_unlock) (struct drm_device *dev); - 	int (*dri_library_name) (struct drm_device *dev, char *buf); -  --	/** --	 * get_vblank_counter - get raw hardware vblank counter --	 * @dev: DRM device --	 * @crtc: counter to fetch --	 * --	 * Driver callback for fetching a raw hardware vblank counter --	 * for @crtc.  If a device doesn't have a hardware counter, the --	 * driver can simply return the value of drm_vblank_count and --	 * make the enable_vblank() and disable_vblank() hooks into no-ops, --	 * leaving interrupts enabled at all times. --	 * --	 * Wraparound handling and loss of events due to modesetting is dealt --	 * with in the DRM core code. --	 * --	 * RETURNS --	 * Raw vblank counter value. --	 */ --	u32 (*get_vblank_counter) (struct drm_device *dev, int crtc); -- --	/** --	 * enable_vblank - enable vblank interrupt events --	 * @dev: DRM device --	 * @crtc: which irq to enable --	 * --	 * Enable vblank interrupts for @crtc.  If the device doesn't have --	 * a hardware vblank counter, this routine should be a no-op, since --	 * interrupts will have to stay on to keep the count accurate. --	 * --	 * RETURNS --	 * Zero on success, appropriate errno if the given @crtc's vblank --	 * interrupt cannot be enabled. --	 */ --	int (*enable_vblank) (struct drm_device *dev, int crtc); -- --	/** --	 * disable_vblank - disable vblank interrupt events --	 * @dev: DRM device --	 * @crtc: which irq to enable --	 * --	 * Disable vblank interrupts for @crtc.  If the device doesn't have --	 * a hardware vblank counter, this routine should be a no-op, since --	 * interrupts will have to stay on to keep the count accurate. --	 */ --	void (*disable_vblank) (struct drm_device *dev, int crtc); -+	int (*vblank_wait) (struct drm_device *dev, unsigned int *sequence); -+	int (*vblank_wait2) (struct drm_device *dev, unsigned int *sequence); -  - 	/** - 	 * Called by \c drm_device_is_agp.  Typically used to determine if a -@@ -766,6 +763,13 @@ +@@ -766,6 +805,13 @@   	int (*proc_init)(struct drm_minor *minor);   	void (*proc_cleanup)(struct drm_minor *minor); @@ -489,19 +436,19 @@ Index: linux-2.6.28/include/drm/drmP.h   	/**   	 * Driver-specific constructor for drm_gem_objects, to set up   	 * obj->driver_private. -@@ -821,8 +825,11 @@ +@@ -821,8 +867,11 @@    */   struct drm_device {   	struct list_head driver_item;	/**< list of devices per driver */ -+	char *unique;			/**< Unique identifier: e.g., busid */ -+	int unique_len;			/**< Length of unique field */ ++	//char *unique;			/**< Unique identifier: e.g., busid */ ++	//int unique_len;			/**< Length of unique field */   	char *devname;			/**< For /proc/interrupts */   	int if_version;			/**< Highest interface version set */ -+	int blocked;			/**< Blocked due to VC switch? */ ++	//int blocked;			/**< Blocked due to VC switch? */   	/** \name Locks */   	/*@{ */ -@@ -847,12 +854,18 @@ +@@ -847,12 +896,18 @@   	/*@} */   	struct list_head filelist; @@ -520,7 +467,7 @@ Index: linux-2.6.28/include/drm/drmP.h   	/** \name Context handle management */   	/*@{ */ -@@ -864,6 +877,7 @@ +@@ -864,6 +919,7 @@   	struct list_head vmalist;	/**< List of vmas (for debugging) */ @@ -528,45 +475,7 @@ Index: linux-2.6.28/include/drm/drmP.h   	/*@} */   	/** \name DMA queues (contexts) */ -@@ -877,6 +891,7 @@ -  - 	/** \name Context support */ - 	/*@{ */ -+	int irq;			/**< Interrupt used by board */ - 	int irq_enabled;		/**< True if irq handler is enabled */ - 	__volatile__ long context_flag;	/**< Context swapping flag */ - 	__volatile__ long interrupt_flag; /**< Interruption handler flag */ -@@ -900,21 +915,15 @@ - 	 */ - 	int vblank_disable_allowed; -  --	wait_queue_head_t *vbl_queue;   /**< VBLANK wait queue */ --	atomic_t *_vblank_count;        /**< number of VBLANK interrupts (driver must alloc the right number of counters) */ -+	wait_queue_head_t vbl_queue;	/**< VBLANK wait queue */ -+	atomic_t vbl_received; -+	atomic_t vbl_received2;		/**< number of secondary VBLANK interrupts */ - 	spinlock_t vbl_lock; --	struct list_head *vbl_sigs;	/**< signal list to send on VBLANK */ --	atomic_t vbl_signal_pending;    /* number of signals pending on all crtcs*/ --	atomic_t *vblank_refcount;      /* number of users of vblank interruptsper crtc */ --	u32 *last_vblank;               /* protected by dev->vbl_lock, used */ --					/* for wraparound handling */ --	int *vblank_enabled;            /* so we don't call enable more than --					   once per disable */ --	int *vblank_inmodeset;          /* Display driver is setting mode */ --	u32 *last_vblank_wait;		/* Last vblank seqno waited per CRTC */ --	struct timer_list vblank_disable_timer; -- --	u32 max_vblank_count;           /**< size of vblank counter register */ -+	struct list_head vbl_sigs;		/**< signal list to send on VBLANK */ -+	struct list_head vbl_sigs2;	/**< signals to send on secondary VBLANK */ -+	unsigned int vbl_pending; -+	spinlock_t tasklet_lock;	/**< For drm_locked_tasklet */ -+	void (*locked_tasklet_func)(struct drm_device *dev); -  - 	/*@} */ - 	cycles_t ctx_start; -@@ -936,7 +945,6 @@ +@@ -936,7 +992,6 @@   	int num_crtcs;                  /**< Number of CRTCs on this device */   	void *dev_private;		/**< device private data */   	void *mm_private; @@ -574,7 +483,7 @@ Index: linux-2.6.28/include/drm/drmP.h   	struct drm_sigdata sigdata;	   /**< For block_all_signals */   	sigset_t sigmask; -@@ -945,6 +953,8 @@ +@@ -945,6 +1000,8 @@   	unsigned int agp_buffer_token;   	struct drm_minor *control;		/**< Control node for card */   	struct drm_minor *primary;		/**< render type primary screen head */ @@ -583,7 +492,7 @@ Index: linux-2.6.28/include/drm/drmP.h   	/** \name Drawable information */   	/*@{ */ -@@ -976,6 +986,27 @@ +@@ -976,6 +1033,27 @@   	return dev->pdev->irq;   } @@ -611,37 +520,20 @@ Index: linux-2.6.28/include/drm/drmP.h   static __inline__ int drm_core_check_feature(struct drm_device *dev,   					     int feature)   { -@@ -1042,6 +1073,9 @@ +@@ -1042,6 +1120,9 @@   				/* Driver support (drm_drv.h) */   extern int drm_init(struct drm_driver *driver);   extern void drm_exit(struct drm_driver *driver);  +extern void drm_cleanup_pci(struct pci_dev *pdev); -+extern void drm_vbl_send_signals(struct drm_device *dev); ++extern void drm_vbl_send_signals(struct drm_device *dev, int crtc);  +extern struct drm_ttm_backend *drm_agp_init_ttm(struct drm_device *dev);   extern int drm_ioctl(struct inode *inode, struct file *filp,   		     unsigned int cmd, unsigned long arg);   extern long drm_compat_ioctl(struct file *filp, -@@ -1208,6 +1242,8 @@ - extern int drm_wait_vblank(struct drm_device *dev, void *data, - 			   struct drm_file *filp); - extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); -+extern void drm_locked_tasklet(struct drm_device *dev, -+			       void(*func)(struct drm_device *)); - extern u32 drm_vblank_count(struct drm_device *dev, int crtc); - extern void drm_handle_vblank(struct drm_device *dev, int crtc); - extern int drm_vblank_get(struct drm_device *dev, int crtc); -@@ -1218,6 +1254,7 @@ - extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc); - extern int drm_modeset_ctl(struct drm_device *dev, void *data, - 			   struct drm_file *file_priv); -+extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*)); -  - 				/* AGP/GART support (drm_agpsupport.h) */ - extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);  Index: linux-2.6.28/include/drm/drm_pciids.h  =================================================================== ---- linux-2.6.28.orig/include/drm/drm_pciids.h	2009-02-12 09:14:31.000000000 +0000 -+++ linux-2.6.28/include/drm/drm_pciids.h	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/include/drm/drm_pciids.h	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/include/drm/drm_pciids.h	2009-02-20 12:23:06.000000000 +0000  @@ -419,3 +419,9 @@   	{0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \   	{0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ @@ -654,8 +546,8 @@ Index: linux-2.6.28/include/drm/drm_pciids.h  +  Index: linux-2.6.28/drivers/gpu/drm/Makefile  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/Makefile	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/Makefile	2009-02-12 16:00:51.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/Makefile	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/Makefile	2009-02-20 12:23:06.000000000 +0000  @@ -10,6 +10,8 @@   		drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \   		drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \ @@ -675,8 +567,8 @@ Index: linux-2.6.28/drivers/gpu/drm/Makefile   obj-$(CONFIG_DRM_VIA)	+=via/  Index: linux-2.6.28/drivers/gpu/drm/drm_agpsupport.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_agpsupport.c	2009-02-12 09:14:31.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_agpsupport.c	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/drm_agpsupport.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_agpsupport.c	2009-02-20 12:23:06.000000000 +0000  @@ -502,4 +502,156 @@   }   EXPORT_SYMBOL(drm_agp_chipset_flush); @@ -837,7 +729,7 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_agpsupport.c  Index: linux-2.6.28/drivers/gpu/drm/drm_bo.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_bo.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_bo.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,2660 @@  +/**************************************************************************  + * @@ -3502,7 +3394,7 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_bo.c  Index: linux-2.6.28/drivers/gpu/drm/drm_bo_lock.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_bo_lock.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_bo_lock.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,175 @@  +/**************************************************************************  + * @@ -3682,8 +3574,8 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_bo_lock.c  Index: linux-2.6.28/drivers/gpu/drm/drm_bo_move.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_bo_move.c	2009-02-12 09:14:41.000000000 +0000 -@@ -0,0 +1,597 @@ ++++ linux-2.6.28/drivers/gpu/drm/drm_bo_move.c	2009-02-20 12:23:06.000000000 +0000 +@@ -0,0 +1,590 @@  +/**************************************************************************  + *  + * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA @@ -4111,13 +4003,6 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_bo_move.c  +	pgprot_t tmp = PAGE_KERNEL;  +  +#if defined(__i386__) || defined(__x86_64__) -+#ifdef USE_PAT_WC -+#warning using pat -+	if (drm_use_pat() && map_type == _DRM_TTM) { -+		pgprot_val(tmp) |= _PAGE_PAT; -+		return tmp; -+	} -+#endif  +	if (boot_cpu_data.x86 > 3 && map_type != _DRM_AGP) {  +		pgprot_val(tmp) |= _PAGE_PCD;  +		pgprot_val(tmp) &= ~_PAGE_PWT; @@ -4283,8 +4168,8 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_bo_move.c  +EXPORT_SYMBOL(drm_bo_kunmap);  Index: linux-2.6.28/drivers/gpu/drm/drm_bufs.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_bufs.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_bufs.c	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/drm_bufs.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_bufs.c	2009-02-20 12:23:06.000000000 +0000  @@ -435,6 +435,8 @@   	case _DRM_GEM:   		DRM_ERROR("tried to rmmap GEM object\n"); @@ -4296,50 +4181,9 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_bufs.c  Index: linux-2.6.28/drivers/gpu/drm/drm_drv.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_drv.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_drv.c	2009-02-12 09:14:41.000000000 +0000 -@@ -1,3 +1,4 @@ -+ - /** -  * \file drm_drv.c -  * Generic driver template -@@ -49,6 +50,9 @@ - #include "drmP.h" - #include "drm_core.h" -  -+static void drm_cleanup(struct drm_device * dev); -+int drm_fb_loaded = 0; -+ - static int drm_version(struct drm_device *dev, void *data, - 		       struct drm_file *file_priv); -  -@@ -119,7 +123,7 @@ -  - 	DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank, 0), -  --	DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0), -+ -  - 	DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), -  -@@ -130,19 +134,48 @@ - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_MASTER|DRM_CONTROL_ALLOW), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_MASTER|DRM_CONTROL_ALLOW), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW), --	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), -+/*	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_MASTER), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_MASTER|DRM_CONTROL_ALLOW), --	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_MASTER|DRM_CONTROL_ALLOW), -+	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_MASTER|DRM_CONTROL_ALLOW),*/ - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_mode_attachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_mode_detachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), - 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_MASTER | DRM_CONTROL_ALLOW), --	DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), --	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), -+/*	DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), -+	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW),*/ +--- linux-2.6.28.orig/drivers/gpu/drm/drm_drv.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_drv.c	2009-02-20 12:27:53.000000000 +0000 +@@ -143,6 +143,34 @@   	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW),   	DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW),   	DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW), @@ -4371,41 +4215,10 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_drv.c  +	DRM_IOCTL_DEF(DRM_IOCTL_BO_INFO, drm_bo_info_ioctl, DRM_AUTH),  +	DRM_IOCTL_DEF(DRM_IOCTL_BO_WAIT_IDLE, drm_bo_wait_idle_ioctl, DRM_AUTH),  +	DRM_IOCTL_DEF(DRM_IOCTL_BO_VERSION, drm_bo_version_ioctl, 0), -+   };   #define DRM_CORE_IOCTL_COUNT	ARRAY_SIZE( drm_ioctls ) -@@ -236,6 +269,17 @@ - 	return 0; - } -  -+void drm_cleanup_pci(struct pci_dev *pdev) -+{ -+	struct drm_device *dev = pci_get_drvdata(pdev); -+ -+	pci_set_drvdata(pdev, NULL); -+	pci_release_regions(pdev); -+	if (dev) -+		drm_cleanup(dev); -+} -+EXPORT_SYMBOL(drm_cleanup_pci); -+ - /** -  * Module initialization. Called via init_module at module load time, or via -  * linux/init/main.c (this is not currently supported). -@@ -301,9 +345,10 @@ - 		return; - 	} -  --	drm_vblank_cleanup(dev); -+	//drm_vblank_cleanup(dev); -  - 	drm_lastclose(dev); -+	drm_ctxbitmap_cleanup(dev); -  - 	if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && - 	    dev->agp && dev->agp->agp_mtrr >= 0) { -@@ -317,13 +362,21 @@ +@@ -317,6 +345,9 @@   	if (dev->driver->unload)   		dev->driver->unload(dev); @@ -4415,23 +4228,37 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_drv.c   	if (drm_core_has_AGP(dev) && dev->agp) {   		drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);   		dev->agp = NULL; - 	} +@@ -324,6 +355,8 @@   	drm_ht_remove(&dev->map_hash); --	drm_ctxbitmap_cleanup(dev); + 	drm_ctxbitmap_cleanup(dev);  +	drm_mm_takedown(&dev->offset_manager);  +	drm_ht_remove(&dev->object_hash); -+ -+ -+	if (!drm_fb_loaded) -+		pci_disable_device(dev->pdev);   	if (drm_core_check_feature(dev, DRIVER_MODESET))   		drm_put_minor(&dev->control); +@@ -336,6 +369,17 @@ + 		DRM_ERROR("Cannot unload module\n"); + } +  ++void drm_cleanup_pci(struct pci_dev *pdev) ++{ ++	struct drm_device *dev = pci_get_drvdata(pdev); ++ ++	pci_set_drvdata(pdev, NULL); ++	pci_release_regions(pdev); ++	if (dev) ++		drm_cleanup(dev); ++} ++EXPORT_SYMBOL(drm_cleanup_pci); ++ + void drm_exit(struct drm_driver *driver) + { + 	struct drm_device *dev, *tmp;  Index: linux-2.6.28/drivers/gpu/drm/drm_fence.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_fence.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_fence.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,829 @@  +/**************************************************************************  + * @@ -5264,8 +5091,8 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_fence.c  +}  Index: linux-2.6.28/drivers/gpu/drm/drm_fops.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_fops.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_fops.c	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/drm_fops.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_fops.c	2009-02-20 12:31:55.000000000 +0000  @@ -1,3 +1,4 @@  +   /** @@ -5304,66 +5131,11 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_fops.c   	if (dev->driver->open) {   		ret = dev->driver->open(dev, priv);   		if (ret < 0) -@@ -416,6 +432,33 @@ - 	} - } -  -+static void drm_object_release(struct file *filp) -+{ -+	struct drm_file *priv = filp->private_data; -+	struct list_head *head; -+	struct drm_ref_object *ref_object; -+	int i; -+ -+	/* -+	 * Free leftover ref objects created by me. Note that we cannot use -+	 * list_for_each() here, as the struct_mutex may be temporarily -+	 * released by the remove_() functions, and thus the lists may be -+	 * altered. -+	 * Also, a drm_remove_ref_object() will not remove it -+	 * from the list unless its refcount is 1. -+	 */ -+ -+	head = &priv->refd_objects; -+	while (head->next != head) { -+		ref_object = list_entry(head->next, struct drm_ref_object, list); -+		drm_remove_ref_object(priv, ref_object); -+		head = &priv->refd_objects; -+	} -+ -+	for (i = 0; i < _DRM_NO_REF_TYPES; ++i) -+		drm_ht_remove(&priv->refd_object_hash[i]); -+} -+ - /** -  * Release file. -  *  Index: linux-2.6.28/drivers/gpu/drm/drm_irq.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_irq.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_irq.c	2009-02-12 09:14:41.000000000 +0000 -@@ -1,3 +1,4 @@ -+ - /** -  * \file drm_irq.c -  * IRQ support -@@ -70,6 +71,7 @@ -  - 	return 0; - } -+#if 0 -  - static void vblank_disable_fn(unsigned long arg) - { -@@ -116,14 +118,12 @@ - 		 dev->num_crtcs, DRM_MEM_DRIVER); - 	drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs, - 		 DRM_MEM_DRIVER); --	drm_free(dev->last_vblank_wait, --		 sizeof(*dev->last_vblank_wait) * dev->num_crtcs, --		 DRM_MEM_DRIVER); - 	drm_free(dev->vblank_inmodeset, sizeof(*dev->vblank_inmodeset) * - 		 dev->num_crtcs, DRM_MEM_DRIVER); +--- linux-2.6.28.orig/drivers/gpu/drm/drm_irq.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_irq.c	2009-02-20 12:23:06.000000000 +0000 +@@ -124,6 +124,7 @@   	dev->num_crtcs = 0;   } @@ -5371,590 +5143,27 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_irq.c   int drm_vblank_init(struct drm_device *dev, int num_crtcs)   { -@@ -164,11 +164,6 @@ - 	if (!dev->last_vblank) - 		goto err; -  --	dev->last_vblank_wait = drm_calloc(num_crtcs, sizeof(u32), --					   DRM_MEM_DRIVER); --	if (!dev->last_vblank_wait) --		goto err; -- - 	dev->vblank_inmodeset = drm_calloc(num_crtcs, sizeof(int), - 					 DRM_MEM_DRIVER); - 	if (!dev->vblank_inmodeset) -@@ -192,6 +187,8 @@ - } - EXPORT_SYMBOL(drm_vblank_init); -  -+#endif -+ - /** -  * Install IRQ handler. -  * -@@ -229,6 +226,17 @@ -  - 	DRM_DEBUG("irq=%d\n", dev->pdev->irq); -  -+	if (drm_core_check_feature(dev, DRIVER_IRQ_VBL)) { -+		init_waitqueue_head(&dev->vbl_queue); -+ -+		spin_lock_init(&dev->vbl_lock); -+ -+		INIT_LIST_HEAD(&dev->vbl_sigs); -+		INIT_LIST_HEAD(&dev->vbl_sigs2); -+ -+		dev->vbl_pending = 0; -+	} -+ - 	/* Before installing handler */ - 	dev->driver->irq_preinstall(dev); -  -@@ -238,7 +246,10 @@ -  - 	ret = request_irq(drm_dev_to_irq(dev), dev->driver->irq_handler, - 			  sh_flags, dev->devname, dev); -- -+	/* Expose the device irq number to drivers that want to export it for -+	 * whatever reason. -+	 */ -+	dev->irq = drm_dev_to_irq(dev); - 	if (ret < 0) { - 		mutex_lock(&dev->struct_mutex); - 		dev->irq_enabled = 0; -@@ -267,8 +278,7 @@ -  */ - int drm_irq_uninstall(struct drm_device * dev) - { --	unsigned long irqflags; --	int irq_enabled, i; -+	int irq_enabled; -  - 	if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) - 		return -EINVAL; -@@ -278,16 +288,6 @@ - 	dev->irq_enabled = 0; - 	mutex_unlock(&dev->struct_mutex); -  --	/* --	 * Wake up any waiters so they don't hang. --	 */ --	spin_lock_irqsave(&dev->vbl_lock, irqflags); --	for (i = 0; i < dev->num_crtcs; i++) { --		DRM_WAKEUP(&dev->vbl_queue[i]); --		dev->vblank_enabled[i] = 0; --	} --	spin_unlock_irqrestore(&dev->vbl_lock, irqflags); -- - 	if (!irq_enabled) - 		return -EINVAL; -  -@@ -297,6 +297,8 @@ -  - 	free_irq(dev->pdev->irq, dev); -  -+	dev->locked_tasklet_func = NULL; -+ - 	return 0; - } - EXPORT_SYMBOL(drm_irq_uninstall); -@@ -342,196 +344,6 @@ - } -  - /** -- * drm_vblank_count - retrieve "cooked" vblank counter value -- * @dev: DRM device -- * @crtc: which counter to retrieve -- * -- * Fetches the "cooked" vblank count value that represents the number of -- * vblank events since the system was booted, including lost events due to -- * modesetting activity. -- */ --u32 drm_vblank_count(struct drm_device *dev, int crtc) --{ --	return atomic_read(&dev->_vblank_count[crtc]); --} --EXPORT_SYMBOL(drm_vblank_count); -- --/** -- * drm_update_vblank_count - update the master vblank counter -- * @dev: DRM device -- * @crtc: counter to update -- * -- * Call back into the driver to update the appropriate vblank counter -- * (specified by @crtc).  Deal with wraparound, if it occurred, and -- * update the last read value so we can deal with wraparound on the next -- * call if necessary. -- * -- * Only necessary when going from off->on, to account for frames we -- * didn't get an interrupt for. -- * -- * Note: caller must hold dev->vbl_lock since this reads & writes -- * device vblank fields. -- */ --static void drm_update_vblank_count(struct drm_device *dev, int crtc) --{ --	u32 cur_vblank, diff; -- --	/* --	 * Interrupts were disabled prior to this call, so deal with counter --	 * wrap if needed. --	 * NOTE!  It's possible we lost a full dev->max_vblank_count events --	 * here if the register is small or we had vblank interrupts off for --	 * a long time. --	 */ --	cur_vblank = dev->driver->get_vblank_counter(dev, crtc); --	diff = cur_vblank - dev->last_vblank[crtc]; --	if (cur_vblank < dev->last_vblank[crtc]) { --		diff += dev->max_vblank_count; -- --		DRM_DEBUG("last_vblank[%d]=0x%x, cur_vblank=0x%x => diff=0x%x\n", --			  crtc, dev->last_vblank[crtc], cur_vblank, diff); --	} -- --	DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n", --		  crtc, diff); -- --	atomic_add(diff, &dev->_vblank_count[crtc]); --} -- --/** -- * drm_vblank_get - get a reference count on vblank events -- * @dev: DRM device -- * @crtc: which CRTC to own -- * -- * Acquire a reference count on vblank events to avoid having them disabled -- * while in use. -- * -- * RETURNS -- * Zero on success, nonzero on failure. -- */ --int drm_vblank_get(struct drm_device *dev, int crtc) --{ --	unsigned long irqflags; --	int ret = 0; -- --	spin_lock_irqsave(&dev->vbl_lock, irqflags); --	/* Going from 0->1 means we have to enable interrupts again */ --	if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1 && --	    !dev->vblank_enabled[crtc]) { --		ret = dev->driver->enable_vblank(dev, crtc); --		DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); --		if (ret) --			atomic_dec(&dev->vblank_refcount[crtc]); --		else { --			dev->vblank_enabled[crtc] = 1; --			drm_update_vblank_count(dev, crtc); --		} --	} --	spin_unlock_irqrestore(&dev->vbl_lock, irqflags); -- --	return ret; --} --EXPORT_SYMBOL(drm_vblank_get); -- --/** -- * drm_vblank_put - give up ownership of vblank events -- * @dev: DRM device -- * @crtc: which counter to give up -- * -- * Release ownership of a given vblank counter, turning off interrupts -- * if possible. -- */ --void drm_vblank_put(struct drm_device *dev, int crtc) --{ --	/* Last user schedules interrupt disable */ --	if (atomic_dec_and_test(&dev->vblank_refcount[crtc])) --		mod_timer(&dev->vblank_disable_timer, jiffies + 5*DRM_HZ); --} --EXPORT_SYMBOL(drm_vblank_put); -- --/** -- * drm_vblank_pre_modeset - account for vblanks across mode sets -- * @dev: DRM device -- * @crtc: CRTC in question -- * @post: post or pre mode set? -- * -- * Account for vblank events across mode setting events, which will likely -- * reset the hardware frame counter. -- */ --void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) --{ --	/* --	 * To avoid all the problems that might happen if interrupts --	 * were enabled/disabled around or between these calls, we just --	 * have the kernel take a reference on the CRTC (just once though --	 * to avoid corrupting the count if multiple, mismatch calls occur), --	 * so that interrupts remain enabled in the interim. --	 */ --	if (!dev->vblank_inmodeset[crtc]) { --		dev->vblank_inmodeset[crtc] = 1; --		drm_vblank_get(dev, crtc); --	} --} --EXPORT_SYMBOL(drm_vblank_pre_modeset); -- --void drm_vblank_post_modeset(struct drm_device *dev, int crtc) --{ --	unsigned long irqflags; -- --	if (dev->vblank_inmodeset[crtc]) { --		spin_lock_irqsave(&dev->vbl_lock, irqflags); --		dev->vblank_disable_allowed = 1; --		dev->vblank_inmodeset[crtc] = 0; --		spin_unlock_irqrestore(&dev->vbl_lock, irqflags); --		drm_vblank_put(dev, crtc); --	} --} --EXPORT_SYMBOL(drm_vblank_post_modeset); -- --/** -- * drm_modeset_ctl - handle vblank event counter changes across mode switch -- * @DRM_IOCTL_ARGS: standard ioctl arguments -- * -- * Applications should call the %_DRM_PRE_MODESET and %_DRM_POST_MODESET -- * ioctls around modesetting so that any lost vblank events are accounted for. -- * -- * Generally the counter will reset across mode sets.  If interrupts are -- * enabled around this call, we don't have to do anything since the counter -- * will have already been incremented. -- */ --int drm_modeset_ctl(struct drm_device *dev, void *data, --		    struct drm_file *file_priv) --{ --	struct drm_modeset_ctl *modeset = data; --	int crtc, ret = 0; -- --	/* If drm_vblank_init() hasn't been called yet, just no-op */ --	if (!dev->num_crtcs) --		goto out; -- --	crtc = modeset->crtc; --	if (crtc >= dev->num_crtcs) { --		ret = -EINVAL; --		goto out; --	} -- --	switch (modeset->cmd) { --	case _DRM_PRE_MODESET: --		drm_vblank_pre_modeset(dev, crtc); --		break; --	case _DRM_POST_MODESET: --		drm_vblank_post_modeset(dev, crtc); --		break; --	default: --		ret = -EINVAL; --		break; --	} -- --out: --	return ret; --} -- --/** -  * Wait for VBLANK. -  * -  * \param inode device inode. -@@ -550,14 +362,14 @@ -  * -  * If a signal is not requested, then calls vblank_wait(). -  */ --int drm_wait_vblank(struct drm_device *dev, void *data, --		    struct drm_file *file_priv) -+int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv) - { - 	union drm_wait_vblank *vblwait = data; -+	struct timeval now; - 	int ret = 0; --	unsigned int flags, seq, crtc; -+	unsigned int flags, seq; -  --	if ((!dev->pdev->irq) || (!dev->irq_enabled)) -+	if ((!dev->irq) || (!dev->irq_enabled)) - 		return -EINVAL; -  - 	if (vblwait->request.type & -@@ -569,17 +381,13 @@ - 	} -  - 	flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; --	crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; -  --	if (crtc >= dev->num_crtcs) -+	if (!drm_core_check_feature(dev, (flags & _DRM_VBLANK_SECONDARY) ? -+				    DRIVER_IRQ_VBL2 : DRIVER_IRQ_VBL)) - 		return -EINVAL; -  --	ret = drm_vblank_get(dev, crtc); --	if (ret) { --		DRM_ERROR("failed to acquire vblank counter, %d\n", ret); --		return ret; --	} --	seq = drm_vblank_count(dev, crtc); -+	seq = atomic_read((flags & _DRM_VBLANK_SECONDARY) ? &dev->vbl_received2 -+			  : &dev->vbl_received); -  - 	switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) { - 	case _DRM_VBLANK_RELATIVE: -@@ -588,8 +396,7 @@ - 	case _DRM_VBLANK_ABSOLUTE: - 		break; - 	default: --		ret = -EINVAL; --		goto done; -+		return -EINVAL; - 	} -  - 	if ((flags & _DRM_VBLANK_NEXTONMISS) && -@@ -599,7 +406,8 @@ -  - 	if (flags & _DRM_VBLANK_SIGNAL) { - 		unsigned long irqflags; --		struct list_head *vbl_sigs = &dev->vbl_sigs[crtc]; -+		struct list_head *vbl_sigs = (flags & _DRM_VBLANK_SECONDARY) -+				      ? &dev->vbl_sigs2 : &dev->vbl_sigs; - 		struct drm_vbl_sig *vbl_sig; -  - 		spin_lock_irqsave(&dev->vbl_lock, irqflags); -@@ -620,32 +428,22 @@ - 			} - 		} -  --		if (atomic_read(&dev->vbl_signal_pending) >= 100) { -+		if (dev->vbl_pending >= 100) { - 			spin_unlock_irqrestore(&dev->vbl_lock, irqflags); --			ret = -EBUSY; --			goto done; -+			return -EBUSY; - 		} -  --		spin_unlock_irqrestore(&dev->vbl_lock, irqflags); -+		dev->vbl_pending++; -  --		vbl_sig = drm_calloc(1, sizeof(struct drm_vbl_sig), --				     DRM_MEM_DRIVER); --		if (!vbl_sig) { --			ret = -ENOMEM; --			goto done; --		} -+		spin_unlock_irqrestore(&dev->vbl_lock, irqflags); -  --		/* Get a refcount on the vblank, which will be released by --		 * drm_vbl_send_signals(). --		 */ --		ret = drm_vblank_get(dev, crtc); --		if (ret) { --			drm_free(vbl_sig, sizeof(struct drm_vbl_sig), --				 DRM_MEM_DRIVER); --			goto done; -+		if (! -+		    (vbl_sig = -+		     drm_alloc(sizeof(struct drm_vbl_sig), DRM_MEM_DRIVER))) { -+			return -ENOMEM; - 		} -  --		atomic_inc(&dev->vbl_signal_pending); -+		memset((void *)vbl_sig, 0, sizeof(*vbl_sig)); -  - 		vbl_sig->sequence = vblwait->request.sequence; - 		vbl_sig->info.si_signo = vblwait->request.signal; -@@ -659,31 +457,20 @@ -  - 		vblwait->reply.sequence = seq; - 	} else { --		DRM_DEBUG("waiting on vblank count %d, crtc %d\n", --			  vblwait->request.sequence, crtc); --		dev->last_vblank_wait[crtc] = vblwait->request.sequence; --		DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ, --			    (((drm_vblank_count(dev, crtc) - --			       vblwait->request.sequence) <= (1 << 23)) || --			     !dev->irq_enabled)); -- --		if (ret != -EINTR) { --			struct timeval now; -- --			do_gettimeofday(&now); -- --			vblwait->reply.tval_sec = now.tv_sec; --			vblwait->reply.tval_usec = now.tv_usec; --			vblwait->reply.sequence = drm_vblank_count(dev, crtc); --			DRM_DEBUG("returning %d to client\n", --				  vblwait->reply.sequence); --		} else { --			DRM_DEBUG("vblank wait interrupted by signal\n"); --		} -+		if (flags & _DRM_VBLANK_SECONDARY) { -+			if (dev->driver->vblank_wait2) -+				ret = dev->driver->vblank_wait2(dev, &vblwait->request.sequence); -+		} else if (dev->driver->vblank_wait) -+			ret = -+			    dev->driver->vblank_wait(dev, -+						     &vblwait->request.sequence); -+ -+		do_gettimeofday(&now); -+		vblwait->reply.tval_sec = now.tv_sec; -+		vblwait->reply.tval_usec = now.tv_usec; - 	} -  --done: --	drm_vblank_put(dev, crtc); -+      done: - 	return ret; - } -  -@@ -691,54 +478,118 @@ -  * Send the VBLANK signals. -  * -  * \param dev DRM device. -- * \param crtc CRTC where the vblank event occurred -  * -  * Sends a signal for each task in drm_device::vbl_sigs and empties the list. +@@ -697,7 +698,7 @@    *    * If a signal is not requested, then calls vblank_wait().    */  -static void drm_vbl_send_signals(struct drm_device *dev, int crtc) -+void drm_vbl_send_signals(struct drm_device * dev) ++void drm_vbl_send_signals(struct drm_device *dev, int crtc)   { --	struct drm_vbl_sig *vbl_sig, *tmp; --	struct list_head *vbl_sigs; --	unsigned int vbl_seq; - 	unsigned long flags; -+	int i; -  - 	spin_lock_irqsave(&dev->vbl_lock, flags); -  --	vbl_sigs = &dev->vbl_sigs[crtc]; --	vbl_seq = drm_vblank_count(dev, crtc); -+	for (i = 0; i < 2; i++) { -+		struct drm_vbl_sig *vbl_sig, *tmp; -+		struct list_head *vbl_sigs = i ? &dev->vbl_sigs2 : &dev->vbl_sigs; -+		unsigned int vbl_seq = atomic_read(i ? &dev->vbl_received2 : -+						   &dev->vbl_received); -+ -+		list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) { -+			if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) { -+				vbl_sig->info.si_code = vbl_seq; -+				send_sig_info(vbl_sig->info.si_signo, -+					      &vbl_sig->info, vbl_sig->task); -  --	list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) { --	    if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) { --		vbl_sig->info.si_code = vbl_seq; --		send_sig_info(vbl_sig->info.si_signo, --			      &vbl_sig->info, vbl_sig->task); -- --		list_del(&vbl_sig->head); -- --		drm_free(vbl_sig, sizeof(*vbl_sig), --			 DRM_MEM_DRIVER); --		atomic_dec(&dev->vbl_signal_pending); --		drm_vblank_put(dev, crtc); --	    } -+				list_del(&vbl_sig->head); -+ -+				drm_free(vbl_sig, sizeof(*vbl_sig), -+					 DRM_MEM_DRIVER); -+ -+				dev->vbl_pending--; -+			} -+		} - 	} + 	struct drm_vbl_sig *vbl_sig, *tmp; + 	struct list_head *vbl_sigs; +@@ -726,6 +727,7 @@   	spin_unlock_irqrestore(&dev->vbl_lock, flags);   }  +EXPORT_SYMBOL(drm_vbl_send_signals);   /** -- * drm_handle_vblank - handle a vblank event -- * @dev: DRM device -- * @crtc: where this event occurred -+ * Tasklet wrapper function. -  * -- * Drivers should call this routine in their vblank interrupt handlers to -- * update the vblank counter and send any signals that may be pending. -+ * \param data DRM device in disguise. -+ * -+ * Attempts to grab the HW lock and calls the driver callback on success. On -+ * failure, leave the lock marked as contended so the callback can be called -+ * from drm_unlock(). -  */ --void drm_handle_vblank(struct drm_device *dev, int crtc) -+static void drm_locked_tasklet_func(unsigned long data) - { --	atomic_inc(&dev->_vblank_count[crtc]); --	DRM_WAKEUP(&dev->vbl_queue[crtc]); --	drm_vbl_send_signals(dev, crtc); -+	struct drm_device *dev = (struct drm_device *)data; -+	unsigned long irqflags; -+	void (*tasklet_func)(struct drm_device *); -+ -+	spin_lock_irqsave(&dev->tasklet_lock, irqflags); -+	tasklet_func = dev->locked_tasklet_func; -+	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); -+ -+	if (!tasklet_func || -+	    !drm_lock_take(&dev->lock, -+			   DRM_KERNEL_CONTEXT)) { -+		return; -+	} -+ -+	dev->lock.lock_time = jiffies; -+	atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); -+ -+	spin_lock_irqsave(&dev->tasklet_lock, irqflags); -+	tasklet_func = dev->locked_tasklet_func; -+	dev->locked_tasklet_func = NULL; -+	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); -+ -+	if (tasklet_func != NULL) -+		tasklet_func(dev); -+ -+	drm_lock_free(&dev->lock, -+		      DRM_KERNEL_CONTEXT); -+} -+ -+/** -+ * Schedule a tasklet to call back a driver hook with the HW lock held. -+ * -+ * \param dev DRM device. -+ * \param func Driver callback. -+ * -+ * This is intended for triggering actions that require the HW lock from an -+ * interrupt handler. The lock will be grabbed ASAP after the interrupt handler -+ * completes. Note that the callback may be called from interrupt or process -+ * context, it must not make any assumptions about this. Also, the HW lock will -+ * be held with the kernel context or any client context. -+ */ -+void drm_locked_tasklet(struct drm_device *dev, void (*func)(struct drm_device *)) -+{ -+	unsigned long irqflags; -+	static DECLARE_TASKLET(drm_tasklet, drm_locked_tasklet_func, 0); -+ -+	if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ) || -+	    test_bit(TASKLET_STATE_SCHED, &drm_tasklet.state)) -+		return; -+ -+	spin_lock_irqsave(&dev->tasklet_lock, irqflags); -+ -+	if (dev->locked_tasklet_func) { -+		spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); -+		return; -+	} -+ -+	dev->locked_tasklet_func = func; -+ -+	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); -+ -+	drm_tasklet.data = (unsigned long)dev; -+ -+	tasklet_hi_schedule(&drm_tasklet); - } --EXPORT_SYMBOL(drm_handle_vblank); -+EXPORT_SYMBOL(drm_locked_tasklet); +  * drm_handle_vblank - handle a vblank event  Index: linux-2.6.28/drivers/gpu/drm/drm_object.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_object.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_object.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,294 @@  +/**************************************************************************  + * @@ -6253,7 +5462,7 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_object.c  Index: linux-2.6.28/drivers/gpu/drm/drm_regman.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_regman.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_regman.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,200 @@  +/**************************************************************************  + * Copyright (c) 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA @@ -6457,8 +5666,8 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_regman.c  +EXPORT_SYMBOL(drm_regs_init);  Index: linux-2.6.28/drivers/gpu/drm/drm_stub.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_stub.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_stub.c	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/drm_stub.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_stub.c	2009-02-20 12:33:16.000000000 +0000  @@ -201,6 +201,7 @@   	init_timer(&dev->timer);   	mutex_init(&dev->struct_mutex); @@ -6486,38 +5695,15 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_stub.c   	/* the DRM has 6 basic counters */   	dev->counters = 6;   	dev->types[0] = _DRM_STAT_LOCK; -@@ -252,15 +265,7 @@ - 		goto error_out_unreg; +@@ -261,6 +274,7 @@ + 		}   	} --	if (driver->driver_features & DRIVER_GEM) { --		retcode = drm_gem_init(dev); --		if (retcode) { --			DRM_ERROR("Cannot initialize graphics execution " --				  "manager (GEM)\n"); --			goto error_out_unreg; --		} --	} --  +	drm_fence_manager_init(dev);   	return 0;         error_out_unreg: -@@ -386,13 +391,6 @@ - 			goto err_g3; - 	} -  --        /* setup the grouping for the legacy output */ --	if (drm_core_check_feature(dev, DRIVER_MODESET)) { --		ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); --		if (ret) --			goto err_g3; --	} -- - 	list_add_tail(&dev->driver_item, &driver->device_list); -  - 	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", -@@ -409,6 +407,8 @@ +@@ -409,6 +423,8 @@   	drm_free(dev, sizeof(*dev), DRM_MEM_STUB);   	return ret;   } @@ -6529,7 +5715,7 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_stub.c  Index: linux-2.6.28/drivers/gpu/drm/drm_ttm.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_ttm.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_ttm.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,430 @@  +/**************************************************************************  + * @@ -6963,8 +6149,8 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_ttm.c  +EXPORT_SYMBOL(drm_bind_ttm);  Index: linux-2.6.28/drivers/gpu/drm/drm_vm.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_vm.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_vm.c	2009-02-12 09:14:41.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/drm_vm.c	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_vm.c	2009-02-20 12:23:06.000000000 +0000  @@ -40,6 +40,10 @@   static void drm_vm_open(struct vm_area_struct *vma); @@ -7212,7 +6398,7 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_vm.c  Index: linux-2.6.28/drivers/gpu/drm/psb/Makefile  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/Makefile	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/Makefile	2009-02-20 14:48:03.000000000 +0000  @@ -0,0 +1,12 @@  +#  +# Makefile for the drm device driver.  This driver provides support for the @@ -7221,7 +6407,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/Makefile  +ccflags-y := -Iinclude/drm  +  +psb-y := psb_drv.o psb_mmu.o psb_sgx.o psb_irq.o psb_fence.o psb_buffer.o \ -+	 psb_gtt.o psb_setup.o psb_i2c.o psb_fb.o psb_msvdx.o \ ++	 psb_gtt.o psb_fb.o psb_msvdx.o \  +	 psb_msvdxinit.o psb_regman.o psb_reset.o psb_scene.o \  +	 psb_schedule.o psb_xhw.o  + @@ -7229,7 +6415,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/Makefile  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_buffer.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_buffer.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_buffer.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,437 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -7671,7 +6857,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_buffer.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drm.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_drm.h	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_drm.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,370 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -8046,8 +7232,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drm.h  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c	2009-02-12 10:11:59.000000000 +0000 -@@ -0,0 +1,1096 @@ ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c	2009-02-20 14:48:16.000000000 +0000 +@@ -0,0 +1,1028 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation.  + * All Rights Reserved. @@ -8098,13 +7284,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +int drm_psb_no_fb = 0;  +int drm_psb_force_pipeb = 0;  +char* psb_init_mode; -+/* -+ * -+ */ -+#define SII_1392_WA -+#ifdef SII_1392_WA -+extern int SII_1392; -+#endif ++  +  +MODULE_PARM_DESC(debug, "Enable debug output");  +MODULE_PARM_DESC(clock_gating, "clock gating"); @@ -8160,24 +7340,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +  +static int probe(struct pci_dev *pdev, const struct pci_device_id *ent);  + -+#ifdef USE_PAT_WC -+#warning Init pat -+static int __cpuinit psb_cpu_callback(struct notifier_block *nfb, -+			    unsigned long action, -+			    void *hcpu) -+{ -+	if (action == CPU_ONLINE) -+		drm_init_pat(); -+ -+	return 0; -+} -+ -+static struct notifier_block __cpuinitdata psb_nb = { -+	.notifier_call = psb_cpu_callback, -+	.priority = 1 -+}; -+#endif -+  +static int dri_library_name(struct drm_device *dev, char *buf)  +{  +	return snprintf(buf, PAGE_SIZE, "psb\n"); @@ -8298,6 +7460,31 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +	(void)PSB_RSGX32(PSB_CR_CLKGATECTL);  +}  + ++static int psb_master_create(struct drm_device *dev, struct drm_master *master) ++{ ++	struct drm_i915_master_private *master_priv; ++ ++	master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER); ++	if (!master_priv) ++		return -ENOMEM; ++ ++	master->driver_priv = master_priv; ++	return 0; ++} ++ ++static void psb_master_destroy(struct drm_device *dev, struct drm_master *master) ++{ ++	struct drm_i915_master_private *master_priv = master->driver_priv; ++ ++	if (!master_priv) ++		return; ++ ++	drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER); ++ ++	master->driver_priv = NULL; ++} ++ ++  +static int psb_do_init(struct drm_device *dev)  +{  +	struct drm_psb_private *dev_priv = @@ -8478,9 +7665,9 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +			dev_priv->scratch_page = NULL;  +		}  +		psb_takedown_use_base(dev_priv); -+		if (dev_priv->vdc_reg) { -+			iounmap(dev_priv->vdc_reg); -+			dev_priv->vdc_reg = NULL; ++		if (dev_priv->common.regs) { ++			iounmap(dev_priv->common.regs); ++			dev_priv->common.regs = NULL;  +		}  +		if (dev_priv->sgx_reg) {  +			iounmap(dev_priv->sgx_reg); @@ -8497,64 +7684,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +	return 0;  +}  + -+ -+extern int drm_pick_crtcs(struct drm_device *dev); -+extern char drm_init_mode[32]; -+ -+static int psb_initial_config(struct drm_device *dev, bool can_grow) -+{ -+	struct drm_psb_private *dev_priv = dev->dev_private; -+	struct drm_connector *output; -+	struct drm_crtc *crtc; -+	int ret = false; -+ -+	mutex_lock(&dev->mode_config.mutex); -+ -+	drm_helper_probe_connector_modes(dev, 2048, 2048); -+ -+	/* strncpy(drm_init_mode, psb_init_mode, strlen(psb_init_mode)); */ -+ -+	drm_pick_crtcs(dev); -+ -+	if ((I915_READ(PIPEACONF) & PIPEACONF_ENABLE) && !drm_psb_force_pipeb) -+		list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { -+		if (!crtc->desired_mode) -+			continue; -+ -+		dev->driver->fb_probe(dev, crtc); -+	} else -+		list_for_each_entry_reverse(crtc, &dev->mode_config.crtc_list, -+					    head) { -+		if (!crtc->desired_mode) -+			continue; -+ -+		dev->driver->fb_probe(dev, crtc); -+		} -+ -+	list_for_each_entry(output, &dev->mode_config.connector_list, head) { -+ -+		if (!output->encoder->crtc || !output->encoder->crtc->desired_mode) -+			continue; -+ -+		if (output->encoder->crtc->fb) -+			drm_crtc_helper_set_mode(output->encoder->crtc, -+					  output->encoder->crtc->desired_mode, 0, 0, NULL); -+	} -+ -+#ifdef SII_1392_WA -+	if((SII_1392 != 1) || (drm_psb_no_fb==0)) -+		drm_helper_disable_unused_functions(dev); -+#else -+	drm_helper_disable_unused_functions(dev); -+#endif -+ -+ -+	mutex_unlock(&dev->mode_config.mutex); -+ -+	return ret; -+ -+} -+  +static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb)  +{  +	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); @@ -8695,9 +7824,9 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +	if (!dev_priv->msvdx_reg)  +		goto out_err;  + -+	dev_priv->vdc_reg = ++	dev_priv->common.regs =  +	    ioremap(resource_start + PSB_VDC_OFFSET, PSB_VDC_SIZE); -+	if (!dev_priv->vdc_reg) ++	if (!dev_priv->common.regs)  +		goto out_err;  +  +	dev_priv->sgx_reg = @@ -8797,12 +7926,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +  +	drm_helper_initial_config(dev, false);  + -+ -+#ifdef USE_PAT_WC -+#warning Init pat -+	register_cpu_notifier(&psb_nb); -+#endif -+  +	return 0;  +      out_err:  +	psb_driver_unload(dev); @@ -8913,14 +8036,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +	if (ret)  +		return ret;  + -+#ifdef USE_PAT_WC -+#warning Init pat -+	/* for single CPU's we do it here, then for more than one CPU we -+	 * use the CPU notifier to reinit PAT on those CPU's. -+	 */ -+	drm_init_pat(); -+#endif -+  +	INIT_LIST_HEAD(&dev_priv->resume_buf.head);  +	dev_priv->msvdx_needs_reset = 1;  + @@ -9084,12 +8199,15 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  +	.get_reg_ofs = drm_core_get_reg_ofs,  +	.ioctls = psb_ioctls,  +	.device_is_agp = psb_driver_device_is_agp, -+	.vblank_wait = psb_vblank_wait, -+	.vblank_wait2 = psb_vblank_wait2, ++	.get_vblank_counter = psb_get_vblank_counter, ++	.enable_vblank = psb_enable_vblank, ++	.disable_vblank = psb_disable_vblank,  +	.irq_preinstall = psb_irq_preinstall,  +	.irq_postinstall = psb_irq_postinstall,  +	.irq_uninstall = psb_irq_uninstall,  +	.irq_handler = psb_irq_handler, ++	.master_create = psb_master_create, ++	.master_destroy = psb_master_destroy,  +	.fb_probe = psbfb_probe,  +	.fb_remove = psbfb_remove,  +	.firstopen = NULL, @@ -9147,7 +8265,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h	2009-02-12 10:10:55.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,549 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -9297,10 +8415,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h  +#define VCLK_DIVISOR_VGA1   0x6004  +#define VCLK_POST_DIV       0x6010  + -+#define I915_WRITE(_offs, _val) \ -+  iowrite32(_val, dev_priv->vdc_reg + (_offs)) -+#define I915_READ(_offs) \ -+  ioread32(dev_priv->vdc_reg + (_offs)) ++#define I915_READ(reg)          readl(dev_priv->common.regs + (reg)) ++#define I915_WRITE(reg, val)     writel(val, dev_priv->common.regs + (reg))  +  +#define PSB_COMM_2D (PSB_ENGINE_2D << 4)  +#define PSB_COMM_3D (PSB_ENGINE_3D << 4) @@ -9453,12 +8569,13 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h  + * psb_irq.c  + */  + ++extern u32 psb_get_vblank_counter(struct drm_device *dev, int pipe); ++extern int psb_enable_vblank(struct drm_device *dev, int crtc); ++extern void psb_disable_vblank(struct drm_device *dev, int crtc);  +extern irqreturn_t psb_irq_handler(DRM_IRQ_ARGS);  +extern void psb_irq_preinstall(struct drm_device *dev);  +extern int psb_irq_postinstall(struct drm_device *dev);  +extern void psb_irq_uninstall(struct drm_device *dev); -+extern int psb_vblank_wait2(struct drm_device *dev, unsigned int *sequence); -+extern int psb_vblank_wait(struct drm_device *dev, unsigned int *sequence);  +  +/*  + * psb_fence.c @@ -9613,6 +8730,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h  +extern void psb_xhw_clean_buf(struct drm_psb_private *dev_priv,  +			      struct psb_xhw_buf *buf);  + ++extern void psb_i2c_init(struct drm_psb_private *dev_priv); ++  +/*  + * psb_schedule.c: HW bug fixing.  + */ @@ -9634,12 +8753,11 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h  + * Utilities  + */  + ++#define PSB_WVDC32(_val, _offs) I915_WRITE(_offs, _val) ++#define PSB_RVDC32(_offs) I915_READ(_offs) ++  +#define PSB_ALIGN_TO(_val, _align) \  +  (((_val) + ((_align) - 1)) & ~((_align) - 1)) -+#define PSB_WVDC32(_val, _offs) \ -+  iowrite32(_val, dev_priv->vdc_reg + (_offs)) -+#define PSB_RVDC32(_offs) \ -+  ioread32(dev_priv->vdc_reg + (_offs))  +#define PSB_WSGX32(_val, _offs) \  +  iowrite32(_val, dev_priv->sgx_reg + (_offs))  +#define PSB_RSGX32(_offs) \ @@ -9701,8 +8819,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_drv.h  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c	2009-02-12 09:14:41.000000000 +0000 -@@ -0,0 +1,1349 @@ ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c	2009-02-20 12:23:06.000000000 +0000 +@@ -0,0 +1,1219 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation.  + * All Rights Reserved. @@ -9742,11 +8860,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +#include "drm_crtc.h"  +#include "psb_drv.h"  + -+#define SII_1392_WA -+#ifdef SII_1392_WA -+extern int SII_1392; -+#endif -+  +struct psbfb_vm_info {  +	struct drm_buffer_object *bo;  +	struct address_space *f_mapping; @@ -9806,8 +8919,10 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	if (regno > 255)  +		return 1;  + -+	if (crtc->funcs->gamma_set) -+		crtc->funcs->gamma_set(crtc, red, green, blue, regno); ++	if (crtc->fb->depth == 8) { ++		intel_crtc_fb_gamma_set(crtc, red, green, blue, regno); ++		return 0; ++	}  +  +	red = CMAP_TOHW(red, info->var.red.length);  +	blue = CMAP_TOHW(blue, info->var.blue.length); @@ -9835,10 +8950,10 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +static int psbfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)  +{  +	struct psbfb_par *par = info->par; -+	struct drm_device *dev = par->dev; ++	//struct drm_device *dev = par->dev;  +	struct drm_framebuffer *fb = par->crtc->fb; -+	struct drm_display_mode *drm_mode; -+	struct drm_connector *output; ++	//struct drm_display_mode *drm_mode; ++	//struct drm_connector *output;  +	int depth;  +	int pitch;  +	int bpp = var->bits_per_pixel; @@ -9877,43 +8992,12 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +  +	/* Check that we can resize */  +	if ((pitch * var->yres) > (fb->bo->num_pages << PAGE_SHIFT)) { -+#if 1  +		/* Need to resize the fb object.  +		 * But the generic fbdev code doesn't really understand  +		 * that we can do this. So disable for now.  +		 */  +		DRM_INFO("Can't support requested size, too big!\n");  +		return -EINVAL; -+#else -+		int ret; -+		struct drm_buffer_object *fbo = NULL; -+		struct drm_bo_kmap_obj tmp_kmap; -+ -+		/* a temporary BO to check if we could resize in setpar. -+		 * Therefore no need to set NO_EVICT. -+		 */ -+		ret = drm_buffer_object_create(dev, -+					       pitch * var->yres, -+					       drm_bo_type_kernel, -+					       DRM_BO_FLAG_READ | -+					       DRM_BO_FLAG_WRITE | -+					       DRM_BO_FLAG_MEM_TT | -+					       DRM_BO_FLAG_MEM_VRAM, -+					       DRM_BO_HINT_DONT_FENCE, -+					       0, 0, &fbo); -+		if (ret || !fbo) -+			return -ENOMEM; -+ -+		ret = drm_bo_kmap(fbo, 0, fbo->num_pages, &tmp_kmap); -+		if (ret) { -+			drm_bo_usage_deref_unlocked(&fbo); -+			return -EINVAL; -+		} -+ -+		drm_bo_kunmap(&tmp_kmap); -+		/* destroy our current fbo! */ -+		drm_bo_usage_deref_unlocked(&fbo); -+#endif  +	}  +  +	switch (depth) { @@ -9971,31 +9055,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +		return -EINVAL;  +	}  + -+#if 0 -+	/* Here we walk the output mode list and look for modes. If we haven't -+	 * got it, then bail. Not very nice, so this is disabled. -+	 * In the set_par code, we create our mode based on the incoming -+	 * parameters. Nicer, but may not be desired by some. -+	 */ -+	list_for_each_entry(output, &dev->mode_config.connector_list, head) { -+		if (output->crtc == par->crtc) -+			break; -+	} -+ -+	list_for_each_entry(drm_mode, &output->modes, head) { -+		if (drm_mode->hdisplay == var->xres && -+		    drm_mode->vdisplay == var->yres && drm_mode->clock != 0) -+			break; -+	} -+ -+	if (!drm_mode) -+		return -EINVAL; -+#else -+	(void)dev;		/* silence warnings */ -+	(void)output; -+	(void)drm_mode; -+#endif -+  +	return 0;  +}  + @@ -10037,7 +9096,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	struct drm_display_mode *drm_mode;  +	struct fb_var_screeninfo *var = &info->var;  +	struct drm_psb_private *dev_priv = dev->dev_private; -+	struct drm_connector *output; ++	//struct drm_connector *output;  +	int pitch;  +	int depth;  +	int bpp = var->bits_per_pixel; @@ -10065,55 +9124,12 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	pitch = ((var->xres * ((bpp + 1) / 8)) + 0x3f) & ~0x3f;  +  +	if ((pitch * var->yres) > (fb->bo->num_pages << PAGE_SHIFT)) { -+#if 1  +		/* Need to resize the fb object.  +		 * But the generic fbdev code doesn't really understand  +		 * that we can do this. So disable for now.  +		 */  +		DRM_INFO("Can't support requested size, too big!\n");  +		return -EINVAL; -+#else -+		int ret; -+		struct drm_buffer_object *fbo = NULL, *tfbo; -+		struct drm_bo_kmap_obj tmp_kmap, tkmap; -+ -+		ret = drm_buffer_object_create(dev, -+					       pitch * var->yres, -+					       drm_bo_type_kernel, -+					       DRM_BO_FLAG_READ | -+					       DRM_BO_FLAG_WRITE | -+					       DRM_BO_FLAG_MEM_TT | -+					       DRM_BO_FLAG_MEM_VRAM | -+					       DRM_BO_FLAG_NO_EVICT, -+					       DRM_BO_HINT_DONT_FENCE, -+					       0, 0, &fbo); -+		if (ret || !fbo) { -+			DRM_ERROR -+			    ("failed to allocate new resized framebuffer\n"); -+			return -ENOMEM; -+		} -+ -+		ret = drm_bo_kmap(fbo, 0, fbo->num_pages, &tmp_kmap); -+		if (ret) { -+			DRM_ERROR("failed to kmap framebuffer.\n"); -+			drm_bo_usage_deref_unlocked(&fbo); -+			return -EINVAL; -+		} -+ -+		DRM_DEBUG("allocated %dx%d fb: 0x%08lx, bo %p\n", fb->width, -+			  fb->height, fb->offset, fbo); -+ -+		/* set new screen base */ -+		info->screen_base = tmp_kmap.virtual; -+ -+		tkmap = fb->kmap; -+		fb->kmap = tmp_kmap; -+		drm_bo_kunmap(&tkmap); -+ -+		tfbo = fb->bo; -+		fb->bo = fbo; -+		drm_bo_usage_deref_unlocked(&tfbo); -+#endif  +	}  +  +	fb->offset = fb->bo->offset - dev_priv->pg->gatt_start; @@ -10136,30 +9152,11 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	   window and re-enter the console */  +	info->screen_base = fb->kmap.virtual;  + -+#if 0 -+	/* relates to resize - disable */ -+	info->fix.smem_len = info->fix.line_length * var->yres; -+	info->screen_size = info->fix.smem_len;	/* ??? */ -+#endif -+  +	/* Should we walk the output's modelist or just create our own ???  +	 * For now, we create and destroy a mode based on the incoming  +	 * parameters. But there's commented out code below which scans  +	 * the output list too.  +	 */ -+#if 0 -+	list_for_each_entry(output, &dev->mode_config.connector_list, head) { -+		if (output->crtc == par->crtc) -+			break; -+	} -+ -+	list_for_each_entry(drm_mode, &output->modes, head) { -+		if (drm_mode->hdisplay == var->xres && -+		    drm_mode->vdisplay == var->yres && drm_mode->clock != 0) -+			break; -+	} -+#else -+	(void)output;		/* silence warning */  +  +	drm_mode = drm_mode_create(dev);  +	drm_mode->hdisplay = var->xres; @@ -10174,7 +9171,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	drm_mode->vrefresh = drm_mode_vrefresh(drm_mode);  +	drm_mode_set_name(drm_mode);  +	drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V); -+#endif ++  +  +	if (!drm_crtc_helper_set_mode(par->crtc, drm_mode, 0, 0, NULL))  +		return -EINVAL; @@ -10182,9 +9179,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	/* Have to destroy our created mode if we're not searching the mode  +	 * list for it.  +	 */ -+#if 1  +	drm_mode_destroy(dev, drm_mode); -+#endif  +  +	return 0;  +} @@ -10664,12 +9659,9 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	acquire_console_sem();  +	ret = psbfb_kms_on(dev, 0);  +	release_console_sem(); -+#ifdef SII_1392_WA -+	if((SII_1392 != 1) || (drm_psb_no_fb==0)) -+		drm_helper_disable_unused_functions(dev); -+#else ++  +	drm_helper_disable_unused_functions(dev); -+#endif ++  +	return ret;  +}  + @@ -10685,12 +9677,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  +	acquire_console_sem();  +	psbfb_kms_on(dev, 1);  +	release_console_sem(); -+#ifdef SII_1392_WA -+	if((SII_1392 != 1) || (drm_psb_no_fb==0)) -+		drm_helper_disable_unused_functions(dev); -+#else ++  +	drm_helper_disable_unused_functions(dev); -+#endif  +}  +  +/* @@ -11055,7 +10043,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fb.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fence.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_fence.c	2009-02-12 09:14:41.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_fence.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,285 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -11345,8 +10333,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_fence.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c	2009-02-12 09:14:41.000000000 +0000 -@@ -0,0 +1,233 @@ ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c	2009-02-20 12:23:06.000000000 +0000 +@@ -0,0 +1,253 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation.  + * All Rights Reserved. @@ -11434,14 +10422,20 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +	int ret = 0;  +	uint32_t pte;  + ++	printk(KERN_ERR "Bar A1\n"); ++  +	pci_read_config_word(dev->pdev, PSB_GMCH_CTRL, &pg->gmch_ctrl);  +	pci_write_config_word(dev->pdev, PSB_GMCH_CTRL,  +			      pg->gmch_ctrl | _PSB_GMCH_ENABLED);  + ++	printk(KERN_ERR "Bar A2\n"); ++  +	pg->pge_ctl = PSB_RVDC32(PSB_PGETBL_CTL);  +	PSB_WVDC32(pg->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL);  +	(void)PSB_RVDC32(PSB_PGETBL_CTL);  + ++	printk(KERN_ERR "Bar A3\n"); ++  +	pg->initialized = 1;  +  +	pg->gtt_phys_start = pg->pge_ctl & PAGE_MASK; @@ -11450,9 +10444,13 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +	gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) >> PAGE_SHIFT;  +	pg->gatt_pages = pci_resource_len(dev->pdev, PSB_GATT_RESOURCE)  +	    >> PAGE_SHIFT; ++ ++	printk(KERN_ERR "Bar A4\n");  +	pci_read_config_dword(dev->pdev, PSB_BSM, &pg->stolen_base);  +	stolen_size = pg->gtt_phys_start - pg->stolen_base - PAGE_SIZE;  + ++	printk(KERN_ERR "Bar A5\n"); ++  +	PSB_DEBUG_INIT("GTT phys start: 0x%08x.\n", pg->gtt_phys_start);  +	PSB_DEBUG_INIT("GTT start: 0x%08x.\n", pg->gtt_start);  +	PSB_DEBUG_INIT("GATT start: 0x%08x.\n", pg->gatt_start); @@ -11466,6 +10464,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +		goto out_err;  +	}  + ++	printk(KERN_ERR "Bar A6\n"); ++  +	pg->gtt_pages = gtt_pages;  +	pg->stolen_size = stolen_size;  +	pg->gtt_map = @@ -11476,6 +10476,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +		goto out_err;  +	}  + ++	printk(KERN_ERR "Bar A7\n"); ++  +	/*  +	 * insert stolen pages.  +	 */ @@ -11489,6 +10491,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +		iowrite32(pte, pg->gtt_map + i);  +	}  + ++	printk(KERN_ERR "Bar A8\n"); ++  +	/*  +	 * Init rest of gtt.  +	 */ @@ -11498,10 +10502,14 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +	PSB_DEBUG_INIT("Initializing the rest of a total "  +		       "of %d gtt pages.\n", pg->gatt_pages);  + ++	printk(KERN_ERR "Bar A10\n"); ++  +	for (; i < pg->gatt_pages; ++i)  +		iowrite32(pte, pg->gtt_map + i);  +	(void)ioread32(pg->gtt_map + i - 1);  + ++	printk(KERN_ERR "Bar A11\n"); ++  +	return 0;  +  +      out_err: @@ -11580,238 +10588,188 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_gtt.c  +  +	return 0;  +} -Index: linux-2.6.28/drivers/gpu/drm/psb/psb_i2c.c +Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_i2c.c	2009-02-12 10:12:29.000000000 +0000 -@@ -0,0 +1,179 @@ -+/* -+ * Copyright © 2006-2007 Intel Corporation ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c	2009-02-20 12:23:06.000000000 +0000 +@@ -0,0 +1,519 @@ ++/************************************************************************** ++ * Copyright (c) 2007, Intel Corporation. ++ * All Rights Reserved.  + * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation.  + * -+ * The above copyright notice and this permission notice (including the next -+ * paragraph) shall be included in all copies or substantial portions of the -+ * Software. ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for ++ * more details.  + * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.  + * -+ * Authors: -+ *	Eric Anholt <eric@anholt.net> -+ */ ++ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to ++ * develop this driver. ++ * ++ **************************************************************************/  +/* -+ * Copyright (c) 2006 Dave Airlie <airlied@linux.ie> -+ *   Jesse Barnes <jesse.barnes@intel.com>  + */  + -+#include <linux/i2c.h> -+#include <linux/i2c-id.h> -+#include <linux/i2c-algo-bit.h>  +#include "drmP.h" -+#include "drm.h" -+#include "../i915/intel_drv.h"  +#include "psb_drv.h" ++#include "psb_reg.h" ++#include "psb_msvdx.h" ++#include "../i915/i915_reg.h"  +  +/* -+ * Intel GPIO access functions ++ * Video display controller interrupt.  + */  + -+#define I2C_RISEFALL_TIME 20 -+ -+static int get_clock(void *data) ++static inline u32 ++psb_pipestat(int pipe)  +{ -+	struct intel_i2c_chan *chan = data; -+	struct drm_psb_private *dev_priv = chan->drm_dev->dev_private; -+	uint32_t val; -+ -+	val = PSB_RVDC32(chan->reg); -+	return ((val & GPIO_CLOCK_VAL_IN) != 0); ++	if (pipe == 0) ++		return PIPEASTAT; ++	if (pipe == 1) ++		return PIPEBSTAT; ++	BUG();  +}  + -+static int get_data(void *data) ++void ++psb_enable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask)  +{ -+	struct intel_i2c_chan *chan = data; -+	struct drm_psb_private *dev_priv = chan->drm_dev->dev_private; -+	uint32_t val; ++	//struct drm_i915_common_private *dev_priv_common = dev_priv; ++ ++	if ((dev_priv->pipestat[pipe] & mask) != mask) { ++		u32 reg = psb_pipestat(pipe);  + -+	val = PSB_RVDC32(chan->reg); -+	return ((val & GPIO_DATA_VAL_IN) != 0); ++		dev_priv->pipestat[pipe] |= mask; ++		/* Enable the interrupt, clear any pending status */ ++		I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); ++		(void) I915_READ(reg); ++	}  +}  + -+static void set_clock(void *data, int state_high) ++void ++psb_disable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask)  +{ -+	struct intel_i2c_chan *chan = data; -+	struct drm_psb_private *dev_priv = chan->drm_dev->dev_private; -+	uint32_t reserved = 0, clock_bits; ++	//struct drm_i915_common_private *dev_priv_common = (struct drm_i915_common_private *) dev_priv;  + -+	/* On most chips, these bits must be preserved in software. */ -+	reserved = PSB_RVDC32(chan->reg) & (GPIO_DATA_PULLUP_DISABLE | -+					    GPIO_CLOCK_PULLUP_DISABLE); ++	if ((dev_priv->pipestat[pipe] & mask) != 0) { ++		u32 reg = psb_pipestat(pipe);  + -+	if (state_high) -+		clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK; -+	else -+		clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK | -+		    GPIO_CLOCK_VAL_MASK; -+	PSB_WVDC32(reserved | clock_bits, chan->reg); -+	udelay(I2C_RISEFALL_TIME);	/* wait for the line to change state */ ++		dev_priv->pipestat[pipe] &= ~mask; ++		I915_WRITE(reg, dev_priv->pipestat[pipe]); ++		(void) I915_READ(reg); ++	}  +}  + -+static void set_data(void *data, int state_high) -+{ -+	struct intel_i2c_chan *chan = data; -+	struct drm_psb_private *dev_priv = chan->drm_dev->dev_private; -+	uint32_t reserved = 0, data_bits;  + -+	/* On most chips, these bits must be preserved in software. */ -+	reserved = PSB_RVDC32(chan->reg) & (GPIO_DATA_PULLUP_DISABLE | -+					    GPIO_CLOCK_PULLUP_DISABLE); ++/** ++ * i915_pipe_enabled - check if a pipe is enabled ++ * @dev: DRM device ++ * @pipe: pipe to check ++ * ++ * Reading certain registers when the pipe is disabled can hang the chip. ++ * Use this routine to make sure the PLL is running and the pipe is active ++ * before reading such registers if unsure. ++ */ ++static int ++i915_pipe_enabled(struct drm_device *dev, int pipe) ++{ ++	struct drm_psb_private *dev_priv = dev->dev_private; ++	unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF;  + -+	if (state_high) -+		data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK; -+	else -+		data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK | -+		    GPIO_DATA_VAL_MASK; ++	if (I915_READ(pipeconf) & PIPEACONF_ENABLE) ++		return 1;  + -+	PSB_WVDC32(data_bits, chan->reg); -+	udelay(I2C_RISEFALL_TIME);	/* wait for the line to change state */ ++	return 0;  +}  + -+/** -+ * intel_i2c_create - instantiate an Intel i2c bus using the specified GPIO reg -+ * @dev: DRM device -+ * @output: driver specific output device -+ * @reg: GPIO reg to use -+ * @name: name for this bus -+ * -+ * Creates and registers a new i2c bus with the Linux i2c layer, for use -+ * in output probing and control (e.g. DDC or SDVO control functions). -+ * -+ * Possible values for @reg include: -+ *   %GPIOA -+ *   %GPIOB -+ *   %GPIOC -+ *   %GPIOD -+ *   %GPIOE -+ *   %GPIOF -+ *   %GPIOG -+ *   %GPIOH -+ * see PRM for details on how these different busses are used. ++/* Called from drm generic code, passed a 'crtc', which ++ * we use as a pipe index  + */ -+struct intel_i2c_chan *intel_i2c_create(struct drm_device *dev, -+					const uint32_t reg, const char *name) ++u32 psb_get_vblank_counter(struct drm_device *dev, int pipe)  +{ -+	struct intel_i2c_chan *chan; ++	struct drm_psb_private *dev_priv = dev->dev_private; ++	unsigned long high_frame; ++	unsigned long low_frame; ++	u32 high1, high2, low, count;  + -+	chan = kzalloc(sizeof(struct intel_i2c_chan), GFP_KERNEL); -+	if (!chan) -+		goto out_free; ++	high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH; ++	low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;  + -+	chan->drm_dev = dev; -+	chan->reg = reg; -+	snprintf(chan->adapter.name, I2C_NAME_SIZE, "intel drm %s", name); -+	chan->adapter.owner = THIS_MODULE; -+	chan->adapter.id = I2C_HW_B_INTELFB; -+	chan->adapter.algo_data = &chan->algo; -+	chan->adapter.dev.parent = &dev->pdev->dev; -+	chan->algo.setsda = set_data; -+	chan->algo.setscl = set_clock; -+	chan->algo.getsda = get_data; -+	chan->algo.getscl = get_clock; -+	chan->algo.udelay = 20; -+	chan->algo.timeout = usecs_to_jiffies(2200); -+	chan->algo.data = chan; -+ -+	i2c_set_adapdata(&chan->adapter, chan); -+ -+	if (i2c_bit_add_bus(&chan->adapter)) -+		goto out_free; ++	if (!i915_pipe_enabled(dev, pipe)) { ++		DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe); ++		return 0; ++	}  + -+	/* JJJ:  raise SCL and SDA? */ -+	set_data(chan, 1); -+	set_clock(chan, 1); -+	udelay(20); ++	/* ++	 * High & low register fields aren't synchronized, so make sure ++	 * we get a low value that's stable across two reads of the high ++	 * register. ++	 */ ++	do { ++		high1 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >> ++			 PIPE_FRAME_HIGH_SHIFT); ++		low =  ((I915_READ(low_frame) & PIPE_FRAME_LOW_MASK) >> ++			PIPE_FRAME_LOW_SHIFT); ++		high2 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >> ++			 PIPE_FRAME_HIGH_SHIFT); ++	} while (high1 != high2);  + -+	return chan; ++	count = (high1 << 8) | low;  + -+      out_free: -+	kfree(chan); -+	return NULL; ++	return count;  +}  + -+/** -+ * intel_i2c_destroy - unregister and free i2c bus resources -+ * @output: channel to free -+ * -+ * Unregister the adapter from the i2c layer, then free the structure. ++/* Called from drm generic code, passed 'crtc' which ++ * we use as a pipe index  + */ -+void intel_i2c_destroy(struct intel_i2c_chan *chan) ++int psb_enable_vblank(struct drm_device *dev, int pipe)  +{ -+	if (!chan) -+		return; ++	struct drm_psb_private *dev_priv = dev->dev_private; ++	unsigned long irqflags; ++	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; ++	u32 pipeconf; ++ ++	pipeconf = I915_READ(pipeconf_reg); ++	if (!(pipeconf & PIPEACONF_ENABLE)) ++		return -EINVAL;  + -+	i2c_del_adapter(&chan->adapter); -+	kfree(chan); ++	spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); ++	psb_enable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_ENABLE); ++	spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); ++	return 0;  +} -Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c -=================================================================== ---- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c	2009-02-12 09:14:41.000000000 +0000 -@@ -0,0 +1,382 @@ -+/************************************************************************** -+ * Copyright (c) 2007, Intel Corporation. -+ * All Rights Reserved. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms and conditions of the GNU General Public License, -+ * version 2, as published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -+ * more details. -+ * -+ * You should have received a copy of the GNU General Public License along with -+ * this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -+ * -+ * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to -+ * develop this driver. -+ * -+ **************************************************************************/ -+/* ++ ++/* Called from drm generic code, passed 'crtc' which ++ * we use as a pipe index  + */ ++void psb_disable_vblank(struct drm_device *dev, int pipe) ++{ ++	struct drm_psb_private *dev_priv = dev->dev_private; ++	unsigned long irqflags; ++ ++	spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); ++	psb_disable_pipestat(dev_priv, pipe, ++			      PIPE_VBLANK_INTERRUPT_ENABLE | ++			      PIPE_START_VBLANK_INTERRUPT_ENABLE); ++	spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); ++}  + -+#include "drmP.h" -+#include "psb_drv.h" -+#include "psb_reg.h" -+#include "psb_msvdx.h"  + -+/* -+ * Video display controller interrupt. -+ */  +  +static void psb_vdc_interrupt(struct drm_device *dev, uint32_t vdc_stat)  +{ -+	struct drm_psb_private *dev_priv = -+	    (struct drm_psb_private *)dev->dev_private; -+	uint32_t pipe_stats; ++	struct drm_psb_private *dev_priv = dev->dev_private;	uint32_t pipe_stats;  +	int wake = 0;  +  +	if (!drm_psb_disable_vsync && (vdc_stat & _PSB_VSYNC_PIPEA_FLAG)) {  +		pipe_stats = PSB_RVDC32(PSB_PIPEASTAT); -+		atomic_inc(&dev->vbl_received); ++		atomic_inc(&dev->_vblank_count[0]);  +		wake = 1;  +		PSB_WVDC32(pipe_stats | _PSB_VBLANK_INTERRUPT_ENABLE |  +			   _PSB_VBLANK_CLEAR, PSB_PIPEASTAT); @@ -11819,7 +10777,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  +  +	if (!drm_psb_disable_vsync && (vdc_stat & _PSB_VSYNC_PIPEB_FLAG)) {  +		pipe_stats = PSB_RVDC32(PSB_PIPEBSTAT); -+		atomic_inc(&dev->vbl_received2); ++		atomic_inc(&dev->_vblank_count[1]);  +		wake = 1;  +		PSB_WVDC32(pipe_stats | _PSB_VBLANK_INTERRUPT_ENABLE |  +			   _PSB_VBLANK_CLEAR, PSB_PIPEBSTAT); @@ -11830,8 +10788,11 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  +	DRM_READMEMORYBARRIER();  +  +	if (wake) { -+		DRM_WAKEUP(&dev->vbl_queue); -+		drm_vbl_send_signals(dev); ++		int i; ++		DRM_WAKEUP(dev->vbl_queue); ++ ++		for (i = 0; i < 2; i++) ++			drm_vbl_send_signals(dev, i);  +	}  +}  + @@ -11842,8 +10803,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  +static void psb_sgx_interrupt(struct drm_device *dev, uint32_t sgx_stat,  +			      uint32_t sgx_stat2)  +{ -+	struct drm_psb_private *dev_priv = -+	    (struct drm_psb_private *)dev->dev_private; ++	struct drm_psb_private *dev_priv = dev->dev_private;  +  +	if (sgx_stat & _PSB_CE_TWOD_COMPLETE) {  +		DRM_WAKEUP(&dev_priv->event_2d_queue); @@ -12094,14 +11054,14 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  +	++dev_priv->irqen_count_2d;  +	spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);  +} -+ ++#if 0  +static int psb_vblank_do_wait(struct drm_device *dev, unsigned int *sequence, -+			      atomic_t * counter) ++			      atomic_t * counter, int crtc)  +{  +	unsigned int cur_vblank;  +	int ret = 0;  + -+	DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ, ++	DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ,  +		    (((cur_vblank = atomic_read(counter))  +		      - *sequence) <= (1 << 23)));  + @@ -12114,7 +11074,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  +{  +	int ret;  + -+	ret = psb_vblank_do_wait(dev, sequence, &dev->vbl_received); ++	ret = psb_vblank_do_wait(dev, sequence, &dev->_vblank_count[0], 0);  +	return ret;  +}  + @@ -12122,9 +11082,10 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  +{  +	int ret;  + -+	ret = psb_vblank_do_wait(dev, sequence, &dev->vbl_received2); ++	ret = psb_vblank_do_wait(dev, sequence, &dev->_vblank_count[1], 1);  +	return ret;  +} ++#endif  +  +void psb_msvdx_irq_off(struct drm_psb_private *dev_priv)  +{ @@ -12154,7 +11115,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_irq.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_mmu.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_mmu.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_mmu.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,1037 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -13196,8 +12157,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_mmu.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c	2009-02-12 09:14:42.000000000 +0000 -@@ -0,0 +1,678 @@ ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c	2009-02-20 12:47:58.000000000 +0000 +@@ -0,0 +1,671 @@  +/**  + * file psb_msvdx.c  + * MSVDX I/O operations and IRQ handling @@ -13517,13 +12478,6 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c  +  return ret;  +}  + -+/*********************************************************************************** -+ * Function Name      : psb_mtx_send -+ * Inputs             : -+ * Outputs            : -+ * Returns            : -+ * Description        : -+ ************************************************************************************/  +int  +psb_mtx_send (struct drm_psb_private *dev_priv, const void *pvMsg)  +{ @@ -13879,7 +12833,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.h	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,564 @@  +/**************************************************************************  + * @@ -14448,7 +13402,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdx.h  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdxinit.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdxinit.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_msvdxinit.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,625 @@  +/**  + * file psb_msvdxinit.c @@ -15078,7 +14032,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_msvdxinit.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_reg.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_reg.h	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_reg.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,562 @@  +/**************************************************************************  + * @@ -15645,7 +14599,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_reg.h  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_regman.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_regman.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_regman.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,175 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -15825,7 +14779,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_regman.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_reset.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_reset.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_reset.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,374 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -16204,7 +15158,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_reset.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_scene.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_scene.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_scene.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,531 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -16740,7 +15694,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_scene.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_scene.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_scene.h	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_scene.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,112 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -16857,7 +15811,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_scene.h  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,1445 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -18307,7 +17261,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.h	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,170 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -18479,33 +17433,10 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_schedule.h  +extern int psb_extend_raster_timeout(struct drm_psb_private *dev_priv);  +  +#endif -Index: linux-2.6.28/drivers/gpu/drm/psb/psb_setup.c -=================================================================== ---- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_setup.c	2009-02-12 09:59:18.000000000 +0000 -@@ -0,0 +1,18 @@ -+#include "drmP.h" -+#include "drm.h" -+#include "drm_crtc.h" -+#include "drm_edid.h" -+#include "psb_drm.h" -+#include "psb_priv.h" -+//#include "i915_reg.h" -+//#include "intel_drv.h" -+#include "../i915/intel_crt.c" -+ -+/* Fixed name */ -+#define ACPI_EDID_LCD	"\\_SB_.PCI0.GFX0.DD04._DDC" -+#define ACPI_DOD	"\\_SB_.PCI0.GFX0._DOD" -+ -+#include "../i915/intel_lvds.c" -+#include "../i915/intel_sdvo.c" -+#include "../i915/intel_display.c" -+#include "../i915/intel_modes.c"  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_sgx.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_sgx.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_sgx.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,1422 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -19932,7 +18863,7 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_sgx.c  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_xhw.c  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_xhw.c	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_xhw.c	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,614 @@  +/**************************************************************************  + * Copyright (c) 2007, Intel Corporation. @@ -20550,9 +19481,9 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_xhw.c  +}  Index: linux-2.6.28/drivers/gpu/drm/Kconfig  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/Kconfig	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/Kconfig	2009-02-12 09:14:42.000000000 +0000 -@@ -123,3 +123,9 @@ +--- linux-2.6.28.orig/drivers/gpu/drm/Kconfig	2009-02-20 12:22:54.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/Kconfig	2009-02-20 12:23:06.000000000 +0000 +@@ -129,3 +129,10 @@   	help   	  Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister   	  chipset. If M is selected the module will be called savage. @@ -20560,12 +19491,13 @@ Index: linux-2.6.28/drivers/gpu/drm/Kconfig  +config DRM_PSB  +	tristate "Intel Poulsbo"  +	depends on DRM && PCI && I2C_ALGOBIT ++	select DRM_INTEL_COMMON  +	help  +	  Choose this option if you have an Intel Poulsbo chipset.  Index: linux-2.6.28/include/drm/drm_objects.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/include/drm/drm_objects.h	2009-02-12 09:14:42.000000000 +0000 ++++ linux-2.6.28/include/drm/drm_objects.h	2009-02-20 12:23:06.000000000 +0000  @@ -0,0 +1,717 @@  +/**************************************************************************  + * @@ -21284,32 +20216,10 @@ Index: linux-2.6.28/include/drm/drm_objects.h  +#define DRM_ASSERT_LOCKED(_mutex)  +#endif  +#endif -Index: linux-2.6.28/drivers/gpu/drm/drm_proc.c -=================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_proc.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_proc.c	2009-02-12 09:14:42.000000000 +0000 -@@ -489,13 +489,13 @@ -  - 	for (crtc = 0; crtc < dev->num_crtcs; crtc++) { - 		DRM_PROC_PRINT("CRTC %d enable:     %d\n", --			       crtc, atomic_read(&dev->vblank_refcount[crtc])); -+			       crtc, 1); - 		DRM_PROC_PRINT("CRTC %d counter:    %d\n", --			       crtc, drm_vblank_count(dev, crtc)); -+			       crtc, 1); - 		DRM_PROC_PRINT("CRTC %d last wait:  %d\n", --			       crtc, dev->last_vblank_wait[crtc]); -+			       crtc, 1); - 		DRM_PROC_PRINT("CRTC %d in modeset: %d\n", --			       crtc, dev->vblank_inmodeset[crtc]); -+			       crtc, 1); - 	} -  - 	if (len > request + offset)  Index: linux-2.6.28/drivers/gpu/drm/drm_crtc.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/drm_crtc.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/drm_crtc.c	2009-02-12 09:14:42.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/drm_crtc.c	2009-02-20 12:22:54.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/drm_crtc.c	2009-02-20 12:23:06.000000000 +0000  @@ -807,6 +807,53 @@   }   EXPORT_SYMBOL(drm_mode_config_init); @@ -21457,8 +20367,8 @@ Index: linux-2.6.28/drivers/gpu/drm/drm_crtc.c   }  Index: linux-2.6.28/include/drm/drm_crtc.h  =================================================================== ---- linux-2.6.28.orig/include/drm/drm_crtc.h	2009-02-12 09:14:40.000000000 +0000 -+++ linux-2.6.28/include/drm/drm_crtc.h	2009-02-12 09:14:42.000000000 +0000 +--- linux-2.6.28.orig/include/drm/drm_crtc.h	2009-02-20 12:22:53.000000000 +0000 ++++ linux-2.6.28/include/drm/drm_crtc.h	2009-02-20 12:23:06.000000000 +0000  @@ -50,6 +50,8 @@   	uint32_t type;   }; @@ -21478,50 +20388,10 @@ Index: linux-2.6.28/include/drm/drm_crtc.h   	struct list_head filp_head;   }; -Index: linux-2.6.28/drivers/gpu/drm/i915/intel_crt.c -=================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_crt.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/i915/intel_crt.c	2009-02-12 16:12:38.000000000 +0000 -@@ -36,7 +36,7 @@ - static void intel_crt_dpms(struct drm_encoder *encoder, int mode) - { - 	struct drm_device *dev = encoder->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	u32 temp; -  - 	temp = I915_READ(ADPA); -@@ -88,7 +88,7 @@ - 	struct drm_device *dev = encoder->dev; - 	struct drm_crtc *crtc = encoder->crtc; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	int dpll_md_reg; - 	u32 adpa, dpll_md; -  -@@ -132,7 +132,7 @@ - static bool intel_crt_detect_hotplug(struct drm_connector *connector) - { - 	struct drm_device *dev = connector->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	u32 temp; -  - 	unsigned long timeout = jiffies + msecs_to_jiffies(1000); -@@ -170,7 +170,7 @@ - { - 	struct drm_device *dev = connector->dev; -  --	if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) { -+	if (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) { - 		if (intel_crt_detect_hotplug(connector)) - 			return connector_status_connected; - 		else  Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_lvds.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c	2009-02-12 16:13:08.000000000 +0000 +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_lvds.c	2009-02-20 12:22:54.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c	2009-02-20 12:23:06.000000000 +0000  @@ -36,6 +36,259 @@   #include "i915_drm.h"   #include "i915_drv.h" @@ -21762,7 +20632,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c  +static u32  +LVDSGetPWMMaxBacklight(struct drm_device *dev)  +{ -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;  +	u32 max_pwm_blc = 0;  +  +	max_pwm_blc = ((I915_READ(BLC_PWM_CTL) & BACKLIGHT_MODULATION_FREQ_MASK) >> \ @@ -21787,7 +20657,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   static void intel_lvds_set_backlight(struct drm_device *dev, int level)   {  -	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;  +	/*   	u32 blc_pwm_ctl; @@ -21839,7 +20709,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c  -	struct drm_i915_private *dev_priv = dev->dev_private;  +	return BRIGHTNESS_MAX_LEVEL;  +	/* -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;   	return ((I915_READ(BLC_PWM_CTL) & BACKLIGHT_MODULATION_FREQ_MASK) >>   		BACKLIGHT_MODULATION_FREQ_SHIFT) * 2; @@ -21847,19 +20717,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   }   /** -@@ -67,9 +359,10 @@ -  */ - static void intel_lvds_set_power(struct drm_device *dev, bool on) - { --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	u32 pp_status; -  -+	DRM_INFO("intel_lvds_set_power: %d\n", on); - 	if (on) { - 		I915_WRITE(PP_CONTROL, I915_READ(PP_CONTROL) | - 			   POWER_TARGET_ON); -@@ -77,7 +370,7 @@ +@@ -77,7 +369,7 @@   			pp_status = I915_READ(PP_STATUS);   		} while ((pp_status & PP_ON) == 0); @@ -21868,7 +20726,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	} else {   		intel_lvds_set_backlight(dev, 0); -@@ -93,6 +386,7 @@ +@@ -93,6 +385,7 @@   {   	struct drm_device *dev = encoder->dev; @@ -21876,54 +20734,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	if (mode == DRM_MODE_DPMS_ON)   		intel_lvds_set_power(dev, true);   	else -@@ -104,12 +398,12 @@ - static void intel_lvds_save(struct drm_connector *connector) - { - 	struct drm_device *dev = connector->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; -  - 	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_DIVISOR = I915_READ(PP_DIVISOR); -+	dev_priv->savePP_CYCLE = 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); -@@ -118,19 +412,19 @@ - 	 * If the light is off at server startup, just make it full brightness - 	 */ - 	if (dev_priv->backlight_duty_cycle == 0) --		dev_priv->backlight_duty_cycle = -+		lvds_backlight= - 			intel_lvds_get_max_backlight(dev); - } -  - static void intel_lvds_restore(struct drm_connector *connector) - { - 	struct drm_device *dev = connector->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; -  - 	I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); - 	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_DIVISOR, dev_priv->savePP_CYCLE); - 	I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); - 	if (dev_priv->savePP_CONTROL & POWER_TARGET_ON) - 		intel_lvds_set_power(dev, true); -@@ -142,7 +436,7 @@ - 				 struct drm_display_mode *mode) - { - 	struct drm_device *dev = connector->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct drm_display_mode *fixed_mode = dev_priv->panel_fixed_mode; -  - 	if (fixed_mode)	{ -@@ -152,6 +446,13 @@ +@@ -152,6 +445,13 @@   			return MODE_PANEL;   	} @@ -21937,53 +20748,72 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	return MODE_OK;   } -@@ -160,7 +461,7 @@ - 				  struct drm_display_mode *adjusted_mode) - { - 	struct drm_device *dev = encoder->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); - 	struct drm_encoder *tmp_encoder; +@@ -185,20 +485,20 @@ + 	 * with the panel scaling set up to source from the H/VDisplay + 	 * of the original mode. + 	 */ +-	if (dev_priv->panel_fixed_mode != NULL) { +-		adjusted_mode->hdisplay = dev_priv->panel_fixed_mode->hdisplay; ++	if (dev_priv_common->panel_fixed_mode != NULL) { ++		adjusted_mode->hdisplay = dev_priv_common->panel_fixed_mode->hdisplay; + 		adjusted_mode->hsync_start = +-			dev_priv->panel_fixed_mode->hsync_start; ++			dev_priv_common->panel_fixed_mode->hsync_start; + 		adjusted_mode->hsync_end = +-			dev_priv->panel_fixed_mode->hsync_end; +-		adjusted_mode->htotal = dev_priv->panel_fixed_mode->htotal; +-		adjusted_mode->vdisplay = dev_priv->panel_fixed_mode->vdisplay; ++			dev_priv_common->panel_fixed_mode->hsync_end; ++		adjusted_mode->htotal = dev_priv_common->panel_fixed_mode->htotal; ++		adjusted_mode->vdisplay = dev_priv_common->panel_fixed_mode->vdisplay; + 		adjusted_mode->vsync_start = +-			dev_priv->panel_fixed_mode->vsync_start; ++			dev_priv_common->panel_fixed_mode->vsync_start; + 		adjusted_mode->vsync_end = +-			dev_priv->panel_fixed_mode->vsync_end; +-		adjusted_mode->vtotal = dev_priv->panel_fixed_mode->vtotal; +-		adjusted_mode->clock = dev_priv->panel_fixed_mode->clock; ++			dev_priv_common->panel_fixed_mode->vsync_end; ++		adjusted_mode->vtotal = dev_priv_common->panel_fixed_mode->vtotal; ++		adjusted_mode->clock = dev_priv_common->panel_fixed_mode->clock; + 		drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V); + 	} -@@ -214,7 +515,7 @@ +@@ -214,10 +514,10 @@   static void intel_lvds_prepare(struct drm_encoder *encoder)   {   	struct drm_device *dev = encoder->dev;  -	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; +  +-	dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); +-	dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL & ++	dev_priv_common->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); ++	dev_priv_common->backlight_duty_cycle = (dev_priv_common->saveBLC_PWM_CTL & + 				       BACKLIGHT_DUTY_CYCLE_MASK); - 	dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); - 	dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL & -@@ -226,10 +527,11 @@ + 	intel_lvds_set_power(dev, false); +@@ -226,10 +526,11 @@   static void intel_lvds_commit( struct drm_encoder *encoder)   {   	struct drm_device *dev = encoder->dev;  -	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; - 	if (dev_priv->backlight_duty_cycle == 0) +-	if (dev_priv->backlight_duty_cycle == 0)  -		dev_priv->backlight_duty_cycle = -+		//dev_priv->backlight_duty_cycle = ++	if (dev_priv_common->backlight_duty_cycle == 0) ++		//dev_priv_common->backlight_duty_cycle =  +		lvds_backlight =   			intel_lvds_get_max_backlight(dev);   	intel_lvds_set_power(dev, true); -@@ -240,7 +542,7 @@ - 				struct drm_display_mode *adjusted_mode) - { - 	struct drm_device *dev = encoder->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); - 	u32 pfit_control; -  -@@ -291,10 +593,12 @@ +@@ -291,10 +592,12 @@   {   	struct drm_device *dev = connector->dev;   	struct intel_output *intel_output = to_intel_output(connector);  -	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;   	int ret = 0;  +	mutex_lock(&dev->mode_config.mutex); @@ -21992,7 +20822,21 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	if (ret)   		return ret; -@@ -333,8 +637,11 @@ +@@ -308,11 +611,11 @@ + 	connector->display_info.min_hfreq = 0; + 	connector->display_info.max_hfreq = 200; +  +-	if (dev_priv->panel_fixed_mode != NULL) { ++	if (dev_priv_common->panel_fixed_mode != NULL) { + 		struct drm_display_mode *mode; +  + 		mutex_unlock(&dev->mode_config.mutex); +-		mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode); ++		mode = drm_mode_duplicate(dev, dev_priv_common->panel_fixed_mode); + 		drm_mode_probed_add(connector, mode); + 		mutex_unlock(&dev->mode_config.mutex); +  +@@ -333,8 +636,11 @@   {   	struct intel_output *intel_output = to_intel_output(connector); @@ -22004,7 +20848,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	drm_sysfs_connector_remove(connector);   	drm_connector_cleanup(connector);   	kfree(connector); -@@ -373,7 +680,45 @@ +@@ -373,7 +679,45 @@   }; @@ -22051,16 +20895,16 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   /**    * intel_lvds_init - setup LVDS connectors on this device    * @dev: drm device -@@ -383,7 +728,7 @@ +@@ -383,7 +727,7 @@    */   void intel_lvds_init(struct drm_device *dev)   {  -	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;   	struct intel_output *intel_output;   	struct drm_connector *connector;   	struct drm_encoder *encoder; -@@ -391,12 +736,38 @@ +@@ -391,12 +735,38 @@   	struct drm_crtc *crtc;   	u32 lvds;   	int pipe; @@ -22093,13 +20937,13 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   		return;   	} -+	if (!drm_intel_ignore_acpi && !intel_get_acpi_dod(ACPI_DOD)) -+		return; ++	//if (!drm_intel_ignore_acpi && !intel_get_acpi_dod(ACPI_DOD)) ++	//	return;  +   	connector = &intel_output->base;   	encoder = &intel_output->enc;   	drm_connector_init(dev, &intel_output->base, &intel_lvds_connector_funcs, -@@ -414,16 +785,139 @@ +@@ -414,16 +784,139 @@   	connector->interlace_allowed = false;   	connector->doublescan_allowed = false; @@ -22114,8 +20958,6 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c  +	lvds_backlight = BRIGHTNESS_MAX_LEVEL;  +	blc_type = 0;  +	blc_pol = 0; -+ -+	 //get the BLC init data from VBT  -	/*  -	 * LVDS discovery: @@ -22126,6 +20968,8 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c  -	 * 4) make sure lid is open  -	 *    if closed, act like it's not there for now  -	 */ ++	 //get the BLC init data from VBT ++  +  +  + @@ -22248,7 +21092,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	/* Set up the DDC bus. */   	intel_output->ddc_bus = intel_i2c_create(dev, GPIOC, "LVDSDDC_C"); -@@ -437,7 +931,9 @@ +@@ -437,12 +930,14 @@   	 * Attempt to get the fixed panel mode from DDC.  Assume that the   	 * preferred mode is the right one.   	 */ @@ -22258,7 +21102,13 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	list_for_each_entry(scan, &connector->probed_modes, head) {   		mutex_lock(&dev->mode_config.mutex); -@@ -450,21 +946,6 @@ + 		if (scan->type & DRM_MODE_TYPE_PREFERRED) { +-			dev_priv->panel_fixed_mode = ++			dev_priv_common->panel_fixed_mode = + 				drm_mode_duplicate(dev, scan); + 			mutex_unlock(&dev->mode_config.mutex); + 			goto out; /* FIXME: check for quirks */ +@@ -450,21 +945,6 @@   		mutex_unlock(&dev->mode_config.mutex);   	} @@ -22282,132 +21132,60 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_lvds.c   	 * on.  If so, assume that whatever is currently programmed is the  Index: linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_sdvo.c	2009-02-12 09:14:37.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c	2009-02-12 16:12:58.000000000 +0000 -@@ -37,6 +37,14 @@ +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_sdvo.c	2009-02-20 12:22:54.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_sdvo.c	2009-02-20 12:23:06.000000000 +0000 +@@ -37,6 +37,9 @@   #undef SDVO_DEBUG -+#define MAX_VAL 1000 -+#define DPLL_CLOCK_PHASE_9 (1<<9 | 1<<12) -+  +#define PCI_PORT5_REG80_FFUSE				0xD0058000  +#define PCI_PORT5_REG80_SDVO_DISABLE		0x0020  + -+int SII_1392=0; -+   struct intel_sdvo_priv {   	struct intel_i2c_chan *i2c_bus;   	int slaveaddr; -@@ -62,7 +70,7 @@ - static void intel_sdvo_write_sdvox(struct intel_output *intel_output, u32 val) - { - 	struct drm_device *dev = intel_output->base.dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_sdvo_priv   *sdvo_priv = intel_output->dev_priv; - 	u32 bval = val, cval = val; - 	int i; -@@ -552,7 +560,7 @@ - 				struct drm_display_mode *adjusted_mode) - { - 	struct drm_device *dev = encoder->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct drm_crtc *crtc = encoder->crtc; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	struct intel_output *intel_output = enc_to_intel_output(encoder); -@@ -659,7 +667,7 @@ - 	if (IS_I965G(dev)) { - 		/* done in crtc_mode_set as the dpll_md reg must be written - 		   early */ --	} else if (IS_I945G(dev) || IS_I945GM(dev)) { -+	} else if (IS_POULSBO(dev) || IS_I945G(dev) || IS_I945GM(dev)) { - 		/* done in crtc_mode_set as it lives inside the - 		   dpll register */ - 	} else { -@@ -672,7 +680,7 @@ - static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode) - { - 	struct drm_device *dev = encoder->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_output *intel_output = enc_to_intel_output(encoder); - 	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; - 	u32 temp; -@@ -722,7 +730,7 @@ - static void intel_sdvo_save(struct drm_connector *connector) - { - 	struct drm_device *dev = connector->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_output *intel_output = to_intel_output(connector); - 	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; - 	int o; -@@ -759,7 +767,7 @@ - static void intel_sdvo_restore(struct drm_connector *connector) - { - 	struct drm_device *dev = connector->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_output *intel_output = to_intel_output(connector); - 	struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; - 	int o; -@@ -988,6 +996,32 @@ - 	u8 ch[0x40]; +@@ -989,6 +992,21 @@   	int i;   	int encoder_type, output_id; -+	char name[DRM_CONNECTOR_LEN]; -+	char *name_prefix; -+	char *name_suffix; -+ -+	int count = 3; -+	u8 response[2]; -+	u8 status; -+	unsigned char bytes[2]; -+ -+	DRM_DEBUG("xxintel_sdvo_init\n"); -+ +   +	if (IS_POULSBO(dev)) {  +		struct pci_dev * pci_root = pci_get_bus_and_slot(0, 0);  +		u32 sku_value = 0;  +		bool sku_bSDVOEnable = true; -+		if(pci_root) -+		{ ++		if(pci_root) {  +			pci_write_config_dword(pci_root, 0xD0, PCI_PORT5_REG80_FFUSE);  +			pci_read_config_dword(pci_root, 0xD4, &sku_value);  +			sku_bSDVOEnable = (sku_value & PCI_PORT5_REG80_SDVO_DISABLE)?false : true;  +			DRM_INFO("intel_sdvo_init: sku_value is 0x%08x\n", sku_value);  +			DRM_INFO("intel_sdvo_init: sku_bSDVOEnable is %d\n", sku_bSDVOEnable);  +			if (sku_bSDVOEnable == false) -+					return false; ++				return false;  +		}  +	} -  ++   	intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL);   	if (!intel_output) { + 		return false;  Index: linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h  ===================================================================  --- /dev/null	1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h	2009-02-12 10:11:32.000000000 +0000 -@@ -0,0 +1,244 @@ ++++ linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h	2009-02-20 12:23:06.000000000 +0000 +@@ -0,0 +1,181 @@  +#include "psb_drm.h"  +#include "psb_reg.h"  +#include "psb_schedule.h" ++#include "../i915/i915_common.h"  + -+#define DRM_DRIVER_PRIVATE_T struct drm_psb_private -+#undef I915_WRITE -+#undef I915_READ -+#define I915_WRITE(_offs, _val) \ -+  iowrite32(_val, dev_priv->vdc_reg + (_offs)) -+#define I915_READ(_offs) \ -+  ioread32(dev_priv->vdc_reg + (_offs)) ++#define DRM_DRIVER_PRIVATE_T struct drm_i915_common_private  +  +struct drm_psb_uopt {  +	int clock_gating;  +};  +  +struct drm_psb_private { ++	/* common is assumed to be the first item in this structure */ ++	struct drm_i915_common_private common; ++  +	unsigned long chipset;  +        uint8_t psb_rev_id;  + @@ -22429,11 +21207,15 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h  +	uint32_t last_submitted_seq[PSB_NUM_ENGINES];  +	int engine_lockup_2d;  + ++	/** Protects user_irq_refcount and irq_mask_reg */ ++	spinlock_t user_irq_lock; ++	u32 pipestat[2]; ++  +	struct psb_mmu_driver *mmu;  +	struct psb_mmu_pd *pf_pd;  +  +	uint8_t *sgx_reg; -+	uint8_t *vdc_reg; ++	//uint8_t *vdc_reg;  +	uint8_t *msvdx_reg;  +  +	/* @@ -22504,73 +21286,8 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h  +	wait_queue_head_t rel_mapped_queue;  +  +	/* -+	 * SAREA -+	 */ -+	struct drm_psb_sarea *sarea_priv; -+ -+	/* -+	 * LVDS info -+	 */ -+	int backlight_duty_cycle;	/* restore backlight to this value */ -+	bool panel_wants_dither; -+	struct drm_display_mode *panel_fixed_mode; -+ -+	/*  +	 * Register state  +	 */ -+	uint32_t saveDSPACNTR; -+	uint32_t saveDSPBCNTR; -+	uint32_t savePIPEACONF; -+	uint32_t savePIPEBCONF; -+	uint32_t savePIPEASRC; -+	uint32_t savePIPEBSRC; -+	uint32_t saveFPA0; -+	uint32_t saveFPA1; -+	uint32_t saveDPLL_A; -+	uint32_t saveDPLL_A_MD; -+	uint32_t saveHTOTAL_A; -+	uint32_t saveHBLANK_A; -+	uint32_t saveHSYNC_A; -+	uint32_t saveVTOTAL_A; -+	uint32_t saveVBLANK_A; -+	uint32_t saveVSYNC_A; -+	uint32_t saveDSPASTRIDE; -+	uint32_t saveDSPASIZE; -+	uint32_t saveDSPAPOS; -+	uint32_t saveDSPABASE; -+	uint32_t saveDSPASURF; -+	uint32_t saveFPB0; -+	uint32_t saveFPB1; -+	uint32_t saveDPLL_B; -+	uint32_t saveDPLL_B_MD; -+	uint32_t saveHTOTAL_B; -+	uint32_t saveHBLANK_B; -+	uint32_t saveHSYNC_B; -+	uint32_t saveVTOTAL_B; -+	uint32_t saveVBLANK_B; -+	uint32_t saveVSYNC_B; -+	uint32_t saveDSPBSTRIDE; -+	uint32_t saveDSPBSIZE; -+	uint32_t saveDSPBPOS; -+	uint32_t saveDSPBBASE; -+	uint32_t saveDSPBSURF; -+	uint32_t saveVCLK_DIVISOR_VGA0; -+	uint32_t saveVCLK_DIVISOR_VGA1; -+	uint32_t saveVCLK_POST_DIV; -+	uint32_t saveVGACNTRL; -+	uint32_t saveADPA; -+	uint32_t saveLVDS; -+	uint32_t saveDVOA; -+	uint32_t saveDVOB; -+	uint32_t saveDVOC; -+	uint32_t savePP_ON; -+	uint32_t savePP_OFF; -+	uint32_t savePP_CONTROL; -+	uint32_t savePP_CYCLE; -+	uint32_t savePFIT_CONTROL; -+	uint32_t savePaletteA[256]; -+	uint32_t savePaletteB[256]; -+	uint32_t saveBLC_PWM_CTL;  +	uint32_t saveCLOCKGATING;  +  +	/* @@ -22635,76 +21352,24 @@ Index: linux-2.6.28/drivers/gpu/drm/psb/psb_priv.h  +  +extern void intel_crtc_mode_restore(struct drm_crtc *crtc);  +extern void intel_crtc_mode_save(struct drm_crtc *crtc); -Index: linux-2.6.28/drivers/gpu/drm/i915/i915_drv.h -=================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_drv.h	2009-02-12 09:47:51.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/i915/i915_drv.h	2009-02-12 10:06:18.000000000 +0000 -@@ -672,6 +672,7 @@ - 		LOCK_TEST_WITH_RETURN(dev, file_priv);			\ - } while (0) -  -+#ifndef I915_READ - #define I915_READ(reg)          readl(dev_priv->regs + (reg)) - #define I915_WRITE(reg, val)     writel(val, dev_priv->regs + (reg)) - #define I915_READ16(reg)	readw(dev_priv->regs + (reg)) -@@ -685,6 +686,7 @@ - 				 writel(upper_32_bits(val), dev_priv->regs + \ - 					(reg) + 4)) - #endif -+#endif - #define POSTING_READ(reg)	(void)I915_READ(reg) -  - #define I915_VERBOSE 0 -@@ -776,10 +778,15 @@ - 			(dev)->pci_device == 0x29D2) -  - #define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \ --		      IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev)) -+		      IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev) || \ -+		      IS_POULSBO(dev)) -+ -+#define IS_POULSBO(dev) (((dev)->pci_device == 0x8108) || \ -+			 ((dev)->pci_device == 0x8109)) -  - #define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \ --			IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev)) -+			IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev) || \ -+			IS_POULSBO(dev)) -  - #define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev)) - #define SUPPORTS_INTEGRATED_HDMI(dev)	(IS_G4X(dev))  Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c  =================================================================== ---- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_display.c	2009-02-12 09:58:47.000000000 +0000 -+++ linux-2.6.28/drivers/gpu/drm/i915/intel_display.c	2009-02-12 16:32:26.000000000 +0000 -@@ -26,9 +26,9 @@ -  - #include <linux/i2c.h> - #include "drmP.h" --#include "intel_drv.h" -+#include "../i915/intel_drv.h" - #include "i915_drm.h" --#include "i915_drv.h" -+#include "../i915/i915_drv.h" -  - #include "drm_crtc_helper.h" +--- linux-2.6.28.orig/drivers/gpu/drm/i915/intel_display.c	2009-02-20 12:22:54.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/intel_display.c	2009-02-20 12:23:06.000000000 +0000 +@@ -342,60 +342,25 @@ + 	/* Wait for 20ms, i.e. one cycle at 50hz. */ + 	udelay(20000); + } ++EXPORT_SYMBOL(intel_wait_for_vblank); -@@ -282,7 +282,7 @@ - 				int refclk, intel_clock_t *best_clock) - { - 	struct drm_device *dev = crtc->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	intel_clock_t clock; - 	const intel_limit_t *limit = intel_limit(crtc); - 	int err = target; -@@ -348,12 +348,8 @@ + static void + intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,   		    struct drm_framebuffer *old_fb)   {   	struct drm_device *dev = crtc->dev;  -	struct drm_i915_private *dev_priv = dev->dev_private; --	struct drm_i915_master_private *master_priv; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; + 	struct drm_i915_master_private *master_priv; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;   	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);  -	struct intel_framebuffer *intel_fb;  -	struct drm_i915_gem_object *obj_priv; @@ -22712,10 +21377,11 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   	int pipe = intel_crtc->pipe;   	unsigned long Start, Offset;   	int dspbase = (pipe == 0 ? DSPAADDR : DSPBADDR); -@@ -362,66 +358,8 @@ + 	int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF); + 	int dspstride = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE;   	int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR; - 	u32 dspcntr, alignment; -  +-	u32 dspcntr, alignment; +-  -	/* no fb bound */  -	if (!crtc->fb) {  -		DRM_DEBUG("No FB bound\n"); @@ -22743,45 +21409,19 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c  -	default:  -		BUG();  -	} -- ++	u32 dspcntr; +   -	if (i915_gem_object_pin(intel_fb->obj, alignment))  -		return;  -  -	i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1);  -  -	Start = obj_priv->gtt_offset; --	Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8); -- --	I915_WRITE(dspstride, crtc->fb->pitch); -- --	dspcntr = I915_READ(dspcntr_reg); --	/* Mask out pixel format bits in case we change it */ --	dspcntr &= ~DISPPLANE_PIXFORMAT_MASK; --	switch (crtc->fb->bits_per_pixel) { --	case 8: --		dspcntr |= DISPPLANE_8BPP; --		break; --	case 16: --		if (crtc->fb->depth == 15) --			dspcntr |= DISPPLANE_15_16BPP; --		else --			dspcntr |= DISPPLANE_16BPP; --		break; --	case 24: --	case 32: --		dspcntr |= DISPPLANE_32BPP_NO_ALPHA; --		break; --	default: --		DRM_ERROR("Unknown color depth\n"); --		return; --	} --	I915_WRITE(dspcntr_reg, dspcntr);  +	Start = crtc->fb->offset; -+	Offset = y * crtc->fb->pitch + x; + 	Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8); - 	DRM_DEBUG("Writing base %08lX %08lX %d %d\n", Start, Offset, x, y); - 	if (IS_I965G(dev)) { -@@ -434,28 +372,18 @@ + 	I915_WRITE(dspstride, crtc->fb->pitch); +@@ -434,13 +399,6 @@   		I915_READ(dspbase);   	} @@ -22792,69 +21432,10 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c  -		i915_gem_object_unpin(intel_fb->obj);  -	}  - --	if (!dev->primary->master) --		return; -  --	master_priv = dev->primary->master->driver_priv; --	if (!master_priv->sarea_priv) -+	if (!dev_priv->sarea_priv) + 	if (!dev->primary->master)   		return; - 	switch (pipe) { - 	case 0: --		master_priv->sarea_priv->pipeA_x = x; --		master_priv->sarea_priv->pipeA_y = y; -+		dev_priv->sarea_priv->pipeA_x = x; -+		dev_priv->sarea_priv->pipeA_y = y; - 		break; - 	case 1: --		master_priv->sarea_priv->pipeB_x = x; --		master_priv->sarea_priv->pipeB_y = y; -+		dev_priv->sarea_priv->pipeB_x = x; -+		dev_priv->sarea_priv->pipeB_y = y; - 		break; - 	default: - 		DRM_ERROR("Can't update pipe %d in SAREA\n", pipe); -@@ -474,8 +402,7 @@ - static void intel_crtc_dpms(struct drm_crtc *crtc, int mode) - { - 	struct drm_device *dev = crtc->dev; --	struct drm_i915_master_private *master_priv; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	int pipe = intel_crtc->pipe; - 	int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; -@@ -569,23 +496,20 @@ - 		break; - 	} -  --	if (!dev->primary->master) --		return; -  --	master_priv = dev->primary->master->driver_priv; --	if (!master_priv->sarea_priv) -+	if (!dev_priv->sarea_priv) - 		return; -  - 	enabled = crtc->enabled && mode != DRM_MODE_DPMS_OFF; -  - 	switch (pipe) { - 	case 0: --		master_priv->sarea_priv->pipeA_w = enabled ? crtc->mode.hdisplay : 0; --		master_priv->sarea_priv->pipeA_h = enabled ? crtc->mode.vdisplay : 0; -+		dev_priv->sarea_priv->pipeA_w = enabled ? crtc->mode.hdisplay : 0; -+		dev_priv->sarea_priv->pipeA_h = enabled ? crtc->mode.vdisplay : 0; - 		break; - 	case 1: --		master_priv->sarea_priv->pipeB_w = enabled ? crtc->mode.hdisplay : 0; --		master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0; -+		dev_priv->sarea_priv->pipeB_w = enabled ? crtc->mode.hdisplay : 0; -+		dev_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0; - 		break; - 	default: - 		DRM_ERROR("Can't update pipe %d in SAREA\n", pipe); -@@ -640,7 +564,7 @@ +@@ -642,7 +600,7 @@   		return 400000;   	else if (IS_I915G(dev))   		return 333000; @@ -22863,274 +21444,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   		return 200000;   	else if (IS_I915GM(dev)) {   		u16 gcfgc = 0; -@@ -687,7 +611,7 @@ -  */ - static int intel_panel_fitter_pipe (struct drm_device *dev) - { --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	u32  pfit_control; -  - 	/* i830 doesn't have a panel fitter */ -@@ -707,7 +631,228 @@ - 	/* older chips can only use pipe 1 */ - 	return 1; - } -+#if 0 -+#define WA_NO_FB_GARBAGE_DISPLAY -+#ifdef WA_NO_FB_GARBAGE_DISPLAY -+static u32 fp_reg_value[2]; -+static u32 dpll_reg_value[2]; -+static u32 dpll_md_reg_value[2]; -+static u32 dspcntr_reg_value[2]; -+static u32 pipeconf_reg_value[2]; -+static u32 htot_reg_value[2]; -+static u32 hblank_reg_value[2]; -+static u32 hsync_reg_value[2]; -+static u32 vtot_reg_value[2]; -+static u32 vblank_reg_value[2]; -+static u32 vsync_reg_value[2]; -+static u32 dspsize_reg_value[2]; -+static u32 dspstride_reg_value[2]; -+static u32 dsppos_reg_value[2]; -+static u32 pipesrc_reg_value[2]; -+ -+static u32 dspbase_value[2]; -+ -+static u32 lvds_reg_value[2]; -+static u32 vgacntrl_reg_value[2]; -+static u32 pfit_control_reg_value[2]; -+ -+ -+void intel_crtc_mode_restore(struct drm_crtc *crtc) -+{ -+	struct drm_device *dev = crtc->dev; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; -+	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); -+	int pipe = intel_crtc->pipe; -+	int fp_reg = (pipe == 0) ? FPA0 : FPB0; -+	int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; -+	int dpll_md_reg = (intel_crtc->pipe == 0) ? DPLL_A_MD : DPLL_B_MD; -+	int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR; -+	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; -+	int htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; -+	int hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; -+	int hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; -+	int vtot_reg = (pipe == 0) ? VTOTAL_A : VTOTAL_B; -+	int vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B; -+	int vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B; -+	int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE; -+	int dspstride_reg = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE; -+	int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS; -+	int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC; -+	int dspbase = (pipe == 0 ? DSPAADDR : DSPBADDR); -+ -+	bool ok, is_sdvo = false, is_dvo = false; -+	bool is_crt = false, is_lvds = false, is_tv = false; -+	struct drm_mode_config *mode_config = &dev->mode_config; -+	struct drm_connector *output; -+ -+	list_for_each_entry(output, &mode_config->connector_list, head) { -+		struct intel_output *intel_output = to_intel_output(crtc); -+ -+		if (output->crtc != crtc) -+			continue; -+ -+		switch (intel_output->type) { -+		case INTEL_OUTPUT_LVDS: -+			is_lvds = TRUE; -+			break; -+		case INTEL_OUTPUT_SDVO: -+			is_sdvo = TRUE; -+			break; -+		case INTEL_OUTPUT_DVO: -+			is_dvo = TRUE; -+			break; -+		case INTEL_OUTPUT_TVOUT: -+			is_tv = TRUE; -+			break; -+		case INTEL_OUTPUT_ANALOG: -+			is_crt = TRUE; -+			break; -+		} -+		if(is_lvds && ((lvds_reg_value[pipe] & LVDS_PORT_EN) == 0)) -+		{ -+			printk("%s: is_lvds but not the boot display, so return\n", -+							__FUNCTION__); -+			return; -+		} -+		output->funcs->prepare(output); -+	} -+ -+	intel_crtc_prepare(crtc); -+	/* Disable the panel fitter if it was on our pipe */ -+	if (intel_panel_fitter_pipe(dev) == pipe) -+		I915_WRITE(PFIT_CONTROL, 0); -  -+	if (dpll_reg_value[pipe] & DPLL_VCO_ENABLE) { -+		I915_WRITE(fp_reg, fp_reg_value[pipe]); -+		I915_WRITE(dpll_reg, dpll_reg_value[pipe]& ~DPLL_VCO_ENABLE); -+		I915_READ(dpll_reg); -+		udelay(150); -+	} -+ -+	/* -+	if(is_lvds) -+		I915_WRITE(LVDS, lvds_reg_value[pipe]); -+	*/ -+	if (is_lvds) { -+		I915_WRITE(LVDS, lvds_reg_value[pipe]); -+		I915_READ(LVDS); -+	} -+ -+	I915_WRITE(fp_reg, fp_reg_value[pipe]); -+	I915_WRITE(dpll_reg, dpll_reg_value[pipe]); -+	I915_READ(dpll_reg); -+	udelay(150); -+	//I915_WRITE(dpll_md_reg, dpll_md_reg_value[pipe]); -+	I915_WRITE(dpll_reg, dpll_reg_value[pipe]); -+	I915_READ(dpll_reg); -+	udelay(150); -+	I915_WRITE(htot_reg, htot_reg_value[pipe]); -+	I915_WRITE(hblank_reg, hblank_reg_value[pipe]); -+	I915_WRITE(hsync_reg, hsync_reg_value[pipe]); -+	I915_WRITE(vtot_reg, vtot_reg_value[pipe]); -+	I915_WRITE(vblank_reg, vblank_reg_value[pipe]); -+	I915_WRITE(vsync_reg, vsync_reg_value[pipe]); -+	I915_WRITE(dspstride_reg, dspstride_reg_value[pipe]); -+	I915_WRITE(dspsize_reg, dspsize_reg_value[pipe]); -+	I915_WRITE(dsppos_reg, dsppos_reg_value[pipe]); -+	I915_WRITE(pipesrc_reg, pipesrc_reg_value[pipe]); -+	I915_WRITE(pipeconf_reg, pipeconf_reg_value[pipe]); -+	I915_READ(pipeconf_reg); -+	intel_wait_for_vblank(dev); -+	I915_WRITE(dspcntr_reg, dspcntr_reg_value[pipe]); -+	I915_WRITE(dspbase, dspbase_value[pipe]); -+	I915_READ(dspbase); -+	I915_WRITE(VGACNTRL, vgacntrl_reg_value[pipe]); -+	intel_wait_for_vblank(dev); -+	I915_WRITE(PFIT_CONTROL, pfit_control_reg_value[pipe]); -+ -+	intel_crtc_commit(crtc); -+	list_for_each_entry(output, &mode_config->connector_list, head) { -+		if (output->crtc != crtc) -+			continue; -+ -+		output->funcs->commit(output); -+		//output->funcs->dpms(output, DRM_MODE_DPMS_OFF); -+		//printk("turn off the display first\n"); -+	} -+	return; -+} -+ -+void intel_crtc_mode_save(struct drm_crtc *crtc) -+{ -+	struct drm_device *dev = crtc->dev; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; -+	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); -+	int pipe = intel_crtc->pipe; -+	int fp_reg = (pipe == 0) ? FPA0 : FPB0; -+	int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; -+	int dpll_md_reg = (intel_crtc->pipe == 0) ? DPLL_A_MD : DPLL_B_MD; -+	int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR; -+	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; -+	int htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; -+	int hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; -+	int hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; -+	int vtot_reg = (pipe == 0) ? VTOTAL_A : VTOTAL_B; -+	int vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B; -+	int vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B; -+	int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE; -+	int dspstride_reg = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE; -+	int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS; -+	int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC; -+	int dspbase = (pipe == 0 ? DSPAADDR : DSPBADDR); -+	bool ok, is_sdvo = false, is_dvo = false; -+	bool is_crt = false, is_lvds = false, is_tv = false; -+	struct drm_mode_config *mode_config = &dev->mode_config; -+	struct drm_connector *output; -+ -+	list_for_each_entry(output, &mode_config->connector_list, head) { -+		struct intel_output *intel_output = to_intel_output(crtc); -+ -+		if (output->crtc != crtc) -+			continue; -+ -+		switch (intel_output->type) { -+		case INTEL_OUTPUT_LVDS: -+			is_lvds = TRUE; -+			break; -+		case INTEL_OUTPUT_SDVO: -+			is_sdvo = TRUE; -+			break; -+		case INTEL_OUTPUT_DVO: -+			is_dvo = TRUE; -+			break; -+		case INTEL_OUTPUT_TVOUT: -+			is_tv = TRUE; -+			break; -+		case INTEL_OUTPUT_ANALOG: -+			is_crt = TRUE; -+			break; -+		} -+	} -+ -+	fp_reg_value[pipe] = I915_READ(fp_reg); -+	dpll_reg_value[pipe] = I915_READ(dpll_reg); -+	dpll_md_reg_value[pipe] = I915_READ(dpll_md_reg); -+	dspcntr_reg_value[pipe] = I915_READ(dspcntr_reg); -+	pipeconf_reg_value[pipe] = I915_READ(pipeconf_reg); -+	htot_reg_value[pipe] = I915_READ(htot_reg); -+	hblank_reg_value[pipe] = I915_READ(hblank_reg); -+	hsync_reg_value[pipe] = I915_READ(hsync_reg); -+	vtot_reg_value[pipe] = I915_READ(vtot_reg); -+	vblank_reg_value[pipe] = I915_READ(vblank_reg); -+	vsync_reg_value[pipe] = I915_READ(vsync_reg); -+	dspsize_reg_value[pipe] = I915_READ(dspsize_reg); -+	dspstride_reg_value[pipe] = I915_READ(dspstride_reg); -+	dsppos_reg_value[pipe] = I915_READ(dsppos_reg); -+	pipesrc_reg_value[pipe] = I915_READ(pipesrc_reg); -+	dspbase_value[pipe] = I915_READ(dspbase); -+	if(is_lvds) -+		lvds_reg_value[pipe] = I915_READ(LVDS); -+	vgacntrl_reg_value[pipe] = I915_READ(VGACNTRL); -+	pfit_control_reg_value[pipe] = I915_READ(PFIT_CONTROL); -+} -+#endif -+#endif - static void intel_crtc_mode_set(struct drm_crtc *crtc, - 				struct drm_display_mode *mode, - 				struct drm_display_mode *adjusted_mode, -@@ -715,7 +860,7 @@ - 				struct drm_framebuffer *old_fb) - { - 	struct drm_device *dev = crtc->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	int pipe = intel_crtc->pipe; - 	int fp_reg = (pipe == 0) ? FPA0 : FPB0; -@@ -730,6 +875,7 @@ - 	int vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B; - 	int vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B; - 	int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE; -+	int dspstride_reg = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE; - 	int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS; - 	int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC; - 	int refclk; -@@ -740,7 +886,10 @@ - 	struct drm_mode_config *mode_config = &dev->mode_config; - 	struct drm_connector *connector; -  --	drm_vblank_pre_modeset(dev, pipe); -+	if (!crtc->fb) { -+		DRM_ERROR("Can't set mode without attached fb\n"); -+		return; -+	} -  - 	list_for_each_entry(connector, &mode_config->connector_list, head) { - 		struct intel_output *intel_output = to_intel_output(connector); -@@ -784,13 +933,15 @@ +@@ -786,13 +744,15 @@   	dpll = DPLL_VGA_MODE_DIS;   	if (IS_I9XX(dev)) { @@ -23149,67 +21463,16 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   				int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;   				dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES;   			} -@@ -841,6 +992,25 @@ - 	/* Set up the display plane register */ - 	dspcntr = DISPPLANE_GAMMA_ENABLE; -  -+	switch (crtc->fb->bits_per_pixel) { -+	case 8: -+		dspcntr |= DISPPLANE_8BPP; -+		break; -+	case 16: -+		if (crtc->fb->depth == 15) -+			dspcntr |= DISPPLANE_15_16BPP; -+		else -+			dspcntr |= DISPPLANE_16BPP; -+		break; -+	case 32: -+		dspcntr |= DISPPLANE_32BPP_NO_ALPHA; -+		break; -+	default: -+		DRM_ERROR("Unknown color depth\n"); -+		return; -+	} -+ -+ - 	if (pipe == 0) - 		dspcntr |= DISPPLANE_SEL_PIPE_A; - 	else -@@ -934,6 +1104,7 @@ - 		   ((adjusted_mode->crtc_vblank_end - 1) << 16)); - 	I915_WRITE(vsync_reg, (adjusted_mode->crtc_vsync_start - 1) | - 		   ((adjusted_mode->crtc_vsync_end - 1) << 16)); -+	I915_WRITE(dspstride_reg, crtc->fb->pitch); - 	/* pipesrc and dspsize control the size that is scaled from, which should - 	 * always be the user's requested size. - 	 */ -@@ -950,14 +1121,14 @@ - 	/* Flush the plane changes */ - 	intel_pipe_set_base(crtc, x, y, old_fb); -  --	drm_vblank_post_modeset(dev, pipe); -+	intel_wait_for_vblank(dev); - } -  - /** Loads the palette/gamma unit for the CRTC with the prepared values */ +@@ -959,7 +919,7 @@   void intel_crtc_load_lut(struct drm_crtc *crtc)   {   	struct drm_device *dev = crtc->dev;  -	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private;   	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);   	int palreg = (intel_crtc->pipe == 0) ? PALETTE_A : PALETTE_B;   	int i; -@@ -980,7 +1151,7 @@ - 				 uint32_t width, uint32_t height) - { - 	struct drm_device *dev = crtc->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	struct drm_gem_object *bo; - 	struct drm_i915_gem_object *obj_priv; -@@ -1019,7 +1190,7 @@ +@@ -1021,7 +981,7 @@   		ret = -ENOMEM;   		goto fail;   	} @@ -23218,7 +21481,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   	/* we only need to pin inside GTT if cursor is non-phy */   	if (!dev_priv->cursor_needs_physical) {   		ret = i915_gem_object_pin(bo, PAGE_SIZE); -@@ -1036,7 +1207,7 @@ +@@ -1038,7 +998,7 @@   		}   		addr = obj_priv->phys_obj->handle->busaddr;   	} @@ -23227,7 +21490,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   	temp = 0;   	/* set the pipe for the cursor */   	temp |= (pipe << 28); -@@ -1047,6 +1218,7 @@ +@@ -1049,6 +1009,7 @@   	I915_WRITE(base, addr);   	if (intel_crtc->cursor_bo) { @@ -23235,7 +21498,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   		if (dev_priv->cursor_needs_physical) {   			if (intel_crtc->cursor_bo != bo)   				i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo); -@@ -1055,6 +1227,7 @@ +@@ -1057,6 +1018,7 @@   		mutex_lock(&dev->struct_mutex);   		drm_gem_object_unreference(intel_crtc->cursor_bo);   		mutex_unlock(&dev->struct_mutex); @@ -23243,54 +21506,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   	}   	intel_crtc->cursor_addr = addr; -@@ -1071,7 +1244,7 @@ - static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) - { - 	struct drm_device *dev = crtc->dev; --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	int pipe = intel_crtc->pipe; - 	uint32_t temp = 0; -@@ -1255,7 +1428,7 @@ - /* Returns the clock of the currently programmed mode of the given pipe. */ - static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc) - { --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	int pipe = intel_crtc->pipe; - 	u32 dpll = I915_READ((pipe == 0) ? DPLL_A : DPLL_B); -@@ -1333,7 +1506,7 @@ - struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, - 					     struct drm_crtc *crtc) - { --	struct drm_i915_private *dev_priv = dev->dev_private; -+	DRM_DRIVER_PRIVATE_T *dev_priv = dev->dev_private; - 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - 	int pipe = intel_crtc->pipe; - 	struct drm_display_mode *mode; -@@ -1399,7 +1572,6 @@ -  - 	drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs); -  --	drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); - 	intel_crtc->pipe = pipe; - 	for (i = 0; i < 256; i++) { - 		intel_crtc->lut_r[i] = i; -@@ -1415,11 +1587,6 @@ - 	intel_crtc->mode_set.connectors = (struct drm_connector **)(intel_crtc + 1); - 	intel_crtc->mode_set.num_connectors = 0; -  --	if (i915_fbpercrtc) { -- -- -- --	} - } -  - struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe) -@@ -1454,27 +1621,17 @@ +@@ -1456,7 +1418,8 @@   {   	struct drm_connector *connector; @@ -23300,30 +21516,21 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   	/* Set up integrated LVDS */   	if (IS_MOBILE(dev) && !IS_I830(dev)) - 		intel_lvds_init(dev); -  - 	if (IS_I9XX(dev)) { --		int found; -- --		found = intel_sdvo_init(dev, SDVOB); --		if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) --			intel_hdmi_init(dev, SDVOB); -- --		found = intel_sdvo_init(dev, SDVOC); --		if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) --			intel_hdmi_init(dev, SDVOC); +@@ -1472,12 +1435,9 @@ + 		found = intel_sdvo_init(dev, SDVOC); + 		if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) + 			intel_hdmi_init(dev, SDVOC);  -	} else --		intel_dvo_init(dev); -- ++	} else  + 		intel_dvo_init(dev); +   -	if (IS_I9XX(dev) && IS_MOBILE(dev))  -		intel_tv_init(dev); -+		intel_sdvo_init(dev, SDVOB); -+		intel_sdvo_init(dev, SDVOC); -+	} -  +-   	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {   		struct intel_output *intel_output = to_intel_output(connector); -@@ -1523,8 +1680,8 @@ + 		struct drm_encoder *encoder = &intel_output->enc; +@@ -1525,8 +1485,8 @@   	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);   	struct drm_device *dev = fb->dev; @@ -23334,7 +21541,7 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   	drm_framebuffer_cleanup(fb);   	mutex_lock(&dev->struct_mutex); -@@ -1601,7 +1758,7 @@ +@@ -1603,7 +1563,7 @@   static const struct drm_mode_config_funcs intel_mode_funcs = {   	.fb_create = intel_user_framebuffer_create, @@ -23343,19 +21550,15 @@ Index: linux-2.6.28/drivers/gpu/drm/i915/intel_display.c   };   void intel_modeset_init(struct drm_device *dev) -@@ -1616,13 +1773,8 @@ -  - 	dev->mode_config.funcs = (void *)&intel_mode_funcs; +Index: linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c +=================================================================== +--- linux-2.6.28.orig/drivers/gpu/drm/i915/i915_irq.c	2009-02-20 12:22:54.000000000 +0000 ++++ linux-2.6.28/drivers/gpu/drm/i915/i915_irq.c	2009-02-20 12:23:06.000000000 +0000 +@@ -536,6 +536,7 @@ --	if (IS_I965G(dev)) { --		dev->mode_config.max_width = 8192; --		dev->mode_config.max_height = 8192; --	} else { --		dev->mode_config.max_width = 2048; --		dev->mode_config.max_height = 2048; --	} -+	dev->mode_config.max_width = 2048; -+	dev->mode_config.max_height = 2048; + int i915_driver_irq_postinstall(struct drm_device *dev) + { ++	struct drm_i915_common_private *dev_priv_common = dev->dev_private; + 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; - 	/* set memory base */ - 	if (IS_I9XX(dev)) + 	dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; diff --git a/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb b/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb index 6ab0c8deee..bb807b3652 100644 --- a/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb +++ b/meta-moblin/packages/linux/linux-moblin_2.6.28+2.6.29-rc2.bb @@ -19,6 +19,6 @@ SRC_URI = "${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2 \             file://defconfig-menlow \             file://defconfig-netbook" -SRC_URI_append_menlow = " file://psb-driver.patch;patch=1" +SRC_URI_append_menlow = " file://i915_split.patch;patch=1 file://psb-driver.patch;patch=1"  S = "${WORKDIR}/linux-2.6.28" | 
