Module Name: xsrc
Committed By: mrg
Date: Tue Apr 27 03:02:37 UTC 2021
Modified Files:
xsrc/external/mit/libdrm/dist: xf86drm.c xf86drm.h xf86drmMode.c
xf86drmMode.h
xsrc/external/mit/libdrm/dist/intel: intel_bufmgr_gem.c
xsrc/external/mit/libdrm/dist/tests/modetest: modetest.c
Removed Files:
xsrc/external/mit/libdrm/dist/man: drm-kms.xml drm-memory.xml drm.xml
drmAvailable.xml drmHandleEvent.xml drmModeGetResources.xml
Log Message:
merge libdrm 2.4.105.
To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 xsrc/external/mit/libdrm/dist/xf86drm.c
cvs rdiff -u -r1.12 -r1.13 xsrc/external/mit/libdrm/dist/xf86drm.h
cvs rdiff -u -r1.16 -r1.17 xsrc/external/mit/libdrm/dist/xf86drmMode.c
cvs rdiff -u -r1.10 -r1.11 xsrc/external/mit/libdrm/dist/xf86drmMode.h
cvs rdiff -u -r1.19 -r1.20 \
xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c
cvs rdiff -u -r1.1.1.3 -r0 xsrc/external/mit/libdrm/dist/man/drm-kms.xml \
xsrc/external/mit/libdrm/dist/man/drm.xml
cvs rdiff -u -r1.1.1.2 -r0 xsrc/external/mit/libdrm/dist/man/drm-memory.xml \
xsrc/external/mit/libdrm/dist/man/drmAvailable.xml \
xsrc/external/mit/libdrm/dist/man/drmHandleEvent.xml \
xsrc/external/mit/libdrm/dist/man/drmModeGetResources.xml
cvs rdiff -u -r1.14 -r1.15 \
xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/libdrm/dist/xf86drm.c
diff -u xsrc/external/mit/libdrm/dist/xf86drm.c:1.27 xsrc/external/mit/libdrm/dist/xf86drm.c:1.28
--- xsrc/external/mit/libdrm/dist/xf86drm.c:1.27 Sun Nov 1 10:01:30 2020
+++ xsrc/external/mit/libdrm/dist/xf86drm.c Tue Apr 27 03:02:37 2021
@@ -128,6 +128,22 @@ static drmServerInfoPtr drm_server_info;
static bool drmNodeIsDRM(int maj, int min);
static char *drmGetMinorNameForFD(int fd, int type);
+static unsigned log2_int(unsigned x)
+{
+ unsigned l;
+
+ if (x < 2) {
+ return 0;
+ }
+ for (l = 2; ; l++) {
+ if ((unsigned)(1 << l) > x) {
+ return l - 1;
+ }
+ }
+ return 0;
+}
+
+
drm_public void drmSetServerInfo(drmServerInfoPtr info)
{
drm_server_info = info;
@@ -700,7 +716,7 @@ static int drmOpenByName(const char *nam
int retcode;
sprintf(proc_name, "/proc/dri/%d/name", i);
- if ((fd = open(proc_name, 0, 0)) >= 0) {
+ if ((fd = open(proc_name, O_RDONLY, 0)) >= 0) {
retcode = read(fd, buf, sizeof(buf)-1);
close(fd);
if (retcode) {
@@ -1339,7 +1355,12 @@ drm_public drmBufInfoPtr drmGetBufInfo(i
retval = drmMalloc(sizeof(*retval));
retval->count = info.count;
- retval->list = drmMalloc(info.count * sizeof(*retval->list));
+ if (!(retval->list = drmMalloc(info.count * sizeof(*retval->list)))) {
+ drmFree(retval);
+ drmFree(info.list);
+ return NULL;
+ }
+
for (i = 0; i < info.count; i++) {
retval->list[i].count = info.list[i].count;
retval->list[i].size = info.list[i].size;
@@ -2826,7 +2847,7 @@ static bool drmNodeIsDRM(int maj, int mi
snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device/drm",
maj, min);
return stat(path, &sbuf) == 0;
-#elif __FreeBSD__
+#elif defined(__FreeBSD__)
char name[SPECNAMELEN];
if (!devname_r(makedev(maj, min), S_IFCHR, name, sizeof(name)))
@@ -2939,7 +2960,7 @@ static char *drmGetMinorNameForFD(int fd
closedir(sysdir);
return NULL;
-#elif __FreeBSD__
+#elif defined(__FreeBSD__)
struct stat sbuf;
char dname[SPECNAMELEN];
const char *mname;
@@ -3384,7 +3405,7 @@ static int drmParsePciBusInfo(int maj, i
info->func = pinfo.func;
return 0;
-#elif __FreeBSD__
+#elif defined(__FreeBSD__)
return get_sysctl_pci_bus_info(maj, min, info);
#else
#warning "Missing implementation of drmParsePciBusInfo"
@@ -3595,7 +3616,7 @@ out:
device->subdevice_id = pinfo.subdevice_id;
return 0;
-#elif __FreeBSD__
+#elif defined(__FreeBSD__)
drmPciBusInfo info;
struct pci_conf_io pc;
struct pci_match_conf patterns[1];
@@ -4172,7 +4193,7 @@ static void drmFoldDuplicatedDevices(drm
for (j = i + 1; j < count; j++) {
if (drmDevicesEqual(local_devices[i], local_devices[j])) {
local_devices[i]->available_nodes |= local_devices[j]->available_nodes;
- node_type = log2(local_devices[j]->available_nodes);
+ node_type = log2_int(local_devices[j]->available_nodes);
memcpy(local_devices[i]->nodes[node_type],
local_devices[j]->nodes[node_type], drmGetMaxNodeName());
drmFreeDevice(&local_devices[j]);
@@ -4427,6 +4448,10 @@ drm_public int drmGetDevices2(uint32_t f
}
closedir(sysdir);
+
+ if (devices != NULL)
+ return MIN2(device_count, max_devices);
+
return device_count;
}
@@ -4473,7 +4498,7 @@ drm_public char *drmGetDeviceNameFromFd2
free(value);
return strdup(path);
-#elif __FreeBSD__
+#elif defined(__FreeBSD__)
return drmGetDeviceNameFromFd(fd);
#else
struct stat sbuf;
Index: xsrc/external/mit/libdrm/dist/xf86drm.h
diff -u xsrc/external/mit/libdrm/dist/xf86drm.h:1.12 xsrc/external/mit/libdrm/dist/xf86drm.h:1.13
--- xsrc/external/mit/libdrm/dist/xf86drm.h:1.12 Sun Nov 1 09:57:37 2020
+++ xsrc/external/mit/libdrm/dist/xf86drm.h Tue Apr 27 03:02:37 2021
@@ -822,6 +822,24 @@ extern char *drmGetDeviceNameFromFd(int
extern char *drmGetDeviceNameFromFd2(int fd);
extern int drmGetNodeTypeFromFd(int fd);
+/* Convert between GEM handles and DMA-BUF file descriptors.
+ *
+ * Warning: since GEM handles are not reference-counted and are unique per
+ * DRM file description, the caller is expected to perform its own reference
+ * counting. drmPrimeFDToHandle is guaranteed to return the same handle for
+ * different FDs if they reference the same underlying buffer object. This
+ * could even be a buffer object originally created on the same DRM FD.
+ *
+ * When sharing a DRM FD with an API such as EGL or GBM, the caller must not
+ * use drmPrimeHandleToFD nor drmPrimeFDToHandle. A single user-space
+ * reference-counting implementation is necessary to avoid double-closing GEM
+ * handles.
+ *
+ * Two processes can't share the same DRM FD and both use it to create or
+ * import GEM handles, even when using a single user-space reference-counting
+ * implementation like GBM, because GBM doesn't share its state between
+ * processes.
+ */
extern int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd);
extern int drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle);
Index: xsrc/external/mit/libdrm/dist/xf86drmMode.c
diff -u xsrc/external/mit/libdrm/dist/xf86drmMode.c:1.16 xsrc/external/mit/libdrm/dist/xf86drmMode.c:1.17
--- xsrc/external/mit/libdrm/dist/xf86drmMode.c:1.16 Sun Nov 1 09:57:37 2020
+++ xsrc/external/mit/libdrm/dist/xf86drmMode.c Tue Apr 27 03:02:37 2021
@@ -33,11 +33,6 @@
*
*/
-/*
- * TODO the types we are after are defined in different headers on different
- * platforms find which headers to include to get uint32_t
- */
-
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
@@ -151,6 +146,16 @@ drm_public void drmModeFreeEncoder(drmMo
* ModeSetting functions.
*/
+drm_public int drmIsKMS(int fd)
+{
+ struct drm_mode_card_res res = {0};
+
+ if (drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res) != 0)
+ return 0;
+
+ return res.count_crtcs > 0 && res.count_connectors > 0 && res.count_encoders > 0;
+}
+
drm_public drmModeResPtr drmModeGetResources(int fd)
{
struct drm_mode_card_res res, counts;
@@ -284,8 +289,10 @@ drm_public int drmModeAddFB2WithModifier
memcpy(f.handles, bo_handles, 4 * sizeof(bo_handles[0]));
memcpy(f.pitches, pitches, 4 * sizeof(pitches[0]));
memcpy(f.offsets, offsets, 4 * sizeof(offsets[0]));
- if (modifier)
+ if (modifier) {
+ f.flags |= DRM_MODE_FB_MODIFIERS;
memcpy(f.modifier, modifier, 4 * sizeof(modifier[0]));
+ }
if ((ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_ADDFB2, &f)))
return ret;
Index: xsrc/external/mit/libdrm/dist/xf86drmMode.h
diff -u xsrc/external/mit/libdrm/dist/xf86drmMode.h:1.10 xsrc/external/mit/libdrm/dist/xf86drmMode.h:1.11
--- xsrc/external/mit/libdrm/dist/xf86drmMode.h:1.10 Sun Nov 1 09:57:37 2020
+++ xsrc/external/mit/libdrm/dist/xf86drmMode.h Tue Apr 27 03:02:37 2021
@@ -41,15 +41,13 @@ extern "C" {
#endif
#include <drm.h>
+#include <drm_mode.h>
#include <stddef.h>
#include <stdint.h>
/*
* This is the interface for modesetting for drm.
*
- * In order to use this interface you must include either <stdint.h> or another
- * header defining uint32_t, int32_t and uint16_t.
- *
* It aims to provide a randr1.2 compatible interface for modesettings in the
* kernel, the interface is also meant to be used by libraries like EGL.
*
@@ -62,121 +60,6 @@ extern "C" {
*/
/*
- * If we pickup an old version of drm.h which doesn't include drm_mode.h
- * we should redefine defines. This is so that builds doesn't breaks with
- * new libdrm on old kernels.
- */
-#ifndef _DRM_MODE_H
-
-#define DRM_DISPLAY_INFO_LEN 32
-#define DRM_CONNECTOR_NAME_LEN 32
-#define DRM_DISPLAY_MODE_LEN 32
-#define DRM_PROP_NAME_LEN 32
-
-#define DRM_MODE_TYPE_BUILTIN (1<<0)
-#define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN)
-#define DRM_MODE_TYPE_CRTC_C ((1<<2) | DRM_MODE_TYPE_BUILTIN)
-#define DRM_MODE_TYPE_PREFERRED (1<<3)
-#define DRM_MODE_TYPE_DEFAULT (1<<4)
-#define DRM_MODE_TYPE_USERDEF (1<<5)
-#define DRM_MODE_TYPE_DRIVER (1<<6)
-
-/* Video mode flags */
-/* bit compatible with the xorg definitions. */
-#define DRM_MODE_FLAG_PHSYNC (1<<0)
-#define DRM_MODE_FLAG_NHSYNC (1<<1)
-#define DRM_MODE_FLAG_PVSYNC (1<<2)
-#define DRM_MODE_FLAG_NVSYNC (1<<3)
-#define DRM_MODE_FLAG_INTERLACE (1<<4)
-#define DRM_MODE_FLAG_DBLSCAN (1<<5)
-#define DRM_MODE_FLAG_CSYNC (1<<6)
-#define DRM_MODE_FLAG_PCSYNC (1<<7)
-#define DRM_MODE_FLAG_NCSYNC (1<<8)
-#define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */
-#define DRM_MODE_FLAG_BCAST (1<<10)
-#define DRM_MODE_FLAG_PIXMUX (1<<11)
-#define DRM_MODE_FLAG_DBLCLK (1<<12)
-#define DRM_MODE_FLAG_CLKDIV2 (1<<13)
-#define DRM_MODE_FLAG_3D_MASK (0x1f<<14)
-#define DRM_MODE_FLAG_3D_NONE (0<<14)
-#define DRM_MODE_FLAG_3D_FRAME_PACKING (1<<14)
-#define DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE (2<<14)
-#define DRM_MODE_FLAG_3D_LINE_ALTERNATIVE (3<<14)
-#define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL (4<<14)
-#define DRM_MODE_FLAG_3D_L_DEPTH (5<<14)
-#define DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH (6<<14)
-#define DRM_MODE_FLAG_3D_TOP_AND_BOTTOM (7<<14)
-#define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF (8<<14)
-
-/* DPMS flags */
-/* bit compatible with the xorg definitions. */
-#define DRM_MODE_DPMS_ON 0
-#define DRM_MODE_DPMS_STANDBY 1
-#define DRM_MODE_DPMS_SUSPEND 2
-#define DRM_MODE_DPMS_OFF 3
-
-/* Scaling mode options */
-#define DRM_MODE_SCALE_NON_GPU 0
-#define DRM_MODE_SCALE_FULLSCREEN 1
-#define DRM_MODE_SCALE_NO_SCALE 2
-#define DRM_MODE_SCALE_ASPECT 3
-
-/* Dithering mode options */
-#define DRM_MODE_DITHERING_OFF 0
-#define DRM_MODE_DITHERING_ON 1
-
-#define DRM_MODE_ENCODER_NONE 0
-#define DRM_MODE_ENCODER_DAC 1
-#define DRM_MODE_ENCODER_TMDS 2
-#define DRM_MODE_ENCODER_LVDS 3
-#define DRM_MODE_ENCODER_TVDAC 4
-#define DRM_MODE_ENCODER_VIRTUAL 5
-#define DRM_MODE_ENCODER_DSI 6
-#define DRM_MODE_ENCODER_DPMST 7
-#define DRM_MODE_ENCODER_DPI 8
-
-#define DRM_MODE_SUBCONNECTOR_Automatic 0
-#define DRM_MODE_SUBCONNECTOR_Unknown 0
-#define DRM_MODE_SUBCONNECTOR_DVID 3
-#define DRM_MODE_SUBCONNECTOR_DVIA 4
-#define DRM_MODE_SUBCONNECTOR_Composite 5
-#define DRM_MODE_SUBCONNECTOR_SVIDEO 6
-#define DRM_MODE_SUBCONNECTOR_Component 8
-#define DRM_MODE_SUBCONNECTOR_SCART 9
-
-#define DRM_MODE_CONNECTOR_Unknown 0
-#define DRM_MODE_CONNECTOR_VGA 1
-#define DRM_MODE_CONNECTOR_DVII 2
-#define DRM_MODE_CONNECTOR_DVID 3
-#define DRM_MODE_CONNECTOR_DVIA 4
-#define DRM_MODE_CONNECTOR_Composite 5
-#define DRM_MODE_CONNECTOR_SVIDEO 6
-#define DRM_MODE_CONNECTOR_LVDS 7
-#define DRM_MODE_CONNECTOR_Component 8
-#define DRM_MODE_CONNECTOR_9PinDIN 9
-#define DRM_MODE_CONNECTOR_DisplayPort 10
-#define DRM_MODE_CONNECTOR_HDMIA 11
-#define DRM_MODE_CONNECTOR_HDMIB 12
-#define DRM_MODE_CONNECTOR_TV 13
-#define DRM_MODE_CONNECTOR_eDP 14
-#define DRM_MODE_CONNECTOR_VIRTUAL 15
-#define DRM_MODE_CONNECTOR_DSI 16
-#define DRM_MODE_CONNECTOR_DPI 17
-#define DRM_MODE_CONNECTOR_WRITEBACK 18
-
-#define DRM_MODE_PROP_PENDING (1<<0)
-#define DRM_MODE_PROP_RANGE (1<<1)
-#define DRM_MODE_PROP_IMMUTABLE (1<<2)
-#define DRM_MODE_PROP_ENUM (1<<3) /* enumerated type with text strings */
-#define DRM_MODE_PROP_BLOB (1<<4)
-
-#define DRM_MODE_CURSOR_BO (1<<0)
-#define DRM_MODE_CURSOR_MOVE (1<<1)
-
-#endif /* _DRM_MODE_H */
-
-
-/*
* Feature defines
*
* Just because these are defined doesn't mean that the kernel
@@ -268,6 +151,11 @@ static __inline int drm_property_type_is
return property->flags & type;
}
+static inline uint32_t drmModeGetPropertyType(const drmModePropertyRes *prop)
+{
+ return prop->flags & (DRM_MODE_PROP_LEGACY_TYPE | DRM_MODE_PROP_EXTENDED_TYPE);
+}
+
typedef struct _drmModeCrtc {
uint32_t crtc_id;
uint32_t buffer_id; /**< FB id to connect to 0 = disconnect */
@@ -289,6 +177,18 @@ typedef struct _drmModeEncoder {
uint32_t possible_clones;
} drmModeEncoder, *drmModeEncoderPtr;
+/**
+ * Describes the connector status.
+ *
+ * DRM_MODE_CONNECTED means that the connector has a sink plugged in.
+ * DRM_MODE_DISCONNECTED means the contrary. DRM_MODE_UNKNOWNCONNECTION is used
+ * when it could be either.
+ *
+ * User-space should first try to enable DRM_MODE_CONNECTED connectors and
+ * ignore other connectors. If there are no DRM_MODE_CONNECTED connectors,
+ * user-space should then try to probe and enable DRM_MODE_UNKNOWNCONNECTION
+ * connectors.
+ */
typedef enum {
DRM_MODE_CONNECTED = 1,
DRM_MODE_DISCONNECTED = 2,
@@ -365,6 +265,13 @@ extern void drmModeFreePlane( drmModePla
extern void drmModeFreePlaneResources(drmModePlaneResPtr ptr);
/**
+ * Check whether the DRM node supports Kernel Mode-Setting.
+ *
+ * Returns 1 if suitable for KMS, 0 otherwise.
+ */
+extern int drmIsKMS(int fd);
+
+/**
* Retrieves all of the resources associated with a card.
*/
extern drmModeResPtr drmModeGetResources(int fd);
@@ -548,14 +455,14 @@ extern int drmModeCreateLease(int fd, co
typedef struct drmModeLesseeList {
uint32_t count;
- uint32_t lessees[0];
+ uint32_t lessees[];
} drmModeLesseeListRes, *drmModeLesseeListPtr;
extern drmModeLesseeListPtr drmModeListLessees(int fd);
typedef struct drmModeObjectList {
uint32_t count;
- uint32_t objects[0];
+ uint32_t objects[];
} drmModeObjectListRes, *drmModeObjectListPtr;
extern drmModeObjectListPtr drmModeGetLease(int fd);
Index: xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c
diff -u xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c:1.19 xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c:1.20
--- xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c:1.19 Sun Nov 1 09:57:38 2020
+++ xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c Tue Apr 27 03:02:37 2021
@@ -1732,6 +1732,82 @@ drm_intel_gem_bo_unmap_gtt(drm_intel_bo
return drm_intel_gem_bo_unmap(bo);
}
+static bool is_cache_coherent(drm_intel_bo *bo)
+{
+ drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
+ drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
+ struct drm_i915_gem_caching arg = {};
+
+ arg.handle = bo_gem->gem_handle;
+ if (drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_GET_CACHING, &arg))
+ assert(false);
+ return arg.caching != I915_CACHING_NONE;
+}
+
+static void set_domain(drm_intel_bo *bo, uint32_t read, uint32_t write)
+{
+ drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
+ drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
+ struct drm_i915_gem_set_domain arg = {};
+
+ arg.handle = bo_gem->gem_handle;
+ arg.read_domains = read;
+ arg.write_domain = write;
+ if (drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &arg))
+ assert(false);
+}
+
+static int mmap_write(drm_intel_bo *bo, unsigned long offset,
+ unsigned long length, const void *buf)
+{
+ void *map = NULL;
+
+ if (!length)
+ return 0;
+
+ if (is_cache_coherent(bo)) {
+ map = drm_intel_gem_bo_map__cpu(bo);
+ if (map)
+ set_domain(bo, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
+ }
+ if (!map) {
+ map = drm_intel_gem_bo_map__wc(bo);
+ if (map)
+ set_domain(bo, I915_GEM_DOMAIN_WC, I915_GEM_DOMAIN_WC);
+ }
+
+ assert(map);
+ memcpy((char *)map + offset, buf, length);
+ drm_intel_gem_bo_unmap(bo);
+ return 0;
+}
+
+static int mmap_read(drm_intel_bo *bo, unsigned long offset,
+ unsigned long length, void *buf)
+{
+ drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
+ void *map = NULL;
+
+ if (!length)
+ return 0;
+
+ if (bufmgr_gem->has_llc || is_cache_coherent(bo)) {
+ map = drm_intel_gem_bo_map__cpu(bo);
+ if (map)
+ set_domain(bo, I915_GEM_DOMAIN_CPU, 0);
+ }
+ if (!map) {
+ map = drm_intel_gem_bo_map__wc(bo);
+ if (map)
+ set_domain(bo, I915_GEM_DOMAIN_WC, 0);
+ }
+
+ assert(map);
+ memcpy(buf, (char *)map + offset, length);
+ drm_intel_gem_bo_unmap(bo);
+ return 0;
+}
+
static int
drm_intel_gem_bo_subdata(drm_intel_bo *bo, unsigned long offset,
unsigned long size, const void *data)
@@ -1752,14 +1828,20 @@ drm_intel_gem_bo_subdata(drm_intel_bo *b
ret = drmIoctl(bufmgr_gem->fd,
DRM_IOCTL_I915_GEM_PWRITE,
&pwrite);
- if (ret != 0) {
+ if (ret)
ret = -errno;
+
+ if (ret != 0 && ret != -EOPNOTSUPP) {
DBG("%s:%d: Error writing data to buffer %d: (%d %d) %s .\n",
__FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
(int)size, strerror(errno));
+ return ret;
}
- return ret;
+ if (ret == -EOPNOTSUPP)
+ mmap_write(bo, offset, size, data);
+
+ return 0;
}
static int
@@ -1807,14 +1889,20 @@ drm_intel_gem_bo_get_subdata(drm_intel_b
ret = drmIoctl(bufmgr_gem->fd,
DRM_IOCTL_I915_GEM_PREAD,
&pread);
- if (ret != 0) {
+ if (ret)
ret = -errno;
+
+ if (ret != 0 && ret != -EOPNOTSUPP) {
DBG("%s:%d: Error reading data from buffer %d: (%d %d) %s .\n",
__FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
(int)size, strerror(errno));
+ return ret;
}
- return ret;
+ if (ret == -EOPNOTSUPP)
+ mmap_read(bo, offset, size, data);
+
+ return 0;
}
/** Waits for all GPU rendering with the object to have completed. */
Index: xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c
diff -u xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c:1.14 xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c:1.15
--- xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c:1.14 Sun Nov 1 09:57:40 2020
+++ xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c Tue Apr 27 03:02:37 2021
@@ -457,7 +457,7 @@ static void dump_connectors(struct devic
if (connector->count_modes) {
printf(" modes:\n");
printf("\tindex name refresh (Hz) hdisp hss hse htot vdisp "
- "vss vse vtot)\n");
+ "vss vse vtot\n");
for (j = 0; j < connector->count_modes; j++)
dump_mode(&connector->modes[j], j);
}