Commit 10e19d49 authored by Nicolin Chen's avatar Nicolin Chen Committed by Alex Williamson

vfio/ap: Pass in physical address of ind to ap_aqic()

The ap_aqic() is called by vfio_ap_irq_enable() where it passes in a
virt value that's casted from a physical address "h_nib". Inside the
ap_aqic(), it does virt_to_phys() again.

Since ap_aqic() needs a physical address, let's just pass in a pa of
ind directly. So change the "ind" to "pa_ind".
Reviewed-by: default avatarHarald Freudenberger <freude@linux.ibm.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Tested-by: default avatarEric Farman <farman@linux.ibm.com>
Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Link: https://lore.kernel.org/r/20220723020256.30081-4-nicolinc@nvidia.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 2c9e8c01
...@@ -227,13 +227,13 @@ struct ap_qirq_ctrl { ...@@ -227,13 +227,13 @@ struct ap_qirq_ctrl {
* ap_aqic(): Control interruption for a specific AP. * ap_aqic(): Control interruption for a specific AP.
* @qid: The AP queue number * @qid: The AP queue number
* @qirqctrl: struct ap_qirq_ctrl (64 bit value) * @qirqctrl: struct ap_qirq_ctrl (64 bit value)
* @ind: The notification indicator byte * @pa_ind: Physical address of the notification indicator byte
* *
* Returns AP queue status. * Returns AP queue status.
*/ */
static inline struct ap_queue_status ap_aqic(ap_qid_t qid, static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
struct ap_qirq_ctrl qirqctrl, struct ap_qirq_ctrl qirqctrl,
void *ind) phys_addr_t pa_ind)
{ {
unsigned long reg0 = qid | (3UL << 24); /* fc 3UL is AQIC */ unsigned long reg0 = qid | (3UL << 24); /* fc 3UL is AQIC */
union { union {
...@@ -241,7 +241,7 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid, ...@@ -241,7 +241,7 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
struct ap_qirq_ctrl qirqctrl; struct ap_qirq_ctrl qirqctrl;
struct ap_queue_status status; struct ap_queue_status status;
} reg1; } reg1;
unsigned long reg2 = virt_to_phys(ind); unsigned long reg2 = pa_ind;
reg1.qirqctrl = qirqctrl; reg1.qirqctrl = qirqctrl;
......
...@@ -34,7 +34,7 @@ static int ap_queue_enable_irq(struct ap_queue *aq, void *ind) ...@@ -34,7 +34,7 @@ static int ap_queue_enable_irq(struct ap_queue *aq, void *ind)
qirqctrl.ir = 1; qirqctrl.ir = 1;
qirqctrl.isc = AP_ISC; qirqctrl.isc = AP_ISC;
status = ap_aqic(aq->qid, qirqctrl, ind); status = ap_aqic(aq->qid, qirqctrl, virt_to_phys(ind));
switch (status.response_code) { switch (status.response_code) {
case AP_RESPONSE_NORMAL: case AP_RESPONSE_NORMAL:
case AP_RESPONSE_OTHERWISE_CHANGED: case AP_RESPONSE_OTHERWISE_CHANGED:
......
...@@ -154,7 +154,7 @@ static struct ap_queue_status vfio_ap_irq_disable(struct vfio_ap_queue *q) ...@@ -154,7 +154,7 @@ static struct ap_queue_status vfio_ap_irq_disable(struct vfio_ap_queue *q)
int retries = 5; int retries = 5;
do { do {
status = ap_aqic(q->apqn, aqic_gisa, NULL); status = ap_aqic(q->apqn, aqic_gisa, 0);
switch (status.response_code) { switch (status.response_code) {
case AP_RESPONSE_OTHERWISE_CHANGED: case AP_RESPONSE_OTHERWISE_CHANGED:
case AP_RESPONSE_NORMAL: case AP_RESPONSE_NORMAL:
...@@ -245,7 +245,8 @@ static struct ap_queue_status vfio_ap_irq_enable(struct vfio_ap_queue *q, ...@@ -245,7 +245,8 @@ static struct ap_queue_status vfio_ap_irq_enable(struct vfio_ap_queue *q,
struct kvm_s390_gisa *gisa; struct kvm_s390_gisa *gisa;
int nisc; int nisc;
struct kvm *kvm; struct kvm *kvm;
unsigned long h_nib, g_pfn, h_pfn; unsigned long g_pfn, h_pfn;
phys_addr_t h_nib;
int ret; int ret;
/* Verify that the notification indicator byte address is valid */ /* Verify that the notification indicator byte address is valid */
...@@ -290,7 +291,7 @@ static struct ap_queue_status vfio_ap_irq_enable(struct vfio_ap_queue *q, ...@@ -290,7 +291,7 @@ static struct ap_queue_status vfio_ap_irq_enable(struct vfio_ap_queue *q,
aqic_gisa.ir = 1; aqic_gisa.ir = 1;
aqic_gisa.gisa = (uint64_t)gisa >> 4; aqic_gisa.gisa = (uint64_t)gisa >> 4;
status = ap_aqic(q->apqn, aqic_gisa, (void *)h_nib); status = ap_aqic(q->apqn, aqic_gisa, h_nib);
switch (status.response_code) { switch (status.response_code) {
case AP_RESPONSE_NORMAL: case AP_RESPONSE_NORMAL:
/* See if we did clear older IRQ configuration */ /* See if we did clear older IRQ configuration */
......
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