xref: /linux/drivers/gpu/drm/vboxvideo/vbox_drv.h (revision 946661e3bef8efa11ba8079d4ebafe6fc3b0aaad)
1acc962c5SHans de Goede /* SPDX-License-Identifier: MIT */
2dd55d44fSHans de Goede /*
3dd55d44fSHans de Goede  * Copyright (C) 2013-2017 Oracle Corporation
4dd55d44fSHans de Goede  * This file is based on ast_drv.h
5dd55d44fSHans de Goede  * Copyright 2012 Red Hat Inc.
6dd55d44fSHans de Goede  * Authors: Dave Airlie <airlied@redhat.com>
7dd55d44fSHans de Goede  *          Michael Thayer <michael.thayer@oracle.com,
8dd55d44fSHans de Goede  *          Hans de Goede <hdegoede@redhat.com>
9dd55d44fSHans de Goede  */
10dd55d44fSHans de Goede #ifndef __VBOX_DRV_H__
11dd55d44fSHans de Goede #define __VBOX_DRV_H__
12dd55d44fSHans de Goede 
13dd55d44fSHans de Goede #include <linux/genalloc.h>
14dd55d44fSHans de Goede #include <linux/io.h>
150a2bca14SHans de Goede #include <linux/irqreturn.h>
16dd55d44fSHans de Goede #include <linux/string.h>
17dd55d44fSHans de Goede 
18dd55d44fSHans de Goede #include <drm/drm_encoder.h>
19dd55d44fSHans de Goede #include <drm/drm_gem.h>
205e6b9255SThomas Zimmermann #include <drm/drm_gem_vram_helper.h>
21dd55d44fSHans de Goede 
22dd55d44fSHans de Goede #include "vboxvideo_guest.h"
23dd55d44fSHans de Goede #include "vboxvideo_vbe.h"
24dd55d44fSHans de Goede #include "hgsmi_ch_setup.h"
25dd55d44fSHans de Goede 
26dd55d44fSHans de Goede #define DRIVER_NAME         "vboxvideo"
27dd55d44fSHans de Goede #define DRIVER_DESC         "Oracle VM VirtualBox Graphics Card"
28dd55d44fSHans de Goede 
29dd55d44fSHans de Goede #define DRIVER_MAJOR        1
30dd55d44fSHans de Goede #define DRIVER_MINOR        0
31dd55d44fSHans de Goede #define DRIVER_PATCHLEVEL   0
32dd55d44fSHans de Goede 
33dd55d44fSHans de Goede #define VBOX_MAX_CURSOR_WIDTH  64
34dd55d44fSHans de Goede #define VBOX_MAX_CURSOR_HEIGHT 64
35dd55d44fSHans de Goede #define CURSOR_PIXEL_COUNT (VBOX_MAX_CURSOR_WIDTH * VBOX_MAX_CURSOR_HEIGHT)
36dd55d44fSHans de Goede #define CURSOR_DATA_SIZE (CURSOR_PIXEL_COUNT * 4 + CURSOR_PIXEL_COUNT / 8)
37dd55d44fSHans de Goede 
38dd55d44fSHans de Goede #define VBOX_MAX_SCREENS  32
39dd55d44fSHans de Goede 
40dd55d44fSHans de Goede #define GUEST_HEAP_OFFSET(vbox) ((vbox)->full_vram_size - \
41dd55d44fSHans de Goede 				 VBVA_ADAPTER_INFORMATION_SIZE)
42dd55d44fSHans de Goede #define GUEST_HEAP_SIZE   VBVA_ADAPTER_INFORMATION_SIZE
43dd55d44fSHans de Goede #define GUEST_HEAP_USABLE_SIZE (VBVA_ADAPTER_INFORMATION_SIZE - \
44dd55d44fSHans de Goede 				sizeof(struct hgsmi_host_flags))
45dd55d44fSHans de Goede #define HOST_FLAGS_OFFSET GUEST_HEAP_USABLE_SIZE
46dd55d44fSHans de Goede 
47dd55d44fSHans de Goede struct vbox_private {
4801648890SHans de Goede 	/* Must be first; or we must define our own release callback */
4901648890SHans de Goede 	struct drm_device ddev;
50dd55d44fSHans de Goede 
51dd55d44fSHans de Goede 	u8 __iomem *guest_heap;
52dd55d44fSHans de Goede 	u8 __iomem *vbva_buffers;
53dd55d44fSHans de Goede 	struct gen_pool *guest_pool;
54dd55d44fSHans de Goede 	struct vbva_buf_ctx *vbva_info;
55dd55d44fSHans de Goede 	bool any_pitch;
56dd55d44fSHans de Goede 	u32 num_crtcs;
57cd76c287SHans de Goede 	/* Amount of available VRAM, including space used for buffers. */
58dd55d44fSHans de Goede 	u32 full_vram_size;
59cd76c287SHans de Goede 	/* Amount of available VRAM, not including space used for buffers. */
60dd55d44fSHans de Goede 	u32 available_vram_size;
61cd76c287SHans de Goede 	/* Array of structures for receiving mode hints. */
62dd55d44fSHans de Goede 	struct vbva_modehint *last_mode_hints;
63dd55d44fSHans de Goede 
64dd55d44fSHans de Goede 	int fb_mtrr;
65dd55d44fSHans de Goede 
66dd55d44fSHans de Goede 	struct mutex hw_mutex; /* protects modeset and accel/vbva accesses */
67dd55d44fSHans de Goede 	struct work_struct hotplug_work;
68dd55d44fSHans de Goede 	u32 input_mapping_width;
69dd55d44fSHans de Goede 	u32 input_mapping_height;
70cd76c287SHans de Goede 	/*
71dd55d44fSHans de Goede 	 * Is user-space using an X.Org-style layout of one large frame-buffer
72dd55d44fSHans de Goede 	 * encompassing all screen ones or is the fbdev console active?
73dd55d44fSHans de Goede 	 */
74dd55d44fSHans de Goede 	bool single_framebuffer;
75dd55d44fSHans de Goede 	u8 cursor_data[CURSOR_DATA_SIZE];
76dd55d44fSHans de Goede };
77dd55d44fSHans de Goede 
78dd55d44fSHans de Goede #undef CURSOR_PIXEL_COUNT
79dd55d44fSHans de Goede #undef CURSOR_DATA_SIZE
80dd55d44fSHans de Goede 
81dd55d44fSHans de Goede struct vbox_connector {
82dd55d44fSHans de Goede 	struct drm_connector base;
83dd55d44fSHans de Goede 	char name[32];
84dd55d44fSHans de Goede 	struct vbox_crtc *vbox_crtc;
85dd55d44fSHans de Goede 	struct {
86ce10d7b4SHans de Goede 		u32 width;
87ce10d7b4SHans de Goede 		u32 height;
88dd55d44fSHans de Goede 		bool disconnected;
89dd55d44fSHans de Goede 	} mode_hint;
90dd55d44fSHans de Goede };
91dd55d44fSHans de Goede 
92dd55d44fSHans de Goede struct vbox_crtc {
93dd55d44fSHans de Goede 	struct drm_crtc base;
94dd55d44fSHans de Goede 	bool disconnected;
95dd55d44fSHans de Goede 	unsigned int crtc_id;
96dd55d44fSHans de Goede 	u32 fb_offset;
97dd55d44fSHans de Goede 	bool cursor_enabled;
98ce10d7b4SHans de Goede 	u32 x_hint;
99ce10d7b4SHans de Goede 	u32 y_hint;
100e2f958d0SHans de Goede 	/*
101e2f958d0SHans de Goede 	 * When setting a mode we not only pass the mode to the hypervisor,
102e2f958d0SHans de Goede 	 * but also information on how to map / translate input coordinates
103e2f958d0SHans de Goede 	 * for the emulated USB tablet.  This input-mapping may change when
104e2f958d0SHans de Goede 	 * the mode on *another* crtc changes.
105e2f958d0SHans de Goede 	 *
106e2f958d0SHans de Goede 	 * This means that sometimes we must do a modeset on other crtc-s then
107e2f958d0SHans de Goede 	 * the one being changed to update the input-mapping. Including crtc-s
108e2f958d0SHans de Goede 	 * which may be disabled inside the guest (shown as a black window
109e2f958d0SHans de Goede 	 * on the host unless closed by the user).
110e2f958d0SHans de Goede 	 *
111e2f958d0SHans de Goede 	 * With atomic modesetting the mode-info of disabled crtcs gets zeroed
112e2f958d0SHans de Goede 	 * yet we need it when updating the input-map to avoid resizing the
113e2f958d0SHans de Goede 	 * window as a side effect of a mode_set on another crtc. Therefor we
114e2f958d0SHans de Goede 	 * cache the info of the last mode below.
115e2f958d0SHans de Goede 	 */
116e2f958d0SHans de Goede 	u32 width;
117e2f958d0SHans de Goede 	u32 height;
118e2f958d0SHans de Goede 	u32 x;
119e2f958d0SHans de Goede 	u32 y;
120dd55d44fSHans de Goede };
121dd55d44fSHans de Goede 
122dd55d44fSHans de Goede struct vbox_encoder {
123dd55d44fSHans de Goede 	struct drm_encoder base;
124dd55d44fSHans de Goede };
125dd55d44fSHans de Goede 
126dd55d44fSHans de Goede #define to_vbox_crtc(x) container_of(x, struct vbox_crtc, base)
127dd55d44fSHans de Goede #define to_vbox_connector(x) container_of(x, struct vbox_connector, base)
128dd55d44fSHans de Goede #define to_vbox_encoder(x) container_of(x, struct vbox_encoder, base)
129*dd9a6893SDaniel Vetter #define to_vbox_dev(x) container_of(x, struct vbox_private, ddev)
130dd55d44fSHans de Goede 
131d4670909SHans de Goede bool vbox_check_supported(u16 id);
132d4670909SHans de Goede int vbox_hw_init(struct vbox_private *vbox);
133d4670909SHans de Goede void vbox_hw_fini(struct vbox_private *vbox);
134d4670909SHans de Goede 
13501648890SHans de Goede int vbox_mode_init(struct vbox_private *vbox);
13601648890SHans de Goede void vbox_mode_fini(struct vbox_private *vbox);
137dd55d44fSHans de Goede 
138dd55d44fSHans de Goede void vbox_report_caps(struct vbox_private *vbox);
139dd55d44fSHans de Goede 
140dd55d44fSHans de Goede int vbox_mm_init(struct vbox_private *vbox);
141dd55d44fSHans de Goede 
142dd55d44fSHans de Goede /* vbox_irq.c */
143dd55d44fSHans de Goede int vbox_irq_init(struct vbox_private *vbox);
144dd55d44fSHans de Goede void vbox_irq_fini(struct vbox_private *vbox);
145dd55d44fSHans de Goede void vbox_report_hotplug(struct vbox_private *vbox);
146dd55d44fSHans de Goede 
147dd55d44fSHans de Goede /* vbox_hgsmi.c */
148dd55d44fSHans de Goede void *hgsmi_buffer_alloc(struct gen_pool *guest_pool, size_t size,
149dd55d44fSHans de Goede 			 u8 channel, u16 channel_info);
150dd55d44fSHans de Goede void hgsmi_buffer_free(struct gen_pool *guest_pool, void *buf);
151dd55d44fSHans de Goede int hgsmi_buffer_submit(struct gen_pool *guest_pool, void *buf);
152dd55d44fSHans de Goede 
vbox_write_ioport(u16 index,u16 data)153dd55d44fSHans de Goede static inline void vbox_write_ioport(u16 index, u16 data)
154dd55d44fSHans de Goede {
155dd55d44fSHans de Goede 	outw(index, VBE_DISPI_IOPORT_INDEX);
156dd55d44fSHans de Goede 	outw(data, VBE_DISPI_IOPORT_DATA);
157dd55d44fSHans de Goede }
158dd55d44fSHans de Goede 
159dd55d44fSHans de Goede #endif
160