blob: edd9896ba52b813492a7518a9f7aa9b10c5d8d6b [file] [log] [blame]
/*
* Copyright (C) 2012 Red Hat
* Copyright (c) 2015 - 2020 DisplayLink (UK) Ltd.
*
* Based on parts on udlfb.c:
* Copyright (C) 2009 its respective authors
*
* This file is subject to the terms and conditions of the GNU General Public
* License v2. See the file COPYING in the main directory of this archive for
* more details.
*/
#ifndef EVDI_DRV_H
#define EVDI_DRV_H
#include <linux/module.h>
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_rect.h>
# include <drm/drm_gem.h>
#include <drm/drm_cache.h>
#include <linux/reservation.h>
#include "evdi_debug.h"
#define DRIVER_NAME "evdi"
#define DRIVER_DESC "Extensible Virtual Display Interface"
#define DRIVER_DATE "20201210"
#define DRIVER_MAJOR 1
#define DRIVER_MINOR 9
#define DRIVER_PATCHLEVEL 0
struct evdi_fbdev;
struct evdi_painter;
struct evdi_device {
struct drm_device *ddev;
struct drm_connector *conn;
struct evdi_cursor *cursor;
bool cursor_events_enabled;
uint32_t pixel_area_limit;
uint32_t pixel_per_second_limit;
struct evdi_fbdev *fbdev;
struct evdi_painter *painter;
struct i2c_adapter *i2c_adapter;
atomic_t frame_count;
int dev_index;
};
struct evdi_gem_object {
struct drm_gem_object base;
struct page **pages;
void *vmapping;
struct sg_table *sg;
struct reservation_object *resv;
struct reservation_object _resv;
};
#define to_evdi_bo(x) container_of(x, struct evdi_gem_object, base)
struct evdi_framebuffer {
struct drm_framebuffer base;
struct evdi_gem_object *obj;
bool active;
};
#define to_evdi_fb(x) container_of(x, struct evdi_framebuffer, base)
/* modeset */
void evdi_modeset_init(struct drm_device *dev);
void evdi_modeset_cleanup(struct drm_device *dev);
int evdi_connector_init(struct drm_device *dev, struct drm_encoder *encoder);
struct drm_encoder *evdi_encoder_init(struct drm_device *dev);
int evdi_driver_load(struct drm_device *dev, unsigned long flags);
int evdi_driver_unload(struct drm_device *dev);
void evdi_driver_preclose(struct drm_device *dev, struct drm_file *file_priv);
void evdi_driver_postclose(struct drm_device *dev, struct drm_file *file_priv);
#ifdef CONFIG_COMPAT
long evdi_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
#endif
#ifdef CONFIG_FB
int evdi_fbdev_init(struct drm_device *dev);
void evdi_fbdev_cleanup(struct drm_device *dev);
void evdi_fbdev_unplug(struct drm_device *dev);
#endif /* CONFIG_FB */
struct drm_framebuffer *evdi_fb_user_fb_create(
struct drm_device *dev,
struct drm_file *file,
const struct drm_mode_fb_cmd2 *mode_cmd);
int evdi_dumb_create(struct drm_file *file_priv,
struct drm_device *dev, struct drm_mode_create_dumb *args);
int evdi_gem_mmap(struct drm_file *file_priv,
struct drm_device *dev, uint32_t handle, uint64_t *offset);
void evdi_gem_free_object(struct drm_gem_object *gem_obj);
struct evdi_gem_object *evdi_gem_alloc_object(struct drm_device *dev,
size_t size);
uint32_t evdi_gem_object_handle_lookup(struct drm_file *filp,
struct drm_gem_object *obj);
struct drm_gem_object *evdi_gem_prime_import(struct drm_device *dev,
struct dma_buf *dma_buf);
struct dma_buf *evdi_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *obj, int flags);
int evdi_gem_vmap(struct evdi_gem_object *obj);
void evdi_gem_vunmap(struct evdi_gem_object *obj);
int evdi_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
int evdi_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
void evdi_stats_init(struct evdi_device *evdi);
void evdi_stats_cleanup(struct evdi_device *evdi);
bool evdi_painter_is_connected(struct evdi_device *evdi);
void evdi_painter_close(struct evdi_device *evdi, struct drm_file *file);
u8 *evdi_painter_get_edid_copy(struct evdi_device *evdi);
void evdi_painter_mark_dirty(struct evdi_device *evdi,
const struct drm_clip_rect *rect);
void evdi_painter_send_update_ready_if_needed(struct evdi_device *evdi);
void evdi_painter_dpms_notify(struct evdi_device *evdi, int mode);
void evdi_painter_mode_changed_notify(struct evdi_device *evdi,
struct drm_display_mode *mode);
void evdi_painter_crtc_state_notify(struct evdi_device *evdi, int state);
unsigned int evdi_painter_poll(struct file *filp,
struct poll_table_struct *wait);
int evdi_painter_status_ioctl(struct drm_device *drm_dev, void *data,
struct drm_file *file);
int evdi_painter_connect_ioctl(struct drm_device *drm_dev, void *data,
struct drm_file *file);
int evdi_painter_grabpix_ioctl(struct drm_device *drm_dev, void *data,
struct drm_file *file);
int evdi_painter_request_update_ioctl(struct drm_device *drm_dev, void *data,
struct drm_file *file);
int evdi_painter_ddcci_response_ioctl(struct drm_device *drm_dev, void *data,
struct drm_file *file);
int evdi_painter_enable_cursor_events_ioctl(struct drm_device *drm_dev,
void *data, struct drm_file *file);
int evdi_painter_init(struct evdi_device *evdi);
void evdi_painter_cleanup(struct evdi_device *evdi);
void evdi_painter_set_new_scanout_buffer(struct evdi_device *evdi,
struct evdi_framebuffer *buffer);
void evdi_painter_commit_scanout_buffer(struct evdi_device *evdi);
struct drm_clip_rect evdi_framebuffer_sanitize_rect(
const struct evdi_framebuffer *fb,
const struct drm_clip_rect *rect);
void evdi_painter_send_cursor_set(struct evdi_painter *painter,
struct evdi_cursor *cursor);
void evdi_painter_send_cursor_move(struct evdi_painter *painter,
struct evdi_cursor *cursor);
bool evdi_painter_needs_full_modeset(struct evdi_device *evdi);
bool evdi_painter_i2c_data_notify(struct evdi_device *evdi,
struct i2c_msg *msg);
int evdi_fb_get_bpp(uint32_t format);
#endif