xref: /openbmc/qemu/hw/display/ramfb-standalone.c (revision 94692dcd71473622f3a14416dae67e73e7e733ec)
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