xref: /kvmtool/framebuffer.c (revision 7fca1897f9dd98dea482321c069840256f477a9c)
1 #include "kvm/framebuffer.h"
2 
3 #include <linux/kernel.h>
4 #include <linux/list.h>
5 #include <stdlib.h>
6 #include <sys/mman.h>
7 
8 static LIST_HEAD(framebuffers);
9 
10 struct framebuffer *fb__register(struct framebuffer *fb)
11 {
12 	INIT_LIST_HEAD(&fb->node);
13 	list_add(&fb->node, &framebuffers);
14 
15 	return fb;
16 }
17 
18 int fb__attach(struct framebuffer *fb, struct fb_target_operations *ops)
19 {
20 	if (fb->nr_targets >= FB_MAX_TARGETS)
21 		return -1;
22 
23 	fb->targets[fb->nr_targets++] = ops;
24 
25 	return 0;
26 }
27 
28 static int start_targets(struct framebuffer *fb)
29 {
30 	unsigned long i;
31 
32 	for (i = 0; i < fb->nr_targets; i++) {
33 		struct fb_target_operations *ops = fb->targets[i];
34 		int err = 0;
35 
36 		if (ops->start)
37 			err = ops->start(fb);
38 
39 		if (err)
40 			return err;
41 	}
42 
43 	return 0;
44 }
45 
46 int fb__start(void)
47 {
48 	struct framebuffer *fb;
49 
50 	list_for_each_entry(fb, &framebuffers, node) {
51 		int err;
52 
53 		err = start_targets(fb);
54 		if (err)
55 			return err;
56 	}
57 
58 	return 0;
59 }
60 
61 void fb__stop(void)
62 {
63 	struct framebuffer *fb;
64 
65 	list_for_each_entry(fb, &framebuffers, node) {
66 		munmap(fb->mem, fb->mem_size);
67 	}
68 }
69