summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoren Sandmann <ssp@localhost.localdomain>2010-04-13 08:35:04 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-09-14 06:32:08 -0400
commit480e5028a60fb2a3d349200518241eb8bb27013c (patch)
tree355624e88b43d2cb45123eb25763bc18e7584eac
parent6973d3b2f76685ce6c0d2a73091d571263331174 (diff)
Memslots support
-rw-r--r--src/qxl.h20
-rw-r--r--src/qxl_driver.c34
2 files changed, 42 insertions, 12 deletions
diff --git a/src/qxl.h b/src/qxl.h
index 4e21ddd..a94f056 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -473,6 +473,9 @@ struct qxl_ram_header {
struct qxl_ring_header release_ring_hdr;
uint64_t release_ring[8];
struct qxl_rect update_area;
+ uint64_t mem_slot_start;
+ uint64_t mem_slot_end;
+ uint64_t flags;
};
#pragma pack(pop)
@@ -486,14 +489,9 @@ typedef struct
uint64_t end_phys_addr;
uint64_t start_virt_addr;
uint64_t end_virt_addr;
+ uint64_t high_bits;
} qxl_memslot_t;
-typedef struct
-{
- qxl_memslot_t slot;
- uint64_t high_bits;
-} qxl_pmemslot_t;
-
struct _qxl_screen_t
{
/* These are the names QXL uses */
@@ -549,7 +547,7 @@ struct _qxl_screen_t
ScrnInfoPtr pScrn;
- qxl_pmemslot_t * mem_slots;
+ qxl_memslot_t * mem_slots;
uint8_t n_mem_slots;
uint8_t main_mem_slot;
uint8_t slot_id_bits;
@@ -560,9 +558,9 @@ struct _qxl_screen_t
static inline uint64_t
physical_address (qxl_screen_t *qxl, void *virtual, uint8_t slot_id)
{
- qxl_pmemslot_t *p_slot = &(qxl->mem_slots[slot_id]);
+ qxl_memslot_t *p_slot = &(qxl->mem_slots[slot_id]);
- return p_slot->high_bits | ((unsigned long)virtual - p_slot->slot.start_virt_addr);
+ return p_slot->high_bits | ((unsigned long)virtual - p_slot->start_virt_addr);
#if 0
return (uint64_t) ((unsigned long)virtual + (((unsigned long)qxl->ram_physical - (unsigned long)qxl->ram)));
#endif
@@ -571,11 +569,11 @@ physical_address (qxl_screen_t *qxl, void *virtual, uint8_t slot_id)
static inline void *
virtual_address (qxl_screen_t *qxl, void *physical, uint8_t slot_id)
{
- qxl_pmemslot_t *p_slot = &(qxl->mem_slots[slot_id]);
+ qxl_memslot_t *p_slot = &(qxl->mem_slots[slot_id]);
unsigned long virt;
virt = ((unsigned long)physical) & qxl->va_slot_mask;
- virt += p_slot->slot.start_virt_addr;
+ virt += p_slot->start_virt_addr;
return (void *)virt;
#if 0
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index e9d3555..b2d18f0 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -952,6 +952,7 @@ 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();
@@ -1010,6 +1011,37 @@ 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->mem = qxl_mem_create ((void *)((unsigned long)qxl->ram + (unsigned long)rom->pages_offset),
rom->num_io_pages * getpagesize());
qxl->io_pages = (void *)((unsigned long)qxl->ram + (unsigned long)rom->pages_offset);
@@ -1024,7 +1056,7 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
qxl->release_ring = qxl_ring_create (&(ram_header->release_ring_hdr),
sizeof (uint64_t),
8, 0);
-
+
/* xf86DPMSInit(pScreen, xf86DPMSSet, 0); */
#if 0 /* XV accel */