diff options
author | Soren Sandmann <ssp@localhost.localdomain> | 2010-04-13 08:35:04 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-09-14 06:32:08 -0400 |
commit | 480e5028a60fb2a3d349200518241eb8bb27013c (patch) | |
tree | 355624e88b43d2cb45123eb25763bc18e7584eac | |
parent | 6973d3b2f76685ce6c0d2a73091d571263331174 (diff) |
Memslots support
-rw-r--r-- | src/qxl.h | 20 | ||||
-rw-r--r-- | src/qxl_driver.c | 34 |
2 files changed, 42 insertions, 12 deletions
@@ -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 */ |