vugbm implements GBM device wrapping, udmabuf and memory fallback. However, the fallback/detection logic is flawed, as if "/dev/udmabuf" failed to be opened, it will not initialize vugbm and crash later. Rework the vugbm_device_init() logic to initialize correctly in all cases. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20210312100108.2706195-4-marcandre.lureau@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Virtio vhost-user GPU Device
 | 
						|
 *
 | 
						|
 * GBM helpers
 | 
						|
 *
 | 
						|
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | 
						|
 * See the COPYING file in the top-level directory.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef VHOST_USER_GPU_VUGBM_H
 | 
						|
#define VHOST_USER_GPU_VUGBM_H
 | 
						|
 | 
						|
 | 
						|
#ifdef CONFIG_MEMFD
 | 
						|
#include <sys/ioctl.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef CONFIG_GBM
 | 
						|
#include <gbm.h>
 | 
						|
#endif
 | 
						|
 | 
						|
struct vugbm_buffer;
 | 
						|
 | 
						|
struct vugbm_device {
 | 
						|
    bool inited;
 | 
						|
    int fd;
 | 
						|
#ifdef CONFIG_GBM
 | 
						|
    struct gbm_device *dev;
 | 
						|
#endif
 | 
						|
 | 
						|
    bool (*alloc_bo)(struct vugbm_buffer *buf);
 | 
						|
    void (*free_bo)(struct vugbm_buffer *buf);
 | 
						|
    bool (*get_fd)(struct vugbm_buffer *buf, int *fd);
 | 
						|
    bool (*map_bo)(struct vugbm_buffer *buf);
 | 
						|
    void (*unmap_bo)(struct vugbm_buffer *buf);
 | 
						|
    void (*device_destroy)(struct vugbm_device *dev);
 | 
						|
};
 | 
						|
 | 
						|
struct vugbm_buffer {
 | 
						|
    struct vugbm_device *dev;
 | 
						|
 | 
						|
#ifdef CONFIG_MEMFD
 | 
						|
    int memfd;
 | 
						|
#endif
 | 
						|
#ifdef CONFIG_GBM
 | 
						|
    struct gbm_bo *bo;
 | 
						|
    void *mmap_data;
 | 
						|
#endif
 | 
						|
 | 
						|
    uint8_t *mmap;
 | 
						|
    uint32_t width;
 | 
						|
    uint32_t height;
 | 
						|
    uint32_t stride;
 | 
						|
    uint32_t format;
 | 
						|
};
 | 
						|
 | 
						|
void vugbm_device_init(struct vugbm_device *dev, int fd);
 | 
						|
void vugbm_device_destroy(struct vugbm_device *dev);
 | 
						|
 | 
						|
bool vugbm_buffer_create(struct vugbm_buffer *buffer, struct vugbm_device *dev,
 | 
						|
                         uint32_t width, uint32_t height);
 | 
						|
bool vugbm_buffer_can_get_dmabuf_fd(struct vugbm_buffer *buffer);
 | 
						|
bool vugbm_buffer_get_dmabuf_fd(struct vugbm_buffer *buffer, int *fd);
 | 
						|
void vugbm_buffer_destroy(struct vugbm_buffer *buffer);
 | 
						|
 | 
						|
#endif
 |