aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/qxl/qxl_kms.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-07-04 00:57:58 -0400
committerDave Airlie <airlied@redhat.com>2013-07-04 20:44:17 -0400
commitc9fdda2a2b7a8875db3eebd89e428aa760afb897 (patch)
treee890d31801cd801538fda0ed94625e3ba0b9a40a /drivers/gpu/drm/qxl/qxl_kms.c
parent2bd6ce84e1b4799be1f328a165d0b8a4fdfd2141 (diff)
qxl: prepare memslot code for suspend/resume
this splits out initing the hw memslots from the guest info, and creates an entrypoint for s/r to use. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/qxl/qxl_kms.c')
-rw-r--r--drivers/gpu/drm/qxl/qxl_kms.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c
index e27ce2a907cf..2c6f9219e9d9 100644
--- a/drivers/gpu/drm/qxl/qxl_kms.c
+++ b/drivers/gpu/drm/qxl/qxl_kms.c
@@ -72,21 +72,28 @@ static bool qxl_check_device(struct qxl_device *qdev)
72 return true; 72 return true;
73} 73}
74 74
75static void setup_hw_slot(struct qxl_device *qdev, int slot_index,
76 struct qxl_memslot *slot)
77{
78 qdev->ram_header->mem_slot.mem_start = slot->start_phys_addr;
79 qdev->ram_header->mem_slot.mem_end = slot->end_phys_addr;
80 qxl_io_memslot_add(qdev, slot_index);
81}
82
75static uint8_t setup_slot(struct qxl_device *qdev, uint8_t slot_index_offset, 83static uint8_t setup_slot(struct qxl_device *qdev, uint8_t slot_index_offset,
76 unsigned long start_phys_addr, unsigned long end_phys_addr) 84 unsigned long start_phys_addr, unsigned long end_phys_addr)
77{ 85{
78 uint64_t high_bits; 86 uint64_t high_bits;
79 struct qxl_memslot *slot; 87 struct qxl_memslot *slot;
80 uint8_t slot_index; 88 uint8_t slot_index;
81 struct qxl_ram_header *ram_header = qdev->ram_header;
82 89
83 slot_index = qdev->rom->slots_start + slot_index_offset; 90 slot_index = qdev->rom->slots_start + slot_index_offset;
84 slot = &qdev->mem_slots[slot_index]; 91 slot = &qdev->mem_slots[slot_index];
85 slot->start_phys_addr = start_phys_addr; 92 slot->start_phys_addr = start_phys_addr;
86 slot->end_phys_addr = end_phys_addr; 93 slot->end_phys_addr = end_phys_addr;
87 ram_header->mem_slot.mem_start = slot->start_phys_addr; 94
88 ram_header->mem_slot.mem_end = slot->end_phys_addr; 95 setup_hw_slot(qdev, slot_index, slot);
89 qxl_io_memslot_add(qdev, slot_index); 96
90 slot->generation = qdev->rom->slot_generation; 97 slot->generation = qdev->rom->slot_generation;
91 high_bits = slot_index << qdev->slot_gen_bits; 98 high_bits = slot_index << qdev->slot_gen_bits;
92 high_bits |= slot->generation; 99 high_bits |= slot->generation;
@@ -95,6 +102,12 @@ static uint8_t setup_slot(struct qxl_device *qdev, uint8_t slot_index_offset,
95 return slot_index; 102 return slot_index;
96} 103}
97 104
105void qxl_reinit_memslots(struct qxl_device *qdev)
106{
107 setup_hw_slot(qdev, qdev->main_mem_slot, &qdev->mem_slots[qdev->main_mem_slot]);
108 setup_hw_slot(qdev, qdev->surfaces_mem_slot, &qdev->mem_slots[qdev->surfaces_mem_slot]);
109}
110
98static void qxl_gc_work(struct work_struct *work) 111static void qxl_gc_work(struct work_struct *work)
99{ 112{
100 struct qxl_device *qdev = container_of(work, struct qxl_device, gc_work); 113 struct qxl_device *qdev = container_of(work, struct qxl_device, gc_work);