/* SPDX-License-Identifier: MIT */1/*2* fbif.h -- Xen virtual frame buffer device3*4* Copyright (C) 2005 Anthony Liguori <[email protected]>5* Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <[email protected]>6*/78#ifndef __XEN_PUBLIC_IO_FBIF_H__9#define __XEN_PUBLIC_IO_FBIF_H__1011/* Out events (frontend -> backend) */1213/*14* Out events may be sent only when requested by backend, and receipt15* of an unknown out event is an error.16*/1718/* Event type 1 currently not used */19/*20* Framebuffer update notification event21* Capable frontend sets feature-update in xenstore.22* Backend requests it by setting request-update in xenstore.23*/24#define XENFB_TYPE_UPDATE 22526struct xenfb_update {27uint8_t type; /* XENFB_TYPE_UPDATE */28int32_t x; /* source x */29int32_t y; /* source y */30int32_t width; /* rect width */31int32_t height; /* rect height */32};3334/*35* Framebuffer resize notification event36* Capable backend sets feature-resize in xenstore.37*/38#define XENFB_TYPE_RESIZE 33940struct xenfb_resize {41uint8_t type; /* XENFB_TYPE_RESIZE */42int32_t width; /* width in pixels */43int32_t height; /* height in pixels */44int32_t stride; /* stride in bytes */45int32_t depth; /* depth in bits */46int32_t offset; /* start offset within framebuffer */47};4849#define XENFB_OUT_EVENT_SIZE 405051union xenfb_out_event {52uint8_t type;53struct xenfb_update update;54struct xenfb_resize resize;55char pad[XENFB_OUT_EVENT_SIZE];56};5758/* In events (backend -> frontend) */5960/*61* Frontends should ignore unknown in events.62* No in events currently defined.63*/6465#define XENFB_IN_EVENT_SIZE 406667union xenfb_in_event {68uint8_t type;69char pad[XENFB_IN_EVENT_SIZE];70};7172/* shared page */7374#define XENFB_IN_RING_SIZE 102475#define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE)76#define XENFB_IN_RING_OFFS 102477#define XENFB_IN_RING(page) \78((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS))79#define XENFB_IN_RING_REF(page, idx) \80(XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN])8182#define XENFB_OUT_RING_SIZE 204883#define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE)84#define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE)85#define XENFB_OUT_RING(page) \86((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS))87#define XENFB_OUT_RING_REF(page, idx) \88(XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN])8990struct xenfb_page {91uint32_t in_cons, in_prod;92uint32_t out_cons, out_prod;9394int32_t width; /* width of the framebuffer (in pixels) */95int32_t height; /* height of the framebuffer (in pixels) */96uint32_t line_length; /* length of a row of pixels (in bytes) */97uint32_t mem_length; /* length of the framebuffer (in bytes) */98uint8_t depth; /* depth of a pixel (in bits) */99100/*101* Framebuffer page directory102*103* Each directory page holds PAGE_SIZE / sizeof(*pd)104* framebuffer pages, and can thus map up to PAGE_SIZE *105* PAGE_SIZE / sizeof(*pd) bytes. With PAGE_SIZE == 4096 and106* sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2107* Megs 64 bit. 256 directories give enough room for a 512108* Meg framebuffer with a max resolution of 12,800x10,240.109* Should be enough for a while with room leftover for110* expansion.111*/112unsigned long pd[256];113};114115/*116* Wart: xenkbd needs to know default resolution. Put it here until a117* better solution is found, but don't leak it to the backend.118*/119#ifdef __KERNEL__120#define XENFB_WIDTH 800121#define XENFB_HEIGHT 600122#define XENFB_DEPTH 32123#endif124125#endif126127128