diff options
-rw-r--r-- | sys/dev/pci/drm/drmP.h | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_bufs.c | 40 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_dma.c | 58 |
3 files changed, 37 insertions, 62 deletions
diff --git a/sys/dev/pci/drm/drmP.h b/sys/dev/pci/drm/drmP.h index 26b52e2571e..d1d4e1c747b 100644 --- a/sys/dev/pci/drm/drmP.h +++ b/sys/dev/pci/drm/drmP.h @@ -704,6 +704,7 @@ int drm_addbufs_agp(struct drm_device *, struct drm_buf_desc *); /* DMA support (drm_dma.c) */ int drm_dma_setup(struct drm_device *); void drm_dma_takedown(struct drm_device *); +void drm_cleanup_buf(struct drm_device *, drm_buf_entry_t *); void drm_free_buffer(struct drm_device *, drm_buf_t *); void drm_reclaim_buffers(struct drm_device *, struct drm_file *); #define drm_core_reclaim_buffers drm_reclaim_buffers diff --git a/sys/dev/pci/drm/drm_bufs.c b/sys/dev/pci/drm/drm_bufs.c index a5166ab53b5..c3e77f08a0f 100644 --- a/sys/dev/pci/drm/drm_bufs.c +++ b/sys/dev/pci/drm/drm_bufs.c @@ -38,7 +38,6 @@ #include "drmP.h" int drm_alloc_resource(struct drm_device *, int); -void drm_cleanup_buf_error(struct drm_device *, drm_buf_entry_t *); int drm_do_addbufs_agp(struct drm_device *, drm_buf_desc_t *); int drm_do_addbufs_pci(struct drm_device *, drm_buf_desc_t *); int drm_do_addbufs_sg(struct drm_device *, drm_buf_desc_t *); @@ -398,31 +397,6 @@ drm_rmmap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) } -void -drm_cleanup_buf_error(struct drm_device *dev, drm_buf_entry_t *entry) -{ - int i; - - if (entry->seg_count) { - for (i = 0; i < entry->seg_count; i++) - drm_pci_free(dev, entry->seglist[i]); - drm_free(entry->seglist, entry->seg_count * - sizeof(*entry->seglist), DRM_MEM_BUFS); - - entry->seg_count = 0; - } - - if (entry->buf_count) { - for (i = 0; i < entry->buf_count; i++) { - drm_free(entry->buflist[i].dev_private, - entry->buflist[i].dev_priv_size, DRM_MEM_BUFS); - } - drm_free(entry->buflist, entry->buf_count * - sizeof(*entry->buflist), DRM_MEM_BUFS); - - entry->buf_count = 0; - } -} int drm_do_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request) @@ -519,7 +493,7 @@ drm_do_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request) if (buf->dev_private == NULL) { /* Set count correctly so we free the proper amount. */ entry->buf_count = count; - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); return ENOMEM; } @@ -536,7 +510,7 @@ drm_do_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request) (dma->buf_count + entry->buf_count) * sizeof(*dma->buflist), M_DRM); if (temp_buflist == NULL) { /* Free the entry because it isn't valid */ - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); return ENOMEM; } dma->buflist = temp_buflist; @@ -631,7 +605,7 @@ drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request) /* Set count correctly so we free the proper amount. */ entry->buf_count = count; entry->seg_count = count; - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); drm_free(temp_pagelist, (dma->page_count + (count << page_order)) * sizeof(*dma->pagelist), DRM_MEM_BUFS); @@ -667,7 +641,7 @@ drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request) /* Set count so we free the proper amount. */ entry->buf_count = count; entry->seg_count = count; - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); drm_free(temp_pagelist, (dma->page_count + (count << page_order)) * sizeof(*dma->pagelist), @@ -686,7 +660,7 @@ drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request) (dma->buf_count + entry->buf_count) * sizeof(*dma->buflist), M_DRM); if (temp_buflist == NULL) { /* Free the entry because it isn't valid */ - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); drm_free(temp_pagelist, (dma->page_count + (count << page_order)) * sizeof(*dma->pagelist), DRM_MEM_BUFS); @@ -785,7 +759,7 @@ drm_do_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request) if (buf->dev_private == NULL) { /* Set count correctly so we free the proper amount. */ entry->buf_count = count; - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); return ENOMEM; } @@ -803,7 +777,7 @@ drm_do_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request) (dma->buf_count + entry->buf_count) * sizeof(*dma->buflist), M_DRM); if (temp_buflist == NULL) { /* Free the entry because it isn't valid */ - drm_cleanup_buf_error(dev, entry); + drm_cleanup_buf(dev, entry); return ENOMEM; } dma->buflist = temp_buflist; diff --git a/sys/dev/pci/drm/drm_dma.c b/sys/dev/pci/drm/drm_dma.c index 4922a0344c3..91e51cfaf96 100644 --- a/sys/dev/pci/drm/drm_dma.c +++ b/sys/dev/pci/drm/drm_dma.c @@ -52,43 +52,43 @@ drm_dma_setup(struct drm_device *dev) } void +drm_cleanup_buf(struct drm_device *dev, drm_buf_entry_t *entry) +{ + int i; + + if (entry->seg_count) { + for (i = 0; i < entry->seg_count; i++) + drm_pci_free(dev, entry->seglist[i]); + drm_free(entry->seglist, entry->seg_count * + sizeof(*entry->seglist), DRM_MEM_BUFS); + + entry->seg_count = 0; + } + + if (entry->buf_count) { + for (i = 0; i < entry->buf_count; i++) { + drm_free(entry->buflist[i].dev_private, + entry->buflist[i].dev_priv_size, DRM_MEM_BUFS); + } + drm_free(entry->buflist, entry->buf_count * + sizeof(*entry->buflist), DRM_MEM_BUFS); + + entry->buf_count = 0; + } +} + +void drm_dma_takedown(struct drm_device *dev) { drm_device_dma_t *dma = dev->dma; - int i, j; + int i; if (dma == NULL) return; /* Clear dma buffers */ - for (i = 0; i <= DRM_MAX_ORDER; i++) { - if (dma->bufs[i].seg_count) { - DRM_DEBUG("order %d: buf_count = %d," - " seg_count = %d\n", i, dma->bufs[i].buf_count, - dma->bufs[i].seg_count); - for (j = 0; j < dma->bufs[i].seg_count; j++) { - drm_pci_free(dev, dma->bufs[i].seglist[j]); - } - if (dma->bufs[i].seglist) - drm_free(dma->bufs[i].seglist, - dma->bufs[i].seg_count * - sizeof(*dma->bufs[i].seglist), - DRM_MEM_BUFS); - } - - if (dma->bufs[i].buf_count) { - for (j = 0; j < dma->bufs[i].buf_count; j++) { - drm_free(dma->bufs[i].buflist[j].dev_private, - dma->bufs[i].buflist[j].dev_priv_size, - DRM_MEM_BUFS); - } - if (dma->bufs[i].buflist) - drm_free(dma->bufs[i].buflist, - dma->bufs[i].buf_count * - sizeof(*dma->bufs[i].buflist), - DRM_MEM_BUFS); - } - } + for (i = 0; i <= DRM_MAX_ORDER; i++) + drm_cleanup_buf(dev, &dma->bufs[i]); drm_free(dma->buflist, dma->buf_count * sizeof(*dma->buflist), DRM_MEM_BUFS); |