1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#include <linux/export.h>
37#include <drm/drmP.h>
38#include "drm_legacy.h"
39
40
41
42
43
44
45
46
47
48int drm_legacy_dma_setup(struct drm_device *dev)
49{
50 int i;
51
52 if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA) ||
53 drm_core_check_feature(dev, DRIVER_MODESET)) {
54 return 0;
55 }
56
57 dev->buf_use = 0;
58 atomic_set(&dev->buf_alloc, 0);
59
60 dev->dma = kzalloc(sizeof(*dev->dma), GFP_KERNEL);
61 if (!dev->dma)
62 return -ENOMEM;
63
64 for (i = 0; i <= DRM_MAX_ORDER; i++)
65 memset(&dev->dma->bufs[i], 0, sizeof(dev->dma->bufs[0]));
66
67 return 0;
68}
69
70
71
72
73
74
75
76
77
78void drm_legacy_dma_takedown(struct drm_device *dev)
79{
80 struct drm_device_dma *dma = dev->dma;
81 int i, j;
82
83 if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA) ||
84 drm_core_check_feature(dev, DRIVER_MODESET)) {
85 return;
86 }
87
88 if (!dma)
89 return;
90
91
92 for (i = 0; i <= DRM_MAX_ORDER; i++) {
93 if (dma->bufs[i].seg_count) {
94 DRM_DEBUG("order %d: buf_count = %d,"
95 " seg_count = %d\n",
96 i,
97 dma->bufs[i].buf_count,
98 dma->bufs[i].seg_count);
99 for (j = 0; j < dma->bufs[i].seg_count; j++) {
100 if (dma->bufs[i].seglist[j]) {
101 drm_pci_free(dev, dma->bufs[i].seglist[j]);
102 }
103 }
104 kfree(dma->bufs[i].seglist);
105 }
106 if (dma->bufs[i].buf_count) {
107 for (j = 0; j < dma->bufs[i].buf_count; j++) {
108 kfree(dma->bufs[i].buflist[j].dev_private);
109 }
110 kfree(dma->bufs[i].buflist);
111 }
112 }
113
114 kfree(dma->buflist);
115 kfree(dma->pagelist);
116 kfree(dev->dma);
117 dev->dma = NULL;
118}
119
120
121
122
123
124
125
126
127
128void drm_legacy_free_buffer(struct drm_device *dev, struct drm_buf * buf)
129{
130 if (!buf)
131 return;
132
133 buf->waiting = 0;
134 buf->pending = 0;
135 buf->file_priv = NULL;
136 buf->used = 0;
137}
138
139
140
141
142
143
144
145
146void drm_legacy_reclaim_buffers(struct drm_device *dev,
147 struct drm_file *file_priv)
148{
149 struct drm_device_dma *dma = dev->dma;
150 int i;
151
152 if (!dma)
153 return;
154 for (i = 0; i < dma->buf_count; i++) {
155 if (dma->buflist[i]->file_priv == file_priv) {
156 switch (dma->buflist[i]->list) {
157 case DRM_LIST_NONE:
158 drm_legacy_free_buffer(dev, dma->buflist[i]);
159 break;
160 case DRM_LIST_WAIT:
161 dma->buflist[i]->list = DRM_LIST_RECLAIM;
162 break;
163 default:
164
165 break;
166 }
167 }
168 }
169}
170