vfio/ccw: simplify the cp_get_orb interface
authorEric Farman <farman@linux.ibm.com>
Thu, 10 Nov 2022 02:30:23 +0000 (03:30 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 9 Jan 2023 13:34:07 +0000 (14:34 +0100)
There's no need to send in both the address of the subchannel
struct, and an element within it, to populate the ORB.

Pass the whole pointer and let cp_get_orb() take the pieces
that are needed.

Suggested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/cio/vfio_ccw_cp.c
drivers/s390/cio/vfio_ccw_cp.h
drivers/s390/cio/vfio_ccw_fsm.c

index 9e6df1f2fbeefeb520560b611a277b766e422ba9..a0060ef1119edae54869dfee20433dc82afd30ef 100644 (file)
@@ -816,14 +816,13 @@ out_err:
 /**
  * cp_get_orb() - get the orb of the channel program
  * @cp: channel_program on which to perform the operation
- * @intparm: new intparm for the returned orb
- * @lpm: candidate value of the logical-path mask for the returned orb
+ * @sch: subchannel the operation will be performed against
  *
  * This function returns the address of the updated orb of the channel
  * program. Channel I/O device drivers could use this orb to issue a
  * ssch.
  */
-union orb *cp_get_orb(struct channel_program *cp, u32 intparm, u8 lpm)
+union orb *cp_get_orb(struct channel_program *cp, struct subchannel *sch)
 {
        union orb *orb;
        struct ccwchain *chain;
@@ -835,12 +834,12 @@ union orb *cp_get_orb(struct channel_program *cp, u32 intparm, u8 lpm)
 
        orb = &cp->orb;
 
-       orb->cmd.intparm = intparm;
+       orb->cmd.intparm = (u32)virt_to_phys(sch);
        orb->cmd.fmt = 1;
        orb->cmd.key = PAGE_DEFAULT_KEY >> 4;
 
        if (orb->cmd.lpm == 0)
-               orb->cmd.lpm = lpm;
+               orb->cmd.lpm = sch->lpm;
 
        chain = list_first_entry(&cp->ccwchain_list, struct ccwchain, next);
        cpa = chain->ch_ccw;
index 16138a654fdd376d979738d42868f57799627e79..fc31eb699807246d99c00e4afdbc5bad996ce367 100644 (file)
@@ -43,7 +43,7 @@ struct channel_program {
 int cp_init(struct channel_program *cp, union orb *orb);
 void cp_free(struct channel_program *cp);
 int cp_prefetch(struct channel_program *cp);
-union orb *cp_get_orb(struct channel_program *cp, u32 intparm, u8 lpm);
+union orb *cp_get_orb(struct channel_program *cp, struct subchannel *sch);
 void cp_update_scsw(struct channel_program *cp, union scsw *scsw);
 bool cp_iova_pinned(struct channel_program *cp, u64 iova, u64 length);
 
index 2784a4e4d2bef3c9383ee10eb66f8ded33cb00f9..757b73141246d1891b21bd55a9d9ebd6c6995dc1 100644 (file)
@@ -27,7 +27,7 @@ static int fsm_io_helper(struct vfio_ccw_private *private)
 
        spin_lock_irqsave(sch->lock, flags);
 
-       orb = cp_get_orb(&private->cp, (u32)virt_to_phys(sch), sch->lpm);
+       orb = cp_get_orb(&private->cp, sch);
        if (!orb) {
                ret = -EIO;
                goto out;