1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * fbif.h -- Xen virtual frame buffer device 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a copy 5*4882a593Smuzhiyun * of this software and associated documentation files (the "Software"), to 6*4882a593Smuzhiyun * deal in the Software without restriction, including without limitation the 7*4882a593Smuzhiyun * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8*4882a593Smuzhiyun * sell copies of the Software, and to permit persons to whom the Software is 9*4882a593Smuzhiyun * furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in 12*4882a593Smuzhiyun * all copies or substantial portions of the Software. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17*4882a593Smuzhiyun * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20*4882a593Smuzhiyun * DEALINGS IN THE SOFTWARE. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com> 23*4882a593Smuzhiyun * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com> 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifndef __XEN_PUBLIC_IO_FBIF_H__ 27*4882a593Smuzhiyun #define __XEN_PUBLIC_IO_FBIF_H__ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* Out events (frontend -> backend) */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* 32*4882a593Smuzhiyun * Out events may be sent only when requested by backend, and receipt 33*4882a593Smuzhiyun * of an unknown out event is an error. 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Event type 1 currently not used */ 37*4882a593Smuzhiyun /* 38*4882a593Smuzhiyun * Framebuffer update notification event 39*4882a593Smuzhiyun * Capable frontend sets feature-update in xenstore. 40*4882a593Smuzhiyun * Backend requests it by setting request-update in xenstore. 41*4882a593Smuzhiyun */ 42*4882a593Smuzhiyun #define XENFB_TYPE_UPDATE 2 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct xenfb_update { 45*4882a593Smuzhiyun uint8_t type; /* XENFB_TYPE_UPDATE */ 46*4882a593Smuzhiyun int32_t x; /* source x */ 47*4882a593Smuzhiyun int32_t y; /* source y */ 48*4882a593Smuzhiyun int32_t width; /* rect width */ 49*4882a593Smuzhiyun int32_t height; /* rect height */ 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * Framebuffer resize notification event 54*4882a593Smuzhiyun * Capable backend sets feature-resize in xenstore. 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun #define XENFB_TYPE_RESIZE 3 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct xenfb_resize { 59*4882a593Smuzhiyun uint8_t type; /* XENFB_TYPE_RESIZE */ 60*4882a593Smuzhiyun int32_t width; /* width in pixels */ 61*4882a593Smuzhiyun int32_t height; /* height in pixels */ 62*4882a593Smuzhiyun int32_t stride; /* stride in bytes */ 63*4882a593Smuzhiyun int32_t depth; /* depth in bits */ 64*4882a593Smuzhiyun int32_t offset; /* start offset within framebuffer */ 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define XENFB_OUT_EVENT_SIZE 40 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun union xenfb_out_event { 70*4882a593Smuzhiyun uint8_t type; 71*4882a593Smuzhiyun struct xenfb_update update; 72*4882a593Smuzhiyun struct xenfb_resize resize; 73*4882a593Smuzhiyun char pad[XENFB_OUT_EVENT_SIZE]; 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* In events (backend -> frontend) */ 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* 79*4882a593Smuzhiyun * Frontends should ignore unknown in events. 80*4882a593Smuzhiyun * No in events currently defined. 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define XENFB_IN_EVENT_SIZE 40 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun union xenfb_in_event { 86*4882a593Smuzhiyun uint8_t type; 87*4882a593Smuzhiyun char pad[XENFB_IN_EVENT_SIZE]; 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* shared page */ 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define XENFB_IN_RING_SIZE 1024 93*4882a593Smuzhiyun #define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE) 94*4882a593Smuzhiyun #define XENFB_IN_RING_OFFS 1024 95*4882a593Smuzhiyun #define XENFB_IN_RING(page) \ 96*4882a593Smuzhiyun ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS)) 97*4882a593Smuzhiyun #define XENFB_IN_RING_REF(page, idx) \ 98*4882a593Smuzhiyun (XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN]) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #define XENFB_OUT_RING_SIZE 2048 101*4882a593Smuzhiyun #define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE) 102*4882a593Smuzhiyun #define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE) 103*4882a593Smuzhiyun #define XENFB_OUT_RING(page) \ 104*4882a593Smuzhiyun ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS)) 105*4882a593Smuzhiyun #define XENFB_OUT_RING_REF(page, idx) \ 106*4882a593Smuzhiyun (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN]) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct xenfb_page { 109*4882a593Smuzhiyun uint32_t in_cons, in_prod; 110*4882a593Smuzhiyun uint32_t out_cons, out_prod; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun int32_t width; /* width of the framebuffer (in pixels) */ 113*4882a593Smuzhiyun int32_t height; /* height of the framebuffer (in pixels) */ 114*4882a593Smuzhiyun uint32_t line_length; /* length of a row of pixels (in bytes) */ 115*4882a593Smuzhiyun uint32_t mem_length; /* length of the framebuffer (in bytes) */ 116*4882a593Smuzhiyun uint8_t depth; /* depth of a pixel (in bits) */ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* 119*4882a593Smuzhiyun * Framebuffer page directory 120*4882a593Smuzhiyun * 121*4882a593Smuzhiyun * Each directory page holds PAGE_SIZE / sizeof(*pd) 122*4882a593Smuzhiyun * framebuffer pages, and can thus map up to PAGE_SIZE * 123*4882a593Smuzhiyun * PAGE_SIZE / sizeof(*pd) bytes. With PAGE_SIZE == 4096 and 124*4882a593Smuzhiyun * sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2 125*4882a593Smuzhiyun * Megs 64 bit. 256 directories give enough room for a 512 126*4882a593Smuzhiyun * Meg framebuffer with a max resolution of 12,800x10,240. 127*4882a593Smuzhiyun * Should be enough for a while with room leftover for 128*4882a593Smuzhiyun * expansion. 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun unsigned long pd[256]; 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* 134*4882a593Smuzhiyun * Wart: xenkbd needs to know default resolution. Put it here until a 135*4882a593Smuzhiyun * better solution is found, but don't leak it to the backend. 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun #ifdef __KERNEL__ 138*4882a593Smuzhiyun #define XENFB_WIDTH 800 139*4882a593Smuzhiyun #define XENFB_HEIGHT 600 140*4882a593Smuzhiyun #define XENFB_DEPTH 32 141*4882a593Smuzhiyun #endif 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #endif 144