Simplify pci map vs no pci map choice.

This commit is contained in:
Thomas Hellstrom 2007-02-06 16:59:45 +01:00
parent 40ce53dfde
commit 71b9e876f9
7 changed files with 58 additions and 57 deletions

View file

@ -655,6 +655,7 @@ typedef struct drm_ref_object {
#define _DRM_FLAG_MEMTYPE_CACHED 0x00000004 /* Supports cached binding */ #define _DRM_FLAG_MEMTYPE_CACHED 0x00000004 /* Supports cached binding */
#define _DRM_FLAG_NEEDS_IOREMAP 0x00000008 /* Fixed memory needs ioremap #define _DRM_FLAG_NEEDS_IOREMAP 0x00000008 /* Fixed memory needs ioremap
before kernel access. */ before kernel access. */
#define _DRM_FLAG_MEMTYPE_CMA 0x00000010 /* Can't map aperture */
typedef struct drm_mem_type_manager { typedef struct drm_mem_type_manager {
int has_type; int has_type;
@ -1037,9 +1038,9 @@ typedef struct drm_buffer_object{
/* For vm */ /* For vm */
drm_ttm_t *ttm;
drm_map_list_t map_list; drm_map_list_t map_list;
uint32_t memory_type; uint32_t memory_type;
drm_ttm_t *ttm;
unsigned long bus_offset; unsigned long bus_offset;
uint32_t vm_flags; uint32_t vm_flags;
void *iomap; void *iomap;
@ -1491,10 +1492,14 @@ extern int drm_bo_ioctl(DRM_IOCTL_ARGS);
extern int drm_mm_init_ioctl(DRM_IOCTL_ARGS); extern int drm_mm_init_ioctl(DRM_IOCTL_ARGS);
extern int drm_bo_driver_finish(drm_device_t *dev); extern int drm_bo_driver_finish(drm_device_t *dev);
extern int drm_bo_driver_init(drm_device_t *dev); extern int drm_bo_driver_init(drm_device_t *dev);
extern int drm_bo_pci_offset(const drm_buffer_object_t *bo, extern int drm_bo_pci_offset(drm_device_t *dev,
drm_bo_mem_reg_t *mem,
unsigned long *bus_base, unsigned long *bus_base,
unsigned long *bus_offset, unsigned long *bus_offset,
unsigned long *bus_size); unsigned long *bus_size);
extern int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem);
extern void drm_bo_usage_deref_locked(drm_buffer_object_t * bo); extern void drm_bo_usage_deref_locked(drm_buffer_object_t * bo);
extern int drm_fence_buffer_objects(drm_file_t * priv, extern int drm_fence_buffer_objects(drm_file_t * priv,
struct list_head *list, struct list_head *list,

View file

@ -710,7 +710,6 @@ drm_ttm_backend_t *drm_agp_init_ttm(struct drm_device *dev,
agp_priv->uncached_type = AGP_USER_MEMORY; agp_priv->uncached_type = AGP_USER_MEMORY;
agp_priv->bridge = dev->agp->bridge; agp_priv->bridge = dev->agp->bridge;
agp_priv->populated = FALSE; agp_priv->populated = FALSE;
agp_be->aperture_base = dev->agp->agp_info.aper_base;
agp_be->private = (void *) agp_priv; agp_be->private = (void *) agp_priv;
agp_be->needs_ub_cache_adjust = drm_agp_needs_unbind_cache_adjust; agp_be->needs_ub_cache_adjust = drm_agp_needs_unbind_cache_adjust;
agp_be->populate = drm_agp_populate; agp_be->populate = drm_agp_populate;
@ -720,8 +719,6 @@ drm_ttm_backend_t *drm_agp_init_ttm(struct drm_device *dev,
agp_be->destroy = drm_agp_destroy_ttm; agp_be->destroy = drm_agp_destroy_ttm;
DRM_MASK_VAL(agp_be->flags, DRM_BE_FLAG_NEEDS_FREE, DRM_MASK_VAL(agp_be->flags, DRM_BE_FLAG_NEEDS_FREE,
(backend == NULL) ? DRM_BE_FLAG_NEEDS_FREE : 0); (backend == NULL) ? DRM_BE_FLAG_NEEDS_FREE : 0);
DRM_MASK_VAL(agp_be->flags, DRM_BE_FLAG_CMA,
(dev->agp->cant_use_aperture) ? DRM_BE_FLAG_CMA : 0);
agp_be->drm_map_type = _DRM_AGP; agp_be->drm_map_type = _DRM_AGP;
return agp_be; return agp_be;
} }

View file

@ -718,7 +718,7 @@ static int drm_move_local_to_tt(drm_buffer_object_t * bo,
} }
if (!(bo->mem.flags & DRM_BO_FLAG_BIND_CACHED)) if (!(bo->mem.flags & DRM_BO_FLAG_BIND_CACHED))
bo->mem.flags &= DRM_BO_FLAG_CACHED; bo->mem.flags &= ~DRM_BO_FLAG_CACHED;
bo->mem.flags &= ~DRM_BO_MASK_MEM; bo->mem.flags &= ~DRM_BO_MASK_MEM;
bo->mem.flags |= DRM_BO_FLAG_MEM_TT; bo->mem.flags |= DRM_BO_FLAG_MEM_TT;
bo->mem.mem_type = DRM_BO_MEM_TT; bo->mem.mem_type = DRM_BO_MEM_TT;
@ -2163,6 +2163,26 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)
* buffer object vm functions. * buffer object vm functions.
*/ */
int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem)
{
drm_buffer_manager_t *bm = &dev->bm;
drm_mem_type_manager_t *man = &bm->man[mem->mem_type];
if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) {
if (mem->mem_type == DRM_BO_MEM_LOCAL)
return 0;
if (man->flags & _DRM_FLAG_MEMTYPE_CMA)
return 0;
if ((mem->mask & DRM_BO_FLAG_BIND_CACHED) &&
(man->flags & _DRM_FLAG_MEMTYPE_CACHED))
return 0;
}
return 1;
}
EXPORT_SYMBOL(drm_mem_reg_is_pci);
/** /**
* \c Get the PCI offset for the buffer object memory. * \c Get the PCI offset for the buffer object memory.
* *
@ -2174,48 +2194,32 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)
* \return Failure indication. * \return Failure indication.
* *
* Returns -EINVAL if the buffer object is currently not mappable. * Returns -EINVAL if the buffer object is currently not mappable.
* Otherwise returns zero. Call bo->mutex locked. * Otherwise returns zero.
*/ */
int drm_bo_pci_offset(const drm_buffer_object_t *bo, int drm_bo_pci_offset(drm_device_t *dev,
drm_bo_mem_reg_t *mem,
unsigned long *bus_base, unsigned long *bus_base,
unsigned long *bus_offset, unsigned long *bus_offset,
unsigned long *bus_size) unsigned long *bus_size)
{ {
drm_device_t *dev = bo->dev;
drm_buffer_manager_t *bm = &dev->bm; drm_buffer_manager_t *bm = &dev->bm;
drm_mem_type_manager_t *man = &bm->man[bo->mem.mem_type]; drm_mem_type_manager_t *man = &bm->man[mem->mem_type];
*bus_size = 0; *bus_size = 0;
if (bo->type != drm_bo_type_dc)
return -EINVAL;
if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE)) if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE))
return -EINVAL; return -EINVAL;
if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) { if (drm_mem_reg_is_pci(dev, mem)) {
drm_ttm_t *ttm = bo->ttm; *bus_offset = mem->mm_node->start << PAGE_SHIFT;
*bus_size = mem->num_pages << PAGE_SHIFT;
if (!bo->ttm) {
return -EINVAL;
}
drm_ttm_fixup_caching(ttm);
if (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED))
return 0;
if (ttm->be->flags & DRM_BE_FLAG_CMA)
return 0;
*bus_base = ttm->be->aperture_base;
} else {
*bus_base = man->io_offset; *bus_base = man->io_offset;
} }
*bus_offset = bo->mem.mm_node->start << PAGE_SHIFT;
*bus_size = bo->mem.num_pages << PAGE_SHIFT;
return 0; return 0;
} }
/** /**
* \c Return a kernel virtual address to the buffer object PCI memory. * \c Return a kernel virtual address to the buffer object PCI memory.
* *
@ -2231,7 +2235,8 @@ int drm_bo_pci_offset(const drm_buffer_object_t *bo,
* Call bo->mutex locked. * Call bo->mutex locked.
*/ */
int drm_bo_ioremap(drm_buffer_object_t *bo) #if 0
int drm_mem_reg_ioremap(drm_bo_mem_reg_t *mem)
{ {
drm_device_t *dev = bo->dev; drm_device_t *dev = bo->dev;
drm_buffer_manager_t *bm = &dev->bm; drm_buffer_manager_t *bm = &dev->bm;
@ -2281,6 +2286,7 @@ void drm_bo_iounmap(drm_buffer_object_t *bo)
bo->iomap = NULL; bo->iomap = NULL;
} }
#endif
/** /**
* \c Kill all user-space virtual mappings of this buffer object. * \c Kill all user-space virtual mappings of this buffer object.

View file

@ -222,10 +222,6 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
drm_ttm_t *ttm; drm_ttm_t *ttm;
drm_buffer_manager_t *bm; drm_buffer_manager_t *bm;
drm_device_t *dev; drm_device_t *dev;
unsigned long bus_base;
unsigned long bus_offset;
unsigned long bus_size;
int err;
mutex_lock(&bo->mutex); mutex_lock(&bo->mutex);
@ -238,14 +234,8 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
} }
dev = bo->dev; dev = bo->dev;
err = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size);
if (err) { if (drm_mem_reg_is_pci(dev, &bo->mem)) {
page = NOPAGE_SIGBUS;
goto out_unlock;
}
if (bus_size != 0) {
DRM_ERROR("Invalid compat nopage.\n"); DRM_ERROR("Invalid compat nopage.\n");
page = NOPAGE_SIGBUS; page = NOPAGE_SIGBUS;
goto out_unlock; goto out_unlock;
@ -253,6 +243,7 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
bm = &dev->bm; bm = &dev->bm;
ttm = bo->ttm; ttm = bo->ttm;
drm_ttm_fixup_caching(ttm);
page_offset = (address - vma->vm_start) >> PAGE_SHIFT; page_offset = (address - vma->vm_start) >> PAGE_SHIFT;
page = ttm->pages[page_offset]; page = ttm->pages[page_offset];
@ -284,7 +275,8 @@ int drm_bo_map_bound(struct vm_area_struct *vma)
unsigned long bus_offset; unsigned long bus_offset;
unsigned long bus_size; unsigned long bus_size;
ret = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size); ret = drm_bo_pci_offset(bo->dev, &bo->mem, &bus_base,
&bus_offset, &bus_size);
BUG_ON(ret); BUG_ON(ret);
if (bus_size) { if (bus_size) {
@ -415,14 +407,8 @@ int drm_bo_remap_bound(drm_buffer_object_t *bo)
{ {
vma_entry_t *v_entry; vma_entry_t *v_entry;
int ret = 0; int ret = 0;
unsigned long bus_base;
unsigned long bus_offset;
unsigned long bus_size;
ret = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size); if (drm_mem_reg_is_pci(bo->dev, &bo->mem)) {
BUG_ON(ret);
if (bus_size) {
list_for_each_entry(v_entry, &bo->vma_list, head) { list_for_each_entry(v_entry, &bo->vma_list, head) {
ret = drm_bo_map_bound(v_entry->vma); ret = drm_bo_map_bound(v_entry->vma);
if (ret) if (ret)

View file

@ -46,10 +46,8 @@
#define DRM_BE_FLAG_NEEDS_FREE 0x00000001 #define DRM_BE_FLAG_NEEDS_FREE 0x00000001
#define DRM_BE_FLAG_BOUND_CACHED 0x00000002 #define DRM_BE_FLAG_BOUND_CACHED 0x00000002
#define DRM_BE_FLAG_CMA 0x00000004 /* Don't map through aperture */
typedef struct drm_ttm_backend { typedef struct drm_ttm_backend {
unsigned long aperture_base;
void *private; void *private;
uint32_t flags; uint32_t flags;
uint32_t drm_map_type; uint32_t drm_map_type;

View file

@ -754,7 +754,8 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma,
} }
dev = bo->dev; dev = bo->dev;
err = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size); err = drm_bo_pci_offset(dev, &bo->mem, &bus_base, &bus_offset,
&bus_size);
if (err) { if (err) {
data->type = VM_FAULT_SIGBUS; data->type = VM_FAULT_SIGBUS;
@ -770,6 +771,7 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma,
bm = &dev->bm; bm = &dev->bm;
ttm = bo->ttm; ttm = bo->ttm;
drm_ttm_fixup_caching(ttm);
page = ttm->pages[page_offset]; page = ttm->pages[page_offset];
if (!page) { if (!page) {
page = drm_ttm_alloc_page(); page = drm_ttm_alloc_page();

View file

@ -71,8 +71,17 @@ int i915_init_mem_type(drm_device_t *dev, uint32_t type,
switch(type) { switch(type) {
case DRM_BO_MEM_LOCAL: case DRM_BO_MEM_LOCAL:
case DRM_BO_MEM_TT: case DRM_BO_MEM_TT:
if (!(drm_core_has_AGP(dev) && dev->agp)) {
DRM_ERROR("AGP is not enabled for memory type %u\n",
(unsigned) type);
return -EINVAL;
}
man->io_offset = dev->agp->agp_info.aper_base;
man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024;
man->io_addr = NULL;
man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
_DRM_FLAG_MEMTYPE_CACHED; _DRM_FLAG_MEMTYPE_CACHED |
_DRM_FLAG_NEEDS_IOREMAP;
break; break;
case DRM_BO_MEM_PRIV0: case DRM_BO_MEM_PRIV0:
if (!(drm_core_has_AGP(dev) && dev->agp)) { if (!(drm_core_has_AGP(dev) && dev->agp)) {
@ -82,13 +91,11 @@ int i915_init_mem_type(drm_device_t *dev, uint32_t type,
} }
man->io_offset = dev->agp->agp_info.aper_base; man->io_offset = dev->agp->agp_info.aper_base;
man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024; man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024;
man->io_addr = NULL;
man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
_DRM_FLAG_MEMTYPE_CACHED |
_DRM_FLAG_MEMTYPE_FIXED | _DRM_FLAG_MEMTYPE_FIXED |
_DRM_FLAG_NEEDS_IOREMAP; _DRM_FLAG_NEEDS_IOREMAP;
man->io_addr = NULL;
break; break;
default: default:
DRM_ERROR("Unsupported memory type %u\n", (unsigned) type); DRM_ERROR("Unsupported memory type %u\n", (unsigned) type);