xref: /kvmtool/framebuffer.c (revision 7fca1897f9dd98dea482321c069840256f477a9c)
108e89f1eSPekka Enberg #include "kvm/framebuffer.h"
208e89f1eSPekka Enberg 
308e89f1eSPekka Enberg #include <linux/kernel.h>
408e89f1eSPekka Enberg #include <linux/list.h>
508e89f1eSPekka Enberg #include <stdlib.h>
6*7fca1897SSasha Levin #include <sys/mman.h>
708e89f1eSPekka Enberg 
808e89f1eSPekka Enberg static LIST_HEAD(framebuffers);
908e89f1eSPekka Enberg 
1008e89f1eSPekka Enberg struct framebuffer *fb__register(struct framebuffer *fb)
1108e89f1eSPekka Enberg {
1208e89f1eSPekka Enberg 	INIT_LIST_HEAD(&fb->node);
1308e89f1eSPekka Enberg 	list_add(&fb->node, &framebuffers);
1408e89f1eSPekka Enberg 
1508e89f1eSPekka Enberg 	return fb;
1608e89f1eSPekka Enberg }
1708e89f1eSPekka Enberg 
1808e89f1eSPekka Enberg int fb__attach(struct framebuffer *fb, struct fb_target_operations *ops)
1908e89f1eSPekka Enberg {
2008e89f1eSPekka Enberg 	if (fb->nr_targets >= FB_MAX_TARGETS)
2108e89f1eSPekka Enberg 		return -1;
2208e89f1eSPekka Enberg 
2308e89f1eSPekka Enberg 	fb->targets[fb->nr_targets++] = ops;
2408e89f1eSPekka Enberg 
2508e89f1eSPekka Enberg 	return 0;
2608e89f1eSPekka Enberg }
2708e89f1eSPekka Enberg 
2808e89f1eSPekka Enberg static int start_targets(struct framebuffer *fb)
2908e89f1eSPekka Enberg {
3008e89f1eSPekka Enberg 	unsigned long i;
3108e89f1eSPekka Enberg 
3208e89f1eSPekka Enberg 	for (i = 0; i < fb->nr_targets; i++) {
3308e89f1eSPekka Enberg 		struct fb_target_operations *ops = fb->targets[i];
3408e89f1eSPekka Enberg 		int err = 0;
3508e89f1eSPekka Enberg 
3608e89f1eSPekka Enberg 		if (ops->start)
3708e89f1eSPekka Enberg 			err = ops->start(fb);
3808e89f1eSPekka Enberg 
3908e89f1eSPekka Enberg 		if (err)
4008e89f1eSPekka Enberg 			return err;
4108e89f1eSPekka Enberg 	}
4208e89f1eSPekka Enberg 
4308e89f1eSPekka Enberg 	return 0;
4408e89f1eSPekka Enberg }
4508e89f1eSPekka Enberg 
4608e89f1eSPekka Enberg int fb__start(void)
4708e89f1eSPekka Enberg {
4808e89f1eSPekka Enberg 	struct framebuffer *fb;
4908e89f1eSPekka Enberg 
5008e89f1eSPekka Enberg 	list_for_each_entry(fb, &framebuffers, node) {
5108e89f1eSPekka Enberg 		int err;
5208e89f1eSPekka Enberg 
5308e89f1eSPekka Enberg 		err = start_targets(fb);
5408e89f1eSPekka Enberg 		if (err)
5508e89f1eSPekka Enberg 			return err;
5608e89f1eSPekka Enberg 	}
5708e89f1eSPekka Enberg 
5808e89f1eSPekka Enberg 	return 0;
5908e89f1eSPekka Enberg }
6008e89f1eSPekka Enberg 
6108e89f1eSPekka Enberg void fb__stop(void)
6208e89f1eSPekka Enberg {
6308e89f1eSPekka Enberg 	struct framebuffer *fb;
6408e89f1eSPekka Enberg 
6508e89f1eSPekka Enberg 	list_for_each_entry(fb, &framebuffers, node) {
66*7fca1897SSasha Levin 		munmap(fb->mem, fb->mem_size);
6708e89f1eSPekka Enberg 	}
6808e89f1eSPekka Enberg }
69