0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <linux/export.h>
0037 #include <linux/pci.h>
0038
0039 #include <drm/drm_drv.h>
0040 #include <drm/drm_print.h>
0041
0042 #include "drm_legacy.h"
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 int drm_legacy_dma_setup(struct drm_device *dev)
0053 {
0054 int i;
0055
0056 if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA) ||
0057 !drm_core_check_feature(dev, DRIVER_LEGACY))
0058 return 0;
0059
0060 dev->buf_use = 0;
0061 atomic_set(&dev->buf_alloc, 0);
0062
0063 dev->dma = kzalloc(sizeof(*dev->dma), GFP_KERNEL);
0064 if (!dev->dma)
0065 return -ENOMEM;
0066
0067 for (i = 0; i <= DRM_MAX_ORDER; i++)
0068 memset(&dev->dma->bufs[i], 0, sizeof(dev->dma->bufs[0]));
0069
0070 return 0;
0071 }
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 void drm_legacy_dma_takedown(struct drm_device *dev)
0082 {
0083 struct drm_device_dma *dma = dev->dma;
0084 drm_dma_handle_t *dmah;
0085 int i, j;
0086
0087 if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA) ||
0088 !drm_core_check_feature(dev, DRIVER_LEGACY))
0089 return;
0090
0091 if (!dma)
0092 return;
0093
0094
0095 for (i = 0; i <= DRM_MAX_ORDER; i++) {
0096 if (dma->bufs[i].seg_count) {
0097 DRM_DEBUG("order %d: buf_count = %d,"
0098 " seg_count = %d\n",
0099 i,
0100 dma->bufs[i].buf_count,
0101 dma->bufs[i].seg_count);
0102 for (j = 0; j < dma->bufs[i].seg_count; j++) {
0103 if (dma->bufs[i].seglist[j]) {
0104 dmah = dma->bufs[i].seglist[j];
0105 dma_free_coherent(dev->dev,
0106 dmah->size,
0107 dmah->vaddr,
0108 dmah->busaddr);
0109 kfree(dmah);
0110 }
0111 }
0112 kfree(dma->bufs[i].seglist);
0113 }
0114 if (dma->bufs[i].buf_count) {
0115 for (j = 0; j < dma->bufs[i].buf_count; j++) {
0116 kfree(dma->bufs[i].buflist[j].dev_private);
0117 }
0118 kfree(dma->bufs[i].buflist);
0119 }
0120 }
0121
0122 kfree(dma->buflist);
0123 kfree(dma->pagelist);
0124 kfree(dev->dma);
0125 dev->dma = NULL;
0126 }
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 void drm_legacy_free_buffer(struct drm_device *dev, struct drm_buf * buf)
0137 {
0138 if (!buf)
0139 return;
0140
0141 buf->waiting = 0;
0142 buf->pending = 0;
0143 buf->file_priv = NULL;
0144 buf->used = 0;
0145 }
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155 void drm_legacy_reclaim_buffers(struct drm_device *dev,
0156 struct drm_file *file_priv)
0157 {
0158 struct drm_device_dma *dma = dev->dma;
0159 int i;
0160
0161 if (!dma)
0162 return;
0163 for (i = 0; i < dma->buf_count; i++) {
0164 if (dma->buflist[i]->file_priv == file_priv) {
0165 switch (dma->buflist[i]->list) {
0166 case DRM_LIST_NONE:
0167 drm_legacy_free_buffer(dev, dma->buflist[i]);
0168 break;
0169 case DRM_LIST_WAIT:
0170 dma->buflist[i]->list = DRM_LIST_RECLAIM;
0171 break;
0172 default:
0173
0174 break;
0175 }
0176 }
0177 }
0178 }