hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/via/via_dmablit.c
....@@ -34,13 +34,16 @@
3434 * the same DMA mappings?
3535 */
3636
37
-#include <drm/drmP.h>
38
-#include <drm/via_drm.h>
39
-#include "via_drv.h"
40
-#include "via_dmablit.h"
41
-
4237 #include <linux/pagemap.h>
38
+#include <linux/pci.h>
4339 #include <linux/slab.h>
40
+#include <linux/vmalloc.h>
41
+
42
+#include <drm/drm_device.h>
43
+#include <drm/via_drm.h>
44
+
45
+#include "via_dmablit.h"
46
+#include "via_drv.h"
4447
4548 #define VIA_PGDN(x) (((unsigned long)(x)) & PAGE_MASK)
4649 #define VIA_PGOFF(x) (((unsigned long)(x)) & ~PAGE_MASK)
....@@ -171,28 +174,26 @@
171174 static void
172175 via_free_sg_info(struct pci_dev *pdev, drm_via_sg_info_t *vsg)
173176 {
174
- struct page *page;
175177 int i;
176178
177179 switch (vsg->state) {
178180 case dr_via_device_mapped:
179181 via_unmap_blit_from_device(pdev, vsg);
182
+ fallthrough;
180183 case dr_via_desc_pages_alloc:
181184 for (i = 0; i < vsg->num_desc_pages; ++i) {
182185 if (vsg->desc_pages[i] != NULL)
183186 free_page((unsigned long)vsg->desc_pages[i]);
184187 }
185188 kfree(vsg->desc_pages);
189
+ fallthrough;
186190 case dr_via_pages_locked:
187
- for (i = 0; i < vsg->num_pages; ++i) {
188
- if (NULL != (page = vsg->pages[i])) {
189
- if (!PageReserved(page) && (DMA_FROM_DEVICE == vsg->direction))
190
- SetPageDirty(page);
191
- put_page(page);
192
- }
193
- }
191
+ unpin_user_pages_dirty_lock(vsg->pages, vsg->num_pages,
192
+ (vsg->direction == DMA_FROM_DEVICE));
193
+ fallthrough;
194194 case dr_via_pages_alloc:
195195 vfree(vsg->pages);
196
+ fallthrough;
196197 default:
197198 vsg->state = dr_via_sg_init;
198199 }
....@@ -210,16 +211,16 @@
210211 {
211212 drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
212213
213
- VIA_WRITE(VIA_PCI_DMA_MAR0 + engine*0x10, 0);
214
- VIA_WRITE(VIA_PCI_DMA_DAR0 + engine*0x10, 0);
215
- VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DD | VIA_DMA_CSR_TD |
214
+ via_write(dev_priv, VIA_PCI_DMA_MAR0 + engine*0x10, 0);
215
+ via_write(dev_priv, VIA_PCI_DMA_DAR0 + engine*0x10, 0);
216
+ via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DD | VIA_DMA_CSR_TD |
216217 VIA_DMA_CSR_DE);
217
- VIA_WRITE(VIA_PCI_DMA_MR0 + engine*0x04, VIA_DMA_MR_CM | VIA_DMA_MR_TDIE);
218
- VIA_WRITE(VIA_PCI_DMA_BCR0 + engine*0x10, 0);
219
- VIA_WRITE(VIA_PCI_DMA_DPR0 + engine*0x10, vsg->chain_start);
218
+ via_write(dev_priv, VIA_PCI_DMA_MR0 + engine*0x04, VIA_DMA_MR_CM | VIA_DMA_MR_TDIE);
219
+ via_write(dev_priv, VIA_PCI_DMA_BCR0 + engine*0x10, 0);
220
+ via_write(dev_priv, VIA_PCI_DMA_DPR0 + engine*0x10, vsg->chain_start);
220221 wmb();
221
- VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DE | VIA_DMA_CSR_TS);
222
- VIA_READ(VIA_PCI_DMA_CSR0 + engine*0x04);
222
+ via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DE | VIA_DMA_CSR_TS);
223
+ via_read(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04);
223224 }
224225
225226 /*
....@@ -238,8 +239,9 @@
238239 vsg->pages = vzalloc(array_size(sizeof(struct page *), vsg->num_pages));
239240 if (NULL == vsg->pages)
240241 return -ENOMEM;
241
- ret = get_user_pages_fast((unsigned long)xfer->mem_addr,
242
- vsg->num_pages, vsg->direction == DMA_FROM_DEVICE,
242
+ ret = pin_user_pages_fast((unsigned long)xfer->mem_addr,
243
+ vsg->num_pages,
244
+ vsg->direction == DMA_FROM_DEVICE ? FOLL_WRITE : 0,
243245 vsg->pages);
244246 if (ret != vsg->num_pages) {
245247 if (ret < 0)
....@@ -286,7 +288,7 @@
286288 {
287289 drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
288290
289
- VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TA);
291
+ via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TA);
290292 }
291293
292294 static void
....@@ -294,7 +296,7 @@
294296 {
295297 drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
296298
297
- VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD | VIA_DMA_CSR_DD);
299
+ via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD | VIA_DMA_CSR_DD);
298300 }
299301
300302
....@@ -325,7 +327,7 @@
325327 spin_lock_irqsave(&blitq->blit_lock, irqsave);
326328
327329 done_transfer = blitq->is_active &&
328
- ((status = VIA_READ(VIA_PCI_DMA_CSR0 + engine*0x04)) & VIA_DMA_CSR_TD);
330
+ ((status = via_read(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04)) & VIA_DMA_CSR_TD);
329331 done_transfer = done_transfer || (blitq->aborting && !(status & VIA_DMA_CSR_DE));
330332
331333 cur = blitq->cur;
....@@ -344,7 +346,7 @@
344346 * Clear transfer done flag.
345347 */
346348
347
- VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD);
349
+ via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD);
348350
349351 blitq->is_active = 0;
350352 blitq->aborting = 0;
....@@ -431,7 +433,7 @@
431433 int ret = 0;
432434
433435 if (via_dmablit_active(blitq, engine, handle, &queue)) {
434
- DRM_WAIT_ON(ret, *queue, 3 * HZ,
436
+ VIA_WAIT_ON(ret, *queue, 3 * HZ,
435437 !via_dmablit_active(blitq, engine, handle, NULL));
436438 }
437439 DRM_DEBUG("DMA blit sync handle 0x%x engine %d returned %d\n",
....@@ -682,7 +684,7 @@
682684 while (blitq->num_free == 0) {
683685 spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
684686
685
- DRM_WAIT_ON(ret, blitq->busy_queue, HZ, blitq->num_free > 0);
687
+ VIA_WAIT_ON(ret, blitq->busy_queue, HZ, blitq->num_free > 0);
686688 if (ret)
687689 return (-EINTR == ret) ? -EAGAIN : ret;
688690