Merge branch 'origin' into modesetting-101
authorDave Airlie <airlied@redhat.com>
Thu, 22 Nov 2007 06:17:06 +0000 (17:17 +1100)
committerDave Airlie <airlied@redhat.com>
Thu, 22 Nov 2007 06:17:06 +0000 (17:17 +1100)
Conflicts:

linux-core/drmP.h
shared-core/i915_dma.c
shared-core/i915_drm.h
shared-core/radeon_drv.h

14 files changed:
1  2 
linux-core/ati_pcigart.c
linux-core/drmP.h
linux-core/drm_bufs.c
linux-core/drm_drv.c
linux-core/drm_fops.c
linux-core/drm_stub.c
shared-core/drm.h
shared-core/i915_dma.c
shared-core/i915_drm.h
shared-core/i915_drv.h
shared-core/radeon_cp.c
shared-core/radeon_drm.h
shared-core/radeon_drv.h
shared-core/radeon_irq.c

  
  # define ATI_PCIGART_PAGE_SIZE                4096    /**< PCI GART page size */
  
- static __inline__ void insert_page_into_table(struct ati_pcigart_info *info, u32 page_base, u32 *pci_gart)
++static __inline__ void insert_page_into_table(struct drm_ati_pcigart_info *info, u32 page_base, u32 *pci_gart)
 +{
 +      switch(info->gart_reg_if) {
 +      case DRM_ATI_GART_IGP:
 +              *pci_gart = cpu_to_le32((page_base) | 0xc);
 +              break;
 +      case DRM_ATI_GART_PCIE:
 +              *pci_gart = cpu_to_le32((page_base >> 8) | 0xc);
 +              break;
 +      default:
 +      case DRM_ATI_GART_PCI:
 +              *pci_gart = cpu_to_le32(page_base);
 +              break;
 +      }
 +}
 +
- static __inline__ u32 get_page_base_from_table(struct ati_pcigart_info *info, u32 *pci_gart)
++static __inline__ u32 get_page_base_from_table(struct drm_ati_pcigart_info *info, u32 *pci_gart)
 +{
 +      u32 retval;
 +      switch(info->gart_reg_if) {
 +      case DRM_ATI_GART_IGP:
 +              retval = *pci_gart;
 +              retval &= ~0xc;
 +              break;
 +      case DRM_ATI_GART_PCIE:
 +              retval = *pci_gart;
 +              retval &= ~0xc;
 +              retval <<= 8;
 +              break;
 +      default:
 +      case DRM_ATI_GART_PCI:
 +              retval = *pci_gart;
 +              break;
 +      }
 +      return retval;
 +}
 +
 +
 +
  static void *drm_ati_alloc_pcigart_table(int order)
  {
        unsigned long address;
@@@ -266,146 -238,3 +266,146 @@@ int drm_ati_pcigart_init(struct drm_dev
        return ret;
  }
  EXPORT_SYMBOL(drm_ati_pcigart_init);
-       struct ati_pcigart_info *info = atipci_be->gart_info;
 +
 +static int ati_pcigart_needs_unbind_cache_adjust(struct drm_ttm_backend *backend)
 +{
 +      return ((backend->flags & DRM_BE_FLAG_BOUND_CACHED) ? 0 : 1);
 +}
 +
 +static int ati_pcigart_populate(struct drm_ttm_backend *backend,
 +                              unsigned long num_pages,
 +                              struct page **pages)
 +{
 +      ati_pcigart_ttm_backend_t *atipci_be =
 +              container_of(backend, ati_pcigart_ttm_backend_t, backend);
 +
 +      DRM_ERROR("%ld\n", num_pages);
 +      atipci_be->pages = pages;
 +      atipci_be->num_pages = num_pages;
 +      atipci_be->populated = 1;
 +      return 0;
 +}
 +
 +static int ati_pcigart_bind_ttm(struct drm_ttm_backend *backend,
 +                              struct drm_bo_mem_reg *bo_mem)
 +{
 +      ati_pcigart_ttm_backend_t *atipci_be =
 +              container_of(backend, ati_pcigart_ttm_backend_t, backend);
 +        off_t j;
 +      int i;
-       struct ati_pcigart_info *info = atipci_be->gart_info;   
++      struct drm_ati_pcigart_info *info = atipci_be->gart_info;
 +      u32 *pci_gart;
 +      u32 page_base;
 +      unsigned long offset = bo_mem->mm_node->start;
 +      pci_gart = info->addr;
 +
 +      DRM_ERROR("Offset is %08lX\n", bo_mem->mm_node->start);
 +        j = offset;
 +        while (j < (offset + atipci_be->num_pages)) {
 +              if (get_page_base_from_table(info, pci_gart+j))
 +                      return -EBUSY;
 +                j++;
 +        }
 +
 +        for (i = 0, j = offset; i < atipci_be->num_pages; i++, j++) {
 +              struct page *cur_page = atipci_be->pages[i];
 +                /* write value */
 +              page_base = page_to_phys(cur_page);
 +              insert_page_into_table(info, page_base, pci_gart + j);
 +        }
 +
 +#if defined(__i386__) || defined(__x86_64__)
 +      wbinvd();
 +#else
 +      mb();
 +#endif
 +
 +      atipci_be->gart_flush_fn(atipci_be->dev);
 +
 +      atipci_be->bound = 1;
 +      atipci_be->offset = offset;
 +        /* need to traverse table and add entries */
 +      DRM_DEBUG("\n");
 +      return 0;
 +}
 +
 +static int ati_pcigart_unbind_ttm(struct drm_ttm_backend *backend)
 +{
 +      ati_pcigart_ttm_backend_t *atipci_be =
 +              container_of(backend, ati_pcigart_ttm_backend_t, backend);
- struct drm_ttm_backend *ati_pcigart_init_ttm(struct drm_device *dev, struct ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev))
++      struct drm_ati_pcigart_info *info = atipci_be->gart_info;       
 +      unsigned long offset = atipci_be->offset;
 +      int i;
 +      off_t j;
 +      u32 *pci_gart = info->addr;
 +
 +      DRM_DEBUG("\n");
 +
 +      if (atipci_be->bound != 1)
 +              return -EINVAL;
 +
 +      for (i = 0, j = offset; i < atipci_be->num_pages; i++, j++) {
 +              *(pci_gart + j) = 0;
 +      }
 +      atipci_be->gart_flush_fn(atipci_be->dev);
 +      atipci_be->bound = 0;
 +      atipci_be->offset = 0;
 +      return 0;
 +}
 +
 +static void ati_pcigart_clear_ttm(struct drm_ttm_backend *backend)
 +{
 +      ati_pcigart_ttm_backend_t *atipci_be =
 +              container_of(backend, ati_pcigart_ttm_backend_t, backend);
 +
 +      DRM_DEBUG("\n");        
 +      if (atipci_be->pages) {
 +              backend->func->unbind(backend);
 +              atipci_be->pages = NULL;
 +
 +      }
 +      atipci_be->num_pages = 0;
 +}
 +
 +static void ati_pcigart_destroy_ttm(struct drm_ttm_backend *backend)
 +{
 +      ati_pcigart_ttm_backend_t *atipci_be;
 +      if (backend) {
 +              DRM_DEBUG("\n");
 +              atipci_be = container_of(backend, ati_pcigart_ttm_backend_t, backend);
 +              if (atipci_be) {
 +                      if (atipci_be->pages) {
 +                              backend->func->clear(backend);
 +                      }
 +                      drm_ctl_free(atipci_be, sizeof(*atipci_be), DRM_MEM_TTM);
 +              }
 +      }
 +}
 +
 +static struct drm_ttm_backend_func ati_pcigart_ttm_backend = 
 +{
 +      .needs_ub_cache_adjust = ati_pcigart_needs_unbind_cache_adjust,
 +      .populate = ati_pcigart_populate,
 +      .clear = ati_pcigart_clear_ttm,
 +      .bind = ati_pcigart_bind_ttm,
 +      .unbind = ati_pcigart_unbind_ttm,
 +      .destroy =  ati_pcigart_destroy_ttm,
 +};
 +
++struct drm_ttm_backend *ati_pcigart_init_ttm(struct drm_device *dev, struct drm_ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev))
 +{
 +      ati_pcigart_ttm_backend_t *atipci_be;
 +
 +      atipci_be = drm_ctl_calloc(1, sizeof (*atipci_be), DRM_MEM_TTM);
 +      if (!atipci_be)
 +              return NULL;
 +      
 +      atipci_be->populated = 0;
 +      atipci_be->backend.func = &ati_pcigart_ttm_backend;
 +      atipci_be->gart_info = info;
 +      atipci_be->gart_flush_fn = gart_flush_fn;
 +      atipci_be->dev = dev;
 +
 +      return &atipci_be->backend;
 +}
 +EXPORT_SYMBOL(ati_pcigart_init_ttm);
@@@ -662,14 -657,11 +661,15 @@@ struct drm_driver 
                                        struct drm_file *file_priv);
        void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
                                            struct drm_file *file_priv);
-       unsigned long (*get_map_ofs) (struct drm_map * map);
-       unsigned long (*get_reg_ofs) (struct drm_device * dev);
-       void (*set_version) (struct drm_device * dev, struct drm_set_version * sv);
+       unsigned long (*get_map_ofs) (struct drm_map *map);
+       unsigned long (*get_reg_ofs) (struct drm_device *dev);
+       void (*set_version) (struct drm_device *dev,
+                            struct drm_set_version *sv);
  
 +      /* FB routines, if present */
 +      int (*fb_probe)(struct drm_device *dev, struct drm_crtc *crtc);
 +      int (*fb_remove)(struct drm_device *dev, struct drm_crtc *crtc);
 +
        struct drm_fence_driver *fence_driver;
        struct drm_bo_driver *bo_driver;
  
@@@ -853,17 -842,6 +853,17 @@@ struct drm_agp_ttm_backend 
  };
  #endif
  
-       struct ati_pcigart_info *gart_info;
 +typedef struct ati_pcigart_ttm_backend {
 +      struct drm_ttm_backend backend;
 +      int populated;
 +      void (*gart_flush_fn)(struct drm_device *dev);
++      struct drm_ati_pcigart_info *gart_info;
 +      unsigned long offset;
 +      struct page **pages;
 +      int num_pages;
 +      int bound;
 +      struct drm_device *dev;
 +} ati_pcigart_ttm_backend_t;
  
  static __inline__ int drm_core_check_feature(struct drm_device *dev,
                                             int feature)
@@@ -1179,9 -1157,8 +1179,9 @@@ extern int drm_sg_free(struct drm_devic
                       struct drm_file *file_priv);
  
                               /* ATI PCIGART support (ati_pcigart.h) */
- extern int drm_ati_pcigart_init(struct drm_device *dev, struct ati_pcigart_info *gart_info);
- extern int drm_ati_pcigart_cleanup(struct drm_device *dev, struct ati_pcigart_info *gart_info);
- extern struct drm_ttm_backend *ati_pcigart_init_ttm(struct drm_device *dev, struct ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev));
+ extern int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info);
+ extern int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info);
++extern struct drm_ttm_backend *ati_pcigart_init_ttm(struct drm_device *dev, struct drm_ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev));
  
  extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
                           size_t align, dma_addr_t maxaddr);
Simple merge
Simple merge
@@@ -263,10 -263,10 +263,11 @@@ static int drm_open_helper(struct inod
  
        INIT_LIST_HEAD(&priv->lhead);
        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);
+       for (i = 0; i < _DRM_NO_REF_TYPES; ++i) {
+               ret = drm_ht_create(&priv->refd_object_hash[i],
+                                   DRM_FILE_HASH_ORDER);
                if (ret)
                        break;
        }
Simple merge
Simple merge
Simple merge
@@@ -358,7 -358,8 +358,8 @@@ struct drm_i915_op_arg 
  struct drm_i915_execbuffer {
        uint64_t ops_list;
        uint32_t num_buffers;
 -      struct _drm_i915_batchbuffer batch;
 +      struct drm_i915_batchbuffer batch;
+       drm_context_t context; /* for lockless use in the future */
        struct drm_fence_arg fence_arg;
  };
  
@@@ -330,13 -318,8 +331,14 @@@ void i915_flush_ttm(struct drm_ttm *ttm
  extern void intel_init_chipset_flush_compat(struct drm_device *dev);
  extern void intel_fini_chipset_flush_compat(struct drm_device *dev);
  #endif
+ #endif
  
 +
 +/* modesetting */
 +extern void intel_modeset_init(struct drm_device *dev);
 +extern void intel_modeset_cleanup(struct drm_device *dev);
 +
 +
  #define I915_READ(reg)          DRM_READ32(dev_priv->mmio_map, (reg))
  #define I915_WRITE(reg,val)     DRM_WRITE32(dev_priv->mmio_map, (reg), (val))
  #define I915_READ16(reg)      DRM_READ16(dev_priv->mmio_map, (reg))
Simple merge
Simple merge
@@@ -351,7 -345,7 +351,8 @@@ extern int radeon_cp_resume(struct drm_
  extern int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
  extern int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv);
  extern int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern void radeon_gart_flush(struct drm_device *dev);
+ extern u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv);
  
  extern void radeon_freelist_reset(struct drm_device * dev);
  extern struct drm_buf *radeon_freelist_get(struct drm_device * dev);
@@@ -402,32 -395,8 +403,32 @@@ extern void r300_init_reg_flags(void)
  
  extern int r300_do_cp_cmdbuf(struct drm_device *dev,
                             struct drm_file *file_priv,
-                            drm_radeon_kcmd_buffer_tcmdbuf);
+                            drm_radeon_kcmd_buffer_t *cmdbuf);
  
 +
 +#ifdef RADEON_HAVE_FENCE
 +/* i915_fence.c */
 +
 +
 +extern void radeon_fence_handler(struct drm_device *dev);
 +extern int radeon_fence_emit_sequence(struct drm_device *dev, uint32_t class,
 +                                    uint32_t flags, uint32_t *sequence, 
 +                                  uint32_t *native_type);
 +extern void radeon_poke_flush(struct drm_device *dev, uint32_t class);
 +extern int radeon_fence_has_irq(struct drm_device *dev, uint32_t class, uint32_t flags);
 +#endif
 +
 +#ifdef RADEON_HAVE_BUFFER
 +/* radeon_buffer.c */
 +extern struct drm_ttm_backend *radeon_create_ttm_backend_entry(struct drm_device *dev);
 +extern int radeon_fence_types(struct drm_buffer_object *bo, uint32_t *class, uint32_t *type);
 +extern int radeon_invalidate_caches(struct drm_device *dev, uint64_t buffer_flags);
 +extern uint32_t radeon_evict_mask(struct drm_buffer_object *bo);
 +extern int radeon_init_mem_type(struct drm_device * dev, uint32_t type,
 +                              struct drm_mem_type_manager * man);
 +extern int radeon_move(struct drm_buffer_object * bo,
 +                     int evict, int no_wait, struct drm_bo_mem_reg * new_mem);
 +#endif
  /* Flags for stats.boxes
   */
  #define RADEON_BOX_DMA_IDLE      0x1
Simple merge