Permalink
Cannot retrieve contributors at this time
126 lines (107 sloc)
3.88 KB
| /* | |
| * Copyright © 2013 ARM Limited. | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining a | |
| * copy of this software and associated documentation files (the "Software"), | |
| * to deal in the Software without restriction, including without limitation | |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| * and/or sell copies of the Software, and to permit persons to whom the | |
| * Software is furnished to do so, subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice (including the next | |
| * paragraph) shall be included in all copies or substantial portions of the | |
| * Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| * SOFTWARE. | |
| * | |
| */ | |
| #include <inttypes.h> | |
| #include <stdint.h> | |
| #include <string.h> | |
| #include <xf86drm.h> | |
| #include <xf86drmMode.h> | |
| #include "../drmmode_driver.h" | |
| /* Cursor dimensions | |
| * Technically we probably don't have any size limit.. since we | |
| * are just using an overlay... but xserver will always create | |
| * cursor images in the max size, so don't use width/height values | |
| * that are too big | |
| */ | |
| #define CURSORW (64) | |
| #define CURSORH (64) | |
| /* | |
| * Padding added down each side of cursor image. This is a workaround for a bug | |
| * causing corruption when the cursor reaches the screen edges. | |
| */ | |
| #define CURSORPAD (0) | |
| /* | |
| * Attempt to set "zpos" for our cursor plane. | |
| * This is not strictly needed as the plane is always above the primary | |
| */ | |
| static int init_plane_for_cursor(int drm_fd, uint32_t plane_id) | |
| { | |
| drmModeObjectPropertiesPtr props; | |
| int i; | |
| /* Get properties for our assigned cursor plane */ | |
| props = drmModeObjectGetProperties(drm_fd, plane_id, | |
| DRM_MODE_OBJECT_PLANE); | |
| if (!props) | |
| return 0; | |
| /* Find the "zpos" property */ | |
| for (i = 0; i < props->count_props; i++) { | |
| drmModePropertyPtr prop; | |
| prop = drmModeGetProperty(drm_fd, props->props[i]); | |
| if (!prop) | |
| continue; | |
| /* zpos is a range property. Set it to the maximum value */ | |
| if (!strncmp(prop->name, "zpos", DRM_PROP_NAME_LEN) && | |
| drm_property_type_is(prop, DRM_MODE_PROP_RANGE) && | |
| prop->count_values == 2) { | |
| xf86DrvMsg(-1, X_INFO, | |
| "Setting zpos for cursor plane %" PRIu32 " to %" PRIu64 "\n", | |
| plane_id, prop->values[1]); | |
| drmModeObjectSetProperty(drm_fd, plane_id, | |
| DRM_MODE_OBJECT_PLANE, | |
| prop->prop_id, | |
| prop->values[1]); | |
| } | |
| drmModeFreeProperty(prop); | |
| } | |
| drmModeFreeObjectProperties(props); | |
| return 0; | |
| } | |
| static int create_custom_gem(int fd, struct armsoc_create_gem *create_gem) | |
| { | |
| struct drm_mode_create_dumb create_arg; | |
| int ret; | |
| memset(&create_arg, 0, sizeof(create_arg)); | |
| create_arg.bpp = create_gem->bpp; | |
| create_arg.width = create_gem->width; | |
| create_arg.height = create_gem->height; | |
| ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_arg); | |
| if (ret) | |
| return ret; | |
| /* Convert create_arg to generic create_gem */ | |
| create_gem->handle = create_arg.handle; | |
| create_gem->pitch = create_arg.pitch; | |
| create_gem->size = create_arg.size; | |
| return 0; | |
| } | |
| struct drmmode_interface rockchip_interface = { | |
| "rockchip" /* name of drm driver */, | |
| 1 /* use_page_flip_events */, | |
| 0 /* use_early_display */, | |
| CURSORW /* cursor width */, | |
| CURSORH /* cursor_height */, | |
| CURSORPAD /* cursor padding */, | |
| HWCURSOR_API_STANDARD /* cursor_api */, | |
| init_plane_for_cursor /* init_plane_for_cursor */, | |
| 1 /* vblank_query_supported */, | |
| create_custom_gem /* create_custom_gem */, | |
| }; |