Lines Matching +full:- +full:- +full:mode +full:- +full:-
5 * See the COPYING file in the top-level directory.
12 #include "hw/qdev-properties.h"
14 #include "hw/display/bochs-vbe.h"
20 #include "ui/qemu-pixman.h"
56 BochsDisplayMode mode; member
59 #define TYPE_BOCHS_DISPLAY "bochs-display"
63 .name = "bochs-display",
82 return s->vgamem / (64 * KiB); in bochs_display_vbe_read()
85 if (index >= ARRAY_SIZE(s->vbe_regs)) { in bochs_display_vbe_read()
86 return -1; in bochs_display_vbe_read()
88 return s->vbe_regs[index]; in bochs_display_vbe_read()
97 if (index >= ARRAY_SIZE(s->vbe_regs)) { in bochs_display_vbe_write()
100 s->vbe_regs[index] = val; in bochs_display_vbe_write()
122 return s->big_endian_fb ? in bochs_display_qext_read()
137 s->big_endian_fb = true; in bochs_display_qext_write()
140 s->big_endian_fb = false; in bochs_display_qext_write()
155 BochsDisplayMode *mode) in bochs_display_get_mode() argument
157 uint16_t *vbe = s->vbe_regs; in bochs_display_get_mode()
161 return -1; in bochs_display_get_mode()
164 memset(mode, 0, sizeof(*mode)); in bochs_display_get_mode()
168 mode->format = PIXMAN_r5g6b5; in bochs_display_get_mode()
169 mode->bytepp = 2; in bochs_display_get_mode()
172 mode->format = s->big_endian_fb in bochs_display_get_mode()
175 mode->bytepp = 4; in bochs_display_get_mode()
178 return -1; in bochs_display_get_mode()
181 mode->width = vbe[VBE_DISPI_INDEX_XRES]; in bochs_display_get_mode()
182 mode->height = vbe[VBE_DISPI_INDEX_YRES]; in bochs_display_get_mode()
184 if (virt_width < mode->width) { in bochs_display_get_mode()
185 virt_width = mode->width; in bochs_display_get_mode()
187 mode->stride = virt_width * mode->bytepp; in bochs_display_get_mode()
188 mode->size = (uint64_t)mode->stride * mode->height; in bochs_display_get_mode()
189 mode->offset = ((uint64_t)vbe[VBE_DISPI_INDEX_X_OFFSET] * mode->bytepp + in bochs_display_get_mode()
190 (uint64_t)vbe[VBE_DISPI_INDEX_Y_OFFSET] * mode->stride); in bochs_display_get_mode()
192 if (mode->width < 64 || mode->height < 64) { in bochs_display_get_mode()
193 return -1; in bochs_display_get_mode()
195 if (mode->offset + mode->size > s->vgamem) { in bochs_display_get_mode()
196 return -1; in bochs_display_get_mode()
206 BochsDisplayMode mode; in bochs_display_update() local
212 ret = bochs_display_get_mode(s, &mode); in bochs_display_update()
214 /* no (valid) video mode */ in bochs_display_update()
218 if (memcmp(&s->mode, &mode, sizeof(mode)) != 0) { in bochs_display_update()
219 /* video mode switch */ in bochs_display_update()
220 s->mode = mode; in bochs_display_update()
221 ptr = memory_region_get_ram_ptr(&s->vram); in bochs_display_update()
222 ds = qemu_create_displaysurface_from(mode.width, in bochs_display_update()
223 mode.height, in bochs_display_update()
224 mode.format, in bochs_display_update()
225 mode.stride, in bochs_display_update()
226 ptr + mode.offset); in bochs_display_update()
227 dpy_gfx_replace_surface(s->con, ds); in bochs_display_update()
232 dpy_gfx_update_full(s->con); in bochs_display_update()
234 snap = memory_region_snapshot_and_clear_dirty(&s->vram, in bochs_display_update()
235 mode.offset, mode.size, in bochs_display_update()
237 ys = -1; in bochs_display_update()
238 for (y = 0; y < mode.height; y++) { in bochs_display_update()
239 dirty = memory_region_snapshot_get_dirty(&s->vram, snap, in bochs_display_update()
240 mode.offset + mode.stride * y, in bochs_display_update()
241 mode.stride); in bochs_display_update()
246 dpy_gfx_update(s->con, 0, ys, in bochs_display_update()
247 mode.width, y - ys); in bochs_display_update()
248 ys = -1; in bochs_display_update()
252 dpy_gfx_update(s->con, 0, ys, in bochs_display_update()
253 mode.width, y - ys); in bochs_display_update()
270 if (s->vgamem < 4 * MiB) { in bochs_display_realize()
271 error_setg(errp, "bochs-display: video memory too small"); in bochs_display_realize()
274 if (s->vgamem > 256 * MiB) { in bochs_display_realize()
275 error_setg(errp, "bochs-display: video memory too big"); in bochs_display_realize()
278 s->vgamem = pow2ceil(s->vgamem); in bochs_display_realize()
280 s->con = graphic_console_init(DEVICE(dev), 0, &bochs_display_gfx_ops, s); in bochs_display_realize()
282 memory_region_init_ram(&s->vram, obj, "bochs-display-vram", s->vgamem, in bochs_display_realize()
284 memory_region_init_io(&s->vbe, obj, &bochs_display_vbe_ops, s, in bochs_display_realize()
286 memory_region_init_io(&s->qext, obj, &bochs_display_qext_ops, s, in bochs_display_realize()
289 memory_region_init_io(&s->mmio, obj, &unassigned_io_ops, NULL, in bochs_display_realize()
290 "bochs-display-mmio", PCI_VGA_MMIO_SIZE); in bochs_display_realize()
291 memory_region_add_subregion(&s->mmio, PCI_VGA_BOCHS_OFFSET, &s->vbe); in bochs_display_realize()
292 memory_region_add_subregion(&s->mmio, PCI_VGA_QEXT_OFFSET, &s->qext); in bochs_display_realize()
294 pci_set_byte(&s->pci.config[PCI_REVISION_ID], 2); in bochs_display_realize()
295 pci_register_bar(&s->pci, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->vram); in bochs_display_realize()
296 pci_register_bar(&s->pci, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio); in bochs_display_realize()
298 if (s->enable_edid) { in bochs_display_realize()
299 qemu_edid_generate(s->edid_blob, sizeof(s->edid_blob), &s->edid_info); in bochs_display_realize()
300 qemu_edid_region_io(&s->edid, obj, s->edid_blob, sizeof(s->edid_blob)); in bochs_display_realize()
301 memory_region_add_subregion(&s->mmio, 0, &s->edid); in bochs_display_realize()
308 dev->cap_present &= ~QEMU_PCI_CAP_EXPRESS; in bochs_display_realize()
311 memory_region_set_log(&s->vram, true, DIRTY_MEMORY_VGA); in bochs_display_realize()
318 return s->big_endian_fb; in bochs_display_get_big_endian_fb()
326 s->big_endian_fb = value; in bochs_display_set_big_endian_fb()
334 object_property_add_bool(obj, "big-endian-framebuffer", in bochs_display_init()
338 dev->cap_present |= QEMU_PCI_CAP_EXPRESS; in bochs_display_init()
345 graphic_console_close(s->con); in bochs_display_exit()
359 k->class_id = PCI_CLASS_DISPLAY_OTHER; in bochs_display_class_init()
360 k->vendor_id = PCI_VENDOR_ID_QEMU; in bochs_display_class_init()
361 k->device_id = PCI_DEVICE_ID_QEMU_VGA; in bochs_display_class_init()
363 k->realize = bochs_display_realize; in bochs_display_class_init()
364 k->romfile = "vgabios-bochs-display.bin"; in bochs_display_class_init()
365 k->exit = bochs_display_exit; in bochs_display_class_init()
366 dc->vmsd = &vmstate_bochs_display; in bochs_display_class_init()
368 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); in bochs_display_class_init()