panfrost: Mark BOs as NOEXEC
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Wed, 31 Jul 2019 13:00:46 +0000 (15:00 +0200)
committerTomeu Vizoso <tomeu.vizoso@collabora.com>
Thu, 8 Aug 2019 05:42:52 +0000 (07:42 +0200)
Unless a BO has the EXECUTABLE flag, mark it as NOEXEC.

v2: - Rework version detection (Alyssa).

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
include/drm-uapi/panfrost_drm.h
src/gallium/drivers/panfrost/pan_drm.c
src/gallium/drivers/panfrost/pan_screen.c
src/gallium/drivers/panfrost/pan_screen.h

index a52e0283b90d5711aa2e9b174ae4e69cdf7d480f..9150dd75aad8d1887fcc2116bbfb3081665fe616 100644 (file)
@@ -18,6 +18,8 @@ extern "C" {
 #define DRM_PANFROST_MMAP_BO                   0x03
 #define DRM_PANFROST_GET_PARAM                 0x04
 #define DRM_PANFROST_GET_BO_OFFSET             0x05
+#define DRM_PANFROST_PERFCNT_ENABLE            0x06
+#define DRM_PANFROST_PERFCNT_DUMP              0x07
 
 #define DRM_IOCTL_PANFROST_SUBMIT              DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_SUBMIT, struct drm_panfrost_submit)
 #define DRM_IOCTL_PANFROST_WAIT_BO             DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_WAIT_BO, struct drm_panfrost_wait_bo)
@@ -26,6 +28,15 @@ extern "C" {
 #define DRM_IOCTL_PANFROST_GET_PARAM           DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_GET_PARAM, struct drm_panfrost_get_param)
 #define DRM_IOCTL_PANFROST_GET_BO_OFFSET       DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_GET_BO_OFFSET, struct drm_panfrost_get_bo_offset)
 
+/*
+ * Unstable ioctl(s): only exposed when the unsafe unstable_ioctls module
+ * param is set to true.
+ * All these ioctl(s) are subject to deprecation, so please don't rely on
+ * them for anything but debugging purpose.
+ */
+#define DRM_IOCTL_PANFROST_PERFCNT_ENABLE      DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_PERFCNT_ENABLE, struct drm_panfrost_perfcnt_enable)
+#define DRM_IOCTL_PANFROST_PERFCNT_DUMP                DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_PERFCNT_DUMP, struct drm_panfrost_perfcnt_dump)
+
 #define PANFROST_JD_REQ_FS (1 << 0)
 /**
  * struct drm_panfrost_submit - ioctl argument for submitting commands to the 3D
@@ -71,6 +82,9 @@ struct drm_panfrost_wait_bo {
        __s64 timeout_ns;       /* absolute */
 };
 
+#define PANFROST_BO_NOEXEC     1
+#define PANFROST_BO_HEAP       2
+
 /**
  * struct drm_panfrost_create_bo - ioctl argument for creating Panfrost BOs.
  *
@@ -135,6 +149,19 @@ struct drm_panfrost_get_bo_offset {
        __u64 offset;
 };
 
+struct drm_panfrost_perfcnt_enable {
+       __u32 enable;
+       /*
+        * On bifrost we have 2 sets of counters, this parameter defines the
+        * one to track.
+        */
+       __u32 counterset;
+};
+
+struct drm_panfrost_perfcnt_dump {
+       __u64 buf_ptr;
+};
+
 #if defined(__cplusplus)
 }
 #endif
index 8ae541ae11b6256fef105b43d55e2de2daeac403..6d1e0c08d33da5144149b402480083eb0e20a325 100644 (file)
@@ -93,7 +93,11 @@ panfrost_drm_create_bo(struct panfrost_screen *screen, size_t size,
 
         unsigned translated_flags = 0;
 
-        /* TODO: translate flags to kernel flags, if the kernel supports */
+        if (screen->kernel_version->version_major > 1 ||
+            screen->kernel_version->version_minor >= 1) {
+                if (!(flags & PAN_ALLOCATE_EXECUTE))
+                        translated_flags |= PANFROST_BO_NOEXEC;
+        }
 
         struct drm_panfrost_create_bo create_bo = {
                 .size = size,
index b2fac88e956e9146887f5911192d4872a8d52707..5f527d0d3b3d358a402c2984071be0740f76984a 100644 (file)
@@ -37,7 +37,6 @@
 #include "pipe/p_defines.h"
 #include "pipe/p_screen.h"
 #include "draw/draw_context.h"
-#include <xf86drm.h>
 
 #include <fcntl.h>
 
@@ -537,6 +536,7 @@ panfrost_destroy_screen(struct pipe_screen *pscreen)
 {
         struct panfrost_screen *screen = pan_screen(pscreen);
         panfrost_bo_cache_evict_all(screen);
+        drmFreeVersion(screen->kernel_version);
         ralloc_free(screen);
 }
 
@@ -617,6 +617,7 @@ panfrost_create_screen(int fd, struct renderonly *ro)
 
         screen->gpu_id = panfrost_drm_query_gpu_version(screen);
         screen->require_sfbd = screen->gpu_id < 0x0750; /* T760 is the first to support MFBD */
+        screen->kernel_version = drmGetVersion(fd);
 
         /* Check if we're loading against a supported GPU model. */
 
index 22cd7dcc9fea481c6f0602d8517dfcd0baf2d01a..35fb8de26282bf7ad59abd09b28134a5f6dcc4df 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef PAN_SCREEN_H
 #define PAN_SCREEN_H
 
+#include <xf86drm.h>
 #include "pipe/p_screen.h"
 #include "pipe/p_defines.h"
 #include "renderonly/renderonly.h"
@@ -99,6 +100,8 @@ struct panfrost_screen {
         unsigned gpu_id;
         bool require_sfbd;
 
+        drmVersionPtr kernel_version;
+
         struct renderonly *ro;
 
         /* Transient memory management is based on borrowing fixed-size slabs