hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/drivers/dma/virt-dma.c
....@@ -23,11 +23,11 @@
2323 unsigned long flags;
2424 dma_cookie_t cookie;
2525
26
- spin_lock_irqsave(&vc->lock, flags);
26
+ vchan_lock_irqsave(vc, flags);
2727 cookie = dma_cookie_assign(tx);
2828
2929 list_move_tail(&vd->node, &vc->desc_submitted);
30
- spin_unlock_irqrestore(&vc->lock, flags);
30
+ vchan_unlock_irqrestore(vc, flags);
3131
3232 dev_dbg(vc->chan.device->dev, "vchan %p: txd %p[%x]: submitted\n",
3333 vc, vd, cookie);
....@@ -52,9 +52,9 @@
5252 struct virt_dma_desc *vd = to_virt_desc(tx);
5353 unsigned long flags;
5454
55
- spin_lock_irqsave(&vc->lock, flags);
55
+ vchan_lock_irqsave(vc, flags);
5656 list_del(&vd->node);
57
- spin_unlock_irqrestore(&vc->lock, flags);
57
+ vchan_unlock_irqrestore(vc, flags);
5858
5959 dev_dbg(vc->chan.device->dev, "vchan %p: txd %p[%x]: freeing\n",
6060 vc, vd, vd->tx.cookie);
....@@ -87,7 +87,7 @@
8787 struct dmaengine_desc_callback cb;
8888 LIST_HEAD(head);
8989
90
- spin_lock_irq(&vc->lock);
90
+ vchan_lock_irq(vc);
9191 list_splice_tail_init(&vc->desc_completed, &head);
9292 vd = vc->cyclic;
9393 if (vd) {
....@@ -96,7 +96,7 @@
9696 } else {
9797 memset(&cb, 0, sizeof(cb));
9898 }
99
- spin_unlock_irq(&vc->lock);
99
+ vchan_unlock_irq(vc);
100100
101101 dmaengine_desc_callback_invoke(&cb, &vd->tx_result);
102102
....@@ -120,11 +120,119 @@
120120 }
121121 EXPORT_SYMBOL_GPL(vchan_dma_desc_free_list);
122122
123
+#ifdef CONFIG_DMA_VIRTUAL_CHANNELS_OOB
124
+
125
+static void inband_init_chan_lock(struct virt_dma_chan *vc)
126
+{
127
+ spin_lock_init(&vc->lock);
128
+}
129
+
130
+static void inband_lock_chan(struct virt_dma_chan *vc)
131
+{
132
+ spin_lock(&vc->lock);
133
+}
134
+
135
+static void inband_unlock_chan(struct virt_dma_chan *vc)
136
+{
137
+ spin_unlock(&vc->lock);
138
+}
139
+
140
+static void inband_lock_irq_chan(struct virt_dma_chan *vc)
141
+{
142
+ spin_lock_irq(&vc->lock);
143
+}
144
+
145
+static void inband_unlock_irq_chan(struct virt_dma_chan *vc)
146
+{
147
+ spin_unlock_irq(&vc->lock);
148
+}
149
+
150
+static unsigned long inband_lock_irqsave_chan(struct virt_dma_chan *vc)
151
+{
152
+ unsigned long flags;
153
+
154
+ spin_lock_irqsave(&vc->lock, flags);
155
+
156
+ return flags;
157
+}
158
+
159
+static void inband_unlock_irqrestore_chan(struct virt_dma_chan *vc,
160
+ unsigned long flags)
161
+{
162
+ spin_unlock_irqrestore(&vc->lock, flags);
163
+}
164
+
165
+static struct virt_dma_lockops inband_lock_ops = {
166
+ .init = inband_init_chan_lock,
167
+ .lock = inband_lock_chan,
168
+ .unlock = inband_unlock_chan,
169
+ .lock_irq = inband_lock_irq_chan,
170
+ .unlock_irq = inband_unlock_irq_chan,
171
+ .lock_irqsave = inband_lock_irqsave_chan,
172
+ .unlock_irqrestore = inband_unlock_irqrestore_chan,
173
+};
174
+
175
+static void oob_init_chan_lock(struct virt_dma_chan *vc)
176
+{
177
+ raw_spin_lock_init(&vc->oob_lock);
178
+}
179
+
180
+static void oob_lock_chan(struct virt_dma_chan *vc)
181
+{
182
+ raw_spin_lock(&vc->oob_lock);
183
+}
184
+
185
+static void oob_unlock_chan(struct virt_dma_chan *vc)
186
+{
187
+ raw_spin_unlock(&vc->oob_lock);
188
+}
189
+
190
+static void oob_lock_irq_chan(struct virt_dma_chan *vc)
191
+{
192
+ raw_spin_lock_irq(&vc->oob_lock);
193
+}
194
+
195
+static void oob_unlock_irq_chan(struct virt_dma_chan *vc)
196
+{
197
+ raw_spin_unlock_irq(&vc->oob_lock);
198
+}
199
+
200
+static unsigned long oob_lock_irqsave_chan(struct virt_dma_chan *vc)
201
+{
202
+ unsigned long flags;
203
+
204
+ raw_spin_lock_irqsave(&vc->oob_lock, flags);
205
+
206
+ return flags;
207
+}
208
+
209
+static void oob_unlock_irqrestore_chan(struct virt_dma_chan *vc,
210
+ unsigned long flags)
211
+{
212
+ raw_spin_unlock_irqrestore(&vc->oob_lock, flags);
213
+}
214
+
215
+static struct virt_dma_lockops oob_lock_ops = {
216
+ .init = oob_init_chan_lock,
217
+ .lock = oob_lock_chan,
218
+ .unlock = oob_unlock_chan,
219
+ .lock_irq = oob_lock_irq_chan,
220
+ .unlock_irq = oob_unlock_irq_chan,
221
+ .lock_irqsave = oob_lock_irqsave_chan,
222
+ .unlock_irqrestore = oob_unlock_irqrestore_chan,
223
+};
224
+
225
+#endif
226
+
123227 void vchan_init(struct virt_dma_chan *vc, struct dma_device *dmadev)
124228 {
125229 dma_cookie_init(&vc->chan);
126230
127
- spin_lock_init(&vc->lock);
231
+#ifdef CONFIG_DMA_VIRTUAL_CHANNELS_OOB
232
+ vc->lock_ops = test_bit(DMA_OOB, dmadev->cap_mask.bits) ?
233
+ &oob_lock_ops : &inband_lock_ops;
234
+#endif
235
+ vchan_lock_init(vc);
128236 INIT_LIST_HEAD(&vc->desc_allocated);
129237 INIT_LIST_HEAD(&vc->desc_submitted);
130238 INIT_LIST_HEAD(&vc->desc_issued);