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

virtio_dma_buf.c (2283B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * dma-bufs for virtio exported objects
      4 *
      5 * Copyright (C) 2020 Google, Inc.
      6 */
      7
      8#include <linux/module.h>
      9#include <linux/virtio_dma_buf.h>
     10
     11/**
     12 * virtio_dma_buf_export - Creates a new dma-buf for a virtio exported object
     13 * @exp_info: [in] see dma_buf_export(). ops MUST refer to a dma_buf_ops
     14 *	struct embedded in a virtio_dma_buf_ops.
     15 *
     16 * This wraps dma_buf_export() to allow virtio drivers to create a dma-buf
     17 * for an virtio exported object that can be queried by other virtio drivers
     18 * for the object's UUID.
     19 */
     20struct dma_buf *virtio_dma_buf_export
     21	(const struct dma_buf_export_info *exp_info)
     22{
     23	const struct virtio_dma_buf_ops *virtio_ops =
     24		container_of(exp_info->ops,
     25			     const struct virtio_dma_buf_ops, ops);
     26
     27	if (!exp_info->ops ||
     28	    exp_info->ops->attach != &virtio_dma_buf_attach ||
     29	    !virtio_ops->get_uuid) {
     30		return ERR_PTR(-EINVAL);
     31	}
     32
     33	return dma_buf_export(exp_info);
     34}
     35EXPORT_SYMBOL(virtio_dma_buf_export);
     36
     37/**
     38 * virtio_dma_buf_attach - mandatory attach callback for virtio dma-bufs
     39 */
     40int virtio_dma_buf_attach(struct dma_buf *dma_buf,
     41			  struct dma_buf_attachment *attach)
     42{
     43	int ret;
     44	const struct virtio_dma_buf_ops *ops =
     45		container_of(dma_buf->ops,
     46			     const struct virtio_dma_buf_ops, ops);
     47
     48	if (ops->device_attach) {
     49		ret = ops->device_attach(dma_buf, attach);
     50		if (ret)
     51			return ret;
     52	}
     53	return 0;
     54}
     55EXPORT_SYMBOL(virtio_dma_buf_attach);
     56
     57/**
     58 * is_virtio_dma_buf - returns true if the given dma-buf is a virtio dma-buf
     59 * @dma_buf: buffer to query
     60 */
     61bool is_virtio_dma_buf(struct dma_buf *dma_buf)
     62{
     63	return dma_buf->ops->attach == &virtio_dma_buf_attach;
     64}
     65EXPORT_SYMBOL(is_virtio_dma_buf);
     66
     67/**
     68 * virtio_dma_buf_get_uuid - gets a virtio dma-buf's exported object's uuid
     69 * @dma_buf: [in] buffer to query
     70 * @uuid: [out] the uuid
     71 *
     72 * Returns: 0 on success, negative on failure.
     73 */
     74int virtio_dma_buf_get_uuid(struct dma_buf *dma_buf,
     75			    uuid_t *uuid)
     76{
     77	const struct virtio_dma_buf_ops *ops =
     78		container_of(dma_buf->ops,
     79			     const struct virtio_dma_buf_ops, ops);
     80
     81	if (!is_virtio_dma_buf(dma_buf))
     82		return -EINVAL;
     83
     84	return ops->get_uuid(dma_buf, uuid);
     85}
     86EXPORT_SYMBOL(virtio_dma_buf_get_uuid);
     87
     88MODULE_LICENSE("GPL");
     89MODULE_IMPORT_NS(DMA_BUF);