xref: /openbmc/qemu/include/hw/xen/interface/io/fbif.h (revision 8ac98aed)
1*8ac98aedSDavid Woodhouse /* SPDX-License-Identifier: MIT */
2a3434a2dSAnthony PERARD /*
3a3434a2dSAnthony PERARD  * fbif.h -- Xen virtual frame buffer device
4a3434a2dSAnthony PERARD  *
5a3434a2dSAnthony PERARD  * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
6a3434a2dSAnthony PERARD  * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
7a3434a2dSAnthony PERARD  */
8a3434a2dSAnthony PERARD 
9a3434a2dSAnthony PERARD #ifndef __XEN_PUBLIC_IO_FBIF_H__
10a3434a2dSAnthony PERARD #define __XEN_PUBLIC_IO_FBIF_H__
11a3434a2dSAnthony PERARD 
12a3434a2dSAnthony PERARD /* Out events (frontend -> backend) */
13a3434a2dSAnthony PERARD 
14a3434a2dSAnthony PERARD /*
15a3434a2dSAnthony PERARD  * Out events may be sent only when requested by backend, and receipt
16a3434a2dSAnthony PERARD  * of an unknown out event is an error.
17a3434a2dSAnthony PERARD  */
18a3434a2dSAnthony PERARD 
19a3434a2dSAnthony PERARD /* Event type 1 currently not used */
20a3434a2dSAnthony PERARD /*
21a3434a2dSAnthony PERARD  * Framebuffer update notification event
22a3434a2dSAnthony PERARD  * Capable frontend sets feature-update in xenstore.
23a3434a2dSAnthony PERARD  * Backend requests it by setting request-update in xenstore.
24a3434a2dSAnthony PERARD  */
25a3434a2dSAnthony PERARD #define XENFB_TYPE_UPDATE 2
26a3434a2dSAnthony PERARD 
27a3434a2dSAnthony PERARD struct xenfb_update
28a3434a2dSAnthony PERARD {
29a3434a2dSAnthony PERARD     uint8_t type;    /* XENFB_TYPE_UPDATE */
30a3434a2dSAnthony PERARD     int32_t x;      /* source x */
31a3434a2dSAnthony PERARD     int32_t y;      /* source y */
32a3434a2dSAnthony PERARD     int32_t width;  /* rect width */
33a3434a2dSAnthony PERARD     int32_t height; /* rect height */
34a3434a2dSAnthony PERARD };
35a3434a2dSAnthony PERARD 
36a3434a2dSAnthony PERARD /*
37a3434a2dSAnthony PERARD  * Framebuffer resize notification event
38a3434a2dSAnthony PERARD  * Capable backend sets feature-resize in xenstore.
39a3434a2dSAnthony PERARD  */
40a3434a2dSAnthony PERARD #define XENFB_TYPE_RESIZE 3
41a3434a2dSAnthony PERARD 
42a3434a2dSAnthony PERARD struct xenfb_resize
43a3434a2dSAnthony PERARD {
44a3434a2dSAnthony PERARD     uint8_t type;    /* XENFB_TYPE_RESIZE */
45a3434a2dSAnthony PERARD     int32_t width;   /* width in pixels */
46a3434a2dSAnthony PERARD     int32_t height;  /* height in pixels */
47a3434a2dSAnthony PERARD     int32_t stride;  /* stride in bytes */
48a3434a2dSAnthony PERARD     int32_t depth;   /* depth in bits */
49a3434a2dSAnthony PERARD     int32_t offset;  /* offset of the framebuffer in bytes */
50a3434a2dSAnthony PERARD };
51a3434a2dSAnthony PERARD 
52a3434a2dSAnthony PERARD #define XENFB_OUT_EVENT_SIZE 40
53a3434a2dSAnthony PERARD 
54a3434a2dSAnthony PERARD union xenfb_out_event
55a3434a2dSAnthony PERARD {
56a3434a2dSAnthony PERARD     uint8_t type;
57a3434a2dSAnthony PERARD     struct xenfb_update update;
58a3434a2dSAnthony PERARD     struct xenfb_resize resize;
59a3434a2dSAnthony PERARD     char pad[XENFB_OUT_EVENT_SIZE];
60a3434a2dSAnthony PERARD };
61a3434a2dSAnthony PERARD 
62a3434a2dSAnthony PERARD /* In events (backend -> frontend) */
63a3434a2dSAnthony PERARD 
64a3434a2dSAnthony PERARD /*
65a3434a2dSAnthony PERARD  * Frontends should ignore unknown in events.
66a3434a2dSAnthony PERARD  */
67a3434a2dSAnthony PERARD 
68a3434a2dSAnthony PERARD /*
69a3434a2dSAnthony PERARD  * Framebuffer refresh period advice
70a3434a2dSAnthony PERARD  * Backend sends it to advise the frontend their preferred period of
71a3434a2dSAnthony PERARD  * refresh.  Frontends that keep the framebuffer constantly up-to-date
72a3434a2dSAnthony PERARD  * just ignore it.  Frontends that use the advice should immediately
73a3434a2dSAnthony PERARD  * refresh the framebuffer (and send an update notification event if
74a3434a2dSAnthony PERARD  * those have been requested), then use the update frequency to guide
75a3434a2dSAnthony PERARD  * their periodical refreshs.
76a3434a2dSAnthony PERARD  */
77a3434a2dSAnthony PERARD #define XENFB_TYPE_REFRESH_PERIOD 1
78a3434a2dSAnthony PERARD #define XENFB_NO_REFRESH 0
79a3434a2dSAnthony PERARD 
80a3434a2dSAnthony PERARD struct xenfb_refresh_period
81a3434a2dSAnthony PERARD {
82a3434a2dSAnthony PERARD     uint8_t type;    /* XENFB_TYPE_UPDATE_PERIOD */
83a3434a2dSAnthony PERARD     uint32_t period; /* period of refresh, in ms,
84a3434a2dSAnthony PERARD                       * XENFB_NO_REFRESH if no refresh is needed */
85a3434a2dSAnthony PERARD };
86a3434a2dSAnthony PERARD 
87a3434a2dSAnthony PERARD #define XENFB_IN_EVENT_SIZE 40
88a3434a2dSAnthony PERARD 
89a3434a2dSAnthony PERARD union xenfb_in_event
90a3434a2dSAnthony PERARD {
91a3434a2dSAnthony PERARD     uint8_t type;
92a3434a2dSAnthony PERARD     struct xenfb_refresh_period refresh_period;
93a3434a2dSAnthony PERARD     char pad[XENFB_IN_EVENT_SIZE];
94a3434a2dSAnthony PERARD };
95a3434a2dSAnthony PERARD 
96a3434a2dSAnthony PERARD /* shared page */
97a3434a2dSAnthony PERARD 
98a3434a2dSAnthony PERARD #define XENFB_IN_RING_SIZE 1024
99a3434a2dSAnthony PERARD #define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE)
100a3434a2dSAnthony PERARD #define XENFB_IN_RING_OFFS 1024
101a3434a2dSAnthony PERARD #define XENFB_IN_RING(page) \
102a3434a2dSAnthony PERARD     ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS))
103a3434a2dSAnthony PERARD #define XENFB_IN_RING_REF(page, idx) \
104a3434a2dSAnthony PERARD     (XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN])
105a3434a2dSAnthony PERARD 
106a3434a2dSAnthony PERARD #define XENFB_OUT_RING_SIZE 2048
107a3434a2dSAnthony PERARD #define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE)
108a3434a2dSAnthony PERARD #define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE)
109a3434a2dSAnthony PERARD #define XENFB_OUT_RING(page) \
110a3434a2dSAnthony PERARD     ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS))
111a3434a2dSAnthony PERARD #define XENFB_OUT_RING_REF(page, idx) \
112a3434a2dSAnthony PERARD     (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN])
113a3434a2dSAnthony PERARD 
114a3434a2dSAnthony PERARD struct xenfb_page
115a3434a2dSAnthony PERARD {
116a3434a2dSAnthony PERARD     uint32_t in_cons, in_prod;
117a3434a2dSAnthony PERARD     uint32_t out_cons, out_prod;
118a3434a2dSAnthony PERARD 
119a3434a2dSAnthony PERARD     int32_t width;          /* the width of the framebuffer (in pixels) */
120a3434a2dSAnthony PERARD     int32_t height;         /* the height of the framebuffer (in pixels) */
121a3434a2dSAnthony PERARD     uint32_t line_length;   /* the length of a row of pixels (in bytes) */
122a3434a2dSAnthony PERARD     uint32_t mem_length;    /* the length of the framebuffer (in bytes) */
123a3434a2dSAnthony PERARD     uint8_t depth;          /* the depth of a pixel (in bits) */
124a3434a2dSAnthony PERARD 
125a3434a2dSAnthony PERARD     /*
126a3434a2dSAnthony PERARD      * Framebuffer page directory
127a3434a2dSAnthony PERARD      *
128a3434a2dSAnthony PERARD      * Each directory page holds PAGE_SIZE / sizeof(*pd)
129a3434a2dSAnthony PERARD      * framebuffer pages, and can thus map up to PAGE_SIZE *
130a3434a2dSAnthony PERARD      * PAGE_SIZE / sizeof(*pd) bytes.  With PAGE_SIZE == 4096 and
131a3434a2dSAnthony PERARD      * sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2 Megs
132a3434a2dSAnthony PERARD      * 64 bit.  256 directories give enough room for a 512 Meg
133a3434a2dSAnthony PERARD      * framebuffer with a max resolution of 12,800x10,240.  Should
134a3434a2dSAnthony PERARD      * be enough for a while with room leftover for expansion.
135a3434a2dSAnthony PERARD      */
136a3434a2dSAnthony PERARD     unsigned long pd[256];
137a3434a2dSAnthony PERARD };
138a3434a2dSAnthony PERARD 
13950c88402SJoao Martins /*
14050c88402SJoao Martins  * Wart: xenkbd needs to know default resolution.  Put it here until a
14150c88402SJoao Martins  * better solution is found, but don't leak it to the backend.
14250c88402SJoao Martins  */
14350c88402SJoao Martins #ifdef __KERNEL__
14450c88402SJoao Martins #define XENFB_WIDTH 800
14550c88402SJoao Martins #define XENFB_HEIGHT 600
14650c88402SJoao Martins #define XENFB_DEPTH 32
147a3434a2dSAnthony PERARD #endif
14850c88402SJoao Martins 
14950c88402SJoao Martins #endif
15050c88402SJoao Martins 
15150c88402SJoao Martins /*
15250c88402SJoao Martins  * Local variables:
15350c88402SJoao Martins  * mode: C
15450c88402SJoao Martins  * c-file-style: "BSD"
15550c88402SJoao Martins  * c-basic-offset: 4
15650c88402SJoao Martins  * tab-width: 4
15750c88402SJoao Martins  * indent-tabs-mode: nil
15850c88402SJoao Martins  * End:
15950c88402SJoao Martins  */
160