diff options
author | Søren Sandmann <ssp@redhat.com> | 2010-04-23 13:23:53 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-09-14 06:32:08 -0400 |
commit | 760f19767b8e140f73a4e9e68774c45effcd6eff (patch) | |
tree | 7027d3bf307f2532f48579ab432ead2af58807cb | |
parent | 0ce5e9a3f459685ebdd900bfe2f85e073565f4bc (diff) |
Initial support for surface0
-rw-r--r-- | src/qxl.h | 18 | ||||
-rw-r--r-- | src/qxl_cursor.c | 2 | ||||
-rw-r--r-- | src/qxl_driver.c | 69 |
3 files changed, 58 insertions, 31 deletions
@@ -465,6 +465,8 @@ struct qxl_ring_header { uint32_t notify_on_cons; }; +#define QXL_SURF_TYPE_PRIMARY 0 + struct qxl_surface_create { uint32_t width; uint32_t height; @@ -526,8 +528,8 @@ struct _qxl_screen_t int num_modes; struct qxl_mode * modes; int io_base; - int draw_area_offset; - int draw_area_size; + void * surface0_area; + long surface0_size; void * fb; int bytes_per_pixel; @@ -574,6 +576,16 @@ struct _qxl_screen_t uint64_t va_slot_mask; }; +static inline Bool +in_vga_mode (qxl_screen_t *qxl) +{ + /* FIXME: The ability to detect whether we are in VGA + * mode has been remvoed in newer devices. + */ + + return FALSE; +} + static uint64_t physical_address (qxl_screen_t *qxl, void *virtual, uint8_t slot_id) { @@ -665,5 +677,3 @@ void qxl_free (struct qxl_mem *mem, void qxl_mem_free_all (struct qxl_mem *mem); void * qxl_allocnf (qxl_screen_t *qxl, unsigned long size); - - diff --git a/src/qxl_cursor.c b/src/qxl_cursor.c index b161542..698b5ed 100644 --- a/src/qxl_cursor.c +++ b/src/qxl_cursor.c @@ -30,7 +30,7 @@ push_cursor (qxl_screen_t *qxl, struct qxl_cursor_cmd *cursor) struct qxl_command cmd; /* See comment on push_command() in qxl_driver.c */ - if (qxl->rom->mode != ~0) + if (!in_vga_mode (qxl)) { cmd.type = QXL_CMD_CURSOR; cmd.data = physical_address (qxl, cursor, qxl->main_mem_slot); diff --git a/src/qxl_driver.c b/src/qxl_driver.c index 1dc5b8e..6e36173 100644 --- a/src/qxl_driver.c +++ b/src/qxl_driver.c @@ -245,6 +245,8 @@ qxl_map_memory(qxl_screen_t *qxl, int scrnIndex) qxl->num_modes = *(uint32_t *)((uint8_t *)qxl->rom + qxl->rom->modes_offset); qxl->modes = (struct qxl_mode *)(((uint8_t *)qxl->rom) + qxl->rom->modes_offset + 4); + qxl->surface0_area = qxl->ram; + qxl->surface0_size = qxl->rom->surface0_area_size; return TRUE; } @@ -288,10 +290,10 @@ qxl_reset (qxl_screen_t *qxl) 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_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)qxl->ram; - slot->end_virt_addr = slot->start_virt_addr + (unsigned long)qxl->rom->num_io_pages * getpagesize(); + slot->end_virt_addr = slot->start_virt_addr + (unsigned long)qxl->rom->num_pages * getpagesize(); ram_header->mem_slot_start = slot->start_phys_addr; ram_header->mem_slot_end = slot->end_phys_addr; @@ -321,6 +323,9 @@ qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags) int mode_index = (int)(unsigned long)p->Private; struct qxl_mode *m = qxl->modes + mode_index; ScreenPtr pScreen = qxl->pScrn->pScreen; + struct qxl_ram_header *ram_header = (void *)((unsigned long)qxl->ram + + qxl->rom->ram_header_offset); + struct qxl_surface_create *create = &(ram_header->create_surface); if (!m) return FALSE; @@ -330,8 +335,31 @@ qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags) m->id, m->x_res, m->y_res, p->HDisplay, p->VDisplay, p); qxl_reset (qxl); + +#if 0 + struct qxl_surface_create { + uint32_t width; + uint32_t height; + int32_t stride; + uint32_t depth; + uint32_t position; + uint32_t mouse_mode; + uint32_t flags; + uint32_t type; + uint64_t mem; + }; +#endif + + create->width = m->x_res; + create->height = m->y_res; + create->stride = - (4 * m->x_res); + create->depth = m->bits; + create->position = 0; /* What is this? The Windows driver doesn't use it */ + create->flags = 0; + create->type = QXL_SURF_TYPE_PRIMARY; + create->mem = physical_address (qxl, qxl->ram, qxl->main_mem_slot); - outb(qxl->io_base + QXL_IO_SET_MODE, m->id); + outb (qxl->io_base + QXL_IO_CREATE_PRIMARY, 0); qxl->bytes_per_pixel = (qxl->pScrn->bitsPerPixel + 7) / 8; @@ -376,11 +404,8 @@ push_drawable (qxl_screen_t *qxl, struct qxl_drawable *drawable) * is in VGA mode, they will be queued up, and then * the next time a mode set set, an assertion in the * device will take down the entire virtual machine. - * - * The author of the QXL device is opposed to this - * for reasons I don't understand. */ - if (qxl->rom->mode != ~0) + if (!in_vga_mode (qxl)) { cmd.type = QXL_CMD_DRAW; cmd.data = physical_address (qxl, drawable, qxl->main_mem_slot); @@ -407,7 +432,7 @@ make_drawable (qxl_screen_t *qxl, uint8_t type, drawable->type = type; drawable->effect = QXL_EFFECT_OPAQUE; - drawable->bitmap_offset = 0; + drawable->self_bitmap = 0; drawable->bitmap_area.top = 0; drawable->bitmap_area.left = 0; drawable->bitmap_area.bottom = 0; @@ -603,7 +628,7 @@ qxl_sanity_check (qxl_screen_t *qxl) if (!qxl->rom || !qxl->pScrn) return; - if (qxl->rom->mode == ~0) + if (in_vga_mode (qxl)) { ErrorF("QXL device jumped back to VGA mode - resetting mode\n"); qxl_switch_mode(qxl->pScrn->scrnIndex, qxl->pScrn->currentMode, 0); @@ -1059,10 +1084,10 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) /* Set up resources */ qxl_reset (qxl); - 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); - qxl->io_pages_physical = (void *)((unsigned long)qxl->ram_physical + (unsigned long)rom->pages_offset); + qxl->mem = qxl_mem_create ((void *)((unsigned long)qxl->ram + qxl->surface0_size), + rom->num_pages * getpagesize()); + qxl->io_pages = (void *)((unsigned long)qxl->ram); + qxl->io_pages_physical = (void *)((unsigned long)qxl->ram_physical); qxl->command_ring = qxl_ring_create (&(ram_header->cmd_ring_hdr), sizeof (struct qxl_command), @@ -1203,14 +1228,8 @@ qxl_check_device(ScrnInfoPtr pScrn, qxl_screen_t *qxl) rom->compression_level, rom->log_level); - xf86DrvMsg(scrnIndex, X_INFO, "Currently using mode #%d, list at 0x%x\n", - rom->mode, rom->modes_offset); - - xf86DrvMsg(scrnIndex, X_INFO, "%d io pages at 0x%x\n", - rom->num_io_pages, rom->pages_offset); - - xf86DrvMsg(scrnIndex, X_INFO, "%d byte draw area at 0x%x\n", - rom->draw_area_size, rom->draw_area_offset); + xf86DrvMsg(scrnIndex, X_INFO, "%d io pages at 0x%lx\n", + rom->num_pages, (unsigned long)qxl->ram); xf86DrvMsg(scrnIndex, X_INFO, "RAM header offset: 0x%x\n", rom->ram_header_offset); @@ -1224,9 +1243,7 @@ qxl_check_device(ScrnInfoPtr pScrn, qxl_screen_t *qxl) xf86DrvMsg(scrnIndex, X_INFO, "Correct RAM signature %x\n", ram_header->magic); - qxl->draw_area_offset = rom->draw_area_offset; - qxl->draw_area_size = rom->draw_area_size; - pScrn->videoRam = (rom->num_io_pages * 4096) / 1024; + pScrn->videoRam = (rom->num_pages * 4096) / 1024; xf86DrvMsg(scrnIndex, X_INFO, "%d KB of video RAM\n", pScrn->videoRam); @@ -1279,7 +1296,7 @@ qxl_valid_mode(int scrn, DisplayModePtr p, Bool flag, int pass) /* FIXME: I don't think this is necessary now that we report the * correct amount of video ram? */ - if (p->HDisplay * p->VDisplay * (bpp/8) > qxl->draw_area_size) + if (p->HDisplay * p->VDisplay * (bpp/8) > qxl->surface0_size) { xf86DrvMsg(scrnIndex, X_INFO, "rejecting mode %d x %d: insufficient memory\n", p->HDisplay, p->VDisplay); return MODE_MEM; |