121 lines
3.6 KiB
C
121 lines
3.6 KiB
C
/*
|
|
* Tegra Graphics Host Virtual Memory
|
|
*
|
|
* Copyright (c) 2014, NVIDIA Corporation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef NVHOST_VM_H
|
|
#define NVHOST_VM_H
|
|
|
|
struct platform_device;
|
|
struct nvhost_vm;
|
|
struct nvhost_vm_pin;
|
|
struct dma_buf;
|
|
|
|
/**
|
|
* nvhost_vm_pin_buffers - Pin mapped buffers to the hardware
|
|
* @vm: Pointer to nvhost_vm structure
|
|
*
|
|
* This functions pins all currently mapped buffers (from the application view)
|
|
* into device address space. Even if the user space tries to unmap these
|
|
* buffers, the buffers remain valid for hardware until the function
|
|
* nvhost_vm_unpin_buffers() has been called.
|
|
*
|
|
* Returns reference to the nvhost_vm_pin instance.
|
|
*
|
|
*/
|
|
struct nvhost_vm_pin *nvhost_vm_pin_buffers(struct nvhost_vm *vm);
|
|
|
|
/**
|
|
* nvhost_vm_unpin_buffers - unpins given set of buffers
|
|
* @vm: Pointer to nvhost_vm structure
|
|
* @pin: pointer to pin structure from nvhost_vm_pin_buffers()
|
|
*
|
|
* This call unpins the given set of buffers from the hardware. If there are
|
|
* no remaining pins or maps from user space, this call will remove the buffers
|
|
* from the vm structure.
|
|
*
|
|
* No return value
|
|
*
|
|
*/
|
|
void nvhost_vm_unpin_buffers(struct nvhost_vm *vm, struct nvhost_vm_pin *pin);
|
|
|
|
/**
|
|
* nvhost_vm_unmap_dmabuf - unmap dmabuf
|
|
* @vm: Pointer to nvhost_vm structure
|
|
* @dmabuf: pointer to dmabuf
|
|
*
|
|
* This call unmaps given buffer from vm. If reference counter of the mapping
|
|
* goes to 0 and no hardware pins remain, the buffer is really unmapped and the
|
|
* buffer reference to vm is dropped.
|
|
*
|
|
* No return value
|
|
*
|
|
*/
|
|
void nvhost_vm_unmap_dmabuf(struct nvhost_vm *vm, struct dma_buf *dmabuf);
|
|
|
|
/**
|
|
* nvhost_vm_map_dmabuf - map dmabuf to address spacae
|
|
* @vm: Pointer to nvhost_vm structure
|
|
* @dmabuf: pointer to dmabuf
|
|
* @addr: base address for mapping
|
|
*
|
|
* This call maps given area to address space.
|
|
*
|
|
* Each mapped buffer takes a reference on the vm. This ensures that the
|
|
* domain cannot be dropped as long as there is a single mapped buffer.
|
|
*
|
|
* If same buffer (based on dmabuf pointer) is mapped multiple times, the
|
|
* reference counter of the buffer is increased and the same virtual
|
|
* address is returned.
|
|
*
|
|
* Return 0 on succcess, error otherwise. Base address is returned
|
|
* in address pointer.
|
|
*
|
|
*/
|
|
int nvhost_vm_map_dmabuf(struct nvhost_vm *vm, struct dma_buf *dmabuf,
|
|
dma_addr_t *addr);
|
|
|
|
/**
|
|
* nvhost_vm_put - Drop reference to vm
|
|
* @vm: Pointer to nvhost_vm structure
|
|
*
|
|
* Drops reference to vm. When refcount goes to 0, vm resources are released.
|
|
*
|
|
* No return value
|
|
*/
|
|
void nvhost_vm_put(struct nvhost_vm *vm);
|
|
|
|
/**
|
|
* nvhost_vm_get - Get reference to vm
|
|
* @vm: Pointer to nvhost_vm structure
|
|
*
|
|
* No return value
|
|
*/
|
|
void nvhost_vm_get(struct nvhost_vm *vm);
|
|
|
|
/**
|
|
* nvhost_vm_allocate - Allocate vm to hold buffers
|
|
* @pdev: pointer to the host1x client device
|
|
*
|
|
* This function allocates IOMMU domain to hold buffers and makes
|
|
* initializations to lists, mutexes, bitmaps, etc. to keep track of mappings.
|
|
*
|
|
* Returns pointer to nvhost_vm on success, 0 otherwise.
|
|
*/
|
|
struct nvhost_vm *nvhost_vm_allocate(struct platform_device *pdev);
|
|
|
|
#endif
|