This patch introduces 'struct framebuffer' and related API as a preparational step to killing libvnc dependency from hw/vesa.c.
Cc: Cyrill Gorcunov <gorcu...@gmail.com> Cc: Ingo Molnar <mi...@elte.hu> Cc: John Floren <j...@jfloren.net> Cc: Sasha Levin <levinsasha...@gmail.com> Signed-off-by: Pekka Enberg <penb...@kernel.org> --- tools/kvm/Makefile | 1 + tools/kvm/framebuffer.c | 87 +++++++++++++++++++++++++++++++++++ tools/kvm/include/kvm/framebuffer.h | 35 ++++++++++++++ 3 files changed, 123 insertions(+), 0 deletions(-) create mode 100644 tools/kvm/framebuffer.c create mode 100644 tools/kvm/include/kvm/framebuffer.h diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile index a05a6b1..3f06dab 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 0000000..eae0a92 --- /dev/null +++ b/tools/kvm/framebuffer.c @@ -0,0 +1,87 @@ +#include "kvm/framebuffer.h" + +#include <linux/kernel.h> +#include <linux/list.h> +#include <stdlib.h> + +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 0000000..e2273c5 --- /dev/null +++ b/tools/kvm/include/kvm/framebuffer.h @@ -0,0 +1,35 @@ +#ifndef KVM__FRAMEBUFFER_H +#define KVM__FRAMEBUFFER_H + +#include <linux/types.h> +#include <linux/list.h> + +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 { + u32 width; + u32 height; + u8 depth; + char *mem; + u64 mem_addr; + + unsigned long nr_targets; + struct fb_target_operations *targets[FB_MAX_TARGETS]; + + struct list_head node; +}; + +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 */ -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html