From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>, David Gibson <dgibson@redhat.com>
Subject: [Qemu-devel] [PATCH v2 10/11] vga: Add endian control register
Date: Mon, 29 Sep 2014 11:31:11 +0200 [thread overview]
Message-ID: <1411983073-13058-11-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1411983073-13058-1-git-send-email-kraxel@redhat.com>
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Include the endian state in the migration stream as an optional
subsection which we only include when the endian isn't the default,
thus enabling backward compatibility of the common case.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Changes by kraxel:
* Remove bochs dispi interface changes. We'll do that in
a different way to make sure we don't conflict with
possible future bochs dispi interface changes.
* keep live migration bits.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/display/vga.c | 41 +++++++++++++++++++++++++++++++++++++----
hw/display/vga_int.h | 2 ++
2 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/hw/display/vga.c b/hw/display/vga.c
index 49a4b8b..19e7f23 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -1508,7 +1508,8 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
if (s->line_offset != s->last_line_offset ||
disp_width != s->last_width ||
height != s->last_height ||
- s->last_depth != depth) {
+ s->last_depth != depth ||
+ s->last_byteswap != byteswap) {
if (depth == 32 || (depth == 16 && !byteswap)) {
pixman_format_code_t format =
qemu_default_pixman_format(depth, !byteswap);
@@ -1526,6 +1527,7 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
s->last_height = height;
s->last_line_offset = s->line_offset;
s->last_depth = depth;
+ s->last_byteswap = byteswap;
full_update = 1;
} else if (is_buffer_shared(surface) &&
(full_update || surface_data(surface) != s->vram_ptr
@@ -1789,6 +1791,7 @@ void vga_common_reset(VGACommonState *s)
s->cursor_start = 0;
s->cursor_end = 0;
s->cursor_offset = 0;
+ s->big_endian_fb = s->default_endian_fb;
memset(s->invalidated_y_table, '\0', sizeof(s->invalidated_y_table));
memset(s->last_palette, '\0', sizeof(s->last_palette));
memset(s->last_ch_attr, '\0', sizeof(s->last_ch_attr));
@@ -2020,6 +2023,28 @@ static int vga_common_post_load(void *opaque, int version_id)
return 0;
}
+static bool vga_endian_state_needed(void *opaque)
+{
+ VGACommonState *s = opaque;
+
+ /*
+ * Only send the endian state if it's different from the
+ * default one, thus ensuring backward compatibility for
+ * migration of the common case
+ */
+ return s->default_endian_fb != s->big_endian_fb;
+}
+
+const VMStateDescription vmstate_vga_endian = {
+ .name = "vga.endian",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_BOOL(big_endian_fb, VGACommonState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
const VMStateDescription vmstate_vga_common = {
.name = "vga",
.version_id = 2,
@@ -2056,6 +2081,14 @@ const VMStateDescription vmstate_vga_common = {
VMSTATE_UINT32(vbe_line_offset, VGACommonState),
VMSTATE_UINT32(vbe_bank_mask, VGACommonState),
VMSTATE_END_OF_LIST()
+ },
+ .subsections = (VMStateSubsection []) {
+ {
+ .vmsd = &vmstate_vga_endian,
+ .needed = vga_endian_state_needed,
+ }, {
+ /* empty */
+ }
}
};
@@ -2126,14 +2159,14 @@ void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate)
}
/*
- * Set default fb endian based on target, should probably be turned
+ * Set default fb endian based on target, could probably be turned
* into a device attribute set by the machine/platform to remove
* all target endian dependencies from this file.
*/
#ifdef TARGET_WORDS_BIGENDIAN
- s->big_endian_fb = true;
+ s->default_endian_fb = true;
#else
- s->big_endian_fb = false;
+ s->default_endian_fb = false;
#endif
vga_dirty_log_start(s);
}
diff --git a/hw/display/vga_int.h b/hw/display/vga_int.h
index 28d67cf..ed69e06 100644
--- a/hw/display/vga_int.h
+++ b/hw/display/vga_int.h
@@ -150,6 +150,7 @@ typedef struct VGACommonState {
uint32_t last_width, last_height; /* in chars or pixels */
uint32_t last_scr_width, last_scr_height; /* in pixels */
uint32_t last_depth; /* in bits */
+ bool last_byteswap;
uint8_t cursor_start, cursor_end;
bool cursor_visible_phase;
int64_t cursor_blink_time;
@@ -158,6 +159,7 @@ typedef struct VGACommonState {
bool full_update_text;
bool full_update_gfx;
bool big_endian_fb;
+ bool default_endian_fb;
/* hardware mouse cursor support */
uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32];
void (*cursor_invalidate)(struct VGACommonState *s);
--
1.8.3.1
next prev parent reply other threads:[~2014-09-29 9:32 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-29 9:31 [Qemu-devel] [PATCH v2 00/11] vga: cleanup and endianness patch series Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 01/11] vga: Start cutting out non-32bpp conversion support Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 02/11] vga: Remove remainder of old conversion cruft Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 03/11] vga: Separate LE and BE conversion functions Gerd Hoffmann
2014-09-30 0:43 ` David Gibson
2014-09-30 7:59 ` Gerd Hoffmann
2014-09-30 8:07 ` David Gibson
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 04/11] vga: Remove rgb_to_pixel indirection Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 05/11] vga: Simplify vga_draw_blank() a bit Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 06/11] cirrus: Remove non-32bpp cursor drawing Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 07/11] vga: Remove some "should be done in BIOS" comments Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 08/11] vga: Rename vga_template.h to vga-helpers.h Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 09/11] vga: Make fb endian a common state variable Gerd Hoffmann
2014-09-29 9:31 ` Gerd Hoffmann [this message]
2014-09-30 0:45 ` [Qemu-devel] [PATCH v2 10/11] vga: Add endian control register David Gibson
2014-09-30 10:56 ` Gerd Hoffmann
2014-09-29 9:31 ` [Qemu-devel] [PATCH v2 11/11] vga-pci: add qext region to mmio Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1411983073-13058-11-git-send-email-kraxel@redhat.com \
--to=kraxel@redhat.com \
--cc=dgibson@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).