/* * Google LWIS DMA Buffer Utilities * * * Copyright (c) 2018 Google, LLC * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef LWIS_BUFFER_H_ #define LWIS_BUFFER_H_ #include #include #include #include "lwis_commands.h" #include "lwis_device.h" struct lwis_enrolled_buffer { struct lwis_buffer_info info; enum dma_data_direction dma_direction; struct dma_buf *dma_buf; struct dma_buf_attachment *dma_buf_attachment; struct sg_table *sg_table; struct list_head list_node; struct lwis_buffer_enrollment_list *enrollment_list; }; struct lwis_allocated_buffer { int fd; size_t size; struct dma_buf *dma_buf; struct hlist_node node; }; struct lwis_buffer_enrollment_list { dma_addr_t vaddr; struct list_head list; struct hlist_node node; }; /* * lwis_buffer_alloc: Allocates a DMA buffer represented by alloc_info. * * Assumes: lwisclient->lock is locked * Alloc: Yes * Returns: 0 on success */ int lwis_buffer_alloc(struct lwis_client *lwis_client, struct lwis_alloc_buffer_info *alloc_info, struct lwis_allocated_buffer *buffer); /* * lwis_buffer_free: Frees a DMA buffer represented by file descriptor. * * Assumes: lwisclient->lock is locked * Alloc: Free only * Returns: 0 on success */ int lwis_buffer_free(struct lwis_client *lwis_client, struct lwis_allocated_buffer *buffer); /* * lwis_buffer_enroll: Maps the DMA buffer represented by the file descriptor * passed in buffer->info.fd into IO space and adds the buffer object into * the table of this client's enrolled buffers * * Assumes: lwisclient->lock is locked * Alloc: Yes * Returns: 0 on success */ int lwis_buffer_enroll(struct lwis_client *lwis_client, struct lwis_enrolled_buffer *buffer); /* * lwis_buffer_disenroll: Unmaps the buffer from IO space and removes the * object from the hash table * * Assumes: lwisclient->lock is locked * Alloc: Yes * Returns: 0 on success */ int lwis_buffer_disenroll(struct lwis_client *lwis_client, struct lwis_enrolled_buffer *buffer); /* * lwis_buffer_cpu_access: Invalidate/flush the cache for CPU access to the dma buffers * * Assumes: lwisclient->lock is locked * Alloc: Yes * Returns: 0 on success */ int lwis_buffer_cpu_access(struct lwis_client *lwis_client, struct lwis_buffer_cpu_access_op *op); /* * lwis_client_enrolled_buffer_find: Finds the enrolled buffer based on * dma_vaddr passed, and returns it * * Assumes: lwisclient->lock is locked * Alloc: Yes * Returns: Pointer on success, NULL otherwise */ struct lwis_enrolled_buffer *lwis_client_enrolled_buffer_find(struct lwis_client *lwis_client, int fd, dma_addr_t dma_vaddr); /* * lwis_client_enrolled_buffers_clear: Frees all items in * lwisclient->enrolled_buffers and clears the hash table. Used for client * shutdown only. * * Assumes: lwisclient->lock is locked * Alloc: Free only * Returns: 0 on success */ int lwis_client_enrolled_buffers_clear(struct lwis_client *lwis_client); /* * lwis_client_allocated_buffer_find: Finds the allocated buffer based on * file desciptor passed, and returns it * * Assumes: lwisclient->lock is locked * Alloc: Yes * Returns: Pointer on success, NULL otherwise */ struct lwis_allocated_buffer *lwis_client_allocated_buffer_find(struct lwis_client *lwis_client, int fd); /* * lwis_client_allocated_buffers_clear: Frees all items in * lwisclient->allocated_buffers and clears the hash table. Used for client * shutdown only. * * Assumes: lwisclient->lock is locked * Alloc: Free only * Returns: 0 on success */ int lwis_client_allocated_buffers_clear(struct lwis_client *lwis_client); #endif /* LWIS_BUFFER_H_ */