Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3dec1922 authored by Michael Mueller's avatar Michael Mueller Committed by Christian Borntraeger
Browse files

s390/cio: add function chsc_sgib()



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: default avatarMichael Mueller <mimu@linux.ibm.com>
Reviewed-by: default avatarSebastian Ott <sebott@linux.ibm.com>
Reviewed-by: default avatarPierre Morel <pmorel@linux.ibm.com>
Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Acked-by: default avatarHalil Pasic <pasic@linux.ibm.com>
Acked-by: default avatarJanosch Frank <frankja@linux.ibm.com>
Acked-by: default avatarCornelia Huck <cohuck@redhat.com>
Message-Id: <20190131085247.13826-9-mimu@linux.ibm.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent 982cff42
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+37 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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);