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