Simplify pci map vs no pci map choice.

main
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_NEEDS_IOREMAP 0x00000008 /* Fixed memory needs ioremap
before kernel access. */
#define _DRM_FLAG_MEMTYPE_CMA 0x00000010 /* Can't map aperture */
typedef struct drm_mem_type_manager {
int has_type;
@ -1037,9 +1038,9 @@ typedef struct drm_buffer_object{
/* For vm */
drm_ttm_t *ttm;
drm_map_list_t map_list;
uint32_t memory_type;
drm_ttm_t *ttm;
unsigned long bus_offset;
uint32_t vm_flags;
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_bo_driver_finish(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_offset,
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 int drm_fence_buffer_objects(drm_file_t * priv,
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->bridge = dev->agp->bridge;
agp_priv->populated = FALSE;
agp_be->aperture_base = dev->agp->agp_info.aper_base;
agp_be->private = (void *) agp_priv;
agp_be->needs_ub_cache_adjust = drm_agp_needs_unbind_cache_adjust;
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;
DRM_MASK_VAL(agp_be->flags, DRM_BE_FLAG_NEEDS_FREE,
(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;
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))
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_FLAG_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.
*/
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.
*
@ -2174,48 +2194,32 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)
* \return Failure indication.
*
* 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_offset,
unsigned long *bus_size)
{
drm_device_t *dev = bo->dev;
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;
if (bo->type != drm_bo_type_dc)
return -EINVAL;
if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE))
return -EINVAL;
if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) {
drm_ttm_t *ttm = bo->ttm;
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 {
if (drm_mem_reg_is_pci(dev, mem)) {
*bus_offset = mem->mm_node->start << PAGE_SHIFT;
*bus_size = mem->num_pages << PAGE_SHIFT;
*bus_base = man->io_offset;
}
*bus_offset = bo->mem.mm_node->start << PAGE_SHIFT;
*bus_size = bo->mem.num_pages << PAGE_SHIFT;
return 0;
}
/**
* \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.
*/
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_buffer_manager_t *bm = &dev->bm;
@ -2281,6 +2286,7 @@ void drm_bo_iounmap(drm_buffer_object_t *bo)
bo->iomap = NULL;
}
#endif
/**
* \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_buffer_manager_t *bm;
drm_device_t *dev;
unsigned long bus_base;
unsigned long bus_offset;
unsigned long bus_size;
int err;
mutex_lock(&bo->mutex);
@ -238,14 +234,8 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
}
dev = bo->dev;
err = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size);
if (err) {
page = NOPAGE_SIGBUS;
goto out_unlock;
}
if (bus_size != 0) {
if (drm_mem_reg_is_pci(dev, &bo->mem)) {
DRM_ERROR("Invalid compat nopage.\n");
page = NOPAGE_SIGBUS;
goto out_unlock;
@ -253,6 +243,7 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
bm = &dev->bm;
ttm = bo->ttm;
drm_ttm_fixup_caching(ttm);
page_offset = (address - vma->vm_start) >> PAGE_SHIFT;
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_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);
if (bus_size) {
@ -415,14 +407,8 @@ int drm_bo_remap_bound(drm_buffer_object_t *bo)
{
vma_entry_t *v_entry;
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);
BUG_ON(ret);
if (bus_size) {
if (drm_mem_reg_is_pci(bo->dev, &bo->mem)) {
list_for_each_entry(v_entry, &bo->vma_list, head) {
ret = drm_bo_map_bound(v_entry->vma);
if (ret)

View File

@ -46,10 +46,8 @@
#define DRM_BE_FLAG_NEEDS_FREE 0x00000001
#define DRM_BE_FLAG_BOUND_CACHED 0x00000002
#define DRM_BE_FLAG_CMA 0x00000004 /* Don't map through aperture */
typedef struct drm_ttm_backend {
unsigned long aperture_base;
void *private;
uint32_t flags;
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;
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) {
data->type = VM_FAULT_SIGBUS;
@ -770,6 +771,7 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma,
bm = &dev->bm;
ttm = bo->ttm;
drm_ttm_fixup_caching(ttm);
page = ttm->pages[page_offset];
if (!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) {
case DRM_BO_MEM_LOCAL:
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 |
_DRM_FLAG_MEMTYPE_CACHED;
_DRM_FLAG_MEMTYPE_CACHED |
_DRM_FLAG_NEEDS_IOREMAP;
break;
case DRM_BO_MEM_PRIV0:
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_size = dev->agp->agp_info.aper_size * 1024 * 1024;
man->io_addr = NULL;
man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
_DRM_FLAG_MEMTYPE_CACHED |
_DRM_FLAG_MEMTYPE_FIXED |
_DRM_FLAG_NEEDS_IOREMAP;
man->io_addr = NULL;
break;
default:
DRM_ERROR("Unsupported memory type %u\n", (unsigned) type);