Module Name: xsrc Committed By: mrg Date: Sun Jan 9 09:05:35 UTC 2022
Modified Files: xsrc/external/mit/libXi/dist/src: XIPassiveGrab.c xsrc/external/mit/libdrm/dist: xf86drm.c xf86drm.h xf86drmMode.c xf86drmMode.h xsrc/external/mit/libdrm/dist/amdgpu: amdgpu.h amdgpu_bo.c xsrc/external/mit/libdrm/dist/include/drm: drm.h xsrc/external/mit/libdrm/dist/intel: intel_bufmgr_gem.c xsrc/external/mit/libdrm/dist/radeon: radeon_bo_gem.c xsrc/external/mit/libdrm/dist/tests/modetest: modetest.c xsrc/external/mit/libdrm/include: generated_static_table_fourcc.h Log Message: merge libXi 1.8 and libdrm 2.4.109. updated generated_static_table_fourcc.h generated with: python3.9 gen_table_fourcc.py include/drm/drm_fourcc.h ../include/generated_static_table_fourcc.h To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 xsrc/external/mit/libXi/dist/src/XIPassiveGrab.c cvs rdiff -u -r1.29 -r1.30 xsrc/external/mit/libdrm/dist/xf86drm.c cvs rdiff -u -r1.14 -r1.15 xsrc/external/mit/libdrm/dist/xf86drm.h cvs rdiff -u -r1.18 -r1.19 xsrc/external/mit/libdrm/dist/xf86drmMode.c cvs rdiff -u -r1.11 -r1.12 xsrc/external/mit/libdrm/dist/xf86drmMode.h cvs rdiff -u -r1.2 -r1.3 xsrc/external/mit/libdrm/dist/amdgpu/amdgpu.h cvs rdiff -u -r1.4 -r1.5 xsrc/external/mit/libdrm/dist/amdgpu/amdgpu_bo.c cvs rdiff -u -r1.13 -r1.14 xsrc/external/mit/libdrm/dist/include/drm/drm.h cvs rdiff -u -r1.20 -r1.21 \ xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c cvs rdiff -u -r1.9 -r1.10 \ xsrc/external/mit/libdrm/dist/radeon/radeon_bo_gem.c cvs rdiff -u -r1.16 -r1.17 \ xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c cvs rdiff -u -r1.1 -r1.2 \ xsrc/external/mit/libdrm/include/generated_static_table_fourcc.h 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/libXi/dist/src/XIPassiveGrab.c diff -u xsrc/external/mit/libXi/dist/src/XIPassiveGrab.c:1.6 xsrc/external/mit/libXi/dist/src/XIPassiveGrab.c:1.7 --- xsrc/external/mit/libXi/dist/src/XIPassiveGrab.c:1.6 Mon Jul 8 22:59:17 2019 +++ xsrc/external/mit/libXi/dist/src/XIPassiveGrab.c Sun Jan 9 09:05:34 2022 @@ -177,6 +177,37 @@ XIGrabTouchBegin(Display *dpy, int devic num_modifiers, modifiers_inout, CurrentTime); } +int XIGrabPinchGestureBegin(Display* dpy, int deviceid, Window grab_window, int grab_mode, + int paired_device_mode, int owner_events, + XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout) +{ + XExtDisplayInfo *extinfo = XInput_find_display(dpy); + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_2_4, extinfo) == -1) + return -1; + UnlockDisplay(dpy); + + return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeGesturePinchBegin, 0, + grab_window, None, grab_mode, paired_device_mode, + owner_events, mask, num_modifiers, modifiers_inout, CurrentTime); +} + +int XIGrabSwipeGestureBegin(Display* dpy, int deviceid, Window grab_window, int grab_mode, + int paired_device_mode, int owner_events, + XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout) +{ + XExtDisplayInfo *extinfo = XInput_find_display(dpy); + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_2_4, extinfo) == -1) + return -1; + UnlockDisplay(dpy); + + return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeGestureSwipeBegin, 0, + grab_window, None, grab_mode, paired_device_mode, + owner_events, mask, num_modifiers, modifiers_inout, CurrentTime); +} static int _XIPassiveUngrabDevice(Display* dpy, int deviceid, int grabtype, int detail, @@ -256,3 +287,31 @@ XIUngrabTouchBegin(Display* display, int return _XIPassiveUngrabDevice(display, deviceid, XIGrabtypeTouchBegin, 0, grab_window, num_modifiers, modifiers); } + +int XIUngrabPinchGestureBegin(Display* display, int deviceid, Window grab_window, + int num_modifiers, XIGrabModifiers *modifiers) +{ + XExtDisplayInfo *extinfo = XInput_find_display(display); + + LockDisplay(display); + if (_XiCheckExtInit(display, XInput_2_4, extinfo) == -1) + return -1; + UnlockDisplay(display); + + return _XIPassiveUngrabDevice(display, deviceid, XIGrabtypeGesturePinchBegin, 0, + grab_window, num_modifiers, modifiers); +} + +int XIUngrabSwipeGestureBegin(Display* display, int deviceid, Window grab_window, + int num_modifiers, XIGrabModifiers *modifiers) +{ + XExtDisplayInfo *extinfo = XInput_find_display(display); + + LockDisplay(display); + if (_XiCheckExtInit(display, XInput_2_4, extinfo) == -1) + return -1; + UnlockDisplay(display); + + return _XIPassiveUngrabDevice(display, deviceid, XIGrabtypeGestureSwipeBegin, 0, + grab_window, num_modifiers, modifiers); +} Index: xsrc/external/mit/libdrm/dist/xf86drm.c diff -u xsrc/external/mit/libdrm/dist/xf86drm.c:1.29 xsrc/external/mit/libdrm/dist/xf86drm.c:1.30 --- xsrc/external/mit/libdrm/dist/xf86drm.c:1.29 Sun Jul 11 00:31:53 2021 +++ xsrc/external/mit/libdrm/dist/xf86drm.c Sun Jan 9 09:05:34 2022 @@ -214,30 +214,16 @@ static bool is_x_t_amd_gfx9_tile(uint64_ return false; } -static char * -drmGetFormatModifierNameFromArm(uint64_t modifier) +static bool +drmGetAfbcFormatModifierNameFromArm(uint64_t modifier, FILE *fp) { - uint64_t type = (modifier >> 52) & 0xf; uint64_t mode_value = modifier & AFBC_FORMAT_MOD_MODE_VALUE_MASK; uint64_t block_size = mode_value & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK; - FILE *fp; - char *modifier_name = NULL; - size_t size = 0; - unsigned int i; - const char *block = NULL; const char *mode = NULL; bool did_print_mode = false; - /* misc type is already handled by the static table */ - if (type != DRM_FORMAT_MOD_ARM_TYPE_AFBC) - return NULL; - - fp = open_memstream(&modifier_name, &size); - if (!fp) - return NULL; - /* add block, can only have a (single) block */ switch (block_size) { case AFBC_FORMAT_MOD_BLOCK_SIZE_16x16: @@ -255,15 +241,13 @@ drmGetFormatModifierNameFromArm(uint64_t } if (!block) { - fclose(fp); - free(modifier_name); - return NULL; + return false; } fprintf(fp, "BLOCK_SIZE=%s,", block); /* add mode */ - for (i = 0; i < ARRAY_SIZE(arm_mode_value_table); i++) { + for (unsigned int i = 0; i < ARRAY_SIZE(arm_mode_value_table); i++) { if (arm_mode_value_table[i].modifier & mode_value) { mode = arm_mode_value_table[i].modifier_name; if (!did_print_mode) { @@ -275,7 +259,87 @@ drmGetFormatModifierNameFromArm(uint64_t } } + return true; +} + +static bool +drmGetAfrcFormatModifierNameFromArm(uint64_t modifier, FILE *fp) +{ + for (unsigned int i = 0; i < 2; ++i) { + uint64_t coding_unit_block = + (modifier >> (i * 4)) & AFRC_FORMAT_MOD_CU_SIZE_MASK; + const char *coding_unit_size = NULL; + + switch (coding_unit_block) { + case AFRC_FORMAT_MOD_CU_SIZE_16: + coding_unit_size = "CU_16"; + break; + case AFRC_FORMAT_MOD_CU_SIZE_24: + coding_unit_size = "CU_24"; + break; + case AFRC_FORMAT_MOD_CU_SIZE_32: + coding_unit_size = "CU_32"; + break; + } + + if (!coding_unit_size) { + if (i == 0) { + return false; + } + break; + } + + if (i == 0) { + fprintf(fp, "P0=%s,", coding_unit_size); + } else { + fprintf(fp, "P12=%s,", coding_unit_size); + } + } + + bool scan_layout = + (modifier & AFRC_FORMAT_MOD_LAYOUT_SCAN) == AFRC_FORMAT_MOD_LAYOUT_SCAN; + if (scan_layout) { + fprintf(fp, "SCAN"); + } else { + fprintf(fp, "ROT"); + } + return true; +} + +static char * +drmGetFormatModifierNameFromArm(uint64_t modifier) +{ + uint64_t type = (modifier >> 52) & 0xf; + + FILE *fp; + size_t size = 0; + char *modifier_name = NULL; + bool result = false; + + fp = open_memstream(&modifier_name, &size); + if (!fp) + return NULL; + + switch (type) { + case DRM_FORMAT_MOD_ARM_TYPE_AFBC: + result = drmGetAfbcFormatModifierNameFromArm(modifier, fp); + break; + case DRM_FORMAT_MOD_ARM_TYPE_AFRC: + result = drmGetAfrcFormatModifierNameFromArm(modifier, fp); + break; + /* misc type is already handled by the static table */ + case DRM_FORMAT_MOD_ARM_TYPE_MISC: + default: + result = false; + break; + } + fclose(fp); + if (!result) { + free(modifier_name); + return NULL; + } + return modifier_name; } @@ -1499,8 +1563,8 @@ drm_public int drmAddMap(int fd, drm_han memclear(map); map.offset = offset; map.size = size; - map.type = type; - map.flags = flags; + map.type = (enum drm_map_type)type; + map.flags = (enum drm_map_flags)flags; if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno; if (handle) @@ -1544,7 +1608,7 @@ drm_public int drmAddBufs(int fd, int co memclear(request); request.count = count; request.size = size; - request.flags = flags; + request.flags = (int)flags; request.agp_start = agp_offset; if (drmIoctl(fd, DRM_IOCTL_ADD_BUFS, &request)) @@ -1828,7 +1892,7 @@ drm_public int drmDMA(int fd, drmDMAReqP dma.send_count = request->send_count; dma.send_indices = request->send_list; dma.send_sizes = request->send_sizes; - dma.flags = request->flags; + dma.flags = (enum drm_dma_flags)request->flags; dma.request_count = request->request_count; dma.request_size = request->request_size; dma.request_indices = request->request_list; @@ -2765,8 +2829,8 @@ drm_public int drmGetMap(int fd, int idx return -errno; *offset = map.offset; *size = map.size; - *type = map.type; - *flags = map.flags; + *type = (drmMapType)map.type; + *flags = (drmMapFlags)map.flags; *handle = (unsigned long)map.handle; *mtrr = map.mtrr; return 0; @@ -3275,6 +3339,15 @@ drm_public int drmPrimeFDToHandle(int fd return 0; } +drm_public int drmCloseBufferHandle(int fd, uint32_t handle) +{ + struct drm_gem_close args; + + memclear(args); + args.handle = handle; + return drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &args); +} + static char *drmGetMinorNameForFD(int fd, int type) { #ifdef __linux__ @@ -3308,8 +3381,9 @@ static char *drmGetMinorNameForFD(int fd while ((ent = readdir(sysdir))) { if (strncmp(ent->d_name, name, len) == 0) { - snprintf(dev_name, sizeof(dev_name), DRM_DIR_NAME "/%s", - ent->d_name); + if (snprintf(dev_name, sizeof(dev_name), DRM_DIR_NAME "/%s", + ent->d_name) < 0) + return NULL; closedir(sysdir); return strdup(dev_name); @@ -3845,7 +3919,9 @@ static int parse_separate_sysfs_files(in get_pci_path(maj, min, pci_path); for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) { - snprintf(path, PATH_MAX, "%s/%s", pci_path, attrs[i]); + if (snprintf(path, PATH_MAX, "%s/%s", pci_path, attrs[i]) < 0) + return -errno; + fp = fopen(path, "r"); if (!fp) return -errno; @@ -3875,7 +3951,9 @@ static int parse_config_sysfs_file(int m get_pci_path(maj, min, pci_path); - snprintf(path, PATH_MAX, "%s/config", pci_path); + if (snprintf(path, PATH_MAX, "%s/config", pci_path) < 0) + return -errno; + fd = open(path, O_RDONLY); if (fd < 0) return -errno; @@ -4169,6 +4247,7 @@ free_device: static int drm_usb_dev_path(int maj, int min, char *path, size_t len) { char *value, *tmp_path, *slash; + bool usb_device, usb_interface; snprintf(path, len, "/sys/dev/char/%d:%d/device", maj, min); @@ -4176,9 +4255,13 @@ static int drm_usb_dev_path(int maj, int if (!value) return -ENOENT; - if (strcmp(value, "usb_device") == 0) + usb_device = strcmp(value, "usb_device") == 0; + usb_interface = strcmp(value, "usb_interface") == 0; + free(value); + + if (usb_device) return 0; - if (strcmp(value, "usb_interface") != 0) + if (!usb_interface) return -ENOTSUP; /* The parent of a usb_interface is a usb_device */ @@ -4590,19 +4673,16 @@ drm_device_has_rdev(drmDevicePtr device, #define MAX_DRM_NODES 256 /** - * Get information about the opened drm device + * Get information about a device from its dev_t identifier * - * \param fd file descriptor of the drm device + * \param find_rdev dev_t identifier of the device * \param flags feature/behaviour bitmask * \param device the address of a drmDevicePtr where the information * will be allocated in stored * * \return zero on success, negative error code otherwise. - * - * \note Unlike drmGetDevice it does not retrieve the pci device revision field - * unless the DRM_DEVICE_GET_PCI_REVISION \p flag is set. */ -drm_public int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device) +drm_public int drmGetDeviceFromDevId(dev_t find_rdev, uint32_t flags, drmDevicePtr *device) { #ifdef __OpenBSD__ /* @@ -4611,22 +4691,18 @@ drm_public int drmGetDevice2(int fd, uin * Avoid stat'ing all of /dev needlessly by implementing this custom path. */ drmDevicePtr d; - struct stat sbuf; char node[PATH_MAX + 1]; const char *dev_name; int node_type, subsystem_type; int maj, min, n, ret; - if (fd == -1 || device == NULL) + if (device == NULL) return -EINVAL; - if (fstat(fd, &sbuf)) - return -errno; - - maj = major(sbuf.st_rdev); - min = minor(sbuf.st_rdev); + maj = major(find_rdev); + min = minor(find_rdev); - if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode)) + if (!drmNodeIsDRM(maj, min)) return -EINVAL; node_type = drmGetMinorType(maj, min); @@ -4659,26 +4735,20 @@ drm_public int drmGetDevice2(int fd, uin drmDevicePtr d; DIR *sysdir; struct dirent *dent; - struct stat sbuf; int subsystem_type; int maj, min; int ret, i, node_count; - dev_t find_rdev; if (drm_device_validate_flags(flags)) return -EINVAL; - if (fd == -1 || device == NULL) + if (device == NULL) return -EINVAL; - if (fstat(fd, &sbuf)) - return -errno; - - find_rdev = sbuf.st_rdev; - maj = major(sbuf.st_rdev); - min = minor(sbuf.st_rdev); + maj = major(find_rdev); + min = minor(find_rdev); - if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode)) + if (!drmNodeIsDRM(maj, min)) return -EINVAL; subsystem_type = drmParseSubsystemType(maj, min); @@ -4731,6 +4801,35 @@ drm_public int drmGetDevice2(int fd, uin * Get information about the opened drm device * * \param fd file descriptor of the drm device + * \param flags feature/behaviour bitmask + * \param device the address of a drmDevicePtr where the information + * will be allocated in stored + * + * \return zero on success, negative error code otherwise. + * + * \note Unlike drmGetDevice it does not retrieve the pci device revision field + * unless the DRM_DEVICE_GET_PCI_REVISION \p flag is set. + */ +drm_public int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device) +{ + struct stat sbuf; + + if (fd == -1) + return -EINVAL; + + if (fstat(fd, &sbuf)) + return -errno; + + if (!S_ISCHR(sbuf.st_mode)) + return -EINVAL; + + return drmGetDeviceFromDevId(sbuf.st_rdev, flags, device); +} + +/** + * Get information about the opened drm device + * + * \param fd file descriptor of the drm device * \param device the address of a drmDevicePtr where the information * will be allocated in stored * Index: xsrc/external/mit/libdrm/dist/xf86drm.h diff -u xsrc/external/mit/libdrm/dist/xf86drm.h:1.14 xsrc/external/mit/libdrm/dist/xf86drm.h:1.15 --- xsrc/external/mit/libdrm/dist/xf86drm.h:1.14 Sun Jul 11 00:31:53 2021 +++ xsrc/external/mit/libdrm/dist/xf86drm.h Sun Jan 9 09:05:34 2022 @@ -843,6 +843,8 @@ extern int drmGetNodeTypeFromFd(int fd); 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); +extern int drmCloseBufferHandle(int fd, uint32_t handle); + extern char *drmGetPrimaryDeviceNameFromFd(int fd); extern char *drmGetRenderDeviceNameFromFd(int fd); @@ -924,6 +926,8 @@ extern void drmFreeDevices(drmDevicePtr extern int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device); extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices); +extern int drmGetDeviceFromDevId(dev_t dev_id, uint32_t flags, drmDevicePtr *device); + extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b); extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle); Index: xsrc/external/mit/libdrm/dist/xf86drmMode.c diff -u xsrc/external/mit/libdrm/dist/xf86drmMode.c:1.18 xsrc/external/mit/libdrm/dist/xf86drmMode.c:1.19 --- xsrc/external/mit/libdrm/dist/xf86drmMode.c:1.18 Sun Jul 11 00:31:53 2021 +++ xsrc/external/mit/libdrm/dist/xf86drmMode.c Sun Jan 9 09:05:34 2022 @@ -33,6 +33,7 @@ * */ +#include <assert.h> #include <limits.h> #include <stdint.h> #include <stdlib.h> @@ -50,6 +51,7 @@ #include "xf86drmMode.h" #include "xf86drm.h" #include <drm.h> +#include <drm_fourcc.h> #include <string.h> #include <dirent.h> #include <unistd.h> @@ -727,6 +729,112 @@ err_allocs: return r; } +static inline const uint32_t * +get_formats_ptr(const struct drm_format_modifier_blob *blob) +{ + return (const uint32_t *)(((uint8_t *)blob) + blob->formats_offset); +} + +static inline const struct drm_format_modifier * +get_modifiers_ptr(const struct drm_format_modifier_blob *blob) +{ + return (const struct drm_format_modifier *)(((uint8_t *)blob) + + blob->modifiers_offset); +} + +static bool _drmModeFormatModifierGetNext(const drmModePropertyBlobRes *blob, + drmModeFormatModifierIterator *iter) +{ + const struct drm_format_modifier *blob_modifiers, *mod; + const struct drm_format_modifier_blob *fmt_mod_blob; + const uint32_t *blob_formats; + + assert(blob && iter); + + fmt_mod_blob = blob->data; + blob_modifiers = get_modifiers_ptr(fmt_mod_blob); + blob_formats = get_formats_ptr(fmt_mod_blob); + + /* fmt_idx and mod_idx designate the number of processed formats + * and modifiers. + */ + if (iter->fmt_idx >= fmt_mod_blob->count_formats || + iter->mod_idx >= fmt_mod_blob->count_modifiers) + return false; + + iter->fmt = blob_formats[iter->fmt_idx]; + iter->mod = DRM_FORMAT_MOD_INVALID; + + /* From the latest valid found, get the next valid modifier */ + while (iter->mod_idx < fmt_mod_blob->count_modifiers) { + mod = &blob_modifiers[iter->mod_idx++]; + + /* Check if the format that fmt_idx designates, belongs to + * this modifier 64-bit window selected via mod->offset. + */ + if (iter->fmt_idx < mod->offset || + iter->fmt_idx >= mod->offset + 64) + continue; + if (!(mod->formats & (1 << (iter->fmt_idx - mod->offset)))) + continue; + + iter->mod = mod->modifier; + break; + } + + if (iter->mod_idx == fmt_mod_blob->count_modifiers) { + iter->mod_idx = 0; + iter->fmt_idx++; + } + + /* Since mod_idx reset, in order for the caller to iterate over + * the last modifier of the last format, always return true here + * and early return from the next call. + */ + return true; +} + +/** + * Iterate over formats first and then over modifiers. On each call, iter->fmt + * is retained until all associated modifiers are returned. Then, either update + * iter->fmt with the next format, or exit if there aren't any left. + * + * NOTE: clients should not make any assumption on mod_idx and fmt_idx values + * + * @blob: valid kernel blob holding formats and modifiers + * @iter: input and output iterator data. Iter data must be initialised to zero + * @return: false, on error or there aren't any further formats or modifiers left. + * true, on success and there are more formats or modifiers. + */ +drm_public bool drmModeFormatModifierBlobIterNext(const drmModePropertyBlobRes *blob, + drmModeFormatModifierIterator *iter) +{ + drmModeFormatModifierIterator tmp; + bool has_fmt; + + if (!blob || !iter) + return false; + + tmp.fmt_idx = iter->fmt_idx; + tmp.mod_idx = iter->mod_idx; + + /* With the current state of things, DRM/KMS drivers are allowed to + * construct blobs having formats and no modifiers. Userspace can't + * legitimately abort in such cases. + * + * While waiting for the kernel to perhaps disallow formats with no + * modifiers in IN_FORMATS blobs, skip the format altogether. + */ + do { + has_fmt = _drmModeFormatModifierGetNext(blob, &tmp); + if (has_fmt && tmp.mod != DRM_FORMAT_MOD_INVALID) + *iter = tmp; + + } while (has_fmt && tmp.mod == DRM_FORMAT_MOD_INVALID); + + return has_fmt; +} + drm_public void drmModeFreePropertyBlob(drmModePropertyBlobPtr ptr) { if (!ptr) Index: xsrc/external/mit/libdrm/dist/xf86drmMode.h diff -u xsrc/external/mit/libdrm/dist/xf86drmMode.h:1.11 xsrc/external/mit/libdrm/dist/xf86drmMode.h:1.12 --- xsrc/external/mit/libdrm/dist/xf86drmMode.h:1.11 Tue Apr 27 03:02:37 2021 +++ xsrc/external/mit/libdrm/dist/xf86drmMode.h Sun Jan 9 09:05:34 2022 @@ -42,6 +42,7 @@ extern "C" { #include <drm.h> #include <drm_mode.h> +#include <stdbool.h> #include <stddef.h> #include <stdint.h> @@ -142,18 +143,15 @@ typedef struct _drmModeProperty { uint32_t *blob_ids; /* store the blob IDs */ } drmModePropertyRes, *drmModePropertyPtr; -static __inline int drm_property_type_is(drmModePropertyPtr property, - uint32_t type) +static inline uint32_t drmModeGetPropertyType(const drmModePropertyRes *prop) { - /* instanceof for props.. handles extended type vs original types: */ - if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) - return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type; - return property->flags & type; + return prop->flags & (DRM_MODE_PROP_LEGACY_TYPE | DRM_MODE_PROP_EXTENDED_TYPE); } -static inline uint32_t drmModeGetPropertyType(const drmModePropertyRes *prop) +static inline int drm_property_type_is(const drmModePropertyPtr property, + uint32_t type) { - return prop->flags & (DRM_MODE_PROP_LEGACY_TYPE | DRM_MODE_PROP_EXTENDED_TYPE); + return drmModeGetPropertyType(property) == type; } typedef struct _drmModeCrtc { @@ -234,6 +232,12 @@ typedef struct _drmModeObjectProperties uint64_t *prop_values; } drmModeObjectProperties, *drmModeObjectPropertiesPtr; +typedef struct _drmModeFormatModifierIterator { + uint32_t fmt_idx, mod_idx; + uint32_t fmt; + uint64_t mod; +} drmModeFormatModifierIterator; + typedef struct _drmModePlane { uint32_t count_formats; uint32_t *formats; @@ -391,6 +395,8 @@ extern drmModePropertyPtr drmModeGetProp extern void drmModeFreeProperty(drmModePropertyPtr ptr); extern drmModePropertyBlobPtr drmModeGetPropertyBlob(int fd, uint32_t blob_id); +extern bool drmModeFormatModifierBlobIterNext(const drmModePropertyBlobRes *blob, + drmModeFormatModifierIterator *iter); extern void drmModeFreePropertyBlob(drmModePropertyBlobPtr ptr); extern int drmModeConnectorSetProperty(int fd, uint32_t connector_id, uint32_t property_id, uint64_t value); Index: xsrc/external/mit/libdrm/dist/amdgpu/amdgpu.h diff -u xsrc/external/mit/libdrm/dist/amdgpu/amdgpu.h:1.2 xsrc/external/mit/libdrm/dist/amdgpu/amdgpu.h:1.3 --- xsrc/external/mit/libdrm/dist/amdgpu/amdgpu.h:1.2 Tue Dec 14 14:43:43 2021 +++ xsrc/external/mit/libdrm/dist/amdgpu/amdgpu.h Sun Jan 9 09:05:34 2022 @@ -549,6 +549,19 @@ int amdgpu_device_initialize(int fd, */ int amdgpu_device_deinitialize(amdgpu_device_handle device_handle); +/** + * + * /param device_handle - \c [in] Device handle. + * See #amdgpu_device_initialize() + * + * \return Returns the drm fd used for operations on this + * device. This is still owned by the library and hence + * should not be closed. Guaranteed to be valid until + * #amdgpu_device_deinitialize gets called. + * +*/ +int amdgpu_device_get_fd(amdgpu_device_handle device_handle); + /* * Memory Management * Index: xsrc/external/mit/libdrm/dist/amdgpu/amdgpu_bo.c diff -u xsrc/external/mit/libdrm/dist/amdgpu/amdgpu_bo.c:1.4 xsrc/external/mit/libdrm/dist/amdgpu/amdgpu_bo.c:1.5 --- xsrc/external/mit/libdrm/dist/amdgpu/amdgpu_bo.c:1.4 Mon Jul 15 05:42:34 2019 +++ xsrc/external/mit/libdrm/dist/amdgpu/amdgpu_bo.c Sun Jan 9 09:05:34 2022 @@ -39,14 +39,6 @@ #include "amdgpu_internal.h" #include "util_math.h" -static int amdgpu_close_kms_handle(int fd, uint32_t handle) -{ - struct drm_gem_close args = {}; - - args.handle = handle; - return drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &args); -} - static int amdgpu_bo_create(amdgpu_device_handle dev, uint64_t size, uint32_t handle, @@ -101,7 +93,7 @@ drm_public int amdgpu_bo_alloc(amdgpu_de buf_handle); pthread_mutex_unlock(&dev->bo_table_mutex); if (r) { - amdgpu_close_kms_handle(dev->fd, args.out.handle); + drmCloseBufferHandle(dev->fd, args.out.handle); } out: @@ -216,7 +208,7 @@ static int amdgpu_bo_export_flink(amdgpu bo->flink_name = flink.name; if (bo->dev->flink_fd != bo->dev->fd) - amdgpu_close_kms_handle(bo->dev->flink_fd, handle); + drmCloseBufferHandle(bo->dev->flink_fd, handle); pthread_mutex_lock(&bo->dev->bo_table_mutex); r = handle_table_insert(&bo->dev->bo_flink_names, bo->flink_name, bo); @@ -342,8 +334,8 @@ drm_public int amdgpu_bo_import(amdgpu_d close(dma_fd); if (r) goto free_bo_handle; - r = amdgpu_close_kms_handle(dev->flink_fd, - open_arg.handle); + r = drmCloseBufferHandle(dev->flink_fd, + open_arg.handle); if (r) goto free_bo_handle; } @@ -381,12 +373,12 @@ drm_public int amdgpu_bo_import(amdgpu_d free_bo_handle: if (flink_name && open_arg.handle) - amdgpu_close_kms_handle(dev->flink_fd, open_arg.handle); + drmCloseBufferHandle(dev->flink_fd, open_arg.handle); if (bo) amdgpu_bo_free(bo); else - amdgpu_close_kms_handle(dev->fd, handle); + drmCloseBufferHandle(dev->fd, handle); unlock: pthread_mutex_unlock(&dev->bo_table_mutex); return r; @@ -415,7 +407,7 @@ drm_public int amdgpu_bo_free(amdgpu_bo_ amdgpu_bo_cpu_unmap(bo); } - amdgpu_close_kms_handle(dev->fd, bo->handle); + drmCloseBufferHandle(dev->fd, bo->handle); pthread_mutex_destroy(&bo->cpu_access_mutex); free(bo); } @@ -598,7 +590,7 @@ drm_public int amdgpu_create_bo_from_use r = amdgpu_bo_create(dev, size, args.handle, buf_handle); pthread_mutex_unlock(&dev->bo_table_mutex); if (r) { - amdgpu_close_kms_handle(dev->fd, args.handle); + drmCloseBufferHandle(dev->fd, args.handle); } out: Index: xsrc/external/mit/libdrm/dist/include/drm/drm.h diff -u xsrc/external/mit/libdrm/dist/include/drm/drm.h:1.13 xsrc/external/mit/libdrm/dist/include/drm/drm.h:1.14 --- xsrc/external/mit/libdrm/dist/include/drm/drm.h:1.13 Sun Nov 1 09:57:38 2020 +++ xsrc/external/mit/libdrm/dist/include/drm/drm.h Sun Jan 9 09:05:35 2022 @@ -1,11 +1,10 @@ -/** - * \file drm.h +/* * Header for the Direct Rendering Manager * - * \author Rickard E. (Rik) Faith <fa...@valinux.com> + * Author: Rickard E. (Rik) Faith <fa...@valinux.com> * - * \par Acknowledgments: - * Dec 1999, Richard Henderson <r...@twiddle.net>, move to generic \c cmpxchg. + * Acknowledgments: + * Dec 1999, Richard Henderson <r...@twiddle.net>, move to generic cmpxchg. */ /* @@ -82,7 +81,7 @@ typedef unsigned int drm_context_t; typedef unsigned int drm_drawable_t; typedef unsigned int drm_magic_t; -/** +/* * Cliprect. * * \warning: If you change this structure, make sure you change @@ -98,7 +97,7 @@ struct drm_clip_rect { unsigned short y2; }; -/** +/* * Drawable information. */ struct drm_drawable_info { @@ -106,7 +105,7 @@ struct drm_drawable_info { struct drm_clip_rect *rects; }; -/** +/* * Texture region, */ struct drm_tex_region { @@ -117,7 +116,7 @@ struct drm_tex_region { unsigned int age; }; -/** +/* * Hardware lock. * * The lock structure is a simple cache-line aligned integer. To avoid @@ -129,7 +128,7 @@ struct drm_hw_lock { char padding[60]; /**< Pad to cache line */ }; -/** +/* * DRM_IOCTL_VERSION ioctl argument type. * * \sa drmGetVersion(). @@ -146,7 +145,7 @@ struct drm_version { char *desc; /**< User-space buffer to hold desc */ }; -/** +/* * DRM_IOCTL_GET_UNIQUE ioctl argument type. * * \sa drmGetBusid() and drmSetBusId(). @@ -165,7 +164,7 @@ struct drm_block { int unused; }; -/** +/* * DRM_IOCTL_CONTROL ioctl argument type. * * \sa drmCtlInstHandler() and drmCtlUninstHandler(). @@ -180,7 +179,7 @@ struct drm_control { int irq; }; -/** +/* * Type of memory to map. */ enum drm_map_type { @@ -192,7 +191,7 @@ enum drm_map_type { _DRM_CONSISTENT = 5 /**< Consistent memory for PCI DMA */ }; -/** +/* * Memory mapping flags. */ enum drm_map_flags { @@ -211,7 +210,7 @@ struct drm_ctx_priv_map { void *handle; /**< Handle of map */ }; -/** +/* * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls * argument type. * @@ -228,7 +227,7 @@ struct drm_map { /* Private data */ }; -/** +/* * DRM_IOCTL_GET_CLIENT ioctl argument type. */ struct drm_client { @@ -260,7 +259,7 @@ enum drm_stat_type { /* Add to the *END* of the list */ }; -/** +/* * DRM_IOCTL_GET_STATS ioctl argument type. */ struct drm_stats { @@ -271,7 +270,7 @@ struct drm_stats { } data[15]; }; -/** +/* * Hardware locking flags. */ enum drm_lock_flags { @@ -286,7 +285,7 @@ enum drm_lock_flags { _DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */ }; -/** +/* * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type. * * \sa drmGetLock() and drmUnlock(). @@ -296,7 +295,7 @@ struct drm_lock { enum drm_lock_flags flags; }; -/** +/* * DMA flags * * \warning @@ -325,7 +324,7 @@ enum drm_dma_flags { _DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */ }; -/** +/* * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type. * * \sa drmAddBufs(). @@ -348,7 +347,7 @@ struct drm_buf_desc { */ }; -/** +/* * DRM_IOCTL_INFO_BUFS ioctl argument type. */ struct drm_buf_info { @@ -356,7 +355,7 @@ struct drm_buf_info { struct drm_buf_desc *list; }; -/** +/* * DRM_IOCTL_FREE_BUFS ioctl argument type. */ struct drm_buf_free { @@ -364,7 +363,7 @@ struct drm_buf_free { int *list; }; -/** +/* * Buffer information * * \sa drm_buf_map. @@ -376,7 +375,7 @@ struct drm_buf_pub { void *address; /**< Address of buffer */ }; -/** +/* * DRM_IOCTL_MAP_BUFS ioctl argument type. */ struct drm_buf_map { @@ -389,7 +388,7 @@ struct drm_buf_map { struct drm_buf_pub *list; /**< Buffer information */ }; -/** +/* * DRM_IOCTL_DMA ioctl argument type. * * Indices here refer to the offset into the buffer list in drm_buf_get. @@ -414,7 +413,7 @@ enum drm_ctx_flags { _DRM_CONTEXT_2DONLY = 0x02 }; -/** +/* * DRM_IOCTL_ADD_CTX ioctl argument type. * * \sa drmCreateContext() and drmDestroyContext(). @@ -424,7 +423,7 @@ struct drm_ctx { enum drm_ctx_flags flags; }; -/** +/* * DRM_IOCTL_RES_CTX ioctl argument type. */ struct drm_ctx_res { @@ -432,14 +431,14 @@ struct drm_ctx_res { struct drm_ctx *contexts; }; -/** +/* * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type. */ struct drm_draw { drm_drawable_t handle; }; -/** +/* * DRM_IOCTL_UPDATE_DRAW ioctl argument type. */ typedef enum { @@ -453,14 +452,14 @@ struct drm_update_draw { unsigned long long data; }; -/** +/* * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type. */ struct drm_auth { drm_magic_t magic; }; -/** +/* * DRM_IOCTL_IRQ_BUSID ioctl argument type. * * \sa drmGetInterruptFromBusID(). @@ -502,7 +501,7 @@ struct drm_wait_vblank_reply { long tval_usec; }; -/** +/* * DRM_IOCTL_WAIT_VBLANK ioctl argument type. * * \sa drmWaitVBlank(). @@ -515,7 +514,7 @@ union drm_wait_vblank { #define _DRM_PRE_MODESET 1 #define _DRM_POST_MODESET 2 -/** +/* * DRM_IOCTL_MODESET_CTL ioctl argument type * * \sa drmModesetCtl(). @@ -525,7 +524,7 @@ struct drm_modeset_ctl { __u32 cmd; }; -/** +/* * DRM_IOCTL_AGP_ENABLE ioctl argument type. * * \sa drmAgpEnable(). @@ -534,7 +533,7 @@ struct drm_agp_mode { unsigned long mode; /**< AGP mode */ }; -/** +/* * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type. * * \sa drmAgpAlloc() and drmAgpFree(). @@ -546,7 +545,7 @@ struct drm_agp_buffer { unsigned long physical; /**< Physical used by i810 */ }; -/** +/* * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type. * * \sa drmAgpBind() and drmAgpUnbind(). @@ -556,7 +555,7 @@ struct drm_agp_binding { unsigned long offset; /**< In bytes -- will round to page boundary */ }; -/** +/* * DRM_IOCTL_AGP_INFO ioctl argument type. * * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(), @@ -577,7 +576,7 @@ struct drm_agp_info { unsigned short id_device; }; -/** +/* * DRM_IOCTL_SG_ALLOC ioctl argument type. */ struct drm_scatter_gather { @@ -585,7 +584,7 @@ struct drm_scatter_gather { unsigned long handle; /**< Used for mapping / unmapping */ }; -/** +/* * DRM_IOCTL_SET_VERSION ioctl argument type. */ struct drm_set_version { @@ -595,14 +594,14 @@ struct drm_set_version { int drm_dd_minor; }; -/** DRM_IOCTL_GEM_CLOSE ioctl argument type */ +/* DRM_IOCTL_GEM_CLOSE ioctl argument type */ struct drm_gem_close { /** Handle of the object to be closed. */ __u32 handle; __u32 pad; }; -/** DRM_IOCTL_GEM_FLINK ioctl argument type */ +/* DRM_IOCTL_GEM_FLINK ioctl argument type */ struct drm_gem_flink { /** Handle for the object being named */ __u32 handle; @@ -611,7 +610,7 @@ struct drm_gem_flink { __u32 name; }; -/** DRM_IOCTL_GEM_OPEN ioctl argument type */ +/* DRM_IOCTL_GEM_OPEN ioctl argument type */ struct drm_gem_open { /** Name of object being opened */ __u32 name; @@ -623,33 +622,150 @@ struct drm_gem_open { __u64 size; }; +/** + * DRM_CAP_DUMB_BUFFER + * + * If set to 1, the driver supports creating dumb buffers via the + * &DRM_IOCTL_MODE_CREATE_DUMB ioctl. + */ #define DRM_CAP_DUMB_BUFFER 0x1 +/** + * DRM_CAP_VBLANK_HIGH_CRTC + * + * If set to 1, the kernel supports specifying a CRTC index in the high bits of + * &drm_wait_vblank_request.type. + * + * Starting kernel version 2.6.39, this capability is always set to 1. + */ #define DRM_CAP_VBLANK_HIGH_CRTC 0x2 +/** + * DRM_CAP_DUMB_PREFERRED_DEPTH + * + * The preferred bit depth for dumb buffers. + * + * The bit depth is the number of bits used to indicate the color of a single + * pixel excluding any padding. This is different from the number of bits per + * pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per + * pixel. + * + * Note that this preference only applies to dumb buffers, it's irrelevant for + * other types of buffers. + */ #define DRM_CAP_DUMB_PREFERRED_DEPTH 0x3 +/** + * DRM_CAP_DUMB_PREFER_SHADOW + * + * If set to 1, the driver prefers userspace to render to a shadow buffer + * instead of directly rendering to a dumb buffer. For best speed, userspace + * should do streaming ordered memory copies into the dumb buffer and never + * read from it. + * + * Note that this preference only applies to dumb buffers, it's irrelevant for + * other types of buffers. + */ #define DRM_CAP_DUMB_PREFER_SHADOW 0x4 +/** + * DRM_CAP_PRIME + * + * Bitfield of supported PRIME sharing capabilities. See &DRM_PRIME_CAP_IMPORT + * and &DRM_PRIME_CAP_EXPORT. + * + * PRIME buffers are exposed as dma-buf file descriptors. See + * Documentation/gpu/drm-mm.rst, section "PRIME Buffer Sharing". + */ #define DRM_CAP_PRIME 0x5 +/** + * DRM_PRIME_CAP_IMPORT + * + * If this bit is set in &DRM_CAP_PRIME, the driver supports importing PRIME + * buffers via the &DRM_IOCTL_PRIME_FD_TO_HANDLE ioctl. + */ #define DRM_PRIME_CAP_IMPORT 0x1 +/** + * DRM_PRIME_CAP_EXPORT + * + * If this bit is set in &DRM_CAP_PRIME, the driver supports exporting PRIME + * buffers via the &DRM_IOCTL_PRIME_HANDLE_TO_FD ioctl. + */ #define DRM_PRIME_CAP_EXPORT 0x2 +/** + * DRM_CAP_TIMESTAMP_MONOTONIC + * + * If set to 0, the kernel will report timestamps with ``CLOCK_REALTIME`` in + * struct drm_event_vblank. If set to 1, the kernel will report timestamps with + * ``CLOCK_MONOTONIC``. See ``clock_gettime(2)`` for the definition of these + * clocks. + * + * Starting from kernel version 2.6.39, the default value for this capability + * is 1. Starting kernel version 4.15, this capability is always set to 1. + */ #define DRM_CAP_TIMESTAMP_MONOTONIC 0x6 +/** + * DRM_CAP_ASYNC_PAGE_FLIP + * + * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC. + */ #define DRM_CAP_ASYNC_PAGE_FLIP 0x7 -/* - * The CURSOR_WIDTH and CURSOR_HEIGHT capabilities return a valid widthxheight - * combination for the hardware cursor. The intention is that a hardware - * agnostic userspace can query a cursor plane size to use. +/** + * DRM_CAP_CURSOR_WIDTH + * + * The ``CURSOR_WIDTH`` and ``CURSOR_HEIGHT`` capabilities return a valid + * width x height combination for the hardware cursor. The intention is that a + * hardware agnostic userspace can query a cursor plane size to use. * * Note that the cross-driver contract is to merely return a valid size; * drivers are free to attach another meaning on top, eg. i915 returns the * maximum plane size. */ #define DRM_CAP_CURSOR_WIDTH 0x8 +/** + * DRM_CAP_CURSOR_HEIGHT + * + * See &DRM_CAP_CURSOR_WIDTH. + */ #define DRM_CAP_CURSOR_HEIGHT 0x9 +/** + * DRM_CAP_ADDFB2_MODIFIERS + * + * If set to 1, the driver supports supplying modifiers in the + * &DRM_IOCTL_MODE_ADDFB2 ioctl. + */ #define DRM_CAP_ADDFB2_MODIFIERS 0x10 +/** + * DRM_CAP_PAGE_FLIP_TARGET + * + * If set to 1, the driver supports the &DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE and + * &DRM_MODE_PAGE_FLIP_TARGET_RELATIVE flags in + * &drm_mode_crtc_page_flip_target.flags for the &DRM_IOCTL_MODE_PAGE_FLIP + * ioctl. + */ #define DRM_CAP_PAGE_FLIP_TARGET 0x11 +/** + * DRM_CAP_CRTC_IN_VBLANK_EVENT + * + * If set to 1, the kernel supports reporting the CRTC ID in + * &drm_event_vblank.crtc_id for the &DRM_EVENT_VBLANK and + * &DRM_EVENT_FLIP_COMPLETE events. + * + * Starting kernel version 4.12, this capability is always set to 1. + */ #define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12 +/** + * DRM_CAP_SYNCOBJ + * + * If set to 1, the driver supports sync objects. See + * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects". + */ #define DRM_CAP_SYNCOBJ 0x13 +/** + * DRM_CAP_SYNCOBJ_TIMELINE + * + * If set to 1, the driver supports timeline operations on sync objects. See + * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects". + */ #define DRM_CAP_SYNCOBJ_TIMELINE 0x14 -/** DRM_IOCTL_GET_CAP ioctl argument type */ +/* DRM_IOCTL_GET_CAP ioctl argument type */ struct drm_get_cap { __u64 capability; __u64 value; @@ -658,9 +774,12 @@ struct drm_get_cap { /** * DRM_CLIENT_CAP_STEREO_3D * - * if set to 1, the DRM core will expose the stereo 3D capabilities of the + * If set to 1, the DRM core will expose the stereo 3D capabilities of the * monitor by advertising the supported 3D layouts in the flags of struct - * drm_mode_modeinfo. + * drm_mode_modeinfo. See ``DRM_MODE_FLAG_3D_*``. + * + * This capability is always supported for all drivers starting from kernel + * version 3.13. */ #define DRM_CLIENT_CAP_STEREO_3D 1 @@ -669,13 +788,25 @@ struct drm_get_cap { * * If set to 1, the DRM core will expose all planes (overlay, primary, and * cursor) to userspace. + * + * This capability has been introduced in kernel version 3.15. Starting from + * kernel version 3.17, this capability is always supported for all drivers. */ #define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2 /** * DRM_CLIENT_CAP_ATOMIC * - * If set to 1, the DRM core will expose atomic properties to userspace + * If set to 1, the DRM core will expose atomic properties to userspace. This + * implicitly enables &DRM_CLIENT_CAP_UNIVERSAL_PLANES and + * &DRM_CLIENT_CAP_ASPECT_RATIO. + * + * If the driver doesn't support atomic mode-setting, enabling this capability + * will fail with -EOPNOTSUPP. + * + * This capability has been introduced in kernel version 4.0. Starting from + * kernel version 4.2, this capability is always supported for atomic-capable + * drivers. */ #define DRM_CLIENT_CAP_ATOMIC 3 @@ -683,6 +814,10 @@ struct drm_get_cap { * DRM_CLIENT_CAP_ASPECT_RATIO * * If set to 1, the DRM core will provide aspect ratio information in modes. + * See ``DRM_MODE_FLAG_PIC_AR_*``. + * + * This capability is always supported for all drivers starting from kernel + * version 4.18. */ #define DRM_CLIENT_CAP_ASPECT_RATIO 4 @@ -690,12 +825,15 @@ struct drm_get_cap { * DRM_CLIENT_CAP_WRITEBACK_CONNECTORS * * If set to 1, the DRM core will expose special connectors to be used for - * writing back to memory the scene setup in the commit. Depends on client - * also supporting DRM_CLIENT_CAP_ATOMIC + * writing back to memory the scene setup in the commit. The client must enable + * &DRM_CLIENT_CAP_ATOMIC first. + * + * This capability is always supported for atomic-capable drivers starting from + * kernel version 4.19. */ #define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5 -/** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ +/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ struct drm_set_client_cap { __u64 capability; __u64 value; @@ -947,7 +1085,7 @@ extern "C" { #define DRM_IOCTL_MODE_GETFB2 DRM_IOWR(0xCE, struct drm_mode_fb_cmd2) -/** +/* * Device specific ioctls should only be in their respective headers * The device specific ioctl range is from 0x40 to 0x9f. * Generic IOCTLS restart at 0xA0. @@ -958,7 +1096,7 @@ extern "C" { #define DRM_COMMAND_BASE 0x40 #define DRM_COMMAND_END 0xA0 -/** +/* * Header for events written back to userspace on the drm fd. The * type defines the type of event, the length specifies the total * length of the event (including the header), and user_data is Index: xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c diff -u xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c:1.20 xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c:1.21 --- xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c:1.20 Tue Apr 27 03:02:37 2021 +++ xsrc/external/mit/libdrm/dist/intel/intel_bufmgr_gem.c Sun Jan 9 09:05:35 2022 @@ -114,7 +114,6 @@ typedef struct _drm_intel_bufmgr_gem { pthread_mutex_t lock; - struct drm_i915_gem_exec_object *exec_objects; struct drm_i915_gem_exec_object2 *exec2_objects; drm_intel_bo **exec_bos; int exec_size; @@ -480,44 +479,6 @@ drm_intel_gem_bo_reference(drm_intel_bo * access flags. */ static void -drm_intel_add_validate_buffer(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; - int index; - - if (bo_gem->validate_index != -1) - return; - - /* Extend the array of validation entries as necessary. */ - if (bufmgr_gem->exec_count == bufmgr_gem->exec_size) { - int new_size = bufmgr_gem->exec_size * 2; - - if (new_size == 0) - new_size = 5; - - bufmgr_gem->exec_objects = - realloc(bufmgr_gem->exec_objects, - sizeof(*bufmgr_gem->exec_objects) * new_size); - bufmgr_gem->exec_bos = - realloc(bufmgr_gem->exec_bos, - sizeof(*bufmgr_gem->exec_bos) * new_size); - bufmgr_gem->exec_size = new_size; - } - - index = bufmgr_gem->exec_count; - bo_gem->validate_index = index; - /* Fill in array entry */ - bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle; - bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count; - bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs; - bufmgr_gem->exec_objects[index].alignment = bo->align; - bufmgr_gem->exec_objects[index].offset = 0; - bufmgr_gem->exec_bos[index] = bo; - bufmgr_gem->exec_count++; -} - -static void drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence) { drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; @@ -1191,7 +1152,6 @@ drm_intel_gem_bo_free(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_gem_close close; int ret; DRMLISTDEL(&bo_gem->vma_list); @@ -1215,11 +1175,9 @@ drm_intel_gem_bo_free(drm_intel_bo *bo) HASH_DELETE(handle_hh, bufmgr_gem->handle_table, bo_gem); /* Close this object */ - memclear(close); - close.handle = bo_gem->gem_handle; - ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close); + ret = drmCloseBufferHandle(bufmgr_gem->fd, bo_gem->gem_handle); if (ret != 0) { - DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n", + DBG("drmCloseBufferHandle %d failed (%s): %s\n", bo_gem->gem_handle, bo_gem->name, strerror(errno)); } free(bo); @@ -2002,11 +1960,9 @@ static void drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr) { drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; - struct drm_gem_close close_bo; int i, ret; free(bufmgr_gem->exec2_objects); - free(bufmgr_gem->exec_objects); free(bufmgr_gem->exec_bos); pthread_mutex_destroy(&bufmgr_gem->lock); @@ -2028,9 +1984,8 @@ drm_intel_bufmgr_gem_destroy(drm_intel_b /* Release userptr bo kept hanging around for optimisation. */ if (bufmgr_gem->userptr_active.ptr) { - memclear(close_bo); - close_bo.handle = bufmgr_gem->userptr_active.handle; - ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close_bo); + ret = drmCloseBufferHandle(bufmgr_gem->fd, + bufmgr_gem->userptr_active.handle); free(bufmgr_gem->userptr_active.ptr); if (ret) fprintf(stderr, @@ -2266,31 +2221,6 @@ drm_intel_gem_bo_clear_relocs(drm_intel_ * index values into the validation list. */ static void -drm_intel_gem_bo_process_reloc(drm_intel_bo *bo) -{ - drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; - int i; - - if (bo_gem->relocs == NULL) - return; - - for (i = 0; i < bo_gem->reloc_count; i++) { - drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo; - - if (target_bo == bo) - continue; - - drm_intel_gem_bo_mark_mmaps_incoherent(bo); - - /* Continue walking the tree depth-first. */ - drm_intel_gem_bo_process_reloc(target_bo); - - /* Add the target to the validate list */ - drm_intel_add_validate_buffer(target_bo); - } -} - -static void drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo) { drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; @@ -2330,30 +2260,6 @@ drm_intel_gem_bo_process_reloc2(drm_inte } } - -static void -drm_intel_update_buffer_offsets(drm_intel_bufmgr_gem *bufmgr_gem) -{ - int i; - - for (i = 0; i < bufmgr_gem->exec_count; i++) { - drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; - drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; - - /* Update the buffer offset */ - if (bufmgr_gem->exec_objects[i].offset != bo->offset64) { - DBG("BO %d (%s) migrated: 0x%08x %08x -> 0x%08x %08x\n", - bo_gem->gem_handle, bo_gem->name, - upper_32_bits(bo->offset64), - lower_32_bits(bo->offset64), - upper_32_bits(bufmgr_gem->exec_objects[i].offset), - lower_32_bits(bufmgr_gem->exec_objects[i].offset)); - bo->offset64 = bufmgr_gem->exec_objects[i].offset; - bo->offset = bufmgr_gem->exec_objects[i].offset; - } - } -} - static void drm_intel_update_buffer_offsets2 (drm_intel_bufmgr_gem *bufmgr_gem) { @@ -2390,73 +2296,6 @@ drm_intel_gem_bo_aub_dump_bmp(drm_intel_ } static int -drm_intel_gem_bo_exec(drm_intel_bo *bo, int used, - drm_clip_rect_t * cliprects, int num_cliprects, int DR4) -{ - drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; - struct drm_i915_gem_execbuffer execbuf; - int ret, i; - - if (to_bo_gem(bo)->has_error) - return -ENOMEM; - - pthread_mutex_lock(&bufmgr_gem->lock); - /* Update indices and set up the validate list. */ - drm_intel_gem_bo_process_reloc(bo); - - /* Add the batch buffer to the validation list. There are no - * relocations pointing to it. - */ - drm_intel_add_validate_buffer(bo); - - memclear(execbuf); - execbuf.buffers_ptr = (uintptr_t) bufmgr_gem->exec_objects; - execbuf.buffer_count = bufmgr_gem->exec_count; - execbuf.batch_start_offset = 0; - execbuf.batch_len = used; - execbuf.cliprects_ptr = (uintptr_t) cliprects; - execbuf.num_cliprects = num_cliprects; - execbuf.DR1 = 0; - execbuf.DR4 = DR4; - - ret = drmIoctl(bufmgr_gem->fd, - DRM_IOCTL_I915_GEM_EXECBUFFER, - &execbuf); - if (ret != 0) { - ret = -errno; - if (errno == ENOSPC) { - DBG("Execbuffer fails to pin. " - "Estimate: %u. Actual: %u. Available: %u\n", - drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos, - bufmgr_gem-> - exec_count), - drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos, - bufmgr_gem-> - exec_count), - (unsigned int)bufmgr_gem->gtt_size); - } - } - drm_intel_update_buffer_offsets(bufmgr_gem); - - if (bufmgr_gem->bufmgr.debug) - drm_intel_gem_dump_validation_list(bufmgr_gem); - - for (i = 0; i < bufmgr_gem->exec_count; i++) { - drm_intel_bo_gem *bo_gem = to_bo_gem(bufmgr_gem->exec_bos[i]); - - bo_gem->idle = false; - - /* Disconnect the buffer from the validate list */ - bo_gem->validate_index = -1; - bufmgr_gem->exec_bos[i] = NULL; - } - bufmgr_gem->exec_count = 0; - pthread_mutex_unlock(&bufmgr_gem->lock); - - return ret; -} - -static int do_exec2(drm_intel_bo *bo, int used, drm_intel_context *ctx, drm_clip_rect_t *cliprects, int num_cliprects, int DR4, int in_fence, int *out_fence, @@ -2933,9 +2772,7 @@ drm_public void drm_intel_bufmgr_gem_enable_fenced_relocs(drm_intel_bufmgr *bufmgr) { drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; - - if (bufmgr_gem->bufmgr.bo_exec == drm_intel_gem_bo_exec2) - bufmgr_gem->fenced_relocs = true; + bufmgr_gem->fenced_relocs = true; } /** @@ -3700,7 +3537,6 @@ drm_intel_bufmgr_gem_init(int fd, int ba struct drm_i915_gem_get_aperture aperture; drm_i915_getparam_t gp; int ret, tmp; - bool exec2 = false; pthread_mutex_lock(&bufmgr_list_mutex); @@ -3774,8 +3610,12 @@ drm_intel_bufmgr_gem_init(int fd, int ba gp.param = I915_PARAM_HAS_EXECBUF2; ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); - if (!ret) - exec2 = true; + if (ret) { + fprintf(stderr, "i915 does not support EXECBUFER2\n"); + free(bufmgr_gem); + bufmgr_gem = NULL; + goto exit; + } gp.param = I915_PARAM_HAS_BSD; ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); @@ -3878,12 +3718,8 @@ drm_intel_bufmgr_gem_init(int fd, int ba bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling; bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling; bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink; - /* Use the new one if available */ - if (exec2) { - bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2; - bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2; - } else - bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec; + bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2; + bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2; bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy; bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise; bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_unref; Index: xsrc/external/mit/libdrm/dist/radeon/radeon_bo_gem.c diff -u xsrc/external/mit/libdrm/dist/radeon/radeon_bo_gem.c:1.9 xsrc/external/mit/libdrm/dist/radeon/radeon_bo_gem.c:1.10 --- xsrc/external/mit/libdrm/dist/radeon/radeon_bo_gem.c:1.9 Sat Jan 19 11:50:05 2019 +++ xsrc/external/mit/libdrm/dist/radeon/radeon_bo_gem.c Sun Jan 9 09:05:35 2022 @@ -125,7 +125,6 @@ static void bo_ref(struct radeon_bo_int static struct radeon_bo *bo_unref(struct radeon_bo_int *boi) { struct radeon_bo_gem *bo_gem = (struct radeon_bo_gem*)boi; - struct drm_gem_close args; if (boi->cref) { return (struct radeon_bo *)boi; @@ -134,12 +133,8 @@ static struct radeon_bo *bo_unref(struct drm_munmap(bo_gem->priv_ptr, boi->size); } - /* Zero out args to make valgrind happy */ - memset(&args, 0, sizeof(args)); - /* close object */ - args.handle = boi->handle; - drmIoctl(boi->bom->fd, DRM_IOCTL_GEM_CLOSE, &args); + drmCloseBufferHandle(boi->bom->fd, boi->handle); memset(bo_gem, 0, sizeof(struct radeon_bo_gem)); free(bo_gem); return NULL; Index: xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c diff -u xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c:1.16 xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c:1.17 --- xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c:1.16 Sun Jul 11 00:31:54 2021 +++ xsrc/external/mit/libdrm/dist/tests/modetest/modetest.c Sun Jan 9 09:05:35 2022 @@ -300,11 +300,9 @@ static const char *modifier_to_string(ui static void dump_in_formats(struct device *dev, uint32_t blob_id) { - uint32_t i, j; + drmModeFormatModifierIterator iter = {0}; drmModePropertyBlobPtr blob; - struct drm_format_modifier_blob *header; - uint32_t *formats; - struct drm_format_modifier *modifiers; + uint32_t fmt = 0; printf("\t\tin_formats blob decoded:\n"); blob = drmModeGetPropertyBlob(dev->fd, blob_id); @@ -313,23 +311,19 @@ static void dump_in_formats(struct devic return; } - header = blob->data; - formats = (uint32_t *) ((char *) header + header->formats_offset); - modifiers = (struct drm_format_modifier *) - ((char *) header + header->modifiers_offset); - - for (i = 0; i < header->count_formats; i++) { - printf("\t\t\t"); - dump_fourcc(formats[i]); - printf(": "); - for (j = 0; j < header->count_modifiers; j++) { - uint64_t mask = 1ULL << i; - if (modifiers[j].formats & mask) - printf(" %s", modifier_to_string(modifiers[j].modifier)); + while (drmModeFormatModifierBlobIterNext(blob, &iter)) { + if (!fmt || fmt != iter.fmt) { + printf("%s\t\t\t", !fmt ? "" : "\n"); + fmt = iter.fmt; + dump_fourcc(fmt); + printf(": "); } - printf("\n"); + + printf(" %s", modifier_to_string(iter.mod)); } + printf("\n"); + drmModeFreePropertyBlob(blob); } @@ -381,7 +375,7 @@ static void dump_prop(struct device *dev if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM)) { printf("\t\tenums:"); for (i = 0; i < prop->count_enums; i++) - printf(" %s=%llu", prop->enums[i].name, + printf(" %s=%"PRIu64, prop->enums[i].name, prop->enums[i].value); printf("\n"); } else if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK)) { @@ -1710,13 +1704,21 @@ static void set_planes(struct device *de static void set_cursors(struct device *dev, struct pipe_arg *pipes, unsigned int count) { uint32_t handles[4] = {0}, pitches[4] = {0}, offsets[4] = {0}; + uint32_t cw = 64; + uint32_t ch = 64; struct bo *bo; + uint64_t value; unsigned int i; int ret; - /* maybe make cursor width/height configurable some day */ - uint32_t cw = 64; - uint32_t ch = 64; + ret = drmGetCap(dev->fd, DRM_CAP_CURSOR_WIDTH, &value); + if (!ret) + cw = value; + + ret = drmGetCap(dev->fd, DRM_CAP_CURSOR_HEIGHT, &value); + if (!ret) + ch = value; + /* create cursor bo.. just using PATTERN_PLAIN as it has * translucent alpha Index: xsrc/external/mit/libdrm/include/generated_static_table_fourcc.h diff -u xsrc/external/mit/libdrm/include/generated_static_table_fourcc.h:1.1 xsrc/external/mit/libdrm/include/generated_static_table_fourcc.h:1.2 --- xsrc/external/mit/libdrm/include/generated_static_table_fourcc.h:1.1 Sun Jul 11 00:41:13 2021 +++ xsrc/external/mit/libdrm/include/generated_static_table_fourcc.h Sun Jan 9 09:05:35 2022 @@ -10,6 +10,7 @@ static const struct drmFormatModifierInf { DRM_MODIFIER_INTEL(Yf_TILED_CCS, Yf_TILED_CCS) }, { DRM_MODIFIER_INTEL(Y_TILED_GEN12_RC_CCS, Y_TILED_GEN12_RC_CCS) }, { DRM_MODIFIER_INTEL(Y_TILED_GEN12_MC_CCS, Y_TILED_GEN12_MC_CCS) }, + { DRM_MODIFIER_INTEL(Y_TILED_GEN12_RC_CCS_CC, Y_TILED_GEN12_RC_CCS_CC) }, { DRM_MODIFIER(SAMSUNG, 64_32_TILE, 64_32_TILE) }, { DRM_MODIFIER(SAMSUNG, 16_16_TILE, 16_16_TILE) }, { DRM_MODIFIER(QCOM, COMPRESSED, COMPRESSED) },