[Spice-devel,spice-protocol,39/46] qxlhw: move and use qxlhw_screen_init

Submitted by Alon Levy on April 10, 2012, 11:50 a.m.

Details

Message ID 1334058642-12274-40-git-send-email-alevy@redhat.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Alon Levy April 10, 2012, 11:50 a.m.
---
 src/qxl_driver.c  |    9 ++------
 src/qxl_surface.c |    2 +-
 src/qxlhw.c       |   10 +++++++++
 src/qxlhw.h       |    6 ++++++
 src/qxlhw_pci.c   |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 80 insertions(+), 8 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index 3de060d..972aa4a 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -611,7 +611,6 @@  qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 {
     ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
     qxl_screen_t *qxl = pScrn->driverPrivate;
-    struct QXLRom *rom;
     VisualPtr visual;
 
     CHECK_POINT();
@@ -624,12 +623,8 @@  qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 #ifdef XSPICE
     spiceqxl_screen_init(scrnIndex, pScrn, qxl);
 #endif
-    rom = qxlhw_pci_get_rom(qxl->hw);
-    assert(rom);
-    
-    printf ("ram_header at %d\n", rom->ram_header_offset);
-    printf ("surf0 size: %d\n", rom->surface0_area_size);
-    
+    qxlhw_screen_init(qxl->hw);
+
     qxlhw_save_state(qxl->hw, pScrn);
     qxl_blank_screen(pScreen, SCREEN_SAVER_ON);
     
diff --git a/src/qxl_surface.c b/src/qxl_surface.c
index d499593..9e9c364 100644
--- a/src/qxl_surface.c
+++ b/src/qxl_surface.c
@@ -545,7 +545,7 @@  retry:
     cmd.u.surface_create.height = height;
     cmd.u.surface_create.stride = -stride;
 
-    cmd.u.surface_create.data = pointer_to_u64(surface->address);
+    cmd.u.surface_create.data = pointer_to_u64(address);
 
     push_surface_cmd (cache, &cmd);
 
diff --git a/src/qxlhw.c b/src/qxlhw.c
index 7e444e0..a5c17c6 100644
--- a/src/qxlhw.c
+++ b/src/qxlhw.c
@@ -53,6 +53,16 @@  void qxlhw_unmap_memory(struct qxlhw *base, int scrnIndex)
         base->unmap_memory(base, scrnIndex);
 }
 
+void qxlhw_screen_init(struct qxlhw *base)
+{
+        base->screen_init(base);
+}
+
+Bool qxlhw_check_device(struct qxlhw *base, ScrnInfoPtr pScrn)
+{
+        return base->check_device(base, pScrn);
+}
+
 void *qxlhw_data_alloc(struct qxlhw *base, unsigned long size)
 {
         return base->data_alloc(base, size);
diff --git a/src/qxlhw.h b/src/qxlhw.h
index 0e9e6c8..f59649d 100644
--- a/src/qxlhw.h
+++ b/src/qxlhw.h
@@ -16,6 +16,8 @@  struct qxlhw {
     void (*restore_state)(struct qxlhw *base, ScrnInfoPtr pScrn);
     Bool (*map_memory)(struct qxlhw *base, int scrnIndex);
     void (*unmap_memory)(struct qxlhw *base, int scrnIndex);
+    void (*screen_init)(struct qxlhw *base);
+    Bool (*check_device)(struct qxlhw *base, ScrnInfoPtr pScrn);
 
     /* capabilities check / accessors */
     int (*get_n_surfaces)(struct qxlhw *base);
@@ -62,6 +64,10 @@  void qxlhw_restore_state(struct qxlhw *base, ScrnInfoPtr pScrn);
 Bool qxlhw_map_memory(struct qxlhw *base, int scrnIndex);
 void qxlhw_unmap_memory(struct qxlhw *base, int scrnIndex);
 
+void qxlhw_screen_init(struct qxlhw *base);
+
+Bool qxlhw_check_device(struct qxlhw *base, ScrnInfoPtr pScrn);
+
 /* memory translation, relocations. */
 void *qxlhw_data_alloc(struct qxlhw *base, unsigned long size);
 void qxlhw_data_free(struct qxlhw *base, void *p);
diff --git a/src/qxlhw_pci.c b/src/qxlhw_pci.c
index 5ba2fd8..8613e1c 100644
--- a/src/qxlhw_pci.c
+++ b/src/qxlhw_pci.c
@@ -12,6 +12,11 @@ 
 #include "spiceqxl_driver.h"
 #endif
 
+#if 0
+#define CHECK_POINT() ErrorF ("%s: %d  (%s)\n", __FILE__, __LINE__, __FUNCTION__);
+#endif
+#define CHECK_POINT()
+
 typedef struct
 {
     uint8_t	generation;
@@ -563,6 +568,60 @@  static void qxlhw_pci_restore_state(struct qxlhw *base, ScrnInfoPtr pScrn)
 #endif
 }
 
+static void qxlhw_pci_screen_init(struct qxlhw *base)
+{
+    struct qxlhw_pci *hw = (struct qxlhw_pci *)base;
+    
+    printf ("ram_header at %d\n", hw->rom->ram_header_offset);
+    printf ("surf0 size: %d\n", hw->rom->surface0_area_size);
+}
+
+static Bool
+qxlhw_pci_check_device(struct qxlhw *base, ScrnInfoPtr pScrn)
+{
+    struct qxlhw_pci *hw = (struct qxlhw_pci *)base;
+    int scrnIndex = pScrn->scrnIndex;
+#ifndef XSPICE
+    struct QXLRom *rom = hw->rom;
+    struct QXLRam *ram_header = (void *)((unsigned long)hw->ram + rom->ram_header_offset);
+
+    CHECK_POINT();
+    
+    if (rom->magic != 0x4f525851) { /* "QXRO" little-endian */
+	xf86DrvMsg(scrnIndex, X_ERROR, "Bad ROM signature %x\n", rom->magic);
+	return FALSE;
+    }
+    
+    xf86DrvMsg(scrnIndex, X_INFO, "Device version %d.%d\n",
+	       rom->id, rom->update_id);
+    
+    xf86DrvMsg(scrnIndex, X_INFO, "Compression level %d, log level %d\n",
+	       rom->compression_level,
+	       rom->log_level);
+    
+    xf86DrvMsg(scrnIndex, X_INFO, "%d io pages at 0x%lx\n",
+	       rom->num_pages, (unsigned long)hw->ram);
+    
+    xf86DrvMsg(scrnIndex, X_INFO, "RAM header offset: 0x%x\n", rom->ram_header_offset);
+
+    if (ram_header->magic != 0x41525851) { /* "QXRA" little-endian */
+	xf86DrvMsg(scrnIndex, X_ERROR, "Bad RAM signature %x at %p\n",
+		   ram_header->magic,
+		   &ram_header->magic);
+	return FALSE;
+    }
+
+    xf86DrvMsg(scrnIndex, X_INFO, "Correct RAM signature %x\n",
+	       ram_header->magic);
+#endif /* !XSPICE */
+
+    pScrn->videoRam = (hw->rom->num_pages * 4096) / 1024;
+    xf86DrvMsg(scrnIndex, X_INFO, "%d KB of video RAM\n", pScrn->videoRam);
+    xf86DrvMsg(scrnIndex, X_INFO, "%d surfaces\n", hw->rom->n_surfaces);
+
+    return TRUE;
+}
+
 static void *qxlhw_pci_data_alloc(struct qxlhw *base, unsigned long size)
 {
     struct qxlhw_pci *hw = (struct qxlhw_pci *)base;
@@ -910,6 +969,8 @@  struct qxlhw *create_qxlhw_pci(qxl_screen_t *qxl, ScrnInfoPtr pScrn)
     base->restore_state = qxlhw_pci_restore_state;
     base->map_memory = qxlhw_pci_map_memory;
     base->unmap_memory = qxlhw_pci_unmap_memory;
+    base->screen_init = qxlhw_pci_screen_init;
+    base->check_device = qxlhw_pci_check_device;
     base->data_alloc = qxlhw_pci_data_alloc;
     base->data_free = qxlhw_pci_data_free;
     base->create_primary_surface = qxlhw_pci_create_primary_surface;