Commit 4d4a3caa authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Vasily Gorbik

s390/qdio: clean up QDR setup

__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: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 309f98db
...@@ -26,9 +26,9 @@ ...@@ -26,9 +26,9 @@
/** /**
* struct qdesfmt0 - queue descriptor, format 0 * struct qdesfmt0 - queue descriptor, format 0
* @sliba: storage list information block address * @sliba: absolute address of storage list information block
* @sla: storage list address * @sla: absolute address of storage list
* @slsba: storage list state block address * @slsba: absolute address of storage list state block
* @akey: access key for SLIB * @akey: access key for SLIB
* @bkey: access key for SL * @bkey: access key for SL
* @ckey: access key for SBALs * @ckey: access key for SBALs
...@@ -56,7 +56,7 @@ struct qdesfmt0 { ...@@ -56,7 +56,7 @@ struct qdesfmt0 {
* @oqdcnt: output queue descriptor count * @oqdcnt: output queue descriptor count
* @iqdsz: input queue descriptor size * @iqdsz: input queue descriptor size
* @oqdsz: output 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 * @qkey: queue information block key
* @qdf0: queue descriptions * @qdf0: queue descriptions
*/ */
......
...@@ -403,28 +403,22 @@ void qdio_free_async_data(struct qdio_irq *irq_ptr) ...@@ -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, static void qdio_fill_qdr_desc(struct qdesfmt0 *desc, struct qdio_q *queue)
struct qdio_q **irq_ptr_qs,
int i, int nr)
{ {
irq_ptr->qdr->qdf0[i + nr].sliba = desc->sliba = virt_to_phys(queue->slib);
(unsigned long)irq_ptr_qs[i]->slib; desc->sla = virt_to_phys(queue->sl);
desc->slsba = virt_to_phys(&queue->slsb);
irq_ptr->qdr->qdf0[i + nr].sla =
(unsigned long)irq_ptr_qs[i]->sl; desc->akey = PAGE_DEFAULT_KEY >> 4;
desc->bkey = PAGE_DEFAULT_KEY >> 4;
irq_ptr->qdr->qdf0[i + nr].slsba = desc->ckey = PAGE_DEFAULT_KEY >> 4;
(unsigned long)&irq_ptr_qs[i]->slsb.val[0]; desc->dkey = PAGE_DEFAULT_KEY >> 4;
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;
} }
static void setup_qdr(struct qdio_irq *irq_ptr, static void setup_qdr(struct qdio_irq *irq_ptr,
struct qdio_initialize *qdio_init) struct qdio_initialize *qdio_init)
{ {
struct qdesfmt0 *desc = &irq_ptr->qdr->qdf0[0];
int i; int i;
irq_ptr->qdr->qfmt = qdio_init->q_format; irq_ptr->qdr->qfmt = qdio_init->q_format;
...@@ -433,15 +427,14 @@ static void setup_qdr(struct qdio_irq *irq_ptr, ...@@ -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->oqdcnt = qdio_init->no_output_qs;
irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */ irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */
irq_ptr->qdr->oqdsz = sizeof(struct qdesfmt0) / 4; 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; irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY >> 4;
for (i = 0; i < qdio_init->no_input_qs; i++) 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++) for (i = 0; i < qdio_init->no_output_qs; i++)
__qdio_allocate_fill_qdr(irq_ptr, irq_ptr->output_qs, i, qdio_fill_qdr_desc(desc++, irq_ptr->output_qs[i]);
qdio_init->no_input_qs);
} }
static void setup_qib(struct qdio_irq *irq_ptr, static void setup_qib(struct qdio_irq *irq_ptr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment