xref: /linux/include/xen/interface/io/fbif.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1*9e2b3e83SJuergen Gross /* SPDX-License-Identifier: MIT */
24ee36dc0SMarkus Armbruster /*
34ee36dc0SMarkus Armbruster  * fbif.h -- Xen virtual frame buffer device
44ee36dc0SMarkus Armbruster  *
54ee36dc0SMarkus Armbruster  * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
64ee36dc0SMarkus Armbruster  * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
74ee36dc0SMarkus Armbruster  */
84ee36dc0SMarkus Armbruster 
94ee36dc0SMarkus Armbruster #ifndef __XEN_PUBLIC_IO_FBIF_H__
104ee36dc0SMarkus Armbruster #define __XEN_PUBLIC_IO_FBIF_H__
114ee36dc0SMarkus Armbruster 
124ee36dc0SMarkus Armbruster /* Out events (frontend -> backend) */
134ee36dc0SMarkus Armbruster 
144ee36dc0SMarkus Armbruster /*
154ee36dc0SMarkus Armbruster  * Out events may be sent only when requested by backend, and receipt
164ee36dc0SMarkus Armbruster  * of an unknown out event is an error.
174ee36dc0SMarkus Armbruster  */
184ee36dc0SMarkus Armbruster 
194ee36dc0SMarkus Armbruster /* Event type 1 currently not used */
204ee36dc0SMarkus Armbruster /*
214ee36dc0SMarkus Armbruster  * Framebuffer update notification event
224ee36dc0SMarkus Armbruster  * Capable frontend sets feature-update in xenstore.
234ee36dc0SMarkus Armbruster  * Backend requests it by setting request-update in xenstore.
244ee36dc0SMarkus Armbruster  */
254ee36dc0SMarkus Armbruster #define XENFB_TYPE_UPDATE 2
264ee36dc0SMarkus Armbruster 
274ee36dc0SMarkus Armbruster struct xenfb_update {
284ee36dc0SMarkus Armbruster 	uint8_t type;		/* XENFB_TYPE_UPDATE */
294ee36dc0SMarkus Armbruster 	int32_t x;		/* source x */
304ee36dc0SMarkus Armbruster 	int32_t y;		/* source y */
314ee36dc0SMarkus Armbruster 	int32_t width;		/* rect width */
324ee36dc0SMarkus Armbruster 	int32_t height;		/* rect height */
334ee36dc0SMarkus Armbruster };
344ee36dc0SMarkus Armbruster 
35e4dcff1fSMarkus Armbruster /*
36e4dcff1fSMarkus Armbruster  * Framebuffer resize notification event
37e4dcff1fSMarkus Armbruster  * Capable backend sets feature-resize in xenstore.
38e4dcff1fSMarkus Armbruster  */
39e4dcff1fSMarkus Armbruster #define XENFB_TYPE_RESIZE 3
40e4dcff1fSMarkus Armbruster 
41e4dcff1fSMarkus Armbruster struct xenfb_resize {
42e4dcff1fSMarkus Armbruster 	uint8_t type;		/* XENFB_TYPE_RESIZE */
43e4dcff1fSMarkus Armbruster 	int32_t width;		/* width in pixels */
44e4dcff1fSMarkus Armbruster 	int32_t height;		/* height in pixels */
45e4dcff1fSMarkus Armbruster 	int32_t stride;		/* stride in bytes */
46e4dcff1fSMarkus Armbruster 	int32_t depth;		/* depth in bits */
47e4dcff1fSMarkus Armbruster 	int32_t offset;		/* start offset within framebuffer */
48e4dcff1fSMarkus Armbruster };
49e4dcff1fSMarkus Armbruster 
504ee36dc0SMarkus Armbruster #define XENFB_OUT_EVENT_SIZE 40
514ee36dc0SMarkus Armbruster 
524ee36dc0SMarkus Armbruster union xenfb_out_event {
534ee36dc0SMarkus Armbruster 	uint8_t type;
544ee36dc0SMarkus Armbruster 	struct xenfb_update update;
55e4dcff1fSMarkus Armbruster 	struct xenfb_resize resize;
564ee36dc0SMarkus Armbruster 	char pad[XENFB_OUT_EVENT_SIZE];
574ee36dc0SMarkus Armbruster };
584ee36dc0SMarkus Armbruster 
594ee36dc0SMarkus Armbruster /* In events (backend -> frontend) */
604ee36dc0SMarkus Armbruster 
614ee36dc0SMarkus Armbruster /*
624ee36dc0SMarkus Armbruster  * Frontends should ignore unknown in events.
634ee36dc0SMarkus Armbruster  * No in events currently defined.
644ee36dc0SMarkus Armbruster  */
654ee36dc0SMarkus Armbruster 
664ee36dc0SMarkus Armbruster #define XENFB_IN_EVENT_SIZE 40
674ee36dc0SMarkus Armbruster 
684ee36dc0SMarkus Armbruster union xenfb_in_event {
694ee36dc0SMarkus Armbruster 	uint8_t type;
704ee36dc0SMarkus Armbruster 	char pad[XENFB_IN_EVENT_SIZE];
714ee36dc0SMarkus Armbruster };
724ee36dc0SMarkus Armbruster 
734ee36dc0SMarkus Armbruster /* shared page */
744ee36dc0SMarkus Armbruster 
754ee36dc0SMarkus Armbruster #define XENFB_IN_RING_SIZE 1024
764ee36dc0SMarkus Armbruster #define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE)
774ee36dc0SMarkus Armbruster #define XENFB_IN_RING_OFFS 1024
784ee36dc0SMarkus Armbruster #define XENFB_IN_RING(page) \
794ee36dc0SMarkus Armbruster 	((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS))
804ee36dc0SMarkus Armbruster #define XENFB_IN_RING_REF(page, idx) \
814ee36dc0SMarkus Armbruster 	(XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN])
824ee36dc0SMarkus Armbruster 
834ee36dc0SMarkus Armbruster #define XENFB_OUT_RING_SIZE 2048
844ee36dc0SMarkus Armbruster #define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE)
854ee36dc0SMarkus Armbruster #define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE)
864ee36dc0SMarkus Armbruster #define XENFB_OUT_RING(page) \
874ee36dc0SMarkus Armbruster 	((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS))
884ee36dc0SMarkus Armbruster #define XENFB_OUT_RING_REF(page, idx) \
894ee36dc0SMarkus Armbruster 	(XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN])
904ee36dc0SMarkus Armbruster 
914ee36dc0SMarkus Armbruster struct xenfb_page {
924ee36dc0SMarkus Armbruster 	uint32_t in_cons, in_prod;
934ee36dc0SMarkus Armbruster 	uint32_t out_cons, out_prod;
944ee36dc0SMarkus Armbruster 
954ee36dc0SMarkus Armbruster 	int32_t width;          /* width of the framebuffer (in pixels) */
964ee36dc0SMarkus Armbruster 	int32_t height;         /* height of the framebuffer (in pixels) */
974ee36dc0SMarkus Armbruster 	uint32_t line_length;   /* length of a row of pixels (in bytes) */
984ee36dc0SMarkus Armbruster 	uint32_t mem_length;    /* length of the framebuffer (in bytes) */
994ee36dc0SMarkus Armbruster 	uint8_t depth;          /* depth of a pixel (in bits) */
1004ee36dc0SMarkus Armbruster 
1014ee36dc0SMarkus Armbruster 	/*
1024ee36dc0SMarkus Armbruster 	 * Framebuffer page directory
1034ee36dc0SMarkus Armbruster 	 *
1044ee36dc0SMarkus Armbruster 	 * Each directory page holds PAGE_SIZE / sizeof(*pd)
1054ee36dc0SMarkus Armbruster 	 * framebuffer pages, and can thus map up to PAGE_SIZE *
1064ee36dc0SMarkus Armbruster 	 * PAGE_SIZE / sizeof(*pd) bytes.  With PAGE_SIZE == 4096 and
107e4dcff1fSMarkus Armbruster 	 * sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2
108e4dcff1fSMarkus Armbruster 	 * Megs 64 bit.  256 directories give enough room for a 512
109e4dcff1fSMarkus Armbruster 	 * Meg framebuffer with a max resolution of 12,800x10,240.
110e4dcff1fSMarkus Armbruster 	 * Should be enough for a while with room leftover for
111e4dcff1fSMarkus Armbruster 	 * expansion.
1124ee36dc0SMarkus Armbruster 	 */
113e4dcff1fSMarkus Armbruster 	unsigned long pd[256];
1144ee36dc0SMarkus Armbruster };
1154ee36dc0SMarkus Armbruster 
1164ee36dc0SMarkus Armbruster /*
117e4dcff1fSMarkus Armbruster  * Wart: xenkbd needs to know default resolution.  Put it here until a
118e4dcff1fSMarkus Armbruster  * better solution is found, but don't leak it to the backend.
1194ee36dc0SMarkus Armbruster  */
1204ee36dc0SMarkus Armbruster #ifdef __KERNEL__
1214ee36dc0SMarkus Armbruster #define XENFB_WIDTH 800
1224ee36dc0SMarkus Armbruster #define XENFB_HEIGHT 600
1234ee36dc0SMarkus Armbruster #define XENFB_DEPTH 32
1244ee36dc0SMarkus Armbruster #endif
1254ee36dc0SMarkus Armbruster 
1264ee36dc0SMarkus Armbruster #endif
127