162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2013 Red Hat Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation
762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
1262306a36Sopenharmony_ci * all copies or substantial portions of the Software.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * Authors: Dave Airlie
2362306a36Sopenharmony_ci *          Alon Levy
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#ifndef QXL_DRV_H
2762306a36Sopenharmony_ci#define QXL_DRV_H
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/*
3062306a36Sopenharmony_ci * Definitions taken from spice-protocol, plus kernel driver specific bits.
3162306a36Sopenharmony_ci */
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#include <linux/iosys-map.h>
3462306a36Sopenharmony_ci#include <linux/dma-fence.h>
3562306a36Sopenharmony_ci#include <linux/firmware.h>
3662306a36Sopenharmony_ci#include <linux/platform_device.h>
3762306a36Sopenharmony_ci#include <linux/workqueue.h>
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#include <drm/drm_crtc.h>
4062306a36Sopenharmony_ci#include <drm/drm_encoder.h>
4162306a36Sopenharmony_ci#include <drm/drm_gem_ttm_helper.h>
4262306a36Sopenharmony_ci#include <drm/drm_ioctl.h>
4362306a36Sopenharmony_ci#include <drm/drm_gem.h>
4462306a36Sopenharmony_ci#include <drm/qxl_drm.h>
4562306a36Sopenharmony_ci#include <drm/ttm/ttm_bo.h>
4662306a36Sopenharmony_ci#include <drm/ttm/ttm_execbuf_util.h>
4762306a36Sopenharmony_ci#include <drm/ttm/ttm_placement.h>
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#include "qxl_dev.h"
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct iosys_map;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define DRIVER_AUTHOR		"Dave Airlie"
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define DRIVER_NAME		"qxl"
5662306a36Sopenharmony_ci#define DRIVER_DESC		"RH QXL"
5762306a36Sopenharmony_ci#define DRIVER_DATE		"20120117"
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define DRIVER_MAJOR 0
6062306a36Sopenharmony_ci#define DRIVER_MINOR 1
6162306a36Sopenharmony_ci#define DRIVER_PATCHLEVEL 0
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define QXL_DEBUGFS_MAX_COMPONENTS		32
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciextern int qxl_num_crtc;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define QXL_INTERRUPT_MASK (\
6862306a36Sopenharmony_ci	QXL_INTERRUPT_DISPLAY |\
6962306a36Sopenharmony_ci	QXL_INTERRUPT_CURSOR |\
7062306a36Sopenharmony_ci	QXL_INTERRUPT_IO_CMD |\
7162306a36Sopenharmony_ci	QXL_INTERRUPT_CLIENT_MONITORS_CONFIG)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistruct qxl_bo {
7462306a36Sopenharmony_ci	struct ttm_buffer_object	tbo;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	/* Protected by gem.mutex */
7762306a36Sopenharmony_ci	struct list_head		list;
7862306a36Sopenharmony_ci	/* Protected by tbo.reserved */
7962306a36Sopenharmony_ci	struct ttm_place		placements[3];
8062306a36Sopenharmony_ci	struct ttm_placement		placement;
8162306a36Sopenharmony_ci	struct iosys_map		map;
8262306a36Sopenharmony_ci	void				*kptr;
8362306a36Sopenharmony_ci	unsigned int                    map_count;
8462306a36Sopenharmony_ci	int                             type;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	/* Constant after initialization */
8762306a36Sopenharmony_ci	unsigned int is_primary:1; /* is this now a primary surface */
8862306a36Sopenharmony_ci	unsigned int is_dumb:1;
8962306a36Sopenharmony_ci	struct qxl_bo *shadow;
9062306a36Sopenharmony_ci	unsigned int hw_surf_alloc:1;
9162306a36Sopenharmony_ci	struct qxl_surface surf;
9262306a36Sopenharmony_ci	uint32_t surface_id;
9362306a36Sopenharmony_ci	struct qxl_release *surf_create;
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci#define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, tbo.base)
9662306a36Sopenharmony_ci#define to_qxl_bo(tobj) container_of((tobj), struct qxl_bo, tbo)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistruct qxl_gem {
9962306a36Sopenharmony_ci	struct mutex		mutex;
10062306a36Sopenharmony_ci	struct list_head	objects;
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct qxl_bo_list {
10462306a36Sopenharmony_ci	struct ttm_validate_buffer tv;
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistruct qxl_crtc {
10862306a36Sopenharmony_ci	struct drm_crtc base;
10962306a36Sopenharmony_ci	int index;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	struct qxl_bo *cursor_bo;
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistruct qxl_output {
11562306a36Sopenharmony_ci	int index;
11662306a36Sopenharmony_ci	struct drm_connector base;
11762306a36Sopenharmony_ci	struct drm_encoder enc;
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci#define to_qxl_crtc(x) container_of(x, struct qxl_crtc, base)
12162306a36Sopenharmony_ci#define drm_connector_to_qxl_output(x) container_of(x, struct qxl_output, base)
12262306a36Sopenharmony_ci#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc)
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistruct qxl_mman {
12562306a36Sopenharmony_ci	struct ttm_device		bdev;
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistruct qxl_memslot {
12962306a36Sopenharmony_ci	int             index;
13062306a36Sopenharmony_ci	const char      *name;
13162306a36Sopenharmony_ci	uint8_t		generation;
13262306a36Sopenharmony_ci	uint64_t	start_phys_addr;
13362306a36Sopenharmony_ci	uint64_t	size;
13462306a36Sopenharmony_ci	uint64_t	high_bits;
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cienum {
13862306a36Sopenharmony_ci	QXL_RELEASE_DRAWABLE,
13962306a36Sopenharmony_ci	QXL_RELEASE_SURFACE_CMD,
14062306a36Sopenharmony_ci	QXL_RELEASE_CURSOR_CMD,
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/* drm_ prefix to differentiate from qxl_release_info in
14462306a36Sopenharmony_ci * spice-protocol/qxl_dev.h */
14562306a36Sopenharmony_ci#define QXL_MAX_RES 96
14662306a36Sopenharmony_cistruct qxl_release {
14762306a36Sopenharmony_ci	struct dma_fence base;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	int id;
15062306a36Sopenharmony_ci	int type;
15162306a36Sopenharmony_ci	struct qxl_bo *release_bo;
15262306a36Sopenharmony_ci	uint32_t release_offset;
15362306a36Sopenharmony_ci	uint32_t surface_release_id;
15462306a36Sopenharmony_ci	struct ww_acquire_ctx ticket;
15562306a36Sopenharmony_ci	struct list_head bos;
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cistruct qxl_drm_chunk {
15962306a36Sopenharmony_ci	struct list_head head;
16062306a36Sopenharmony_ci	struct qxl_bo *bo;
16162306a36Sopenharmony_ci};
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_cistruct qxl_drm_image {
16462306a36Sopenharmony_ci	struct qxl_bo *bo;
16562306a36Sopenharmony_ci	struct list_head chunk_list;
16662306a36Sopenharmony_ci};
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci/*
16962306a36Sopenharmony_ci * Debugfs
17062306a36Sopenharmony_ci */
17162306a36Sopenharmony_cistruct qxl_debugfs {
17262306a36Sopenharmony_ci	struct drm_info_list	*files;
17362306a36Sopenharmony_ci	unsigned int num_files;
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistruct qxl_device {
17762306a36Sopenharmony_ci	struct drm_device ddev;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	resource_size_t vram_base, vram_size;
18062306a36Sopenharmony_ci	resource_size_t surfaceram_base, surfaceram_size;
18162306a36Sopenharmony_ci	resource_size_t rom_base, rom_size;
18262306a36Sopenharmony_ci	struct qxl_rom *rom;
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	struct qxl_mode *modes;
18562306a36Sopenharmony_ci	struct qxl_bo *monitors_config_bo;
18662306a36Sopenharmony_ci	struct qxl_monitors_config *monitors_config;
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	/* last received client_monitors_config */
18962306a36Sopenharmony_ci	struct qxl_monitors_config *client_monitors_config;
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	int io_base;
19262306a36Sopenharmony_ci	void *ram;
19362306a36Sopenharmony_ci	struct qxl_mman		mman;
19462306a36Sopenharmony_ci	struct qxl_gem		gem;
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	void *ram_physical;
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	struct qxl_ring *release_ring;
19962306a36Sopenharmony_ci	struct qxl_ring *command_ring;
20062306a36Sopenharmony_ci	struct qxl_ring *cursor_ring;
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	struct qxl_ram_header *ram_header;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	struct qxl_bo *primary_bo;
20562306a36Sopenharmony_ci	struct qxl_bo *dumb_shadow_bo;
20662306a36Sopenharmony_ci	struct qxl_head *dumb_heads;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	struct qxl_memslot main_slot;
20962306a36Sopenharmony_ci	struct qxl_memslot surfaces_slot;
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	spinlock_t	release_lock;
21262306a36Sopenharmony_ci	struct idr	release_idr;
21362306a36Sopenharmony_ci	uint32_t	release_seqno;
21462306a36Sopenharmony_ci	atomic_t	release_count;
21562306a36Sopenharmony_ci	wait_queue_head_t release_event;
21662306a36Sopenharmony_ci	spinlock_t release_idr_lock;
21762306a36Sopenharmony_ci	struct mutex	async_io_mutex;
21862306a36Sopenharmony_ci	unsigned int last_sent_io_cmd;
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	/* interrupt handling */
22162306a36Sopenharmony_ci	atomic_t irq_received;
22262306a36Sopenharmony_ci	atomic_t irq_received_display;
22362306a36Sopenharmony_ci	atomic_t irq_received_cursor;
22462306a36Sopenharmony_ci	atomic_t irq_received_io_cmd;
22562306a36Sopenharmony_ci	unsigned int irq_received_error;
22662306a36Sopenharmony_ci	wait_queue_head_t display_event;
22762306a36Sopenharmony_ci	wait_queue_head_t cursor_event;
22862306a36Sopenharmony_ci	wait_queue_head_t io_cmd_event;
22962306a36Sopenharmony_ci	struct work_struct client_monitors_config_work;
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	/* debugfs */
23262306a36Sopenharmony_ci	struct qxl_debugfs	debugfs[QXL_DEBUGFS_MAX_COMPONENTS];
23362306a36Sopenharmony_ci	unsigned int debugfs_count;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	struct mutex		update_area_mutex;
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	struct idr	surf_id_idr;
23862306a36Sopenharmony_ci	spinlock_t surf_id_idr_lock;
23962306a36Sopenharmony_ci	int last_alloced_surf_id;
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	struct mutex surf_evict_mutex;
24262306a36Sopenharmony_ci	struct io_mapping *vram_mapping;
24362306a36Sopenharmony_ci	struct io_mapping *surface_mapping;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	/* */
24662306a36Sopenharmony_ci	struct mutex release_mutex;
24762306a36Sopenharmony_ci	struct qxl_bo *current_release_bo[3];
24862306a36Sopenharmony_ci	int current_release_bo_offset[3];
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	struct work_struct gc_work;
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	struct drm_property *hotplug_mode_update_property;
25362306a36Sopenharmony_ci	int monitors_config_width;
25462306a36Sopenharmony_ci	int monitors_config_height;
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci#define to_qxl(dev) container_of(dev, struct qxl_device, ddev)
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ciint qxl_debugfs_fence_init(struct qxl_device *rdev);
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ciint qxl_device_init(struct qxl_device *qdev, struct pci_dev *pdev);
26262306a36Sopenharmony_civoid qxl_device_fini(struct qxl_device *qdev);
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ciint qxl_modeset_init(struct qxl_device *qdev);
26562306a36Sopenharmony_civoid qxl_modeset_fini(struct qxl_device *qdev);
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ciint qxl_bo_init(struct qxl_device *qdev);
26862306a36Sopenharmony_civoid qxl_bo_fini(struct qxl_device *qdev);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_civoid qxl_reinit_memslots(struct qxl_device *qdev);
27162306a36Sopenharmony_ciint qxl_surf_evict(struct qxl_device *qdev);
27262306a36Sopenharmony_ciint qxl_vram_evict(struct qxl_device *qdev);
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_cistruct qxl_ring *qxl_ring_create(struct qxl_ring_header *header,
27562306a36Sopenharmony_ci				 int element_size,
27662306a36Sopenharmony_ci				 int n_elements,
27762306a36Sopenharmony_ci				 int prod_notify,
27862306a36Sopenharmony_ci				 wait_queue_head_t *push_event);
27962306a36Sopenharmony_civoid qxl_ring_free(struct qxl_ring *ring);
28062306a36Sopenharmony_ciint qxl_check_idle(struct qxl_ring *ring);
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic inline uint64_t
28362306a36Sopenharmony_ciqxl_bo_physical_address(struct qxl_device *qdev, struct qxl_bo *bo,
28462306a36Sopenharmony_ci			unsigned long offset)
28562306a36Sopenharmony_ci{
28662306a36Sopenharmony_ci	struct qxl_memslot *slot =
28762306a36Sopenharmony_ci		(bo->tbo.resource->mem_type == TTM_PL_VRAM)
28862306a36Sopenharmony_ci		? &qdev->main_slot : &qdev->surfaces_slot;
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci       /* TODO - need to hold one of the locks to read bo->tbo.resource->start */
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	return slot->high_bits | ((bo->tbo.resource->start << PAGE_SHIFT) + offset);
29362306a36Sopenharmony_ci}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci/* qxl_display.c */
29662306a36Sopenharmony_civoid qxl_display_read_client_monitors_config(struct qxl_device *qdev);
29762306a36Sopenharmony_ciint qxl_create_monitors_object(struct qxl_device *qdev);
29862306a36Sopenharmony_ciint qxl_destroy_monitors_object(struct qxl_device *qdev);
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci/* qxl_gem.c */
30162306a36Sopenharmony_civoid qxl_gem_init(struct qxl_device *qdev);
30262306a36Sopenharmony_civoid qxl_gem_fini(struct qxl_device *qdev);
30362306a36Sopenharmony_ciint qxl_gem_object_create(struct qxl_device *qdev, int size,
30462306a36Sopenharmony_ci			  int alignment, int initial_domain,
30562306a36Sopenharmony_ci			  bool discardable, bool kernel,
30662306a36Sopenharmony_ci			  struct qxl_surface *surf,
30762306a36Sopenharmony_ci			  struct drm_gem_object **obj);
30862306a36Sopenharmony_ciint qxl_gem_object_create_with_handle(struct qxl_device *qdev,
30962306a36Sopenharmony_ci				      struct drm_file *file_priv,
31062306a36Sopenharmony_ci				      u32 domain,
31162306a36Sopenharmony_ci				      size_t size,
31262306a36Sopenharmony_ci				      struct qxl_surface *surf,
31362306a36Sopenharmony_ci				      struct drm_gem_object **gobj,
31462306a36Sopenharmony_ci				      uint32_t *handle);
31562306a36Sopenharmony_civoid qxl_gem_object_free(struct drm_gem_object *gobj);
31662306a36Sopenharmony_ciint qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv);
31762306a36Sopenharmony_civoid qxl_gem_object_close(struct drm_gem_object *obj,
31862306a36Sopenharmony_ci			  struct drm_file *file_priv);
31962306a36Sopenharmony_civoid qxl_bo_force_delete(struct qxl_device *qdev);
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci/* qxl_dumb.c */
32262306a36Sopenharmony_ciint qxl_mode_dumb_create(struct drm_file *file_priv,
32362306a36Sopenharmony_ci			 struct drm_device *dev,
32462306a36Sopenharmony_ci			 struct drm_mode_create_dumb *args);
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci/* qxl ttm */
32762306a36Sopenharmony_ciint qxl_ttm_init(struct qxl_device *qdev);
32862306a36Sopenharmony_civoid qxl_ttm_fini(struct qxl_device *qdev);
32962306a36Sopenharmony_ciint qxl_ttm_io_mem_reserve(struct ttm_device *bdev,
33062306a36Sopenharmony_ci			   struct ttm_resource *mem);
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci/* qxl image */
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ciint qxl_image_init(struct qxl_device *qdev,
33562306a36Sopenharmony_ci		   struct qxl_release *release,
33662306a36Sopenharmony_ci		   struct qxl_drm_image *dimage,
33762306a36Sopenharmony_ci		   const uint8_t *data,
33862306a36Sopenharmony_ci		   int x, int y, int width, int height,
33962306a36Sopenharmony_ci		   int depth, int stride);
34062306a36Sopenharmony_ciint
34162306a36Sopenharmony_ciqxl_image_alloc_objects(struct qxl_device *qdev,
34262306a36Sopenharmony_ci			struct qxl_release *release,
34362306a36Sopenharmony_ci			struct qxl_drm_image **image_ptr,
34462306a36Sopenharmony_ci			int height, int stride);
34562306a36Sopenharmony_civoid qxl_image_free_objects(struct qxl_device *qdev, struct qxl_drm_image *dimage);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_civoid qxl_update_screen(struct qxl_device *qxl);
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci/* qxl io operations (qxl_cmd.c) */
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_civoid qxl_io_create_primary(struct qxl_device *qdev,
35262306a36Sopenharmony_ci			   struct qxl_bo *bo);
35362306a36Sopenharmony_civoid qxl_io_destroy_primary(struct qxl_device *qdev);
35462306a36Sopenharmony_civoid qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id);
35562306a36Sopenharmony_civoid qxl_io_notify_oom(struct qxl_device *qdev);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ciint qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf,
35862306a36Sopenharmony_ci		       const struct qxl_rect *area);
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_civoid qxl_io_reset(struct qxl_device *qdev);
36162306a36Sopenharmony_civoid qxl_io_monitors_config(struct qxl_device *qdev);
36262306a36Sopenharmony_ciint qxl_ring_push(struct qxl_ring *ring, const void *new_elt, bool interruptible);
36362306a36Sopenharmony_civoid qxl_io_flush_release(struct qxl_device *qdev);
36462306a36Sopenharmony_civoid qxl_io_flush_surfaces(struct qxl_device *qdev);
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ciunion qxl_release_info *qxl_release_map(struct qxl_device *qdev,
36762306a36Sopenharmony_ci					struct qxl_release *release);
36862306a36Sopenharmony_civoid qxl_release_unmap(struct qxl_device *qdev,
36962306a36Sopenharmony_ci		       struct qxl_release *release,
37062306a36Sopenharmony_ci		       union qxl_release_info *info);
37162306a36Sopenharmony_ciint qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo);
37262306a36Sopenharmony_ciint qxl_release_reserve_list(struct qxl_release *release, bool no_intr);
37362306a36Sopenharmony_civoid qxl_release_backoff_reserve_list(struct qxl_release *release);
37462306a36Sopenharmony_civoid qxl_release_fence_buffer_objects(struct qxl_release *release);
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ciint qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
37762306a36Sopenharmony_ci				       enum qxl_surface_cmd_type surface_cmd_type,
37862306a36Sopenharmony_ci				       struct qxl_release *create_rel,
37962306a36Sopenharmony_ci				       struct qxl_release **release);
38062306a36Sopenharmony_ciint qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
38162306a36Sopenharmony_ci			       int type, struct qxl_release **release,
38262306a36Sopenharmony_ci			       struct qxl_bo **rbo);
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ciint
38562306a36Sopenharmony_ciqxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release,
38662306a36Sopenharmony_ci			      uint32_t type, bool interruptible);
38762306a36Sopenharmony_ciint
38862306a36Sopenharmony_ciqxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *release,
38962306a36Sopenharmony_ci			     uint32_t type, bool interruptible);
39062306a36Sopenharmony_ciint qxl_alloc_bo_reserved(struct qxl_device *qdev,
39162306a36Sopenharmony_ci			  struct qxl_release *release,
39262306a36Sopenharmony_ci			  unsigned long size,
39362306a36Sopenharmony_ci			  struct qxl_bo **_bo);
39462306a36Sopenharmony_ci/* qxl drawing commands */
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_civoid qxl_draw_dirty_fb(struct qxl_device *qdev,
39762306a36Sopenharmony_ci		       struct drm_framebuffer *fb,
39862306a36Sopenharmony_ci		       struct qxl_bo *bo,
39962306a36Sopenharmony_ci		       unsigned int flags, unsigned int color,
40062306a36Sopenharmony_ci		       struct drm_clip_rect *clips,
40162306a36Sopenharmony_ci		       unsigned int num_clips, int inc,
40262306a36Sopenharmony_ci		       uint32_t dumb_shadow_offset);
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_civoid qxl_release_free(struct qxl_device *qdev,
40562306a36Sopenharmony_ci		      struct qxl_release *release);
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci/* used by qxl_debugfs_release */
40862306a36Sopenharmony_cistruct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev,
40962306a36Sopenharmony_ci						   uint64_t id);
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_cibool qxl_queue_garbage_collect(struct qxl_device *qdev, bool flush);
41262306a36Sopenharmony_ciint qxl_garbage_collect(struct qxl_device *qdev);
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci/* debugfs */
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_civoid qxl_debugfs_init(struct drm_minor *minor);
41762306a36Sopenharmony_civoid qxl_ttm_debugfs_init(struct qxl_device *qdev);
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci/* qxl_prime.c */
42062306a36Sopenharmony_ciint qxl_gem_prime_pin(struct drm_gem_object *obj);
42162306a36Sopenharmony_civoid qxl_gem_prime_unpin(struct drm_gem_object *obj);
42262306a36Sopenharmony_cistruct sg_table *qxl_gem_prime_get_sg_table(struct drm_gem_object *obj);
42362306a36Sopenharmony_cistruct drm_gem_object *qxl_gem_prime_import_sg_table(
42462306a36Sopenharmony_ci	struct drm_device *dev, struct dma_buf_attachment *attach,
42562306a36Sopenharmony_ci	struct sg_table *sgt);
42662306a36Sopenharmony_ciint qxl_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map);
42762306a36Sopenharmony_civoid qxl_gem_prime_vunmap(struct drm_gem_object *obj,
42862306a36Sopenharmony_ci			  struct iosys_map *map);
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci/* qxl_irq.c */
43162306a36Sopenharmony_ciint qxl_irq_init(struct qxl_device *qdev);
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_civoid qxl_debugfs_add_files(struct qxl_device *qdev,
43462306a36Sopenharmony_ci			   struct drm_info_list *files,
43562306a36Sopenharmony_ci			   unsigned int nfiles);
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ciint qxl_surface_id_alloc(struct qxl_device *qdev,
43862306a36Sopenharmony_ci			 struct qxl_bo *surf);
43962306a36Sopenharmony_civoid qxl_surface_id_dealloc(struct qxl_device *qdev,
44062306a36Sopenharmony_ci			    uint32_t surface_id);
44162306a36Sopenharmony_ciint qxl_hw_surface_alloc(struct qxl_device *qdev,
44262306a36Sopenharmony_ci			 struct qxl_bo *surf);
44362306a36Sopenharmony_ciint qxl_hw_surface_dealloc(struct qxl_device *qdev,
44462306a36Sopenharmony_ci			   struct qxl_bo *surf);
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ciint qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo);
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_cistruct qxl_drv_surface *
44962306a36Sopenharmony_ciqxl_surface_lookup(struct drm_device *dev, int surface_id);
45062306a36Sopenharmony_civoid qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing);
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci/* qxl_ioctl.c */
45362306a36Sopenharmony_ciint qxl_alloc_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
45462306a36Sopenharmony_ciint qxl_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
45562306a36Sopenharmony_ciint qxl_execbuffer_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
45662306a36Sopenharmony_ciint qxl_update_area_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
45762306a36Sopenharmony_ciint qxl_getparam_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
45862306a36Sopenharmony_ciint qxl_clientcap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv);
45962306a36Sopenharmony_ciint qxl_alloc_surf_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci#endif
462