ramfb-standalone.c 1.9 KB

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