diff options
Diffstat (limited to 'drivers/gpu')
62 files changed, 1158 insertions, 740 deletions
diff --git a/drivers/gpu/drm/drm_agpsupport.c b/drivers/gpu/drm/drm_agpsupport.c index 14796594e5d9..d68888fe3df9 100644 --- a/drivers/gpu/drm/drm_agpsupport.c +++ b/drivers/gpu/drm/drm_agpsupport.c | |||
| @@ -203,7 +203,7 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request) | |||
| 203 | 203 | ||
| 204 | if (!dev->agp || !dev->agp->acquired) | 204 | if (!dev->agp || !dev->agp->acquired) |
| 205 | return -EINVAL; | 205 | return -EINVAL; |
| 206 | if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS))) | 206 | if (!(entry = kmalloc(sizeof(*entry), GFP_KERNEL))) |
| 207 | return -ENOMEM; | 207 | return -ENOMEM; |
| 208 | 208 | ||
| 209 | memset(entry, 0, sizeof(*entry)); | 209 | memset(entry, 0, sizeof(*entry)); |
| @@ -211,7 +211,7 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request) | |||
| 211 | pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE; | 211 | pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE; |
| 212 | type = (u32) request->type; | 212 | type = (u32) request->type; |
| 213 | if (!(memory = drm_alloc_agp(dev, pages, type))) { | 213 | if (!(memory = drm_alloc_agp(dev, pages, type))) { |
| 214 | drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); | 214 | kfree(entry); |
| 215 | return -ENOMEM; | 215 | return -ENOMEM; |
| 216 | } | 216 | } |
| 217 | 217 | ||
| @@ -369,7 +369,7 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request) | |||
| 369 | list_del(&entry->head); | 369 | list_del(&entry->head); |
| 370 | 370 | ||
| 371 | drm_free_agp(entry->memory, entry->pages); | 371 | drm_free_agp(entry->memory, entry->pages); |
| 372 | drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); | 372 | kfree(entry); |
| 373 | return 0; | 373 | return 0; |
| 374 | } | 374 | } |
| 375 | EXPORT_SYMBOL(drm_agp_free); | 375 | EXPORT_SYMBOL(drm_agp_free); |
| @@ -397,13 +397,13 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev) | |||
| 397 | { | 397 | { |
| 398 | struct drm_agp_head *head = NULL; | 398 | struct drm_agp_head *head = NULL; |
| 399 | 399 | ||
| 400 | if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS))) | 400 | if (!(head = kmalloc(sizeof(*head), GFP_KERNEL))) |
| 401 | return NULL; | 401 | return NULL; |
| 402 | memset((void *)head, 0, sizeof(*head)); | 402 | memset((void *)head, 0, sizeof(*head)); |
| 403 | head->bridge = agp_find_bridge(dev->pdev); | 403 | head->bridge = agp_find_bridge(dev->pdev); |
| 404 | if (!head->bridge) { | 404 | if (!head->bridge) { |
| 405 | if (!(head->bridge = agp_backend_acquire(dev->pdev))) { | 405 | if (!(head->bridge = agp_backend_acquire(dev->pdev))) { |
| 406 | drm_free(head, sizeof(*head), DRM_MEM_AGPLISTS); | 406 | kfree(head); |
| 407 | return NULL; | 407 | return NULL; |
| 408 | } | 408 | } |
| 409 | agp_copy_info(head->bridge, &head->agp_info); | 409 | agp_copy_info(head->bridge, &head->agp_info); |
| @@ -412,7 +412,7 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev) | |||
| 412 | agp_copy_info(head->bridge, &head->agp_info); | 412 | agp_copy_info(head->bridge, &head->agp_info); |
| 413 | } | 413 | } |
| 414 | if (head->agp_info.chipset == NOT_SUPPORTED) { | 414 | if (head->agp_info.chipset == NOT_SUPPORTED) { |
| 415 | drm_free(head, sizeof(*head), DRM_MEM_AGPLISTS); | 415 | kfree(head); |
| 416 | return NULL; | 416 | return NULL; |
| 417 | } | 417 | } |
| 418 | INIT_LIST_HEAD(&head->memory); | 418 | INIT_LIST_HEAD(&head->memory); |
| @@ -482,7 +482,7 @@ drm_agp_bind_pages(struct drm_device *dev, | |||
| 482 | } | 482 | } |
| 483 | 483 | ||
| 484 | for (i = 0; i < num_pages; i++) | 484 | for (i = 0; i < num_pages; i++) |
| 485 | mem->memory[i] = phys_to_gart(page_to_phys(pages[i])); | 485 | mem->pages[i] = pages[i]; |
| 486 | mem->page_count = num_pages; | 486 | mem->page_count = num_pages; |
| 487 | 487 | ||
| 488 | mem->is_flushed = true; | 488 | mem->is_flushed = true; |
diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c index ca7a9ef5007b..932b5aa96a67 100644 --- a/drivers/gpu/drm/drm_auth.c +++ b/drivers/gpu/drm/drm_auth.c | |||
| @@ -79,7 +79,7 @@ static int drm_add_magic(struct drm_master *master, struct drm_file *priv, | |||
| 79 | struct drm_device *dev = master->minor->dev; | 79 | struct drm_device *dev = master->minor->dev; |
| 80 | DRM_DEBUG("%d\n", magic); | 80 | DRM_DEBUG("%d\n", magic); |
| 81 | 81 | ||
| 82 | entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC); | 82 | entry = kmalloc(sizeof(*entry), GFP_KERNEL); |
| 83 | if (!entry) | 83 | if (!entry) |
| 84 | return -ENOMEM; | 84 | return -ENOMEM; |
| 85 | memset(entry, 0, sizeof(*entry)); | 85 | memset(entry, 0, sizeof(*entry)); |
| @@ -120,7 +120,7 @@ static int drm_remove_magic(struct drm_master *master, drm_magic_t magic) | |||
| 120 | list_del(&pt->head); | 120 | list_del(&pt->head); |
| 121 | mutex_unlock(&dev->struct_mutex); | 121 | mutex_unlock(&dev->struct_mutex); |
| 122 | 122 | ||
| 123 | drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); | 123 | kfree(pt); |
| 124 | 124 | ||
| 125 | return 0; | 125 | return 0; |
| 126 | } | 126 | } |
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c index 80a257554b30..6246e3f3dad7 100644 --- a/drivers/gpu/drm/drm_bufs.c +++ b/drivers/gpu/drm/drm_bufs.c | |||
| @@ -151,7 +151,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 151 | unsigned long user_token; | 151 | unsigned long user_token; |
| 152 | int ret; | 152 | int ret; |
| 153 | 153 | ||
| 154 | map = drm_alloc(sizeof(*map), DRM_MEM_MAPS); | 154 | map = kmalloc(sizeof(*map), GFP_KERNEL); |
| 155 | if (!map) | 155 | if (!map) |
| 156 | return -ENOMEM; | 156 | return -ENOMEM; |
| 157 | 157 | ||
| @@ -165,7 +165,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 165 | * when processes fork. | 165 | * when processes fork. |
| 166 | */ | 166 | */ |
| 167 | if ((map->flags & _DRM_REMOVABLE) && map->type != _DRM_SHM) { | 167 | if ((map->flags & _DRM_REMOVABLE) && map->type != _DRM_SHM) { |
| 168 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 168 | kfree(map); |
| 169 | return -EINVAL; | 169 | return -EINVAL; |
| 170 | } | 170 | } |
| 171 | DRM_DEBUG("offset = 0x%08llx, size = 0x%08lx, type = %d\n", | 171 | DRM_DEBUG("offset = 0x%08llx, size = 0x%08lx, type = %d\n", |
| @@ -179,7 +179,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 179 | map->size = PAGE_ALIGN(map->size); | 179 | map->size = PAGE_ALIGN(map->size); |
| 180 | 180 | ||
| 181 | if ((map->offset & (~(resource_size_t)PAGE_MASK)) || (map->size & (~PAGE_MASK))) { | 181 | if ((map->offset & (~(resource_size_t)PAGE_MASK)) || (map->size & (~PAGE_MASK))) { |
| 182 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 182 | kfree(map); |
| 183 | return -EINVAL; | 183 | return -EINVAL; |
| 184 | } | 184 | } |
| 185 | map->mtrr = -1; | 185 | map->mtrr = -1; |
| @@ -191,7 +191,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 191 | #if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__) && !defined(__powerpc64__) && !defined(__x86_64__) | 191 | #if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__) && !defined(__powerpc64__) && !defined(__x86_64__) |
| 192 | if (map->offset + (map->size-1) < map->offset || | 192 | if (map->offset + (map->size-1) < map->offset || |
| 193 | map->offset < virt_to_phys(high_memory)) { | 193 | map->offset < virt_to_phys(high_memory)) { |
| 194 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 194 | kfree(map); |
| 195 | return -EINVAL; | 195 | return -EINVAL; |
| 196 | } | 196 | } |
| 197 | #endif | 197 | #endif |
| @@ -212,7 +212,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 212 | list->map->size = map->size; | 212 | list->map->size = map->size; |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 215 | kfree(map); |
| 216 | *maplist = list; | 216 | *maplist = list; |
| 217 | return 0; | 217 | return 0; |
| 218 | } | 218 | } |
| @@ -227,7 +227,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 227 | if (map->type == _DRM_REGISTERS) { | 227 | if (map->type == _DRM_REGISTERS) { |
| 228 | map->handle = ioremap(map->offset, map->size); | 228 | map->handle = ioremap(map->offset, map->size); |
| 229 | if (!map->handle) { | 229 | if (!map->handle) { |
| 230 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 230 | kfree(map); |
| 231 | return -ENOMEM; | 231 | return -ENOMEM; |
| 232 | } | 232 | } |
| 233 | } | 233 | } |
| @@ -243,7 +243,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 243 | list->map->size = map->size; | 243 | list->map->size = map->size; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 246 | kfree(map); |
| 247 | *maplist = list; | 247 | *maplist = list; |
| 248 | return 0; | 248 | return 0; |
| 249 | } | 249 | } |
| @@ -251,7 +251,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 251 | DRM_DEBUG("%lu %d %p\n", | 251 | DRM_DEBUG("%lu %d %p\n", |
| 252 | map->size, drm_order(map->size), map->handle); | 252 | map->size, drm_order(map->size), map->handle); |
| 253 | if (!map->handle) { | 253 | if (!map->handle) { |
| 254 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 254 | kfree(map); |
| 255 | return -ENOMEM; | 255 | return -ENOMEM; |
| 256 | } | 256 | } |
| 257 | map->offset = (unsigned long)map->handle; | 257 | map->offset = (unsigned long)map->handle; |
| @@ -259,7 +259,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 259 | /* Prevent a 2nd X Server from creating a 2nd lock */ | 259 | /* Prevent a 2nd X Server from creating a 2nd lock */ |
| 260 | if (dev->primary->master->lock.hw_lock != NULL) { | 260 | if (dev->primary->master->lock.hw_lock != NULL) { |
| 261 | vfree(map->handle); | 261 | vfree(map->handle); |
| 262 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 262 | kfree(map); |
| 263 | return -EBUSY; | 263 | return -EBUSY; |
| 264 | } | 264 | } |
| 265 | dev->sigdata.lock = dev->primary->master->lock.hw_lock = map->handle; /* Pointer to lock */ | 265 | dev->sigdata.lock = dev->primary->master->lock.hw_lock = map->handle; /* Pointer to lock */ |
| @@ -270,7 +270,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 270 | int valid = 0; | 270 | int valid = 0; |
| 271 | 271 | ||
| 272 | if (!drm_core_has_AGP(dev)) { | 272 | if (!drm_core_has_AGP(dev)) { |
| 273 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 273 | kfree(map); |
| 274 | return -EINVAL; | 274 | return -EINVAL; |
| 275 | } | 275 | } |
| 276 | #ifdef __alpha__ | 276 | #ifdef __alpha__ |
| @@ -303,7 +303,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 303 | } | 303 | } |
| 304 | } | 304 | } |
| 305 | if (!list_empty(&dev->agp->memory) && !valid) { | 305 | if (!list_empty(&dev->agp->memory) && !valid) { |
| 306 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 306 | kfree(map); |
| 307 | return -EPERM; | 307 | return -EPERM; |
| 308 | } | 308 | } |
| 309 | DRM_DEBUG("AGP offset = 0x%08llx, size = 0x%08lx\n", | 309 | DRM_DEBUG("AGP offset = 0x%08llx, size = 0x%08lx\n", |
| @@ -316,7 +316,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 316 | } | 316 | } |
| 317 | case _DRM_SCATTER_GATHER: | 317 | case _DRM_SCATTER_GATHER: |
| 318 | if (!dev->sg) { | 318 | if (!dev->sg) { |
| 319 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 319 | kfree(map); |
| 320 | return -EINVAL; | 320 | return -EINVAL; |
| 321 | } | 321 | } |
| 322 | map->offset += (unsigned long)dev->sg->virtual; | 322 | map->offset += (unsigned long)dev->sg->virtual; |
| @@ -328,7 +328,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 328 | * need to point to a 64bit variable first. */ | 328 | * need to point to a 64bit variable first. */ |
| 329 | dmah = drm_pci_alloc(dev, map->size, map->size, 0xffffffffUL); | 329 | dmah = drm_pci_alloc(dev, map->size, map->size, 0xffffffffUL); |
| 330 | if (!dmah) { | 330 | if (!dmah) { |
| 331 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 331 | kfree(map); |
| 332 | return -ENOMEM; | 332 | return -ENOMEM; |
| 333 | } | 333 | } |
| 334 | map->handle = dmah->vaddr; | 334 | map->handle = dmah->vaddr; |
| @@ -336,15 +336,15 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 336 | kfree(dmah); | 336 | kfree(dmah); |
| 337 | break; | 337 | break; |
| 338 | default: | 338 | default: |
| 339 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 339 | kfree(map); |
| 340 | return -EINVAL; | 340 | return -EINVAL; |
| 341 | } | 341 | } |
| 342 | 342 | ||
| 343 | list = drm_alloc(sizeof(*list), DRM_MEM_MAPS); | 343 | list = kmalloc(sizeof(*list), GFP_KERNEL); |
| 344 | if (!list) { | 344 | if (!list) { |
| 345 | if (map->type == _DRM_REGISTERS) | 345 | if (map->type == _DRM_REGISTERS) |
| 346 | iounmap(map->handle); | 346 | iounmap(map->handle); |
| 347 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 347 | kfree(map); |
| 348 | return -EINVAL; | 348 | return -EINVAL; |
| 349 | } | 349 | } |
| 350 | memset(list, 0, sizeof(*list)); | 350 | memset(list, 0, sizeof(*list)); |
| @@ -362,8 +362,8 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, | |||
| 362 | if (ret) { | 362 | if (ret) { |
| 363 | if (map->type == _DRM_REGISTERS) | 363 | if (map->type == _DRM_REGISTERS) |
| 364 | iounmap(map->handle); | 364 | iounmap(map->handle); |
| 365 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 365 | kfree(map); |
| 366 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); | 366 | kfree(list); |
| 367 | mutex_unlock(&dev->struct_mutex); | 367 | mutex_unlock(&dev->struct_mutex); |
| 368 | return ret; | 368 | return ret; |
| 369 | } | 369 | } |
| @@ -448,7 +448,7 @@ int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map) | |||
| 448 | list_del(&r_list->head); | 448 | list_del(&r_list->head); |
| 449 | drm_ht_remove_key(&dev->map_hash, | 449 | drm_ht_remove_key(&dev->map_hash, |
| 450 | r_list->user_token >> PAGE_SHIFT); | 450 | r_list->user_token >> PAGE_SHIFT); |
| 451 | drm_free(r_list, sizeof(*r_list), DRM_MEM_MAPS); | 451 | kfree(r_list); |
| 452 | found = 1; | 452 | found = 1; |
| 453 | break; | 453 | break; |
| 454 | } | 454 | } |
| @@ -491,7 +491,7 @@ int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map) | |||
| 491 | DRM_ERROR("tried to rmmap GEM object\n"); | 491 | DRM_ERROR("tried to rmmap GEM object\n"); |
| 492 | break; | 492 | break; |
| 493 | } | 493 | } |
| 494 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 494 | kfree(map); |
| 495 | 495 | ||
| 496 | return 0; | 496 | return 0; |
| 497 | } | 497 | } |
| @@ -582,24 +582,16 @@ static void drm_cleanup_buf_error(struct drm_device * dev, | |||
| 582 | drm_pci_free(dev, entry->seglist[i]); | 582 | drm_pci_free(dev, entry->seglist[i]); |
| 583 | } | 583 | } |
| 584 | } | 584 | } |
| 585 | drm_free(entry->seglist, | 585 | kfree(entry->seglist); |
| 586 | entry->seg_count * | ||
| 587 | sizeof(*entry->seglist), DRM_MEM_SEGS); | ||
| 588 | 586 | ||
| 589 | entry->seg_count = 0; | 587 | entry->seg_count = 0; |
| 590 | } | 588 | } |
| 591 | 589 | ||
| 592 | if (entry->buf_count) { | 590 | if (entry->buf_count) { |
| 593 | for (i = 0; i < entry->buf_count; i++) { | 591 | for (i = 0; i < entry->buf_count; i++) { |
| 594 | if (entry->buflist[i].dev_private) { | 592 | kfree(entry->buflist[i].dev_private); |
| 595 | drm_free(entry->buflist[i].dev_private, | ||
| 596 | entry->buflist[i].dev_priv_size, | ||
| 597 | DRM_MEM_BUFS); | ||
| 598 | } | ||
| 599 | } | 593 | } |
| 600 | drm_free(entry->buflist, | 594 | kfree(entry->buflist); |
| 601 | entry->buf_count * | ||
| 602 | sizeof(*entry->buflist), DRM_MEM_BUFS); | ||
| 603 | 595 | ||
| 604 | entry->buf_count = 0; | 596 | entry->buf_count = 0; |
| 605 | } | 597 | } |
| @@ -698,8 +690,7 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 698 | return -EINVAL; | 690 | return -EINVAL; |
| 699 | } | 691 | } |
| 700 | 692 | ||
| 701 | entry->buflist = drm_alloc(count * sizeof(*entry->buflist), | 693 | entry->buflist = kmalloc(count * sizeof(*entry->buflist), GFP_KERNEL); |
| 702 | DRM_MEM_BUFS); | ||
| 703 | if (!entry->buflist) { | 694 | if (!entry->buflist) { |
| 704 | mutex_unlock(&dev->struct_mutex); | 695 | mutex_unlock(&dev->struct_mutex); |
| 705 | atomic_dec(&dev->buf_alloc); | 696 | atomic_dec(&dev->buf_alloc); |
| @@ -729,7 +720,7 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 729 | buf->file_priv = NULL; | 720 | buf->file_priv = NULL; |
| 730 | 721 | ||
| 731 | buf->dev_priv_size = dev->driver->dev_priv_size; | 722 | buf->dev_priv_size = dev->driver->dev_priv_size; |
| 732 | buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS); | 723 | buf->dev_private = kmalloc(buf->dev_priv_size, GFP_KERNEL); |
| 733 | if (!buf->dev_private) { | 724 | if (!buf->dev_private) { |
| 734 | /* Set count correctly so we free the proper amount. */ | 725 | /* Set count correctly so we free the proper amount. */ |
| 735 | entry->buf_count = count; | 726 | entry->buf_count = count; |
| @@ -749,10 +740,9 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 749 | 740 | ||
| 750 | DRM_DEBUG("byte_count: %d\n", byte_count); | 741 | DRM_DEBUG("byte_count: %d\n", byte_count); |
| 751 | 742 | ||
| 752 | temp_buflist = drm_realloc(dma->buflist, | 743 | temp_buflist = krealloc(dma->buflist, |
| 753 | dma->buf_count * sizeof(*dma->buflist), | 744 | (dma->buf_count + entry->buf_count) * |
| 754 | (dma->buf_count + entry->buf_count) | 745 | sizeof(*dma->buflist), GFP_KERNEL); |
| 755 | * sizeof(*dma->buflist), DRM_MEM_BUFS); | ||
| 756 | if (!temp_buflist) { | 746 | if (!temp_buflist) { |
| 757 | /* Free the entry because it isn't valid */ | 747 | /* Free the entry because it isn't valid */ |
| 758 | drm_cleanup_buf_error(dev, entry); | 748 | drm_cleanup_buf_error(dev, entry); |
| @@ -854,8 +844,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 854 | return -EINVAL; | 844 | return -EINVAL; |
| 855 | } | 845 | } |
| 856 | 846 | ||
| 857 | entry->buflist = drm_alloc(count * sizeof(*entry->buflist), | 847 | entry->buflist = kmalloc(count * sizeof(*entry->buflist), GFP_KERNEL); |
| 858 | DRM_MEM_BUFS); | ||
| 859 | if (!entry->buflist) { | 848 | if (!entry->buflist) { |
| 860 | mutex_unlock(&dev->struct_mutex); | 849 | mutex_unlock(&dev->struct_mutex); |
| 861 | atomic_dec(&dev->buf_alloc); | 850 | atomic_dec(&dev->buf_alloc); |
| @@ -863,11 +852,9 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 863 | } | 852 | } |
| 864 | memset(entry->buflist, 0, count * sizeof(*entry->buflist)); | 853 | memset(entry->buflist, 0, count * sizeof(*entry->buflist)); |
| 865 | 854 | ||
| 866 | entry->seglist = drm_alloc(count * sizeof(*entry->seglist), | 855 | entry->seglist = kmalloc(count * sizeof(*entry->seglist), GFP_KERNEL); |
| 867 | DRM_MEM_SEGS); | ||
| 868 | if (!entry->seglist) { | 856 | if (!entry->seglist) { |
| 869 | drm_free(entry->buflist, | 857 | kfree(entry->buflist); |
| 870 | count * sizeof(*entry->buflist), DRM_MEM_BUFS); | ||
| 871 | mutex_unlock(&dev->struct_mutex); | 858 | mutex_unlock(&dev->struct_mutex); |
| 872 | atomic_dec(&dev->buf_alloc); | 859 | atomic_dec(&dev->buf_alloc); |
| 873 | return -ENOMEM; | 860 | return -ENOMEM; |
| @@ -877,13 +864,11 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 877 | /* Keep the original pagelist until we know all the allocations | 864 | /* Keep the original pagelist until we know all the allocations |
| 878 | * have succeeded | 865 | * have succeeded |
| 879 | */ | 866 | */ |
| 880 | temp_pagelist = drm_alloc((dma->page_count + (count << page_order)) | 867 | temp_pagelist = kmalloc((dma->page_count + (count << page_order)) * |
| 881 | * sizeof(*dma->pagelist), DRM_MEM_PAGES); | 868 | sizeof(*dma->pagelist), GFP_KERNEL); |
| 882 | if (!temp_pagelist) { | 869 | if (!temp_pagelist) { |
| 883 | drm_free(entry->buflist, | 870 | kfree(entry->buflist); |
| 884 | count * sizeof(*entry->buflist), DRM_MEM_BUFS); | 871 | kfree(entry->seglist); |
| 885 | drm_free(entry->seglist, | ||
| 886 | count * sizeof(*entry->seglist), DRM_MEM_SEGS); | ||
| 887 | mutex_unlock(&dev->struct_mutex); | 872 | mutex_unlock(&dev->struct_mutex); |
| 888 | atomic_dec(&dev->buf_alloc); | 873 | atomic_dec(&dev->buf_alloc); |
| 889 | return -ENOMEM; | 874 | return -ENOMEM; |
| @@ -907,9 +892,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 907 | entry->buf_count = count; | 892 | entry->buf_count = count; |
| 908 | entry->seg_count = count; | 893 | entry->seg_count = count; |
| 909 | drm_cleanup_buf_error(dev, entry); | 894 | drm_cleanup_buf_error(dev, entry); |
| 910 | drm_free(temp_pagelist, | 895 | kfree(temp_pagelist); |
| 911 | (dma->page_count + (count << page_order)) | ||
| 912 | * sizeof(*dma->pagelist), DRM_MEM_PAGES); | ||
| 913 | mutex_unlock(&dev->struct_mutex); | 896 | mutex_unlock(&dev->struct_mutex); |
| 914 | atomic_dec(&dev->buf_alloc); | 897 | atomic_dec(&dev->buf_alloc); |
| 915 | return -ENOMEM; | 898 | return -ENOMEM; |
| @@ -940,18 +923,14 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 940 | buf->file_priv = NULL; | 923 | buf->file_priv = NULL; |
| 941 | 924 | ||
| 942 | buf->dev_priv_size = dev->driver->dev_priv_size; | 925 | buf->dev_priv_size = dev->driver->dev_priv_size; |
| 943 | buf->dev_private = drm_alloc(buf->dev_priv_size, | 926 | buf->dev_private = kmalloc(buf->dev_priv_size, |
| 944 | DRM_MEM_BUFS); | 927 | GFP_KERNEL); |
| 945 | if (!buf->dev_private) { | 928 | if (!buf->dev_private) { |
| 946 | /* Set count correctly so we free the proper amount. */ | 929 | /* Set count correctly so we free the proper amount. */ |
| 947 | entry->buf_count = count; | 930 | entry->buf_count = count; |
| 948 | entry->seg_count = count; | 931 | entry->seg_count = count; |
| 949 | drm_cleanup_buf_error(dev, entry); | 932 | drm_cleanup_buf_error(dev, entry); |
| 950 | drm_free(temp_pagelist, | 933 | kfree(temp_pagelist); |
| 951 | (dma->page_count + | ||
| 952 | (count << page_order)) | ||
| 953 | * sizeof(*dma->pagelist), | ||
| 954 | DRM_MEM_PAGES); | ||
| 955 | mutex_unlock(&dev->struct_mutex); | 934 | mutex_unlock(&dev->struct_mutex); |
| 956 | atomic_dec(&dev->buf_alloc); | 935 | atomic_dec(&dev->buf_alloc); |
| 957 | return -ENOMEM; | 936 | return -ENOMEM; |
| @@ -964,16 +943,13 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 964 | byte_count += PAGE_SIZE << page_order; | 943 | byte_count += PAGE_SIZE << page_order; |
| 965 | } | 944 | } |
| 966 | 945 | ||
| 967 | temp_buflist = drm_realloc(dma->buflist, | 946 | temp_buflist = krealloc(dma->buflist, |
| 968 | dma->buf_count * sizeof(*dma->buflist), | 947 | (dma->buf_count + entry->buf_count) * |
| 969 | (dma->buf_count + entry->buf_count) | 948 | sizeof(*dma->buflist), GFP_KERNEL); |
| 970 | * sizeof(*dma->buflist), DRM_MEM_BUFS); | ||
| 971 | if (!temp_buflist) { | 949 | if (!temp_buflist) { |
| 972 | /* Free the entry because it isn't valid */ | 950 | /* Free the entry because it isn't valid */ |
| 973 | drm_cleanup_buf_error(dev, entry); | 951 | drm_cleanup_buf_error(dev, entry); |
| 974 | drm_free(temp_pagelist, | 952 | kfree(temp_pagelist); |
| 975 | (dma->page_count + (count << page_order)) | ||
| 976 | * sizeof(*dma->pagelist), DRM_MEM_PAGES); | ||
| 977 | mutex_unlock(&dev->struct_mutex); | 953 | mutex_unlock(&dev->struct_mutex); |
| 978 | atomic_dec(&dev->buf_alloc); | 954 | atomic_dec(&dev->buf_alloc); |
| 979 | return -ENOMEM; | 955 | return -ENOMEM; |
| @@ -988,9 +964,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) | |||
| 988 | * with the new one. | 964 | * with the new one. |
| 989 | */ | 965 | */ |
| 990 | if (dma->page_count) { | 966 | if (dma->page_count) { |
| 991 | drm_free(dma->pagelist, | 967 | kfree(dma->pagelist); |
| 992 | dma->page_count * sizeof(*dma->pagelist), | ||
| 993 | DRM_MEM_PAGES); | ||
| 994 | } | 968 | } |
| 995 | dma->pagelist = temp_pagelist; | 969 | dma->pagelist = temp_pagelist; |
| 996 | 970 | ||
| @@ -1086,8 +1060,8 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request | |||
| 1086 | return -EINVAL; | 1060 | return -EINVAL; |
| 1087 | } | 1061 | } |
| 1088 | 1062 | ||
| 1089 | entry->buflist = drm_alloc(count * sizeof(*entry->buflist), | 1063 | entry->buflist = kmalloc(count * sizeof(*entry->buflist), |
| 1090 | DRM_MEM_BUFS); | 1064 | GFP_KERNEL); |
| 1091 | if (!entry->buflist) { | 1065 | if (!entry->buflist) { |
| 1092 | mutex_unlock(&dev->struct_mutex); | 1066 | mutex_unlock(&dev->struct_mutex); |
| 1093 | atomic_dec(&dev->buf_alloc); | 1067 | atomic_dec(&dev->buf_alloc); |
| @@ -1118,7 +1092,7 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request | |||
| 1118 | buf->file_priv = NULL; | 1092 | buf->file_priv = NULL; |
| 1119 | 1093 | ||
| 1120 | buf->dev_priv_size = dev->driver->dev_priv_size; | 1094 | buf->dev_priv_size = dev->driver->dev_priv_size; |
| 1121 | buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS); | 1095 | buf->dev_private = kmalloc(buf->dev_priv_size, GFP_KERNEL); |
| 1122 | if (!buf->dev_private) { | 1096 | if (!buf->dev_private) { |
| 1123 | /* Set count correctly so we free the proper amount. */ | 1097 | /* Set count correctly so we free the proper amount. */ |
| 1124 | entry->buf_count = count; | 1098 | entry->buf_count = count; |
| @@ -1139,10 +1113,9 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request | |||
| 1139 | 1113 | ||
| 1140 | DRM_DEBUG("byte_count: %d\n", byte_count); | 1114 | DRM_DEBUG("byte_count: %d\n", byte_count); |
| 1141 | 1115 | ||
| 1142 | temp_buflist = drm_realloc(dma->buflist, | 1116 | temp_buflist = krealloc(dma->buflist, |
| 1143 | dma->buf_count * sizeof(*dma->buflist), | 1117 | (dma->buf_count + entry->buf_count) * |
| 1144 | (dma->buf_count + entry->buf_count) | 1118 | sizeof(*dma->buflist), GFP_KERNEL); |
| 1145 | * sizeof(*dma->buflist), DRM_MEM_BUFS); | ||
| 1146 | if (!temp_buflist) { | 1119 | if (!temp_buflist) { |
| 1147 | /* Free the entry because it isn't valid */ | 1120 | /* Free the entry because it isn't valid */ |
| 1148 | drm_cleanup_buf_error(dev, entry); | 1121 | drm_cleanup_buf_error(dev, entry); |
| @@ -1248,8 +1221,8 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request | |||
| 1248 | return -EINVAL; | 1221 | return -EINVAL; |
| 1249 | } | 1222 | } |
| 1250 | 1223 | ||
| 1251 | entry->buflist = drm_alloc(count * sizeof(*entry->buflist), | 1224 | entry->buflist = kmalloc(count * sizeof(*entry->buflist), |
| 1252 | DRM_MEM_BUFS); | 1225 | GFP_KERNEL); |
| 1253 | if (!entry->buflist) { | 1226 | if (!entry->buflist) { |
| 1254 | mutex_unlock(&dev->struct_mutex); | 1227 | mutex_unlock(&dev->struct_mutex); |
| 1255 | atomic_dec(&dev->buf_alloc); | 1228 | atomic_dec(&dev->buf_alloc); |
| @@ -1279,7 +1252,7 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request | |||
| 1279 | buf->file_priv = NULL; | 1252 | buf->file_priv = NULL; |
| 1280 | 1253 | ||
| 1281 | buf->dev_priv_size = dev->driver->dev_priv_size; | 1254 | buf->dev_priv_size = dev->driver->dev_priv_size; |
| 1282 | buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS); | 1255 | buf->dev_private = kmalloc(buf->dev_priv_size, GFP_KERNEL); |
| 1283 | if (!buf->dev_private) { | 1256 | if (!buf->dev_private) { |
| 1284 | /* Set count correctly so we free the proper amount. */ | 1257 | /* Set count correctly so we free the proper amount. */ |
| 1285 | entry->buf_count = count; | 1258 | entry->buf_count = count; |
| @@ -1299,10 +1272,9 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request | |||
| 1299 | 1272 | ||
| 1300 | DRM_DEBUG("byte_count: %d\n", byte_count); | 1273 | DRM_DEBUG("byte_count: %d\n", byte_count); |
| 1301 | 1274 | ||
| 1302 | temp_buflist = drm_realloc(dma->buflist, | 1275 | temp_buflist = krealloc(dma->buflist, |
| 1303 | dma->buf_count * sizeof(*dma->buflist), | 1276 | (dma->buf_count + entry->buf_count) * |
| 1304 | (dma->buf_count + entry->buf_count) | 1277 | sizeof(*dma->buflist), GFP_KERNEL); |
| 1305 | * sizeof(*dma->buflist), DRM_MEM_BUFS); | ||
| 1306 | if (!temp_buflist) { | 1278 | if (!temp_buflist) { |
| 1307 | /* Free the entry because it isn't valid */ | 1279 | /* Free the entry because it isn't valid */ |
| 1308 | drm_cleanup_buf_error(dev, entry); | 1280 | drm_cleanup_buf_error(dev, entry); |
diff --git a/drivers/gpu/drm/drm_context.c b/drivers/gpu/drm/drm_context.c index 7d1e53c10d4b..2607753a320b 100644 --- a/drivers/gpu/drm/drm_context.c +++ b/drivers/gpu/drm/drm_context.c | |||
| @@ -341,7 +341,7 @@ int drm_addctx(struct drm_device *dev, void *data, | |||
| 341 | } | 341 | } |
| 342 | } | 342 | } |
| 343 | 343 | ||
| 344 | ctx_entry = drm_alloc(sizeof(*ctx_entry), DRM_MEM_CTXLIST); | 344 | ctx_entry = kmalloc(sizeof(*ctx_entry), GFP_KERNEL); |
| 345 | if (!ctx_entry) { | 345 | if (!ctx_entry) { |
| 346 | DRM_DEBUG("out of memory\n"); | 346 | DRM_DEBUG("out of memory\n"); |
| 347 | return -ENOMEM; | 347 | return -ENOMEM; |
| @@ -456,7 +456,7 @@ int drm_rmctx(struct drm_device *dev, void *data, | |||
| 456 | list_for_each_entry_safe(pos, n, &dev->ctxlist, head) { | 456 | list_for_each_entry_safe(pos, n, &dev->ctxlist, head) { |
| 457 | if (pos->handle == ctx->handle) { | 457 | if (pos->handle == ctx->handle) { |
| 458 | list_del(&pos->head); | 458 | list_del(&pos->head); |
| 459 | drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST); | 459 | kfree(pos); |
| 460 | --dev->ctx_count; | 460 | --dev->ctx_count; |
| 461 | } | 461 | } |
| 462 | } | 462 | } |
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index 6ce0e2667a85..2960b6d73456 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c | |||
| @@ -100,15 +100,13 @@ int drm_debugfs_create_files(struct drm_info_list *files, int count, | |||
| 100 | (dev->driver->driver_features & features) != features) | 100 | (dev->driver->driver_features & features) != features) |
| 101 | continue; | 101 | continue; |
| 102 | 102 | ||
| 103 | tmp = drm_alloc(sizeof(struct drm_info_node), | 103 | tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL); |
| 104 | _DRM_DRIVER); | ||
| 105 | ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO, | 104 | ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO, |
| 106 | root, tmp, &drm_debugfs_fops); | 105 | root, tmp, &drm_debugfs_fops); |
| 107 | if (!ent) { | 106 | if (!ent) { |
| 108 | DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n", | 107 | DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n", |
| 109 | name, files[i].name); | 108 | name, files[i].name); |
| 110 | drm_free(tmp, sizeof(struct drm_info_node), | 109 | kfree(tmp); |
| 111 | _DRM_DRIVER); | ||
| 112 | ret = -1; | 110 | ret = -1; |
| 113 | goto fail; | 111 | goto fail; |
| 114 | } | 112 | } |
| @@ -196,8 +194,7 @@ int drm_debugfs_remove_files(struct drm_info_list *files, int count, | |||
| 196 | if (tmp->info_ent == &files[i]) { | 194 | if (tmp->info_ent == &files[i]) { |
| 197 | debugfs_remove(tmp->dent); | 195 | debugfs_remove(tmp->dent); |
| 198 | list_del(pos); | 196 | list_del(pos); |
| 199 | drm_free(tmp, sizeof(struct drm_info_node), | 197 | kfree(tmp); |
| 200 | _DRM_DRIVER); | ||
| 201 | } | 198 | } |
| 202 | } | 199 | } |
| 203 | } | 200 | } |
diff --git a/drivers/gpu/drm/drm_dma.c b/drivers/gpu/drm/drm_dma.c index 7a8e2fba4678..13f1537413fb 100644 --- a/drivers/gpu/drm/drm_dma.c +++ b/drivers/gpu/drm/drm_dma.c | |||
| @@ -47,7 +47,7 @@ int drm_dma_setup(struct drm_device *dev) | |||
| 47 | { | 47 | { |
| 48 | int i; | 48 | int i; |
| 49 | 49 | ||
| 50 | dev->dma = drm_alloc(sizeof(*dev->dma), DRM_MEM_DRIVER); | 50 | dev->dma = kmalloc(sizeof(*dev->dma), GFP_KERNEL); |
| 51 | if (!dev->dma) | 51 | if (!dev->dma) |
| 52 | return -ENOMEM; | 52 | return -ENOMEM; |
| 53 | 53 | ||
| @@ -88,36 +88,19 @@ void drm_dma_takedown(struct drm_device *dev) | |||
| 88 | drm_pci_free(dev, dma->bufs[i].seglist[j]); | 88 | drm_pci_free(dev, dma->bufs[i].seglist[j]); |
| 89 | } | 89 | } |
| 90 | } | 90 | } |
| 91 | drm_free(dma->bufs[i].seglist, | 91 | kfree(dma->bufs[i].seglist); |
| 92 | dma->bufs[i].seg_count | ||
| 93 | * sizeof(*dma->bufs[0].seglist), DRM_MEM_SEGS); | ||
| 94 | } | 92 | } |
| 95 | if (dma->bufs[i].buf_count) { | 93 | if (dma->bufs[i].buf_count) { |
| 96 | for (j = 0; j < dma->bufs[i].buf_count; j++) { | 94 | for (j = 0; j < dma->bufs[i].buf_count; j++) { |
| 97 | if (dma->bufs[i].buflist[j].dev_private) { | 95 | kfree(dma->bufs[i].buflist[j].dev_private); |
| 98 | drm_free(dma->bufs[i].buflist[j]. | ||
| 99 | dev_private, | ||
| 100 | dma->bufs[i].buflist[j]. | ||
| 101 | dev_priv_size, DRM_MEM_BUFS); | ||
| 102 | } | ||
| 103 | } | 96 | } |
| 104 | drm_free(dma->bufs[i].buflist, | 97 | kfree(dma->bufs[i].buflist); |
| 105 | dma->bufs[i].buf_count * | ||
| 106 | sizeof(*dma->bufs[0].buflist), DRM_MEM_BUFS); | ||
| 107 | } | 98 | } |
| 108 | } | 99 | } |
| 109 | 100 | ||
| 110 | if (dma->buflist) { | 101 | kfree(dma->buflist); |
| 111 | drm_free(dma->buflist, | 102 | kfree(dma->pagelist); |
| 112 | dma->buf_count * sizeof(*dma->buflist), DRM_MEM_BUFS); | 103 | kfree(dev->dma); |
| 113 | } | ||
| 114 | |||
| 115 | if (dma->pagelist) { | ||
| 116 | drm_free(dma->pagelist, | ||
| 117 | dma->page_count * sizeof(*dma->pagelist), | ||
| 118 | DRM_MEM_PAGES); | ||
| 119 | } | ||
| 120 | drm_free(dev->dma, sizeof(*dev->dma), DRM_MEM_DRIVER); | ||
| 121 | dev->dma = NULL; | 104 | dev->dma = NULL; |
| 122 | } | 105 | } |
| 123 | 106 | ||
diff --git a/drivers/gpu/drm/drm_drawable.c b/drivers/gpu/drm/drm_drawable.c index 80be1cab62af..c53c9768cc11 100644 --- a/drivers/gpu/drm/drm_drawable.c +++ b/drivers/gpu/drm/drm_drawable.c | |||
| @@ -85,9 +85,8 @@ int drm_rmdraw(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 85 | spin_unlock_irqrestore(&dev->drw_lock, irqflags); | 85 | spin_unlock_irqrestore(&dev->drw_lock, irqflags); |
| 86 | return -EINVAL; | 86 | return -EINVAL; |
| 87 | } | 87 | } |
| 88 | drm_free(info->rects, info->num_rects * sizeof(struct drm_clip_rect), | 88 | kfree(info->rects); |
| 89 | DRM_MEM_BUFS); | 89 | kfree(info); |
| 90 | drm_free(info, sizeof(struct drm_drawable_info), DRM_MEM_BUFS); | ||
| 91 | 90 | ||
| 92 | idr_remove(&dev->drw_idr, draw->handle); | 91 | idr_remove(&dev->drw_idr, draw->handle); |
| 93 | 92 | ||
| @@ -106,12 +105,12 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file | |||
| 106 | 105 | ||
| 107 | info = idr_find(&dev->drw_idr, update->handle); | 106 | info = idr_find(&dev->drw_idr, update->handle); |
| 108 | if (!info) { | 107 | if (!info) { |
| 109 | info = drm_calloc(1, sizeof(*info), DRM_MEM_BUFS); | 108 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
| 110 | if (!info) | 109 | if (!info) |
| 111 | return -ENOMEM; | 110 | return -ENOMEM; |
| 112 | if (IS_ERR(idr_replace(&dev->drw_idr, info, update->handle))) { | 111 | if (IS_ERR(idr_replace(&dev->drw_idr, info, update->handle))) { |
| 113 | DRM_ERROR("No such drawable %d\n", update->handle); | 112 | DRM_ERROR("No such drawable %d\n", update->handle); |
| 114 | drm_free(info, sizeof(*info), DRM_MEM_BUFS); | 113 | kfree(info); |
| 115 | return -EINVAL; | 114 | return -EINVAL; |
| 116 | } | 115 | } |
| 117 | } | 116 | } |
| @@ -121,8 +120,9 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file | |||
| 121 | if (update->num == 0) | 120 | if (update->num == 0) |
| 122 | rects = NULL; | 121 | rects = NULL; |
| 123 | else if (update->num != info->num_rects) { | 122 | else if (update->num != info->num_rects) { |
| 124 | rects = drm_alloc(update->num * sizeof(struct drm_clip_rect), | 123 | rects = kmalloc(update->num * |
| 125 | DRM_MEM_BUFS); | 124 | sizeof(struct drm_clip_rect), |
| 125 | GFP_KERNEL); | ||
| 126 | } else | 126 | } else |
| 127 | rects = info->rects; | 127 | rects = info->rects; |
| 128 | 128 | ||
| @@ -145,8 +145,7 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file | |||
| 145 | spin_lock_irqsave(&dev->drw_lock, irqflags); | 145 | spin_lock_irqsave(&dev->drw_lock, irqflags); |
| 146 | 146 | ||
| 147 | if (rects != info->rects) { | 147 | if (rects != info->rects) { |
| 148 | drm_free(info->rects, info->num_rects * | 148 | kfree(info->rects); |
| 149 | sizeof(struct drm_clip_rect), DRM_MEM_BUFS); | ||
| 150 | } | 149 | } |
| 151 | 150 | ||
| 152 | info->rects = rects; | 151 | info->rects = rects; |
| @@ -166,8 +165,7 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file | |||
| 166 | 165 | ||
| 167 | error: | 166 | error: |
| 168 | if (rects != info->rects) | 167 | if (rects != info->rects) |
| 169 | drm_free(rects, update->num * sizeof(struct drm_clip_rect), | 168 | kfree(rects); |
| 170 | DRM_MEM_BUFS); | ||
| 171 | 169 | ||
| 172 | return err; | 170 | return err; |
| 173 | } | 171 | } |
| @@ -186,9 +184,8 @@ static int drm_drawable_free(int idr, void *p, void *data) | |||
| 186 | struct drm_drawable_info *info = p; | 184 | struct drm_drawable_info *info = p; |
| 187 | 185 | ||
| 188 | if (info) { | 186 | if (info) { |
| 189 | drm_free(info->rects, info->num_rects * | 187 | kfree(info->rects); |
| 190 | sizeof(struct drm_clip_rect), DRM_MEM_BUFS); | 188 | kfree(info); |
| 191 | drm_free(info, sizeof(*info), DRM_MEM_BUFS); | ||
| 192 | } | 189 | } |
| 193 | 190 | ||
| 194 | return 0; | 191 | return 0; |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 1bf7efd8d334..b39d7bfc0c9c 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
| @@ -189,7 +189,7 @@ int drm_lastclose(struct drm_device * dev) | |||
| 189 | if (entry->bound) | 189 | if (entry->bound) |
| 190 | drm_unbind_agp(entry->memory); | 190 | drm_unbind_agp(entry->memory); |
| 191 | drm_free_agp(entry->memory, entry->pages); | 191 | drm_free_agp(entry->memory, entry->pages); |
| 192 | drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); | 192 | kfree(entry); |
| 193 | } | 193 | } |
| 194 | INIT_LIST_HEAD(&dev->agp->memory); | 194 | INIT_LIST_HEAD(&dev->agp->memory); |
| 195 | 195 | ||
| @@ -208,21 +208,15 @@ int drm_lastclose(struct drm_device * dev) | |||
| 208 | /* Clear vma list (only built for debugging) */ | 208 | /* Clear vma list (only built for debugging) */ |
| 209 | list_for_each_entry_safe(vma, vma_temp, &dev->vmalist, head) { | 209 | list_for_each_entry_safe(vma, vma_temp, &dev->vmalist, head) { |
| 210 | list_del(&vma->head); | 210 | list_del(&vma->head); |
| 211 | drm_free(vma, sizeof(*vma), DRM_MEM_VMAS); | 211 | kfree(vma); |
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) { | 214 | if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) { |
| 215 | for (i = 0; i < dev->queue_count; i++) { | 215 | for (i = 0; i < dev->queue_count; i++) { |
| 216 | if (dev->queuelist[i]) { | 216 | kfree(dev->queuelist[i]); |
| 217 | drm_free(dev->queuelist[i], | 217 | dev->queuelist[i] = NULL; |
| 218 | sizeof(*dev->queuelist[0]), | ||
| 219 | DRM_MEM_QUEUES); | ||
| 220 | dev->queuelist[i] = NULL; | ||
| 221 | } | ||
| 222 | } | 218 | } |
| 223 | drm_free(dev->queuelist, | 219 | kfree(dev->queuelist); |
| 224 | dev->queue_slots * sizeof(*dev->queuelist), | ||
| 225 | DRM_MEM_QUEUES); | ||
| 226 | dev->queuelist = NULL; | 220 | dev->queuelist = NULL; |
| 227 | } | 221 | } |
| 228 | dev->queue_count = 0; | 222 | dev->queue_count = 0; |
| @@ -344,8 +338,6 @@ static int __init drm_core_init(void) | |||
| 344 | goto err_p3; | 338 | goto err_p3; |
| 345 | } | 339 | } |
| 346 | 340 | ||
| 347 | drm_mem_init(); | ||
| 348 | |||
| 349 | DRM_INFO("Initialized %s %d.%d.%d %s\n", | 341 | DRM_INFO("Initialized %s %d.%d.%d %s\n", |
| 350 | CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE); | 342 | CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE); |
| 351 | return 0; | 343 | return 0; |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 801a0d0e0810..7d0835226f6e 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -252,16 +252,18 @@ struct drm_display_mode *drm_mode_std(struct drm_device *dev, | |||
| 252 | { | 252 | { |
| 253 | struct drm_display_mode *mode; | 253 | struct drm_display_mode *mode; |
| 254 | int hsize = t->hsize * 8 + 248, vsize; | 254 | int hsize = t->hsize * 8 + 248, vsize; |
| 255 | unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK) | ||
| 256 | >> EDID_TIMING_ASPECT_SHIFT; | ||
| 255 | 257 | ||
| 256 | mode = drm_mode_create(dev); | 258 | mode = drm_mode_create(dev); |
| 257 | if (!mode) | 259 | if (!mode) |
| 258 | return NULL; | 260 | return NULL; |
| 259 | 261 | ||
| 260 | if (t->aspect_ratio == 0) | 262 | if (aspect_ratio == 0) |
| 261 | vsize = (hsize * 10) / 16; | 263 | vsize = (hsize * 10) / 16; |
| 262 | else if (t->aspect_ratio == 1) | 264 | else if (aspect_ratio == 1) |
| 263 | vsize = (hsize * 3) / 4; | 265 | vsize = (hsize * 3) / 4; |
| 264 | else if (t->aspect_ratio == 2) | 266 | else if (aspect_ratio == 2) |
| 265 | vsize = (hsize * 4) / 5; | 267 | vsize = (hsize * 4) / 5; |
| 266 | else | 268 | else |
| 267 | vsize = (hsize * 9) / 16; | 269 | vsize = (hsize * 9) / 16; |
| @@ -288,17 +290,24 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
| 288 | { | 290 | { |
| 289 | struct drm_display_mode *mode; | 291 | struct drm_display_mode *mode; |
| 290 | struct detailed_pixel_timing *pt = &timing->data.pixel_data; | 292 | struct detailed_pixel_timing *pt = &timing->data.pixel_data; |
| 293 | unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo; | ||
| 294 | unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo; | ||
| 295 | unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo; | ||
| 296 | unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo; | ||
| 297 | unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 8 | pt->hsync_offset_lo; | ||
| 298 | unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 6 | pt->hsync_pulse_width_lo; | ||
| 299 | unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) | (pt->vsync_offset_pulse_width_lo & 0xf); | ||
| 300 | unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) >> 2 | pt->vsync_offset_pulse_width_lo >> 4; | ||
| 291 | 301 | ||
| 292 | /* ignore tiny modes */ | 302 | /* ignore tiny modes */ |
| 293 | if (((pt->hactive_hi << 8) | pt->hactive_lo) < 64 || | 303 | if (hactive < 64 || vactive < 64) |
| 294 | ((pt->vactive_hi << 8) | pt->hactive_lo) < 64) | ||
| 295 | return NULL; | 304 | return NULL; |
| 296 | 305 | ||
| 297 | if (pt->stereo) { | 306 | if (pt->misc & DRM_EDID_PT_STEREO) { |
| 298 | printk(KERN_WARNING "stereo mode not supported\n"); | 307 | printk(KERN_WARNING "stereo mode not supported\n"); |
| 299 | return NULL; | 308 | return NULL; |
| 300 | } | 309 | } |
| 301 | if (!pt->separate_sync) { | 310 | if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) { |
| 302 | printk(KERN_WARNING "integrated sync not supported\n"); | 311 | printk(KERN_WARNING "integrated sync not supported\n"); |
| 303 | return NULL; | 312 | return NULL; |
| 304 | } | 313 | } |
| @@ -310,41 +319,36 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
| 310 | mode->type = DRM_MODE_TYPE_DRIVER; | 319 | mode->type = DRM_MODE_TYPE_DRIVER; |
| 311 | 320 | ||
| 312 | if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH) | 321 | if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH) |
| 313 | timing->pixel_clock = 1088; | 322 | timing->pixel_clock = cpu_to_le16(1088); |
| 314 | 323 | ||
| 315 | mode->clock = timing->pixel_clock * 10; | 324 | mode->clock = le16_to_cpu(timing->pixel_clock) * 10; |
| 316 | 325 | ||
| 317 | mode->hdisplay = (pt->hactive_hi << 8) | pt->hactive_lo; | 326 | mode->hdisplay = hactive; |
| 318 | mode->hsync_start = mode->hdisplay + ((pt->hsync_offset_hi << 8) | | 327 | mode->hsync_start = mode->hdisplay + hsync_offset; |
| 319 | pt->hsync_offset_lo); | 328 | mode->hsync_end = mode->hsync_start + hsync_pulse_width; |
| 320 | mode->hsync_end = mode->hsync_start + | 329 | mode->htotal = mode->hdisplay + hblank; |
| 321 | ((pt->hsync_pulse_width_hi << 8) | | 330 | |
| 322 | pt->hsync_pulse_width_lo); | 331 | mode->vdisplay = vactive; |
| 323 | mode->htotal = mode->hdisplay + ((pt->hblank_hi << 8) | pt->hblank_lo); | 332 | mode->vsync_start = mode->vdisplay + vsync_offset; |
| 324 | 333 | mode->vsync_end = mode->vsync_start + vsync_pulse_width; | |
| 325 | mode->vdisplay = (pt->vactive_hi << 8) | pt->vactive_lo; | 334 | mode->vtotal = mode->vdisplay + vblank; |
| 326 | mode->vsync_start = mode->vdisplay + ((pt->vsync_offset_hi << 4) | | ||
| 327 | pt->vsync_offset_lo); | ||
| 328 | mode->vsync_end = mode->vsync_start + | ||
| 329 | ((pt->vsync_pulse_width_hi << 4) | | ||
| 330 | pt->vsync_pulse_width_lo); | ||
| 331 | mode->vtotal = mode->vdisplay + ((pt->vblank_hi << 8) | pt->vblank_lo); | ||
| 332 | 335 | ||
| 333 | drm_mode_set_name(mode); | 336 | drm_mode_set_name(mode); |
| 334 | 337 | ||
| 335 | if (pt->interlaced) | 338 | if (pt->misc & DRM_EDID_PT_INTERLACED) |
| 336 | mode->flags |= DRM_MODE_FLAG_INTERLACE; | 339 | mode->flags |= DRM_MODE_FLAG_INTERLACE; |
| 337 | 340 | ||
| 338 | if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) { | 341 | if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) { |
| 339 | pt->hsync_positive = 1; | 342 | pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; |
| 340 | pt->vsync_positive = 1; | ||
| 341 | } | 343 | } |
| 342 | 344 | ||
| 343 | mode->flags |= pt->hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; | 345 | mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ? |
| 344 | mode->flags |= pt->vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; | 346 | DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; |
| 347 | mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? | ||
| 348 | DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; | ||
| 345 | 349 | ||
| 346 | mode->width_mm = pt->width_mm_lo | (pt->width_mm_hi << 8); | 350 | mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; |
| 347 | mode->height_mm = pt->height_mm_lo | (pt->height_mm_hi << 8); | 351 | mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; |
| 348 | 352 | ||
| 349 | if (quirks & EDID_QUIRK_DETAILED_IN_CM) { | 353 | if (quirks & EDID_QUIRK_DETAILED_IN_CM) { |
| 350 | mode->width_mm *= 10; | 354 | mode->width_mm *= 10; |
| @@ -465,7 +469,7 @@ static int add_standard_modes(struct drm_connector *connector, struct edid *edid | |||
| 465 | struct drm_display_mode *newmode; | 469 | struct drm_display_mode *newmode; |
| 466 | 470 | ||
| 467 | /* If std timings bytes are 1, 1 it's empty */ | 471 | /* If std timings bytes are 1, 1 it's empty */ |
| 468 | if (t->hsize == 1 && (t->aspect_ratio | t->vfreq) == 1) | 472 | if (t->hsize == 1 && t->vfreq_aspect == 1) |
| 469 | continue; | 473 | continue; |
| 470 | 474 | ||
| 471 | newmode = drm_mode_std(dev, &edid->standard_timings[i]); | 475 | newmode = drm_mode_std(dev, &edid->standard_timings[i]); |
| @@ -509,7 +513,7 @@ static int add_detailed_info(struct drm_connector *connector, | |||
| 509 | continue; | 513 | continue; |
| 510 | 514 | ||
| 511 | /* First detailed mode is preferred */ | 515 | /* First detailed mode is preferred */ |
| 512 | if (i == 0 && edid->preferred_timing) | 516 | if (i == 0 && (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING)) |
| 513 | newmode->type |= DRM_MODE_TYPE_PREFERRED; | 517 | newmode->type |= DRM_MODE_TYPE_PREFERRED; |
| 514 | drm_mode_probed_add(connector, newmode); | 518 | drm_mode_probed_add(connector, newmode); |
| 515 | 519 | ||
| @@ -767,22 +771,22 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) | |||
| 767 | if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) | 771 | if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) |
| 768 | edid_fixup_preferred(connector, quirks); | 772 | edid_fixup_preferred(connector, quirks); |
| 769 | 773 | ||
| 770 | connector->display_info.serration_vsync = edid->serration_vsync; | 774 | connector->display_info.serration_vsync = (edid->input & DRM_EDID_INPUT_SERRATION_VSYNC) ? 1 : 0; |
| 771 | connector->display_info.sync_on_green = edid->sync_on_green; | 775 | connector->display_info.sync_on_green = (edid->input & DRM_EDID_INPUT_SYNC_ON_GREEN) ? 1 : 0; |
| 772 | connector->display_info.composite_sync = edid->composite_sync; | 776 | connector->display_info.composite_sync = (edid->input & DRM_EDID_INPUT_COMPOSITE_SYNC) ? 1 : 0; |
| 773 | connector->display_info.separate_syncs = edid->separate_syncs; | 777 | connector->display_info.separate_syncs = (edid->input & DRM_EDID_INPUT_SEPARATE_SYNCS) ? 1 : 0; |
| 774 | connector->display_info.blank_to_black = edid->blank_to_black; | 778 | connector->display_info.blank_to_black = (edid->input & DRM_EDID_INPUT_BLANK_TO_BLACK) ? 1 : 0; |
| 775 | connector->display_info.video_level = edid->video_level; | 779 | connector->display_info.video_level = (edid->input & DRM_EDID_INPUT_VIDEO_LEVEL) >> 5; |
| 776 | connector->display_info.digital = edid->digital; | 780 | connector->display_info.digital = (edid->input & DRM_EDID_INPUT_DIGITAL) ? 1 : 0; |
| 777 | connector->display_info.width_mm = edid->width_cm * 10; | 781 | connector->display_info.width_mm = edid->width_cm * 10; |
| 778 | connector->display_info.height_mm = edid->height_cm * 10; | 782 | connector->display_info.height_mm = edid->height_cm * 10; |
| 779 | connector->display_info.gamma = edid->gamma; | 783 | connector->display_info.gamma = edid->gamma; |
| 780 | connector->display_info.gtf_supported = edid->default_gtf; | 784 | connector->display_info.gtf_supported = (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) ? 1 : 0; |
| 781 | connector->display_info.standard_color = edid->standard_color; | 785 | connector->display_info.standard_color = (edid->features & DRM_EDID_FEATURE_STANDARD_COLOR) ? 1 : 0; |
| 782 | connector->display_info.display_type = edid->display_type; | 786 | connector->display_info.display_type = (edid->features & DRM_EDID_FEATURE_DISPLAY_TYPE) >> 3; |
| 783 | connector->display_info.active_off_supported = edid->pm_active_off; | 787 | connector->display_info.active_off_supported = (edid->features & DRM_EDID_FEATURE_PM_ACTIVE_OFF) ? 1 : 0; |
| 784 | connector->display_info.suspend_supported = edid->pm_suspend; | 788 | connector->display_info.suspend_supported = (edid->features & DRM_EDID_FEATURE_PM_SUSPEND) ? 1 : 0; |
| 785 | connector->display_info.standby_supported = edid->pm_standby; | 789 | connector->display_info.standby_supported = (edid->features & DRM_EDID_FEATURE_PM_STANDBY) ? 1 : 0; |
| 786 | connector->display_info.gamma = edid->gamma; | 790 | connector->display_info.gamma = edid->gamma; |
| 787 | 791 | ||
| 788 | return num_modes; | 792 | return num_modes; |
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 09a3571c9908..251bc0e3b5ec 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c | |||
| @@ -240,7 +240,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp, | |||
| 240 | 240 | ||
| 241 | DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor_id); | 241 | DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor_id); |
| 242 | 242 | ||
| 243 | priv = drm_alloc(sizeof(*priv), DRM_MEM_FILES); | 243 | priv = kmalloc(sizeof(*priv), GFP_KERNEL); |
| 244 | if (!priv) | 244 | if (!priv) |
| 245 | return -ENOMEM; | 245 | return -ENOMEM; |
| 246 | 246 | ||
| @@ -328,7 +328,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp, | |||
| 328 | 328 | ||
| 329 | return 0; | 329 | return 0; |
| 330 | out_free: | 330 | out_free: |
| 331 | drm_free(priv, sizeof(*priv), DRM_MEM_FILES); | 331 | kfree(priv); |
| 332 | filp->private_data = NULL; | 332 | filp->private_data = NULL; |
| 333 | return ret; | 333 | return ret; |
| 334 | } | 334 | } |
| @@ -471,7 +471,7 @@ int drm_release(struct inode *inode, struct file *filp) | |||
| 471 | drm_ctxbitmap_free(dev, pos->handle); | 471 | drm_ctxbitmap_free(dev, pos->handle); |
| 472 | 472 | ||
| 473 | list_del(&pos->head); | 473 | list_del(&pos->head); |
| 474 | drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST); | 474 | kfree(pos); |
| 475 | --dev->ctx_count; | 475 | --dev->ctx_count; |
| 476 | } | 476 | } |
| 477 | } | 477 | } |
| @@ -516,7 +516,7 @@ int drm_release(struct inode *inode, struct file *filp) | |||
| 516 | 516 | ||
| 517 | if (dev->driver->postclose) | 517 | if (dev->driver->postclose) |
| 518 | dev->driver->postclose(dev, file_priv); | 518 | dev->driver->postclose(dev, file_priv); |
| 519 | drm_free(file_priv, sizeof(*file_priv), DRM_MEM_FILES); | 519 | kfree(file_priv); |
| 520 | 520 | ||
| 521 | /* ======================================================== | 521 | /* ======================================================== |
| 522 | * End inline drm_release | 522 | * End inline drm_release |
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index ec43005100d9..8104ecaea26f 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
| @@ -89,7 +89,7 @@ drm_gem_init(struct drm_device *dev) | |||
| 89 | atomic_set(&dev->gtt_count, 0); | 89 | atomic_set(&dev->gtt_count, 0); |
| 90 | atomic_set(&dev->gtt_memory, 0); | 90 | atomic_set(&dev->gtt_memory, 0); |
| 91 | 91 | ||
| 92 | mm = drm_calloc(1, sizeof(struct drm_gem_mm), DRM_MEM_MM); | 92 | mm = kzalloc(sizeof(struct drm_gem_mm), GFP_KERNEL); |
| 93 | if (!mm) { | 93 | if (!mm) { |
| 94 | DRM_ERROR("out of memory\n"); | 94 | DRM_ERROR("out of memory\n"); |
| 95 | return -ENOMEM; | 95 | return -ENOMEM; |
| @@ -98,14 +98,14 @@ drm_gem_init(struct drm_device *dev) | |||
| 98 | dev->mm_private = mm; | 98 | dev->mm_private = mm; |
| 99 | 99 | ||
| 100 | if (drm_ht_create(&mm->offset_hash, 19)) { | 100 | if (drm_ht_create(&mm->offset_hash, 19)) { |
| 101 | drm_free(mm, sizeof(struct drm_gem_mm), DRM_MEM_MM); | 101 | kfree(mm); |
| 102 | return -ENOMEM; | 102 | return -ENOMEM; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | if (drm_mm_init(&mm->offset_manager, DRM_FILE_PAGE_OFFSET_START, | 105 | if (drm_mm_init(&mm->offset_manager, DRM_FILE_PAGE_OFFSET_START, |
| 106 | DRM_FILE_PAGE_OFFSET_SIZE)) { | 106 | DRM_FILE_PAGE_OFFSET_SIZE)) { |
| 107 | drm_ht_remove(&mm->offset_hash); | 107 | drm_ht_remove(&mm->offset_hash); |
| 108 | drm_free(mm, sizeof(struct drm_gem_mm), DRM_MEM_MM); | 108 | kfree(mm); |
| 109 | return -ENOMEM; | 109 | return -ENOMEM; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| @@ -119,7 +119,7 @@ drm_gem_destroy(struct drm_device *dev) | |||
| 119 | 119 | ||
| 120 | drm_mm_takedown(&mm->offset_manager); | 120 | drm_mm_takedown(&mm->offset_manager); |
| 121 | drm_ht_remove(&mm->offset_hash); | 121 | drm_ht_remove(&mm->offset_hash); |
| 122 | drm_free(mm, sizeof(struct drm_gem_mm), DRM_MEM_MM); | 122 | kfree(mm); |
| 123 | dev->mm_private = NULL; | 123 | dev->mm_private = NULL; |
| 124 | } | 124 | } |
| 125 | 125 | ||
diff --git a/drivers/gpu/drm/drm_hashtab.c b/drivers/gpu/drm/drm_hashtab.c index ac35145c3e20..f36b21c5b2e1 100644 --- a/drivers/gpu/drm/drm_hashtab.c +++ b/drivers/gpu/drm/drm_hashtab.c | |||
| @@ -46,8 +46,7 @@ int drm_ht_create(struct drm_open_hash *ht, unsigned int order) | |||
| 46 | ht->table = NULL; | 46 | ht->table = NULL; |
| 47 | ht->use_vmalloc = ((ht->size * sizeof(*ht->table)) > PAGE_SIZE); | 47 | ht->use_vmalloc = ((ht->size * sizeof(*ht->table)) > PAGE_SIZE); |
| 48 | if (!ht->use_vmalloc) { | 48 | if (!ht->use_vmalloc) { |
| 49 | ht->table = drm_calloc(ht->size, sizeof(*ht->table), | 49 | ht->table = kcalloc(ht->size, sizeof(*ht->table), GFP_KERNEL); |
| 50 | DRM_MEM_HASHTAB); | ||
| 51 | } | 50 | } |
| 52 | if (!ht->table) { | 51 | if (!ht->table) { |
| 53 | ht->use_vmalloc = 1; | 52 | ht->use_vmalloc = 1; |
| @@ -200,8 +199,7 @@ void drm_ht_remove(struct drm_open_hash *ht) | |||
| 200 | if (ht->use_vmalloc) | 199 | if (ht->use_vmalloc) |
| 201 | vfree(ht->table); | 200 | vfree(ht->table); |
| 202 | else | 201 | else |
| 203 | drm_free(ht->table, ht->size * sizeof(*ht->table), | 202 | kfree(ht->table); |
| 204 | DRM_MEM_HASHTAB); | ||
| 205 | ht->table = NULL; | 203 | ht->table = NULL; |
| 206 | } | 204 | } |
| 207 | } | 205 | } |
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 1fad76289e66..9b9ff46c2378 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c | |||
| @@ -93,7 +93,7 @@ int drm_setunique(struct drm_device *dev, void *data, | |||
| 93 | 93 | ||
| 94 | master->unique_len = u->unique_len; | 94 | master->unique_len = u->unique_len; |
| 95 | master->unique_size = u->unique_len + 1; | 95 | master->unique_size = u->unique_len + 1; |
| 96 | master->unique = drm_alloc(master->unique_size, DRM_MEM_DRIVER); | 96 | master->unique = kmalloc(master->unique_size, GFP_KERNEL); |
| 97 | if (!master->unique) | 97 | if (!master->unique) |
| 98 | return -ENOMEM; | 98 | return -ENOMEM; |
| 99 | if (copy_from_user(master->unique, u->unique, master->unique_len)) | 99 | if (copy_from_user(master->unique, u->unique, master->unique_len)) |
| @@ -101,9 +101,8 @@ int drm_setunique(struct drm_device *dev, void *data, | |||
| 101 | 101 | ||
| 102 | master->unique[master->unique_len] = '\0'; | 102 | master->unique[master->unique_len] = '\0'; |
| 103 | 103 | ||
| 104 | dev->devname = | 104 | dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) + |
| 105 | drm_alloc(strlen(dev->driver->pci_driver.name) + | 105 | strlen(master->unique) + 2, GFP_KERNEL); |
| 106 | strlen(master->unique) + 2, DRM_MEM_DRIVER); | ||
| 107 | if (!dev->devname) | 106 | if (!dev->devname) |
| 108 | return -ENOMEM; | 107 | return -ENOMEM; |
| 109 | 108 | ||
| @@ -138,7 +137,7 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv) | |||
| 138 | 137 | ||
| 139 | master->unique_len = 40; | 138 | master->unique_len = 40; |
| 140 | master->unique_size = master->unique_len; | 139 | master->unique_size = master->unique_len; |
| 141 | master->unique = drm_alloc(master->unique_size, DRM_MEM_DRIVER); | 140 | master->unique = kmalloc(master->unique_size, GFP_KERNEL); |
| 142 | if (master->unique == NULL) | 141 | if (master->unique == NULL) |
| 143 | return -ENOMEM; | 142 | return -ENOMEM; |
| 144 | 143 | ||
| @@ -152,9 +151,8 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv) | |||
| 152 | else | 151 | else |
| 153 | master->unique_len = len; | 152 | master->unique_len = len; |
| 154 | 153 | ||
| 155 | dev->devname = | 154 | dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) + |
| 156 | drm_alloc(strlen(dev->driver->pci_driver.name) + master->unique_len + | 155 | master->unique_len + 2, GFP_KERNEL); |
| 157 | 2, DRM_MEM_DRIVER); | ||
| 158 | if (dev->devname == NULL) | 156 | if (dev->devname == NULL) |
| 159 | return -ENOMEM; | 157 | return -ENOMEM; |
| 160 | 158 | ||
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index fc8e5acd9d9a..b4a3dbcebe9b 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -104,21 +104,13 @@ void drm_vblank_cleanup(struct drm_device *dev) | |||
| 104 | 104 | ||
| 105 | vblank_disable_fn((unsigned long)dev); | 105 | vblank_disable_fn((unsigned long)dev); |
| 106 | 106 | ||
| 107 | drm_free(dev->vbl_queue, sizeof(*dev->vbl_queue) * dev->num_crtcs, | 107 | kfree(dev->vbl_queue); |
| 108 | DRM_MEM_DRIVER); | 108 | kfree(dev->_vblank_count); |
| 109 | drm_free(dev->_vblank_count, sizeof(*dev->_vblank_count) * | 109 | kfree(dev->vblank_refcount); |
| 110 | dev->num_crtcs, DRM_MEM_DRIVER); | 110 | kfree(dev->vblank_enabled); |
| 111 | drm_free(dev->vblank_refcount, sizeof(*dev->vblank_refcount) * | 111 | kfree(dev->last_vblank); |
| 112 | dev->num_crtcs, DRM_MEM_DRIVER); | 112 | kfree(dev->last_vblank_wait); |
| 113 | drm_free(dev->vblank_enabled, sizeof(*dev->vblank_enabled) * | 113 | kfree(dev->vblank_inmodeset); |
| 114 | dev->num_crtcs, DRM_MEM_DRIVER); | ||
| 115 | drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs, | ||
| 116 | DRM_MEM_DRIVER); | ||
| 117 | drm_free(dev->last_vblank_wait, | ||
| 118 | sizeof(*dev->last_vblank_wait) * dev->num_crtcs, | ||
| 119 | DRM_MEM_DRIVER); | ||
| 120 | drm_free(dev->vblank_inmodeset, sizeof(*dev->vblank_inmodeset) * | ||
| 121 | dev->num_crtcs, DRM_MEM_DRIVER); | ||
| 122 | 114 | ||
| 123 | dev->num_crtcs = 0; | 115 | dev->num_crtcs = 0; |
| 124 | } | 116 | } |
| @@ -132,37 +124,33 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) | |||
| 132 | spin_lock_init(&dev->vbl_lock); | 124 | spin_lock_init(&dev->vbl_lock); |
| 133 | dev->num_crtcs = num_crtcs; | 125 | dev->num_crtcs = num_crtcs; |
| 134 | 126 | ||
| 135 | dev->vbl_queue = drm_alloc(sizeof(wait_queue_head_t) * num_crtcs, | 127 | dev->vbl_queue = kmalloc(sizeof(wait_queue_head_t) * num_crtcs, |
| 136 | DRM_MEM_DRIVER); | 128 | GFP_KERNEL); |
| 137 | if (!dev->vbl_queue) | 129 | if (!dev->vbl_queue) |
| 138 | goto err; | 130 | goto err; |
| 139 | 131 | ||
| 140 | dev->_vblank_count = drm_alloc(sizeof(atomic_t) * num_crtcs, | 132 | dev->_vblank_count = kmalloc(sizeof(atomic_t) * num_crtcs, GFP_KERNEL); |
| 141 | DRM_MEM_DRIVER); | ||
| 142 | if (!dev->_vblank_count) | 133 | if (!dev->_vblank_count) |
| 143 | goto err; | 134 | goto err; |
| 144 | 135 | ||
| 145 | dev->vblank_refcount = drm_alloc(sizeof(atomic_t) * num_crtcs, | 136 | dev->vblank_refcount = kmalloc(sizeof(atomic_t) * num_crtcs, |
| 146 | DRM_MEM_DRIVER); | 137 | GFP_KERNEL); |
| 147 | if (!dev->vblank_refcount) | 138 | if (!dev->vblank_refcount) |
| 148 | goto err; | 139 | goto err; |
| 149 | 140 | ||
| 150 | dev->vblank_enabled = drm_calloc(num_crtcs, sizeof(int), | 141 | dev->vblank_enabled = kcalloc(num_crtcs, sizeof(int), GFP_KERNEL); |
| 151 | DRM_MEM_DRIVER); | ||
| 152 | if (!dev->vblank_enabled) | 142 | if (!dev->vblank_enabled) |
| 153 | goto err; | 143 | goto err; |
| 154 | 144 | ||
| 155 | dev->last_vblank = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER); | 145 | dev->last_vblank = kcalloc(num_crtcs, sizeof(u32), GFP_KERNEL); |
| 156 | if (!dev->last_vblank) | 146 | if (!dev->last_vblank) |
| 157 | goto err; | 147 | goto err; |
| 158 | 148 | ||
| 159 | dev->last_vblank_wait = drm_calloc(num_crtcs, sizeof(u32), | 149 | dev->last_vblank_wait = kcalloc(num_crtcs, sizeof(u32), GFP_KERNEL); |
| 160 | DRM_MEM_DRIVER); | ||
| 161 | if (!dev->last_vblank_wait) | 150 | if (!dev->last_vblank_wait) |
| 162 | goto err; | 151 | goto err; |
| 163 | 152 | ||
| 164 | dev->vblank_inmodeset = drm_calloc(num_crtcs, sizeof(int), | 153 | dev->vblank_inmodeset = kcalloc(num_crtcs, sizeof(int), GFP_KERNEL); |
| 165 | DRM_MEM_DRIVER); | ||
| 166 | if (!dev->vblank_inmodeset) | 154 | if (!dev->vblank_inmodeset) |
| 167 | goto err; | 155 | goto err; |
| 168 | 156 | ||
diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c index 0c707f533eab..e4865f99989c 100644 --- a/drivers/gpu/drm/drm_memory.c +++ b/drivers/gpu/drm/drm_memory.c | |||
| @@ -36,15 +36,6 @@ | |||
| 36 | #include <linux/highmem.h> | 36 | #include <linux/highmem.h> |
| 37 | #include "drmP.h" | 37 | #include "drmP.h" |
| 38 | 38 | ||
| 39 | #ifdef DEBUG_MEMORY | ||
| 40 | #include "drm_memory_debug.h" | ||
| 41 | #else | ||
| 42 | |||
| 43 | /** No-op. */ | ||
| 44 | void drm_mem_init(void) | ||
| 45 | { | ||
| 46 | } | ||
| 47 | |||
| 48 | /** | 39 | /** |
| 49 | * Called when "/proc/dri/%dev%/mem" is read. | 40 | * Called when "/proc/dri/%dev%/mem" is read. |
| 50 | * | 41 | * |
| @@ -64,28 +55,15 @@ int drm_mem_info(char *buf, char **start, off_t offset, | |||
| 64 | return 0; | 55 | return 0; |
| 65 | } | 56 | } |
| 66 | 57 | ||
| 67 | /** Wrapper around kmalloc() and kfree() */ | ||
| 68 | void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area) | ||
| 69 | { | ||
| 70 | void *pt; | ||
| 71 | |||
| 72 | if (!(pt = kmalloc(size, GFP_KERNEL))) | ||
| 73 | return NULL; | ||
| 74 | if (oldpt && oldsize) { | ||
| 75 | memcpy(pt, oldpt, oldsize); | ||
| 76 | kfree(oldpt); | ||
| 77 | } | ||
| 78 | return pt; | ||
| 79 | } | ||
| 80 | |||
| 81 | #if __OS_HAS_AGP | 58 | #if __OS_HAS_AGP |
| 82 | static void *agp_remap(unsigned long offset, unsigned long size, | 59 | static void *agp_remap(unsigned long offset, unsigned long size, |
| 83 | struct drm_device * dev) | 60 | struct drm_device * dev) |
| 84 | { | 61 | { |
| 85 | unsigned long *phys_addr_map, i, num_pages = | 62 | unsigned long i, num_pages = |
| 86 | PAGE_ALIGN(size) / PAGE_SIZE; | 63 | PAGE_ALIGN(size) / PAGE_SIZE; |
| 87 | struct drm_agp_mem *agpmem; | 64 | struct drm_agp_mem *agpmem; |
| 88 | struct page **page_map; | 65 | struct page **page_map; |
| 66 | struct page **phys_page_map; | ||
| 89 | void *addr; | 67 | void *addr; |
| 90 | 68 | ||
| 91 | size = PAGE_ALIGN(size); | 69 | size = PAGE_ALIGN(size); |
| @@ -112,10 +90,9 @@ static void *agp_remap(unsigned long offset, unsigned long size, | |||
| 112 | if (!page_map) | 90 | if (!page_map) |
| 113 | return NULL; | 91 | return NULL; |
| 114 | 92 | ||
| 115 | phys_addr_map = | 93 | phys_page_map = (agpmem->memory->pages + (offset - agpmem->bound) / PAGE_SIZE); |
| 116 | agpmem->memory->memory + (offset - agpmem->bound) / PAGE_SIZE; | ||
| 117 | for (i = 0; i < num_pages; ++i) | 94 | for (i = 0; i < num_pages; ++i) |
| 118 | page_map[i] = pfn_to_page(phys_addr_map[i] >> PAGE_SHIFT); | 95 | page_map[i] = phys_page_map[i]; |
| 119 | addr = vmap(page_map, num_pages, VM_IOREMAP, PAGE_AGP); | 96 | addr = vmap(page_map, num_pages, VM_IOREMAP, PAGE_AGP); |
| 120 | vfree(page_map); | 97 | vfree(page_map); |
| 121 | 98 | ||
| @@ -157,8 +134,6 @@ static inline void *agp_remap(unsigned long offset, unsigned long size, | |||
| 157 | 134 | ||
| 158 | #endif /* agp */ | 135 | #endif /* agp */ |
| 159 | 136 | ||
| 160 | #endif /* debug_memory */ | ||
| 161 | |||
| 162 | void drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) | 137 | void drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) |
| 163 | { | 138 | { |
| 164 | if (drm_core_has_AGP(dev) && | 139 | if (drm_core_has_AGP(dev) && |
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index a912a0ff11cc..3e47869d6dae 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
| @@ -187,9 +187,10 @@ static struct drm_mm_node *drm_mm_split_at_start(struct drm_mm_node *parent, | |||
| 187 | } | 187 | } |
| 188 | 188 | ||
| 189 | 189 | ||
| 190 | 190 | struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, | |
| 191 | struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *node, | 191 | unsigned long size, |
| 192 | unsigned long size, unsigned alignment) | 192 | unsigned alignment, |
| 193 | int atomic) | ||
| 193 | { | 194 | { |
| 194 | 195 | ||
| 195 | struct drm_mm_node *align_splitoff = NULL; | 196 | struct drm_mm_node *align_splitoff = NULL; |
| @@ -200,7 +201,7 @@ struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *node, | |||
| 200 | 201 | ||
| 201 | if (tmp) { | 202 | if (tmp) { |
| 202 | align_splitoff = | 203 | align_splitoff = |
| 203 | drm_mm_split_at_start(node, alignment - tmp, 0); | 204 | drm_mm_split_at_start(node, alignment - tmp, atomic); |
| 204 | if (unlikely(align_splitoff == NULL)) | 205 | if (unlikely(align_splitoff == NULL)) |
| 205 | return NULL; | 206 | return NULL; |
| 206 | } | 207 | } |
| @@ -209,7 +210,7 @@ struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *node, | |||
| 209 | list_del_init(&node->fl_entry); | 210 | list_del_init(&node->fl_entry); |
| 210 | node->free = 0; | 211 | node->free = 0; |
| 211 | } else { | 212 | } else { |
| 212 | node = drm_mm_split_at_start(node, size, 0); | 213 | node = drm_mm_split_at_start(node, size, atomic); |
| 213 | } | 214 | } |
| 214 | 215 | ||
| 215 | if (align_splitoff) | 216 | if (align_splitoff) |
| @@ -217,42 +218,7 @@ struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *node, | |||
| 217 | 218 | ||
| 218 | return node; | 219 | return node; |
| 219 | } | 220 | } |
| 220 | 221 | EXPORT_SYMBOL(drm_mm_get_block_generic); | |
| 221 | EXPORT_SYMBOL(drm_mm_get_block); | ||
| 222 | |||
| 223 | struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent, | ||
| 224 | unsigned long size, | ||
| 225 | unsigned alignment) | ||
| 226 | { | ||
| 227 | |||
| 228 | struct drm_mm_node *align_splitoff = NULL; | ||
| 229 | struct drm_mm_node *child; | ||
| 230 | unsigned tmp = 0; | ||
| 231 | |||
| 232 | if (alignment) | ||
| 233 | tmp = parent->start % alignment; | ||
| 234 | |||
| 235 | if (tmp) { | ||
| 236 | align_splitoff = | ||
| 237 | drm_mm_split_at_start(parent, alignment - tmp, 1); | ||
| 238 | if (unlikely(align_splitoff == NULL)) | ||
| 239 | return NULL; | ||
| 240 | } | ||
| 241 | |||
| 242 | if (parent->size == size) { | ||
| 243 | list_del_init(&parent->fl_entry); | ||
| 244 | parent->free = 0; | ||
| 245 | return parent; | ||
| 246 | } else { | ||
| 247 | child = drm_mm_split_at_start(parent, size, 1); | ||
| 248 | } | ||
| 249 | |||
| 250 | if (align_splitoff) | ||
| 251 | drm_mm_put_block(align_splitoff); | ||
| 252 | |||
| 253 | return child; | ||
| 254 | } | ||
| 255 | EXPORT_SYMBOL(drm_mm_get_block_atomic); | ||
| 256 | 222 | ||
| 257 | /* | 223 | /* |
| 258 | * Put a block. Merge with the previous and / or next block if they are free. | 224 | * Put a block. Merge with the previous and / or next block if they are free. |
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index b55d5bc6ea61..577094fb1995 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c | |||
| @@ -55,17 +55,6 @@ drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t ali | |||
| 55 | unsigned long addr; | 55 | unsigned long addr; |
| 56 | size_t sz; | 56 | size_t sz; |
| 57 | #endif | 57 | #endif |
| 58 | #ifdef DRM_DEBUG_MEMORY | ||
| 59 | int area = DRM_MEM_DMA; | ||
| 60 | |||
| 61 | spin_lock(&drm_mem_lock); | ||
| 62 | if ((drm_ram_used >> PAGE_SHIFT) | ||
| 63 | > (DRM_RAM_PERCENT * drm_ram_available) / 100) { | ||
| 64 | spin_unlock(&drm_mem_lock); | ||
| 65 | return 0; | ||
| 66 | } | ||
| 67 | spin_unlock(&drm_mem_lock); | ||
| 68 | #endif | ||
| 69 | 58 | ||
| 70 | /* pci_alloc_consistent only guarantees alignment to the smallest | 59 | /* pci_alloc_consistent only guarantees alignment to the smallest |
| 71 | * PAGE_SIZE order which is greater than or equal to the requested size. | 60 | * PAGE_SIZE order which is greater than or equal to the requested size. |
| @@ -86,26 +75,10 @@ drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t ali | |||
| 86 | dmah->size = size; | 75 | dmah->size = size; |
| 87 | dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, &dmah->busaddr, GFP_KERNEL | __GFP_COMP); | 76 | dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, &dmah->busaddr, GFP_KERNEL | __GFP_COMP); |
| 88 | 77 | ||
| 89 | #ifdef DRM_DEBUG_MEMORY | ||
| 90 | if (dmah->vaddr == NULL) { | ||
| 91 | spin_lock(&drm_mem_lock); | ||
| 92 | ++drm_mem_stats[area].fail_count; | ||
| 93 | spin_unlock(&drm_mem_lock); | ||
| 94 | kfree(dmah); | ||
| 95 | return NULL; | ||
| 96 | } | ||
| 97 | |||
| 98 | spin_lock(&drm_mem_lock); | ||
| 99 | ++drm_mem_stats[area].succeed_count; | ||
| 100 | drm_mem_stats[area].bytes_allocated += size; | ||
| 101 | drm_ram_used += size; | ||
| 102 | spin_unlock(&drm_mem_lock); | ||
| 103 | #else | ||
| 104 | if (dmah->vaddr == NULL) { | 78 | if (dmah->vaddr == NULL) { |
| 105 | kfree(dmah); | 79 | kfree(dmah); |
| 106 | return NULL; | 80 | return NULL; |
| 107 | } | 81 | } |
| 108 | #endif | ||
| 109 | 82 | ||
| 110 | memset(dmah->vaddr, 0, size); | 83 | memset(dmah->vaddr, 0, size); |
| 111 | 84 | ||
| @@ -132,17 +105,8 @@ void __drm_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah) | |||
| 132 | unsigned long addr; | 105 | unsigned long addr; |
| 133 | size_t sz; | 106 | size_t sz; |
| 134 | #endif | 107 | #endif |
| 135 | #ifdef DRM_DEBUG_MEMORY | ||
| 136 | int area = DRM_MEM_DMA; | ||
| 137 | int alloc_count; | ||
| 138 | int free_count; | ||
| 139 | #endif | ||
| 140 | 108 | ||
| 141 | if (!dmah->vaddr) { | 109 | if (dmah->vaddr) { |
| 142 | #ifdef DRM_DEBUG_MEMORY | ||
| 143 | DRM_MEM_ERROR(area, "Attempt to free address 0\n"); | ||
| 144 | #endif | ||
| 145 | } else { | ||
| 146 | /* XXX - Is virt_to_page() legal for consistent mem? */ | 110 | /* XXX - Is virt_to_page() legal for consistent mem? */ |
| 147 | /* Unreserve */ | 111 | /* Unreserve */ |
| 148 | for (addr = (unsigned long)dmah->vaddr, sz = dmah->size; | 112 | for (addr = (unsigned long)dmah->vaddr, sz = dmah->size; |
| @@ -152,21 +116,6 @@ void __drm_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah) | |||
| 152 | dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr, | 116 | dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr, |
| 153 | dmah->busaddr); | 117 | dmah->busaddr); |
| 154 | } | 118 | } |
| 155 | |||
| 156 | #ifdef DRM_DEBUG_MEMORY | ||
| 157 | spin_lock(&drm_mem_lock); | ||
| 158 | free_count = ++drm_mem_stats[area].free_count; | ||
| 159 | alloc_count = drm_mem_stats[area].succeed_count; | ||
| 160 | drm_mem_stats[area].bytes_freed += size; | ||
| 161 | drm_ram_used -= size; | ||
| 162 | spin_unlock(&drm_mem_lock); | ||
| 163 | if (free_count > alloc_count) { | ||
| 164 | DRM_MEM_ERROR(area, | ||
| 165 | "Excess frees: %d frees, %d allocs\n", | ||
| 166 | free_count, alloc_count); | ||
| 167 | } | ||
| 168 | #endif | ||
| 169 | |||
| 170 | } | 119 | } |
| 171 | 120 | ||
| 172 | /** | 121 | /** |
diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c index bae5391165ac..bbd4b3d1074a 100644 --- a/drivers/gpu/drm/drm_proc.c +++ b/drivers/gpu/drm/drm_proc.c | |||
| @@ -105,13 +105,12 @@ int drm_proc_create_files(struct drm_info_list *files, int count, | |||
| 105 | (dev->driver->driver_features & features) != features) | 105 | (dev->driver->driver_features & features) != features) |
| 106 | continue; | 106 | continue; |
| 107 | 107 | ||
| 108 | tmp = drm_alloc(sizeof(struct drm_info_node), _DRM_DRIVER); | 108 | tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL); |
| 109 | ent = create_proc_entry(files[i].name, S_IFREG | S_IRUGO, root); | 109 | ent = create_proc_entry(files[i].name, S_IFREG | S_IRUGO, root); |
| 110 | if (!ent) { | 110 | if (!ent) { |
| 111 | DRM_ERROR("Cannot create /proc/dri/%s/%s\n", | 111 | DRM_ERROR("Cannot create /proc/dri/%s/%s\n", |
| 112 | name, files[i].name); | 112 | name, files[i].name); |
| 113 | drm_free(tmp, sizeof(struct drm_info_node), | 113 | kfree(tmp); |
| 114 | _DRM_DRIVER); | ||
| 115 | ret = -1; | 114 | ret = -1; |
| 116 | goto fail; | 115 | goto fail; |
| 117 | } | 116 | } |
| @@ -192,8 +191,7 @@ int drm_proc_remove_files(struct drm_info_list *files, int count, | |||
| 192 | remove_proc_entry(files[i].name, | 191 | remove_proc_entry(files[i].name, |
| 193 | minor->proc_root); | 192 | minor->proc_root); |
| 194 | list_del(pos); | 193 | list_del(pos); |
| 195 | drm_free(tmp, sizeof(struct drm_info_node), | 194 | kfree(tmp); |
| 196 | _DRM_DRIVER); | ||
| 197 | } | 195 | } |
| 198 | } | 196 | } |
| 199 | } | 197 | } |
diff --git a/drivers/gpu/drm/drm_scatter.c b/drivers/gpu/drm/drm_scatter.c index b2b0f3d41714..c7823c863d4f 100644 --- a/drivers/gpu/drm/drm_scatter.c +++ b/drivers/gpu/drm/drm_scatter.c | |||
| @@ -58,11 +58,9 @@ void drm_sg_cleanup(struct drm_sg_mem * entry) | |||
| 58 | 58 | ||
| 59 | vfree(entry->virtual); | 59 | vfree(entry->virtual); |
| 60 | 60 | ||
| 61 | drm_free(entry->busaddr, | 61 | kfree(entry->busaddr); |
| 62 | entry->pages * sizeof(*entry->busaddr), DRM_MEM_PAGES); | 62 | kfree(entry->pagelist); |
| 63 | drm_free(entry->pagelist, | 63 | kfree(entry); |
| 64 | entry->pages * sizeof(*entry->pagelist), DRM_MEM_PAGES); | ||
| 65 | drm_free(entry, sizeof(*entry), DRM_MEM_SGLISTS); | ||
| 66 | } | 64 | } |
| 67 | 65 | ||
| 68 | #ifdef _LP64 | 66 | #ifdef _LP64 |
| @@ -84,7 +82,7 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request) | |||
| 84 | if (dev->sg) | 82 | if (dev->sg) |
| 85 | return -EINVAL; | 83 | return -EINVAL; |
| 86 | 84 | ||
| 87 | entry = drm_alloc(sizeof(*entry), DRM_MEM_SGLISTS); | 85 | entry = kmalloc(sizeof(*entry), GFP_KERNEL); |
| 88 | if (!entry) | 86 | if (!entry) |
| 89 | return -ENOMEM; | 87 | return -ENOMEM; |
| 90 | 88 | ||
| @@ -93,34 +91,27 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request) | |||
| 93 | DRM_DEBUG("size=%ld pages=%ld\n", request->size, pages); | 91 | DRM_DEBUG("size=%ld pages=%ld\n", request->size, pages); |
| 94 | 92 | ||
| 95 | entry->pages = pages; | 93 | entry->pages = pages; |
| 96 | entry->pagelist = drm_alloc(pages * sizeof(*entry->pagelist), | 94 | entry->pagelist = kmalloc(pages * sizeof(*entry->pagelist), GFP_KERNEL); |
| 97 | DRM_MEM_PAGES); | ||
| 98 | if (!entry->pagelist) { | 95 | if (!entry->pagelist) { |
| 99 | drm_free(entry, sizeof(*entry), DRM_MEM_SGLISTS); | 96 | kfree(entry); |
| 100 | return -ENOMEM; | 97 | return -ENOMEM; |
| 101 | } | 98 | } |
| 102 | 99 | ||
| 103 | memset(entry->pagelist, 0, pages * sizeof(*entry->pagelist)); | 100 | memset(entry->pagelist, 0, pages * sizeof(*entry->pagelist)); |
| 104 | 101 | ||
| 105 | entry->busaddr = drm_alloc(pages * sizeof(*entry->busaddr), | 102 | entry->busaddr = kmalloc(pages * sizeof(*entry->busaddr), GFP_KERNEL); |
| 106 | DRM_MEM_PAGES); | ||
| 107 | if (!entry->busaddr) { | 103 | if (!entry->busaddr) { |
| 108 | drm_free(entry->pagelist, | 104 | kfree(entry->pagelist); |
| 109 | entry->pages * sizeof(*entry->pagelist), | 105 | kfree(entry); |
| 110 | DRM_MEM_PAGES); | ||
| 111 | drm_free(entry, sizeof(*entry), DRM_MEM_SGLISTS); | ||
| 112 | return -ENOMEM; | 106 | return -ENOMEM; |
| 113 | } | 107 | } |
| 114 | memset((void *)entry->busaddr, 0, pages * sizeof(*entry->busaddr)); | 108 | memset((void *)entry->busaddr, 0, pages * sizeof(*entry->busaddr)); |
| 115 | 109 | ||
| 116 | entry->virtual = drm_vmalloc_dma(pages << PAGE_SHIFT); | 110 | entry->virtual = drm_vmalloc_dma(pages << PAGE_SHIFT); |
| 117 | if (!entry->virtual) { | 111 | if (!entry->virtual) { |
| 118 | drm_free(entry->busaddr, | 112 | kfree(entry->busaddr); |
| 119 | entry->pages * sizeof(*entry->busaddr), DRM_MEM_PAGES); | 113 | kfree(entry->pagelist); |
| 120 | drm_free(entry->pagelist, | 114 | kfree(entry); |
| 121 | entry->pages * sizeof(*entry->pagelist), | ||
| 122 | DRM_MEM_PAGES); | ||
| 123 | drm_free(entry, sizeof(*entry), DRM_MEM_SGLISTS); | ||
| 124 | return -ENOMEM; | 115 | return -ENOMEM; |
| 125 | } | 116 | } |
| 126 | 117 | ||
diff --git a/drivers/gpu/drm/drm_sman.c b/drivers/gpu/drm/drm_sman.c index 926f146390ce..463aed9403db 100644 --- a/drivers/gpu/drm/drm_sman.c +++ b/drivers/gpu/drm/drm_sman.c | |||
| @@ -48,9 +48,7 @@ void drm_sman_takedown(struct drm_sman * sman) | |||
| 48 | { | 48 | { |
| 49 | drm_ht_remove(&sman->user_hash_tab); | 49 | drm_ht_remove(&sman->user_hash_tab); |
| 50 | drm_ht_remove(&sman->owner_hash_tab); | 50 | drm_ht_remove(&sman->owner_hash_tab); |
| 51 | if (sman->mm) | 51 | kfree(sman->mm); |
| 52 | drm_free(sman->mm, sman->num_managers * sizeof(*sman->mm), | ||
| 53 | DRM_MEM_MM); | ||
| 54 | } | 52 | } |
| 55 | 53 | ||
| 56 | EXPORT_SYMBOL(drm_sman_takedown); | 54 | EXPORT_SYMBOL(drm_sman_takedown); |
| @@ -61,8 +59,9 @@ drm_sman_init(struct drm_sman * sman, unsigned int num_managers, | |||
| 61 | { | 59 | { |
| 62 | int ret = 0; | 60 | int ret = 0; |
| 63 | 61 | ||
| 64 | sman->mm = (struct drm_sman_mm *) drm_calloc(num_managers, sizeof(*sman->mm), | 62 | sman->mm = (struct drm_sman_mm *) kcalloc(num_managers, |
| 65 | DRM_MEM_MM); | 63 | sizeof(*sman->mm), |
| 64 | GFP_KERNEL); | ||
| 66 | if (!sman->mm) { | 65 | if (!sman->mm) { |
| 67 | ret = -ENOMEM; | 66 | ret = -ENOMEM; |
| 68 | goto out; | 67 | goto out; |
| @@ -78,7 +77,7 @@ drm_sman_init(struct drm_sman * sman, unsigned int num_managers, | |||
| 78 | 77 | ||
| 79 | drm_ht_remove(&sman->owner_hash_tab); | 78 | drm_ht_remove(&sman->owner_hash_tab); |
| 80 | out1: | 79 | out1: |
| 81 | drm_free(sman->mm, num_managers * sizeof(*sman->mm), DRM_MEM_MM); | 80 | kfree(sman->mm); |
| 82 | out: | 81 | out: |
| 83 | return ret; | 82 | return ret; |
| 84 | } | 83 | } |
| @@ -110,7 +109,7 @@ static void drm_sman_mm_destroy(void *private) | |||
| 110 | { | 109 | { |
| 111 | struct drm_mm *mm = (struct drm_mm *) private; | 110 | struct drm_mm *mm = (struct drm_mm *) private; |
| 112 | drm_mm_takedown(mm); | 111 | drm_mm_takedown(mm); |
| 113 | drm_free(mm, sizeof(*mm), DRM_MEM_MM); | 112 | kfree(mm); |
| 114 | } | 113 | } |
| 115 | 114 | ||
| 116 | static unsigned long drm_sman_mm_offset(void *private, void *ref) | 115 | static unsigned long drm_sman_mm_offset(void *private, void *ref) |
| @@ -130,7 +129,7 @@ drm_sman_set_range(struct drm_sman * sman, unsigned int manager, | |||
| 130 | BUG_ON(manager >= sman->num_managers); | 129 | BUG_ON(manager >= sman->num_managers); |
| 131 | 130 | ||
| 132 | sman_mm = &sman->mm[manager]; | 131 | sman_mm = &sman->mm[manager]; |
| 133 | mm = drm_calloc(1, sizeof(*mm), DRM_MEM_MM); | 132 | mm = kzalloc(sizeof(*mm), GFP_KERNEL); |
| 134 | if (!mm) { | 133 | if (!mm) { |
| 135 | return -ENOMEM; | 134 | return -ENOMEM; |
| 136 | } | 135 | } |
| @@ -138,7 +137,7 @@ drm_sman_set_range(struct drm_sman * sman, unsigned int manager, | |||
| 138 | ret = drm_mm_init(mm, start, size); | 137 | ret = drm_mm_init(mm, start, size); |
| 139 | 138 | ||
| 140 | if (ret) { | 139 | if (ret) { |
| 141 | drm_free(mm, sizeof(*mm), DRM_MEM_MM); | 140 | kfree(mm); |
| 142 | return ret; | 141 | return ret; |
| 143 | } | 142 | } |
| 144 | 143 | ||
| @@ -176,7 +175,7 @@ static struct drm_owner_item *drm_sman_get_owner_item(struct drm_sman * sman, | |||
| 176 | owner_hash); | 175 | owner_hash); |
| 177 | } | 176 | } |
| 178 | 177 | ||
| 179 | owner_item = drm_calloc(1, sizeof(*owner_item), DRM_MEM_MM); | 178 | owner_item = kzalloc(sizeof(*owner_item), GFP_KERNEL); |
| 180 | if (!owner_item) | 179 | if (!owner_item) |
| 181 | goto out; | 180 | goto out; |
| 182 | 181 | ||
| @@ -189,7 +188,7 @@ static struct drm_owner_item *drm_sman_get_owner_item(struct drm_sman * sman, | |||
| 189 | return owner_item; | 188 | return owner_item; |
| 190 | 189 | ||
| 191 | out1: | 190 | out1: |
| 192 | drm_free(owner_item, sizeof(*owner_item), DRM_MEM_MM); | 191 | kfree(owner_item); |
| 193 | out: | 192 | out: |
| 194 | return NULL; | 193 | return NULL; |
| 195 | } | 194 | } |
| @@ -212,7 +211,7 @@ struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int man | |||
| 212 | return NULL; | 211 | return NULL; |
| 213 | } | 212 | } |
| 214 | 213 | ||
| 215 | memblock = drm_calloc(1, sizeof(*memblock), DRM_MEM_MM); | 214 | memblock = kzalloc(sizeof(*memblock), GFP_KERNEL); |
| 216 | 215 | ||
| 217 | if (!memblock) | 216 | if (!memblock) |
| 218 | goto out; | 217 | goto out; |
| @@ -237,7 +236,7 @@ struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int man | |||
| 237 | out2: | 236 | out2: |
| 238 | drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash); | 237 | drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash); |
| 239 | out1: | 238 | out1: |
| 240 | drm_free(memblock, sizeof(*memblock), DRM_MEM_MM); | 239 | kfree(memblock); |
| 241 | out: | 240 | out: |
| 242 | sman_mm->free(sman_mm->private, tmp); | 241 | sman_mm->free(sman_mm->private, tmp); |
| 243 | 242 | ||
| @@ -253,7 +252,7 @@ static void drm_sman_free(struct drm_memblock_item *item) | |||
| 253 | list_del(&item->owner_list); | 252 | list_del(&item->owner_list); |
| 254 | drm_ht_remove_item(&sman->user_hash_tab, &item->user_hash); | 253 | drm_ht_remove_item(&sman->user_hash_tab, &item->user_hash); |
| 255 | item->mm->free(item->mm->private, item->mm_info); | 254 | item->mm->free(item->mm->private, item->mm_info); |
| 256 | drm_free(item, sizeof(*item), DRM_MEM_MM); | 255 | kfree(item); |
| 257 | } | 256 | } |
| 258 | 257 | ||
| 259 | int drm_sman_free_key(struct drm_sman *sman, unsigned int key) | 258 | int drm_sman_free_key(struct drm_sman *sman, unsigned int key) |
| @@ -277,7 +276,7 @@ static void drm_sman_remove_owner(struct drm_sman *sman, | |||
| 277 | { | 276 | { |
| 278 | list_del(&owner_item->sman_list); | 277 | list_del(&owner_item->sman_list); |
| 279 | drm_ht_remove_item(&sman->owner_hash_tab, &owner_item->owner_hash); | 278 | drm_ht_remove_item(&sman->owner_hash_tab, &owner_item->owner_hash); |
| 280 | drm_free(owner_item, sizeof(*owner_item), DRM_MEM_MM); | 279 | kfree(owner_item); |
| 281 | } | 280 | } |
| 282 | 281 | ||
| 283 | int drm_sman_owner_clean(struct drm_sman *sman, unsigned long owner) | 282 | int drm_sman_owner_clean(struct drm_sman *sman, unsigned long owner) |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 387a8de1bc7e..155a5bbce680 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
| @@ -107,7 +107,7 @@ struct drm_master *drm_master_create(struct drm_minor *minor) | |||
| 107 | { | 107 | { |
| 108 | struct drm_master *master; | 108 | struct drm_master *master; |
| 109 | 109 | ||
| 110 | master = drm_calloc(1, sizeof(*master), DRM_MEM_DRIVER); | 110 | master = kzalloc(sizeof(*master), GFP_KERNEL); |
| 111 | if (!master) | 111 | if (!master) |
| 112 | return NULL; | 112 | return NULL; |
| 113 | 113 | ||
| @@ -149,7 +149,7 @@ static void drm_master_destroy(struct kref *kref) | |||
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | if (master->unique) { | 151 | if (master->unique) { |
| 152 | drm_free(master->unique, master->unique_size, DRM_MEM_DRIVER); | 152 | kfree(master->unique); |
| 153 | master->unique = NULL; | 153 | master->unique = NULL; |
| 154 | master->unique_len = 0; | 154 | master->unique_len = 0; |
| 155 | } | 155 | } |
| @@ -157,12 +157,12 @@ static void drm_master_destroy(struct kref *kref) | |||
| 157 | list_for_each_entry_safe(pt, next, &master->magicfree, head) { | 157 | list_for_each_entry_safe(pt, next, &master->magicfree, head) { |
| 158 | list_del(&pt->head); | 158 | list_del(&pt->head); |
| 159 | drm_ht_remove_item(&master->magiclist, &pt->hash_item); | 159 | drm_ht_remove_item(&master->magiclist, &pt->hash_item); |
| 160 | drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); | 160 | kfree(pt); |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | drm_ht_remove(&master->magiclist); | 163 | drm_ht_remove(&master->magiclist); |
| 164 | 164 | ||
| 165 | drm_free(master, sizeof(*master), DRM_MEM_DRIVER); | 165 | kfree(master); |
| 166 | } | 166 | } |
| 167 | 167 | ||
| 168 | void drm_master_put(struct drm_master **master) | 168 | void drm_master_put(struct drm_master **master) |
| @@ -390,7 +390,7 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | |||
| 390 | 390 | ||
| 391 | DRM_DEBUG("\n"); | 391 | DRM_DEBUG("\n"); |
| 392 | 392 | ||
| 393 | dev = drm_calloc(1, sizeof(*dev), DRM_MEM_STUB); | 393 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
| 394 | if (!dev) | 394 | if (!dev) |
| 395 | return -ENOMEM; | 395 | return -ENOMEM; |
| 396 | 396 | ||
| @@ -443,7 +443,7 @@ err_g3: | |||
| 443 | err_g2: | 443 | err_g2: |
| 444 | pci_disable_device(pdev); | 444 | pci_disable_device(pdev); |
| 445 | err_g1: | 445 | err_g1: |
| 446 | drm_free(dev, sizeof(*dev), DRM_MEM_STUB); | 446 | kfree(dev); |
| 447 | return ret; | 447 | return ret; |
| 448 | } | 448 | } |
| 449 | EXPORT_SYMBOL(drm_get_dev); | 449 | EXPORT_SYMBOL(drm_get_dev); |
| @@ -516,7 +516,7 @@ void drm_put_dev(struct drm_device *dev) | |||
| 516 | dev->driver->unload(dev); | 516 | dev->driver->unload(dev); |
| 517 | 517 | ||
| 518 | if (drm_core_has_AGP(dev) && dev->agp) { | 518 | if (drm_core_has_AGP(dev) && dev->agp) { |
| 519 | drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS); | 519 | kfree(dev->agp); |
| 520 | dev->agp = NULL; | 520 | dev->agp = NULL; |
| 521 | } | 521 | } |
| 522 | 522 | ||
| @@ -535,10 +535,9 @@ void drm_put_dev(struct drm_device *dev) | |||
| 535 | drm_put_minor(&dev->primary); | 535 | drm_put_minor(&dev->primary); |
| 536 | 536 | ||
| 537 | if (dev->devname) { | 537 | if (dev->devname) { |
| 538 | drm_free(dev->devname, strlen(dev->devname) + 1, | 538 | kfree(dev->devname); |
| 539 | DRM_MEM_DRIVER); | ||
| 540 | dev->devname = NULL; | 539 | dev->devname = NULL; |
| 541 | } | 540 | } |
| 542 | drm_free(dev, sizeof(*dev), DRM_MEM_STUB); | 541 | kfree(dev); |
| 543 | } | 542 | } |
| 544 | EXPORT_SYMBOL(drm_put_dev); | 543 | EXPORT_SYMBOL(drm_put_dev); |
diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c index 22f76567ac7d..7e1fbe5d4779 100644 --- a/drivers/gpu/drm/drm_vm.c +++ b/drivers/gpu/drm/drm_vm.c | |||
| @@ -144,14 +144,14 @@ static int drm_do_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 144 | * Get the page, inc the use count, and return it | 144 | * Get the page, inc the use count, and return it |
| 145 | */ | 145 | */ |
| 146 | offset = (baddr - agpmem->bound) >> PAGE_SHIFT; | 146 | offset = (baddr - agpmem->bound) >> PAGE_SHIFT; |
| 147 | page = virt_to_page(__va(agpmem->memory->memory[offset])); | 147 | page = agpmem->memory->pages[offset]; |
| 148 | get_page(page); | 148 | get_page(page); |
| 149 | vmf->page = page; | 149 | vmf->page = page; |
| 150 | 150 | ||
| 151 | DRM_DEBUG | 151 | DRM_DEBUG |
| 152 | ("baddr = 0x%llx page = 0x%p, offset = 0x%llx, count=%d\n", | 152 | ("baddr = 0x%llx page = 0x%p, offset = 0x%llx, count=%d\n", |
| 153 | (unsigned long long)baddr, | 153 | (unsigned long long)baddr, |
| 154 | __va(agpmem->memory->memory[offset]), | 154 | agpmem->memory->pages[offset], |
| 155 | (unsigned long long)offset, | 155 | (unsigned long long)offset, |
| 156 | page_count(page)); | 156 | page_count(page)); |
| 157 | return 0; | 157 | return 0; |
| @@ -227,7 +227,7 @@ static void drm_vm_shm_close(struct vm_area_struct *vma) | |||
| 227 | found_maps++; | 227 | found_maps++; |
| 228 | if (pt->vma == vma) { | 228 | if (pt->vma == vma) { |
| 229 | list_del(&pt->head); | 229 | list_del(&pt->head); |
| 230 | drm_free(pt, sizeof(*pt), DRM_MEM_VMAS); | 230 | kfree(pt); |
| 231 | } | 231 | } |
| 232 | } | 232 | } |
| 233 | 233 | ||
| @@ -273,7 +273,7 @@ static void drm_vm_shm_close(struct vm_area_struct *vma) | |||
| 273 | DRM_ERROR("tried to rmmap GEM object\n"); | 273 | DRM_ERROR("tried to rmmap GEM object\n"); |
| 274 | break; | 274 | break; |
| 275 | } | 275 | } |
| 276 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 276 | kfree(map); |
| 277 | } | 277 | } |
| 278 | } | 278 | } |
| 279 | mutex_unlock(&dev->struct_mutex); | 279 | mutex_unlock(&dev->struct_mutex); |
| @@ -414,7 +414,7 @@ void drm_vm_open_locked(struct vm_area_struct *vma) | |||
| 414 | vma->vm_start, vma->vm_end - vma->vm_start); | 414 | vma->vm_start, vma->vm_end - vma->vm_start); |
| 415 | atomic_inc(&dev->vma_count); | 415 | atomic_inc(&dev->vma_count); |
| 416 | 416 | ||
| 417 | vma_entry = drm_alloc(sizeof(*vma_entry), DRM_MEM_VMAS); | 417 | vma_entry = kmalloc(sizeof(*vma_entry), GFP_KERNEL); |
| 418 | if (vma_entry) { | 418 | if (vma_entry) { |
| 419 | vma_entry->vma = vma; | 419 | vma_entry->vma = vma; |
| 420 | vma_entry->pid = current->pid; | 420 | vma_entry->pid = current->pid; |
| @@ -454,7 +454,7 @@ static void drm_vm_close(struct vm_area_struct *vma) | |||
| 454 | list_for_each_entry_safe(pt, temp, &dev->vmalist, head) { | 454 | list_for_each_entry_safe(pt, temp, &dev->vmalist, head) { |
| 455 | if (pt->vma == vma) { | 455 | if (pt->vma == vma) { |
| 456 | list_del(&pt->head); | 456 | list_del(&pt->head); |
| 457 | drm_free(pt, sizeof(*pt), DRM_MEM_VMAS); | 457 | kfree(pt); |
| 458 | break; | 458 | break; |
| 459 | } | 459 | } |
| 460 | } | 460 | } |
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index e5de8ea41544..7d1d88cdf2dc 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
| @@ -227,8 +227,7 @@ static int i810_dma_cleanup(struct drm_device * dev) | |||
| 227 | /* Need to rewrite hardware status page */ | 227 | /* Need to rewrite hardware status page */ |
| 228 | I810_WRITE(0x02080, 0x1ffff000); | 228 | I810_WRITE(0x02080, 0x1ffff000); |
| 229 | } | 229 | } |
| 230 | drm_free(dev->dev_private, sizeof(drm_i810_private_t), | 230 | kfree(dev->dev_private); |
| 231 | DRM_MEM_DRIVER); | ||
| 232 | dev->dev_private = NULL; | 231 | dev->dev_private = NULL; |
| 233 | 232 | ||
| 234 | for (i = 0; i < dma->buf_count; i++) { | 233 | for (i = 0; i < dma->buf_count; i++) { |
| @@ -439,8 +438,7 @@ static int i810_dma_init(struct drm_device *dev, void *data, | |||
| 439 | switch (init->func) { | 438 | switch (init->func) { |
| 440 | case I810_INIT_DMA_1_4: | 439 | case I810_INIT_DMA_1_4: |
| 441 | DRM_INFO("Using v1.4 init.\n"); | 440 | DRM_INFO("Using v1.4 init.\n"); |
| 442 | dev_priv = drm_alloc(sizeof(drm_i810_private_t), | 441 | dev_priv = kmalloc(sizeof(drm_i810_private_t), GFP_KERNEL); |
| 443 | DRM_MEM_DRIVER); | ||
| 444 | if (dev_priv == NULL) | 442 | if (dev_priv == NULL) |
| 445 | return -ENOMEM; | 443 | return -ENOMEM; |
| 446 | retcode = i810_dma_initialize(dev, dev_priv, init); | 444 | retcode = i810_dma_initialize(dev, dev_priv, init); |
diff --git a/drivers/gpu/drm/i830/i830_dma.c b/drivers/gpu/drm/i830/i830_dma.c index a86ab30b4620..877bf6cb14a4 100644 --- a/drivers/gpu/drm/i830/i830_dma.c +++ b/drivers/gpu/drm/i830/i830_dma.c | |||
| @@ -232,8 +232,7 @@ static int i830_dma_cleanup(struct drm_device * dev) | |||
| 232 | I830_WRITE(0x02080, 0x1ffff000); | 232 | I830_WRITE(0x02080, 0x1ffff000); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | drm_free(dev->dev_private, sizeof(drm_i830_private_t), | 235 | kfree(dev->dev_private); |
| 236 | DRM_MEM_DRIVER); | ||
| 237 | dev->dev_private = NULL; | 236 | dev->dev_private = NULL; |
| 238 | 237 | ||
| 239 | for (i = 0; i < dma->buf_count; i++) { | 238 | for (i = 0; i < dma->buf_count; i++) { |
| @@ -459,8 +458,7 @@ static int i830_dma_init(struct drm_device *dev, void *data, | |||
| 459 | 458 | ||
| 460 | switch (init->func) { | 459 | switch (init->func) { |
| 461 | case I830_INIT_DMA: | 460 | case I830_INIT_DMA: |
| 462 | dev_priv = drm_alloc(sizeof(drm_i830_private_t), | 461 | dev_priv = kmalloc(sizeof(drm_i830_private_t), GFP_KERNEL); |
| 463 | DRM_MEM_DRIVER); | ||
| 464 | if (dev_priv == NULL) | 462 | if (dev_priv == NULL) |
| 465 | return -ENOMEM; | 463 | return -ENOMEM; |
| 466 | retcode = i830_dma_initialize(dev, dev_priv, init); | 464 | retcode = i830_dma_initialize(dev, dev_priv, init); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 1a60626f6803..f112c769d533 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -643,9 +643,9 @@ static int i915_batchbuffer(struct drm_device *dev, void *data, | |||
| 643 | return -EINVAL; | 643 | return -EINVAL; |
| 644 | 644 | ||
| 645 | if (batch->num_cliprects) { | 645 | if (batch->num_cliprects) { |
| 646 | cliprects = drm_calloc(batch->num_cliprects, | 646 | cliprects = kcalloc(batch->num_cliprects, |
| 647 | sizeof(struct drm_clip_rect), | 647 | sizeof(struct drm_clip_rect), |
| 648 | DRM_MEM_DRIVER); | 648 | GFP_KERNEL); |
| 649 | if (cliprects == NULL) | 649 | if (cliprects == NULL) |
| 650 | return -ENOMEM; | 650 | return -ENOMEM; |
| 651 | 651 | ||
| @@ -664,9 +664,7 @@ static int i915_batchbuffer(struct drm_device *dev, void *data, | |||
| 664 | sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); | 664 | sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); |
| 665 | 665 | ||
| 666 | fail_free: | 666 | fail_free: |
| 667 | drm_free(cliprects, | 667 | kfree(cliprects); |
| 668 | batch->num_cliprects * sizeof(struct drm_clip_rect), | ||
| 669 | DRM_MEM_DRIVER); | ||
| 670 | 668 | ||
| 671 | return ret; | 669 | return ret; |
| 672 | } | 670 | } |
| @@ -692,7 +690,7 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data, | |||
| 692 | if (cmdbuf->num_cliprects < 0) | 690 | if (cmdbuf->num_cliprects < 0) |
| 693 | return -EINVAL; | 691 | return -EINVAL; |
| 694 | 692 | ||
| 695 | batch_data = drm_alloc(cmdbuf->sz, DRM_MEM_DRIVER); | 693 | batch_data = kmalloc(cmdbuf->sz, GFP_KERNEL); |
| 696 | if (batch_data == NULL) | 694 | if (batch_data == NULL) |
| 697 | return -ENOMEM; | 695 | return -ENOMEM; |
| 698 | 696 | ||
| @@ -701,9 +699,8 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data, | |||
| 701 | goto fail_batch_free; | 699 | goto fail_batch_free; |
| 702 | 700 | ||
| 703 | if (cmdbuf->num_cliprects) { | 701 | if (cmdbuf->num_cliprects) { |
| 704 | cliprects = drm_calloc(cmdbuf->num_cliprects, | 702 | cliprects = kcalloc(cmdbuf->num_cliprects, |
| 705 | sizeof(struct drm_clip_rect), | 703 | sizeof(struct drm_clip_rect), GFP_KERNEL); |
| 706 | DRM_MEM_DRIVER); | ||
| 707 | if (cliprects == NULL) | 704 | if (cliprects == NULL) |
| 708 | goto fail_batch_free; | 705 | goto fail_batch_free; |
| 709 | 706 | ||
| @@ -726,11 +723,9 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data, | |||
| 726 | sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); | 723 | sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); |
| 727 | 724 | ||
| 728 | fail_clip_free: | 725 | fail_clip_free: |
| 729 | drm_free(cliprects, | 726 | kfree(cliprects); |
| 730 | cmdbuf->num_cliprects * sizeof(struct drm_clip_rect), | ||
| 731 | DRM_MEM_DRIVER); | ||
| 732 | fail_batch_free: | 727 | fail_batch_free: |
| 733 | drm_free(batch_data, cmdbuf->sz, DRM_MEM_DRIVER); | 728 | kfree(batch_data); |
| 734 | 729 | ||
| 735 | return ret; | 730 | return ret; |
| 736 | } | 731 | } |
| @@ -1067,7 +1062,7 @@ int i915_master_create(struct drm_device *dev, struct drm_master *master) | |||
| 1067 | { | 1062 | { |
| 1068 | struct drm_i915_master_private *master_priv; | 1063 | struct drm_i915_master_private *master_priv; |
| 1069 | 1064 | ||
| 1070 | master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER); | 1065 | master_priv = kzalloc(sizeof(*master_priv), GFP_KERNEL); |
| 1071 | if (!master_priv) | 1066 | if (!master_priv) |
| 1072 | return -ENOMEM; | 1067 | return -ENOMEM; |
| 1073 | 1068 | ||
| @@ -1082,7 +1077,7 @@ void i915_master_destroy(struct drm_device *dev, struct drm_master *master) | |||
| 1082 | if (!master_priv) | 1077 | if (!master_priv) |
| 1083 | return; | 1078 | return; |
| 1084 | 1079 | ||
| 1085 | drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER); | 1080 | kfree(master_priv); |
| 1086 | 1081 | ||
| 1087 | master->driver_priv = NULL; | 1082 | master->driver_priv = NULL; |
| 1088 | } | 1083 | } |
| @@ -1111,12 +1106,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1111 | dev->types[8] = _DRM_STAT_SECONDARY; | 1106 | dev->types[8] = _DRM_STAT_SECONDARY; |
| 1112 | dev->types[9] = _DRM_STAT_DMA; | 1107 | dev->types[9] = _DRM_STAT_DMA; |
| 1113 | 1108 | ||
| 1114 | dev_priv = drm_alloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER); | 1109 | dev_priv = kzalloc(sizeof(drm_i915_private_t), GFP_KERNEL); |
| 1115 | if (dev_priv == NULL) | 1110 | if (dev_priv == NULL) |
| 1116 | return -ENOMEM; | 1111 | return -ENOMEM; |
| 1117 | 1112 | ||
| 1118 | memset(dev_priv, 0, sizeof(drm_i915_private_t)); | ||
| 1119 | |||
| 1120 | dev->dev_private = (void *)dev_priv; | 1113 | dev->dev_private = (void *)dev_priv; |
| 1121 | dev_priv->dev = dev; | 1114 | dev_priv->dev = dev; |
| 1122 | 1115 | ||
| @@ -1153,13 +1146,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1153 | "performance may suffer.\n"); | 1146 | "performance may suffer.\n"); |
| 1154 | } | 1147 | } |
| 1155 | 1148 | ||
| 1156 | #ifdef CONFIG_HIGHMEM64G | ||
| 1157 | /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */ | ||
| 1158 | dev_priv->has_gem = 0; | ||
| 1159 | #else | ||
| 1160 | /* enable GEM by default */ | 1149 | /* enable GEM by default */ |
| 1161 | dev_priv->has_gem = 1; | 1150 | dev_priv->has_gem = 1; |
| 1162 | #endif | ||
| 1163 | 1151 | ||
| 1164 | dev->driver->get_vblank_counter = i915_get_vblank_counter; | 1152 | dev->driver->get_vblank_counter = i915_get_vblank_counter; |
| 1165 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ | 1153 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |
| @@ -1221,7 +1209,7 @@ out_iomapfree: | |||
| 1221 | out_rmmap: | 1209 | out_rmmap: |
| 1222 | iounmap(dev_priv->regs); | 1210 | iounmap(dev_priv->regs); |
| 1223 | free_priv: | 1211 | free_priv: |
| 1224 | drm_free(dev_priv, sizeof(struct drm_i915_private), DRM_MEM_DRIVER); | 1212 | kfree(dev_priv); |
| 1225 | return ret; | 1213 | return ret; |
| 1226 | } | 1214 | } |
| 1227 | 1215 | ||
| @@ -1261,8 +1249,7 @@ int i915_driver_unload(struct drm_device *dev) | |||
| 1261 | i915_gem_lastclose(dev); | 1249 | i915_gem_lastclose(dev); |
| 1262 | } | 1250 | } |
| 1263 | 1251 | ||
| 1264 | drm_free(dev->dev_private, sizeof(drm_i915_private_t), | 1252 | kfree(dev->dev_private); |
| 1265 | DRM_MEM_DRIVER); | ||
| 1266 | 1253 | ||
| 1267 | return 0; | 1254 | return 0; |
| 1268 | } | 1255 | } |
| @@ -1273,7 +1260,7 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file_priv) | |||
| 1273 | 1260 | ||
| 1274 | DRM_DEBUG_DRIVER(I915_DRV, "\n"); | 1261 | DRM_DEBUG_DRIVER(I915_DRV, "\n"); |
| 1275 | i915_file_priv = (struct drm_i915_file_private *) | 1262 | i915_file_priv = (struct drm_i915_file_private *) |
| 1276 | drm_alloc(sizeof(*i915_file_priv), DRM_MEM_FILES); | 1263 | kmalloc(sizeof(*i915_file_priv), GFP_KERNEL); |
| 1277 | 1264 | ||
| 1278 | if (!i915_file_priv) | 1265 | if (!i915_file_priv) |
| 1279 | return -ENOMEM; | 1266 | return -ENOMEM; |
| @@ -1326,7 +1313,7 @@ void i915_driver_postclose(struct drm_device *dev, struct drm_file *file_priv) | |||
| 1326 | { | 1313 | { |
| 1327 | struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv; | 1314 | struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv; |
| 1328 | 1315 | ||
| 1329 | drm_free(i915_file_priv, sizeof(*i915_file_priv), DRM_MEM_FILES); | 1316 | kfree(i915_file_priv); |
| 1330 | } | 1317 | } |
| 1331 | 1318 | ||
| 1332 | struct drm_ioctl_desc i915_ioctls[] = { | 1319 | struct drm_ioctl_desc i915_ioctls[] = { |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 8ef6bcec211b..7a84f04e8439 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -646,6 +646,8 @@ void i915_gem_object_unpin(struct drm_gem_object *obj); | |||
| 646 | int i915_gem_object_unbind(struct drm_gem_object *obj); | 646 | int i915_gem_object_unbind(struct drm_gem_object *obj); |
| 647 | void i915_gem_lastclose(struct drm_device *dev); | 647 | void i915_gem_lastclose(struct drm_device *dev); |
| 648 | uint32_t i915_get_gem_seqno(struct drm_device *dev); | 648 | uint32_t i915_get_gem_seqno(struct drm_device *dev); |
| 649 | int i915_gem_object_get_fence_reg(struct drm_gem_object *obj); | ||
| 650 | int i915_gem_object_put_fence_reg(struct drm_gem_object *obj); | ||
| 649 | void i915_gem_retire_requests(struct drm_device *dev); | 651 | void i915_gem_retire_requests(struct drm_device *dev); |
| 650 | void i915_gem_retire_work_handler(struct work_struct *work); | 652 | void i915_gem_retire_work_handler(struct work_struct *work); |
| 651 | void i915_gem_clflush_object(struct drm_gem_object *obj); | 653 | void i915_gem_clflush_object(struct drm_gem_object *obj); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index c0ae6bbbd9b5..fd2b8bdffe3f 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -46,7 +46,6 @@ static void i915_gem_object_set_to_full_cpu_read_domain(struct drm_gem_object *o | |||
| 46 | static int i915_gem_object_wait_rendering(struct drm_gem_object *obj); | 46 | static int i915_gem_object_wait_rendering(struct drm_gem_object *obj); |
| 47 | static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, | 47 | static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, |
| 48 | unsigned alignment); | 48 | unsigned alignment); |
| 49 | static int i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write); | ||
| 50 | static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); | 49 | static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); |
| 51 | static int i915_gem_evict_something(struct drm_device *dev); | 50 | static int i915_gem_evict_something(struct drm_device *dev); |
| 52 | static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, | 51 | static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, |
| @@ -1158,7 +1157,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1158 | /* Need a new fence register? */ | 1157 | /* Need a new fence register? */ |
| 1159 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && | 1158 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && |
| 1160 | obj_priv->tiling_mode != I915_TILING_NONE) { | 1159 | obj_priv->tiling_mode != I915_TILING_NONE) { |
| 1161 | ret = i915_gem_object_get_fence_reg(obj, write); | 1160 | ret = i915_gem_object_get_fence_reg(obj); |
| 1162 | if (ret) { | 1161 | if (ret) { |
| 1163 | mutex_unlock(&dev->struct_mutex); | 1162 | mutex_unlock(&dev->struct_mutex); |
| 1164 | return VM_FAULT_SIGBUS; | 1163 | return VM_FAULT_SIGBUS; |
| @@ -1208,8 +1207,7 @@ i915_gem_create_mmap_offset(struct drm_gem_object *obj) | |||
| 1208 | 1207 | ||
| 1209 | /* Set the object up for mmap'ing */ | 1208 | /* Set the object up for mmap'ing */ |
| 1210 | list = &obj->map_list; | 1209 | list = &obj->map_list; |
| 1211 | list->map = drm_calloc(1, sizeof(struct drm_map_list), | 1210 | list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL); |
| 1212 | DRM_MEM_DRIVER); | ||
| 1213 | if (!list->map) | 1211 | if (!list->map) |
| 1214 | return -ENOMEM; | 1212 | return -ENOMEM; |
| 1215 | 1213 | ||
| @@ -1249,7 +1247,7 @@ i915_gem_create_mmap_offset(struct drm_gem_object *obj) | |||
| 1249 | out_free_mm: | 1247 | out_free_mm: |
| 1250 | drm_mm_put_block(list->file_offset_node); | 1248 | drm_mm_put_block(list->file_offset_node); |
| 1251 | out_free_list: | 1249 | out_free_list: |
| 1252 | drm_free(list->map, sizeof(struct drm_map_list), DRM_MEM_DRIVER); | 1250 | kfree(list->map); |
| 1253 | 1251 | ||
| 1254 | return ret; | 1252 | return ret; |
| 1255 | } | 1253 | } |
| @@ -1271,7 +1269,7 @@ i915_gem_free_mmap_offset(struct drm_gem_object *obj) | |||
| 1271 | } | 1269 | } |
| 1272 | 1270 | ||
| 1273 | if (list->map) { | 1271 | if (list->map) { |
| 1274 | drm_free(list->map, sizeof(struct drm_map), DRM_MEM_DRIVER); | 1272 | kfree(list->map); |
| 1275 | list->map = NULL; | 1273 | list->map = NULL; |
| 1276 | } | 1274 | } |
| 1277 | 1275 | ||
| @@ -1494,7 +1492,7 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv, | |||
| 1494 | if (file_priv != NULL) | 1492 | if (file_priv != NULL) |
| 1495 | i915_file_priv = file_priv->driver_priv; | 1493 | i915_file_priv = file_priv->driver_priv; |
| 1496 | 1494 | ||
| 1497 | request = drm_calloc(1, sizeof(*request), DRM_MEM_DRIVER); | 1495 | request = kzalloc(sizeof(*request), GFP_KERNEL); |
| 1498 | if (request == NULL) | 1496 | if (request == NULL) |
| 1499 | return 0; | 1497 | return 0; |
| 1500 | 1498 | ||
| @@ -1676,7 +1674,7 @@ i915_gem_retire_requests(struct drm_device *dev) | |||
| 1676 | 1674 | ||
| 1677 | list_del(&request->list); | 1675 | list_del(&request->list); |
| 1678 | list_del(&request->client_list); | 1676 | list_del(&request->client_list); |
| 1679 | drm_free(request, sizeof(*request), DRM_MEM_DRIVER); | 1677 | kfree(request); |
| 1680 | } else | 1678 | } else |
| 1681 | break; | 1679 | break; |
| 1682 | } | 1680 | } |
| @@ -2163,13 +2161,11 @@ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) | |||
| 2163 | val |= I830_FENCE_REG_VALID; | 2161 | val |= I830_FENCE_REG_VALID; |
| 2164 | 2162 | ||
| 2165 | I915_WRITE(FENCE_REG_830_0 + (regnum * 4), val); | 2163 | I915_WRITE(FENCE_REG_830_0 + (regnum * 4), val); |
| 2166 | |||
| 2167 | } | 2164 | } |
| 2168 | 2165 | ||
| 2169 | /** | 2166 | /** |
| 2170 | * i915_gem_object_get_fence_reg - set up a fence reg for an object | 2167 | * i915_gem_object_get_fence_reg - set up a fence reg for an object |
| 2171 | * @obj: object to map through a fence reg | 2168 | * @obj: object to map through a fence reg |
| 2172 | * @write: object is about to be written | ||
| 2173 | * | 2169 | * |
| 2174 | * When mapping objects through the GTT, userspace wants to be able to write | 2170 | * When mapping objects through the GTT, userspace wants to be able to write |
| 2175 | * to them without having to worry about swizzling if the object is tiled. | 2171 | * to them without having to worry about swizzling if the object is tiled. |
| @@ -2180,8 +2176,8 @@ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) | |||
| 2180 | * It then sets up the reg based on the object's properties: address, pitch | 2176 | * It then sets up the reg based on the object's properties: address, pitch |
| 2181 | * and tiling format. | 2177 | * and tiling format. |
| 2182 | */ | 2178 | */ |
| 2183 | static int | 2179 | int |
| 2184 | i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write) | 2180 | i915_gem_object_get_fence_reg(struct drm_gem_object *obj) |
| 2185 | { | 2181 | { |
| 2186 | struct drm_device *dev = obj->dev; | 2182 | struct drm_device *dev = obj->dev; |
| 2187 | struct drm_i915_private *dev_priv = dev->dev_private; | 2183 | struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -2331,6 +2327,42 @@ i915_gem_clear_fence_reg(struct drm_gem_object *obj) | |||
| 2331 | } | 2327 | } |
| 2332 | 2328 | ||
| 2333 | /** | 2329 | /** |
| 2330 | * i915_gem_object_put_fence_reg - waits on outstanding fenced access | ||
| 2331 | * to the buffer to finish, and then resets the fence register. | ||
| 2332 | * @obj: tiled object holding a fence register. | ||
| 2333 | * | ||
| 2334 | * Zeroes out the fence register itself and clears out the associated | ||
| 2335 | * data structures in dev_priv and obj_priv. | ||
| 2336 | */ | ||
| 2337 | int | ||
| 2338 | i915_gem_object_put_fence_reg(struct drm_gem_object *obj) | ||
| 2339 | { | ||
| 2340 | struct drm_device *dev = obj->dev; | ||
| 2341 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 2342 | |||
| 2343 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE) | ||
| 2344 | return 0; | ||
| 2345 | |||
| 2346 | /* On the i915, GPU access to tiled buffers is via a fence, | ||
| 2347 | * therefore we must wait for any outstanding access to complete | ||
| 2348 | * before clearing the fence. | ||
| 2349 | */ | ||
| 2350 | if (!IS_I965G(dev)) { | ||
| 2351 | int ret; | ||
| 2352 | |||
| 2353 | i915_gem_object_flush_gpu_write_domain(obj); | ||
| 2354 | i915_gem_object_flush_gtt_write_domain(obj); | ||
| 2355 | ret = i915_gem_object_wait_rendering(obj); | ||
| 2356 | if (ret != 0) | ||
| 2357 | return ret; | ||
| 2358 | } | ||
| 2359 | |||
| 2360 | i915_gem_clear_fence_reg (obj); | ||
| 2361 | |||
| 2362 | return 0; | ||
| 2363 | } | ||
| 2364 | |||
| 2365 | /** | ||
| 2334 | * Finds free space in the GTT aperture and binds the object there. | 2366 | * Finds free space in the GTT aperture and binds the object there. |
| 2335 | */ | 2367 | */ |
| 2336 | static int | 2368 | static int |
| @@ -2800,8 +2832,7 @@ i915_gem_object_set_to_full_cpu_read_domain(struct drm_gem_object *obj) | |||
| 2800 | /* Free the page_cpu_valid mappings which are now stale, whether | 2832 | /* Free the page_cpu_valid mappings which are now stale, whether |
| 2801 | * or not we've got I915_GEM_DOMAIN_CPU. | 2833 | * or not we've got I915_GEM_DOMAIN_CPU. |
| 2802 | */ | 2834 | */ |
| 2803 | drm_free(obj_priv->page_cpu_valid, obj->size / PAGE_SIZE, | 2835 | kfree(obj_priv->page_cpu_valid); |
| 2804 | DRM_MEM_DRIVER); | ||
| 2805 | obj_priv->page_cpu_valid = NULL; | 2836 | obj_priv->page_cpu_valid = NULL; |
| 2806 | } | 2837 | } |
| 2807 | 2838 | ||
| @@ -2843,8 +2874,8 @@ i915_gem_object_set_cpu_read_domain_range(struct drm_gem_object *obj, | |||
| 2843 | * newly adding I915_GEM_DOMAIN_CPU | 2874 | * newly adding I915_GEM_DOMAIN_CPU |
| 2844 | */ | 2875 | */ |
| 2845 | if (obj_priv->page_cpu_valid == NULL) { | 2876 | if (obj_priv->page_cpu_valid == NULL) { |
| 2846 | obj_priv->page_cpu_valid = drm_calloc(1, obj->size / PAGE_SIZE, | 2877 | obj_priv->page_cpu_valid = kzalloc(obj->size / PAGE_SIZE, |
| 2847 | DRM_MEM_DRIVER); | 2878 | GFP_KERNEL); |
| 2848 | if (obj_priv->page_cpu_valid == NULL) | 2879 | if (obj_priv->page_cpu_valid == NULL) |
| 2849 | return -ENOMEM; | 2880 | return -ENOMEM; |
| 2850 | } else if ((obj->read_domains & I915_GEM_DOMAIN_CPU) == 0) | 2881 | } else if ((obj->read_domains & I915_GEM_DOMAIN_CPU) == 0) |
| @@ -3267,8 +3298,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, | |||
| 3267 | } | 3298 | } |
| 3268 | 3299 | ||
| 3269 | if (args->num_cliprects != 0) { | 3300 | if (args->num_cliprects != 0) { |
| 3270 | cliprects = drm_calloc(args->num_cliprects, sizeof(*cliprects), | 3301 | cliprects = kcalloc(args->num_cliprects, sizeof(*cliprects), |
| 3271 | DRM_MEM_DRIVER); | 3302 | GFP_KERNEL); |
| 3272 | if (cliprects == NULL) | 3303 | if (cliprects == NULL) |
| 3273 | goto pre_mutex_err; | 3304 | goto pre_mutex_err; |
| 3274 | 3305 | ||
| @@ -3521,8 +3552,7 @@ err: | |||
| 3521 | pre_mutex_err: | 3552 | pre_mutex_err: |
| 3522 | drm_free_large(object_list); | 3553 | drm_free_large(object_list); |
| 3523 | drm_free_large(exec_list); | 3554 | drm_free_large(exec_list); |
| 3524 | drm_free(cliprects, sizeof(*cliprects) * args->num_cliprects, | 3555 | kfree(cliprects); |
| 3525 | DRM_MEM_DRIVER); | ||
| 3526 | 3556 | ||
| 3527 | return ret; | 3557 | return ret; |
| 3528 | } | 3558 | } |
| @@ -3550,7 +3580,7 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment) | |||
| 3550 | if (!IS_I965G(dev) && | 3580 | if (!IS_I965G(dev) && |
| 3551 | obj_priv->fence_reg == I915_FENCE_REG_NONE && | 3581 | obj_priv->fence_reg == I915_FENCE_REG_NONE && |
| 3552 | obj_priv->tiling_mode != I915_TILING_NONE) { | 3582 | obj_priv->tiling_mode != I915_TILING_NONE) { |
| 3553 | ret = i915_gem_object_get_fence_reg(obj, true); | 3583 | ret = i915_gem_object_get_fence_reg(obj); |
| 3554 | if (ret != 0) { | 3584 | if (ret != 0) { |
| 3555 | if (ret != -EBUSY && ret != -ERESTARTSYS) | 3585 | if (ret != -EBUSY && ret != -ERESTARTSYS) |
| 3556 | DRM_ERROR("Failure to install fence: %d\n", | 3586 | DRM_ERROR("Failure to install fence: %d\n", |
| @@ -3739,7 +3769,7 @@ int i915_gem_init_object(struct drm_gem_object *obj) | |||
| 3739 | { | 3769 | { |
| 3740 | struct drm_i915_gem_object *obj_priv; | 3770 | struct drm_i915_gem_object *obj_priv; |
| 3741 | 3771 | ||
| 3742 | obj_priv = drm_calloc(1, sizeof(*obj_priv), DRM_MEM_DRIVER); | 3772 | obj_priv = kzalloc(sizeof(*obj_priv), GFP_KERNEL); |
| 3743 | if (obj_priv == NULL) | 3773 | if (obj_priv == NULL) |
| 3744 | return -ENOMEM; | 3774 | return -ENOMEM; |
| 3745 | 3775 | ||
| @@ -3777,9 +3807,9 @@ void i915_gem_free_object(struct drm_gem_object *obj) | |||
| 3777 | 3807 | ||
| 3778 | i915_gem_free_mmap_offset(obj); | 3808 | i915_gem_free_mmap_offset(obj); |
| 3779 | 3809 | ||
| 3780 | drm_free(obj_priv->page_cpu_valid, 1, DRM_MEM_DRIVER); | 3810 | kfree(obj_priv->page_cpu_valid); |
| 3781 | kfree(obj_priv->bit_17); | 3811 | kfree(obj_priv->bit_17); |
| 3782 | drm_free(obj->driver_private, 1, DRM_MEM_DRIVER); | 3812 | kfree(obj->driver_private); |
| 3783 | } | 3813 | } |
| 3784 | 3814 | ||
| 3785 | /** Unbinds all objects that are on the given buffer list. */ | 3815 | /** Unbinds all objects that are on the given buffer list. */ |
| @@ -4233,7 +4263,7 @@ int i915_gem_init_phys_object(struct drm_device *dev, | |||
| 4233 | if (dev_priv->mm.phys_objs[id - 1] || !size) | 4263 | if (dev_priv->mm.phys_objs[id - 1] || !size) |
| 4234 | return 0; | 4264 | return 0; |
| 4235 | 4265 | ||
| 4236 | phys_obj = drm_calloc(1, sizeof(struct drm_i915_gem_phys_object), DRM_MEM_DRIVER); | 4266 | phys_obj = kzalloc(sizeof(struct drm_i915_gem_phys_object), GFP_KERNEL); |
| 4237 | if (!phys_obj) | 4267 | if (!phys_obj) |
| 4238 | return -ENOMEM; | 4268 | return -ENOMEM; |
| 4239 | 4269 | ||
| @@ -4252,7 +4282,7 @@ int i915_gem_init_phys_object(struct drm_device *dev, | |||
| 4252 | 4282 | ||
| 4253 | return 0; | 4283 | return 0; |
| 4254 | kfree_obj: | 4284 | kfree_obj: |
| 4255 | drm_free(phys_obj, sizeof(struct drm_i915_gem_phys_object), DRM_MEM_DRIVER); | 4285 | kfree(phys_obj); |
| 4256 | return ret; | 4286 | return ret; |
| 4257 | } | 4287 | } |
| 4258 | 4288 | ||
| @@ -4312,6 +4342,8 @@ void i915_gem_detach_phys_object(struct drm_device *dev, | |||
| 4312 | } | 4342 | } |
| 4313 | drm_clflush_pages(obj_priv->pages, page_count); | 4343 | drm_clflush_pages(obj_priv->pages, page_count); |
| 4314 | drm_agp_chipset_flush(dev); | 4344 | drm_agp_chipset_flush(dev); |
| 4345 | |||
| 4346 | i915_gem_object_put_pages(obj); | ||
| 4315 | out: | 4347 | out: |
| 4316 | obj_priv->phys_obj->cur_obj = NULL; | 4348 | obj_priv->phys_obj->cur_obj = NULL; |
| 4317 | obj_priv->phys_obj = NULL; | 4349 | obj_priv->phys_obj = NULL; |
| @@ -4369,6 +4401,8 @@ i915_gem_attach_phys_object(struct drm_device *dev, | |||
| 4369 | kunmap_atomic(src, KM_USER0); | 4401 | kunmap_atomic(src, KM_USER0); |
| 4370 | } | 4402 | } |
| 4371 | 4403 | ||
| 4404 | i915_gem_object_put_pages(obj); | ||
| 4405 | |||
| 4372 | return 0; | 4406 | return 0; |
| 4373 | out: | 4407 | out: |
| 4374 | return ret; | 4408 | return ret; |
diff --git a/drivers/gpu/drm/i915/i915_gem_debugfs.c b/drivers/gpu/drm/i915/i915_gem_debugfs.c index 986f1082c596..28146e405e87 100644 --- a/drivers/gpu/drm/i915/i915_gem_debugfs.c +++ b/drivers/gpu/drm/i915/i915_gem_debugfs.c | |||
| @@ -104,7 +104,7 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data) | |||
| 104 | if (obj->name) | 104 | if (obj->name) |
| 105 | seq_printf(m, " (name: %d)", obj->name); | 105 | seq_printf(m, " (name: %d)", obj->name); |
| 106 | if (obj_priv->fence_reg != I915_FENCE_REG_NONE) | 106 | if (obj_priv->fence_reg != I915_FENCE_REG_NONE) |
| 107 | seq_printf(m, " (fence: %d\n", obj_priv->fence_reg); | 107 | seq_printf(m, " (fence: %d)\n", obj_priv->fence_reg); |
| 108 | seq_printf(m, "\n"); | 108 | seq_printf(m, "\n"); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| @@ -318,7 +318,7 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data) | |||
| 318 | seq_printf(m, "RingTail : %08x\n", tail); | 318 | seq_printf(m, "RingTail : %08x\n", tail); |
| 319 | seq_printf(m, "RingMask : %08x\n", mask); | 319 | seq_printf(m, "RingMask : %08x\n", mask); |
| 320 | seq_printf(m, "RingSize : %08lx\n", dev_priv->ring.Size); | 320 | seq_printf(m, "RingSize : %08lx\n", dev_priv->ring.Size); |
| 321 | seq_printf(m, "Acthd : %08x\n", I915_READ(IS_I965G(dev) ? ACTHD_I965 : ACTHD)); | 321 | seq_printf(m, "Acthd : %08x\n", I915_READ(IS_I965G(dev) ? ACTHD_I965 : ACTHD)); |
| 322 | 322 | ||
| 323 | return 0; | 323 | return 0; |
| 324 | } | 324 | } |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 9a05cadaa4ad..5c1ceec49f5b 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -408,7 +408,7 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
| 408 | if (stride & (stride - 1)) | 408 | if (stride & (stride - 1)) |
| 409 | return false; | 409 | return false; |
| 410 | 410 | ||
| 411 | /* We don't handle the aperture area covered by the fence being bigger | 411 | /* We don't 0handle the aperture area covered by the fence being bigger |
| 412 | * than the object size. | 412 | * than the object size. |
| 413 | */ | 413 | */ |
| 414 | if (i915_get_fence_size(dev, size) != size) | 414 | if (i915_get_fence_size(dev, size) != size) |
| @@ -417,6 +417,33 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
| 417 | return true; | 417 | return true; |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | static bool | ||
| 421 | i915_gem_object_fence_offset_ok(struct drm_gem_object *obj, int tiling_mode) | ||
| 422 | { | ||
| 423 | struct drm_device *dev = obj->dev; | ||
| 424 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 425 | |||
| 426 | if (obj_priv->gtt_space == NULL) | ||
| 427 | return true; | ||
| 428 | |||
| 429 | if (tiling_mode == I915_TILING_NONE) | ||
| 430 | return true; | ||
| 431 | |||
| 432 | if (!IS_I965G(dev)) { | ||
| 433 | if (obj_priv->gtt_offset & (obj->size - 1)) | ||
| 434 | return false; | ||
| 435 | if (IS_I9XX(dev)) { | ||
| 436 | if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK) | ||
| 437 | return false; | ||
| 438 | } else { | ||
| 439 | if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK) | ||
| 440 | return false; | ||
| 441 | } | ||
| 442 | } | ||
| 443 | |||
| 444 | return true; | ||
| 445 | } | ||
| 446 | |||
| 420 | /** | 447 | /** |
| 421 | * Sets the tiling mode of an object, returning the required swizzling of | 448 | * Sets the tiling mode of an object, returning the required swizzling of |
| 422 | * bit 6 of addresses in the object. | 449 | * bit 6 of addresses in the object. |
| @@ -429,6 +456,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 429 | drm_i915_private_t *dev_priv = dev->dev_private; | 456 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 430 | struct drm_gem_object *obj; | 457 | struct drm_gem_object *obj; |
| 431 | struct drm_i915_gem_object *obj_priv; | 458 | struct drm_i915_gem_object *obj_priv; |
| 459 | int ret = 0; | ||
| 432 | 460 | ||
| 433 | obj = drm_gem_object_lookup(dev, file_priv, args->handle); | 461 | obj = drm_gem_object_lookup(dev, file_priv, args->handle); |
| 434 | if (obj == NULL) | 462 | if (obj == NULL) |
| @@ -436,14 +464,15 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 436 | obj_priv = obj->driver_private; | 464 | obj_priv = obj->driver_private; |
| 437 | 465 | ||
| 438 | if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) { | 466 | if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) { |
| 467 | mutex_lock(&dev->struct_mutex); | ||
| 439 | drm_gem_object_unreference(obj); | 468 | drm_gem_object_unreference(obj); |
| 469 | mutex_unlock(&dev->struct_mutex); | ||
| 440 | return -EINVAL; | 470 | return -EINVAL; |
| 441 | } | 471 | } |
| 442 | 472 | ||
| 443 | mutex_lock(&dev->struct_mutex); | ||
| 444 | |||
| 445 | if (args->tiling_mode == I915_TILING_NONE) { | 473 | if (args->tiling_mode == I915_TILING_NONE) { |
| 446 | args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; | 474 | args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; |
| 475 | args->stride = 0; | ||
| 447 | } else { | 476 | } else { |
| 448 | if (args->tiling_mode == I915_TILING_X) | 477 | if (args->tiling_mode == I915_TILING_X) |
| 449 | args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; | 478 | args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; |
| @@ -466,32 +495,38 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 466 | if (args->swizzle_mode == I915_BIT_6_SWIZZLE_UNKNOWN) { | 495 | if (args->swizzle_mode == I915_BIT_6_SWIZZLE_UNKNOWN) { |
| 467 | args->tiling_mode = I915_TILING_NONE; | 496 | args->tiling_mode = I915_TILING_NONE; |
| 468 | args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; | 497 | args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; |
| 498 | args->stride = 0; | ||
| 469 | } | 499 | } |
| 470 | } | 500 | } |
| 471 | if (args->tiling_mode != obj_priv->tiling_mode) { | ||
| 472 | int ret; | ||
| 473 | 501 | ||
| 474 | /* Unbind the object, as switching tiling means we're | 502 | mutex_lock(&dev->struct_mutex); |
| 475 | * switching the cache organization due to fencing, probably. | 503 | if (args->tiling_mode != obj_priv->tiling_mode || |
| 504 | args->stride != obj_priv->stride) { | ||
| 505 | /* We need to rebind the object if its current allocation | ||
| 506 | * no longer meets the alignment restrictions for its new | ||
| 507 | * tiling mode. Otherwise we can just leave it alone, but | ||
| 508 | * need to ensure that any fence register is cleared. | ||
| 476 | */ | 509 | */ |
| 477 | ret = i915_gem_object_unbind(obj); | 510 | if (!i915_gem_object_fence_offset_ok(obj, args->tiling_mode)) |
| 511 | ret = i915_gem_object_unbind(obj); | ||
| 512 | else | ||
| 513 | ret = i915_gem_object_put_fence_reg(obj); | ||
| 478 | if (ret != 0) { | 514 | if (ret != 0) { |
| 479 | WARN(ret != -ERESTARTSYS, | 515 | WARN(ret != -ERESTARTSYS, |
| 480 | "failed to unbind object for tiling switch"); | 516 | "failed to reset object for tiling switch"); |
| 481 | args->tiling_mode = obj_priv->tiling_mode; | 517 | args->tiling_mode = obj_priv->tiling_mode; |
| 482 | mutex_unlock(&dev->struct_mutex); | 518 | args->stride = obj_priv->stride; |
| 483 | drm_gem_object_unreference(obj); | 519 | goto err; |
| 484 | |||
| 485 | return ret; | ||
| 486 | } | 520 | } |
| 521 | |||
| 487 | obj_priv->tiling_mode = args->tiling_mode; | 522 | obj_priv->tiling_mode = args->tiling_mode; |
| 523 | obj_priv->stride = args->stride; | ||
| 488 | } | 524 | } |
| 489 | obj_priv->stride = args->stride; | 525 | err: |
| 490 | |||
| 491 | drm_gem_object_unreference(obj); | 526 | drm_gem_object_unreference(obj); |
| 492 | mutex_unlock(&dev->struct_mutex); | 527 | mutex_unlock(&dev->struct_mutex); |
| 493 | 528 | ||
| 494 | return 0; | 529 | return ret; |
| 495 | } | 530 | } |
| 496 | 531 | ||
| 497 | /** | 532 | /** |
diff --git a/drivers/gpu/drm/i915/i915_mem.c b/drivers/gpu/drm/i915/i915_mem.c index 96e271986d2a..83b7b81bb2b8 100644 --- a/drivers/gpu/drm/i915/i915_mem.c +++ b/drivers/gpu/drm/i915/i915_mem.c | |||
| @@ -94,8 +94,8 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size, | |||
| 94 | { | 94 | { |
| 95 | /* Maybe cut off the start of an existing block */ | 95 | /* Maybe cut off the start of an existing block */ |
| 96 | if (start > p->start) { | 96 | if (start > p->start) { |
| 97 | struct mem_block *newblock = | 97 | struct mem_block *newblock = kmalloc(sizeof(*newblock), |
| 98 | drm_alloc(sizeof(*newblock), DRM_MEM_BUFLISTS); | 98 | GFP_KERNEL); |
| 99 | if (!newblock) | 99 | if (!newblock) |
| 100 | goto out; | 100 | goto out; |
| 101 | newblock->start = start; | 101 | newblock->start = start; |
| @@ -111,8 +111,8 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size, | |||
| 111 | 111 | ||
| 112 | /* Maybe cut off the end of an existing block */ | 112 | /* Maybe cut off the end of an existing block */ |
| 113 | if (size < p->size) { | 113 | if (size < p->size) { |
| 114 | struct mem_block *newblock = | 114 | struct mem_block *newblock = kmalloc(sizeof(*newblock), |
| 115 | drm_alloc(sizeof(*newblock), DRM_MEM_BUFLISTS); | 115 | GFP_KERNEL); |
| 116 | if (!newblock) | 116 | if (!newblock) |
| 117 | goto out; | 117 | goto out; |
| 118 | newblock->start = start + size; | 118 | newblock->start = start + size; |
| @@ -169,7 +169,7 @@ static void free_block(struct mem_block *p) | |||
| 169 | p->size += q->size; | 169 | p->size += q->size; |
| 170 | p->next = q->next; | 170 | p->next = q->next; |
| 171 | p->next->prev = p; | 171 | p->next->prev = p; |
| 172 | drm_free(q, sizeof(*q), DRM_MEM_BUFLISTS); | 172 | kfree(q); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | if (p->prev->file_priv == NULL) { | 175 | if (p->prev->file_priv == NULL) { |
| @@ -177,7 +177,7 @@ static void free_block(struct mem_block *p) | |||
| 177 | q->size += p->size; | 177 | q->size += p->size; |
| 178 | q->next = p->next; | 178 | q->next = p->next; |
| 179 | q->next->prev = q; | 179 | q->next->prev = q; |
| 180 | drm_free(p, sizeof(*q), DRM_MEM_BUFLISTS); | 180 | kfree(p); |
| 181 | } | 181 | } |
| 182 | } | 182 | } |
| 183 | 183 | ||
| @@ -185,14 +185,14 @@ static void free_block(struct mem_block *p) | |||
| 185 | */ | 185 | */ |
| 186 | static int init_heap(struct mem_block **heap, int start, int size) | 186 | static int init_heap(struct mem_block **heap, int start, int size) |
| 187 | { | 187 | { |
| 188 | struct mem_block *blocks = drm_alloc(sizeof(*blocks), DRM_MEM_BUFLISTS); | 188 | struct mem_block *blocks = kmalloc(sizeof(*blocks), GFP_KERNEL); |
| 189 | 189 | ||
| 190 | if (!blocks) | 190 | if (!blocks) |
| 191 | return -ENOMEM; | 191 | return -ENOMEM; |
| 192 | 192 | ||
| 193 | *heap = drm_alloc(sizeof(**heap), DRM_MEM_BUFLISTS); | 193 | *heap = kmalloc(sizeof(**heap), GFP_KERNEL); |
| 194 | if (!*heap) { | 194 | if (!*heap) { |
| 195 | drm_free(blocks, sizeof(*blocks), DRM_MEM_BUFLISTS); | 195 | kfree(blocks); |
| 196 | return -ENOMEM; | 196 | return -ENOMEM; |
| 197 | } | 197 | } |
| 198 | 198 | ||
| @@ -233,7 +233,7 @@ void i915_mem_release(struct drm_device * dev, struct drm_file *file_priv, | |||
| 233 | p->size += q->size; | 233 | p->size += q->size; |
| 234 | p->next = q->next; | 234 | p->next = q->next; |
| 235 | p->next->prev = p; | 235 | p->next->prev = p; |
| 236 | drm_free(q, sizeof(*q), DRM_MEM_BUFLISTS); | 236 | kfree(q); |
| 237 | } | 237 | } |
| 238 | } | 238 | } |
| 239 | } | 239 | } |
| @@ -250,10 +250,10 @@ void i915_mem_takedown(struct mem_block **heap) | |||
| 250 | for (p = (*heap)->next; p != *heap;) { | 250 | for (p = (*heap)->next; p != *heap;) { |
| 251 | struct mem_block *q = p; | 251 | struct mem_block *q = p; |
| 252 | p = p->next; | 252 | p = p->next; |
| 253 | drm_free(q, sizeof(*q), DRM_MEM_BUFLISTS); | 253 | kfree(q); |
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | drm_free(*heap, sizeof(**heap), DRM_MEM_BUFLISTS); | 256 | kfree(*heap); |
| 257 | *heap = NULL; | 257 | *heap = NULL; |
| 258 | } | 258 | } |
| 259 | 259 | ||
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 754dd22fdd77..cdd126d068a7 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -124,8 +124,7 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv, | |||
| 124 | entry = &lvds_lfp_data->data[lvds_options->panel_type]; | 124 | entry = &lvds_lfp_data->data[lvds_options->panel_type]; |
| 125 | dvo_timing = &entry->dvo_timing; | 125 | dvo_timing = &entry->dvo_timing; |
| 126 | 126 | ||
| 127 | panel_fixed_mode = drm_calloc(1, sizeof(*panel_fixed_mode), | 127 | panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); |
| 128 | DRM_MEM_DRIVER); | ||
| 129 | 128 | ||
| 130 | fill_detail_timing_data(panel_fixed_mode, dvo_timing); | 129 | fill_detail_timing_data(panel_fixed_mode, dvo_timing); |
| 131 | 130 | ||
| @@ -156,8 +155,7 @@ parse_sdvo_panel_data(struct drm_i915_private *dev_priv, | |||
| 156 | if (!dvo_timing) | 155 | if (!dvo_timing) |
| 157 | return; | 156 | return; |
| 158 | 157 | ||
| 159 | panel_fixed_mode = drm_calloc(1, sizeof(*panel_fixed_mode), | 158 | panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); |
| 160 | DRM_MEM_DRIVER); | ||
| 161 | 159 | ||
| 162 | if (!panel_fixed_mode) | 160 | if (!panel_fixed_mode) |
| 163 | return; | 161 | return; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 028f5b66e3d8..3e1c78162119 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -828,19 +828,31 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
| 828 | } | 828 | } |
| 829 | 829 | ||
| 830 | mutex_lock(&dev->struct_mutex); | 830 | mutex_lock(&dev->struct_mutex); |
| 831 | ret = i915_gem_object_pin(intel_fb->obj, alignment); | 831 | ret = i915_gem_object_pin(obj, alignment); |
| 832 | if (ret != 0) { | 832 | if (ret != 0) { |
| 833 | mutex_unlock(&dev->struct_mutex); | 833 | mutex_unlock(&dev->struct_mutex); |
| 834 | return ret; | 834 | return ret; |
| 835 | } | 835 | } |
| 836 | 836 | ||
| 837 | ret = i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1); | 837 | ret = i915_gem_object_set_to_gtt_domain(obj, 1); |
| 838 | if (ret != 0) { | 838 | if (ret != 0) { |
| 839 | i915_gem_object_unpin(intel_fb->obj); | 839 | i915_gem_object_unpin(obj); |
| 840 | mutex_unlock(&dev->struct_mutex); | 840 | mutex_unlock(&dev->struct_mutex); |
| 841 | return ret; | 841 | return ret; |
| 842 | } | 842 | } |
| 843 | 843 | ||
| 844 | /* Pre-i965 needs to install a fence for tiled scan-out */ | ||
| 845 | if (!IS_I965G(dev) && | ||
| 846 | obj_priv->fence_reg == I915_FENCE_REG_NONE && | ||
| 847 | obj_priv->tiling_mode != I915_TILING_NONE) { | ||
| 848 | ret = i915_gem_object_get_fence_reg(obj); | ||
| 849 | if (ret != 0) { | ||
| 850 | i915_gem_object_unpin(obj); | ||
| 851 | mutex_unlock(&dev->struct_mutex); | ||
| 852 | return ret; | ||
| 853 | } | ||
| 854 | } | ||
| 855 | |||
| 844 | dspcntr = I915_READ(dspcntr_reg); | 856 | dspcntr = I915_READ(dspcntr_reg); |
| 845 | /* Mask out pixel format bits in case we change it */ | 857 | /* Mask out pixel format bits in case we change it */ |
| 846 | dspcntr &= ~DISPPLANE_PIXFORMAT_MASK; | 858 | dspcntr &= ~DISPPLANE_PIXFORMAT_MASK; |
| @@ -860,7 +872,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
| 860 | break; | 872 | break; |
| 861 | default: | 873 | default: |
| 862 | DRM_ERROR("Unknown color depth\n"); | 874 | DRM_ERROR("Unknown color depth\n"); |
| 863 | i915_gem_object_unpin(intel_fb->obj); | 875 | i915_gem_object_unpin(obj); |
| 864 | mutex_unlock(&dev->struct_mutex); | 876 | mutex_unlock(&dev->struct_mutex); |
| 865 | return -EINVAL; | 877 | return -EINVAL; |
| 866 | } | 878 | } |
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 8e28e5993df5..1af7d68e3807 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c | |||
| @@ -870,7 +870,11 @@ static int intelfb_single_fb_probe(struct drm_device *dev) | |||
| 870 | */ | 870 | */ |
| 871 | void intelfb_restore(void) | 871 | void intelfb_restore(void) |
| 872 | { | 872 | { |
| 873 | drm_crtc_helper_set_config(&kernelfb_mode); | 873 | int ret; |
| 874 | if ((ret = drm_crtc_helper_set_config(&kernelfb_mode)) != 0) { | ||
| 875 | printk(KERN_ERR "Failed to restore crtc configuration: %d\n", | ||
| 876 | ret); | ||
| 877 | } | ||
| 874 | } | 878 | } |
| 875 | 879 | ||
| 876 | static void intelfb_restore_work_fn(struct work_struct *ignored) | 880 | static void intelfb_restore_work_fn(struct work_struct *ignored) |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index 50d7ed70b338..ea68992e4416 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -1561,8 +1561,7 @@ intel_tv_destroy (struct drm_connector *connector) | |||
| 1561 | 1561 | ||
| 1562 | drm_sysfs_connector_remove(connector); | 1562 | drm_sysfs_connector_remove(connector); |
| 1563 | drm_connector_cleanup(connector); | 1563 | drm_connector_cleanup(connector); |
| 1564 | drm_free(intel_output, sizeof(struct intel_output) + sizeof(struct intel_tv_priv), | 1564 | kfree(intel_output); |
| 1565 | DRM_MEM_DRIVER); | ||
| 1566 | } | 1565 | } |
| 1567 | 1566 | ||
| 1568 | 1567 | ||
| @@ -1695,8 +1694,8 @@ intel_tv_init(struct drm_device *dev) | |||
| 1695 | (tv_dac_off & TVDAC_STATE_CHG_EN) != 0) | 1694 | (tv_dac_off & TVDAC_STATE_CHG_EN) != 0) |
| 1696 | return; | 1695 | return; |
| 1697 | 1696 | ||
| 1698 | intel_output = drm_calloc(1, sizeof(struct intel_output) + | 1697 | intel_output = kzalloc(sizeof(struct intel_output) + |
| 1699 | sizeof(struct intel_tv_priv), DRM_MEM_DRIVER); | 1698 | sizeof(struct intel_tv_priv), GFP_KERNEL); |
| 1700 | if (!intel_output) { | 1699 | if (!intel_output) { |
| 1701 | return; | 1700 | return; |
| 1702 | } | 1701 | } |
| @@ -1730,8 +1729,8 @@ intel_tv_init(struct drm_device *dev) | |||
| 1730 | connector->doublescan_allowed = false; | 1729 | connector->doublescan_allowed = false; |
| 1731 | 1730 | ||
| 1732 | /* Create TV properties then attach current values */ | 1731 | /* Create TV properties then attach current values */ |
| 1733 | tv_format_names = drm_alloc(sizeof(char *) * NUM_TV_MODES, | 1732 | tv_format_names = kmalloc(sizeof(char *) * NUM_TV_MODES, |
| 1734 | DRM_MEM_DRIVER); | 1733 | GFP_KERNEL); |
| 1735 | if (!tv_format_names) | 1734 | if (!tv_format_names) |
| 1736 | goto out; | 1735 | goto out; |
| 1737 | for (i = 0; i < NUM_TV_MODES; i++) | 1736 | for (i = 0; i < NUM_TV_MODES; i++) |
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c index 7a6bf9ffc5a3..6c67a02910c8 100644 --- a/drivers/gpu/drm/mga/mga_dma.c +++ b/drivers/gpu/drm/mga/mga_dma.c | |||
| @@ -254,23 +254,20 @@ static int mga_freelist_init(struct drm_device * dev, drm_mga_private_t * dev_pr | |||
| 254 | int i; | 254 | int i; |
| 255 | DRM_DEBUG("count=%d\n", dma->buf_count); | 255 | DRM_DEBUG("count=%d\n", dma->buf_count); |
| 256 | 256 | ||
| 257 | dev_priv->head = drm_alloc(sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER); | 257 | dev_priv->head = kzalloc(sizeof(drm_mga_freelist_t), GFP_KERNEL); |
| 258 | if (dev_priv->head == NULL) | 258 | if (dev_priv->head == NULL) |
| 259 | return -ENOMEM; | 259 | return -ENOMEM; |
| 260 | 260 | ||
| 261 | memset(dev_priv->head, 0, sizeof(drm_mga_freelist_t)); | ||
| 262 | SET_AGE(&dev_priv->head->age, MGA_BUFFER_USED, 0); | 261 | SET_AGE(&dev_priv->head->age, MGA_BUFFER_USED, 0); |
| 263 | 262 | ||
| 264 | for (i = 0; i < dma->buf_count; i++) { | 263 | for (i = 0; i < dma->buf_count; i++) { |
| 265 | buf = dma->buflist[i]; | 264 | buf = dma->buflist[i]; |
| 266 | buf_priv = buf->dev_private; | 265 | buf_priv = buf->dev_private; |
| 267 | 266 | ||
| 268 | entry = drm_alloc(sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER); | 267 | entry = kzalloc(sizeof(drm_mga_freelist_t), GFP_KERNEL); |
| 269 | if (entry == NULL) | 268 | if (entry == NULL) |
| 270 | return -ENOMEM; | 269 | return -ENOMEM; |
| 271 | 270 | ||
| 272 | memset(entry, 0, sizeof(drm_mga_freelist_t)); | ||
| 273 | |||
| 274 | entry->next = dev_priv->head->next; | 271 | entry->next = dev_priv->head->next; |
| 275 | entry->prev = dev_priv->head; | 272 | entry->prev = dev_priv->head; |
| 276 | SET_AGE(&entry->age, MGA_BUFFER_FREE, 0); | 273 | SET_AGE(&entry->age, MGA_BUFFER_FREE, 0); |
| @@ -301,7 +298,7 @@ static void mga_freelist_cleanup(struct drm_device * dev) | |||
| 301 | entry = dev_priv->head; | 298 | entry = dev_priv->head; |
| 302 | while (entry) { | 299 | while (entry) { |
| 303 | next = entry->next; | 300 | next = entry->next; |
| 304 | drm_free(entry, sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER); | 301 | kfree(entry); |
| 305 | entry = next; | 302 | entry = next; |
| 306 | } | 303 | } |
| 307 | 304 | ||
| @@ -399,12 +396,11 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags) | |||
| 399 | drm_mga_private_t *dev_priv; | 396 | drm_mga_private_t *dev_priv; |
| 400 | int ret; | 397 | int ret; |
| 401 | 398 | ||
| 402 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); | 399 | dev_priv = kzalloc(sizeof(drm_mga_private_t), GFP_KERNEL); |
| 403 | if (!dev_priv) | 400 | if (!dev_priv) |
| 404 | return -ENOMEM; | 401 | return -ENOMEM; |
| 405 | 402 | ||
| 406 | dev->dev_private = (void *)dev_priv; | 403 | dev->dev_private = (void *)dev_priv; |
| 407 | memset(dev_priv, 0, sizeof(drm_mga_private_t)); | ||
| 408 | 404 | ||
| 409 | dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; | 405 | dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; |
| 410 | dev_priv->chipset = flags; | 406 | dev_priv->chipset = flags; |
| @@ -1150,7 +1146,7 @@ int mga_dma_buffers(struct drm_device *dev, void *data, | |||
| 1150 | */ | 1146 | */ |
| 1151 | int mga_driver_unload(struct drm_device * dev) | 1147 | int mga_driver_unload(struct drm_device * dev) |
| 1152 | { | 1148 | { |
| 1153 | drm_free(dev->dev_private, sizeof(drm_mga_private_t), DRM_MEM_DRIVER); | 1149 | kfree(dev->dev_private); |
| 1154 | dev->dev_private = NULL; | 1150 | dev->dev_private = NULL; |
| 1155 | 1151 | ||
| 1156 | return 0; | 1152 | return 0; |
diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c index 077c0455a6b9..c75fd3564040 100644 --- a/drivers/gpu/drm/r128/r128_cce.c +++ b/drivers/gpu/drm/r128/r128_cce.c | |||
| @@ -353,12 +353,10 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init) | |||
| 353 | 353 | ||
| 354 | DRM_DEBUG("\n"); | 354 | DRM_DEBUG("\n"); |
| 355 | 355 | ||
| 356 | dev_priv = drm_alloc(sizeof(drm_r128_private_t), DRM_MEM_DRIVER); | 356 | dev_priv = kzalloc(sizeof(drm_r128_private_t), GFP_KERNEL); |
| 357 | if (dev_priv == NULL) | 357 | if (dev_priv == NULL) |
| 358 | return -ENOMEM; | 358 | return -ENOMEM; |
| 359 | 359 | ||
| 360 | memset(dev_priv, 0, sizeof(drm_r128_private_t)); | ||
| 361 | |||
| 362 | dev_priv->is_pci = init->is_pci; | 360 | dev_priv->is_pci = init->is_pci; |
| 363 | 361 | ||
| 364 | if (dev_priv->is_pci && !dev->sg) { | 362 | if (dev_priv->is_pci && !dev->sg) { |
| @@ -619,8 +617,7 @@ int r128_do_cleanup_cce(struct drm_device * dev) | |||
| 619 | ("failed to cleanup PCI GART!\n"); | 617 | ("failed to cleanup PCI GART!\n"); |
| 620 | } | 618 | } |
| 621 | 619 | ||
| 622 | drm_free(dev->dev_private, sizeof(drm_r128_private_t), | 620 | kfree(dev->dev_private); |
| 623 | DRM_MEM_DRIVER); | ||
| 624 | dev->dev_private = NULL; | 621 | dev->dev_private = NULL; |
| 625 | } | 622 | } |
| 626 | 623 | ||
| @@ -768,18 +765,17 @@ static int r128_freelist_init(struct drm_device * dev) | |||
| 768 | drm_r128_freelist_t *entry; | 765 | drm_r128_freelist_t *entry; |
| 769 | int i; | 766 | int i; |
| 770 | 767 | ||
| 771 | dev_priv->head = drm_alloc(sizeof(drm_r128_freelist_t), DRM_MEM_DRIVER); | 768 | dev_priv->head = kzalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL); |
| 772 | if (dev_priv->head == NULL) | 769 | if (dev_priv->head == NULL) |
| 773 | return -ENOMEM; | 770 | return -ENOMEM; |
| 774 | 771 | ||
| 775 | memset(dev_priv->head, 0, sizeof(drm_r128_freelist_t)); | ||
| 776 | dev_priv->head->age = R128_BUFFER_USED; | 772 | dev_priv->head->age = R128_BUFFER_USED; |
| 777 | 773 | ||
| 778 | for (i = 0; i < dma->buf_count; i++) { | 774 | for (i = 0; i < dma->buf_count; i++) { |
| 779 | buf = dma->buflist[i]; | 775 | buf = dma->buflist[i]; |
| 780 | buf_priv = buf->dev_private; | 776 | buf_priv = buf->dev_private; |
| 781 | 777 | ||
| 782 | entry = drm_alloc(sizeof(drm_r128_freelist_t), DRM_MEM_DRIVER); | 778 | entry = kmalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL); |
| 783 | if (!entry) | 779 | if (!entry) |
| 784 | return -ENOMEM; | 780 | return -ENOMEM; |
| 785 | 781 | ||
diff --git a/drivers/gpu/drm/r128/r128_state.c b/drivers/gpu/drm/r128/r128_state.c index f7a5b5740764..026a48c95c8f 100644 --- a/drivers/gpu/drm/r128/r128_state.c +++ b/drivers/gpu/drm/r128/r128_state.c | |||
| @@ -910,24 +910,24 @@ static int r128_cce_dispatch_write_span(struct drm_device * dev, | |||
| 910 | } | 910 | } |
| 911 | 911 | ||
| 912 | buffer_size = depth->n * sizeof(u32); | 912 | buffer_size = depth->n * sizeof(u32); |
| 913 | buffer = drm_alloc(buffer_size, DRM_MEM_BUFS); | 913 | buffer = kmalloc(buffer_size, GFP_KERNEL); |
| 914 | if (buffer == NULL) | 914 | if (buffer == NULL) |
| 915 | return -ENOMEM; | 915 | return -ENOMEM; |
| 916 | if (DRM_COPY_FROM_USER(buffer, depth->buffer, buffer_size)) { | 916 | if (DRM_COPY_FROM_USER(buffer, depth->buffer, buffer_size)) { |
| 917 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 917 | kfree(buffer); |
| 918 | return -EFAULT; | 918 | return -EFAULT; |
| 919 | } | 919 | } |
| 920 | 920 | ||
| 921 | mask_size = depth->n * sizeof(u8); | 921 | mask_size = depth->n * sizeof(u8); |
| 922 | if (depth->mask) { | 922 | if (depth->mask) { |
| 923 | mask = drm_alloc(mask_size, DRM_MEM_BUFS); | 923 | mask = kmalloc(mask_size, GFP_KERNEL); |
| 924 | if (mask == NULL) { | 924 | if (mask == NULL) { |
| 925 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 925 | kfree(buffer); |
| 926 | return -ENOMEM; | 926 | return -ENOMEM; |
| 927 | } | 927 | } |
| 928 | if (DRM_COPY_FROM_USER(mask, depth->mask, mask_size)) { | 928 | if (DRM_COPY_FROM_USER(mask, depth->mask, mask_size)) { |
| 929 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 929 | kfree(buffer); |
| 930 | drm_free(mask, mask_size, DRM_MEM_BUFS); | 930 | kfree(mask); |
| 931 | return -EFAULT; | 931 | return -EFAULT; |
| 932 | } | 932 | } |
| 933 | 933 | ||
| @@ -954,7 +954,7 @@ static int r128_cce_dispatch_write_span(struct drm_device * dev, | |||
| 954 | } | 954 | } |
| 955 | } | 955 | } |
| 956 | 956 | ||
| 957 | drm_free(mask, mask_size, DRM_MEM_BUFS); | 957 | kfree(mask); |
| 958 | } else { | 958 | } else { |
| 959 | for (i = 0; i < count; i++, x++) { | 959 | for (i = 0; i < count; i++, x++) { |
| 960 | BEGIN_RING(6); | 960 | BEGIN_RING(6); |
| @@ -978,7 +978,7 @@ static int r128_cce_dispatch_write_span(struct drm_device * dev, | |||
| 978 | } | 978 | } |
| 979 | } | 979 | } |
| 980 | 980 | ||
| 981 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 981 | kfree(buffer); |
| 982 | 982 | ||
| 983 | return 0; | 983 | return 0; |
| 984 | } | 984 | } |
| @@ -1000,54 +1000,54 @@ static int r128_cce_dispatch_write_pixels(struct drm_device * dev, | |||
| 1000 | 1000 | ||
| 1001 | xbuf_size = count * sizeof(*x); | 1001 | xbuf_size = count * sizeof(*x); |
| 1002 | ybuf_size = count * sizeof(*y); | 1002 | ybuf_size = count * sizeof(*y); |
| 1003 | x = drm_alloc(xbuf_size, DRM_MEM_BUFS); | 1003 | x = kmalloc(xbuf_size, GFP_KERNEL); |
| 1004 | if (x == NULL) { | 1004 | if (x == NULL) { |
| 1005 | return -ENOMEM; | 1005 | return -ENOMEM; |
| 1006 | } | 1006 | } |
| 1007 | y = drm_alloc(ybuf_size, DRM_MEM_BUFS); | 1007 | y = kmalloc(ybuf_size, GFP_KERNEL); |
| 1008 | if (y == NULL) { | 1008 | if (y == NULL) { |
| 1009 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1009 | kfree(x); |
| 1010 | return -ENOMEM; | 1010 | return -ENOMEM; |
| 1011 | } | 1011 | } |
| 1012 | if (DRM_COPY_FROM_USER(x, depth->x, xbuf_size)) { | 1012 | if (DRM_COPY_FROM_USER(x, depth->x, xbuf_size)) { |
| 1013 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1013 | kfree(x); |
| 1014 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1014 | kfree(y); |
| 1015 | return -EFAULT; | 1015 | return -EFAULT; |
| 1016 | } | 1016 | } |
| 1017 | if (DRM_COPY_FROM_USER(y, depth->y, xbuf_size)) { | 1017 | if (DRM_COPY_FROM_USER(y, depth->y, xbuf_size)) { |
| 1018 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1018 | kfree(x); |
| 1019 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1019 | kfree(y); |
| 1020 | return -EFAULT; | 1020 | return -EFAULT; |
| 1021 | } | 1021 | } |
| 1022 | 1022 | ||
| 1023 | buffer_size = depth->n * sizeof(u32); | 1023 | buffer_size = depth->n * sizeof(u32); |
| 1024 | buffer = drm_alloc(buffer_size, DRM_MEM_BUFS); | 1024 | buffer = kmalloc(buffer_size, GFP_KERNEL); |
| 1025 | if (buffer == NULL) { | 1025 | if (buffer == NULL) { |
| 1026 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1026 | kfree(x); |
| 1027 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1027 | kfree(y); |
| 1028 | return -ENOMEM; | 1028 | return -ENOMEM; |
| 1029 | } | 1029 | } |
| 1030 | if (DRM_COPY_FROM_USER(buffer, depth->buffer, buffer_size)) { | 1030 | if (DRM_COPY_FROM_USER(buffer, depth->buffer, buffer_size)) { |
| 1031 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1031 | kfree(x); |
| 1032 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1032 | kfree(y); |
| 1033 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 1033 | kfree(buffer); |
| 1034 | return -EFAULT; | 1034 | return -EFAULT; |
| 1035 | } | 1035 | } |
| 1036 | 1036 | ||
| 1037 | if (depth->mask) { | 1037 | if (depth->mask) { |
| 1038 | mask_size = depth->n * sizeof(u8); | 1038 | mask_size = depth->n * sizeof(u8); |
| 1039 | mask = drm_alloc(mask_size, DRM_MEM_BUFS); | 1039 | mask = kmalloc(mask_size, GFP_KERNEL); |
| 1040 | if (mask == NULL) { | 1040 | if (mask == NULL) { |
| 1041 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1041 | kfree(x); |
| 1042 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1042 | kfree(y); |
| 1043 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 1043 | kfree(buffer); |
| 1044 | return -ENOMEM; | 1044 | return -ENOMEM; |
| 1045 | } | 1045 | } |
| 1046 | if (DRM_COPY_FROM_USER(mask, depth->mask, mask_size)) { | 1046 | if (DRM_COPY_FROM_USER(mask, depth->mask, mask_size)) { |
| 1047 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1047 | kfree(x); |
| 1048 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1048 | kfree(y); |
| 1049 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 1049 | kfree(buffer); |
| 1050 | drm_free(mask, mask_size, DRM_MEM_BUFS); | 1050 | kfree(mask); |
| 1051 | return -EFAULT; | 1051 | return -EFAULT; |
| 1052 | } | 1052 | } |
| 1053 | 1053 | ||
| @@ -1074,7 +1074,7 @@ static int r128_cce_dispatch_write_pixels(struct drm_device * dev, | |||
| 1074 | } | 1074 | } |
| 1075 | } | 1075 | } |
| 1076 | 1076 | ||
| 1077 | drm_free(mask, mask_size, DRM_MEM_BUFS); | 1077 | kfree(mask); |
| 1078 | } else { | 1078 | } else { |
| 1079 | for (i = 0; i < count; i++) { | 1079 | for (i = 0; i < count; i++) { |
| 1080 | BEGIN_RING(6); | 1080 | BEGIN_RING(6); |
| @@ -1098,9 +1098,9 @@ static int r128_cce_dispatch_write_pixels(struct drm_device * dev, | |||
| 1098 | } | 1098 | } |
| 1099 | } | 1099 | } |
| 1100 | 1100 | ||
| 1101 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1101 | kfree(x); |
| 1102 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1102 | kfree(y); |
| 1103 | drm_free(buffer, buffer_size, DRM_MEM_BUFS); | 1103 | kfree(buffer); |
| 1104 | 1104 | ||
| 1105 | return 0; | 1105 | return 0; |
| 1106 | } | 1106 | } |
| @@ -1167,23 +1167,23 @@ static int r128_cce_dispatch_read_pixels(struct drm_device * dev, | |||
| 1167 | 1167 | ||
| 1168 | xbuf_size = count * sizeof(*x); | 1168 | xbuf_size = count * sizeof(*x); |
| 1169 | ybuf_size = count * sizeof(*y); | 1169 | ybuf_size = count * sizeof(*y); |
| 1170 | x = drm_alloc(xbuf_size, DRM_MEM_BUFS); | 1170 | x = kmalloc(xbuf_size, GFP_KERNEL); |
| 1171 | if (x == NULL) { | 1171 | if (x == NULL) { |
| 1172 | return -ENOMEM; | 1172 | return -ENOMEM; |
| 1173 | } | 1173 | } |
| 1174 | y = drm_alloc(ybuf_size, DRM_MEM_BUFS); | 1174 | y = kmalloc(ybuf_size, GFP_KERNEL); |
| 1175 | if (y == NULL) { | 1175 | if (y == NULL) { |
| 1176 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1176 | kfree(x); |
| 1177 | return -ENOMEM; | 1177 | return -ENOMEM; |
| 1178 | } | 1178 | } |
| 1179 | if (DRM_COPY_FROM_USER(x, depth->x, xbuf_size)) { | 1179 | if (DRM_COPY_FROM_USER(x, depth->x, xbuf_size)) { |
| 1180 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1180 | kfree(x); |
| 1181 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1181 | kfree(y); |
| 1182 | return -EFAULT; | 1182 | return -EFAULT; |
| 1183 | } | 1183 | } |
| 1184 | if (DRM_COPY_FROM_USER(y, depth->y, ybuf_size)) { | 1184 | if (DRM_COPY_FROM_USER(y, depth->y, ybuf_size)) { |
| 1185 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1185 | kfree(x); |
| 1186 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1186 | kfree(y); |
| 1187 | return -EFAULT; | 1187 | return -EFAULT; |
| 1188 | } | 1188 | } |
| 1189 | 1189 | ||
| @@ -1210,8 +1210,8 @@ static int r128_cce_dispatch_read_pixels(struct drm_device * dev, | |||
| 1210 | ADVANCE_RING(); | 1210 | ADVANCE_RING(); |
| 1211 | } | 1211 | } |
| 1212 | 1212 | ||
| 1213 | drm_free(x, xbuf_size, DRM_MEM_BUFS); | 1213 | kfree(x); |
| 1214 | drm_free(y, ybuf_size, DRM_MEM_BUFS); | 1214 | kfree(y); |
| 1215 | 1215 | ||
| 1216 | return 0; | 1216 | return 0; |
| 1217 | } | 1217 | } |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 5225f5be7ea7..c550932a108f 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -551,6 +551,9 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 551 | /* cp setup */ | 551 | /* cp setup */ |
| 552 | WREG32(0x718, pre_write_timer | (pre_write_limit << 28)); | 552 | WREG32(0x718, pre_write_timer | (pre_write_limit << 28)); |
| 553 | WREG32(RADEON_CP_RB_CNTL, | 553 | WREG32(RADEON_CP_RB_CNTL, |
| 554 | #ifdef __BIG_ENDIAN | ||
| 555 | RADEON_BUF_SWAP_32BIT | | ||
| 556 | #endif | ||
| 554 | REG_SET(RADEON_RB_BUFSZ, rb_bufsz) | | 557 | REG_SET(RADEON_RB_BUFSZ, rb_bufsz) | |
| 555 | REG_SET(RADEON_RB_BLKSZ, rb_blksz) | | 558 | REG_SET(RADEON_RB_BLKSZ, rb_blksz) | |
| 556 | REG_SET(RADEON_MAX_FETCH, max_fetch) | | 559 | REG_SET(RADEON_MAX_FETCH, max_fetch) | |
| @@ -644,7 +647,7 @@ int r100_cp_reset(struct radeon_device *rdev) | |||
| 644 | */ | 647 | */ |
| 645 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, | 648 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, |
| 646 | struct radeon_cs_packet *pkt, | 649 | struct radeon_cs_packet *pkt, |
| 647 | unsigned *auth, unsigned n, | 650 | const unsigned *auth, unsigned n, |
| 648 | radeon_packet0_check_t check) | 651 | radeon_packet0_check_t check) |
| 649 | { | 652 | { |
| 650 | unsigned reg; | 653 | unsigned reg; |
| @@ -654,6 +657,10 @@ int r100_cs_parse_packet0(struct radeon_cs_parser *p, | |||
| 654 | 657 | ||
| 655 | idx = pkt->idx + 1; | 658 | idx = pkt->idx + 1; |
| 656 | reg = pkt->reg; | 659 | reg = pkt->reg; |
| 660 | /* Check that register fall into register range | ||
| 661 | * determined by the number of entry (n) in the | ||
| 662 | * safe register bitmap. | ||
| 663 | */ | ||
| 657 | if (pkt->one_reg_wr) { | 664 | if (pkt->one_reg_wr) { |
| 658 | if ((reg >> 7) > n) { | 665 | if ((reg >> 7) > n) { |
| 659 | return -EINVAL; | 666 | return -EINVAL; |
| @@ -683,24 +690,6 @@ int r100_cs_parse_packet0(struct radeon_cs_parser *p, | |||
| 683 | return 0; | 690 | return 0; |
| 684 | } | 691 | } |
| 685 | 692 | ||
| 686 | int r100_cs_parse_packet3(struct radeon_cs_parser *p, | ||
| 687 | struct radeon_cs_packet *pkt, | ||
| 688 | unsigned *auth, unsigned n, | ||
| 689 | radeon_packet3_check_t check) | ||
| 690 | { | ||
| 691 | unsigned i, m; | ||
| 692 | |||
| 693 | if ((pkt->opcode >> 5) > n) { | ||
| 694 | return -EINVAL; | ||
| 695 | } | ||
| 696 | i = pkt->opcode >> 5; | ||
| 697 | m = 1 << (pkt->opcode & 31); | ||
| 698 | if (auth[i] & m) { | ||
| 699 | return check(p, pkt); | ||
| 700 | } | ||
| 701 | return 0; | ||
| 702 | } | ||
| 703 | |||
| 704 | void r100_cs_dump_packet(struct radeon_cs_parser *p, | 693 | void r100_cs_dump_packet(struct radeon_cs_parser *p, |
| 705 | struct radeon_cs_packet *pkt) | 694 | struct radeon_cs_packet *pkt) |
| 706 | { | 695 | { |
| @@ -901,6 +890,25 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 901 | return 0; | 890 | return 0; |
| 902 | } | 891 | } |
| 903 | 892 | ||
| 893 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
| 894 | struct radeon_cs_packet *pkt, | ||
| 895 | struct radeon_object *robj) | ||
| 896 | { | ||
| 897 | struct radeon_cs_chunk *ib_chunk; | ||
| 898 | unsigned idx; | ||
| 899 | |||
| 900 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
| 901 | idx = pkt->idx + 1; | ||
| 902 | if ((ib_chunk->kdata[idx+2] + 1) > radeon_object_size(robj)) { | ||
| 903 | DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER " | ||
| 904 | "(need %u have %lu) !\n", | ||
| 905 | ib_chunk->kdata[idx+2] + 1, | ||
| 906 | radeon_object_size(robj)); | ||
| 907 | return -EINVAL; | ||
| 908 | } | ||
| 909 | return 0; | ||
| 910 | } | ||
| 911 | |||
| 904 | static int r100_packet3_check(struct radeon_cs_parser *p, | 912 | static int r100_packet3_check(struct radeon_cs_parser *p, |
| 905 | struct radeon_cs_packet *pkt) | 913 | struct radeon_cs_packet *pkt) |
| 906 | { | 914 | { |
| @@ -954,6 +962,10 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
| 954 | return r; | 962 | return r; |
| 955 | } | 963 | } |
| 956 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 964 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
| 965 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); | ||
| 966 | if (r) { | ||
| 967 | return r; | ||
| 968 | } | ||
| 957 | break; | 969 | break; |
| 958 | case 0x23: | 970 | case 0x23: |
| 959 | /* FIXME: cleanup */ | 971 | /* FIXME: cleanup */ |
| @@ -999,18 +1011,18 @@ int r100_cs_parse(struct radeon_cs_parser *p) | |||
| 999 | } | 1011 | } |
| 1000 | p->idx += pkt.count + 2; | 1012 | p->idx += pkt.count + 2; |
| 1001 | switch (pkt.type) { | 1013 | switch (pkt.type) { |
| 1002 | case PACKET_TYPE0: | 1014 | case PACKET_TYPE0: |
| 1003 | r = r100_packet0_check(p, &pkt); | 1015 | r = r100_packet0_check(p, &pkt); |
| 1004 | break; | 1016 | break; |
| 1005 | case PACKET_TYPE2: | 1017 | case PACKET_TYPE2: |
| 1006 | break; | 1018 | break; |
| 1007 | case PACKET_TYPE3: | 1019 | case PACKET_TYPE3: |
| 1008 | r = r100_packet3_check(p, &pkt); | 1020 | r = r100_packet3_check(p, &pkt); |
| 1009 | break; | 1021 | break; |
| 1010 | default: | 1022 | default: |
| 1011 | DRM_ERROR("Unknown packet type %d !\n", | 1023 | DRM_ERROR("Unknown packet type %d !\n", |
| 1012 | pkt.type); | 1024 | pkt.type); |
| 1013 | return -EINVAL; | 1025 | return -EINVAL; |
| 1014 | } | 1026 | } |
| 1015 | if (r) { | 1027 | if (r) { |
| 1016 | return r; | 1028 | return r; |
| @@ -1267,12 +1279,6 @@ void r100_vram_info(struct radeon_device *rdev) | |||
| 1267 | 1279 | ||
| 1268 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | 1280 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); |
| 1269 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | 1281 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); |
| 1270 | if (rdev->mc.aper_size > rdev->mc.vram_size) { | ||
| 1271 | /* Why does some hw doesn't have CONFIG_MEMSIZE properly | ||
| 1272 | * setup ? */ | ||
| 1273 | rdev->mc.vram_size = rdev->mc.aper_size; | ||
| 1274 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.vram_size); | ||
| 1275 | } | ||
| 1276 | } | 1282 | } |
| 1277 | 1283 | ||
| 1278 | 1284 | ||
| @@ -1352,6 +1358,11 @@ void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 1352 | } | 1358 | } |
| 1353 | } | 1359 | } |
| 1354 | 1360 | ||
| 1361 | int r100_init(struct radeon_device *rdev) | ||
| 1362 | { | ||
| 1363 | return 0; | ||
| 1364 | } | ||
| 1365 | |||
| 1355 | /* | 1366 | /* |
| 1356 | * Debugfs info | 1367 | * Debugfs info |
| 1357 | */ | 1368 | */ |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index f5870a099d4f..e2ed5bc08170 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -48,14 +48,13 @@ int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, | |||
| 48 | struct radeon_cs_reloc **cs_reloc); | 48 | struct radeon_cs_reloc **cs_reloc); |
| 49 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, | 49 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, |
| 50 | struct radeon_cs_packet *pkt, | 50 | struct radeon_cs_packet *pkt, |
| 51 | unsigned *auth, unsigned n, | 51 | const unsigned *auth, unsigned n, |
| 52 | radeon_packet0_check_t check); | 52 | radeon_packet0_check_t check); |
| 53 | int r100_cs_parse_packet3(struct radeon_cs_parser *p, | ||
| 54 | struct radeon_cs_packet *pkt, | ||
| 55 | unsigned *auth, unsigned n, | ||
| 56 | radeon_packet3_check_t check); | ||
| 57 | void r100_cs_dump_packet(struct radeon_cs_parser *p, | 53 | void r100_cs_dump_packet(struct radeon_cs_parser *p, |
| 58 | struct radeon_cs_packet *pkt); | 54 | struct radeon_cs_packet *pkt); |
| 55 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
| 56 | struct radeon_cs_packet *pkt, | ||
| 57 | struct radeon_object *robj); | ||
| 59 | 58 | ||
| 60 | /* This files gather functions specifics to: | 59 | /* This files gather functions specifics to: |
| 61 | * r300,r350,rv350,rv370,rv380 | 60 | * r300,r350,rv350,rv370,rv380 |
| @@ -288,7 +287,7 @@ int r300_copy_dma(struct radeon_device *rdev, | |||
| 288 | return r; | 287 | return r; |
| 289 | } | 288 | } |
| 290 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ | 289 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ |
| 291 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); | 290 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 )); |
| 292 | radeon_ring_write(rdev, (1 << 16)); | 291 | radeon_ring_write(rdev, (1 << 16)); |
| 293 | for (i = 0; i < num_loops; i++) { | 292 | for (i = 0; i < num_loops; i++) { |
| 294 | cur_size = size; | 293 | cur_size = size; |
| @@ -319,7 +318,7 @@ void r300_ring_start(struct radeon_device *rdev) | |||
| 319 | 318 | ||
| 320 | /* Sub pixel 1/12 so we can have 4K rendering according to doc */ | 319 | /* Sub pixel 1/12 so we can have 4K rendering according to doc */ |
| 321 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); | 320 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
| 322 | switch (rdev->num_gb_pipes) { | 321 | switch(rdev->num_gb_pipes) { |
| 323 | case 2: | 322 | case 2: |
| 324 | gb_tile_config |= R300_PIPE_COUNT_R300; | 323 | gb_tile_config |= R300_PIPE_COUNT_R300; |
| 325 | break; | 324 | break; |
| @@ -452,8 +451,8 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
| 452 | case 4: | 451 | case 4: |
| 453 | gb_tile_config |= R300_PIPE_COUNT_R420; | 452 | gb_tile_config |= R300_PIPE_COUNT_R420; |
| 454 | break; | 453 | break; |
| 455 | case 1: | ||
| 456 | default: | 454 | default: |
| 455 | case 1: | ||
| 457 | gb_tile_config |= R300_PIPE_COUNT_RV350; | 456 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
| 458 | break; | 457 | break; |
| 459 | } | 458 | } |
| @@ -725,18 +724,120 @@ struct r300_cs_track_cb { | |||
| 725 | unsigned offset; | 724 | unsigned offset; |
| 726 | }; | 725 | }; |
| 727 | 726 | ||
| 727 | struct r300_cs_track_array { | ||
| 728 | struct radeon_object *robj; | ||
| 729 | unsigned esize; | ||
| 730 | }; | ||
| 731 | |||
| 732 | struct r300_cs_track_texture { | ||
| 733 | struct radeon_object *robj; | ||
| 734 | unsigned pitch; | ||
| 735 | unsigned width; | ||
| 736 | unsigned height; | ||
| 737 | unsigned num_levels; | ||
| 738 | unsigned cpp; | ||
| 739 | unsigned tex_coord_type; | ||
| 740 | unsigned txdepth; | ||
| 741 | unsigned width_11; | ||
| 742 | unsigned height_11; | ||
| 743 | bool use_pitch; | ||
| 744 | bool enabled; | ||
| 745 | bool roundup_w; | ||
| 746 | bool roundup_h; | ||
| 747 | }; | ||
| 748 | |||
| 728 | struct r300_cs_track { | 749 | struct r300_cs_track { |
| 729 | unsigned num_cb; | 750 | unsigned num_cb; |
| 730 | unsigned maxy; | 751 | unsigned maxy; |
| 731 | struct r300_cs_track_cb cb[4]; | 752 | unsigned vtx_size; |
| 732 | struct r300_cs_track_cb zb; | 753 | unsigned vap_vf_cntl; |
| 733 | bool z_enabled; | 754 | unsigned immd_dwords; |
| 755 | unsigned num_arrays; | ||
| 756 | unsigned max_indx; | ||
| 757 | struct r300_cs_track_array arrays[11]; | ||
| 758 | struct r300_cs_track_cb cb[4]; | ||
| 759 | struct r300_cs_track_cb zb; | ||
| 760 | struct r300_cs_track_texture textures[16]; | ||
| 761 | bool z_enabled; | ||
| 734 | }; | 762 | }; |
| 735 | 763 | ||
| 764 | static inline void r300_cs_track_texture_print(struct r300_cs_track_texture *t) | ||
| 765 | { | ||
| 766 | DRM_ERROR("pitch %d\n", t->pitch); | ||
| 767 | DRM_ERROR("width %d\n", t->width); | ||
| 768 | DRM_ERROR("height %d\n", t->height); | ||
| 769 | DRM_ERROR("num levels %d\n", t->num_levels); | ||
| 770 | DRM_ERROR("depth %d\n", t->txdepth); | ||
| 771 | DRM_ERROR("bpp %d\n", t->cpp); | ||
| 772 | DRM_ERROR("coordinate type %d\n", t->tex_coord_type); | ||
| 773 | DRM_ERROR("width round to power of 2 %d\n", t->roundup_w); | ||
| 774 | DRM_ERROR("height round to power of 2 %d\n", t->roundup_h); | ||
| 775 | } | ||
| 776 | |||
| 777 | static inline int r300_cs_track_texture_check(struct radeon_device *rdev, | ||
| 778 | struct r300_cs_track *track) | ||
| 779 | { | ||
| 780 | struct radeon_object *robj; | ||
| 781 | unsigned long size; | ||
| 782 | unsigned u, i, w, h; | ||
| 783 | |||
| 784 | for (u = 0; u < 16; u++) { | ||
| 785 | if (!track->textures[u].enabled) | ||
| 786 | continue; | ||
| 787 | robj = track->textures[u].robj; | ||
| 788 | if (robj == NULL) { | ||
| 789 | DRM_ERROR("No texture bound to unit %u\n", u); | ||
| 790 | return -EINVAL; | ||
| 791 | } | ||
| 792 | size = 0; | ||
| 793 | for (i = 0; i <= track->textures[u].num_levels; i++) { | ||
| 794 | if (track->textures[u].use_pitch) { | ||
| 795 | w = track->textures[u].pitch / (1 << i); | ||
| 796 | } else { | ||
| 797 | w = track->textures[u].width / (1 << i); | ||
| 798 | if (rdev->family >= CHIP_RV515) | ||
| 799 | w |= track->textures[u].width_11; | ||
| 800 | if (track->textures[u].roundup_w) | ||
| 801 | w = roundup_pow_of_two(w); | ||
| 802 | } | ||
| 803 | h = track->textures[u].height / (1 << i); | ||
| 804 | if (rdev->family >= CHIP_RV515) | ||
| 805 | h |= track->textures[u].height_11; | ||
| 806 | if (track->textures[u].roundup_h) | ||
| 807 | h = roundup_pow_of_two(h); | ||
| 808 | size += w * h; | ||
| 809 | } | ||
| 810 | size *= track->textures[u].cpp; | ||
| 811 | switch (track->textures[u].tex_coord_type) { | ||
| 812 | case 0: | ||
| 813 | break; | ||
| 814 | case 1: | ||
| 815 | size *= (1 << track->textures[u].txdepth); | ||
| 816 | break; | ||
| 817 | case 2: | ||
| 818 | size *= 6; | ||
| 819 | break; | ||
| 820 | default: | ||
| 821 | DRM_ERROR("Invalid texture coordinate type %u for unit " | ||
| 822 | "%u\n", track->textures[u].tex_coord_type, u); | ||
| 823 | return -EINVAL; | ||
| 824 | } | ||
| 825 | if (size > radeon_object_size(robj)) { | ||
| 826 | DRM_ERROR("Texture of unit %u needs %lu bytes but is " | ||
| 827 | "%lu\n", u, size, radeon_object_size(robj)); | ||
| 828 | r300_cs_track_texture_print(&track->textures[u]); | ||
| 829 | return -EINVAL; | ||
| 830 | } | ||
| 831 | } | ||
| 832 | return 0; | ||
| 833 | } | ||
| 834 | |||
| 736 | int r300_cs_track_check(struct radeon_device *rdev, struct r300_cs_track *track) | 835 | int r300_cs_track_check(struct radeon_device *rdev, struct r300_cs_track *track) |
| 737 | { | 836 | { |
| 738 | unsigned i; | 837 | unsigned i; |
| 739 | unsigned long size; | 838 | unsigned long size; |
| 839 | unsigned prim_walk; | ||
| 840 | unsigned nverts; | ||
| 740 | 841 | ||
| 741 | for (i = 0; i < track->num_cb; i++) { | 842 | for (i = 0; i < track->num_cb; i++) { |
| 742 | if (track->cb[i].robj == NULL) { | 843 | if (track->cb[i].robj == NULL) { |
| @@ -769,7 +870,59 @@ int r300_cs_track_check(struct radeon_device *rdev, struct r300_cs_track *track) | |||
| 769 | return -EINVAL; | 870 | return -EINVAL; |
| 770 | } | 871 | } |
| 771 | } | 872 | } |
| 772 | return 0; | 873 | prim_walk = (track->vap_vf_cntl >> 4) & 0x3; |
| 874 | nverts = (track->vap_vf_cntl >> 16) & 0xFFFF; | ||
| 875 | switch (prim_walk) { | ||
| 876 | case 1: | ||
| 877 | for (i = 0; i < track->num_arrays; i++) { | ||
| 878 | size = track->arrays[i].esize * track->max_indx * 4; | ||
| 879 | if (track->arrays[i].robj == NULL) { | ||
| 880 | DRM_ERROR("(PW %u) Vertex array %u no buffer " | ||
| 881 | "bound\n", prim_walk, i); | ||
| 882 | return -EINVAL; | ||
| 883 | } | ||
| 884 | if (size > radeon_object_size(track->arrays[i].robj)) { | ||
| 885 | DRM_ERROR("(PW %u) Vertex array %u need %lu dwords " | ||
| 886 | "have %lu dwords\n", prim_walk, i, | ||
| 887 | size >> 2, | ||
| 888 | radeon_object_size(track->arrays[i].robj) >> 2); | ||
| 889 | DRM_ERROR("Max indices %u\n", track->max_indx); | ||
| 890 | return -EINVAL; | ||
| 891 | } | ||
| 892 | } | ||
| 893 | break; | ||
| 894 | case 2: | ||
| 895 | for (i = 0; i < track->num_arrays; i++) { | ||
| 896 | size = track->arrays[i].esize * (nverts - 1) * 4; | ||
| 897 | if (track->arrays[i].robj == NULL) { | ||
| 898 | DRM_ERROR("(PW %u) Vertex array %u no buffer " | ||
| 899 | "bound\n", prim_walk, i); | ||
| 900 | return -EINVAL; | ||
| 901 | } | ||
| 902 | if (size > radeon_object_size(track->arrays[i].robj)) { | ||
| 903 | DRM_ERROR("(PW %u) Vertex array %u need %lu dwords " | ||
| 904 | "have %lu dwords\n", prim_walk, i, size >> 2, | ||
| 905 | radeon_object_size(track->arrays[i].robj) >> 2); | ||
| 906 | return -EINVAL; | ||
| 907 | } | ||
| 908 | } | ||
| 909 | break; | ||
| 910 | case 3: | ||
| 911 | size = track->vtx_size * nverts; | ||
| 912 | if (size != track->immd_dwords) { | ||
| 913 | DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n", | ||
| 914 | track->immd_dwords, size); | ||
| 915 | DRM_ERROR("VAP_VF_CNTL.NUM_VERTICES %u, VTX_SIZE %u\n", | ||
| 916 | nverts, track->vtx_size); | ||
| 917 | return -EINVAL; | ||
| 918 | } | ||
| 919 | break; | ||
| 920 | default: | ||
| 921 | DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n", | ||
| 922 | prim_walk); | ||
| 923 | return -EINVAL; | ||
| 924 | } | ||
| 925 | return r300_cs_track_texture_check(rdev, track); | ||
| 773 | } | 926 | } |
| 774 | 927 | ||
| 775 | static inline void r300_cs_track_clear(struct r300_cs_track *track) | 928 | static inline void r300_cs_track_clear(struct r300_cs_track *track) |
| @@ -789,9 +942,33 @@ static inline void r300_cs_track_clear(struct r300_cs_track *track) | |||
| 789 | track->zb.pitch = 8192; | 942 | track->zb.pitch = 8192; |
| 790 | track->zb.cpp = 4; | 943 | track->zb.cpp = 4; |
| 791 | track->zb.offset = 0; | 944 | track->zb.offset = 0; |
| 945 | track->vtx_size = 0x7F; | ||
| 946 | track->immd_dwords = 0xFFFFFFFFUL; | ||
| 947 | track->num_arrays = 11; | ||
| 948 | track->max_indx = 0x00FFFFFFUL; | ||
| 949 | for (i = 0; i < track->num_arrays; i++) { | ||
| 950 | track->arrays[i].robj = NULL; | ||
| 951 | track->arrays[i].esize = 0x7F; | ||
| 952 | } | ||
| 953 | for (i = 0; i < 16; i++) { | ||
| 954 | track->textures[i].pitch = 16536; | ||
| 955 | track->textures[i].width = 16536; | ||
| 956 | track->textures[i].height = 16536; | ||
| 957 | track->textures[i].width_11 = 1 << 11; | ||
| 958 | track->textures[i].height_11 = 1 << 11; | ||
| 959 | track->textures[i].num_levels = 12; | ||
| 960 | track->textures[i].txdepth = 16; | ||
| 961 | track->textures[i].cpp = 64; | ||
| 962 | track->textures[i].tex_coord_type = 1; | ||
| 963 | track->textures[i].robj = NULL; | ||
| 964 | /* CS IB emission code makes sure texture unit are disabled */ | ||
| 965 | track->textures[i].enabled = false; | ||
| 966 | track->textures[i].roundup_w = true; | ||
| 967 | track->textures[i].roundup_h = true; | ||
| 968 | } | ||
| 792 | } | 969 | } |
| 793 | 970 | ||
| 794 | static unsigned r300_auth_reg[] = { | 971 | static const unsigned r300_reg_safe_bm[159] = { |
| 795 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 972 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 796 | 0xFFFFFFBF, 0xFFFFFFFF, 0xFFFFFFBF, 0xFFFFFFFF, | 973 | 0xFFFFFFBF, 0xFFFFFFFF, 0xFFFFFFBF, 0xFFFFFFFF, |
| 797 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 974 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| @@ -808,7 +985,7 @@ static unsigned r300_auth_reg[] = { | |||
| 808 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 985 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 809 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF03F, | 986 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF03F, |
| 810 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 987 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 811 | 0xFFFFFFFF, 0xFFFFCFCC, 0xF00E9FFF, 0x007C0000, | 988 | 0xFFFFFFFF, 0xFFFFEFCE, 0xF00EBFFF, 0x007C0000, |
| 812 | 0xF0000078, 0xFF000009, 0xFFFFFFFF, 0xFFFFFFFF, | 989 | 0xF0000078, 0xFF000009, 0xFFFFFFFF, 0xFFFFFFFF, |
| 813 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 990 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 814 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 991 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| @@ -824,9 +1001,9 @@ static unsigned r300_auth_reg[] = { | |||
| 824 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 1001 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 825 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 1002 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 826 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 1003 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 827 | 0xFFFFFC78, 0xFFFFFFFF, 0xFFFFFFFC, 0xFFFFFFFF, | 1004 | 0xFFFFFC78, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, |
| 828 | 0x38FF8F50, 0xFFF88082, 0xF000000C, 0xFAE009FF, | 1005 | 0x38FF8F50, 0xFFF88082, 0xF000000C, 0xFAE009FF, |
| 829 | 0x00000000, 0x00000000, 0xFFFF0000, 0x00000000, | 1006 | 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, |
| 830 | 0x00000000, 0x0000C100, 0x00000000, 0x00000000, | 1007 | 0x00000000, 0x0000C100, 0x00000000, 0x00000000, |
| 831 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 1008 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 832 | 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFF80FFFF, | 1009 | 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFF80FFFF, |
| @@ -848,8 +1025,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 848 | 1025 | ||
| 849 | ib = p->ib->ptr; | 1026 | ib = p->ib->ptr; |
| 850 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | 1027 | ib_chunk = &p->chunks[p->chunk_ib_idx]; |
| 851 | track = (struct r300_cs_track *)p->track; | 1028 | track = (struct r300_cs_track*)p->track; |
| 852 | switch (reg) { | 1029 | switch(reg) { |
| 853 | case RADEON_DST_PITCH_OFFSET: | 1030 | case RADEON_DST_PITCH_OFFSET: |
| 854 | case RADEON_SRC_PITCH_OFFSET: | 1031 | case RADEON_SRC_PITCH_OFFSET: |
| 855 | r = r100_cs_packet_next_reloc(p, &reloc); | 1032 | r = r100_cs_packet_next_reloc(p, &reloc); |
| @@ -907,6 +1084,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 907 | case R300_TX_OFFSET_0+52: | 1084 | case R300_TX_OFFSET_0+52: |
| 908 | case R300_TX_OFFSET_0+56: | 1085 | case R300_TX_OFFSET_0+56: |
| 909 | case R300_TX_OFFSET_0+60: | 1086 | case R300_TX_OFFSET_0+60: |
| 1087 | i = (reg - R300_TX_OFFSET_0) >> 2; | ||
| 910 | r = r100_cs_packet_next_reloc(p, &reloc); | 1088 | r = r100_cs_packet_next_reloc(p, &reloc); |
| 911 | if (r) { | 1089 | if (r) { |
| 912 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | 1090 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
| @@ -915,11 +1093,23 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 915 | return r; | 1093 | return r; |
| 916 | } | 1094 | } |
| 917 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1095 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
| 1096 | track->textures[i].robj = reloc->robj; | ||
| 918 | break; | 1097 | break; |
| 919 | /* Tracked registers */ | 1098 | /* Tracked registers */ |
| 1099 | case 0x2084: | ||
| 1100 | /* VAP_VF_CNTL */ | ||
| 1101 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | ||
| 1102 | break; | ||
| 1103 | case 0x20B4: | ||
| 1104 | /* VAP_VTX_SIZE */ | ||
| 1105 | track->vtx_size = ib_chunk->kdata[idx] & 0x7F; | ||
| 1106 | break; | ||
| 1107 | case 0x2134: | ||
| 1108 | /* VAP_VF_MAX_VTX_INDX */ | ||
| 1109 | track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL; | ||
| 1110 | break; | ||
| 920 | case 0x43E4: | 1111 | case 0x43E4: |
| 921 | /* SC_SCISSOR1 */ | 1112 | /* SC_SCISSOR1 */ |
| 922 | |||
| 923 | track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1; | 1113 | track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1; |
| 924 | if (p->rdev->family < CHIP_RV515) { | 1114 | if (p->rdev->family < CHIP_RV515) { |
| 925 | track->maxy -= 1440; | 1115 | track->maxy -= 1440; |
| @@ -994,8 +1184,166 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 994 | /* ZB_DEPTHPITCH */ | 1184 | /* ZB_DEPTHPITCH */ |
| 995 | track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC; | 1185 | track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC; |
| 996 | break; | 1186 | break; |
| 1187 | case 0x4104: | ||
| 1188 | for (i = 0; i < 16; i++) { | ||
| 1189 | bool enabled; | ||
| 1190 | |||
| 1191 | enabled = !!(ib_chunk->kdata[idx] & (1 << i)); | ||
| 1192 | track->textures[i].enabled = enabled; | ||
| 1193 | } | ||
| 1194 | break; | ||
| 1195 | case 0x44C0: | ||
| 1196 | case 0x44C4: | ||
| 1197 | case 0x44C8: | ||
| 1198 | case 0x44CC: | ||
| 1199 | case 0x44D0: | ||
| 1200 | case 0x44D4: | ||
| 1201 | case 0x44D8: | ||
| 1202 | case 0x44DC: | ||
| 1203 | case 0x44E0: | ||
| 1204 | case 0x44E4: | ||
| 1205 | case 0x44E8: | ||
| 1206 | case 0x44EC: | ||
| 1207 | case 0x44F0: | ||
| 1208 | case 0x44F4: | ||
| 1209 | case 0x44F8: | ||
| 1210 | case 0x44FC: | ||
| 1211 | /* TX_FORMAT1_[0-15] */ | ||
| 1212 | i = (reg - 0x44C0) >> 2; | ||
| 1213 | tmp = (ib_chunk->kdata[idx] >> 25) & 0x3; | ||
| 1214 | track->textures[i].tex_coord_type = tmp; | ||
| 1215 | switch ((ib_chunk->kdata[idx] & 0x1F)) { | ||
| 1216 | case 0: | ||
| 1217 | case 2: | ||
| 1218 | case 5: | ||
| 1219 | case 18: | ||
| 1220 | case 20: | ||
| 1221 | case 21: | ||
| 1222 | track->textures[i].cpp = 1; | ||
| 1223 | break; | ||
| 1224 | case 1: | ||
| 1225 | case 3: | ||
| 1226 | case 6: | ||
| 1227 | case 7: | ||
| 1228 | case 10: | ||
| 1229 | case 11: | ||
| 1230 | case 19: | ||
| 1231 | case 22: | ||
| 1232 | case 24: | ||
| 1233 | track->textures[i].cpp = 2; | ||
| 1234 | break; | ||
| 1235 | case 4: | ||
| 1236 | case 8: | ||
| 1237 | case 9: | ||
| 1238 | case 12: | ||
| 1239 | case 13: | ||
| 1240 | case 23: | ||
| 1241 | case 25: | ||
| 1242 | case 27: | ||
| 1243 | case 30: | ||
| 1244 | track->textures[i].cpp = 4; | ||
| 1245 | break; | ||
| 1246 | case 14: | ||
| 1247 | case 26: | ||
| 1248 | case 28: | ||
| 1249 | track->textures[i].cpp = 8; | ||
| 1250 | break; | ||
| 1251 | case 29: | ||
| 1252 | track->textures[i].cpp = 16; | ||
| 1253 | break; | ||
| 1254 | default: | ||
| 1255 | DRM_ERROR("Invalid texture format %u\n", | ||
| 1256 | (ib_chunk->kdata[idx] & 0x1F)); | ||
| 1257 | return -EINVAL; | ||
| 1258 | break; | ||
| 1259 | } | ||
| 1260 | break; | ||
| 1261 | case 0x4400: | ||
| 1262 | case 0x4404: | ||
| 1263 | case 0x4408: | ||
| 1264 | case 0x440C: | ||
| 1265 | case 0x4410: | ||
| 1266 | case 0x4414: | ||
| 1267 | case 0x4418: | ||
| 1268 | case 0x441C: | ||
| 1269 | case 0x4420: | ||
| 1270 | case 0x4424: | ||
| 1271 | case 0x4428: | ||
| 1272 | case 0x442C: | ||
| 1273 | case 0x4430: | ||
| 1274 | case 0x4434: | ||
| 1275 | case 0x4438: | ||
| 1276 | case 0x443C: | ||
| 1277 | /* TX_FILTER0_[0-15] */ | ||
| 1278 | i = (reg - 0x4400) >> 2; | ||
| 1279 | tmp = ib_chunk->kdata[idx] & 0x7;; | ||
| 1280 | if (tmp == 2 || tmp == 4 || tmp == 6) { | ||
| 1281 | track->textures[i].roundup_w = false; | ||
| 1282 | } | ||
| 1283 | tmp = (ib_chunk->kdata[idx] >> 3) & 0x7;; | ||
| 1284 | if (tmp == 2 || tmp == 4 || tmp == 6) { | ||
| 1285 | track->textures[i].roundup_h = false; | ||
| 1286 | } | ||
| 1287 | break; | ||
| 1288 | case 0x4500: | ||
| 1289 | case 0x4504: | ||
| 1290 | case 0x4508: | ||
| 1291 | case 0x450C: | ||
| 1292 | case 0x4510: | ||
| 1293 | case 0x4514: | ||
| 1294 | case 0x4518: | ||
| 1295 | case 0x451C: | ||
| 1296 | case 0x4520: | ||
| 1297 | case 0x4524: | ||
| 1298 | case 0x4528: | ||
| 1299 | case 0x452C: | ||
| 1300 | case 0x4530: | ||
| 1301 | case 0x4534: | ||
| 1302 | case 0x4538: | ||
| 1303 | case 0x453C: | ||
| 1304 | /* TX_FORMAT2_[0-15] */ | ||
| 1305 | i = (reg - 0x4500) >> 2; | ||
| 1306 | tmp = ib_chunk->kdata[idx] & 0x3FFF; | ||
| 1307 | track->textures[i].pitch = tmp + 1; | ||
| 1308 | if (p->rdev->family >= CHIP_RV515) { | ||
| 1309 | tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11; | ||
| 1310 | track->textures[i].width_11 = tmp; | ||
| 1311 | tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11; | ||
| 1312 | track->textures[i].height_11 = tmp; | ||
| 1313 | } | ||
| 1314 | break; | ||
| 1315 | case 0x4480: | ||
| 1316 | case 0x4484: | ||
| 1317 | case 0x4488: | ||
| 1318 | case 0x448C: | ||
| 1319 | case 0x4490: | ||
| 1320 | case 0x4494: | ||
| 1321 | case 0x4498: | ||
| 1322 | case 0x449C: | ||
| 1323 | case 0x44A0: | ||
| 1324 | case 0x44A4: | ||
| 1325 | case 0x44A8: | ||
| 1326 | case 0x44AC: | ||
| 1327 | case 0x44B0: | ||
| 1328 | case 0x44B4: | ||
| 1329 | case 0x44B8: | ||
| 1330 | case 0x44BC: | ||
| 1331 | /* TX_FORMAT0_[0-15] */ | ||
| 1332 | i = (reg - 0x4480) >> 2; | ||
| 1333 | tmp = ib_chunk->kdata[idx] & 0x7FF; | ||
| 1334 | track->textures[i].width = tmp + 1; | ||
| 1335 | tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF; | ||
| 1336 | track->textures[i].height = tmp + 1; | ||
| 1337 | tmp = (ib_chunk->kdata[idx] >> 26) & 0xF; | ||
| 1338 | track->textures[i].num_levels = tmp; | ||
| 1339 | tmp = ib_chunk->kdata[idx] & (1 << 31); | ||
| 1340 | track->textures[i].use_pitch = !!tmp; | ||
| 1341 | tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; | ||
| 1342 | track->textures[i].txdepth = tmp; | ||
| 1343 | break; | ||
| 997 | default: | 1344 | default: |
| 998 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", reg, idx); | 1345 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", |
| 1346 | reg, idx); | ||
| 999 | return -EINVAL; | 1347 | return -EINVAL; |
| 1000 | } | 1348 | } |
| 1001 | return 0; | 1349 | return 0; |
| @@ -1015,11 +1363,12 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
| 1015 | ib = p->ib->ptr; | 1363 | ib = p->ib->ptr; |
| 1016 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | 1364 | ib_chunk = &p->chunks[p->chunk_ib_idx]; |
| 1017 | idx = pkt->idx + 1; | 1365 | idx = pkt->idx + 1; |
| 1018 | track = (struct r300_cs_track *)p->track; | 1366 | track = (struct r300_cs_track*)p->track; |
| 1019 | switch (pkt->opcode) { | 1367 | switch(pkt->opcode) { |
| 1020 | case PACKET3_3D_LOAD_VBPNTR: | 1368 | case PACKET3_3D_LOAD_VBPNTR: |
| 1021 | c = ib_chunk->kdata[idx++]; | 1369 | c = ib_chunk->kdata[idx++] & 0x1F; |
| 1022 | for (i = 0; i < (c - 1); i += 2, idx += 3) { | 1370 | track->num_arrays = c; |
| 1371 | for (i = 0; i < (c - 1); i+=2, idx+=3) { | ||
| 1023 | r = r100_cs_packet_next_reloc(p, &reloc); | 1372 | r = r100_cs_packet_next_reloc(p, &reloc); |
| 1024 | if (r) { | 1373 | if (r) { |
| 1025 | DRM_ERROR("No reloc for packet3 %d\n", | 1374 | DRM_ERROR("No reloc for packet3 %d\n", |
| @@ -1028,6 +1377,9 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
| 1028 | return r; | 1377 | return r; |
| 1029 | } | 1378 | } |
| 1030 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 1379 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
| 1380 | track->arrays[i + 0].robj = reloc->robj; | ||
| 1381 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; | ||
| 1382 | track->arrays[i + 0].esize &= 0x7F; | ||
| 1031 | r = r100_cs_packet_next_reloc(p, &reloc); | 1383 | r = r100_cs_packet_next_reloc(p, &reloc); |
| 1032 | if (r) { | 1384 | if (r) { |
| 1033 | DRM_ERROR("No reloc for packet3 %d\n", | 1385 | DRM_ERROR("No reloc for packet3 %d\n", |
| @@ -1036,6 +1388,9 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
| 1036 | return r; | 1388 | return r; |
| 1037 | } | 1389 | } |
| 1038 | ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset); | 1390 | ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset); |
| 1391 | track->arrays[i + 1].robj = reloc->robj; | ||
| 1392 | track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24; | ||
| 1393 | track->arrays[i + 1].esize &= 0x7F; | ||
| 1039 | } | 1394 | } |
| 1040 | if (c & 1) { | 1395 | if (c & 1) { |
| 1041 | r = r100_cs_packet_next_reloc(p, &reloc); | 1396 | r = r100_cs_packet_next_reloc(p, &reloc); |
| @@ -1046,6 +1401,9 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
| 1046 | return r; | 1401 | return r; |
| 1047 | } | 1402 | } |
| 1048 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 1403 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
| 1404 | track->arrays[i + 0].robj = reloc->robj; | ||
| 1405 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; | ||
| 1406 | track->arrays[i + 0].esize &= 0x7F; | ||
| 1049 | } | 1407 | } |
| 1050 | break; | 1408 | break; |
| 1051 | case PACKET3_INDX_BUFFER: | 1409 | case PACKET3_INDX_BUFFER: |
| @@ -1056,14 +1414,65 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
| 1056 | return r; | 1414 | return r; |
| 1057 | } | 1415 | } |
| 1058 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 1416 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
| 1417 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); | ||
| 1418 | if (r) { | ||
| 1419 | return r; | ||
| 1420 | } | ||
| 1059 | break; | 1421 | break; |
| 1060 | /* Draw packet */ | 1422 | /* Draw packet */ |
| 1061 | case PACKET3_3D_DRAW_VBUF: | ||
| 1062 | case PACKET3_3D_DRAW_IMMD: | 1423 | case PACKET3_3D_DRAW_IMMD: |
| 1063 | case PACKET3_3D_DRAW_INDX: | 1424 | /* Number of dwords is vtx_size * (num_vertices - 1) |
| 1064 | case PACKET3_3D_DRAW_VBUF_2: | 1425 | * PRIM_WALK must be equal to 3 vertex data in embedded |
| 1426 | * in cmd stream */ | ||
| 1427 | if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) { | ||
| 1428 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | ||
| 1429 | return -EINVAL; | ||
| 1430 | } | ||
| 1431 | track->vap_vf_cntl = ib_chunk->kdata[idx+1]; | ||
| 1432 | track->immd_dwords = pkt->count - 1; | ||
| 1433 | r = r300_cs_track_check(p->rdev, track); | ||
| 1434 | if (r) { | ||
| 1435 | return r; | ||
| 1436 | } | ||
| 1437 | break; | ||
| 1065 | case PACKET3_3D_DRAW_IMMD_2: | 1438 | case PACKET3_3D_DRAW_IMMD_2: |
| 1439 | /* Number of dwords is vtx_size * (num_vertices - 1) | ||
| 1440 | * PRIM_WALK must be equal to 3 vertex data in embedded | ||
| 1441 | * in cmd stream */ | ||
| 1442 | if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) { | ||
| 1443 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | ||
| 1444 | return -EINVAL; | ||
| 1445 | } | ||
| 1446 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | ||
| 1447 | track->immd_dwords = pkt->count; | ||
| 1448 | r = r300_cs_track_check(p->rdev, track); | ||
| 1449 | if (r) { | ||
| 1450 | return r; | ||
| 1451 | } | ||
| 1452 | break; | ||
| 1453 | case PACKET3_3D_DRAW_VBUF: | ||
| 1454 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; | ||
| 1455 | r = r300_cs_track_check(p->rdev, track); | ||
| 1456 | if (r) { | ||
| 1457 | return r; | ||
| 1458 | } | ||
| 1459 | break; | ||
| 1460 | case PACKET3_3D_DRAW_VBUF_2: | ||
| 1461 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | ||
| 1462 | r = r300_cs_track_check(p->rdev, track); | ||
| 1463 | if (r) { | ||
| 1464 | return r; | ||
| 1465 | } | ||
| 1466 | break; | ||
| 1467 | case PACKET3_3D_DRAW_INDX: | ||
| 1468 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; | ||
| 1469 | r = r300_cs_track_check(p->rdev, track); | ||
| 1470 | if (r) { | ||
| 1471 | return r; | ||
| 1472 | } | ||
| 1473 | break; | ||
| 1066 | case PACKET3_3D_DRAW_INDX_2: | 1474 | case PACKET3_3D_DRAW_INDX_2: |
| 1475 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | ||
| 1067 | r = r300_cs_track_check(p->rdev, track); | 1476 | r = r300_cs_track_check(p->rdev, track); |
| 1068 | if (r) { | 1477 | if (r) { |
| 1069 | return r; | 1478 | return r; |
| @@ -1095,8 +1504,8 @@ int r300_cs_parse(struct radeon_cs_parser *p) | |||
| 1095 | switch (pkt.type) { | 1504 | switch (pkt.type) { |
| 1096 | case PACKET_TYPE0: | 1505 | case PACKET_TYPE0: |
| 1097 | r = r100_cs_parse_packet0(p, &pkt, | 1506 | r = r100_cs_parse_packet0(p, &pkt, |
| 1098 | r300_auth_reg, | 1507 | p->rdev->config.r300.reg_safe_bm, |
| 1099 | ARRAY_SIZE(r300_auth_reg), | 1508 | p->rdev->config.r300.reg_safe_bm_size, |
| 1100 | &r300_packet0_check); | 1509 | &r300_packet0_check); |
| 1101 | break; | 1510 | break; |
| 1102 | case PACKET_TYPE2: | 1511 | case PACKET_TYPE2: |
| @@ -1114,3 +1523,10 @@ int r300_cs_parse(struct radeon_cs_parser *p) | |||
| 1114 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); | 1523 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
| 1115 | return 0; | 1524 | return 0; |
| 1116 | } | 1525 | } |
| 1526 | |||
| 1527 | int r300_init(struct radeon_device *rdev) | ||
| 1528 | { | ||
| 1529 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; | ||
| 1530 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); | ||
| 1531 | return 0; | ||
| 1532 | } | ||
diff --git a/drivers/gpu/drm/radeon/r300.h b/drivers/gpu/drm/radeon/r300.h new file mode 100644 index 000000000000..8486b4da9d69 --- /dev/null +++ b/drivers/gpu/drm/radeon/r300.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef R300_H | ||
| 29 | #define R300_H | ||
| 30 | |||
| 31 | struct r300_asic { | ||
| 32 | const unsigned *reg_safe_bm; | ||
| 33 | unsigned reg_safe_bm_size; | ||
| 34 | }; | ||
| 35 | |||
| 36 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index c3f24cc56009..d61f2fc61df5 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -51,7 +51,7 @@ | |||
| 51 | 51 | ||
| 52 | #include "radeon_mode.h" | 52 | #include "radeon_mode.h" |
| 53 | #include "radeon_reg.h" | 53 | #include "radeon_reg.h" |
| 54 | 54 | #include "r300.h" | |
| 55 | 55 | ||
| 56 | /* | 56 | /* |
| 57 | * Modules parameters. | 57 | * Modules parameters. |
| @@ -496,6 +496,7 @@ int r100_debugfs_cp_init(struct radeon_device *rdev); | |||
| 496 | * ASIC specific functions. | 496 | * ASIC specific functions. |
| 497 | */ | 497 | */ |
| 498 | struct radeon_asic { | 498 | struct radeon_asic { |
| 499 | int (*init)(struct radeon_device *rdev); | ||
| 499 | void (*errata)(struct radeon_device *rdev); | 500 | void (*errata)(struct radeon_device *rdev); |
| 500 | void (*vram_info)(struct radeon_device *rdev); | 501 | void (*vram_info)(struct radeon_device *rdev); |
| 501 | int (*gpu_reset)(struct radeon_device *rdev); | 502 | int (*gpu_reset)(struct radeon_device *rdev); |
| @@ -536,6 +537,10 @@ struct radeon_asic { | |||
| 536 | void (*set_clock_gating)(struct radeon_device *rdev, int enable); | 537 | void (*set_clock_gating)(struct radeon_device *rdev, int enable); |
| 537 | }; | 538 | }; |
| 538 | 539 | ||
| 540 | union radeon_asic_config { | ||
| 541 | struct r300_asic r300; | ||
| 542 | }; | ||
| 543 | |||
| 539 | 544 | ||
| 540 | /* | 545 | /* |
| 541 | * IOCTL. | 546 | * IOCTL. |
| @@ -573,6 +578,7 @@ struct radeon_device { | |||
| 573 | struct drm_device *ddev; | 578 | struct drm_device *ddev; |
| 574 | struct pci_dev *pdev; | 579 | struct pci_dev *pdev; |
| 575 | /* ASIC */ | 580 | /* ASIC */ |
| 581 | union radeon_asic_config config; | ||
| 576 | enum radeon_family family; | 582 | enum radeon_family family; |
| 577 | unsigned long flags; | 583 | unsigned long flags; |
| 578 | int usec_timeout; | 584 | int usec_timeout; |
| @@ -763,6 +769,7 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
| 763 | /* | 769 | /* |
| 764 | * ASICs macro. | 770 | * ASICs macro. |
| 765 | */ | 771 | */ |
| 772 | #define radeon_init(rdev) (rdev)->asic->init((rdev)) | ||
| 766 | #define radeon_cs_parse(p) rdev->asic->cs_parse((p)) | 773 | #define radeon_cs_parse(p) rdev->asic->cs_parse((p)) |
| 767 | #define radeon_errata(rdev) (rdev)->asic->errata((rdev)) | 774 | #define radeon_errata(rdev) (rdev)->asic->errata((rdev)) |
| 768 | #define radeon_vram_info(rdev) (rdev)->asic->vram_info((rdev)) | 775 | #define radeon_vram_info(rdev) (rdev)->asic->vram_info((rdev)) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index e57d8a784e9f..e2e567395df8 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -41,6 +41,7 @@ void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); | |||
| 41 | /* | 41 | /* |
| 42 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 42 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
| 43 | */ | 43 | */ |
| 44 | int r100_init(struct radeon_device *rdev); | ||
| 44 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); | 45 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); |
| 45 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 46 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 46 | void r100_errata(struct radeon_device *rdev); | 47 | void r100_errata(struct radeon_device *rdev); |
| @@ -72,6 +73,7 @@ int r100_copy_blit(struct radeon_device *rdev, | |||
| 72 | struct radeon_fence *fence); | 73 | struct radeon_fence *fence); |
| 73 | 74 | ||
| 74 | static struct radeon_asic r100_asic = { | 75 | static struct radeon_asic r100_asic = { |
| 76 | .init = &r100_init, | ||
| 75 | .errata = &r100_errata, | 77 | .errata = &r100_errata, |
| 76 | .vram_info = &r100_vram_info, | 78 | .vram_info = &r100_vram_info, |
| 77 | .gpu_reset = &r100_gpu_reset, | 79 | .gpu_reset = &r100_gpu_reset, |
| @@ -104,6 +106,7 @@ static struct radeon_asic r100_asic = { | |||
| 104 | /* | 106 | /* |
| 105 | * r300,r350,rv350,rv380 | 107 | * r300,r350,rv350,rv380 |
| 106 | */ | 108 | */ |
| 109 | int r300_init(struct radeon_device *rdev); | ||
| 107 | void r300_errata(struct radeon_device *rdev); | 110 | void r300_errata(struct radeon_device *rdev); |
| 108 | void r300_vram_info(struct radeon_device *rdev); | 111 | void r300_vram_info(struct radeon_device *rdev); |
| 109 | int r300_gpu_reset(struct radeon_device *rdev); | 112 | int r300_gpu_reset(struct radeon_device *rdev); |
| @@ -126,6 +129,7 @@ int r300_copy_dma(struct radeon_device *rdev, | |||
| 126 | unsigned num_pages, | 129 | unsigned num_pages, |
| 127 | struct radeon_fence *fence); | 130 | struct radeon_fence *fence); |
| 128 | static struct radeon_asic r300_asic = { | 131 | static struct radeon_asic r300_asic = { |
| 132 | .init = &r300_init, | ||
| 129 | .errata = &r300_errata, | 133 | .errata = &r300_errata, |
| 130 | .vram_info = &r300_vram_info, | 134 | .vram_info = &r300_vram_info, |
| 131 | .gpu_reset = &r300_gpu_reset, | 135 | .gpu_reset = &r300_gpu_reset, |
| @@ -162,6 +166,7 @@ void r420_vram_info(struct radeon_device *rdev); | |||
| 162 | int r420_mc_init(struct radeon_device *rdev); | 166 | int r420_mc_init(struct radeon_device *rdev); |
| 163 | void r420_mc_fini(struct radeon_device *rdev); | 167 | void r420_mc_fini(struct radeon_device *rdev); |
| 164 | static struct radeon_asic r420_asic = { | 168 | static struct radeon_asic r420_asic = { |
| 169 | .init = &r300_init, | ||
| 165 | .errata = &r420_errata, | 170 | .errata = &r420_errata, |
| 166 | .vram_info = &r420_vram_info, | 171 | .vram_info = &r420_vram_info, |
| 167 | .gpu_reset = &r300_gpu_reset, | 172 | .gpu_reset = &r300_gpu_reset, |
| @@ -205,6 +210,7 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | |||
| 205 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 210 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 206 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 211 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 207 | static struct radeon_asic rs400_asic = { | 212 | static struct radeon_asic rs400_asic = { |
| 213 | .init = &r300_init, | ||
| 208 | .errata = &rs400_errata, | 214 | .errata = &rs400_errata, |
| 209 | .vram_info = &rs400_vram_info, | 215 | .vram_info = &rs400_vram_info, |
| 210 | .gpu_reset = &r300_gpu_reset, | 216 | .gpu_reset = &r300_gpu_reset, |
| @@ -249,6 +255,7 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | |||
| 249 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 255 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 250 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 256 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 251 | static struct radeon_asic rs600_asic = { | 257 | static struct radeon_asic rs600_asic = { |
| 258 | .init = &r300_init, | ||
| 252 | .errata = &rs600_errata, | 259 | .errata = &rs600_errata, |
| 253 | .vram_info = &rs600_vram_info, | 260 | .vram_info = &rs600_vram_info, |
| 254 | .gpu_reset = &r300_gpu_reset, | 261 | .gpu_reset = &r300_gpu_reset, |
| @@ -288,6 +295,7 @@ void rs690_mc_fini(struct radeon_device *rdev); | |||
| 288 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 295 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 289 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 296 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 290 | static struct radeon_asic rs690_asic = { | 297 | static struct radeon_asic rs690_asic = { |
| 298 | .init = &r300_init, | ||
| 291 | .errata = &rs690_errata, | 299 | .errata = &rs690_errata, |
| 292 | .vram_info = &rs690_vram_info, | 300 | .vram_info = &rs690_vram_info, |
| 293 | .gpu_reset = &r300_gpu_reset, | 301 | .gpu_reset = &r300_gpu_reset, |
| @@ -320,6 +328,7 @@ static struct radeon_asic rs690_asic = { | |||
| 320 | /* | 328 | /* |
| 321 | * rv515 | 329 | * rv515 |
| 322 | */ | 330 | */ |
| 331 | int rv515_init(struct radeon_device *rdev); | ||
| 323 | void rv515_errata(struct radeon_device *rdev); | 332 | void rv515_errata(struct radeon_device *rdev); |
| 324 | void rv515_vram_info(struct radeon_device *rdev); | 333 | void rv515_vram_info(struct radeon_device *rdev); |
| 325 | int rv515_gpu_reset(struct radeon_device *rdev); | 334 | int rv515_gpu_reset(struct radeon_device *rdev); |
| @@ -331,6 +340,7 @@ void rv515_ring_start(struct radeon_device *rdev); | |||
| 331 | uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg); | 340 | uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg); |
| 332 | void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 341 | void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 333 | static struct radeon_asic rv515_asic = { | 342 | static struct radeon_asic rv515_asic = { |
| 343 | .init = &rv515_init, | ||
| 334 | .errata = &rv515_errata, | 344 | .errata = &rv515_errata, |
| 335 | .vram_info = &rv515_vram_info, | 345 | .vram_info = &rv515_vram_info, |
| 336 | .gpu_reset = &rv515_gpu_reset, | 346 | .gpu_reset = &rv515_gpu_reset, |
| @@ -349,7 +359,7 @@ static struct radeon_asic rv515_asic = { | |||
| 349 | .irq_set = &r100_irq_set, | 359 | .irq_set = &r100_irq_set, |
| 350 | .irq_process = &r100_irq_process, | 360 | .irq_process = &r100_irq_process, |
| 351 | .fence_ring_emit = &r300_fence_ring_emit, | 361 | .fence_ring_emit = &r300_fence_ring_emit, |
| 352 | .cs_parse = &r100_cs_parse, | 362 | .cs_parse = &r300_cs_parse, |
| 353 | .copy_blit = &r100_copy_blit, | 363 | .copy_blit = &r100_copy_blit, |
| 354 | .copy_dma = &r300_copy_dma, | 364 | .copy_dma = &r300_copy_dma, |
| 355 | .copy = &r100_copy_blit, | 365 | .copy = &r100_copy_blit, |
| @@ -368,6 +378,7 @@ void r520_vram_info(struct radeon_device *rdev); | |||
| 368 | int r520_mc_init(struct radeon_device *rdev); | 378 | int r520_mc_init(struct radeon_device *rdev); |
| 369 | void r520_mc_fini(struct radeon_device *rdev); | 379 | void r520_mc_fini(struct radeon_device *rdev); |
| 370 | static struct radeon_asic r520_asic = { | 380 | static struct radeon_asic r520_asic = { |
| 381 | .init = &rv515_init, | ||
| 371 | .errata = &r520_errata, | 382 | .errata = &r520_errata, |
| 372 | .vram_info = &r520_vram_info, | 383 | .vram_info = &r520_vram_info, |
| 373 | .gpu_reset = &rv515_gpu_reset, | 384 | .gpu_reset = &rv515_gpu_reset, |
| @@ -386,7 +397,7 @@ static struct radeon_asic r520_asic = { | |||
| 386 | .irq_set = &r100_irq_set, | 397 | .irq_set = &r100_irq_set, |
| 387 | .irq_process = &r100_irq_process, | 398 | .irq_process = &r100_irq_process, |
| 388 | .fence_ring_emit = &r300_fence_ring_emit, | 399 | .fence_ring_emit = &r300_fence_ring_emit, |
| 389 | .cs_parse = &r100_cs_parse, | 400 | .cs_parse = &r300_cs_parse, |
| 390 | .copy_blit = &r100_copy_blit, | 401 | .copy_blit = &r100_copy_blit, |
| 391 | .copy_dma = &r300_copy_dma, | 402 | .copy_dma = &r300_copy_dma, |
| 392 | .copy = &r100_copy_blit, | 403 | .copy = &r100_copy_blit, |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 786632d3e378..1f5a1a490984 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -835,7 +835,6 @@ radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder) | |||
| 835 | struct _COMPASSIONATE_DATA *dac_info; | 835 | struct _COMPASSIONATE_DATA *dac_info; |
| 836 | uint8_t frev, crev; | 836 | uint8_t frev, crev; |
| 837 | uint8_t bg, dac; | 837 | uint8_t bg, dac; |
| 838 | int i; | ||
| 839 | struct radeon_encoder_primary_dac *p_dac = NULL; | 838 | struct radeon_encoder_primary_dac *p_dac = NULL; |
| 840 | 839 | ||
| 841 | atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, &crev, &data_offset); | 840 | atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, &crev, &data_offset); |
| @@ -867,7 +866,6 @@ radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder) | |||
| 867 | struct _COMPASSIONATE_DATA *dac_info; | 866 | struct _COMPASSIONATE_DATA *dac_info; |
| 868 | uint8_t frev, crev; | 867 | uint8_t frev, crev; |
| 869 | uint8_t bg, dac; | 868 | uint8_t bg, dac; |
| 870 | int i; | ||
| 871 | struct radeon_encoder_tv_dac *tv_dac = NULL; | 869 | struct radeon_encoder_tv_dac *tv_dac = NULL; |
| 872 | 870 | ||
| 873 | atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, &crev, &data_offset); | 871 | atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, &crev, &data_offset); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 06e8038bc4ac..afc4db280b94 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -799,6 +799,7 @@ static struct radeon_encoder_lvds *radeon_legacy_get_lvds_info_from_regs(struct | |||
| 799 | struct radeon_encoder_lvds *lvds = NULL; | 799 | struct radeon_encoder_lvds *lvds = NULL; |
| 800 | uint32_t fp_vert_stretch, fp_horz_stretch; | 800 | uint32_t fp_vert_stretch, fp_horz_stretch; |
| 801 | uint32_t ppll_div_sel, ppll_val; | 801 | uint32_t ppll_div_sel, ppll_val; |
| 802 | uint32_t lvds_ss_gen_cntl = RREG32(RADEON_LVDS_SS_GEN_CNTL); | ||
| 802 | 803 | ||
| 803 | lvds = kzalloc(sizeof(struct radeon_encoder_lvds), GFP_KERNEL); | 804 | lvds = kzalloc(sizeof(struct radeon_encoder_lvds), GFP_KERNEL); |
| 804 | 805 | ||
| @@ -808,6 +809,14 @@ static struct radeon_encoder_lvds *radeon_legacy_get_lvds_info_from_regs(struct | |||
| 808 | fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH); | 809 | fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH); |
| 809 | fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH); | 810 | fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH); |
| 810 | 811 | ||
| 812 | /* These should be fail-safe defaults, fingers crossed */ | ||
| 813 | lvds->panel_pwr_delay = 200; | ||
| 814 | lvds->panel_vcc_delay = 2000; | ||
| 815 | |||
| 816 | lvds->lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | ||
| 817 | lvds->panel_digon_delay = (lvds_ss_gen_cntl >> RADEON_LVDS_PWRSEQ_DELAY1_SHIFT) & 0xf; | ||
| 818 | lvds->panel_blon_delay = (lvds_ss_gen_cntl >> RADEON_LVDS_PWRSEQ_DELAY2_SHIFT) & 0xf; | ||
| 819 | |||
| 811 | if (fp_vert_stretch & RADEON_VERT_STRETCH_ENABLE) | 820 | if (fp_vert_stretch & RADEON_VERT_STRETCH_ENABLE) |
| 812 | lvds->native_mode.panel_yres = | 821 | lvds->native_mode.panel_yres = |
| 813 | ((fp_vert_stretch & RADEON_VERT_PANEL_SIZE) >> | 822 | ((fp_vert_stretch & RADEON_VERT_PANEL_SIZE) >> |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index 89c4c44169f7..d8356827ef17 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -2045,11 +2045,10 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 2045 | drm_radeon_private_t *dev_priv; | 2045 | drm_radeon_private_t *dev_priv; |
| 2046 | int ret = 0; | 2046 | int ret = 0; |
| 2047 | 2047 | ||
| 2048 | dev_priv = drm_alloc(sizeof(drm_radeon_private_t), DRM_MEM_DRIVER); | 2048 | dev_priv = kzalloc(sizeof(drm_radeon_private_t), GFP_KERNEL); |
| 2049 | if (dev_priv == NULL) | 2049 | if (dev_priv == NULL) |
| 2050 | return -ENOMEM; | 2050 | return -ENOMEM; |
| 2051 | 2051 | ||
| 2052 | memset(dev_priv, 0, sizeof(drm_radeon_private_t)); | ||
| 2053 | dev->dev_private = (void *)dev_priv; | 2052 | dev->dev_private = (void *)dev_priv; |
| 2054 | dev_priv->flags = flags; | 2053 | dev_priv->flags = flags; |
| 2055 | 2054 | ||
| @@ -2103,7 +2102,7 @@ int radeon_master_create(struct drm_device *dev, struct drm_master *master) | |||
| 2103 | unsigned long sareapage; | 2102 | unsigned long sareapage; |
| 2104 | int ret; | 2103 | int ret; |
| 2105 | 2104 | ||
| 2106 | master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER); | 2105 | master_priv = kzalloc(sizeof(*master_priv), GFP_KERNEL); |
| 2107 | if (!master_priv) | 2106 | if (!master_priv) |
| 2108 | return -ENOMEM; | 2107 | return -ENOMEM; |
| 2109 | 2108 | ||
| @@ -2137,7 +2136,7 @@ void radeon_master_destroy(struct drm_device *dev, struct drm_master *master) | |||
| 2137 | if (master_priv->sarea) | 2136 | if (master_priv->sarea) |
| 2138 | drm_rmmap_locked(dev, master_priv->sarea); | 2137 | drm_rmmap_locked(dev, master_priv->sarea); |
| 2139 | 2138 | ||
| 2140 | drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER); | 2139 | kfree(master_priv); |
| 2141 | 2140 | ||
| 2142 | master->driver_priv = NULL; | 2141 | master->driver_priv = NULL; |
| 2143 | } | 2142 | } |
| @@ -2171,7 +2170,7 @@ int radeon_driver_unload(struct drm_device *dev) | |||
| 2171 | 2170 | ||
| 2172 | drm_rmmap(dev, dev_priv->mmio); | 2171 | drm_rmmap(dev, dev_priv->mmio); |
| 2173 | 2172 | ||
| 2174 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); | 2173 | kfree(dev_priv); |
| 2175 | 2174 | ||
| 2176 | dev->dev_private = NULL; | 2175 | dev->dev_private = NULL; |
| 2177 | return 0; | 2176 | return 0; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 5fd2b639bf66..f30aa7274a54 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -470,6 +470,10 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 470 | if (r) { | 470 | if (r) { |
| 471 | return r; | 471 | return r; |
| 472 | } | 472 | } |
| 473 | r = radeon_init(rdev); | ||
| 474 | if (r) { | ||
| 475 | return r; | ||
| 476 | } | ||
| 473 | 477 | ||
| 474 | /* Report DMA addressing limitation */ | 478 | /* Report DMA addressing limitation */ |
| 475 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(32)); | 479 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(32)); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 5452bb9d925e..3efcf1a526be 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -351,7 +351,7 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | |||
| 351 | radeon_i2c_do_lock(radeon_connector, 0); | 351 | radeon_i2c_do_lock(radeon_connector, 0); |
| 352 | if (edid) { | 352 | if (edid) { |
| 353 | /* update digital bits here */ | 353 | /* update digital bits here */ |
| 354 | if (edid->digital) | 354 | if (edid->input & DRM_EDID_INPUT_DIGITAL) |
| 355 | radeon_connector->use_digital = 1; | 355 | radeon_connector->use_digital = 1; |
| 356 | else | 356 | else |
| 357 | radeon_connector->use_digital = 0; | 357 | radeon_connector->use_digital = 0; |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index c815a2cbf7b3..09c9fb9f6210 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -313,7 +313,7 @@ static int __init radeon_init(void) | |||
| 313 | { | 313 | { |
| 314 | driver = &driver_old; | 314 | driver = &driver_old; |
| 315 | driver->num_ioctls = radeon_max_ioctl; | 315 | driver->num_ioctls = radeon_max_ioctl; |
| 316 | #if defined(CONFIG_DRM_RADEON_KMS) && defined(CONFIG_X86) | 316 | #if defined(CONFIG_DRM_RADEON_KMS) |
| 317 | /* if enabled by default */ | 317 | /* if enabled by default */ |
| 318 | if (radeon_modeset == -1) { | 318 | if (radeon_modeset == -1) { |
| 319 | DRM_INFO("radeon default to kernel modesetting.\n"); | 319 | DRM_INFO("radeon default to kernel modesetting.\n"); |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index 71465ed2688a..dd438d32e5c0 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
| @@ -162,7 +162,7 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, | |||
| 162 | struct radeon_i2c_chan *i2c; | 162 | struct radeon_i2c_chan *i2c; |
| 163 | int ret; | 163 | int ret; |
| 164 | 164 | ||
| 165 | i2c = drm_calloc(1, sizeof(struct radeon_i2c_chan), DRM_MEM_DRIVER); | 165 | i2c = kzalloc(sizeof(struct radeon_i2c_chan), GFP_KERNEL); |
| 166 | if (i2c == NULL) | 166 | if (i2c == NULL) |
| 167 | return NULL; | 167 | return NULL; |
| 168 | 168 | ||
| @@ -189,7 +189,7 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, | |||
| 189 | 189 | ||
| 190 | return i2c; | 190 | return i2c; |
| 191 | out_free: | 191 | out_free: |
| 192 | drm_free(i2c, sizeof(struct radeon_i2c_chan), DRM_MEM_DRIVER); | 192 | kfree(i2c); |
| 193 | return NULL; | 193 | return NULL; |
| 194 | 194 | ||
| 195 | } | 195 | } |
| @@ -200,7 +200,7 @@ void radeon_i2c_destroy(struct radeon_i2c_chan *i2c) | |||
| 200 | return; | 200 | return; |
| 201 | 201 | ||
| 202 | i2c_del_adapter(&i2c->adapter); | 202 | i2c_del_adapter(&i2c->adapter); |
| 203 | drm_free(i2c, sizeof(struct radeon_i2c_chan), DRM_MEM_DRIVER); | 203 | kfree(i2c); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | struct drm_encoder *radeon_best_encoder(struct drm_connector *connector) | 206 | struct drm_encoder *radeon_best_encoder(struct drm_connector *connector) |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 64f42b19cbfa..4612a7c146d1 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -169,7 +169,7 @@ int radeon_master_create_kms(struct drm_device *dev, struct drm_master *master) | |||
| 169 | unsigned long sareapage; | 169 | unsigned long sareapage; |
| 170 | int ret; | 170 | int ret; |
| 171 | 171 | ||
| 172 | master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER); | 172 | master_priv = kzalloc(sizeof(*master_priv), GFP_KERNEL); |
| 173 | if (master_priv == NULL) { | 173 | if (master_priv == NULL) { |
| 174 | return -ENOMEM; | 174 | return -ENOMEM; |
| 175 | } | 175 | } |
| @@ -199,7 +199,7 @@ void radeon_master_destroy_kms(struct drm_device *dev, | |||
| 199 | if (master_priv->sarea) { | 199 | if (master_priv->sarea) { |
| 200 | drm_rmmap_locked(dev, master_priv->sarea); | 200 | drm_rmmap_locked(dev, master_priv->sarea); |
| 201 | } | 201 | } |
| 202 | drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER); | 202 | kfree(master_priv); |
| 203 | master->driver_priv = NULL; | 203 | master->driver_priv = NULL; |
| 204 | } | 204 | } |
| 205 | 205 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_mem.c b/drivers/gpu/drm/radeon/radeon_mem.c index 4af5286a36fb..ed95155c4b1d 100644 --- a/drivers/gpu/drm/radeon/radeon_mem.c +++ b/drivers/gpu/drm/radeon/radeon_mem.c | |||
| @@ -43,8 +43,8 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size, | |||
| 43 | { | 43 | { |
| 44 | /* Maybe cut off the start of an existing block */ | 44 | /* Maybe cut off the start of an existing block */ |
| 45 | if (start > p->start) { | 45 | if (start > p->start) { |
| 46 | struct mem_block *newblock = | 46 | struct mem_block *newblock = kmalloc(sizeof(*newblock), |
| 47 | drm_alloc(sizeof(*newblock), DRM_MEM_BUFS); | 47 | GFP_KERNEL); |
| 48 | if (!newblock) | 48 | if (!newblock) |
| 49 | goto out; | 49 | goto out; |
| 50 | newblock->start = start; | 50 | newblock->start = start; |
| @@ -60,8 +60,8 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size, | |||
| 60 | 60 | ||
| 61 | /* Maybe cut off the end of an existing block */ | 61 | /* Maybe cut off the end of an existing block */ |
| 62 | if (size < p->size) { | 62 | if (size < p->size) { |
| 63 | struct mem_block *newblock = | 63 | struct mem_block *newblock = kmalloc(sizeof(*newblock), |
| 64 | drm_alloc(sizeof(*newblock), DRM_MEM_BUFS); | 64 | GFP_KERNEL); |
| 65 | if (!newblock) | 65 | if (!newblock) |
| 66 | goto out; | 66 | goto out; |
| 67 | newblock->start = start + size; | 67 | newblock->start = start + size; |
| @@ -118,7 +118,7 @@ static void free_block(struct mem_block *p) | |||
| 118 | p->size += q->size; | 118 | p->size += q->size; |
| 119 | p->next = q->next; | 119 | p->next = q->next; |
| 120 | p->next->prev = p; | 120 | p->next->prev = p; |
| 121 | drm_free(q, sizeof(*q), DRM_MEM_BUFS); | 121 | kfree(q); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | if (p->prev->file_priv == NULL) { | 124 | if (p->prev->file_priv == NULL) { |
| @@ -126,7 +126,7 @@ static void free_block(struct mem_block *p) | |||
| 126 | q->size += p->size; | 126 | q->size += p->size; |
| 127 | q->next = p->next; | 127 | q->next = p->next; |
| 128 | q->next->prev = q; | 128 | q->next->prev = q; |
| 129 | drm_free(p, sizeof(*q), DRM_MEM_BUFS); | 129 | kfree(p); |
| 130 | } | 130 | } |
| 131 | } | 131 | } |
| 132 | 132 | ||
| @@ -134,14 +134,14 @@ static void free_block(struct mem_block *p) | |||
| 134 | */ | 134 | */ |
| 135 | static int init_heap(struct mem_block **heap, int start, int size) | 135 | static int init_heap(struct mem_block **heap, int start, int size) |
| 136 | { | 136 | { |
| 137 | struct mem_block *blocks = drm_alloc(sizeof(*blocks), DRM_MEM_BUFS); | 137 | struct mem_block *blocks = kmalloc(sizeof(*blocks), GFP_KERNEL); |
| 138 | 138 | ||
| 139 | if (!blocks) | 139 | if (!blocks) |
| 140 | return -ENOMEM; | 140 | return -ENOMEM; |
| 141 | 141 | ||
| 142 | *heap = drm_alloc(sizeof(**heap), DRM_MEM_BUFS); | 142 | *heap = kmalloc(sizeof(**heap), GFP_KERNEL); |
| 143 | if (!*heap) { | 143 | if (!*heap) { |
| 144 | drm_free(blocks, sizeof(*blocks), DRM_MEM_BUFS); | 144 | kfree(blocks); |
| 145 | return -ENOMEM; | 145 | return -ENOMEM; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| @@ -179,7 +179,7 @@ void radeon_mem_release(struct drm_file *file_priv, struct mem_block *heap) | |||
| 179 | p->size += q->size; | 179 | p->size += q->size; |
| 180 | p->next = q->next; | 180 | p->next = q->next; |
| 181 | p->next->prev = p; | 181 | p->next->prev = p; |
| 182 | drm_free(q, sizeof(*q), DRM_MEM_DRIVER); | 182 | kfree(q); |
| 183 | } | 183 | } |
| 184 | } | 184 | } |
| 185 | } | 185 | } |
| @@ -196,10 +196,10 @@ void radeon_mem_takedown(struct mem_block **heap) | |||
| 196 | for (p = (*heap)->next; p != *heap;) { | 196 | for (p = (*heap)->next; p != *heap;) { |
| 197 | struct mem_block *q = p; | 197 | struct mem_block *q = p; |
| 198 | p = p->next; | 198 | p = p->next; |
| 199 | drm_free(q, sizeof(*q), DRM_MEM_DRIVER); | 199 | kfree(q); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | drm_free(*heap, sizeof(**heap), DRM_MEM_DRIVER); | 202 | kfree(*heap); |
| 203 | *heap = NULL; | 203 | *heap = NULL; |
| 204 | } | 204 | } |
| 205 | 205 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index 6d3d90406a24..e1b618574461 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
| @@ -3184,6 +3184,7 @@ | |||
| 3184 | # define RADEON_RB_BUFSZ_MASK (0x3f << 0) | 3184 | # define RADEON_RB_BUFSZ_MASK (0x3f << 0) |
| 3185 | # define RADEON_RB_BLKSZ_SHIFT 8 | 3185 | # define RADEON_RB_BLKSZ_SHIFT 8 |
| 3186 | # define RADEON_RB_BLKSZ_MASK (0x3f << 8) | 3186 | # define RADEON_RB_BLKSZ_MASK (0x3f << 8) |
| 3187 | # define RADEON_BUF_SWAP_32BIT (1 << 17) | ||
| 3187 | # define RADEON_MAX_FETCH_SHIFT 18 | 3188 | # define RADEON_MAX_FETCH_SHIFT 18 |
| 3188 | # define RADEON_MAX_FETCH_MASK (0x3 << 18) | 3189 | # define RADEON_MAX_FETCH_MASK (0x3 << 18) |
| 3189 | # define RADEON_RB_NO_UPDATE (1 << 27) | 3190 | # define RADEON_RB_NO_UPDATE (1 << 27) |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index fa728ec6ed34..46645f3e0328 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
| @@ -2866,12 +2866,12 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file | |||
| 2866 | */ | 2866 | */ |
| 2867 | orig_bufsz = cmdbuf->bufsz; | 2867 | orig_bufsz = cmdbuf->bufsz; |
| 2868 | if (orig_bufsz != 0) { | 2868 | if (orig_bufsz != 0) { |
| 2869 | kbuf = drm_alloc(cmdbuf->bufsz, DRM_MEM_DRIVER); | 2869 | kbuf = kmalloc(cmdbuf->bufsz, GFP_KERNEL); |
| 2870 | if (kbuf == NULL) | 2870 | if (kbuf == NULL) |
| 2871 | return -ENOMEM; | 2871 | return -ENOMEM; |
| 2872 | if (DRM_COPY_FROM_USER(kbuf, (void __user *)cmdbuf->buf, | 2872 | if (DRM_COPY_FROM_USER(kbuf, (void __user *)cmdbuf->buf, |
| 2873 | cmdbuf->bufsz)) { | 2873 | cmdbuf->bufsz)) { |
| 2874 | drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER); | 2874 | kfree(kbuf); |
| 2875 | return -EFAULT; | 2875 | return -EFAULT; |
| 2876 | } | 2876 | } |
| 2877 | cmdbuf->buf = kbuf; | 2877 | cmdbuf->buf = kbuf; |
| @@ -2884,7 +2884,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file | |||
| 2884 | temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf); | 2884 | temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf); |
| 2885 | 2885 | ||
| 2886 | if (orig_bufsz != 0) | 2886 | if (orig_bufsz != 0) |
| 2887 | drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER); | 2887 | kfree(kbuf); |
| 2888 | 2888 | ||
| 2889 | return temp; | 2889 | return temp; |
| 2890 | } | 2890 | } |
| @@ -2991,7 +2991,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file | |||
| 2991 | } | 2991 | } |
| 2992 | 2992 | ||
| 2993 | if (orig_bufsz != 0) | 2993 | if (orig_bufsz != 0) |
| 2994 | drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER); | 2994 | kfree(kbuf); |
| 2995 | 2995 | ||
| 2996 | DRM_DEBUG("DONE\n"); | 2996 | DRM_DEBUG("DONE\n"); |
| 2997 | COMMIT_RING(); | 2997 | COMMIT_RING(); |
| @@ -2999,7 +2999,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file | |||
| 2999 | 2999 | ||
| 3000 | err: | 3000 | err: |
| 3001 | if (orig_bufsz != 0) | 3001 | if (orig_bufsz != 0) |
| 3002 | drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER); | 3002 | kfree(kbuf); |
| 3003 | return -EINVAL; | 3003 | return -EINVAL; |
| 3004 | } | 3004 | } |
| 3005 | 3005 | ||
| @@ -3175,9 +3175,7 @@ int radeon_driver_open(struct drm_device *dev, struct drm_file *file_priv) | |||
| 3175 | struct drm_radeon_driver_file_fields *radeon_priv; | 3175 | struct drm_radeon_driver_file_fields *radeon_priv; |
| 3176 | 3176 | ||
| 3177 | DRM_DEBUG("\n"); | 3177 | DRM_DEBUG("\n"); |
| 3178 | radeon_priv = | 3178 | radeon_priv = kmalloc(sizeof(*radeon_priv), GFP_KERNEL); |
| 3179 | (struct drm_radeon_driver_file_fields *) | ||
| 3180 | drm_alloc(sizeof(*radeon_priv), DRM_MEM_FILES); | ||
| 3181 | 3179 | ||
| 3182 | if (!radeon_priv) | 3180 | if (!radeon_priv) |
| 3183 | return -ENOMEM; | 3181 | return -ENOMEM; |
| @@ -3196,7 +3194,7 @@ void radeon_driver_postclose(struct drm_device *dev, struct drm_file *file_priv) | |||
| 3196 | struct drm_radeon_driver_file_fields *radeon_priv = | 3194 | struct drm_radeon_driver_file_fields *radeon_priv = |
| 3197 | file_priv->driver_priv; | 3195 | file_priv->driver_priv; |
| 3198 | 3196 | ||
| 3199 | drm_free(radeon_priv, sizeof(*radeon_priv), DRM_MEM_FILES); | 3197 | kfree(radeon_priv); |
| 3200 | } | 3198 | } |
| 3201 | 3199 | ||
| 3202 | struct drm_ioctl_desc radeon_ioctls[] = { | 3200 | struct drm_ioctl_desc radeon_ioctls[] = { |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 4c087c1510d7..1227a97f5169 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
| @@ -133,6 +133,7 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
| 133 | man->gpu_offset = 0; | 133 | man->gpu_offset = 0; |
| 134 | man->available_caching = TTM_PL_MASK_CACHING; | 134 | man->available_caching = TTM_PL_MASK_CACHING; |
| 135 | man->default_caching = TTM_PL_FLAG_CACHED; | 135 | man->default_caching = TTM_PL_FLAG_CACHED; |
| 136 | man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA; | ||
| 136 | #if __OS_HAS_AGP | 137 | #if __OS_HAS_AGP |
| 137 | if (rdev->flags & RADEON_IS_AGP) { | 138 | if (rdev->flags & RADEON_IS_AGP) { |
| 138 | if (!(drm_core_has_AGP(rdev->ddev) && rdev->ddev->agp)) { | 139 | if (!(drm_core_has_AGP(rdev->ddev) && rdev->ddev->agp)) { |
| @@ -143,8 +144,9 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
| 143 | man->io_offset = rdev->mc.agp_base; | 144 | man->io_offset = rdev->mc.agp_base; |
| 144 | man->io_size = rdev->mc.gtt_size; | 145 | man->io_size = rdev->mc.gtt_size; |
| 145 | man->io_addr = NULL; | 146 | man->io_addr = NULL; |
| 146 | man->flags = TTM_MEMTYPE_FLAG_NEEDS_IOREMAP | | 147 | if (!rdev->ddev->agp->cant_use_aperture) |
| 147 | TTM_MEMTYPE_FLAG_MAPPABLE; | 148 | man->flags = TTM_MEMTYPE_FLAG_NEEDS_IOREMAP | |
| 149 | TTM_MEMTYPE_FLAG_MAPPABLE; | ||
| 148 | man->available_caching = TTM_PL_FLAG_UNCACHED | | 150 | man->available_caching = TTM_PL_FLAG_UNCACHED | |
| 149 | TTM_PL_FLAG_WC; | 151 | TTM_PL_FLAG_WC; |
| 150 | man->default_caching = TTM_PL_FLAG_WC; | 152 | man->default_caching = TTM_PL_FLAG_WC; |
| @@ -154,8 +156,6 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
| 154 | man->io_offset = 0; | 156 | man->io_offset = 0; |
| 155 | man->io_size = 0; | 157 | man->io_size = 0; |
| 156 | man->io_addr = NULL; | 158 | man->io_addr = NULL; |
| 157 | man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | | ||
| 158 | TTM_MEMTYPE_FLAG_CMA; | ||
| 159 | } | 159 | } |
| 160 | break; | 160 | break; |
| 161 | case TTM_PL_VRAM: | 161 | case TTM_PL_VRAM: |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 7eab95db58ac..ffea37b1b3e2 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -225,6 +225,8 @@ void rv515_ring_start(struct radeon_device *rdev) | |||
| 225 | radeon_ring_write(rdev, | 225 | radeon_ring_write(rdev, |
| 226 | R300_GEOMETRY_ROUND_NEAREST | | 226 | R300_GEOMETRY_ROUND_NEAREST | |
| 227 | R300_COLOR_ROUND_NEAREST); | 227 | R300_COLOR_ROUND_NEAREST); |
| 228 | radeon_ring_write(rdev, PACKET0(0x20C8, 0)); | ||
| 229 | radeon_ring_write(rdev, 0); | ||
| 228 | radeon_ring_unlock_commit(rdev); | 230 | radeon_ring_unlock_commit(rdev); |
| 229 | } | 231 | } |
| 230 | 232 | ||
| @@ -502,3 +504,59 @@ int rv515_debugfs_ga_info_init(struct radeon_device *rdev) | |||
| 502 | return 0; | 504 | return 0; |
| 503 | #endif | 505 | #endif |
| 504 | } | 506 | } |
| 507 | |||
| 508 | |||
| 509 | /* | ||
| 510 | * Asic initialization | ||
| 511 | */ | ||
| 512 | static const unsigned r500_reg_safe_bm[159] = { | ||
| 513 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 514 | 0xFFFFFFBF, 0xFFFFFFFF, 0xFFFFFFBF, 0xFFFFFFFF, | ||
| 515 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 516 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 517 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 518 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 519 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 520 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 521 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 522 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 523 | 0x17FF1FFF, 0xFFFFFFFC, 0xFFFFFFFF, 0xFF30FFBF, | ||
| 524 | 0xFFFFFFF8, 0xC3E6FFFF, 0xFFFFF6DF, 0xFFFFFFFF, | ||
| 525 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 526 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 527 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF03F, | ||
| 528 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 529 | 0xFFFFFFFF, 0xFFFFEFCE, 0xF00EBFFF, 0x007C0000, | ||
| 530 | 0xF0000038, 0xFF000009, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 531 | 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, | ||
| 532 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 533 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 534 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 535 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 536 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 537 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 538 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 539 | 0xFFFFF7FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 540 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 541 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 542 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 543 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 544 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 545 | 0x1FFFFC78, 0xFFFFE000, 0xFFFFFFFE, 0xFFFFFFFF, | ||
| 546 | 0x38CF8F50, 0xFFF88082, 0xFF0000FC, 0xFAE009FF, | ||
| 547 | 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, | ||
| 548 | 0xFFFF8CFC, 0xFFFFC1FF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 549 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 550 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF80FFFF, | ||
| 551 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||
| 552 | 0x0003FC01, 0x3FFFFCF8, 0xFE800B19, | ||
| 553 | }; | ||
| 554 | |||
| 555 | |||
| 556 | |||
| 557 | int rv515_init(struct radeon_device *rdev) | ||
| 558 | { | ||
| 559 | rdev->config.r300.reg_safe_bm = r500_reg_safe_bm; | ||
| 560 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r500_reg_safe_bm); | ||
| 561 | return 0; | ||
| 562 | } | ||
diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c index 456cd040f31a..bff6fc2524c8 100644 --- a/drivers/gpu/drm/savage/savage_bci.c +++ b/drivers/gpu/drm/savage/savage_bci.c | |||
| @@ -298,8 +298,8 @@ static int savage_dma_init(drm_savage_private_t * dev_priv) | |||
| 298 | 298 | ||
| 299 | dev_priv->nr_dma_pages = dev_priv->cmd_dma->size / | 299 | dev_priv->nr_dma_pages = dev_priv->cmd_dma->size / |
| 300 | (SAVAGE_DMA_PAGE_SIZE * 4); | 300 | (SAVAGE_DMA_PAGE_SIZE * 4); |
| 301 | dev_priv->dma_pages = drm_alloc(sizeof(drm_savage_dma_page_t) * | 301 | dev_priv->dma_pages = kmalloc(sizeof(drm_savage_dma_page_t) * |
| 302 | dev_priv->nr_dma_pages, DRM_MEM_DRIVER); | 302 | dev_priv->nr_dma_pages, GFP_KERNEL); |
| 303 | if (dev_priv->dma_pages == NULL) | 303 | if (dev_priv->dma_pages == NULL) |
| 304 | return -ENOMEM; | 304 | return -ENOMEM; |
| 305 | 305 | ||
| @@ -539,7 +539,7 @@ int savage_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 539 | { | 539 | { |
| 540 | drm_savage_private_t *dev_priv; | 540 | drm_savage_private_t *dev_priv; |
| 541 | 541 | ||
| 542 | dev_priv = drm_alloc(sizeof(drm_savage_private_t), DRM_MEM_DRIVER); | 542 | dev_priv = kmalloc(sizeof(drm_savage_private_t), GFP_KERNEL); |
| 543 | if (dev_priv == NULL) | 543 | if (dev_priv == NULL) |
| 544 | return -ENOMEM; | 544 | return -ENOMEM; |
| 545 | 545 | ||
| @@ -671,7 +671,7 @@ int savage_driver_unload(struct drm_device *dev) | |||
| 671 | { | 671 | { |
| 672 | drm_savage_private_t *dev_priv = dev->dev_private; | 672 | drm_savage_private_t *dev_priv = dev->dev_private; |
| 673 | 673 | ||
| 674 | drm_free(dev_priv, sizeof(drm_savage_private_t), DRM_MEM_DRIVER); | 674 | kfree(dev_priv); |
| 675 | 675 | ||
| 676 | return 0; | 676 | return 0; |
| 677 | } | 677 | } |
| @@ -804,8 +804,8 @@ static int savage_do_init_bci(struct drm_device * dev, drm_savage_init_t * init) | |||
| 804 | dev_priv->fake_dma.offset = 0; | 804 | dev_priv->fake_dma.offset = 0; |
| 805 | dev_priv->fake_dma.size = SAVAGE_FAKE_DMA_SIZE; | 805 | dev_priv->fake_dma.size = SAVAGE_FAKE_DMA_SIZE; |
| 806 | dev_priv->fake_dma.type = _DRM_SHM; | 806 | dev_priv->fake_dma.type = _DRM_SHM; |
| 807 | dev_priv->fake_dma.handle = drm_alloc(SAVAGE_FAKE_DMA_SIZE, | 807 | dev_priv->fake_dma.handle = kmalloc(SAVAGE_FAKE_DMA_SIZE, |
| 808 | DRM_MEM_DRIVER); | 808 | GFP_KERNEL); |
| 809 | if (!dev_priv->fake_dma.handle) { | 809 | if (!dev_priv->fake_dma.handle) { |
| 810 | DRM_ERROR("could not allocate faked DMA buffer!\n"); | 810 | DRM_ERROR("could not allocate faked DMA buffer!\n"); |
| 811 | savage_do_cleanup_bci(dev); | 811 | savage_do_cleanup_bci(dev); |
| @@ -903,9 +903,7 @@ static int savage_do_cleanup_bci(struct drm_device * dev) | |||
| 903 | drm_savage_private_t *dev_priv = dev->dev_private; | 903 | drm_savage_private_t *dev_priv = dev->dev_private; |
| 904 | 904 | ||
| 905 | if (dev_priv->cmd_dma == &dev_priv->fake_dma) { | 905 | if (dev_priv->cmd_dma == &dev_priv->fake_dma) { |
| 906 | if (dev_priv->fake_dma.handle) | 906 | kfree(dev_priv->fake_dma.handle); |
| 907 | drm_free(dev_priv->fake_dma.handle, | ||
| 908 | SAVAGE_FAKE_DMA_SIZE, DRM_MEM_DRIVER); | ||
| 909 | } else if (dev_priv->cmd_dma && dev_priv->cmd_dma->handle && | 907 | } else if (dev_priv->cmd_dma && dev_priv->cmd_dma->handle && |
| 910 | dev_priv->cmd_dma->type == _DRM_AGP && | 908 | dev_priv->cmd_dma->type == _DRM_AGP && |
| 911 | dev_priv->dma_type == SAVAGE_DMA_AGP) | 909 | dev_priv->dma_type == SAVAGE_DMA_AGP) |
| @@ -920,10 +918,7 @@ static int savage_do_cleanup_bci(struct drm_device * dev) | |||
| 920 | dev->agp_buffer_map = NULL; | 918 | dev->agp_buffer_map = NULL; |
| 921 | } | 919 | } |
| 922 | 920 | ||
| 923 | if (dev_priv->dma_pages) | 921 | kfree(dev_priv->dma_pages); |
| 924 | drm_free(dev_priv->dma_pages, | ||
| 925 | sizeof(drm_savage_dma_page_t) * dev_priv->nr_dma_pages, | ||
| 926 | DRM_MEM_DRIVER); | ||
| 927 | 922 | ||
| 928 | return 0; | 923 | return 0; |
| 929 | } | 924 | } |
diff --git a/drivers/gpu/drm/savage/savage_state.c b/drivers/gpu/drm/savage/savage_state.c index 5f6238fdf1fa..8a3e31599c94 100644 --- a/drivers/gpu/drm/savage/savage_state.c +++ b/drivers/gpu/drm/savage/savage_state.c | |||
| @@ -988,20 +988,20 @@ int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_ | |||
| 988 | * for locking on FreeBSD. | 988 | * for locking on FreeBSD. |
| 989 | */ | 989 | */ |
| 990 | if (cmdbuf->size) { | 990 | if (cmdbuf->size) { |
| 991 | kcmd_addr = drm_alloc(cmdbuf->size * 8, DRM_MEM_DRIVER); | 991 | kcmd_addr = kmalloc(cmdbuf->size * 8, GFP_KERNEL); |
| 992 | if (kcmd_addr == NULL) | 992 | if (kcmd_addr == NULL) |
| 993 | return -ENOMEM; | 993 | return -ENOMEM; |
| 994 | 994 | ||
| 995 | if (DRM_COPY_FROM_USER(kcmd_addr, cmdbuf->cmd_addr, | 995 | if (DRM_COPY_FROM_USER(kcmd_addr, cmdbuf->cmd_addr, |
| 996 | cmdbuf->size * 8)) | 996 | cmdbuf->size * 8)) |
| 997 | { | 997 | { |
| 998 | drm_free(kcmd_addr, cmdbuf->size * 8, DRM_MEM_DRIVER); | 998 | kfree(kcmd_addr); |
| 999 | return -EFAULT; | 999 | return -EFAULT; |
| 1000 | } | 1000 | } |
| 1001 | cmdbuf->cmd_addr = kcmd_addr; | 1001 | cmdbuf->cmd_addr = kcmd_addr; |
| 1002 | } | 1002 | } |
| 1003 | if (cmdbuf->vb_size) { | 1003 | if (cmdbuf->vb_size) { |
| 1004 | kvb_addr = drm_alloc(cmdbuf->vb_size, DRM_MEM_DRIVER); | 1004 | kvb_addr = kmalloc(cmdbuf->vb_size, GFP_KERNEL); |
| 1005 | if (kvb_addr == NULL) { | 1005 | if (kvb_addr == NULL) { |
| 1006 | ret = -ENOMEM; | 1006 | ret = -ENOMEM; |
| 1007 | goto done; | 1007 | goto done; |
| @@ -1015,8 +1015,8 @@ int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_ | |||
| 1015 | cmdbuf->vb_addr = kvb_addr; | 1015 | cmdbuf->vb_addr = kvb_addr; |
| 1016 | } | 1016 | } |
| 1017 | if (cmdbuf->nbox) { | 1017 | if (cmdbuf->nbox) { |
| 1018 | kbox_addr = drm_alloc(cmdbuf->nbox * sizeof(struct drm_clip_rect), | 1018 | kbox_addr = kmalloc(cmdbuf->nbox * sizeof(struct drm_clip_rect), |
| 1019 | DRM_MEM_DRIVER); | 1019 | GFP_KERNEL); |
| 1020 | if (kbox_addr == NULL) { | 1020 | if (kbox_addr == NULL) { |
| 1021 | ret = -ENOMEM; | 1021 | ret = -ENOMEM; |
| 1022 | goto done; | 1022 | goto done; |
| @@ -1154,10 +1154,9 @@ int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_ | |||
| 1154 | 1154 | ||
| 1155 | done: | 1155 | done: |
| 1156 | /* If we didn't need to allocate them, these'll be NULL */ | 1156 | /* If we didn't need to allocate them, these'll be NULL */ |
| 1157 | drm_free(kcmd_addr, cmdbuf->size * 8, DRM_MEM_DRIVER); | 1157 | kfree(kcmd_addr); |
| 1158 | drm_free(kvb_addr, cmdbuf->vb_size, DRM_MEM_DRIVER); | 1158 | kfree(kvb_addr); |
| 1159 | drm_free(kbox_addr, cmdbuf->nbox * sizeof(struct drm_clip_rect), | 1159 | kfree(kbox_addr); |
| 1160 | DRM_MEM_DRIVER); | ||
| 1161 | 1160 | ||
| 1162 | return ret; | 1161 | return ret; |
| 1163 | } | 1162 | } |
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c index 7dacc64e9b56..e725cc0b1155 100644 --- a/drivers/gpu/drm/sis/sis_drv.c +++ b/drivers/gpu/drm/sis/sis_drv.c | |||
| @@ -40,7 +40,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 40 | drm_sis_private_t *dev_priv; | 40 | drm_sis_private_t *dev_priv; |
| 41 | int ret; | 41 | int ret; |
| 42 | 42 | ||
| 43 | dev_priv = drm_calloc(1, sizeof(drm_sis_private_t), DRM_MEM_DRIVER); | 43 | dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL); |
| 44 | if (dev_priv == NULL) | 44 | if (dev_priv == NULL) |
| 45 | return -ENOMEM; | 45 | return -ENOMEM; |
| 46 | 46 | ||
| @@ -48,7 +48,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 48 | dev_priv->chipset = chipset; | 48 | dev_priv->chipset = chipset; |
| 49 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); | 49 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); |
| 50 | if (ret) { | 50 | if (ret) { |
| 51 | drm_free(dev_priv, sizeof(dev_priv), DRM_MEM_DRIVER); | 51 | kfree(dev_priv); |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | return ret; | 54 | return ret; |
| @@ -59,7 +59,7 @@ static int sis_driver_unload(struct drm_device *dev) | |||
| 59 | drm_sis_private_t *dev_priv = dev->dev_private; | 59 | drm_sis_private_t *dev_priv = dev->dev_private; |
| 60 | 60 | ||
| 61 | drm_sman_takedown(&dev_priv->sman); | 61 | drm_sman_takedown(&dev_priv->sman); |
| 62 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); | 62 | kfree(dev_priv); |
| 63 | 63 | ||
| 64 | return 0; | 64 | return 0; |
| 65 | } | 65 | } |
diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c index e8f6d2229d8c..4648ed2f0143 100644 --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c | |||
| @@ -63,8 +63,7 @@ static int ttm_agp_populate(struct ttm_backend *backend, | |||
| 63 | if (!page) | 63 | if (!page) |
| 64 | page = dummy_read_page; | 64 | page = dummy_read_page; |
| 65 | 65 | ||
| 66 | mem->memory[mem->page_count++] = | 66 | mem->pages[mem->page_count++] = page; |
| 67 | phys_to_gart(page_to_phys(page)); | ||
| 68 | } | 67 | } |
| 69 | agp_be->mem = mem; | 68 | agp_be->mem = mem; |
| 70 | return 0; | 69 | return 0; |
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 1587aeca7bea..c1c407f7cca3 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
| @@ -282,7 +282,7 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, | |||
| 282 | 282 | ||
| 283 | ret = ttm_tt_set_placement_caching(bo->ttm, mem->placement); | 283 | ret = ttm_tt_set_placement_caching(bo->ttm, mem->placement); |
| 284 | if (ret) | 284 | if (ret) |
| 285 | return ret; | 285 | goto out_err; |
| 286 | 286 | ||
| 287 | if (mem->mem_type != TTM_PL_SYSTEM) { | 287 | if (mem->mem_type != TTM_PL_SYSTEM) { |
| 288 | ret = ttm_tt_bind(bo->ttm, mem); | 288 | ret = ttm_tt_bind(bo->ttm, mem); |
| @@ -527,9 +527,12 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, unsigned mem_type, | |||
| 527 | ret = ttm_bo_wait(bo, false, interruptible, no_wait); | 527 | ret = ttm_bo_wait(bo, false, interruptible, no_wait); |
| 528 | spin_unlock(&bo->lock); | 528 | spin_unlock(&bo->lock); |
| 529 | 529 | ||
| 530 | if (ret && ret != -ERESTART) { | 530 | if (unlikely(ret != 0)) { |
| 531 | printk(KERN_ERR TTM_PFX "Failed to expire sync object before " | 531 | if (ret != -ERESTART) { |
| 532 | "buffer eviction.\n"); | 532 | printk(KERN_ERR TTM_PFX |
| 533 | "Failed to expire sync object before " | ||
| 534 | "buffer eviction.\n"); | ||
| 535 | } | ||
| 533 | goto out; | 536 | goto out; |
| 534 | } | 537 | } |
| 535 | 538 | ||
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index c27ab3a877ad..0331fa74cd3f 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c | |||
| @@ -68,7 +68,7 @@ static void ttm_tt_cache_flush_clflush(struct page *pages[], | |||
| 68 | ttm_tt_clflush_page(*pages++); | 68 | ttm_tt_clflush_page(*pages++); |
| 69 | mb(); | 69 | mb(); |
| 70 | } | 70 | } |
| 71 | #else | 71 | #elif !defined(__powerpc__) |
| 72 | static void ttm_tt_ipi_handler(void *null) | 72 | static void ttm_tt_ipi_handler(void *null) |
| 73 | { | 73 | { |
| 74 | ; | 74 | ; |
| @@ -83,6 +83,15 @@ void ttm_tt_cache_flush(struct page *pages[], unsigned long num_pages) | |||
| 83 | ttm_tt_cache_flush_clflush(pages, num_pages); | 83 | ttm_tt_cache_flush_clflush(pages, num_pages); |
| 84 | return; | 84 | return; |
| 85 | } | 85 | } |
| 86 | #elif defined(__powerpc__) | ||
| 87 | unsigned long i; | ||
| 88 | |||
| 89 | for (i = 0; i < num_pages; ++i) { | ||
| 90 | if (pages[i]) { | ||
| 91 | unsigned long start = (unsigned long)page_address(pages[i]); | ||
| 92 | flush_dcache_range(start, start + PAGE_SIZE); | ||
| 93 | } | ||
| 94 | } | ||
| 86 | #else | 95 | #else |
| 87 | if (on_each_cpu(ttm_tt_ipi_handler, NULL, 1) != 0) | 96 | if (on_each_cpu(ttm_tt_ipi_handler, NULL, 1) != 0) |
| 88 | printk(KERN_ERR TTM_PFX | 97 | printk(KERN_ERR TTM_PFX |
diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index 2c4f0b485792..6e6f91591639 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c | |||
| @@ -96,7 +96,7 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 96 | drm_via_private_t *dev_priv; | 96 | drm_via_private_t *dev_priv; |
| 97 | int ret = 0; | 97 | int ret = 0; |
| 98 | 98 | ||
| 99 | dev_priv = drm_calloc(1, sizeof(drm_via_private_t), DRM_MEM_DRIVER); | 99 | dev_priv = kzalloc(sizeof(drm_via_private_t), GFP_KERNEL); |
| 100 | if (dev_priv == NULL) | 100 | if (dev_priv == NULL) |
| 101 | return -ENOMEM; | 101 | return -ENOMEM; |
| 102 | 102 | ||
| @@ -106,14 +106,14 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 106 | 106 | ||
| 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); | 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); |
| 108 | if (ret) { | 108 | if (ret) { |
| 109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); | 109 | kfree(dev_priv); |
| 110 | return ret; | 110 | return ret; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | ret = drm_vblank_init(dev, 1); | 113 | ret = drm_vblank_init(dev, 1); |
| 114 | if (ret) { | 114 | if (ret) { |
| 115 | drm_sman_takedown(&dev_priv->sman); | 115 | drm_sman_takedown(&dev_priv->sman); |
| 116 | drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); | 116 | kfree(dev_priv); |
| 117 | return ret; | 117 | return ret; |
| 118 | } | 118 | } |
| 119 | 119 | ||
| @@ -126,7 +126,7 @@ int via_driver_unload(struct drm_device *dev) | |||
| 126 | 126 | ||
| 127 | drm_sman_takedown(&dev_priv->sman); | 127 | drm_sman_takedown(&dev_priv->sman); |
| 128 | 128 | ||
| 129 | drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); | 129 | kfree(dev_priv); |
| 130 | 130 | ||
| 131 | return 0; | 131 | return 0; |
| 132 | } | 132 | } |
