| 1 |
|
| 2 | |
| 3 | * fbif.h -- Xen virtual frame buffer device
|
| 4 | *
|
| 5 | * Copyright (C) 2005 Anthony Liguori <[email protected]>
|
| 6 | * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <[email protected]>
|
| 7 |
|
| 8 |
|
| 9 | #ifndef __XEN_PUBLIC_IO_FBIF_H__
|
| 10 | #define __XEN_PUBLIC_IO_FBIF_H__
|
| 11 |
|
| 12 |
|
| 13 |
|
| 14 | |
| 15 | * Out events may be sent only when requested by backend, and receipt
|
| 16 | * of an unknown out event is an error.
|
| 17 |
|
| 18 |
|
| 19 |
|
| 20 | |
| 21 | * Framebuffer update notification event
|
| 22 | * Capable frontend sets feature-update in xenstore.
|
| 23 | * Backend requests it by setting request-update in xenstore.
|
| 24 |
|
| 25 | #define XENFB_TYPE_UPDATE 2
|
| 26 |
|
| 27 | struct xenfb_update {
|
| 28 | uint8_t type;
|
| 29 | int32_t x;
|
| 30 | int32_t y;
|
| 31 | int32_t width;
|
| 32 | int32_t height;
|
| 33 | };
|
| 34 |
|
| 35 | |
| 36 | * Framebuffer resize notification event
|
| 37 | * Capable backend sets feature-resize in xenstore.
|
| 38 |
|
| 39 | #define XENFB_TYPE_RESIZE 3
|
| 40 |
|
| 41 | struct xenfb_resize {
|
| 42 | uint8_t type;
|
| 43 | int32_t width;
|
| 44 | int32_t height;
|
| 45 | int32_t stride;
|
| 46 | int32_t depth;
|
| 47 | int32_t offset;
|
| 48 | };
|
| 49 |
|
| 50 | #define XENFB_OUT_EVENT_SIZE 40
|
| 51 |
|
| 52 | union xenfb_out_event {
|
| 53 | uint8_t type;
|
| 54 | struct xenfb_update update;
|
| 55 | struct xenfb_resize resize;
|
| 56 | char pad[XENFB_OUT_EVENT_SIZE];
|
| 57 | };
|
| 58 |
|
| 59 |
|
| 60 |
|
| 61 | |
| 62 | * Frontends should ignore unknown in events.
|
| 63 | * No in events currently defined.
|
| 64 |
|
| 65 |
|
| 66 | #define XENFB_IN_EVENT_SIZE 40
|
| 67 |
|
| 68 | union xenfb_in_event {
|
| 69 | uint8_t type;
|
| 70 | char pad[XENFB_IN_EVENT_SIZE];
|
| 71 | };
|
| 72 |
|
| 73 |
|
| 74 |
|
| 75 | #define XENFB_IN_RING_SIZE 1024
|
| 76 | #define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE)
|
| 77 | #define XENFB_IN_RING_OFFS 1024
|
| 78 | #define XENFB_IN_RING(page) \
|
| 79 | ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS))
|
| 80 | #define XENFB_IN_RING_REF(page, idx) \
|
| 81 | (XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN])
|
| 82 |
|
| 83 | #define XENFB_OUT_RING_SIZE 2048
|
| 84 | #define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE)
|
| 85 | #define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE)
|
| 86 | #define XENFB_OUT_RING(page) \
|
| 87 | ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS))
|
| 88 | #define XENFB_OUT_RING_REF(page, idx) \
|
| 89 | (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN])
|
| 90 |
|
| 91 | struct xenfb_page {
|
| 92 | uint32_t in_cons, in_prod;
|
| 93 | uint32_t out_cons, out_prod;
|
| 94 |
|
| 95 | int32_t width;
|
| 96 | int32_t height;
|
| 97 | uint32_t line_length;
|
| 98 | uint32_t mem_length;
|
| 99 | uint8_t depth;
|
| 100 |
|
| 101 | |
| 102 | * Framebuffer page directory
|
| 103 | *
|
| 104 | * Each directory page holds PAGE_SIZE / sizeof(*pd)
|
| 105 | * framebuffer pages, and can thus map up to PAGE_SIZE *
|
| 106 | * PAGE_SIZE / sizeof(*pd) bytes. With PAGE_SIZE == 4096 and
|
| 107 | * sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2
|
| 108 | * Megs 64 bit. 256 directories give enough room for a 512
|
| 109 | * Meg framebuffer with a max resolution of 12,800x10,240.
|
| 110 | * Should be enough for a while with room leftover for
|
| 111 | * expansion.
|
| 112 |
|
| 113 | unsigned long pd[256];
|
| 114 | };
|
| 115 |
|
| 116 | |
| 117 | * Wart: xenkbd needs to know default resolution. Put it here until a
|
| 118 | * better solution is found, but don't leak it to the backend.
|
| 119 |
|
| 120 | #ifdef __KERNEL__
|
| 121 | #define XENFB_WIDTH 800
|
| 122 | #define XENFB_HEIGHT 600
|
| 123 | #define XENFB_DEPTH 32
|
| 124 | #endif
|
| 125 |
|
| 126 | #endif
|