diff options
author | Dave Airlie <airlied@redhat.com> | 2013-07-04 00:57:58 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-07-04 20:44:17 -0400 |
commit | c9fdda2a2b7a8875db3eebd89e428aa760afb897 (patch) | |
tree | e890d31801cd801538fda0ed94625e3ba0b9a40a /drivers/gpu/drm/qxl/qxl_kms.c | |
parent | 2bd6ce84e1b4799be1f328a165d0b8a4fdfd2141 (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.c | 21 |
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 | ||
75 | static 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 | |||
75 | static uint8_t setup_slot(struct qxl_device *qdev, uint8_t slot_index_offset, | 83 | static 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 | ||
105 | void 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 | |||
98 | static void qxl_gc_work(struct work_struct *work) | 111 | static 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); |