]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
s390/cio: add function chsc_sgib()
authorMichael Mueller <mimu@linux.ibm.com>
Thu, 31 Jan 2019 08:52:39 +0000 (09:52 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 5 Feb 2019 13:29:23 +0000 (14:29 +0100)
This patch implements the Set Guest Information Block operation
to request association or disassociation of a Guest Information
Block (GIB) with the Adapter Interruption Facility. The operation
is required to receive GIB alert interrupts for guest adapters
in conjunction with AIV and GISA.

Signed-off-by: Michael Mueller <mimu@linux.ibm.com>
Reviewed-by: Sebastian Ott <sebott@linux.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Halil Pasic <pasic@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20190131085247.13826-9-mimu@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/cio.h
drivers/s390/cio/chsc.c
drivers/s390/cio/chsc.h

index 22566765206925ac7d427896031fe0775bddec6d..1727180e8ca17124c97e039e9f3368d00680a66b 100644 (file)
@@ -331,5 +331,6 @@ extern void css_schedule_reprobe(void);
 /* Function from drivers/s390/cio/chsc.c */
 int chsc_sstpc(void *page, unsigned int op, u16 ctrl, u64 *clock_delta);
 int chsc_sstpi(void *page, void *result, size_t size);
+int chsc_sgib(u32 origin);
 
 #endif
index a0baee25134c0cd0b6a6e35df694ae763a4b0a21..4159c63a5fd2bbba9b9c2949fde8c56ba9030a89 100644 (file)
@@ -1382,3 +1382,40 @@ int chsc_pnso_brinfo(struct subchannel_id schid,
        return chsc_error_from_response(brinfo_area->response.code);
 }
 EXPORT_SYMBOL_GPL(chsc_pnso_brinfo);
+
+int chsc_sgib(u32 origin)
+{
+       struct {
+               struct chsc_header request;
+               u16 op;
+               u8  reserved01[2];
+               u8  reserved02:4;
+               u8  fmt:4;
+               u8  reserved03[7];
+               /* operation data area begin */
+               u8  reserved04[4];
+               u32 gib_origin;
+               u8  reserved05[10];
+               u8  aix;
+               u8  reserved06[4029];
+               struct chsc_header response;
+               u8  reserved07[4];
+       } *sgib_area;
+       int ret;
+
+       spin_lock_irq(&chsc_page_lock);
+       memset(chsc_page, 0, PAGE_SIZE);
+       sgib_area = chsc_page;
+       sgib_area->request.length = 0x0fe0;
+       sgib_area->request.code = 0x0021;
+       sgib_area->op = 0x1;
+       sgib_area->gib_origin = origin;
+
+       ret = chsc(sgib_area);
+       if (ret == 0)
+               ret = chsc_error_from_response(sgib_area->response.code);
+       spin_unlock_irq(&chsc_page_lock);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(chsc_sgib);
index 78aba8d94eec33eae2c0594dde4a79bf12c8ba82..e57d68e325a372424fd40a729d99265a0530a522 100644 (file)
@@ -164,6 +164,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp);
 int chsc_ssqd(struct subchannel_id schid, struct chsc_ssqd_area *ssqd);
 int chsc_sadc(struct subchannel_id schid, struct chsc_scssc_area *scssc,
              u64 summary_indicator_addr, u64 subchannel_indicator_addr);
+int chsc_sgib(u32 origin);
 int chsc_error_from_response(int response);
 
 int chsc_siosl(struct subchannel_id schid);