panfrost: Mark BOs as NOEXEC
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>
This commit is contained in:
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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. */
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user