set the base address of the CRTC correctly
authorDavid Airlie <airlied@asimov.stargames.com.au>
Tue, 10 Apr 2007 05:20:50 +0000 (15:20 +1000)
committerDavid Airlie <airlied@asimov.stargames.com.au>
Tue, 10 Apr 2007 05:20:50 +0000 (15:20 +1000)
linux-core/intel_display.c
shared-core/i915_dma.c
shared-core/i915_drv.h

index fce0faf..92b3940 100644 (file)
@@ -351,9 +351,10 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y)
        int dspbase = (pipe == 0 ? DSPABASE : DSPBBASE);
        int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF);
        
-       Start = crtc->fb->offset;
+       Start = crtc->fb->offset + dev_priv->baseaddr;
        Offset = ((y * crtc->fb->width + x) * (crtc->fb->bits_per_pixel / 8));
 
+       DRM_DEBUG("Writing base %08X %08X %d %d\n", Start, Offset, x, y);
        if (IS_I965G(dev)) {
                I915_WRITE(dspbase, Offset);
                I915_READ(dspbase);
index 2c14cb5..c2a6d86 100644 (file)
@@ -877,11 +877,13 @@ int i915_driver_load(drm_device_t *dev, unsigned long flags)
        if (IS_I9XX(dev)) {
                dev_priv->mmiobase = drm_get_resource_start(dev, 0);
                dev_priv->mmiolen = drm_get_resource_len(dev, 0);
+               dev_priv->baseaddr = drm_get_resource_start(dev, 2) & 0xff000000;
        } else if (drm_get_resource_start(dev, 1)) {
                dev_priv->mmiobase = drm_get_resource_start(dev, 1);
                dev_priv->mmiolen = drm_get_resource_len(dev, 1);
+               dev_priv->baseaddr = drm_get_resource_start(dev, 0) & 0xff000000;
        } else {
-               DRM_ERROR("Unable to find MMIO registers\n");
+               DRM_ERROR("Unable to find MMIO registers or FB\n");
                return -ENODEV;
        }
 
index f37f587..517d0bf 100644 (file)
@@ -92,6 +92,7 @@ typedef struct drm_i915_private {
        drm_local_map_t *sarea;
        drm_local_map_t *mmio_map;
 
+       unsigned long baseaddr;
        unsigned long mmiobase;
        unsigned long mmiolen;