16684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky/* 26684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * linux/drivers/s390/crypto/zcrypt_pcicc.h 36684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 45432114baf0300286a6ca1b0aea549492a379432Ralph Wuerthner * zcrypt 2.1.0 56684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 66684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Copyright (C) 2001, 2006 IBM Corporation 76684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Author(s): Robert Burroughs 86684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Eric Rossman (edrossma@us.ibm.com) 96684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 106684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com) 116684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com> 126684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 136684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * This program is free software; you can redistribute it and/or modify 146684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * it under the terms of the GNU General Public License as published by 156684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * the Free Software Foundation; either version 2, or (at your option) 166684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * any later version. 176684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 186684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * This program is distributed in the hope that it will be useful, 196684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * but WITHOUT ANY WARRANTY; without even the implied warranty of 206684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 216684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * GNU General Public License for more details. 226684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 236684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * You should have received a copy of the GNU General Public License 246684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * along with this program; if not, write to the Free Software 256684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 266684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky */ 276684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 286684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky#ifndef _ZCRYPT_PCICC_H_ 296684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky#define _ZCRYPT_PCICC_H_ 306684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 316684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky/** 326684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * The type 6 message family is associated with PCICC or PCIXCC cards. 336684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 346684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * It contains a message header followed by a CPRB, both of which 356684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * are described below. 366684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 376684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Note that all reserved fields must be zeroes. 386684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky */ 396684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskystruct type6_hdr { 406684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved1; /* 0x00 */ 416684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char type; /* 0x06 */ 426684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved2[2]; /* 0x0000 */ 436684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char right[4]; /* 0x00000000 */ 446684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved3[2]; /* 0x0000 */ 456684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved4[2]; /* 0x0000 */ 466684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char apfs[4]; /* 0x00000000 */ 476684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset1; /* 0x00000058 (offset to CPRB) */ 486684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset2; /* 0x00000000 */ 496684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset3; /* 0x00000000 */ 506684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset4; /* 0x00000000 */ 516684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char agent_id[16]; /* PCICC: */ 526684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* 0x0100 */ 536684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* 0x4343412d4150504c202020 */ 546684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* 0x010101 */ 556684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* PCIXCC: */ 566684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* 0x4341000000000000 */ 576684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* 0x0000000000000000 */ 586684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char rqid[2]; /* rqid. internal to 603 */ 596684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved5[2]; /* 0x0000 */ 606684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char function_code[2]; /* for PKD, 0x5044 (ascii 'PD') */ 616684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved6[2]; /* 0x0000 */ 626684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int ToCardLen1; /* (request CPRB len + 3) & -4 */ 636684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int ToCardLen2; /* db len 0x00000000 for PKD */ 646684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int ToCardLen3; /* 0x00000000 */ 656684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int ToCardLen4; /* 0x00000000 */ 666684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int FromCardLen1; /* response buffer length */ 676684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int FromCardLen2; /* db len 0x00000000 for PKD */ 686684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int FromCardLen3; /* 0x00000000 */ 696684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int FromCardLen4; /* 0x00000000 */ 706684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky} __attribute__((packed)); 716684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 726684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky/** 736684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * CPRB 746684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Note that all shorts, ints and longs are little-endian. 756684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * All pointer fields are 32-bits long, and mean nothing 766684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 776684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * A request CPRB is followed by a request_parameter_block. 786684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 796684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * The request (or reply) parameter block is organized thus: 806684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * function code 816684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * VUD block 826684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * key block 836684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky */ 846684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskystruct CPRB { 856684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short cprb_len; /* CPRB length */ 866684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char cprb_ver_id; /* CPRB version id. */ 876684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char pad_000; /* Alignment pad byte. */ 886684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char srpi_rtcode[4]; /* SRPI return code LELONG */ 896684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char srpi_verb; /* SRPI verb type */ 906684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char flags; /* flags */ 916684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char func_id[2]; /* function id */ 926684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char checkpoint_flag; /* */ 936684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char resv2; /* reserved */ 946684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short req_parml; /* request parameter buffer */ 956684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* length 16-bit little endian */ 966684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char req_parmp[4]; /* request parameter buffer * 976684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * pointer (means nothing: the * 986684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * parameter buffer follows * 996684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * the CPRB). */ 1006684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char req_datal[4]; /* request data buffer */ 1016684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* length ULELONG */ 1026684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char req_datap[4]; /* request data buffer */ 1036684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* pointer */ 1046684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short rpl_parml; /* reply parameter buffer */ 1056684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* length 16-bit little endian */ 1066684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char pad_001[2]; /* Alignment pad bytes. ULESHORT */ 1076684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char rpl_parmp[4]; /* reply parameter buffer * 1086684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * pointer (means nothing: the * 1096684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * parameter buffer follows * 1106684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * the CPRB). */ 1116684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char rpl_datal[4]; /* reply data buffer len ULELONG */ 1126684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char rpl_datap[4]; /* reply data buffer */ 1136684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky /* pointer */ 1146684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short ccp_rscode; /* server reason code ULESHORT */ 1156684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short ccp_rtcode; /* server return code ULESHORT */ 1166684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char repd_parml[2]; /* replied parameter len ULESHORT*/ 1176684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char mac_data_len[2]; /* Mac Data Length ULESHORT */ 1186684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char repd_datal[4]; /* replied data length ULELONG */ 1196684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char req_pc[2]; /* PC identifier */ 1206684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char res_origin[8]; /* resource origin */ 1216684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char mac_value[8]; /* Mac Value */ 1226684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char logon_id[8]; /* Logon Identifier */ 1236684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char usage_domain[2]; /* cdx */ 1246684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char resv3[18]; /* reserved for requestor */ 1256684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short svr_namel; /* server name length ULESHORT */ 1266684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char svr_name[8]; /* server name */ 1276684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky} __attribute__((packed)); 1286684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 1296684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky/** 1306684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * The type 86 message family is associated with PCICC and PCIXCC cards. 1316684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 1326684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * It contains a message header followed by a CPRB. The CPRB is 1336684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * the same as the request CPRB, which is described above. 1346684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 1356684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * If format is 1, an error condition exists and no data beyond 1366684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * the 8-byte message header is of interest. 1376684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 1386684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * The non-error message is shown below. 1396684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * 1406684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky * Note that all reserved fields must be zeroes. 1416684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky */ 1426684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskystruct type86_hdr { 1436684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved1; /* 0x00 */ 1446684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char type; /* 0x86 */ 1456684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char format; /* 0x01 (error) or 0x02 (ok) */ 1466684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved2; /* 0x00 */ 1476684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reply_code; /* reply code (see above) */ 1486684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved3[3]; /* 0x000000 */ 1496684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky} __attribute__((packed)); 1506684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 1516684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky#define TYPE86_RSP_CODE 0x86 1526684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky#define TYPE86_FMT2 0x02 1536684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 1546684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskystruct type86_fmt2_ext { 1556684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char reserved[4]; /* 0x00000000 */ 1566684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char apfs[4]; /* final status */ 1576684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int count1; /* length of CPRB + parameters */ 1586684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset1; /* offset to CPRB */ 1596684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int count2; /* 0x00000000 */ 1606684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset2; /* db offset 0x00000000 for PKD */ 1616684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int count3; /* 0x00000000 */ 1626684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset3; /* 0x00000000 */ 1636684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int count4; /* 0x00000000 */ 1646684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned int offset4; /* 0x00000000 */ 1656684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky} __attribute__((packed)); 1666684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 1676684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskystruct function_and_rules_block { 1686684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char function_code[2]; 1696684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned short ulen; 1706684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky unsigned char only_rule[8]; 1716684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky} __attribute__((packed)); 1726684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 1736684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskyint zcrypt_pcicc_init(void); 1746684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefskyvoid zcrypt_pcicc_exit(void); 1756684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky 1766684af1a07a1f88f3970bc90e5aed173d39168dbMartin Schwidefsky#endif /* _ZCRYPT_PCICC_H_ */ 177