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_LEGACY))
54 return 0;
55
56 dev->buf_use = 0;
57 atomic_set(&dev->buf_alloc, 0);
58
59 dev->dma = kzalloc(sizeof(*dev->dma), GFP_KERNEL);
60 if (!dev->dma)
61 return -ENOMEM;
62
63 for (i = 0; i <= DRM_MAX_ORDER; i++)
64 memset(&dev->dma->bufs[i], 0, sizeof(dev->dma->bufs[0]));
65
66 return 0;
67}
68
69
70
71
72
73
74
75
76
77void drm_legacy_dma_takedown(struct drm_device *dev)
78{
79 struct drm_device_dma *dma = dev->dma;
80 int i, j;
81
82 if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA) ||
83 !drm_core_check_feature(dev, DRIVER_LEGACY))
84 return;
85
86 if (!dma)
87 return;
88
89
90 for (i = 0; i <= DRM_MAX_ORDER; i++) {
91 if (dma->bufs[i].seg_count) {
92 DRM_DEBUG("order %d: buf_count = %d,"
93 " seg_count = %d\n",
94 i,
95 dma->bufs[i].buf_count,
96 dma->bufs[i].seg_count);
97 for (j = 0; j < dma->bufs[i].seg_count; j++) {
98 if (dma->bufs[i].seglist[j]) {
99 drm_pci_free(dev, dma->bufs[i].seglist[j]);
100 }
101 }
102 kfree(dma->bufs[i].seglist);
103 }
104 if (dma->bufs[i].buf_count) {
105 for (j = 0; j < dma->bufs[i].buf_count; j++) {
106 kfree(dma->bufs[i].buflist[j].dev_private);
107 }
108 kfree(dma->bufs[i].buflist);
109 }
110 }
111
112 kfree(dma->buflist);
113 kfree(dma->pagelist);
114 kfree(dev->dma);
115 dev->dma = NULL;
116}
117
118
119
120
121
122
123
124
125
126void drm_legacy_free_buffer(struct drm_device *dev, struct drm_buf * buf)
127{
128 if (!buf)
129 return;
130
131 buf->waiting = 0;
132 buf->pending = 0;
133 buf->file_priv = NULL;
134 buf->used = 0;
135}
136
137
138
139
140
141
142
143
144void drm_legacy_reclaim_buffers(struct drm_device *dev,
145 struct drm_file *file_priv)
146{
147 struct drm_device_dma *dma = dev->dma;
148 int i;
149
150 if (!dma)
151 return;
152 for (i = 0; i < dma->buf_count; i++) {
153 if (dma->buflist[i]->file_priv == file_priv) {
154 switch (dma->buflist[i]->list) {
155 case DRM_LIST_NONE:
156 drm_legacy_free_buffer(dev, dma->buflist[i]);
157 break;
158 case DRM_LIST_WAIT:
159 dma->buflist[i]->list = DRM_LIST_RECLAIM;
160 break;
161 default:
162
163 break;
164 }
165 }
166 }
167}
168