1*94692dcdSGerd Hoffmann #include "qemu/osdep.h" 2*94692dcdSGerd Hoffmann #include "qapi/error.h" 3*94692dcdSGerd Hoffmann #include "hw/loader.h" 4*94692dcdSGerd Hoffmann #include "hw/isa/isa.h" 5*94692dcdSGerd Hoffmann #include "hw/display/ramfb.h" 6*94692dcdSGerd Hoffmann #include "ui/console.h" 7*94692dcdSGerd Hoffmann #include "sysemu/sysemu.h" 8*94692dcdSGerd Hoffmann 9*94692dcdSGerd Hoffmann #define RAMFB(obj) OBJECT_CHECK(RAMFBStandaloneState, (obj), TYPE_RAMFB_DEVICE) 10*94692dcdSGerd Hoffmann 11*94692dcdSGerd Hoffmann typedef struct RAMFBStandaloneState { 12*94692dcdSGerd Hoffmann SysBusDevice parent_obj; 13*94692dcdSGerd Hoffmann QemuConsole *con; 14*94692dcdSGerd Hoffmann RAMFBState *state; 15*94692dcdSGerd Hoffmann } RAMFBStandaloneState; 16*94692dcdSGerd Hoffmann 17*94692dcdSGerd Hoffmann static void display_update_wrapper(void *dev) 18*94692dcdSGerd Hoffmann { 19*94692dcdSGerd Hoffmann RAMFBStandaloneState *ramfb = RAMFB(dev); 20*94692dcdSGerd Hoffmann 21*94692dcdSGerd Hoffmann if (0 /* native driver active */) { 22*94692dcdSGerd Hoffmann /* non-standalone device would run native display update here */; 23*94692dcdSGerd Hoffmann } else { 24*94692dcdSGerd Hoffmann ramfb_display_update(ramfb->con, ramfb->state); 25*94692dcdSGerd Hoffmann } 26*94692dcdSGerd Hoffmann } 27*94692dcdSGerd Hoffmann 28*94692dcdSGerd Hoffmann static const GraphicHwOps wrapper_ops = { 29*94692dcdSGerd Hoffmann .gfx_update = display_update_wrapper, 30*94692dcdSGerd Hoffmann }; 31*94692dcdSGerd Hoffmann 32*94692dcdSGerd Hoffmann static void ramfb_realizefn(DeviceState *dev, Error **errp) 33*94692dcdSGerd Hoffmann { 34*94692dcdSGerd Hoffmann RAMFBStandaloneState *ramfb = RAMFB(dev); 35*94692dcdSGerd Hoffmann 36*94692dcdSGerd Hoffmann ramfb->con = graphic_console_init(dev, 0, &wrapper_ops, dev); 37*94692dcdSGerd Hoffmann ramfb->state = ramfb_setup(errp); 38*94692dcdSGerd Hoffmann } 39*94692dcdSGerd Hoffmann 40*94692dcdSGerd Hoffmann static void ramfb_class_initfn(ObjectClass *klass, void *data) 41*94692dcdSGerd Hoffmann { 42*94692dcdSGerd Hoffmann DeviceClass *dc = DEVICE_CLASS(klass); 43*94692dcdSGerd Hoffmann 44*94692dcdSGerd Hoffmann set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); 45*94692dcdSGerd Hoffmann dc->realize = ramfb_realizefn; 46*94692dcdSGerd Hoffmann dc->desc = "ram framebuffer standalone device"; 47*94692dcdSGerd Hoffmann dc->user_creatable = true; 48*94692dcdSGerd Hoffmann } 49*94692dcdSGerd Hoffmann 50*94692dcdSGerd Hoffmann static const TypeInfo ramfb_info = { 51*94692dcdSGerd Hoffmann .name = TYPE_RAMFB_DEVICE, 52*94692dcdSGerd Hoffmann .parent = TYPE_SYS_BUS_DEVICE, 53*94692dcdSGerd Hoffmann .instance_size = sizeof(RAMFBStandaloneState), 54*94692dcdSGerd Hoffmann .class_init = ramfb_class_initfn, 55*94692dcdSGerd Hoffmann }; 56*94692dcdSGerd Hoffmann 57*94692dcdSGerd Hoffmann static void ramfb_register_types(void) 58*94692dcdSGerd Hoffmann { 59*94692dcdSGerd Hoffmann type_register_static(&ramfb_info); 60*94692dcdSGerd Hoffmann } 61*94692dcdSGerd Hoffmann 62*94692dcdSGerd Hoffmann type_init(ramfb_register_types) 63