summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoren Sandmann <ssp@localhost.localdomain>2010-04-15 04:47:14 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-09-14 06:32:08 -0400
commite04e850ed7d07fc12f941fd13a5fc6f32f7153e1 (patch)
treeadd35551385fa7abfd59572ebaf1e0e93c4a4e7f
parent480e5028a60fb2a3d349200518241eb8bb27013c (diff)
Add memslot support
-rw-r--r--src/qxl.h4
-rw-r--r--src/qxl_driver.c83
2 files changed, 52 insertions, 35 deletions
diff --git a/src/qxl.h b/src/qxl.h
index a94f056..cb2439a 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -555,7 +555,7 @@ struct _qxl_screen_t
uint64_t va_slot_mask;
};
-static inline uint64_t
+static uint64_t
physical_address (qxl_screen_t *qxl, void *virtual, uint8_t slot_id)
{
qxl_memslot_t *p_slot = &(qxl->mem_slots[slot_id]);
@@ -566,7 +566,7 @@ physical_address (qxl_screen_t *qxl, void *virtual, uint8_t slot_id)
#endif
}
-static inline void *
+static void *
virtual_address (qxl_screen_t *qxl, void *physical, uint8_t slot_id)
{
qxl_memslot_t *p_slot = &(qxl->mem_slots[slot_id]);
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index b2d18f0..1ec9317 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -24,7 +24,7 @@
* \author Adam Jackson <ajax@redhat.com>
*
* This is qxl, a driver for the Qumranet paravirtualized graphics device
- * in qemu.
+ * in qemu.
*/
#include <unistd.h>
@@ -267,6 +267,53 @@ qxl_close_screen(int scrnIndex, ScreenPtr pScreen)
return pScreen->CloseScreen(scrnIndex, pScreen);
}
+static void
+qxl_reset (qxl_screen_t *qxl)
+{
+ qxl_memslot_t *slot;
+ uint64_t high_bits;
+ struct qxl_ram_header *ram_header;
+
+ outb(qxl->io_base + QXL_IO_RESET, 0);
+
+ ram_header = (void *)((unsigned long)qxl->ram + (unsigned long)qxl->rom->ram_header_offset);
+
+ /* Mem slots */
+ qxl->main_mem_slot = qxl->rom->slots_start;
+ qxl->n_mem_slots = qxl->rom->slots_end;
+ qxl->slot_gen_bits = qxl->rom->slot_gen_bits;
+ qxl->slot_id_bits = qxl->rom->slot_id_bits;
+
+ qxl->mem_slots = xnfalloc (qxl->n_mem_slots * sizeof (qxl_memslot_t));
+
+ slot = &qxl->mem_slots[qxl->main_mem_slot];
+
+ slot->start_phys_addr = (unsigned long)qxl->ram_physical + (unsigned long)qxl->rom->pages_offset;
+ slot->end_phys_addr = (unsigned long)slot->start_phys_addr + (unsigned long)qxl->rom->num_io_pages * getpagesize();
+ slot->start_virt_addr = (uint64_t)qxl->ram;
+ slot->end_virt_addr = slot->start_virt_addr + (unsigned long)qxl->rom->num_io_pages * getpagesize();
+
+ ram_header->mem_slot_start = slot->start_phys_addr;
+ ram_header->mem_slot_end = slot->end_phys_addr;
+
+ ErrorF ("before: %d\n", qxl->rom->slot_generation);
+
+ outb (qxl->io_base + QXL_IO_MEMSLOT_ADD, qxl->main_mem_slot);
+
+ ErrorF ("after: %d\n", qxl->rom->slot_generation);
+
+ slot->generation = qxl->rom->slot_generation;
+
+ high_bits = qxl->main_mem_slot << qxl->slot_gen_bits;
+ high_bits |= slot->generation;
+ high_bits <<= (64 - (qxl->slot_gen_bits + qxl->slot_id_bits));
+ slot->high_bits = high_bits;
+
+ qxl->va_slot_mask = (~(uint64_t)0) >> (qxl->slot_id_bits + qxl->slot_gen_bits);
+
+
+}
+
static Bool
qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags)
{
@@ -282,7 +329,7 @@ qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags)
xf86DrvMsg (scrnIndex, X_INFO, "Setting mode %d (%d x %d) (%d x %d) %p\n",
m->id, m->x_res, m->y_res, p->HDisplay, p->VDisplay, p);
- outb(qxl->io_base + QXL_IO_RESET, 0);
+ qxl_reset (qxl);
outb(qxl->io_base + QXL_IO_SET_MODE, m->id);
@@ -952,7 +999,6 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
struct qxl_rom *rom;
struct qxl_ram_header *ram_header;
VisualPtr visual;
- qxl_memslot_t *slot;
CHECK_POINT();
@@ -1011,36 +1057,7 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
pScreen->CreateScreenResources = qxl_create_screen_resources;
/* Set up resources */
-
- /* Mem slots */
- qxl->main_mem_slot = qxl->rom->slots_start;
- qxl->n_mem_slots = qxl->rom->slots_end;
- qxl->slot_gen_bits = qxl->rom->slot_gen_bits;
- qxl->slot_id_bits = qxl->rom->slot_id_bits;
-
- qxl->mem_slots = xnfalloc (qxl->n_mem_slots * sizeof (qxl_memslot_t));
-
- slot = &qxl->mem_slots[qxl->main_mem_slot];
-
- slot->start_phys_addr = (unsigned long)qxl->ram_physical + (unsigned long)qxl->rom->pages_offset;
- slot->end_phys_addr = (unsigned long)slot->start_phys_addr + (unsigned long)qxl->rom->num_io_pages * getpagesize();
- slot->start_virt_addr = (uint64_t)qxl->ram;
- slot->end_virt_addr = slot->start_virt_addr + (unsigned long)qxl->rom->num_io_pages * getpagesize();
-
- ram_header->mem_slot_start = slot->start_phys_addr;
- ram_header->mem_slot_end = slot->end_phys_addr;
-
- outb (qxl->io_base + QXL_IO_MEMSLOT_ADD, qxl->main_mem_slot);
-
- slot->generation = qxl->rom->slot_generation;
-
- uint64_t high_bits;
- high_bits = qxl->main_mem_slot << qxl->slot_gen_bits;
- high_bits |= slot->generation;
- high_bits <<= (64 - (qxl->slot_gen_bits + qxl->slot_id_bits));
- slot->high_bits = high_bits;
-
- qxl->va_slot_mask = (~(uint64_t)0) >> (qxl->slot_id_bits + qxl->slot_gen_bits);
+ qxl_reset (qxl);
qxl->mem = qxl_mem_create ((void *)((unsigned long)qxl->ram + (unsigned long)rom->pages_offset),
rom->num_io_pages * getpagesize());