@@ -311,5 +311,6 @@ extern int cio_get_iplinfo(struct cio_ip
/* Function from drivers/s390/cio/chsc.c */
int chsc_sstpc(void *page, unsigned int op, u16 ctrl);
int chsc_sstpi(void *page, void *result, size_t size);
+int chsc_sgib(u32 gibo);
#endif
@@ -1188,6 +1188,56 @@ out:
EXPORT_SYMBOL_GPL(chsc_siosl);
/**
+ * chsc_sgib() - register guest information block
+ * @gibo: guest information block
+ *
+ * gibo must be allocated in low memory
+ *
+ * Returns 0 on success.
+ */
+int chsc_sgib(u32 gibo)
+{
+ struct {
+ struct chsc_header request;
+ u16 operation_code;
+ u16 : 16;
+ u32 : 4;
+ u32 fmt : 4;
+ u32 : 24;
+ u32 : 32;
+ u32 : 32;
+ u32 gibo;
+ u64 : 64;
+ u32 : 16;
+ u32 aix : 8;
+ u32 : 8;
+ u32 reserved[1007];
+ struct chsc_header response;
+ } __packed *scssc;
+ unsigned long flags;
+ int rc;
+
+ spin_lock_irqsave(&chsc_page_lock, flags);
+ memset(chsc_page, 0, PAGE_SIZE);
+ scssc = chsc_page;
+
+ scssc->request.length = 0x0fe0;
+ scssc->request.code = 0x0021;
+ scssc->operation_code = 1;
+ scssc->gibo = gibo;
+
+ rc = chsc(scssc);
+ if (rc)
+ rc = -EIO;
+ else
+ rc = chsc_error_from_response(scssc->response.code);
+
+ spin_unlock_irqrestore(&chsc_page_lock, flags);
+ return rc;
+}
+EXPORT_SYMBOL_GPL(chsc_sgib);
+
+/**
* chsc_scm_info() - store SCM information (SSI)
* @scm_area: request and response block for SSI
* @token: continuation token