s390/chsc: implement store SCM information

chsc_scm_info will be used to detect all available increments of
storage class memory.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Sebastian Ott 2012-08-28 16:45:42 +02:00 committed by Martin Schwidefsky
parent d2fc439b99
commit 184b08afb5
2 changed files with 70 additions and 0 deletions

View File

@ -52,6 +52,11 @@ int chsc_error_from_response(int response)
return -EINVAL;
case 0x0004:
return -EOPNOTSUPP;
case 0x000b:
return -EBUSY;
case 0x0100:
case 0x0102:
return -ENOMEM;
default:
return -EIO;
}
@ -1047,3 +1052,33 @@ int chsc_siosl(struct subchannel_id schid)
return rc;
}
EXPORT_SYMBOL_GPL(chsc_siosl);
/**
* chsc_scm_info() - store SCM information (SSI)
* @scm_area: request and response block for SSI
* @token: continuation token
*
* Returns 0 on success.
*/
int chsc_scm_info(struct chsc_scm_info *scm_area, u64 token)
{
int ccode, ret;
memset(scm_area, 0, sizeof(*scm_area));
scm_area->request.length = 0x0020;
scm_area->request.code = 0x004C;
scm_area->reqtok = token;
ccode = chsc(scm_area);
if (ccode > 0) {
ret = (ccode == 3) ? -ENODEV : -EBUSY;
goto out;
}
ret = chsc_error_from_response(scm_area->response.code);
if (ret != 0)
CIO_MSG_EVENT(2, "chsc: scm info failed (rc=%04x)\n",
scm_area->response.code);
out:
return ret;
}
EXPORT_SYMBOL_GPL(chsc_scm_info);

View File

@ -119,4 +119,39 @@ int chsc_error_from_response(int response);
int chsc_siosl(struct subchannel_id schid);
/* Functions and definitions to query storage-class memory. */
struct sale {
u64 sa;
u32 p:4;
u32 op_state:4;
u32 data_state:4;
u32 rank:4;
u32 r:1;
u32:7;
u32 rid:8;
u32:32;
} __packed;
struct chsc_scm_info {
struct chsc_header request;
u32:32;
u64 reqtok;
u32 reserved1[4];
struct chsc_header response;
u64:56;
u8 rq;
u32 mbc;
u64 msa;
u16 is;
u16 mmc;
u32 mci;
u64 nr_scm_ini;
u64 nr_scm_unini;
u32 reserved2[10];
u64 restok;
struct sale scmal[248];
} __packed;
int chsc_scm_info(struct chsc_scm_info *scm_area, u64 token);
#endif