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