[Spice-devel] [RFCv2 04/21] qxl_driver: add setup_slot helper

Alon Levy alevy at redhat.com
Fri Apr 29 02:49:42 PDT 2011


used in qxl_reset. Later ifdefed with XSPICE, which only uses a single
slot covering all memory (really it should just avoid calling the translation
mechanism, but for now this is simple enough).
---
 src/qxl_driver.c |   87 ++++++++++++++++++++++++++----------------------------
 1 files changed, 42 insertions(+), 45 deletions(-)

diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index 0d00fb9..d452421 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -339,17 +339,42 @@ qxl_close_screen(int scrnIndex, ScreenPtr pScreen)
     return result;
 }
 
-static void
-qxl_reset (qxl_screen_t *qxl)
+static uint8_t
+setup_slot(qxl_screen_t *qxl, uint8_t slot_index_offset,
+    unsigned long start_phys_addr, unsigned long end_phys_addr,
+    uint64_t start_virt_addr, uint64_t end_virt_addr)
 {
-    qxl_memslot_t *slot;
     uint64_t high_bits;
+    qxl_memslot_t *slot;
+    uint8_t slot_index;
     struct QXLRam *ram_header;
+    ram_header = (void *)((unsigned long)qxl->ram + (unsigned long)qxl->rom->ram_header_offset);
 
-    ioport_write(qxl, QXL_IO_RESET, 0);
+    slot_index = qxl->rom->slots_start + slot_index_offset;
+    slot = &qxl->mem_slots[slot_index];
+    slot->start_phys_addr = start_phys_addr;
+    slot->end_phys_addr = end_phys_addr;
+    slot->start_virt_addr = start_virt_addr;
+    slot->end_virt_addr = end_virt_addr;
 
-    ram_header = (void *)((unsigned long)qxl->ram + (unsigned long)qxl->rom->ram_header_offset);
+    ram_header->mem_slot.mem_start = slot->start_phys_addr;
+    ram_header->mem_slot.mem_end = slot->end_phys_addr;
+
+    ioport_write(qxl, QXL_IO_MEMSLOT_ADD, slot_index);
+
+    slot->generation = qxl->rom->slot_generation;
     
+    high_bits = slot_index << qxl->slot_gen_bits;
+    high_bits |= slot->generation;
+    high_bits <<= (64 - (qxl->slot_gen_bits + qxl->slot_id_bits));
+    slot->high_bits = high_bits;
+    return slot_index;
+}
+
+static void
+qxl_reset (qxl_screen_t *qxl)
+{
+    ioport_write(qxl, QXL_IO_RESET, 0);
     /* Mem slots */
     ErrorF ("slots start: %d, slots end: %d\n",
 	    qxl->rom->slots_start,
@@ -360,48 +385,20 @@ qxl_reset (qxl_screen_t *qxl)
     qxl->slot_gen_bits = qxl->rom->slot_gen_bits;
     qxl->slot_id_bits = qxl->rom->slot_id_bits;
     qxl->va_slot_mask = (~(uint64_t)0) >> (qxl->slot_id_bits + qxl->slot_gen_bits);
-    
-    qxl->mem_slots = xnfalloc (qxl->n_mem_slots * sizeof (qxl_memslot_t));
-    
-    qxl->main_mem_slot = qxl->rom->slots_start;
-    slot = &qxl->mem_slots[qxl->main_mem_slot];
-    slot->start_phys_addr = (unsigned long)qxl->ram_physical;
-    slot->end_phys_addr =
-	(unsigned long)slot->start_phys_addr + (unsigned long)qxl->rom->num_pages * getpagesize();
-    slot->start_virt_addr = (uint64_t)(uintptr_t)qxl->ram;
-    slot->end_virt_addr = slot->start_virt_addr + (unsigned long)qxl->rom->num_pages * getpagesize();
-    
-    ram_header->mem_slot.mem_start = slot->start_phys_addr;
-    ram_header->mem_slot.mem_end = slot->end_phys_addr;
-    
-    ioport_write(qxl, QXL_IO_MEMSLOT_ADD, qxl->main_mem_slot);
-
-    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;
-    
-    /* Vram slot */
-    qxl->vram_mem_slot = qxl->rom->slots_start + 1;
-    slot = &qxl->mem_slots[qxl->vram_mem_slot];
-    slot->start_phys_addr = (unsigned long)qxl->vram_physical;
-    slot->end_phys_addr = (unsigned long)qxl->vram_physical + (unsigned long)qxl->vram_size;
-    slot->start_virt_addr = (uint64_t)(uintptr_t)qxl->vram;
-    slot->end_virt_addr = (uint64_t)(uintptr_t)qxl->vram + (uint64_t)qxl->vram_size;
-
-    ram_header->mem_slot.mem_start = slot->start_phys_addr;
-    ram_header->mem_slot.mem_end = slot->end_phys_addr;
 
-    ioport_write(qxl, QXL_IO_MEMSLOT_ADD, qxl->vram_mem_slot);
+    qxl->mem_slots = xnfalloc (qxl->n_mem_slots * sizeof (qxl_memslot_t));
 
-    slot->generation = qxl->rom->slot_generation;
-    
-    high_bits = qxl->vram_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->main_mem_slot = setup_slot(qxl, 0,
+        (unsigned long)qxl->ram_physical,
+        (unsigned long)qxl->ram_physical + (unsigned long)qxl->rom->num_pages * getpagesize(),
+        (uint64_t)(uintptr_t)qxl->ram,
+        (uint64_t)(uintptr_t)qxl->ram + (unsigned long)qxl->rom->num_pages * getpagesize()
+    );
+    qxl->vram_mem_slot = setup_slot(qxl, 1,
+        (unsigned long)qxl->vram_physical,
+        (unsigned long)qxl->vram_physical + (unsigned long)qxl->vram_size,
+        (uint64_t)(uintptr_t)qxl->vram,
+        (uint64_t)(uintptr_t)qxl->vram + (uint64_t)qxl->vram_size);
 }
 
 static void
-- 
1.7.4.4



More information about the Spice-devel mailing list