Re: [PATCH v3 03/23] drm/qxl: simplify slot management

2019-01-25 Thread Noralf Trønnes



Den 18.01.2019 13.20, skrev Gerd Hoffmann:
> Drop pointless indirection, remove the mem_slots array and index
> variables, drop dynamic allocation.  Store memslots in qxl_device
> instead.
> 
> Signed-off-by: Gerd Hoffmann 
> ---

Looks sane:

Acked-by: Noralf Trønnes 


[PATCH v3 03/23] drm/qxl: simplify slot management

2019-01-18 Thread Gerd Hoffmann
Drop pointless indirection, remove the mem_slots array and index
variables, drop dynamic allocation.  Store memslots in qxl_device
instead.

Signed-off-by: Gerd Hoffmann 
---
 drivers/gpu/drm/qxl/qxl_drv.h | 15 +
 drivers/gpu/drm/qxl/qxl_kms.c | 72 +--
 2 files changed, 36 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 7eabf4a9ed..f9dddfe7d9 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -130,9 +130,11 @@ struct qxl_mman {
 };
 
 struct qxl_memslot {
+   int index;
+   const char  *name;
uint8_t generation;
uint64_tstart_phys_addr;
-   uint64_tend_phys_addr;
+   uint64_tsize;
uint64_thigh_bits;
 };
 
@@ -228,11 +230,8 @@ struct qxl_device {
 
unsigned int primary_created:1;
 
-   struct qxl_memslot  *mem_slots;
-   uint8_t n_mem_slots;
-
-   uint8_t main_mem_slot;
-   uint8_t surfaces_mem_slot;
+   struct qxl_memslot main_slot;
+   struct qxl_memslot surfaces_slot;
uint8_t slot_id_bits;
uint8_t slot_gen_bits;
uint64_tva_slot_mask;
@@ -312,8 +311,8 @@ static inline uint64_t
 qxl_bo_physical_address(struct qxl_device *qdev, struct qxl_bo *bo,
unsigned long offset)
 {
-   int slot_id = bo->type == QXL_GEM_DOMAIN_VRAM ? qdev->main_mem_slot : 
qdev->surfaces_mem_slot;
-   struct qxl_memslot *slot = &(qdev->mem_slots[slot_id]);
+   struct qxl_memslot *slot = bo->type == QXL_GEM_DOMAIN_VRAM
+   ? >main_slot : >surfaces_slot;
 
/* TODO - need to hold one of the locks to read tbo.offset */
return slot->high_bits | (bo->tbo.offset + offset);
diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c
index 15238a413f..a9288100ae 100644
--- a/drivers/gpu/drm/qxl/qxl_kms.c
+++ b/drivers/gpu/drm/qxl/qxl_kms.c
@@ -53,40 +53,46 @@ static bool qxl_check_device(struct qxl_device *qdev)
return true;
 }
 
-static void setup_hw_slot(struct qxl_device *qdev, int slot_index,
- struct qxl_memslot *slot)
+static void setup_hw_slot(struct qxl_device *qdev, struct qxl_memslot *slot)
 {
qdev->ram_header->mem_slot.mem_start = slot->start_phys_addr;
-   qdev->ram_header->mem_slot.mem_end = slot->end_phys_addr;
-   qxl_io_memslot_add(qdev, slot_index);
+   qdev->ram_header->mem_slot.mem_end = slot->start_phys_addr + slot->size;
+   qxl_io_memslot_add(qdev, qdev->rom->slots_start + slot->index);
 }
 
-static uint8_t setup_slot(struct qxl_device *qdev, uint8_t slot_index_offset,
-   unsigned long start_phys_addr, unsigned long end_phys_addr)
+static void setup_slot(struct qxl_device *qdev,
+  struct qxl_memslot *slot,
+  unsigned int slot_index,
+  const char *slot_name,
+  unsigned long start_phys_addr,
+  unsigned long size)
 {
uint64_t high_bits;
-   struct qxl_memslot *slot;
-   uint8_t slot_index;
 
-   slot_index = qdev->rom->slots_start + slot_index_offset;
-   slot = >mem_slots[slot_index];
+   slot->index = slot_index;
+   slot->name = slot_name;
slot->start_phys_addr = start_phys_addr;
-   slot->end_phys_addr = end_phys_addr;
+   slot->size = size;
 
-   setup_hw_slot(qdev, slot_index, slot);
+   setup_hw_slot(qdev, slot);
 
slot->generation = qdev->rom->slot_generation;
-   high_bits = slot_index << qdev->slot_gen_bits;
+   high_bits = (qdev->rom->slots_start + slot->index)
+   << qdev->slot_gen_bits;
high_bits |= slot->generation;
high_bits <<= (64 - (qdev->slot_gen_bits + qdev->slot_id_bits));
slot->high_bits = high_bits;
-   return slot_index;
+
+   DRM_INFO("slot %d (%s): base 0x%08lx, size 0x%08lx\n",
+slot->index, slot->name,
+(unsigned long)slot->start_phys_addr,
+(unsigned long)slot->size);
 }
 
 void qxl_reinit_memslots(struct qxl_device *qdev)
 {
-   setup_hw_slot(qdev, qdev->main_mem_slot, 
>mem_slots[qdev->main_mem_slot]);
-   setup_hw_slot(qdev, qdev->surfaces_mem_slot, 
>mem_slots[qdev->surfaces_mem_slot]);
+   setup_hw_slot(qdev, >main_slot);
+   setup_hw_slot(qdev, >surfaces_slot);
 }
 
 static void qxl_gc_work(struct work_struct *work)
@@ -231,22 +237,11 @@ int qxl_device_init(struct qxl_device *qdev,
}
/* TODO - slot initialization should happen on reset. where is our
 * reset handler? */
-   qdev->n_mem_slots = qdev->rom->slots_end;
qdev->slot_gen_bits = qdev->rom->slot_gen_bits;
qdev->slot_id_bits = qdev->rom->slot_id_bits;
qdev->va_slot_mask =
(~(uint64_t)0) >> (qdev->slot_id_bits