On 10/25/2018 02:37 PM, Michael Mueller wrote: > 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@xxxxxxxxxxxxx> > Reviewed-by: Sebastian Ott <sebott@xxxxxxxxxxxxx> > Reviewed-by: Pierre Morel <pmorel@xxxxxxxxxxxxx> > Acked-by: Halil Pasic <pasic@xxxxxxxxxxxxx> Reviewed-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> > --- > arch/s390/include/asm/cio.h | 1 + > drivers/s390/cio/chsc.c | 37 +++++++++++++++++++++++++++++++++++++ > drivers/s390/cio/chsc.h | 1 + > 3 files changed, 39 insertions(+) > > diff --git a/arch/s390/include/asm/cio.h b/arch/s390/include/asm/cio.h > index 225667652069..1727180e8ca1 100644 > --- a/arch/s390/include/asm/cio.h > +++ b/arch/s390/include/asm/cio.h > @@ -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 > diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c > index a0baee25134c..4159c63a5fd2 100644 > --- a/drivers/s390/cio/chsc.c > +++ b/drivers/s390/cio/chsc.c > @@ -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); > diff --git a/drivers/s390/cio/chsc.h b/drivers/s390/cio/chsc.h > index 78aba8d94eec..e57d68e325a3 100644 > --- a/drivers/s390/cio/chsc.h > +++ b/drivers/s390/cio/chsc.h > @@ -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); >