s390/qdio: clean up QDR setup
authorJulian Wiedmann <jwi@linux.ibm.com>
Wed, 19 Feb 2020 10:15:30 +0000 (11:15 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Mon, 14 Sep 2020 08:30:07 +0000 (10:30 +0200)
__qdio_allocate_fill_qdr() is meant to set up one specific queue
descriptor in the QDR. But for this simple task, it gets passed a bunch
of global structs and offsets - and then navigates through the structs
to find its actual operands.

Clean up all the complicated pointer chasing & index calculation, and
just pass a descriptor and its associated queue struct.

While at it also add some virt_to_phys() translations, to clarify that
addresses in the QDR are meant to be absolute.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/qdio.h
drivers/s390/cio/qdio_setup.c

index e69dbf438f9990834bd12dfb0182026a56609d17..60012fc11bac1abd9533ecc229e92cf86d6214f9 100644 (file)
@@ -26,9 +26,9 @@
 
 /**
  * struct qdesfmt0 - queue descriptor, format 0
- * @sliba: storage list information block address
- * @sla: storage list address
- * @slsba: storage list state block address
+ * @sliba: absolute address of storage list information block
+ * @sla: absolute address of storage list
+ * @slsba: absolute address of storage list state block
  * @akey: access key for SLIB
  * @bkey: access key for SL
  * @ckey: access key for SBALs
@@ -56,7 +56,7 @@ struct qdesfmt0 {
  * @oqdcnt: output queue descriptor count
  * @iqdsz: input queue descriptor size
  * @oqdsz: output queue descriptor size
- * @qiba: queue information block address
+ * @qiba: absolute address of queue information block
  * @qkey: queue information block key
  * @qdf0: queue descriptions
  */
index 2c5cc6ec668e9da6867bf26bed7c88a56ea63d96..42e1c09493092f8605439a020a9f8a96ba302aa0 100644 (file)
@@ -403,28 +403,22 @@ void qdio_free_async_data(struct qdio_irq *irq_ptr)
        }
 }
 
-static void __qdio_allocate_fill_qdr(struct qdio_irq *irq_ptr,
-                                    struct qdio_q **irq_ptr_qs,
-                                    int i, int nr)
+static void qdio_fill_qdr_desc(struct qdesfmt0 *desc, struct qdio_q *queue)
 {
-       irq_ptr->qdr->qdf0[i + nr].sliba =
-               (unsigned long)irq_ptr_qs[i]->slib;
-
-       irq_ptr->qdr->qdf0[i + nr].sla =
-               (unsigned long)irq_ptr_qs[i]->sl;
-
-       irq_ptr->qdr->qdf0[i + nr].slsba =
-               (unsigned long)&irq_ptr_qs[i]->slsb.val[0];
-
-       irq_ptr->qdr->qdf0[i + nr].akey = PAGE_DEFAULT_KEY >> 4;
-       irq_ptr->qdr->qdf0[i + nr].bkey = PAGE_DEFAULT_KEY >> 4;
-       irq_ptr->qdr->qdf0[i + nr].ckey = PAGE_DEFAULT_KEY >> 4;
-       irq_ptr->qdr->qdf0[i + nr].dkey = PAGE_DEFAULT_KEY >> 4;
+       desc->sliba = virt_to_phys(queue->slib);
+       desc->sla = virt_to_phys(queue->sl);
+       desc->slsba = virt_to_phys(&queue->slsb);
+
+       desc->akey = PAGE_DEFAULT_KEY >> 4;
+       desc->bkey = PAGE_DEFAULT_KEY >> 4;
+       desc->ckey = PAGE_DEFAULT_KEY >> 4;
+       desc->dkey = PAGE_DEFAULT_KEY >> 4;
 }
 
 static void setup_qdr(struct qdio_irq *irq_ptr,
                      struct qdio_initialize *qdio_init)
 {
+       struct qdesfmt0 *desc = &irq_ptr->qdr->qdf0[0];
        int i;
 
        irq_ptr->qdr->qfmt = qdio_init->q_format;
@@ -433,15 +427,14 @@ static void setup_qdr(struct qdio_irq *irq_ptr,
        irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs;
        irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */
        irq_ptr->qdr->oqdsz = sizeof(struct qdesfmt0) / 4;
-       irq_ptr->qdr->qiba = (unsigned long)&irq_ptr->qib;
+       irq_ptr->qdr->qiba = virt_to_phys(&irq_ptr->qib);
        irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY >> 4;
 
        for (i = 0; i < qdio_init->no_input_qs; i++)
-               __qdio_allocate_fill_qdr(irq_ptr, irq_ptr->input_qs, i, 0);
+               qdio_fill_qdr_desc(desc++, irq_ptr->input_qs[i]);
 
        for (i = 0; i < qdio_init->no_output_qs; i++)
-               __qdio_allocate_fill_qdr(irq_ptr, irq_ptr->output_qs, i,
-                                        qdio_init->no_input_qs);
+               qdio_fill_qdr_desc(desc++, irq_ptr->output_qs[i]);
 }
 
 static void setup_qib(struct qdio_irq *irq_ptr,