summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHalil Pasic <pasic@linux.ibm.com>2019-03-26 07:41:09 -0400
committerHeiko Carstens <heiko.carstens@de.ibm.com>2019-06-15 06:25:00 -0400
commit37db8985b2116c89a3cbaf87083a02f83afaba5b (patch)
tree6773488a5f73993f894e4bc164afb4d8c23a9460
parentbb99332a2b558e1f28b4c5011f9ea3b46f1c8806 (diff)
s390/cio: add basic protected virtualization support
As virtio-ccw devices are channel devices, we need to use the dma area within the common I/O layer for any communication with the hypervisor. Note that we do not need to use that area for control blocks directly referenced by instructions, e.g. the orb. It handles neither QDIO in the common code, nor any device type specific stuff (like channel programs constructed by the DASD driver). An interesting side effect is that virtio structures are now going to get allocated in 31 bit addressable storage. Signed-off-by: Halil Pasic <pasic@linux.ibm.com> Reviewed-by: Sebastian Ott <sebott@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Reviewed-by: Michael Mueller <mimu@linux.ibm.com> Tested-by: Michael Mueller <mimu@linux.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
-rw-r--r--arch/s390/include/asm/ccwdev.h4
-rw-r--r--drivers/s390/cio/ccwreq.c9
-rw-r--r--drivers/s390/cio/device.c68
-rw-r--r--drivers/s390/cio/device_fsm.c49
-rw-r--r--drivers/s390/cio/device_id.c20
-rw-r--r--drivers/s390/cio/device_ops.c21
-rw-r--r--drivers/s390/cio/device_pgid.c22
-rw-r--r--drivers/s390/cio/device_status.c24
-rw-r--r--drivers/s390/cio/io_sch.h20
-rw-r--r--drivers/s390/virtio/virtio_ccw.c10
10 files changed, 164 insertions, 83 deletions
diff --git a/arch/s390/include/asm/ccwdev.h b/arch/s390/include/asm/ccwdev.h
index a29dd430fb40..865ce1cb86d5 100644
--- a/arch/s390/include/asm/ccwdev.h
+++ b/arch/s390/include/asm/ccwdev.h
@@ -226,6 +226,10 @@ extern int ccw_device_enable_console(struct ccw_device *);
226extern void ccw_device_wait_idle(struct ccw_device *); 226extern void ccw_device_wait_idle(struct ccw_device *);
227extern int ccw_device_force_console(struct ccw_device *); 227extern int ccw_device_force_console(struct ccw_device *);
228 228
229extern void *ccw_device_dma_zalloc(struct ccw_device *cdev, size_t size);
230extern void ccw_device_dma_free(struct ccw_device *cdev,
231 void *cpu_addr, size_t size);
232
229int ccw_device_siosl(struct ccw_device *); 233int ccw_device_siosl(struct ccw_device *);
230 234
231extern void ccw_device_get_schid(struct ccw_device *, struct subchannel_id *); 235extern void ccw_device_get_schid(struct ccw_device *, struct subchannel_id *);
diff --git a/drivers/s390/cio/ccwreq.c b/drivers/s390/cio/ccwreq.c
index 603268a33ea1..73582a0a2622 100644
--- a/drivers/s390/cio/ccwreq.c
+++ b/drivers/s390/cio/ccwreq.c
@@ -63,7 +63,7 @@ static void ccwreq_stop(struct ccw_device *cdev, int rc)
63 return; 63 return;
64 req->done = 1; 64 req->done = 1;
65 ccw_device_set_timeout(cdev, 0); 65 ccw_device_set_timeout(cdev, 0);
66 memset(&cdev->private->irb, 0, sizeof(struct irb)); 66 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
67 if (rc && rc != -ENODEV && req->drc) 67 if (rc && rc != -ENODEV && req->drc)
68 rc = req->drc; 68 rc = req->drc;
69 req->callback(cdev, req->data, rc); 69 req->callback(cdev, req->data, rc);
@@ -86,7 +86,7 @@ static void ccwreq_do(struct ccw_device *cdev)
86 continue; 86 continue;
87 } 87 }
88 /* Perform start function. */ 88 /* Perform start function. */
89 memset(&cdev->private->irb, 0, sizeof(struct irb)); 89 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
90 rc = cio_start(sch, cp, (u8) req->mask); 90 rc = cio_start(sch, cp, (u8) req->mask);
91 if (rc == 0) { 91 if (rc == 0) {
92 /* I/O started successfully. */ 92 /* I/O started successfully. */
@@ -169,7 +169,7 @@ int ccw_request_cancel(struct ccw_device *cdev)
169 */ 169 */
170static enum io_status ccwreq_status(struct ccw_device *cdev, struct irb *lcirb) 170static enum io_status ccwreq_status(struct ccw_device *cdev, struct irb *lcirb)
171{ 171{
172 struct irb *irb = &cdev->private->irb; 172 struct irb *irb = &cdev->private->dma_area->irb;
173 struct cmd_scsw *scsw = &irb->scsw.cmd; 173 struct cmd_scsw *scsw = &irb->scsw.cmd;
174 enum uc_todo todo; 174 enum uc_todo todo;
175 175
@@ -187,7 +187,8 @@ static enum io_status ccwreq_status(struct ccw_device *cdev, struct irb *lcirb)
187 CIO_TRACE_EVENT(2, "sensedata"); 187 CIO_TRACE_EVENT(2, "sensedata");
188 CIO_HEX_EVENT(2, &cdev->private->dev_id, 188 CIO_HEX_EVENT(2, &cdev->private->dev_id,
189 sizeof(struct ccw_dev_id)); 189 sizeof(struct ccw_dev_id));
190 CIO_HEX_EVENT(2, &cdev->private->irb.ecw, SENSE_MAX_COUNT); 190 CIO_HEX_EVENT(2, &cdev->private->dma_area->irb.ecw,
191 SENSE_MAX_COUNT);
191 /* Check for command reject. */ 192 /* Check for command reject. */
192 if (irb->ecw[0] & SNS0_CMD_REJECT) 193 if (irb->ecw[0] & SNS0_CMD_REJECT)
193 return IO_REJECTED; 194 return IO_REJECTED;
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index 1540229a37bb..9985b7484a6b 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -24,6 +24,7 @@
24#include <linux/timer.h> 24#include <linux/timer.h>
25#include <linux/kernel_stat.h> 25#include <linux/kernel_stat.h>
26#include <linux/sched/signal.h> 26#include <linux/sched/signal.h>
27#include <linux/dma-mapping.h>
27 28
28#include <asm/ccwdev.h> 29#include <asm/ccwdev.h>
29#include <asm/cio.h> 30#include <asm/cio.h>
@@ -687,6 +688,9 @@ ccw_device_release(struct device *dev)
687 struct ccw_device *cdev; 688 struct ccw_device *cdev;
688 689
689 cdev = to_ccwdev(dev); 690 cdev = to_ccwdev(dev);
691 cio_gp_dma_free(cdev->private->dma_pool, cdev->private->dma_area,
692 sizeof(*cdev->private->dma_area));
693 cio_gp_dma_destroy(cdev->private->dma_pool, &cdev->dev);
690 /* Release reference of parent subchannel. */ 694 /* Release reference of parent subchannel. */
691 put_device(cdev->dev.parent); 695 put_device(cdev->dev.parent);
692 kfree(cdev->private); 696 kfree(cdev->private);
@@ -696,15 +700,33 @@ ccw_device_release(struct device *dev)
696static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch) 700static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch)
697{ 701{
698 struct ccw_device *cdev; 702 struct ccw_device *cdev;
703 struct gen_pool *dma_pool;
699 704
700 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); 705 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
701 if (cdev) { 706 if (!cdev)
702 cdev->private = kzalloc(sizeof(struct ccw_device_private), 707 goto err_cdev;
703 GFP_KERNEL | GFP_DMA); 708 cdev->private = kzalloc(sizeof(struct ccw_device_private),
704 if (cdev->private) 709 GFP_KERNEL | GFP_DMA);
705 return cdev; 710 if (!cdev->private)
706 } 711 goto err_priv;
712 cdev->dev.coherent_dma_mask = sch->dev.coherent_dma_mask;
713 cdev->dev.dma_mask = &cdev->dev.coherent_dma_mask;
714 dma_pool = cio_gp_dma_create(&cdev->dev, 1);
715 if (!dma_pool)
716 goto err_dma_pool;
717 cdev->private->dma_pool = dma_pool;
718 cdev->private->dma_area = cio_gp_dma_zalloc(dma_pool, &cdev->dev,
719 sizeof(*cdev->private->dma_area));
720 if (!cdev->private->dma_area)
721 goto err_dma_area;
722 return cdev;
723err_dma_area:
724 cio_gp_dma_destroy(dma_pool, &cdev->dev);
725err_dma_pool:
726 kfree(cdev->private);
727err_priv:
707 kfree(cdev); 728 kfree(cdev);
729err_cdev:
708 return ERR_PTR(-ENOMEM); 730 return ERR_PTR(-ENOMEM);
709} 731}
710 732
@@ -884,7 +906,7 @@ io_subchannel_recog_done(struct ccw_device *cdev)
884 wake_up(&ccw_device_init_wq); 906 wake_up(&ccw_device_init_wq);
885 break; 907 break;
886 case DEV_STATE_OFFLINE: 908 case DEV_STATE_OFFLINE:
887 /* 909 /*
888 * We can't register the device in interrupt context so 910 * We can't register the device in interrupt context so
889 * we schedule a work item. 911 * we schedule a work item.
890 */ 912 */
@@ -1062,6 +1084,14 @@ static int io_subchannel_probe(struct subchannel *sch)
1062 if (!io_priv) 1084 if (!io_priv)
1063 goto out_schedule; 1085 goto out_schedule;
1064 1086
1087 io_priv->dma_area = dma_alloc_coherent(&sch->dev,
1088 sizeof(*io_priv->dma_area),
1089 &io_priv->dma_area_dma, GFP_KERNEL);
1090 if (!io_priv->dma_area) {
1091 kfree(io_priv);
1092 goto out_schedule;
1093 }
1094
1065 set_io_private(sch, io_priv); 1095 set_io_private(sch, io_priv);
1066 css_schedule_eval(sch->schid); 1096 css_schedule_eval(sch->schid);
1067 return 0; 1097 return 0;
@@ -1088,6 +1118,8 @@ static int io_subchannel_remove(struct subchannel *sch)
1088 set_io_private(sch, NULL); 1118 set_io_private(sch, NULL);
1089 spin_unlock_irq(sch->lock); 1119 spin_unlock_irq(sch->lock);
1090out_free: 1120out_free:
1121 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area),
1122 io_priv->dma_area, io_priv->dma_area_dma);
1091 kfree(io_priv); 1123 kfree(io_priv);
1092 sysfs_remove_group(&sch->dev.kobj, &io_subchannel_attr_group); 1124 sysfs_remove_group(&sch->dev.kobj, &io_subchannel_attr_group);
1093 return 0; 1125 return 0;
@@ -1593,13 +1625,19 @@ struct ccw_device * __init ccw_device_create_console(struct ccw_driver *drv)
1593 return ERR_CAST(sch); 1625 return ERR_CAST(sch);
1594 1626
1595 io_priv = kzalloc(sizeof(*io_priv), GFP_KERNEL | GFP_DMA); 1627 io_priv = kzalloc(sizeof(*io_priv), GFP_KERNEL | GFP_DMA);
1596 if (!io_priv) { 1628 if (!io_priv)
1597 put_device(&sch->dev); 1629 goto err_priv;
1598 return ERR_PTR(-ENOMEM); 1630 io_priv->dma_area = dma_alloc_coherent(&sch->dev,
1599 } 1631 sizeof(*io_priv->dma_area),
1632 &io_priv->dma_area_dma, GFP_KERNEL);
1633 if (!io_priv->dma_area)
1634 goto err_dma_area;
1600 set_io_private(sch, io_priv); 1635 set_io_private(sch, io_priv);
1601 cdev = io_subchannel_create_ccwdev(sch); 1636 cdev = io_subchannel_create_ccwdev(sch);
1602 if (IS_ERR(cdev)) { 1637 if (IS_ERR(cdev)) {
1638 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area),
1639 io_priv->dma_area, io_priv->dma_area_dma);
1640 set_io_private(sch, NULL);
1603 put_device(&sch->dev); 1641 put_device(&sch->dev);
1604 kfree(io_priv); 1642 kfree(io_priv);
1605 return cdev; 1643 return cdev;
@@ -1607,6 +1645,12 @@ struct ccw_device * __init ccw_device_create_console(struct ccw_driver *drv)
1607 cdev->drv = drv; 1645 cdev->drv = drv;
1608 ccw_device_set_int_class(cdev); 1646 ccw_device_set_int_class(cdev);
1609 return cdev; 1647 return cdev;
1648
1649err_dma_area:
1650 kfree(io_priv);
1651err_priv:
1652 put_device(&sch->dev);
1653 return ERR_PTR(-ENOMEM);
1610} 1654}
1611 1655
1612void __init ccw_device_destroy_console(struct ccw_device *cdev) 1656void __init ccw_device_destroy_console(struct ccw_device *cdev)
@@ -1617,6 +1661,8 @@ void __init ccw_device_destroy_console(struct ccw_device *cdev)
1617 set_io_private(sch, NULL); 1661 set_io_private(sch, NULL);
1618 put_device(&sch->dev); 1662 put_device(&sch->dev);
1619 put_device(&cdev->dev); 1663 put_device(&cdev->dev);
1664 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area),
1665 io_priv->dma_area, io_priv->dma_area_dma);
1620 kfree(io_priv); 1666 kfree(io_priv);
1621} 1667}
1622 1668
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index 9169af7dbb43..8fc267324ebb 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -67,8 +67,10 @@ static void ccw_timeout_log(struct ccw_device *cdev)
67 sizeof(struct tcw), 0); 67 sizeof(struct tcw), 0);
68 } else { 68 } else {
69 printk(KERN_WARNING "cio: orb indicates command mode\n"); 69 printk(KERN_WARNING "cio: orb indicates command mode\n");
70 if ((void *)(addr_t)orb->cmd.cpa == &private->sense_ccw || 70 if ((void *)(addr_t)orb->cmd.cpa ==
71 (void *)(addr_t)orb->cmd.cpa == cdev->private->iccws) 71 &private->dma_area->sense_ccw ||
72 (void *)(addr_t)orb->cmd.cpa ==
73 cdev->private->dma_area->iccws)
72 printk(KERN_WARNING "cio: last channel program " 74 printk(KERN_WARNING "cio: last channel program "
73 "(intern):\n"); 75 "(intern):\n");
74 else 76 else
@@ -143,18 +145,22 @@ ccw_device_cancel_halt_clear(struct ccw_device *cdev)
143void ccw_device_update_sense_data(struct ccw_device *cdev) 145void ccw_device_update_sense_data(struct ccw_device *cdev)
144{ 146{
145 memset(&cdev->id, 0, sizeof(cdev->id)); 147 memset(&cdev->id, 0, sizeof(cdev->id));
146 cdev->id.cu_type = cdev->private->senseid.cu_type; 148 cdev->id.cu_type = cdev->private->dma_area->senseid.cu_type;
147 cdev->id.cu_model = cdev->private->senseid.cu_model; 149 cdev->id.cu_model = cdev->private->dma_area->senseid.cu_model;
148 cdev->id.dev_type = cdev->private->senseid.dev_type; 150 cdev->id.dev_type = cdev->private->dma_area->senseid.dev_type;
149 cdev->id.dev_model = cdev->private->senseid.dev_model; 151 cdev->id.dev_model = cdev->private->dma_area->senseid.dev_model;
150} 152}
151 153
152int ccw_device_test_sense_data(struct ccw_device *cdev) 154int ccw_device_test_sense_data(struct ccw_device *cdev)
153{ 155{
154 return cdev->id.cu_type == cdev->private->senseid.cu_type && 156 return cdev->id.cu_type ==
155 cdev->id.cu_model == cdev->private->senseid.cu_model && 157 cdev->private->dma_area->senseid.cu_type &&
156 cdev->id.dev_type == cdev->private->senseid.dev_type && 158 cdev->id.cu_model ==
157 cdev->id.dev_model == cdev->private->senseid.dev_model; 159 cdev->private->dma_area->senseid.cu_model &&
160 cdev->id.dev_type ==
161 cdev->private->dma_area->senseid.dev_type &&
162 cdev->id.dev_model ==
163 cdev->private->dma_area->senseid.dev_model;
158} 164}
159 165
160/* 166/*
@@ -342,7 +348,7 @@ ccw_device_done(struct ccw_device *cdev, int state)
342 cio_disable_subchannel(sch); 348 cio_disable_subchannel(sch);
343 349
344 /* Reset device status. */ 350 /* Reset device status. */
345 memset(&cdev->private->irb, 0, sizeof(struct irb)); 351 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
346 352
347 cdev->private->state = state; 353 cdev->private->state = state;
348 354
@@ -509,13 +515,14 @@ callback:
509 ccw_device_done(cdev, DEV_STATE_ONLINE); 515 ccw_device_done(cdev, DEV_STATE_ONLINE);
510 /* Deliver fake irb to device driver, if needed. */ 516 /* Deliver fake irb to device driver, if needed. */
511 if (cdev->private->flags.fake_irb) { 517 if (cdev->private->flags.fake_irb) {
512 create_fake_irb(&cdev->private->irb, 518 create_fake_irb(&cdev->private->dma_area->irb,
513 cdev->private->flags.fake_irb); 519 cdev->private->flags.fake_irb);
514 cdev->private->flags.fake_irb = 0; 520 cdev->private->flags.fake_irb = 0;
515 if (cdev->handler) 521 if (cdev->handler)
516 cdev->handler(cdev, cdev->private->intparm, 522 cdev->handler(cdev, cdev->private->intparm,
517 &cdev->private->irb); 523 &cdev->private->dma_area->irb);
518 memset(&cdev->private->irb, 0, sizeof(struct irb)); 524 memset(&cdev->private->dma_area->irb, 0,
525 sizeof(struct irb));
519 } 526 }
520 ccw_device_report_path_events(cdev); 527 ccw_device_report_path_events(cdev);
521 ccw_device_handle_broken_paths(cdev); 528 ccw_device_handle_broken_paths(cdev);
@@ -672,7 +679,8 @@ ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event)
672 679
673 if (scsw_actl(&sch->schib.scsw) != 0 || 680 if (scsw_actl(&sch->schib.scsw) != 0 ||
674 (scsw_stctl(&sch->schib.scsw) & SCSW_STCTL_STATUS_PEND) || 681 (scsw_stctl(&sch->schib.scsw) & SCSW_STCTL_STATUS_PEND) ||
675 (scsw_stctl(&cdev->private->irb.scsw) & SCSW_STCTL_STATUS_PEND)) { 682 (scsw_stctl(&cdev->private->dma_area->irb.scsw) &
683 SCSW_STCTL_STATUS_PEND)) {
676 /* 684 /*
677 * No final status yet or final status not yet delivered 685 * No final status yet or final status not yet delivered
678 * to the device driver. Can't do path verification now, 686 * to the device driver. Can't do path verification now,
@@ -719,7 +727,7 @@ static int ccw_device_call_handler(struct ccw_device *cdev)
719 * - fast notification was requested (primary status) 727 * - fast notification was requested (primary status)
720 * - unsolicited interrupts 728 * - unsolicited interrupts
721 */ 729 */
722 stctl = scsw_stctl(&cdev->private->irb.scsw); 730 stctl = scsw_stctl(&cdev->private->dma_area->irb.scsw);
723 ending_status = (stctl & SCSW_STCTL_SEC_STATUS) || 731 ending_status = (stctl & SCSW_STCTL_SEC_STATUS) ||
724 (stctl == (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)) || 732 (stctl == (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)) ||
725 (stctl == SCSW_STCTL_STATUS_PEND); 733 (stctl == SCSW_STCTL_STATUS_PEND);
@@ -735,9 +743,9 @@ static int ccw_device_call_handler(struct ccw_device *cdev)
735 743
736 if (cdev->handler) 744 if (cdev->handler)
737 cdev->handler(cdev, cdev->private->intparm, 745 cdev->handler(cdev, cdev->private->intparm,
738 &cdev->private->irb); 746 &cdev->private->dma_area->irb);
739 747
740 memset(&cdev->private->irb, 0, sizeof(struct irb)); 748 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
741 return 1; 749 return 1;
742} 750}
743 751
@@ -759,7 +767,8 @@ ccw_device_irq(struct ccw_device *cdev, enum dev_event dev_event)
759 /* Unit check but no sense data. Need basic sense. */ 767 /* Unit check but no sense data. Need basic sense. */
760 if (ccw_device_do_sense(cdev, irb) != 0) 768 if (ccw_device_do_sense(cdev, irb) != 0)
761 goto call_handler_unsol; 769 goto call_handler_unsol;
762 memcpy(&cdev->private->irb, irb, sizeof(struct irb)); 770 memcpy(&cdev->private->dma_area->irb, irb,
771 sizeof(struct irb));
763 cdev->private->state = DEV_STATE_W4SENSE; 772 cdev->private->state = DEV_STATE_W4SENSE;
764 cdev->private->intparm = 0; 773 cdev->private->intparm = 0;
765 return; 774 return;
@@ -842,7 +851,7 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event)
842 if (scsw_fctl(&irb->scsw) & 851 if (scsw_fctl(&irb->scsw) &
843 (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) { 852 (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) {
844 cdev->private->flags.dosense = 0; 853 cdev->private->flags.dosense = 0;
845 memset(&cdev->private->irb, 0, sizeof(struct irb)); 854 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
846 ccw_device_accumulate_irb(cdev, irb); 855 ccw_device_accumulate_irb(cdev, irb);
847 goto call_handler; 856 goto call_handler;
848 } 857 }
diff --git a/drivers/s390/cio/device_id.c b/drivers/s390/cio/device_id.c
index f6df83a9dfbb..740996d0dc8c 100644
--- a/drivers/s390/cio/device_id.c
+++ b/drivers/s390/cio/device_id.c
@@ -99,7 +99,7 @@ static int diag210_to_senseid(struct senseid *senseid, struct diag210 *diag)
99static int diag210_get_dev_info(struct ccw_device *cdev) 99static int diag210_get_dev_info(struct ccw_device *cdev)
100{ 100{
101 struct ccw_dev_id *dev_id = &cdev->private->dev_id; 101 struct ccw_dev_id *dev_id = &cdev->private->dev_id;
102 struct senseid *senseid = &cdev->private->senseid; 102 struct senseid *senseid = &cdev->private->dma_area->senseid;
103 struct diag210 diag_data; 103 struct diag210 diag_data;
104 int rc; 104 int rc;
105 105
@@ -134,8 +134,10 @@ err_failed:
134static void snsid_init(struct ccw_device *cdev) 134static void snsid_init(struct ccw_device *cdev)
135{ 135{
136 cdev->private->flags.esid = 0; 136 cdev->private->flags.esid = 0;
137 memset(&cdev->private->senseid, 0, sizeof(cdev->private->senseid)); 137
138 cdev->private->senseid.cu_type = 0xffff; 138 memset(&cdev->private->dma_area->senseid, 0,
139 sizeof(cdev->private->dma_area->senseid));
140 cdev->private->dma_area->senseid.cu_type = 0xffff;
139} 141}
140 142
141/* 143/*
@@ -143,16 +145,16 @@ static void snsid_init(struct ccw_device *cdev)
143 */ 145 */
144static int snsid_check(struct ccw_device *cdev, void *data) 146static int snsid_check(struct ccw_device *cdev, void *data)
145{ 147{
146 struct cmd_scsw *scsw = &cdev->private->irb.scsw.cmd; 148 struct cmd_scsw *scsw = &cdev->private->dma_area->irb.scsw.cmd;
147 int len = sizeof(struct senseid) - scsw->count; 149 int len = sizeof(struct senseid) - scsw->count;
148 150
149 /* Check for incomplete SENSE ID data. */ 151 /* Check for incomplete SENSE ID data. */
150 if (len < SENSE_ID_MIN_LEN) 152 if (len < SENSE_ID_MIN_LEN)
151 goto out_restart; 153 goto out_restart;
152 if (cdev->private->senseid.cu_type == 0xffff) 154 if (cdev->private->dma_area->senseid.cu_type == 0xffff)
153 goto out_restart; 155 goto out_restart;
154 /* Check for incompatible SENSE ID data. */ 156 /* Check for incompatible SENSE ID data. */
155 if (cdev->private->senseid.reserved != 0xff) 157 if (cdev->private->dma_area->senseid.reserved != 0xff)
156 return -EOPNOTSUPP; 158 return -EOPNOTSUPP;
157 /* Check for extended-identification information. */ 159 /* Check for extended-identification information. */
158 if (len > SENSE_ID_BASIC_LEN) 160 if (len > SENSE_ID_BASIC_LEN)
@@ -170,7 +172,7 @@ out_restart:
170static void snsid_callback(struct ccw_device *cdev, void *data, int rc) 172static void snsid_callback(struct ccw_device *cdev, void *data, int rc)
171{ 173{
172 struct ccw_dev_id *id = &cdev->private->dev_id; 174 struct ccw_dev_id *id = &cdev->private->dev_id;
173 struct senseid *senseid = &cdev->private->senseid; 175 struct senseid *senseid = &cdev->private->dma_area->senseid;
174 int vm = 0; 176 int vm = 0;
175 177
176 if (rc && MACHINE_IS_VM) { 178 if (rc && MACHINE_IS_VM) {
@@ -200,7 +202,7 @@ void ccw_device_sense_id_start(struct ccw_device *cdev)
200{ 202{
201 struct subchannel *sch = to_subchannel(cdev->dev.parent); 203 struct subchannel *sch = to_subchannel(cdev->dev.parent);
202 struct ccw_request *req = &cdev->private->req; 204 struct ccw_request *req = &cdev->private->req;
203 struct ccw1 *cp = cdev->private->iccws; 205 struct ccw1 *cp = cdev->private->dma_area->iccws;
204 206
205 CIO_TRACE_EVENT(4, "snsid"); 207 CIO_TRACE_EVENT(4, "snsid");
206 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); 208 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id));
@@ -208,7 +210,7 @@ void ccw_device_sense_id_start(struct ccw_device *cdev)
208 snsid_init(cdev); 210 snsid_init(cdev);
209 /* Channel program setup. */ 211 /* Channel program setup. */
210 cp->cmd_code = CCW_CMD_SENSE_ID; 212 cp->cmd_code = CCW_CMD_SENSE_ID;
211 cp->cda = (u32) (addr_t) &cdev->private->senseid; 213 cp->cda = (u32) (addr_t) &cdev->private->dma_area->senseid;
212 cp->count = sizeof(struct senseid); 214 cp->count = sizeof(struct senseid);
213 cp->flags = CCW_FLAG_SLI; 215 cp->flags = CCW_FLAG_SLI;
214 /* Request setup. */ 216 /* Request setup. */
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c
index 4435ae0b3027..d722458c5928 100644
--- a/drivers/s390/cio/device_ops.c
+++ b/drivers/s390/cio/device_ops.c
@@ -429,8 +429,8 @@ struct ciw *ccw_device_get_ciw(struct ccw_device *cdev, __u32 ct)
429 if (cdev->private->flags.esid == 0) 429 if (cdev->private->flags.esid == 0)
430 return NULL; 430 return NULL;
431 for (ciw_cnt = 0; ciw_cnt < MAX_CIWS; ciw_cnt++) 431 for (ciw_cnt = 0; ciw_cnt < MAX_CIWS; ciw_cnt++)
432 if (cdev->private->senseid.ciw[ciw_cnt].ct == ct) 432 if (cdev->private->dma_area->senseid.ciw[ciw_cnt].ct == ct)
433 return cdev->private->senseid.ciw + ciw_cnt; 433 return cdev->private->dma_area->senseid.ciw + ciw_cnt;
434 return NULL; 434 return NULL;
435} 435}
436 436
@@ -699,6 +699,23 @@ void ccw_device_get_schid(struct ccw_device *cdev, struct subchannel_id *schid)
699} 699}
700EXPORT_SYMBOL_GPL(ccw_device_get_schid); 700EXPORT_SYMBOL_GPL(ccw_device_get_schid);
701 701
702/*
703 * Allocate zeroed dma coherent 31 bit addressable memory using
704 * the subchannels dma pool. Maximal size of allocation supported
705 * is PAGE_SIZE.
706 */
707void *ccw_device_dma_zalloc(struct ccw_device *cdev, size_t size)
708{
709 return cio_gp_dma_zalloc(cdev->private->dma_pool, &cdev->dev, size);
710}
711EXPORT_SYMBOL(ccw_device_dma_zalloc);
712
713void ccw_device_dma_free(struct ccw_device *cdev, void *cpu_addr, size_t size)
714{
715 cio_gp_dma_free(cdev->private->dma_pool, cpu_addr, size);
716}
717EXPORT_SYMBOL(ccw_device_dma_free);
718
702EXPORT_SYMBOL(ccw_device_set_options_mask); 719EXPORT_SYMBOL(ccw_device_set_options_mask);
703EXPORT_SYMBOL(ccw_device_set_options); 720EXPORT_SYMBOL(ccw_device_set_options);
704EXPORT_SYMBOL(ccw_device_clear_options); 721EXPORT_SYMBOL(ccw_device_clear_options);
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c
index d30a3babf176..767a85635a0f 100644
--- a/drivers/s390/cio/device_pgid.c
+++ b/drivers/s390/cio/device_pgid.c
@@ -57,7 +57,7 @@ out:
57static void nop_build_cp(struct ccw_device *cdev) 57static void nop_build_cp(struct ccw_device *cdev)
58{ 58{
59 struct ccw_request *req = &cdev->private->req; 59 struct ccw_request *req = &cdev->private->req;
60 struct ccw1 *cp = cdev->private->iccws; 60 struct ccw1 *cp = cdev->private->dma_area->iccws;
61 61
62 cp->cmd_code = CCW_CMD_NOOP; 62 cp->cmd_code = CCW_CMD_NOOP;
63 cp->cda = 0; 63 cp->cda = 0;
@@ -134,9 +134,9 @@ err:
134static void spid_build_cp(struct ccw_device *cdev, u8 fn) 134static void spid_build_cp(struct ccw_device *cdev, u8 fn)
135{ 135{
136 struct ccw_request *req = &cdev->private->req; 136 struct ccw_request *req = &cdev->private->req;
137 struct ccw1 *cp = cdev->private->iccws; 137 struct ccw1 *cp = cdev->private->dma_area->iccws;
138 int i = pathmask_to_pos(req->lpm); 138 int i = pathmask_to_pos(req->lpm);
139 struct pgid *pgid = &cdev->private->pgid[i]; 139 struct pgid *pgid = &cdev->private->dma_area->pgid[i];
140 140
141 pgid->inf.fc = fn; 141 pgid->inf.fc = fn;
142 cp->cmd_code = CCW_CMD_SET_PGID; 142 cp->cmd_code = CCW_CMD_SET_PGID;
@@ -300,7 +300,7 @@ static int pgid_cmp(struct pgid *p1, struct pgid *p2)
300static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, 300static void pgid_analyze(struct ccw_device *cdev, struct pgid **p,
301 int *mismatch, u8 *reserved, u8 *reset) 301 int *mismatch, u8 *reserved, u8 *reset)
302{ 302{
303 struct pgid *pgid = &cdev->private->pgid[0]; 303 struct pgid *pgid = &cdev->private->dma_area->pgid[0];
304 struct pgid *first = NULL; 304 struct pgid *first = NULL;
305 int lpm; 305 int lpm;
306 int i; 306 int i;
@@ -342,7 +342,7 @@ static u8 pgid_to_donepm(struct ccw_device *cdev)
342 lpm = 0x80 >> i; 342 lpm = 0x80 >> i;
343 if ((cdev->private->pgid_valid_mask & lpm) == 0) 343 if ((cdev->private->pgid_valid_mask & lpm) == 0)
344 continue; 344 continue;
345 pgid = &cdev->private->pgid[i]; 345 pgid = &cdev->private->dma_area->pgid[i];
346 if (sch->opm & lpm) { 346 if (sch->opm & lpm) {
347 if (pgid->inf.ps.state1 != SNID_STATE1_GROUPED) 347 if (pgid->inf.ps.state1 != SNID_STATE1_GROUPED)
348 continue; 348 continue;
@@ -368,7 +368,8 @@ static void pgid_fill(struct ccw_device *cdev, struct pgid *pgid)
368 int i; 368 int i;
369 369
370 for (i = 0; i < 8; i++) 370 for (i = 0; i < 8; i++)
371 memcpy(&cdev->private->pgid[i], pgid, sizeof(struct pgid)); 371 memcpy(&cdev->private->dma_area->pgid[i], pgid,
372 sizeof(struct pgid));
372} 373}
373 374
374/* 375/*
@@ -435,12 +436,12 @@ out:
435static void snid_build_cp(struct ccw_device *cdev) 436static void snid_build_cp(struct ccw_device *cdev)
436{ 437{
437 struct ccw_request *req = &cdev->private->req; 438 struct ccw_request *req = &cdev->private->req;
438 struct ccw1 *cp = cdev->private->iccws; 439 struct ccw1 *cp = cdev->private->dma_area->iccws;
439 int i = pathmask_to_pos(req->lpm); 440 int i = pathmask_to_pos(req->lpm);
440 441
441 /* Channel program setup. */ 442 /* Channel program setup. */
442 cp->cmd_code = CCW_CMD_SENSE_PGID; 443 cp->cmd_code = CCW_CMD_SENSE_PGID;
443 cp->cda = (u32) (addr_t) &cdev->private->pgid[i]; 444 cp->cda = (u32) (addr_t) &cdev->private->dma_area->pgid[i];
444 cp->count = sizeof(struct pgid); 445 cp->count = sizeof(struct pgid);
445 cp->flags = CCW_FLAG_SLI; 446 cp->flags = CCW_FLAG_SLI;
446 req->cp = cp; 447 req->cp = cp;
@@ -516,7 +517,8 @@ static void verify_start(struct ccw_device *cdev)
516 sch->lpm = sch->schib.pmcw.pam; 517 sch->lpm = sch->schib.pmcw.pam;
517 518
518 /* Initialize PGID data. */ 519 /* Initialize PGID data. */
519 memset(cdev->private->pgid, 0, sizeof(cdev->private->pgid)); 520 memset(cdev->private->dma_area->pgid, 0,
521 sizeof(cdev->private->dma_area->pgid));
520 cdev->private->pgid_valid_mask = 0; 522 cdev->private->pgid_valid_mask = 0;
521 cdev->private->pgid_todo_mask = sch->schib.pmcw.pam; 523 cdev->private->pgid_todo_mask = sch->schib.pmcw.pam;
522 cdev->private->path_notoper_mask = 0; 524 cdev->private->path_notoper_mask = 0;
@@ -626,7 +628,7 @@ struct stlck_data {
626static void stlck_build_cp(struct ccw_device *cdev, void *buf1, void *buf2) 628static void stlck_build_cp(struct ccw_device *cdev, void *buf1, void *buf2)
627{ 629{
628 struct ccw_request *req = &cdev->private->req; 630 struct ccw_request *req = &cdev->private->req;
629 struct ccw1 *cp = cdev->private->iccws; 631 struct ccw1 *cp = cdev->private->dma_area->iccws;
630 632
631 cp[0].cmd_code = CCW_CMD_STLCK; 633 cp[0].cmd_code = CCW_CMD_STLCK;
632 cp[0].cda = (u32) (addr_t) buf1; 634 cp[0].cda = (u32) (addr_t) buf1;
diff --git a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c
index 7d5c7892b2c4..0bd8f2642732 100644
--- a/drivers/s390/cio/device_status.c
+++ b/drivers/s390/cio/device_status.c
@@ -79,15 +79,15 @@ ccw_device_accumulate_ecw(struct ccw_device *cdev, struct irb *irb)
79 * are condition that have to be met for the extended control 79 * are condition that have to be met for the extended control
80 * bit to have meaning. Sick. 80 * bit to have meaning. Sick.
81 */ 81 */
82 cdev->private->irb.scsw.cmd.ectl = 0; 82 cdev->private->dma_area->irb.scsw.cmd.ectl = 0;
83 if ((irb->scsw.cmd.stctl & SCSW_STCTL_ALERT_STATUS) && 83 if ((irb->scsw.cmd.stctl & SCSW_STCTL_ALERT_STATUS) &&
84 !(irb->scsw.cmd.stctl & SCSW_STCTL_INTER_STATUS)) 84 !(irb->scsw.cmd.stctl & SCSW_STCTL_INTER_STATUS))
85 cdev->private->irb.scsw.cmd.ectl = irb->scsw.cmd.ectl; 85 cdev->private->dma_area->irb.scsw.cmd.ectl = irb->scsw.cmd.ectl;
86 /* Check if extended control word is valid. */ 86 /* Check if extended control word is valid. */
87 if (!cdev->private->irb.scsw.cmd.ectl) 87 if (!cdev->private->dma_area->irb.scsw.cmd.ectl)
88 return; 88 return;
89 /* Copy concurrent sense / model dependent information. */ 89 /* Copy concurrent sense / model dependent information. */
90 memcpy (&cdev->private->irb.ecw, irb->ecw, sizeof (irb->ecw)); 90 memcpy(&cdev->private->dma_area->irb.ecw, irb->ecw, sizeof(irb->ecw));
91} 91}
92 92
93/* 93/*
@@ -118,7 +118,7 @@ ccw_device_accumulate_esw(struct ccw_device *cdev, struct irb *irb)
118 if (!ccw_device_accumulate_esw_valid(irb)) 118 if (!ccw_device_accumulate_esw_valid(irb))
119 return; 119 return;
120 120
121 cdev_irb = &cdev->private->irb; 121 cdev_irb = &cdev->private->dma_area->irb;
122 122
123 /* Copy last path used mask. */ 123 /* Copy last path used mask. */
124 cdev_irb->esw.esw1.lpum = irb->esw.esw1.lpum; 124 cdev_irb->esw.esw1.lpum = irb->esw.esw1.lpum;
@@ -210,7 +210,7 @@ ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb)
210 ccw_device_path_notoper(cdev); 210 ccw_device_path_notoper(cdev);
211 /* No irb accumulation for transport mode irbs. */ 211 /* No irb accumulation for transport mode irbs. */
212 if (scsw_is_tm(&irb->scsw)) { 212 if (scsw_is_tm(&irb->scsw)) {
213 memcpy(&cdev->private->irb, irb, sizeof(struct irb)); 213 memcpy(&cdev->private->dma_area->irb, irb, sizeof(struct irb));
214 return; 214 return;
215 } 215 }
216 /* 216 /*
@@ -219,7 +219,7 @@ ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb)
219 if (!scsw_is_solicited(&irb->scsw)) 219 if (!scsw_is_solicited(&irb->scsw))
220 return; 220 return;
221 221
222 cdev_irb = &cdev->private->irb; 222 cdev_irb = &cdev->private->dma_area->irb;
223 223
224 /* 224 /*
225 * If the clear function had been performed, all formerly pending 225 * If the clear function had been performed, all formerly pending
@@ -227,7 +227,7 @@ ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb)
227 * intermediate accumulated status to the device driver. 227 * intermediate accumulated status to the device driver.
228 */ 228 */
229 if (irb->scsw.cmd.fctl & SCSW_FCTL_CLEAR_FUNC) 229 if (irb->scsw.cmd.fctl & SCSW_FCTL_CLEAR_FUNC)
230 memset(&cdev->private->irb, 0, sizeof(struct irb)); 230 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
231 231
232 /* Copy bits which are valid only for the start function. */ 232 /* Copy bits which are valid only for the start function. */
233 if (irb->scsw.cmd.fctl & SCSW_FCTL_START_FUNC) { 233 if (irb->scsw.cmd.fctl & SCSW_FCTL_START_FUNC) {
@@ -329,9 +329,9 @@ ccw_device_do_sense(struct ccw_device *cdev, struct irb *irb)
329 /* 329 /*
330 * We have ending status but no sense information. Do a basic sense. 330 * We have ending status but no sense information. Do a basic sense.
331 */ 331 */
332 sense_ccw = &to_io_private(sch)->sense_ccw; 332 sense_ccw = &to_io_private(sch)->dma_area->sense_ccw;
333 sense_ccw->cmd_code = CCW_CMD_BASIC_SENSE; 333 sense_ccw->cmd_code = CCW_CMD_BASIC_SENSE;
334 sense_ccw->cda = (__u32) __pa(cdev->private->irb.ecw); 334 sense_ccw->cda = (__u32) __pa(cdev->private->dma_area->irb.ecw);
335 sense_ccw->count = SENSE_MAX_COUNT; 335 sense_ccw->count = SENSE_MAX_COUNT;
336 sense_ccw->flags = CCW_FLAG_SLI; 336 sense_ccw->flags = CCW_FLAG_SLI;
337 337
@@ -364,7 +364,7 @@ ccw_device_accumulate_basic_sense(struct ccw_device *cdev, struct irb *irb)
364 364
365 if (!(irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) && 365 if (!(irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) &&
366 (irb->scsw.cmd.dstat & DEV_STAT_CHN_END)) { 366 (irb->scsw.cmd.dstat & DEV_STAT_CHN_END)) {
367 cdev->private->irb.esw.esw0.erw.cons = 1; 367 cdev->private->dma_area->irb.esw.esw0.erw.cons = 1;
368 cdev->private->flags.dosense = 0; 368 cdev->private->flags.dosense = 0;
369 } 369 }
370 /* Check if path verification is required. */ 370 /* Check if path verification is required. */
@@ -386,7 +386,7 @@ ccw_device_accumulate_and_sense(struct ccw_device *cdev, struct irb *irb)
386 /* Check for basic sense. */ 386 /* Check for basic sense. */
387 if (cdev->private->flags.dosense && 387 if (cdev->private->flags.dosense &&
388 !(irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK)) { 388 !(irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK)) {
389 cdev->private->irb.esw.esw0.erw.cons = 1; 389 cdev->private->dma_area->irb.esw.esw0.erw.cons = 1;
390 cdev->private->flags.dosense = 0; 390 cdev->private->flags.dosense = 0;
391 return 0; 391 return 0;
392 } 392 }
diff --git a/drivers/s390/cio/io_sch.h b/drivers/s390/cio/io_sch.h
index 90e4e3a7841b..c03b4a19974e 100644
--- a/drivers/s390/cio/io_sch.h
+++ b/drivers/s390/cio/io_sch.h
@@ -9,15 +9,20 @@
9#include "css.h" 9#include "css.h"
10#include "orb.h" 10#include "orb.h"
11 11
12struct io_subchannel_dma_area {
13 struct ccw1 sense_ccw; /* static ccw for sense command */
14};
15
12struct io_subchannel_private { 16struct io_subchannel_private {
13 union orb orb; /* operation request block */ 17 union orb orb; /* operation request block */
14 struct ccw1 sense_ccw; /* static ccw for sense command */
15 struct ccw_device *cdev;/* pointer to the child ccw device */ 18 struct ccw_device *cdev;/* pointer to the child ccw device */
16 struct { 19 struct {
17 unsigned int suspend:1; /* allow suspend */ 20 unsigned int suspend:1; /* allow suspend */
18 unsigned int prefetch:1;/* deny prefetch */ 21 unsigned int prefetch:1;/* deny prefetch */
19 unsigned int inter:1; /* suppress intermediate interrupts */ 22 unsigned int inter:1; /* suppress intermediate interrupts */
20 } __packed options; 23 } __packed options;
24 struct io_subchannel_dma_area *dma_area;
25 dma_addr_t dma_area_dma;
21} __aligned(8); 26} __aligned(8);
22 27
23#define to_io_private(n) ((struct io_subchannel_private *) \ 28#define to_io_private(n) ((struct io_subchannel_private *) \
@@ -115,6 +120,13 @@ enum cdev_todo {
115#define FAKE_CMD_IRB 1 120#define FAKE_CMD_IRB 1
116#define FAKE_TM_IRB 2 121#define FAKE_TM_IRB 2
117 122
123struct ccw_device_dma_area {
124 struct senseid senseid; /* SenseID info */
125 struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */
126 struct irb irb; /* device status */
127 struct pgid pgid[8]; /* path group IDs per chpid*/
128};
129
118struct ccw_device_private { 130struct ccw_device_private {
119 struct ccw_device *cdev; 131 struct ccw_device *cdev;
120 struct subchannel *sch; 132 struct subchannel *sch;
@@ -156,11 +168,7 @@ struct ccw_device_private {
156 } __attribute__((packed)) flags; 168 } __attribute__((packed)) flags;
157 unsigned long intparm; /* user interruption parameter */ 169 unsigned long intparm; /* user interruption parameter */
158 struct qdio_irq *qdio_data; 170 struct qdio_irq *qdio_data;
159 struct irb irb; /* device status */
160 int async_kill_io_rc; 171 int async_kill_io_rc;
161 struct senseid senseid; /* SenseID info */
162 struct pgid pgid[8]; /* path group IDs per chpid*/
163 struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */
164 struct work_struct todo_work; 172 struct work_struct todo_work;
165 enum cdev_todo todo; 173 enum cdev_todo todo;
166 wait_queue_head_t wait_q; 174 wait_queue_head_t wait_q;
@@ -169,6 +177,8 @@ struct ccw_device_private {
169 struct list_head cmb_list; /* list of measured devices */ 177 struct list_head cmb_list; /* list of measured devices */
170 u64 cmb_start_time; /* clock value of cmb reset */ 178 u64 cmb_start_time; /* clock value of cmb reset */
171 void *cmb_wait; /* deferred cmb enable/disable */ 179 void *cmb_wait; /* deferred cmb enable/disable */
180 struct gen_pool *dma_pool;
181 struct ccw_device_dma_area *dma_area;
172 enum interruption_class int_class; 182 enum interruption_class int_class;
173}; 183};
174 184
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index 6a3076881321..f995798bb025 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -66,7 +66,6 @@ struct virtio_ccw_device {
66 bool device_lost; 66 bool device_lost;
67 unsigned int config_ready; 67 unsigned int config_ready;
68 void *airq_info; 68 void *airq_info;
69 u64 dma_mask;
70}; 69};
71 70
72struct vq_info_block_legacy { 71struct vq_info_block_legacy {
@@ -1255,16 +1254,7 @@ static int virtio_ccw_online(struct ccw_device *cdev)
1255 ret = -ENOMEM; 1254 ret = -ENOMEM;
1256 goto out_free; 1255 goto out_free;
1257 } 1256 }
1258
1259 vcdev->vdev.dev.parent = &cdev->dev; 1257 vcdev->vdev.dev.parent = &cdev->dev;
1260 cdev->dev.dma_mask = &vcdev->dma_mask;
1261 /* we are fine with common virtio infrastructure using 64 bit DMA */
1262 ret = dma_set_mask_and_coherent(&cdev->dev, DMA_BIT_MASK(64));
1263 if (ret) {
1264 dev_warn(&cdev->dev, "Failed to enable 64-bit DMA.\n");
1265 goto out_free;
1266 }
1267
1268 vcdev->config_block = kzalloc(sizeof(*vcdev->config_block), 1258 vcdev->config_block = kzalloc(sizeof(*vcdev->config_block),
1269 GFP_DMA | GFP_KERNEL); 1259 GFP_DMA | GFP_KERNEL);
1270 if (!vcdev->config_block) { 1260 if (!vcdev->config_block) {