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 /* 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