Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2 Check for DMA-safe addresses before al...



details:   https://anonhg.NetBSD.org/src/rev/702da5b0688f
branches:  trunk
changeset: 366428:702da5b0688f
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Aug 27 15:32:39 2018 +0000

description:
Check for DMA-safe addresses before allowing DRM prime import.

diffstat:

 sys/external/bsd/drm2/dist/drm/drm_prime.c        |  16 ++++++++++++++--
 sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c       |  10 ++++++++--
 sys/external/bsd/drm2/dist/include/drm/drmP.h     |   3 ++-
 sys/external/bsd/drm2/include/drm/bus_dma_hacks.h |  23 ++++++++++++++++++++++-
 4 files changed, 46 insertions(+), 6 deletions(-)

diffs (129 lines):

diff -r e64eea2e8158 -r 702da5b0688f sys/external/bsd/drm2/dist/drm/drm_prime.c
--- a/sys/external/bsd/drm2/dist/drm/drm_prime.c        Mon Aug 27 15:32:20 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/drm_prime.c        Mon Aug 27 15:32:39 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_prime.c,v 1.6 2018/08/27 15:29:31 riastradh Exp $  */
+/*     $NetBSD: drm_prime.c,v 1.7 2018/08/27 15:32:39 riastradh Exp $  */
 
 /*
  * Copyright © 2012 Red Hat
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_prime.c,v 1.6 2018/08/27 15:29:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_prime.c,v 1.7 2018/08/27 15:32:39 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/dma-buf.h>
@@ -928,6 +928,18 @@
 out0:  return ret;
 }
 
+bool
+drm_prime_sg_importable(bus_dma_tag_t dmat, struct sg_table *sgt)
+{
+       unsigned i;
+
+       for (i = 0; i < sgt->sgt_npgs; i++) {
+               if (bus_dmatag_bounces_paddr(dmat, sgt->sgt_pgs[i]))
+                       return false;
+       }
+       return true;
+}
+
 #else  /* !__NetBSD__ */
 
 /**
diff -r e64eea2e8158 -r 702da5b0688f sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c
--- a/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c       Mon Aug 27 15:32:20 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c       Mon Aug 27 15:32:39 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ttm_bo.c,v 1.13 2018/08/27 07:53:16 riastradh Exp $    */
+/*     $NetBSD: ttm_bo.c,v 1.14 2018/08/27 15:32:39 riastradh Exp $    */
 
 /**************************************************************************
  *
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ttm_bo.c,v 1.13 2018/08/27 07:53:16 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ttm_bo.c,v 1.14 2018/08/27 15:32:39 riastradh Exp $");
 
 #define pr_fmt(fmt) "[TTM] " fmt
 
@@ -41,6 +41,7 @@
 #include <uvm/uvm_object.h>
 #endif
 
+#include <drm/drmP.h>
 #include <drm/ttm/ttm_module.h>
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_placement.h>
@@ -1140,6 +1141,11 @@
        struct ttm_mem_global *mem_glob = bdev->glob->mem_glob;
        bool locked;
 
+       if (sg && !drm_prime_sg_importable(bdev->dmat, sg)) {
+               pr_err("DRM prime buffer violates DMA constraints\n");
+               return -EIO;
+       }
+
        ret = ttm_mem_global_alloc(mem_glob, acc_size, false, false);
        if (ret) {
                pr_err("Out of kernel memory\n");
diff -r e64eea2e8158 -r 702da5b0688f sys/external/bsd/drm2/dist/include/drm/drmP.h
--- a/sys/external/bsd/drm2/dist/include/drm/drmP.h     Mon Aug 27 15:32:20 2018 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h     Mon Aug 27 15:32:39 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drmP.h,v 1.31 2018/08/27 15:32:06 riastradh Exp $      */
+/*     $NetBSD: drmP.h,v 1.32 2018/08/27 15:32:39 riastradh Exp $      */
 
 /*
  * Internal Header for the Direct Rendering Manager
@@ -1189,6 +1189,7 @@
 extern int drm_prime_bus_dmamap_load_sgt(bus_dma_tag_t, bus_dmamap_t, struct sg_table *);
 extern bus_size_t drm_prime_sg_size(struct sg_table *);
 extern void drm_prime_sg_free(struct sg_table *);
+extern bool drm_prime_sg_importable(bus_dma_tag_t, struct sg_table *);
 #else
 extern int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
                                            dma_addr_t *addrs, int max_pages);
diff -r e64eea2e8158 -r 702da5b0688f sys/external/bsd/drm2/include/drm/bus_dma_hacks.h
--- a/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h Mon Aug 27 15:32:20 2018 +0000
+++ b/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h Mon Aug 27 15:32:39 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: bus_dma_hacks.h,v 1.16 2018/08/27 15:32:20 riastradh Exp $     */
+/*     $NetBSD: bus_dma_hacks.h,v 1.17 2018/08/27 15:32:39 riastradh Exp $     */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -91,6 +91,27 @@
 #endif
 }
 
+static inline bool
+bus_dmatag_bounces_paddr(bus_dma_tag_t dmat, paddr_t pa)
+{
+#if defined(__i386__) || defined(__x86_64__)
+       return pa < dmat->_bounce_alloc_lo || dmat->_bounce_alloc_hi <= pa;
+#elif defined(__arm__) || defined(__aarch64__)
+       unsigned i;
+
+       for (i = 0; i < dmat->_nranges; i++) {
+               const struct arm32_dma_range *dr = &dmat->_ranges[i];
+               if (dr->dr_sysbase <= pa && pa - dr->dr_sysbase <= dr->dr_len)
+                       return false;
+       }
+       return true;
+#elif defined(__powerpc__)
+       return dmat->_bounce_thresh && pa >= dmat->_bounce_thresh;
+#elif defined(__sparc__) || defined(__sparc64__)
+       return false;           /* no bounce buffers ever */
+#endif
+}
+
 static inline int
 bus_dmamap_load_pglist(bus_dma_tag_t tag, bus_dmamap_t map,
     struct pglist *pglist, bus_size_t size, int flags)



Home | Main Index | Thread Index | Old Index