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