From: Pekka Enberg Date: Fri, 3 Jun 2011 13:45:45 +0000 (+0300) Subject: kvm tools, ui: Add framebuffer infrastructure X-Git-Tag: next-20110824~3^2~228 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=e8b8e0d9f7da358fa2e45665353420b15d69d61d;p=karo-tx-linux.git kvm tools, ui: Add framebuffer infrastructure This patch introduces 'struct framebuffer' and related API as a preparational step to killing libvnc dependency from hw/vesa.c. Acked-by: Ingo Molnar Cc: Cyrill Gorcunov Cc: John Floren Cc: Sasha Levin Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile index a05a6b1613ba..3f06dabcde0f 100644 --- a/tools/kvm/Makefile +++ b/tools/kvm/Makefile @@ -17,6 +17,7 @@ TAGS = ctags OBJS += cpuid.o OBJS += disk/core.o +OBJS += framebuffer.o OBJS += hw/rtc.o OBJS += hw/serial.o OBJS += interrupt.o diff --git a/tools/kvm/framebuffer.c b/tools/kvm/framebuffer.c new file mode 100644 index 000000000000..eae0a92972cd --- /dev/null +++ b/tools/kvm/framebuffer.c @@ -0,0 +1,87 @@ +#include "kvm/framebuffer.h" + +#include +#include +#include + +static LIST_HEAD(framebuffers); + +struct framebuffer *fb__register(struct framebuffer *fb) +{ + INIT_LIST_HEAD(&fb->node); + list_add(&fb->node, &framebuffers); + + return fb; +} + +int fb__attach(struct framebuffer *fb, struct fb_target_operations *ops) +{ + if (fb->nr_targets >= FB_MAX_TARGETS) + return -1; + + fb->targets[fb->nr_targets++] = ops; + + return 0; +} + +static int start_targets(struct framebuffer *fb) +{ + unsigned long i; + + for (i = 0; i < fb->nr_targets; i++) { + struct fb_target_operations *ops = fb->targets[i]; + int err = 0; + + if (ops->start) + err = ops->start(fb); + + if (err) + return err; + } + + return 0; +} + +int fb__start(void) +{ + struct framebuffer *fb; + + list_for_each_entry(fb, &framebuffers, node) { + int err; + + err = start_targets(fb); + if (err) + return err; + } + + return 0; +} + +void fb__stop(void) +{ + struct framebuffer *fb; + + list_for_each_entry(fb, &framebuffers, node) { + free(fb->mem); + } +} + +static void write_to_targets(struct framebuffer *fb, u64 addr, u8 *data, u32 len) +{ + unsigned long i; + + for (i = 0; i < fb->nr_targets; i++) { + struct fb_target_operations *ops = fb->targets[i]; + + ops->write(fb, addr, data, len); + } +} + +void fb__write(u64 addr, u8 *data, u32 len) +{ + struct framebuffer *fb; + + list_for_each_entry(fb, &framebuffers, node) { + write_to_targets(fb, addr, data, len); + } +} diff --git a/tools/kvm/include/kvm/framebuffer.h b/tools/kvm/include/kvm/framebuffer.h new file mode 100644 index 000000000000..6a9fb37be00b --- /dev/null +++ b/tools/kvm/include/kvm/framebuffer.h @@ -0,0 +1,35 @@ +#ifndef KVM__FRAMEBUFFER_H +#define KVM__FRAMEBUFFER_H + +#include +#include + +struct framebuffer; + +struct fb_target_operations { + int (*start)(struct framebuffer *fb); + void (*write)(struct framebuffer *fb, u64 addr, u8 *data, u32 len); +}; + +#define FB_MAX_TARGETS 2 + +struct framebuffer { + struct list_head node; + + u32 width; + u32 height; + u8 depth; + char *mem; + u64 mem_addr; + + unsigned long nr_targets; + struct fb_target_operations *targets[FB_MAX_TARGETS]; +}; + +struct framebuffer *fb__register(struct framebuffer *fb); +int fb__attach(struct framebuffer *fb, struct fb_target_operations *ops); +int fb__start(void); +void fb__stop(void); +void fb__write(u64 addr, u8 *data, u32 len); + +#endif /* KVM__FRAMEBUFFER_H */