Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm into modesetting-101
authorAlan Hourihane <alanh@fairlite.demon.co.uk>
Fri, 29 Jun 2007 19:09:44 +0000 (20:09 +0100)
committerAlan Hourihane <alanh@fairlite.demon.co.uk>
Fri, 29 Jun 2007 19:09:44 +0000 (20:09 +0100)
Conflicts:

linux-core/drm_drv.c
linux-core/drm_fops.c
linux-core/drm_objects.h
linux-core/drm_stub.c
shared-core/i915_dma.c

15 files changed:
1  2 
linux-core/Makefile.kernel
linux-core/drmP.h
linux-core/drm_bo.c
linux-core/drm_bo_move.c
linux-core/drm_bufs.c
linux-core/drm_compat.h
linux-core/drm_drv.c
linux-core/drm_fops.c
linux-core/drm_objects.h
linux-core/drm_stub.c
linux-core/i915_drv.c
shared-core/i915_dma.c
shared-core/i915_drv.h
shared-core/i915_init.c
shared-core/i915_irq.c

@@@ -20,15 -19,15 +20,16 @@@ r128-objs   := r128_drv.o r128_cce.o r1
  mga-objs    := mga_drv.o mga_dma.o mga_state.o mga_warp.o mga_irq.o
  i810-objs   := i810_drv.o i810_dma.o
  i915-objs   := i915_drv.o i915_dma.o i915_irq.o i915_mem.o i915_fence.o \
 -              i915_buffer.o
 +              i915_buffer.o intel_display.o intel_crt.o intel_lvds.o \
 +              intel_sdvo.o intel_modes.o intel_i2c.o i915_init.o intel_fb.o
  nouveau-objs := nouveau_drv.o nouveau_state.o nouveau_fifo.o nouveau_mem.o \
-               nouveau_object.o nouveau_irq.o \
+               nouveau_object.o nouveau_irq.o nouveau_notifier.o \
                nv04_timer.o \
-               nv04_mc.o nv40_mc.o \
+               nv04_mc.o nv40_mc.o nv50_mc.o \
                nv04_fb.o nv10_fb.o nv40_fb.o \
+               nv04_fifo.o nv10_fifo.o nv40_fifo.o nv50_fifo.o \
                nv04_graph.o nv10_graph.o nv20_graph.o nv30_graph.o \
-               nv40_graph.o
+               nv40_graph.o nv50_graph.o
  radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o
  sis-objs    := sis_drv.o sis_mm.o
  ffb-objs    := ffb_drv.o ffb_context.o
@@@ -834,14 -824,8 +832,11 @@@ typedef struct drm_device 
        /** \name Drawable information */
        /*@{ */
        spinlock_t drw_lock;
-       unsigned int drw_bitfield_length;
-       u32 *drw_bitfield;
-       unsigned int drw_info_length;
-       drm_drawable_info_t **drw_info;
+       struct idr drw_idr;
        /*@} */
 +
 +      /* DRM mode setting */
 +      struct drm_mode_config mode_config;
  } drm_device_t;
  
  #if __OS_HAS_AGP
@@@ -488,13 -493,17 +493,18 @@@ static void drm_bo_delayed_workqueue(st
        mutex_unlock(&dev->struct_mutex);
  }
  
- void drm_bo_usage_deref_locked(drm_buffer_object_t * bo)
+ void drm_bo_usage_deref_locked(drm_buffer_object_t ** bo)
  {
-       if (atomic_dec_and_test(&bo->usage)) {
-               drm_bo_destroy_locked(bo);
+         struct drm_buffer_object *tmp_bo = *bo;
+       bo = NULL;
+       DRM_ASSERT_LOCKED(&tmp_bo->dev->struct_mutex);
+       if (atomic_dec_and_test(&tmp_bo->usage)) {
+               drm_bo_destroy_locked(tmp_bo);
        }
  }
 +EXPORT_SYMBOL(drm_bo_usage_deref_locked);
  
  static void drm_bo_base_deref_locked(drm_file_t * priv, drm_user_object_t * uo)
  {
@@@ -1622,10 -1640,9 +1641,10 @@@ int drm_buffer_object_create(drm_device
        out_err:
        mutex_unlock(&bo->mutex);
  
-       drm_bo_usage_deref_unlocked(bo);
+       drm_bo_usage_deref_unlocked(&bo);
        return ret;
  }
 +EXPORT_SYMBOL(drm_buffer_object_create);
  
  static int drm_bo_add_user_object(drm_file_t * priv, drm_buffer_object_t * bo,
                                  int shareable)
Simple merge
@@@ -51,13 -51,11 +51,11 @@@ EXPORT_SYMBOL(drm_get_resource_len)
  static drm_map_list_t *drm_find_matching_map(drm_device_t *dev,
                                              drm_local_map_t *map)
  {
-       struct list_head *list;
-       list_for_each(list, &dev->maplist->head) {
-               drm_map_list_t *entry = list_entry(list, drm_map_list_t, head);
+       drm_map_list_t *entry;
+       list_for_each_entry(entry, &dev->maplist, head) {
                if (entry->map && map->type == entry->map->type &&
                    ((entry->map->offset == map->offset) || 
 -                   (map->type == _DRM_SHM && map->flags==_DRM_CONTAINS_LOCK))) {
 +                   ((map->type == _DRM_SHM) && (map->flags&_DRM_CONTAINS_LOCK)))) {
                        return entry;
                }
        }
Simple merge
@@@ -397,19 -377,8 +388,9 @@@ static void drm_cleanup(drm_device_t * 
                drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
                dev->agp = NULL;
        }
 -      if (dev->driver->unload)
 -              dev->driver->unload(dev);
 +
-         //    drm_bo_driver_finish(dev);
-       if (dev->maplist) {
-               drm_free(dev->maplist, sizeof(*dev->maplist), DRM_MEM_MAPS);
-               dev->maplist = NULL;
-               drm_ht_remove(&dev->map_hash);
-               drm_mm_takedown(&dev->offset_manager);
-               drm_ht_remove(&dev->object_hash);
-       }
 +      if (!drm_fb_loaded)
 +              pci_disable_device(dev->pdev);
  
        drm_put_head(&dev->primary);
        if (drm_put_dev(dev))
@@@ -268,9 -261,9 +261,10 @@@ static int drm_open_helper(struct inod
        priv->authenticated = capable(CAP_SYS_ADMIN);
        priv->lock_count = 0;
  
+       INIT_LIST_HEAD(&priv->lhead);
        INIT_LIST_HEAD(&priv->user_objects);
        INIT_LIST_HEAD(&priv->refd_objects);
 +      INIT_LIST_HEAD(&priv->fbs);
  
        for (i=0; i<_DRM_NO_REF_TYPES; ++i) {
                ret = drm_ht_create(&priv->refd_object_hash[i], DRM_FILE_HASH_ORDER);
@@@ -502,25 -486,14 +487,15 @@@ int drm_release(struct inode *inode, st
        mutex_unlock(&dev->ctxlist_mutex);
  
        mutex_lock(&dev->struct_mutex);
 +      drm_fb_release(filp);
        drm_object_release(filp);
        if (priv->remove_auth_on_close == 1) {
-               drm_file_t *temp = dev->file_first;
-               while (temp) {
+               drm_file_t *temp;
+               list_for_each_entry(temp, &dev->filelist, lhead)
                        temp->authenticated = 0;
-                       temp = temp->next;
-               }
-       }
-       if (priv->prev) {
-               priv->prev->next = priv->next;
-       } else {
-               dev->file_first = priv->next;
-       }
-       if (priv->next) {
-               priv->next->prev = priv->prev;
-       } else {
-               dev->file_last = priv->prev;
        }
+       list_del(&priv->lhead);
        mutex_unlock(&dev->struct_mutex);
  
        if (dev->driver->postclose)
@@@ -478,9 -472,12 +479,16 @@@ extern int drm_bo_move_accel_cleanup(dr
                                     uint32_t fence_flags,
                                     drm_bo_mem_reg_t * new_mem);
  
 +extern int drm_mem_reg_ioremap(struct drm_device *dev, drm_bo_mem_reg_t * mem,
 +                             void **virtual);
 +extern void drm_mem_reg_iounmap(struct drm_device *dev, drm_bo_mem_reg_t * mem,
 +                              void *virtual);
+ #ifdef CONFIG_DEBUG_MUTEXES
+ #define DRM_ASSERT_LOCKED(_mutex)                                     \
+       BUG_ON(!mutex_is_locked(_mutex) ||                              \
+              ((_mutex)->owner != current_thread_info()))
+ #else
+ #define DRM_ASSERT_LOCKED(_mutex)
+ #endif
  
  #endif
Simple merge
Simple merge
@@@ -88,9 -98,30 +87,6 @@@ static int i915_dma_cleanup(drm_device_
        if (dev->irq)
                drm_irq_uninstall(dev);
  
 -      if (dev->dev_private) {
 -              drm_i915_private_t *dev_priv =
 -                  (drm_i915_private_t *) dev->dev_private;
 -
 -              if (dev_priv->ring.virtual_start) {
 -                      drm_core_ioremapfree(&dev_priv->ring.map, dev);
 -              }
 -
 -              if (dev_priv->status_page_dmah) {
 -                      drm_pci_free(dev, dev_priv->status_page_dmah);
 -                      /* Need to rewrite hardware status page */
 -                      I915_WRITE(0x02080, 0x1ffff000);
 -              }
 -              if (dev_priv->status_gfx_addr) {
 -                      dev_priv->status_gfx_addr = 0;
 -                      drm_core_ioremapfree(&dev_priv->hws_map, dev);
 -                      I915_WRITE(0x02080, 0x1ffff000);
 -              }
 -              drm_free(dev->dev_private, sizeof(drm_i915_private_t),
 -                       DRM_MEM_DRIVER);
 -
 -              dev->dev_private = NULL;
 -      }
--
        return 0;
  }
  
@@@ -106,12 -139,40 +104,14 @@@ static int i915_initialize(drm_device_
                return DRM_ERR(EINVAL);
        }
  
-       memset((void *)(dev_priv->ring.virtual_start), 0, dev_priv->ring.Size);
-       I915_WRITE(LP_RING + RING_START, dev_priv->ring.Start);
-       I915_WRITE(LP_RING + RING_LEN, ((dev_priv->ring.Size - 4096) & RING_NR_PAGES) | (RING_NO_REPORT | RING_VALID));
+       dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
+       if (!dev_priv->mmio_map) {
+               dev->dev_private = (void *)dev_priv;
+               i915_dma_cleanup(dev);
+               DRM_ERROR("can not find mmio map!\n");
+               return DRM_ERR(EINVAL);
+       }
  
 -      dev_priv->sarea_priv = (drm_i915_sarea_t *)
 -          ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset);
 -
 -      dev_priv->ring.Start = init->ring_start;
 -      dev_priv->ring.End = init->ring_end;
 -      dev_priv->ring.Size = init->ring_size;
 -      dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;
 -
 -      dev_priv->ring.map.offset = init->ring_start;
 -      dev_priv->ring.map.size = init->ring_size;
 -      dev_priv->ring.map.type = 0;
 -      dev_priv->ring.map.flags = 0;
 -      dev_priv->ring.map.mtrr = 0;
 -
 -      drm_core_ioremap(&dev_priv->ring.map, dev);
 -
 -      if (dev_priv->ring.map.handle == NULL) {
 -              dev->dev_private = (void *)dev_priv;
 -              i915_dma_cleanup(dev);
 -              DRM_ERROR("can not ioremap virtual address for"
 -                        " ring buffer\n");
 -              return DRM_ERR(ENOMEM);
 -      }
 -
 -      dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
 -
        dev_priv->cpp = init->cpp;
        dev_priv->sarea_priv->pf_current_page = 0;
  
         */
        dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;
  
--      /* Program Hardware Status Page */
-       dev_priv->status_page_dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 
-           0xffffffff);
 -      if (!IS_G33(dev)) {
 -              dev_priv->status_page_dmah = 
 -                      drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff);
--
-       if (!dev_priv->status_page_dmah) {
-               dev->dev_private = (void *)dev_priv;
-               i915_dma_cleanup(dev);
-               DRM_ERROR("Can not allocate hardware status page\n");
-               return DRM_ERR(ENOMEM);
-       }
-       dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
-       dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
-       
-       memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
-       DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
 -              if (!dev_priv->status_page_dmah) {
 -                      dev->dev_private = (void *)dev_priv;
 -                      i915_dma_cleanup(dev);
 -                      DRM_ERROR("Can not allocate hardware status page\n");
 -                      return DRM_ERR(ENOMEM);
 -              }
 -              dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
 -              dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
--
-       I915_WRITE(0x02080, dev_priv->dma_status_page);
 -              memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
 -
 -              I915_WRITE(0x02080, dev_priv->dma_status_page);
 -      }
--      DRM_DEBUG("Enabled hardware status page\n");
        dev->dev_private = (void *)dev_priv;
        return 0;
  }
@@@ -156,9 -218,35 +138,16 @@@ static int i915_dma_resume(drm_device_
  
        DRM_DEBUG("%s\n", __FUNCTION__);
  
-       I915_WRITE(I915REG_HWS_PGA, dev_priv->dma_status_page);
-       DRM_DEBUG("Enabled hardware status page\n");
+       if (!dev_priv->sarea) {
+               DRM_ERROR("can not find sarea!\n");
+               return DRM_ERR(EINVAL);
+       }
+       if (!dev_priv->mmio_map) {
+               DRM_ERROR("can not find mmio map!\n");
+               return DRM_ERR(EINVAL);
+       }
  
 -      if (dev_priv->ring.map.handle == NULL) {
 -              DRM_ERROR("can not ioremap virtual address for"
 -                        " ring buffer\n");
 -              return DRM_ERR(ENOMEM);
 -      }
 -
 -      /* Program Hardware Status Page */
 -      if (!dev_priv->hw_status_page) {
 -              DRM_ERROR("Can not find hardware status page\n");
 -              return DRM_ERR(EINVAL);
 -      }
 -      DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
 -
 -      if (dev_priv->status_gfx_addr != 0)
 -              I915_WRITE(0x02080, dev_priv->status_gfx_addr);
 -      else
 -              I915_WRITE(0x02080, dev_priv->dma_status_page);
 -      DRM_DEBUG("Enabled hardware status page\n");
 -
        return 0;
  }
  
@@@ -802,6 -898,77 +795,47 @@@ static int i915_mmio(DRM_IOCTL_ARGS
        return 0;
  }
  
 -      I915_WRITE(0x02080, dev_priv->status_gfx_addr);
+ static int i915_set_status_page(DRM_IOCTL_ARGS)
+ {
+       DRM_DEVICE;
+       drm_i915_private_t *dev_priv = dev->dev_private;
+       drm_i915_hws_addr_t hws;
+       if (!dev_priv) {
+               DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
+               return DRM_ERR(EINVAL);
+       }
+       DRM_COPY_FROM_USER_IOCTL(hws, (drm_i915_hws_addr_t __user *) data,
+                       sizeof(hws));
+       printk(KERN_DEBUG "set status page addr 0x%08x\n", (u32)hws.addr);
+       dev_priv->status_gfx_addr = hws.addr & (0x1ffff<<12);
+       dev_priv->hws_map.offset = dev->agp->agp_info.aper_base + hws.addr;
+       dev_priv->hws_map.size = 4*1024;
+       dev_priv->hws_map.type = 0;
+       dev_priv->hws_map.flags = 0;
+       dev_priv->hws_map.mtrr = 0;
+       drm_core_ioremap(&dev_priv->hws_map, dev);
+       if (dev_priv->hws_map.handle == NULL) {
+               dev->dev_private = (void *)dev_priv;
+               i915_dma_cleanup(dev);
+               dev_priv->status_gfx_addr = 0;
+               DRM_ERROR("can not ioremap virtual address for"
+                               " G33 hw status page\n");
+               return DRM_ERR(ENOMEM);
+       }
+       dev_priv->hw_status_page = dev_priv->hws_map.handle;
+       memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
 -int i915_driver_load(drm_device_t *dev, unsigned long flags)
 -{
 -      /* i915 has 4 more counters */
 -      dev->counters += 4;
 -      dev->types[6] = _DRM_STAT_IRQ;
 -      dev->types[7] = _DRM_STAT_PRIMARY;
 -      dev->types[8] = _DRM_STAT_SECONDARY;
 -      dev->types[9] = _DRM_STAT_DMA;
 -
 -      return 0;
 -}
 -
 -void i915_driver_lastclose(drm_device_t * dev)
 -{
 -      if (dev->dev_private) {
 -              drm_i915_private_t *dev_priv = dev->dev_private;
 -              i915_do_cleanup_pageflip(dev);
 -              i915_mem_takedown(&(dev_priv->agp_heap));
 -      }
 -      i915_dma_cleanup(dev);
 -}
 -
 -void i915_driver_preclose(drm_device_t * dev, DRMFILE filp)
 -{
 -      if (dev->dev_private) {
 -              drm_i915_private_t *dev_priv = dev->dev_private;
 -              i915_mem_release(dev, filp, dev_priv->agp_heap);
 -      }
 -}
 -
++      I915_WRITE(I915REG_HWS_PGA, dev_priv->status_gfx_addr);
+       DRM_DEBUG("load hws 0x2080 with gfx mem 0x%x\n",
+                       dev_priv->status_gfx_addr);
+       DRM_DEBUG("load hws at %p\n", dev_priv->hw_status_page);
+       return 0;
+ }
  drm_ioctl_desc_t i915_ioctls[] = {
        [DRM_IOCTL_NR(DRM_I915_INIT)] = {i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
        [DRM_IOCTL_NR(DRM_I915_FLUSH)] = {i915_flush_ioctl, DRM_AUTH},
@@@ -526,501 -363,9 +528,510 @@@ extern int i915_wait_ring(drm_device_t 
  
  #define CMD_OP_DESTBUFFER_INFO         ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1)
  
+ #define BREADCRUMB_BITS 31
+ #define BREADCRUMB_MASK ((1U << BREADCRUMB_BITS) - 1)
  #define READ_BREADCRUMB(dev_priv)  (((volatile u32*)(dev_priv->hw_status_page))[5])
  #define READ_HWSP(dev_priv, reg)  (((volatile u32*)(dev_priv->hw_status_page))[reg])
-                      (dev)->pci_device == 0x29A2)
 +
 +#define BLC_PWM_CTL           0x61254
 +#define BACKLIGHT_MODULATION_FREQ_SHIFT               (17)
 +/**
 + * This is the most significant 15 bits of the number of backlight cycles in a
 + * complete cycle of the modulated backlight control.
 + *
 + * The actual value is this field multiplied by two.
 + */
 +#define BACKLIGHT_MODULATION_FREQ_MASK                (0x7fff << 17)
 +#define BLM_LEGACY_MODE                               (1 << 16)
 +/**
 + * This is the number of cycles out of the backlight modulation cycle for which
 + * the backlight is on.
 + *
 + * This field must be no greater than the number of cycles in the complete
 + * backlight modulation cycle.
 + */
 +#define BACKLIGHT_DUTY_CYCLE_SHIFT            (0)
 +#define BACKLIGHT_DUTY_CYCLE_MASK             (0xffff)
 +
 +#define I915_GCFGC                    0xf0
 +#define I915_LOW_FREQUENCY_ENABLE             (1 << 7)
 +#define I915_DISPLAY_CLOCK_190_200_MHZ                (0 << 4)
 +#define I915_DISPLAY_CLOCK_333_MHZ            (4 << 4)
 +#define I915_DISPLAY_CLOCK_MASK                       (7 << 4)
 +
 +#define I855_HPLLCC                   0xc0
 +#define I855_CLOCK_CONTROL_MASK                       (3 << 0)
 +#define I855_CLOCK_133_200                    (0 << 0)
 +#define I855_CLOCK_100_200                    (1 << 0)
 +#define I855_CLOCK_100_133                    (2 << 0)
 +#define I855_CLOCK_166_250                    (3 << 0)
 +
 +/* I830 CRTC registers */
 +#define HTOTAL_A      0x60000
 +#define HBLANK_A      0x60004
 +#define HSYNC_A       0x60008
 +#define VTOTAL_A      0x6000c
 +#define VBLANK_A      0x60010
 +#define VSYNC_A       0x60014
 +#define PIPEASRC      0x6001c
 +#define BCLRPAT_A     0x60020
 +#define VSYNCSHIFT_A  0x60028
 +
 +#define HTOTAL_B      0x61000
 +#define HBLANK_B      0x61004
 +#define HSYNC_B       0x61008
 +#define VTOTAL_B      0x6100c
 +#define VBLANK_B      0x61010
 +#define VSYNC_B       0x61014
 +#define PIPEBSRC      0x6101c
 +#define BCLRPAT_B     0x61020
 +#define VSYNCSHIFT_B  0x61028
 +
 +#define PP_STATUS     0x61200
 +# define PP_ON                                        (1 << 31)
 +/**
 + * Indicates that all dependencies of the panel are on:
 + *
 + * - PLL enabled
 + * - pipe enabled
 + * - LVDS/DVOB/DVOC on
 + */
 +# define PP_READY                             (1 << 30)
 +# define PP_SEQUENCE_NONE                     (0 << 28)
 +# define PP_SEQUENCE_ON                               (1 << 28)
 +# define PP_SEQUENCE_OFF                      (2 << 28)
 +# define PP_SEQUENCE_MASK                     0x30000000
 +#define PP_CONTROL    0x61204
 +# define POWER_TARGET_ON                      (1 << 0)
 +
 +#define LVDSPP_ON       0x61208
 +#define LVDSPP_OFF      0x6120c
 +#define PP_CYCLE        0x61210
 +
 +#define PFIT_CONTROL  0x61230
 +# define PFIT_ENABLE                          (1 << 31)
 +# define PFIT_PIPE_MASK                               (3 << 29)
 +# define PFIT_PIPE_SHIFT                      29
 +# define VERT_INTERP_DISABLE                  (0 << 10)
 +# define VERT_INTERP_BILINEAR                 (1 << 10)
 +# define VERT_INTERP_MASK                     (3 << 10)
 +# define VERT_AUTO_SCALE                      (1 << 9)
 +# define HORIZ_INTERP_DISABLE                 (0 << 6)
 +# define HORIZ_INTERP_BILINEAR                        (1 << 6)
 +# define HORIZ_INTERP_MASK                    (3 << 6)
 +# define HORIZ_AUTO_SCALE                     (1 << 5)
 +# define PANEL_8TO6_DITHER_ENABLE             (1 << 3)
 +
 +#define PFIT_PGM_RATIOS       0x61234
 +# define PFIT_VERT_SCALE_MASK                 0xfff00000
 +# define PFIT_HORIZ_SCALE_MASK                        0x0000fff0
 +
 +#define PFIT_AUTO_RATIOS      0x61238
 +
 +
 +#define DPLL_A                0x06014
 +#define DPLL_B                0x06018
 +# define DPLL_VCO_ENABLE                      (1 << 31)
 +# define DPLL_DVO_HIGH_SPEED                  (1 << 30)
 +# define DPLL_SYNCLOCK_ENABLE                 (1 << 29)
 +# define DPLL_VGA_MODE_DIS                    (1 << 28)
 +# define DPLLB_MODE_DAC_SERIAL                        (1 << 26) /* i915 */
 +# define DPLLB_MODE_LVDS                      (2 << 26) /* i915 */
 +# define DPLL_MODE_MASK                               (3 << 26)
 +# define DPLL_DAC_SERIAL_P2_CLOCK_DIV_10      (0 << 24) /* i915 */
 +# define DPLL_DAC_SERIAL_P2_CLOCK_DIV_5               (1 << 24) /* i915 */
 +# define DPLLB_LVDS_P2_CLOCK_DIV_14           (0 << 24) /* i915 */
 +# define DPLLB_LVDS_P2_CLOCK_DIV_7            (1 << 24) /* i915 */
 +# define DPLL_P2_CLOCK_DIV_MASK                       0x03000000 /* i915 */
 +# define DPLL_FPA01_P1_POST_DIV_MASK          0x00ff0000 /* i915 */
 +/**
 + *  The i830 generation, in DAC/serial mode, defines p1 as two plus this
 + * bitfield, or just 2 if PLL_P1_DIVIDE_BY_TWO is set.
 + */
 +# define DPLL_FPA01_P1_POST_DIV_MASK_I830     0x001f0000
 +/**
 + * The i830 generation, in LVDS mode, defines P1 as the bit number set within
 + * this field (only one bit may be set).
 + */
 +# define DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS        0x003f0000
 +# define DPLL_FPA01_P1_POST_DIV_SHIFT         16
 +# define PLL_P2_DIVIDE_BY_4                   (1 << 23) /* i830, required in DVO non-gang */
 +# define PLL_P1_DIVIDE_BY_TWO                 (1 << 21) /* i830 */
 +# define PLL_REF_INPUT_DREFCLK                        (0 << 13)
 +# define PLL_REF_INPUT_TVCLKINA                       (1 << 13) /* i830 */
 +# define PLL_REF_INPUT_TVCLKINBC              (2 << 13) /* SDVO TVCLKIN */
 +# define PLLB_REF_INPUT_SPREADSPECTRUMIN      (3 << 13)
 +# define PLL_REF_INPUT_MASK                   (3 << 13)
 +# define PLL_LOAD_PULSE_PHASE_SHIFT           9
 +/*
 + * Parallel to Serial Load Pulse phase selection.
 + * Selects the phase for the 10X DPLL clock for the PCIe
 + * digital display port. The range is 4 to 13; 10 or more
 + * is just a flip delay. The default is 6
 + */
 +# define PLL_LOAD_PULSE_PHASE_MASK            (0xf << PLL_LOAD_PULSE_PHASE_SHIFT)
 +# define DISPLAY_RATE_SELECT_FPA1             (1 << 8)
 +
 +/**
 + * SDVO multiplier for 945G/GM. Not used on 965.
 + *
 + * \sa DPLL_MD_UDI_MULTIPLIER_MASK
 + */
 +# define SDVO_MULTIPLIER_MASK                 0x000000ff
 +# define SDVO_MULTIPLIER_SHIFT_HIRES          4
 +# define SDVO_MULTIPLIER_SHIFT_VGA            0
 +
 +/** @defgroup DPLL_MD
 + * @{
 + */
 +/** Pipe A SDVO/UDI clock multiplier/divider register for G965. */
 +#define DPLL_A_MD             0x0601c
 +/** Pipe B SDVO/UDI clock multiplier/divider register for G965. */
 +#define DPLL_B_MD             0x06020
 +/**
 + * UDI pixel divider, controlling how many pixels are stuffed into a packet.
 + *
 + * Value is pixels minus 1.  Must be set to 1 pixel for SDVO.
 + */
 +# define DPLL_MD_UDI_DIVIDER_MASK             0x3f000000
 +# define DPLL_MD_UDI_DIVIDER_SHIFT            24
 +/** UDI pixel divider for VGA, same as DPLL_MD_UDI_DIVIDER_MASK. */
 +# define DPLL_MD_VGA_UDI_DIVIDER_MASK         0x003f0000
 +# define DPLL_MD_VGA_UDI_DIVIDER_SHIFT                16
 +/**
 + * SDVO/UDI pixel multiplier.
 + *
 + * SDVO requires that the bus clock rate be between 1 and 2 Ghz, and the bus
 + * clock rate is 10 times the DPLL clock.  At low resolution/refresh rate
 + * modes, the bus rate would be below the limits, so SDVO allows for stuffing
 + * dummy bytes in the datastream at an increased clock rate, with both sides of
 + * the link knowing how many bytes are fill.
 + *
 + * So, for a mode with a dotclock of 65Mhz, we would want to double the clock
 + * rate to 130Mhz to get a bus rate of 1.30Ghz.  The DPLL clock rate would be
 + * set to 130Mhz, and the SDVO multiplier set to 2x in this register and
 + * through an SDVO command.
 + *
 + * This register field has values of multiplication factor minus 1, with
 + * a maximum multiplier of 5 for SDVO.
 + */
 +# define DPLL_MD_UDI_MULTIPLIER_MASK          0x00003f00
 +# define DPLL_MD_UDI_MULTIPLIER_SHIFT         8
 +/** SDVO/UDI pixel multiplier for VGA, same as DPLL_MD_UDI_MULTIPLIER_MASK. 
 + * This best be set to the default value (3) or the CRT won't work. No,
 + * I don't entirely understand what this does...
 + */
 +# define DPLL_MD_VGA_UDI_MULTIPLIER_MASK      0x0000003f
 +# define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT     0
 +/** @} */
 +
 +#define DPLL_TEST             0x606c
 +# define DPLLB_TEST_SDVO_DIV_1                        (0 << 22)
 +# define DPLLB_TEST_SDVO_DIV_2                        (1 << 22)
 +# define DPLLB_TEST_SDVO_DIV_4                        (2 << 22)
 +# define DPLLB_TEST_SDVO_DIV_MASK             (3 << 22)
 +# define DPLLB_TEST_N_BYPASS                  (1 << 19)
 +# define DPLLB_TEST_M_BYPASS                  (1 << 18)
 +# define DPLLB_INPUT_BUFFER_ENABLE            (1 << 16)
 +# define DPLLA_TEST_N_BYPASS                  (1 << 3)
 +# define DPLLA_TEST_M_BYPASS                  (1 << 2)
 +# define DPLLA_INPUT_BUFFER_ENABLE            (1 << 0)
 +
 +#define ADPA                  0x61100
 +#define ADPA_DAC_ENABLE       (1<<31)
 +#define ADPA_DAC_DISABLE      0
 +#define ADPA_PIPE_SELECT_MASK (1<<30)
 +#define ADPA_PIPE_A_SELECT    0
 +#define ADPA_PIPE_B_SELECT    (1<<30)
 +#define ADPA_USE_VGA_HVPOLARITY (1<<15)
 +#define ADPA_SETS_HVPOLARITY  0
 +#define ADPA_VSYNC_CNTL_DISABLE (1<<11)
 +#define ADPA_VSYNC_CNTL_ENABLE        0
 +#define ADPA_HSYNC_CNTL_DISABLE (1<<10)
 +#define ADPA_HSYNC_CNTL_ENABLE        0
 +#define ADPA_VSYNC_ACTIVE_HIGH        (1<<4)
 +#define ADPA_VSYNC_ACTIVE_LOW 0
 +#define ADPA_HSYNC_ACTIVE_HIGH        (1<<3)
 +#define ADPA_HSYNC_ACTIVE_LOW 0
 +
 +#define FPA0          0x06040
 +#define FPA1          0x06044
 +#define FPB0          0x06048
 +#define FPB1          0x0604c
 +# define FP_N_DIV_MASK                                0x003f0000
 +# define FP_N_DIV_SHIFT                               16
 +# define FP_M1_DIV_MASK                               0x00003f00
 +# define FP_M1_DIV_SHIFT                      8
 +# define FP_M2_DIV_MASK                               0x0000003f
 +# define FP_M2_DIV_SHIFT                      0
 +
 +
 +#define PORT_HOTPLUG_EN               0x61110
 +# define SDVOB_HOTPLUG_INT_EN                 (1 << 26)
 +# define SDVOC_HOTPLUG_INT_EN                 (1 << 25)
 +# define TV_HOTPLUG_INT_EN                    (1 << 18)
 +# define CRT_HOTPLUG_INT_EN                   (1 << 9)
 +# define CRT_HOTPLUG_FORCE_DETECT             (1 << 3)
 +
 +#define PORT_HOTPLUG_STAT     0x61114
 +# define CRT_HOTPLUG_INT_STATUS                       (1 << 11)
 +# define TV_HOTPLUG_INT_STATUS                        (1 << 10)
 +# define CRT_HOTPLUG_MONITOR_MASK             (3 << 8)
 +# define CRT_HOTPLUG_MONITOR_COLOR            (3 << 8)
 +# define CRT_HOTPLUG_MONITOR_MONO             (2 << 8)
 +# define CRT_HOTPLUG_MONITOR_NONE             (0 << 8)
 +# define SDVOC_HOTPLUG_INT_STATUS             (1 << 7)
 +# define SDVOB_HOTPLUG_INT_STATUS             (1 << 6)
 +
 +#define SDVOB                 0x61140
 +#define SDVOC                 0x61160
 +#define SDVO_ENABLE                           (1 << 31)
 +#define SDVO_PIPE_B_SELECT                    (1 << 30)
 +#define SDVO_STALL_SELECT                     (1 << 29)
 +#define SDVO_INTERRUPT_ENABLE                 (1 << 26)
 +/**
 + * 915G/GM SDVO pixel multiplier.
 + *
 + * Programmed value is multiplier - 1, up to 5x.
 + *
 + * \sa DPLL_MD_UDI_MULTIPLIER_MASK
 + */
 +#define SDVO_PORT_MULTIPLY_MASK                       (7 << 23)
 +#define SDVO_PORT_MULTIPLY_SHIFT              23
 +#define SDVO_PHASE_SELECT_MASK                        (15 << 19)
 +#define SDVO_PHASE_SELECT_DEFAULT             (6 << 19)
 +#define SDVO_CLOCK_OUTPUT_INVERT              (1 << 18)
 +#define SDVOC_GANG_MODE                               (1 << 16)
 +#define SDVO_BORDER_ENABLE                    (1 << 7)
 +#define SDVOB_PCIE_CONCURRENCY                        (1 << 3)
 +#define SDVO_DETECTED                         (1 << 2)
 +/* Bits to be preserved when writing */
 +#define SDVOB_PRESERVE_MASK                   ((1 << 17) | (1 << 16) | (1 << 14))
 +#define SDVOC_PRESERVE_MASK                   (1 << 17)
 +
 +/** @defgroup LVDS
 + * @{
 + */
 +/**
 + * This register controls the LVDS output enable, pipe selection, and data
 + * format selection.
 + *
 + * All of the clock/data pairs are force powered down by power sequencing.
 + */
 +#define LVDS                  0x61180
 +/**
 + * Enables the LVDS port.  This bit must be set before DPLLs are enabled, as
 + * the DPLL semantics change when the LVDS is assigned to that pipe.
 + */
 +# define LVDS_PORT_EN                 (1 << 31)
 +/** Selects pipe B for LVDS data.  Must be set on pre-965. */
 +# define LVDS_PIPEB_SELECT            (1 << 30)
 +
 +/**
 + * Enables the A0-A2 data pairs and CLKA, containing 18 bits of color data per
 + * pixel.
 + */
 +# define LVDS_A0A2_CLKA_POWER_MASK    (3 << 8)
 +# define LVDS_A0A2_CLKA_POWER_DOWN    (0 << 8)
 +# define LVDS_A0A2_CLKA_POWER_UP      (3 << 8)
 +/**
 + * Controls the A3 data pair, which contains the additional LSBs for 24 bit
 + * mode.  Only enabled if LVDS_A0A2_CLKA_POWER_UP also indicates it should be
 + * on.
 + */
 +# define LVDS_A3_POWER_MASK           (3 << 6)
 +# define LVDS_A3_POWER_DOWN           (0 << 6)
 +# define LVDS_A3_POWER_UP             (3 << 6)
 +/**
 + * Controls the CLKB pair.  This should only be set when LVDS_B0B3_POWER_UP
 + * is set.
 + */
 +# define LVDS_CLKB_POWER_MASK         (3 << 4)
 +# define LVDS_CLKB_POWER_DOWN         (0 << 4)
 +# define LVDS_CLKB_POWER_UP           (3 << 4)
 +
 +/**
 + * Controls the B0-B3 data pairs.  This must be set to match the DPLL p2
 + * setting for whether we are in dual-channel mode.  The B3 pair will
 + * additionally only be powered up when LVDS_A3_POWER_UP is set.
 + */
 +# define LVDS_B0B3_POWER_MASK         (3 << 2)
 +# define LVDS_B0B3_POWER_DOWN         (0 << 2)
 +# define LVDS_B0B3_POWER_UP           (3 << 2)
 +
 +#define PIPEACONF 0x70008
 +#define PIPEACONF_ENABLE      (1<<31)
 +#define PIPEACONF_DISABLE     0
 +#define PIPEACONF_DOUBLE_WIDE (1<<30)
 +#define I965_PIPECONF_ACTIVE  (1<<30)
 +#define PIPEACONF_SINGLE_WIDE 0
 +#define PIPEACONF_PIPE_UNLOCKED 0
 +#define PIPEACONF_PIPE_LOCKED (1<<25)
 +#define PIPEACONF_PALETTE     0
 +#define PIPEACONF_GAMMA       (1<<24)
 +#define PIPECONF_FORCE_BORDER (1<<25)
 +#define PIPECONF_PROGRESSIVE  (0 << 21)
 +#define PIPECONF_INTERLACE_W_FIELD_INDICATION (6 << 21)
 +#define PIPECONF_INTERLACE_FIELD_0_ONLY               (7 << 21)
 +
 +#define PIPEBCONF 0x71008
 +#define PIPEBCONF_ENABLE      (1<<31)
 +#define PIPEBCONF_DISABLE     0
 +#define PIPEBCONF_DOUBLE_WIDE (1<<30)
 +#define PIPEBCONF_DISABLE     0
 +#define PIPEBCONF_GAMMA       (1<<24)
 +#define PIPEBCONF_PALETTE     0
 +
 +#define PIPEBGCMAXRED         0x71010
 +#define PIPEBGCMAXGREEN               0x71014
 +#define PIPEBGCMAXBLUE                0x71018
 +#define PIPEBSTAT             0x71024
 +#define PIPEBFRAMEHIGH                0x71040
 +#define PIPEBFRAMEPIXEL               0x71044
 +
 +#define DSPACNTR              0x70180
 +#define DSPBCNTR              0x71180
 +#define DISPLAY_PLANE_ENABLE                  (1<<31)
 +#define DISPLAY_PLANE_DISABLE                 0
 +#define DISPPLANE_GAMMA_ENABLE                        (1<<30)
 +#define DISPPLANE_GAMMA_DISABLE                       0
 +#define DISPPLANE_PIXFORMAT_MASK              (0xf<<26)
 +#define DISPPLANE_8BPP                                (0x2<<26)
 +#define DISPPLANE_15_16BPP                    (0x4<<26)
 +#define DISPPLANE_16BPP                               (0x5<<26)
 +#define DISPPLANE_32BPP_NO_ALPHA              (0x6<<26)
 +#define DISPPLANE_32BPP                               (0x7<<26)
 +#define DISPPLANE_STEREO_ENABLE                       (1<<25)
 +#define DISPPLANE_STEREO_DISABLE              0
 +#define DISPPLANE_SEL_PIPE_MASK                       (1<<24)
 +#define DISPPLANE_SEL_PIPE_A                  0
 +#define DISPPLANE_SEL_PIPE_B                  (1<<24)
 +#define DISPPLANE_SRC_KEY_ENABLE              (1<<22)
 +#define DISPPLANE_SRC_KEY_DISABLE             0
 +#define DISPPLANE_LINE_DOUBLE                 (1<<20)
 +#define DISPPLANE_NO_LINE_DOUBLE              0
 +#define DISPPLANE_STEREO_POLARITY_FIRST               0
 +#define DISPPLANE_STEREO_POLARITY_SECOND      (1<<18)
 +/* plane B only */
 +#define DISPPLANE_ALPHA_TRANS_ENABLE          (1<<15)
 +#define DISPPLANE_ALPHA_TRANS_DISABLE         0
 +#define DISPPLANE_SPRITE_ABOVE_DISPLAYA               0
 +#define DISPPLANE_SPRITE_ABOVE_OVERLAY                (1)
 +
 +#define DSPABASE              0x70184
 +#define DSPASTRIDE            0x70188
 +
 +#define DSPBBASE              0x71184
 +#define DSPBADDR              DSPBBASE
 +#define DSPBSTRIDE            0x71188
 +
 +#define DSPAKEYVAL            0x70194
 +#define DSPAKEYMASK           0x70198
 +
 +#define DSPAPOS                       0x7018C /* reserved */
 +#define DSPASIZE              0x70190
 +#define DSPBPOS                       0x7118C
 +#define DSPBSIZE              0x71190
 +
 +#define DSPASURF              0x7019C
 +#define DSPATILEOFF           0x701A4
 +
 +#define DSPBSURF              0x7119C
 +#define DSPBTILEOFF           0x711A4
 +
 +#define VGACNTRL              0x71400
 +# define VGA_DISP_DISABLE                     (1 << 31)
 +# define VGA_2X_MODE                          (1 << 30)
 +# define VGA_PIPE_B_SELECT                    (1 << 29)
 +
 +/*
 + * Some BIOS scratch area registers.  The 845 (and 830?) store the amount
 + * of video memory available to the BIOS in SWF1.
 + */
 +
 +#define SWF0                  0x71410
 +#define SWF1                  0x71414
 +#define SWF2                  0x71418
 +#define SWF3                  0x7141c
 +#define SWF4                  0x71420
 +#define SWF5                  0x71424
 +#define SWF6                  0x71428
 +
 +/*
 + * 855 scratch registers.
 + */
 +#define SWF00                 0x70410
 +#define SWF01                 0x70414
 +#define SWF02                 0x70418
 +#define SWF03                 0x7041c
 +#define SWF04                 0x70420
 +#define SWF05                 0x70424
 +#define SWF06                 0x70428
 +
 +#define SWF10                 SWF0
 +#define SWF11                 SWF1
 +#define SWF12                 SWF2
 +#define SWF13                 SWF3
 +#define SWF14                 SWF4
 +#define SWF15                 SWF5
 +#define SWF16                 SWF6
 +
 +#define SWF30                 0x72414
 +#define SWF31                 0x72418
 +#define SWF32                 0x7241c
 +
 +/*
 + * Overlay registers.  These are overlay registers accessed via MMIO.
 + * Those loaded via the overlay register page are defined in i830_video.c.
 + */
 +#define OVADD                 0x30000
 +
 +#define DOVSTA                        0x30008
 +#define OC_BUF                        (0x3<<20)
 +
 +#define OGAMC5                        0x30010
 +#define OGAMC4                        0x30014
 +#define OGAMC3                        0x30018
 +#define OGAMC2                        0x3001c
 +#define OGAMC1                        0x30020
 +#define OGAMC0                        0x30024
 +
 +/*
 + * Palette registers
 + */
 +#define PALETTE_A             0x0a000
 +#define PALETTE_B             0x0a800
 +
 +#define IS_I830(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82830_CGC)
 +#define IS_845G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82845G_IG)
 +#define IS_I85X(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82855GM_IG)
 +#define IS_I855(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82855GM_IG)
 +#define IS_I865G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82865_IG)
 +
 +#define IS_I915G(dev) (dev->pci_device == PCI_DEVICE_ID_INTEL_82915G_IG)/* || dev->pci_device == PCI_DEVICE_ID_INTELPCI_CHIP_E7221_G)*/
 +#define IS_I915GM(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82915GM_IG)
 +#define IS_I945G(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82945G_IG)
 +#define IS_I945GM(dev) ((dev)->pci_device == PCI_DEVICE_ID_INTEL_82945GM_IG)
 +
 +#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \
 +                     (dev)->pci_device == 0x2982 || \
 +                     (dev)->pci_device == 0x2992 || \
++                     (dev)->pci_device == 0x29A2 || \
++                     (dev)->pci_device == 0x2A02 || \
++                     (dev)->pci_device == 0x2A12)
 +
 +
 +#define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \
 +                    IS_I945GM(dev) || IS_I965G(dev))
 +
++#define IS_G33(dev)    ((dev)->pci_device == 0x29C2 || \
++                      (dev)->pci_device == 0x29B2 || \
++                      (dev)->pci_device == 0x29D2) 
++
 +#define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \
 +                      IS_I945GM(dev))
 +
 +#define PRIMARY_RINGBUFFER_SIZE         (128*1024)
 +
  #endif
index 7516b2c,0000000..83219e4
mode 100644,000000..100644
--- /dev/null
@@@ -1,312 -1,0 +1,313 @@@
-       dev_priv->status_page_dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 
-           0xffffffff);
-       if (!dev_priv->status_page_dmah) {
-               dev->dev_private = (void *)dev_priv;
-               i915_dma_cleanup(dev);
-               DRM_ERROR("Can not allocate hardware status page\n");
-               return DRM_ERR(ENOMEM);
 +/*
 + * Copyright (c) 2007 Intel Corporation
 + *   Jesse Barnes <jesse.barnes@intel.com>
 + *
 + * Copyright © 2002, 2003 David Dawes <dawes@xfree86.org>
 + *                   2004 Sylvain Meyer
 + *
 + * GPL/BSD dual license
 + */
 +#include "drmP.h"
 +#include "drm.h"
 +#include "drm_sarea.h"
 +#include "i915_drm.h"
 +#include "i915_drv.h"
 +
 +/**
 + * i915_probe_agp - get AGP bootup configuration
 + * @pdev: PCI device
 + * @aperture_size: returns AGP aperture configured size
 + * @preallocated_size: returns size of BIOS preallocated AGP space
 + *
 + * Since Intel integrated graphics are UMA, the BIOS has to set aside
 + * some RAM for the framebuffer at early boot.  This code figures out
 + * how much was set aside so we can use it for our own purposes.
 + */
 +int i915_probe_agp(struct pci_dev *pdev, unsigned long *aperture_size,
 +                 unsigned long *preallocated_size)
 +{
 +      struct pci_dev *bridge_dev;
 +      u16 tmp = 0;
 +      unsigned long overhead;
 +
 +      bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0,0));
 +      if (!bridge_dev) {
 +              DRM_ERROR("bridge device not found\n");
 +              return -1;
 +      }
 +
 +      /* Get the fb aperture size and "stolen" memory amount. */
 +      pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp);
 +      pci_dev_put(bridge_dev);
 +
 +      *aperture_size = 1024 * 1024;
 +      *preallocated_size = 1024 * 1024;
 +
 +      switch (pdev->device) {
 +      case PCI_DEVICE_ID_INTEL_82830_CGC:
 +      case PCI_DEVICE_ID_INTEL_82845G_IG:
 +      case PCI_DEVICE_ID_INTEL_82855GM_IG:
 +      case PCI_DEVICE_ID_INTEL_82865_IG:
 +              if ((tmp & INTEL_GMCH_MEM_MASK) == INTEL_GMCH_MEM_64M)
 +                      *aperture_size *= 64;
 +              else
 +                      *aperture_size *= 128;
 +              break;
 +      default:
 +              /* 9xx supports large sizes, just look at the length */
 +              *aperture_size = pci_resource_len(pdev, 2);
 +              break;
 +      }
 +
 +      /*
 +       * Some of the preallocated space is taken by the GTT
 +       * and popup.  GTT is 1K per MB of aperture size, and popup is 4K.
 +       */
 +      overhead = (*aperture_size / 1024) + 4096;
 +      switch (tmp & INTEL_855_GMCH_GMS_MASK) {
 +      case INTEL_855_GMCH_GMS_STOLEN_1M:
 +              break; /* 1M already */
 +      case INTEL_855_GMCH_GMS_STOLEN_4M:
 +              *preallocated_size *= 4;
 +              break;
 +      case INTEL_855_GMCH_GMS_STOLEN_8M:
 +              *preallocated_size *= 8;
 +              break;
 +      case INTEL_855_GMCH_GMS_STOLEN_16M:
 +              *preallocated_size *= 16;
 +              break;
 +      case INTEL_855_GMCH_GMS_STOLEN_32M:
 +              *preallocated_size *= 32;
 +              break;
 +      case INTEL_915G_GMCH_GMS_STOLEN_48M:
 +              *preallocated_size *= 48;
 +              break;
 +      case INTEL_915G_GMCH_GMS_STOLEN_64M:
 +              *preallocated_size *= 64;
 +              break;
 +      case INTEL_855_GMCH_GMS_DISABLED:
 +              DRM_ERROR("video memory is disabled\n");
 +              return -1;
 +      default:
 +              DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
 +                      tmp & INTEL_855_GMCH_GMS_MASK);
 +              return -1;
 +      }
 +      *preallocated_size -= overhead;
 +
 +      return 0;
 +}
 +
 +/**
 + * i915_driver_load - setup chip and create an initial config
 + * @dev: DRM device
 + * @flags: startup flags
 + *
 + * The driver load routine has to do several things:
 + *   - drive output discovery via intel_modeset_init()
 + *   - initialize the memory manager
 + *   - allocate initial config memory
 + *   - setup the DRM framebuffer with the allocated memory
 + */
 +int i915_driver_load(drm_device_t *dev, unsigned long flags)
 +{
 +      drm_i915_private_t *dev_priv;
 +      unsigned long agp_size, prealloc_size;
 +      unsigned long sareapage;
 +      int size, ret;
 +
 +      dev_priv = drm_alloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER);
 +      if (dev_priv == NULL)
 +              return DRM_ERR(ENOMEM);
 +
 +      memset(dev_priv, 0, sizeof(drm_i915_private_t));
 +      dev->dev_private = (void *)dev_priv;
 +//    dev_priv->flags = flags;
 +
 +      /* i915 has 4 more counters */
 +      dev->counters += 4;
 +      dev->types[6] = _DRM_STAT_IRQ;
 +      dev->types[7] = _DRM_STAT_PRIMARY;
 +      dev->types[8] = _DRM_STAT_SECONDARY;
 +      dev->types[9] = _DRM_STAT_DMA;
 +
 +      if (IS_I9XX(dev)) {
 +              dev_priv->mmiobase = drm_get_resource_start(dev, 0);
 +              dev_priv->mmiolen = drm_get_resource_len(dev, 0);
 +              dev->mode_config.fb_base =
 +                      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->mode_config.fb_base =
 +                      drm_get_resource_start(dev, 0) & 0xff000000;
 +      } else {
 +              DRM_ERROR("Unable to find MMIO registers\n");
 +              return -ENODEV;
 +      }
 +
 +      DRM_DEBUG("fb_base: 0x%08lx\n", dev->mode_config.fb_base);
 +
 +      ret = drm_addmap(dev, dev_priv->mmiobase, dev_priv->mmiolen,
 +                       _DRM_REGISTERS, _DRM_READ_ONLY|_DRM_DRIVER, &dev_priv->mmio_map);
 +      if (ret != 0) {
 +              DRM_ERROR("Cannot add mapping for MMIO registers\n");
 +              return ret;
 +      }
 +
 +      /* prebuild the SAREA */
 +      sareapage = max(SAREA_MAX, PAGE_SIZE);
 +      ret = drm_addmap(dev, 0, sareapage, _DRM_SHM, _DRM_CONTAINS_LOCK|_DRM_DRIVER,
 +                       &dev_priv->sarea);
 +      if (ret) {
 +              DRM_ERROR("SAREA setup failed\n");
 +              return ret;
 +      }
 +
 +      init_waitqueue_head(&dev->lock.lock_queue);
 +
 +      /* FIXME: assume sarea_priv is right after SAREA */
 +        dev_priv->sarea_priv = dev_priv->sarea->handle + sizeof(drm_sarea_t);
 +
 +      /*
 +       * Initialize the memory manager for local and AGP space
 +       */
 +      drm_bo_driver_init(dev);
 +
 +      i915_probe_agp(dev->pdev, &agp_size, &prealloc_size);
 +      DRM_DEBUG("setting up %ld bytes of VRAM space\n", prealloc_size);
 +      drm_bo_init_mm(dev, DRM_BO_MEM_VRAM, 0, prealloc_size >> PAGE_SHIFT);
 +
 +      I915_WRITE(LP_RING + RING_LEN, 0);
 +      I915_WRITE(LP_RING + RING_HEAD, 0);
 +      I915_WRITE(LP_RING + RING_TAIL, 0);
 +
 +      size = PRIMARY_RINGBUFFER_SIZE;
 +      ret = drm_buffer_object_create(dev, size, drm_bo_type_kernel,
 +                                     DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE |
 +                                     DRM_BO_FLAG_MEM_VRAM |
 +                                     DRM_BO_FLAG_NO_EVICT,
 +                                     DRM_BO_HINT_DONT_FENCE, 0x1, 0,
 +                                     &dev_priv->ring_buffer);
 +      if (ret < 0) {
 +              DRM_ERROR("Unable to allocate ring buffer\n");
 +              return -EINVAL;
 +      }
 +
 +      /* remap the buffer object properly */
 +      dev_priv->ring.Start = dev_priv->ring_buffer->offset;
 +      dev_priv->ring.End = dev_priv->ring.Start + size;
 +      dev_priv->ring.Size = size;
 +      dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;
 +
 +      /* FIXME: need wrapper with PCI mem checks */
 +      ret = drm_mem_reg_ioremap(dev, &dev_priv->ring_buffer->mem,
 +                                (void **) &dev_priv->ring.virtual_start);
 +      if (ret)
 +              DRM_ERROR("error mapping ring buffer: %d\n", ret);
 +
 +      DRM_DEBUG("ring start %08lX, %p, %08lX\n", dev_priv->ring.Start,
 +                dev_priv->ring.virtual_start, dev_priv->ring.Size);
 +
 +      dev_priv->sarea_priv->pf_current_page = 0;
 +
 +      memset((void *)(dev_priv->ring.virtual_start), 0, dev_priv->ring.Size);
 +
 +      I915_WRITE(LP_RING + RING_START, dev_priv->ring.Start);
 +      I915_WRITE(LP_RING + RING_LEN,
 +                 ((dev_priv->ring.Size - 4096) & RING_NR_PAGES) |
 +                 (RING_NO_REPORT | RING_VALID));
 +
 +      /* We are using separate values as placeholders for mechanisms for
 +       * private backbuffer/depthbuffer usage.
 +       */
 +      dev_priv->use_mi_batchbuffer_start = 0;
 +
 +      /* Allow hardware batchbuffers unless told otherwise.
 +       */
 +      dev_priv->allow_batchbuffer = 1;
 +
 +      /* Program Hardware Status Page */
-       dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
-       dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
-       
-       memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
-       DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
-       I915_WRITE(I915REG_HWS_PGA, dev_priv->dma_status_page);
++      if (!IS_G33(dev)) {
++              dev_priv->status_page_dmah = 
++                      drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff);
++
++              if (!dev_priv->status_page_dmah) {
++                      dev->dev_private = (void *)dev_priv;
++                      i915_dma_cleanup(dev);
++                      DRM_ERROR("Can not allocate hardware status page\n");
++                      return DRM_ERR(ENOMEM);
++              }
++              dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
++              dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
++
++              memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
++
++              I915_WRITE(I915REG_HWS_PGA, dev_priv->dma_status_page);
 +      }
 +      DRM_DEBUG("Enabled hardware status page\n");
 +
 +      intel_modeset_init(dev);
 +      drm_initial_config(dev, false);
 +
 +      return 0;
 +}
 +
 +int i915_driver_unload(drm_device_t *dev)
 +{
 +      drm_i915_private_t *dev_priv = dev->dev_private;
 +
 +      if (dev_priv->status_page_dmah) {
 +              drm_pci_free(dev, dev_priv->status_page_dmah);
 +              dev_priv->status_page_dmah = NULL;
 +              dev_priv->hw_status_page = NULL;
 +              dev_priv->dma_status_page = 0;
 +              /* Need to rewrite hardware status page */
 +              I915_WRITE(I915REG_HWS_PGA, 0x1ffff000);
 +      }
 +
 +      I915_WRITE(LP_RING + RING_LEN, 0);
 +
 +      intel_modeset_cleanup(dev);
 +
 +      drm_mem_reg_iounmap(dev, &dev_priv->ring_buffer->mem,
 +                          dev_priv->ring.virtual_start);
 +
 +      DRM_DEBUG("usage is %d\n", atomic_read(&dev_priv->ring_buffer->usage));
 +      mutex_lock(&dev->struct_mutex);
 +      drm_bo_usage_deref_locked(dev_priv->ring_buffer);
 +      mutex_unlock(&dev->struct_mutex);
 +
 +      if (drm_bo_clean_mm(dev, DRM_BO_MEM_VRAM)) {
 +              DRM_ERROR("Memory manager type 3 not clean. "
 +                        "Delaying takedown\n");
 +      }
 +
 +      drm_bo_driver_finish(dev);
 +
 +        DRM_DEBUG("%p, %p\n", dev_priv->mmio_map, dev_priv->sarea);
 +        drm_rmmap(dev, dev_priv->mmio_map);
 +        drm_rmmap(dev, dev_priv->sarea);
 +
 +      drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
 +
 +      dev->dev_private = NULL;
 +      return 0;
 +}
 +
 +void i915_driver_lastclose(drm_device_t * dev)
 +{
 +      drm_i915_private_t *dev_priv = dev->dev_private;
 +      
 +      i915_mem_takedown(&(dev_priv->agp_heap));
 +
 +      i915_dma_cleanup(dev);
 +
 +}
 +
 +void i915_driver_preclose(drm_device_t * dev, DRMFILE filp)
 +{
 +      drm_i915_private_t *dev_priv = dev->dev_private;
 +      i915_mem_release(dev, filp, dev_priv->agp_heap);
 +}
 +
Simple merge