Deleted Added
full compact
26c26
< __FBSDID("$FreeBSD: head/sys/dev/drm2/drm_scatter.c 254025 2013-08-07 06:21:20Z jeff $");
---
> __FBSDID("$FreeBSD: head/sys/dev/drm2/drm_scatter.c 280183 2015-03-17 18:50:33Z dumbbell $");
36,37c36,38
< int
< drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request)
---
> #define DEBUG_SCATTER 0
>
> static inline vm_offset_t drm_vmalloc_dma(vm_size_t size)
38a40,57
> return kmem_alloc_attr(kernel_arena, size, M_NOWAIT | M_ZERO,
> 0, BUS_SPACE_MAXADDR_32BIT, VM_MEMATTR_WRITE_COMBINING);
> }
>
> void drm_sg_cleanup(struct drm_sg_mem * entry)
> {
> if (entry == NULL)
> return;
>
> if (entry->vaddr != 0)
> kmem_free(kernel_arena, entry->vaddr, IDX_TO_OFF(entry->pages));
>
> free(entry->busaddr, DRM_MEM_SGLISTS);
> free(entry, DRM_MEM_DRIVER);
> }
>
> int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
> {
42a62,66
> DRM_DEBUG("\n");
>
> if (!drm_core_check_feature(dev, DRIVER_SG))
> return -EINVAL;
>
44c68
< return EINVAL;
---
> return -EINVAL;
45a70,73
> entry = malloc(sizeof(*entry), DRM_MEM_DRIVER, M_NOWAIT | M_ZERO);
> if (!entry)
> return -ENOMEM;
>
48,49d75
< entry = malloc(sizeof(*entry), DRM_MEM_DRIVER, M_WAITOK | M_ZERO);
<
53c79,83
< DRM_MEM_SGLISTS, M_WAITOK | M_ZERO);
---
> DRM_MEM_SGLISTS, M_NOWAIT | M_ZERO);
> if (!entry->busaddr) {
> free(entry, DRM_MEM_DRIVER);
> return -ENOMEM;
> }
55,56c85
< entry->vaddr = kmem_alloc_attr(kernel_arena, size, M_WAITOK | M_ZERO,
< 0, BUS_SPACE_MAXADDR_32BIT, VM_MEMATTR_WRITE_COMBINING);
---
> entry->vaddr = drm_vmalloc_dma(size);
58,59c87,89
< drm_sg_cleanup(entry);
< return (ENOMEM);
---
> free(entry->busaddr, DRM_MEM_DRIVER);
> free(entry, DRM_MEM_DRIVER);
> return -ENOMEM;
62c92
< for(pindex = 0; pindex < entry->pages; pindex++) {
---
> for (pindex = 0; pindex < entry->pages; pindex++) {
67,75d96
< DRM_LOCK(dev);
< if (dev->sg) {
< DRM_UNLOCK(dev);
< drm_sg_cleanup(entry);
< return (EINVAL);
< }
< dev->sg = entry;
< DRM_UNLOCK(dev);
<
77a99,100
> dev->sg = entry;
>
81c104
< return (0);
---
> return 0;
84,86c107,108
< int
< drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
< struct drm_file *file_priv)
---
> int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file_priv)
90c112
< DRM_DEBUG("\n");
---
> return drm_sg_alloc(dev, request);
92d113
< return (drm_sg_alloc(dev, request));
95,96c116,117
< void
< drm_sg_cleanup(struct drm_sg_mem *entry)
---
> int drm_sg_free(struct drm_device *dev, void *data,
> struct drm_file *file_priv)
98,112d118
< if (entry == NULL)
< return;
<
< if (entry->vaddr != 0)
< kmem_free(kernel_arena, entry->vaddr, IDX_TO_OFF(entry->pages));
<
< free(entry->busaddr, DRM_MEM_SGLISTS);
< free(entry, DRM_MEM_DRIVER);
<
< return;
< }
<
< int
< drm_sg_free(struct drm_device *dev, void *data, struct drm_file *file_priv)
< {
116c122,124
< DRM_LOCK(dev);
---
> if (!drm_core_check_feature(dev, DRIVER_SG))
> return -EINVAL;
>
119d126
< DRM_UNLOCK(dev);
122c129
< return (EINVAL);
---
> return -EINVAL;
128c135
< return (0);
---
> return 0;