cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qxl_gem.c (3221B)


      1/*
      2 * Copyright 2013 Red Hat Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a
      5 * copy of this software and associated documentation files (the "Software"),
      6 * to deal in the Software without restriction, including without limitation
      7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 * and/or sell copies of the Software, and to permit persons to whom the
      9 * Software is furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     20 * OTHER DEALINGS IN THE SOFTWARE.
     21 *
     22 * Authors: Dave Airlie
     23 *          Alon Levy
     24 */
     25
     26#include <drm/drm.h>
     27
     28#include "qxl_drv.h"
     29#include "qxl_object.h"
     30
     31void qxl_gem_object_free(struct drm_gem_object *gobj)
     32{
     33	struct qxl_bo *qobj = gem_to_qxl_bo(gobj);
     34	struct qxl_device *qdev;
     35	struct ttm_buffer_object *tbo;
     36
     37	qdev = to_qxl(gobj->dev);
     38
     39	qxl_surface_evict(qdev, qobj, false);
     40
     41	tbo = &qobj->tbo;
     42	ttm_bo_put(tbo);
     43}
     44
     45int qxl_gem_object_create(struct qxl_device *qdev, int size,
     46			  int alignment, int initial_domain,
     47			  bool discardable, bool kernel,
     48			  struct qxl_surface *surf,
     49			  struct drm_gem_object **obj)
     50{
     51	struct qxl_bo *qbo;
     52	int r;
     53
     54	*obj = NULL;
     55	/* At least align on page size */
     56	if (alignment < PAGE_SIZE)
     57		alignment = PAGE_SIZE;
     58	r = qxl_bo_create(qdev, size, kernel, false, initial_domain, 0, surf, &qbo);
     59	if (r) {
     60		if (r != -ERESTARTSYS)
     61			DRM_ERROR(
     62			"Failed to allocate GEM object (%d, %d, %u, %d)\n",
     63				  size, initial_domain, alignment, r);
     64		return r;
     65	}
     66	*obj = &qbo->tbo.base;
     67
     68	mutex_lock(&qdev->gem.mutex);
     69	list_add_tail(&qbo->list, &qdev->gem.objects);
     70	mutex_unlock(&qdev->gem.mutex);
     71
     72	return 0;
     73}
     74
     75int qxl_gem_object_create_with_handle(struct qxl_device *qdev,
     76				      struct drm_file *file_priv,
     77				      u32 domain,
     78				      size_t size,
     79				      struct qxl_surface *surf,
     80				      struct qxl_bo **qobj,
     81				      uint32_t *handle)
     82{
     83	struct drm_gem_object *gobj;
     84	int r;
     85
     86	BUG_ON(!qobj);
     87	BUG_ON(!handle);
     88
     89	r = qxl_gem_object_create(qdev, size, 0,
     90				  domain,
     91				  false, false, surf,
     92				  &gobj);
     93	if (r)
     94		return -ENOMEM;
     95	r = drm_gem_handle_create(file_priv, gobj, handle);
     96	if (r)
     97		return r;
     98	/* drop reference from allocate - handle holds it now */
     99	*qobj = gem_to_qxl_bo(gobj);
    100	drm_gem_object_put(gobj);
    101	return 0;
    102}
    103
    104int qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv)
    105{
    106	return 0;
    107}
    108
    109void qxl_gem_object_close(struct drm_gem_object *obj,
    110			  struct drm_file *file_priv)
    111{
    112}
    113
    114void qxl_gem_init(struct qxl_device *qdev)
    115{
    116	INIT_LIST_HEAD(&qdev->gem.objects);
    117}
    118
    119void qxl_gem_fini(struct qxl_device *qdev)
    120{
    121	qxl_bo_force_delete(qdev);
    122}