qemu/hw/nvme/dif.h
<<
>>
Prefs
   1#ifndef HW_NVME_DIF_H
   2#define HW_NVME_DIF_H
   3
   4/* from Linux kernel (crypto/crct10dif_common.c) */
   5static const uint16_t crc16_t10dif_table[256] = {
   6    0x0000, 0x8BB7, 0x9CD9, 0x176E, 0xB205, 0x39B2, 0x2EDC, 0xA56B,
   7    0xEFBD, 0x640A, 0x7364, 0xF8D3, 0x5DB8, 0xD60F, 0xC161, 0x4AD6,
   8    0x54CD, 0xDF7A, 0xC814, 0x43A3, 0xE6C8, 0x6D7F, 0x7A11, 0xF1A6,
   9    0xBB70, 0x30C7, 0x27A9, 0xAC1E, 0x0975, 0x82C2, 0x95AC, 0x1E1B,
  10    0xA99A, 0x222D, 0x3543, 0xBEF4, 0x1B9F, 0x9028, 0x8746, 0x0CF1,
  11    0x4627, 0xCD90, 0xDAFE, 0x5149, 0xF422, 0x7F95, 0x68FB, 0xE34C,
  12    0xFD57, 0x76E0, 0x618E, 0xEA39, 0x4F52, 0xC4E5, 0xD38B, 0x583C,
  13    0x12EA, 0x995D, 0x8E33, 0x0584, 0xA0EF, 0x2B58, 0x3C36, 0xB781,
  14    0xD883, 0x5334, 0x445A, 0xCFED, 0x6A86, 0xE131, 0xF65F, 0x7DE8,
  15    0x373E, 0xBC89, 0xABE7, 0x2050, 0x853B, 0x0E8C, 0x19E2, 0x9255,
  16    0x8C4E, 0x07F9, 0x1097, 0x9B20, 0x3E4B, 0xB5FC, 0xA292, 0x2925,
  17    0x63F3, 0xE844, 0xFF2A, 0x749D, 0xD1F6, 0x5A41, 0x4D2F, 0xC698,
  18    0x7119, 0xFAAE, 0xEDC0, 0x6677, 0xC31C, 0x48AB, 0x5FC5, 0xD472,
  19    0x9EA4, 0x1513, 0x027D, 0x89CA, 0x2CA1, 0xA716, 0xB078, 0x3BCF,
  20    0x25D4, 0xAE63, 0xB90D, 0x32BA, 0x97D1, 0x1C66, 0x0B08, 0x80BF,
  21    0xCA69, 0x41DE, 0x56B0, 0xDD07, 0x786C, 0xF3DB, 0xE4B5, 0x6F02,
  22    0x3AB1, 0xB106, 0xA668, 0x2DDF, 0x88B4, 0x0303, 0x146D, 0x9FDA,
  23    0xD50C, 0x5EBB, 0x49D5, 0xC262, 0x6709, 0xECBE, 0xFBD0, 0x7067,
  24    0x6E7C, 0xE5CB, 0xF2A5, 0x7912, 0xDC79, 0x57CE, 0x40A0, 0xCB17,
  25    0x81C1, 0x0A76, 0x1D18, 0x96AF, 0x33C4, 0xB873, 0xAF1D, 0x24AA,
  26    0x932B, 0x189C, 0x0FF2, 0x8445, 0x212E, 0xAA99, 0xBDF7, 0x3640,
  27    0x7C96, 0xF721, 0xE04F, 0x6BF8, 0xCE93, 0x4524, 0x524A, 0xD9FD,
  28    0xC7E6, 0x4C51, 0x5B3F, 0xD088, 0x75E3, 0xFE54, 0xE93A, 0x628D,
  29    0x285B, 0xA3EC, 0xB482, 0x3F35, 0x9A5E, 0x11E9, 0x0687, 0x8D30,
  30    0xE232, 0x6985, 0x7EEB, 0xF55C, 0x5037, 0xDB80, 0xCCEE, 0x4759,
  31    0x0D8F, 0x8638, 0x9156, 0x1AE1, 0xBF8A, 0x343D, 0x2353, 0xA8E4,
  32    0xB6FF, 0x3D48, 0x2A26, 0xA191, 0x04FA, 0x8F4D, 0x9823, 0x1394,
  33    0x5942, 0xD2F5, 0xC59B, 0x4E2C, 0xEB47, 0x60F0, 0x779E, 0xFC29,
  34    0x4BA8, 0xC01F, 0xD771, 0x5CC6, 0xF9AD, 0x721A, 0x6574, 0xEEC3,
  35    0xA415, 0x2FA2, 0x38CC, 0xB37B, 0x1610, 0x9DA7, 0x8AC9, 0x017E,
  36    0x1F65, 0x94D2, 0x83BC, 0x080B, 0xAD60, 0x26D7, 0x31B9, 0xBA0E,
  37    0xF0D8, 0x7B6F, 0x6C01, 0xE7B6, 0x42DD, 0xC96A, 0xDE04, 0x55B3
  38};
  39
  40#define CRC64_NVME_POLY 0x9A6C9329AC4BC9B5ULL
  41
  42static const uint64_t crc64_nvme_table[] = {
  43    0x0000000000000000ULL, 0x7F6EF0C830358979ULL,
  44    0xFEDDE190606B12F2ULL, 0x81B31158505E9B8BULL,
  45    0xC962E5739841B68FULL, 0xB60C15BBA8743FF6ULL,
  46    0x37BF04E3F82AA47DULL, 0x48D1F42BC81F2D04ULL,
  47    0xA61CECB46814FE75ULL, 0xD9721C7C5821770CULL,
  48    0x58C10D24087FEC87ULL, 0x27AFFDEC384A65FEULL,
  49    0x6F7E09C7F05548FAULL, 0x1010F90FC060C183ULL,
  50    0x91A3E857903E5A08ULL, 0xEECD189FA00BD371ULL,
  51    0x78E0FF3B88BE6F81ULL, 0x078E0FF3B88BE6F8ULL,
  52    0x863D1EABE8D57D73ULL, 0xF953EE63D8E0F40AULL,
  53    0xB1821A4810FFD90EULL, 0xCEECEA8020CA5077ULL,
  54    0x4F5FFBD87094CBFCULL, 0x30310B1040A14285ULL,
  55    0xDEFC138FE0AA91F4ULL, 0xA192E347D09F188DULL,
  56    0x2021F21F80C18306ULL, 0x5F4F02D7B0F40A7FULL,
  57    0x179EF6FC78EB277BULL, 0x68F0063448DEAE02ULL,
  58    0xE943176C18803589ULL, 0x962DE7A428B5BCF0ULL,
  59    0xF1C1FE77117CDF02ULL, 0x8EAF0EBF2149567BULL,
  60    0x0F1C1FE77117CDF0ULL, 0x7072EF2F41224489ULL,
  61    0x38A31B04893D698DULL, 0x47CDEBCCB908E0F4ULL,
  62    0xC67EFA94E9567B7FULL, 0xB9100A5CD963F206ULL,
  63    0x57DD12C379682177ULL, 0x28B3E20B495DA80EULL,
  64    0xA900F35319033385ULL, 0xD66E039B2936BAFCULL,
  65    0x9EBFF7B0E12997F8ULL, 0xE1D10778D11C1E81ULL,
  66    0x606216208142850AULL, 0x1F0CE6E8B1770C73ULL,
  67    0x8921014C99C2B083ULL, 0xF64FF184A9F739FAULL,
  68    0x77FCE0DCF9A9A271ULL, 0x08921014C99C2B08ULL,
  69    0x4043E43F0183060CULL, 0x3F2D14F731B68F75ULL,
  70    0xBE9E05AF61E814FEULL, 0xC1F0F56751DD9D87ULL,
  71    0x2F3DEDF8F1D64EF6ULL, 0x50531D30C1E3C78FULL,
  72    0xD1E00C6891BD5C04ULL, 0xAE8EFCA0A188D57DULL,
  73    0xE65F088B6997F879ULL, 0x9931F84359A27100ULL,
  74    0x1882E91B09FCEA8BULL, 0x67EC19D339C963F2ULL,
  75    0xD75ADABD7A6E2D6FULL, 0xA8342A754A5BA416ULL,
  76    0x29873B2D1A053F9DULL, 0x56E9CBE52A30B6E4ULL,
  77    0x1E383FCEE22F9BE0ULL, 0x6156CF06D21A1299ULL,
  78    0xE0E5DE5E82448912ULL, 0x9F8B2E96B271006BULL,
  79    0x71463609127AD31AULL, 0x0E28C6C1224F5A63ULL,
  80    0x8F9BD7997211C1E8ULL, 0xF0F5275142244891ULL,
  81    0xB824D37A8A3B6595ULL, 0xC74A23B2BA0EECECULL,
  82    0x46F932EAEA507767ULL, 0x3997C222DA65FE1EULL,
  83    0xAFBA2586F2D042EEULL, 0xD0D4D54EC2E5CB97ULL,
  84    0x5167C41692BB501CULL, 0x2E0934DEA28ED965ULL,
  85    0x66D8C0F56A91F461ULL, 0x19B6303D5AA47D18ULL,
  86    0x980521650AFAE693ULL, 0xE76BD1AD3ACF6FEAULL,
  87    0x09A6C9329AC4BC9BULL, 0x76C839FAAAF135E2ULL,
  88    0xF77B28A2FAAFAE69ULL, 0x8815D86ACA9A2710ULL,
  89    0xC0C42C4102850A14ULL, 0xBFAADC8932B0836DULL,
  90    0x3E19CDD162EE18E6ULL, 0x41773D1952DB919FULL,
  91    0x269B24CA6B12F26DULL, 0x59F5D4025B277B14ULL,
  92    0xD846C55A0B79E09FULL, 0xA72835923B4C69E6ULL,
  93    0xEFF9C1B9F35344E2ULL, 0x90973171C366CD9BULL,
  94    0x1124202993385610ULL, 0x6E4AD0E1A30DDF69ULL,
  95    0x8087C87E03060C18ULL, 0xFFE938B633338561ULL,
  96    0x7E5A29EE636D1EEAULL, 0x0134D92653589793ULL,
  97    0x49E52D0D9B47BA97ULL, 0x368BDDC5AB7233EEULL,
  98    0xB738CC9DFB2CA865ULL, 0xC8563C55CB19211CULL,
  99    0x5E7BDBF1E3AC9DECULL, 0x21152B39D3991495ULL,
 100    0xA0A63A6183C78F1EULL, 0xDFC8CAA9B3F20667ULL,
 101    0x97193E827BED2B63ULL, 0xE877CE4A4BD8A21AULL,
 102    0x69C4DF121B863991ULL, 0x16AA2FDA2BB3B0E8ULL,
 103    0xF86737458BB86399ULL, 0x8709C78DBB8DEAE0ULL,
 104    0x06BAD6D5EBD3716BULL, 0x79D4261DDBE6F812ULL,
 105    0x3105D23613F9D516ULL, 0x4E6B22FE23CC5C6FULL,
 106    0xCFD833A67392C7E4ULL, 0xB0B6C36E43A74E9DULL,
 107    0x9A6C9329AC4BC9B5ULL, 0xE50263E19C7E40CCULL,
 108    0x64B172B9CC20DB47ULL, 0x1BDF8271FC15523EULL,
 109    0x530E765A340A7F3AULL, 0x2C608692043FF643ULL,
 110    0xADD397CA54616DC8ULL, 0xD2BD67026454E4B1ULL,
 111    0x3C707F9DC45F37C0ULL, 0x431E8F55F46ABEB9ULL,
 112    0xC2AD9E0DA4342532ULL, 0xBDC36EC59401AC4BULL,
 113    0xF5129AEE5C1E814FULL, 0x8A7C6A266C2B0836ULL,
 114    0x0BCF7B7E3C7593BDULL, 0x74A18BB60C401AC4ULL,
 115    0xE28C6C1224F5A634ULL, 0x9DE29CDA14C02F4DULL,
 116    0x1C518D82449EB4C6ULL, 0x633F7D4A74AB3DBFULL,
 117    0x2BEE8961BCB410BBULL, 0x548079A98C8199C2ULL,
 118    0xD53368F1DCDF0249ULL, 0xAA5D9839ECEA8B30ULL,
 119    0x449080A64CE15841ULL, 0x3BFE706E7CD4D138ULL,
 120    0xBA4D61362C8A4AB3ULL, 0xC52391FE1CBFC3CAULL,
 121    0x8DF265D5D4A0EECEULL, 0xF29C951DE49567B7ULL,
 122    0x732F8445B4CBFC3CULL, 0x0C41748D84FE7545ULL,
 123    0x6BAD6D5EBD3716B7ULL, 0x14C39D968D029FCEULL,
 124    0x95708CCEDD5C0445ULL, 0xEA1E7C06ED698D3CULL,
 125    0xA2CF882D2576A038ULL, 0xDDA178E515432941ULL,
 126    0x5C1269BD451DB2CAULL, 0x237C997575283BB3ULL,
 127    0xCDB181EAD523E8C2ULL, 0xB2DF7122E51661BBULL,
 128    0x336C607AB548FA30ULL, 0x4C0290B2857D7349ULL,
 129    0x04D364994D625E4DULL, 0x7BBD94517D57D734ULL,
 130    0xFA0E85092D094CBFULL, 0x856075C11D3CC5C6ULL,
 131    0x134D926535897936ULL, 0x6C2362AD05BCF04FULL,
 132    0xED9073F555E26BC4ULL, 0x92FE833D65D7E2BDULL,
 133    0xDA2F7716ADC8CFB9ULL, 0xA54187DE9DFD46C0ULL,
 134    0x24F29686CDA3DD4BULL, 0x5B9C664EFD965432ULL,
 135    0xB5517ED15D9D8743ULL, 0xCA3F8E196DA80E3AULL,
 136    0x4B8C9F413DF695B1ULL, 0x34E26F890DC31CC8ULL,
 137    0x7C339BA2C5DC31CCULL, 0x035D6B6AF5E9B8B5ULL,
 138    0x82EE7A32A5B7233EULL, 0xFD808AFA9582AA47ULL,
 139    0x4D364994D625E4DAULL, 0x3258B95CE6106DA3ULL,
 140    0xB3EBA804B64EF628ULL, 0xCC8558CC867B7F51ULL,
 141    0x8454ACE74E645255ULL, 0xFB3A5C2F7E51DB2CULL,
 142    0x7A894D772E0F40A7ULL, 0x05E7BDBF1E3AC9DEULL,
 143    0xEB2AA520BE311AAFULL, 0x944455E88E0493D6ULL,
 144    0x15F744B0DE5A085DULL, 0x6A99B478EE6F8124ULL,
 145    0x224840532670AC20ULL, 0x5D26B09B16452559ULL,
 146    0xDC95A1C3461BBED2ULL, 0xA3FB510B762E37ABULL,
 147    0x35D6B6AF5E9B8B5BULL, 0x4AB846676EAE0222ULL,
 148    0xCB0B573F3EF099A9ULL, 0xB465A7F70EC510D0ULL,
 149    0xFCB453DCC6DA3DD4ULL, 0x83DAA314F6EFB4ADULL,
 150    0x0269B24CA6B12F26ULL, 0x7D0742849684A65FULL,
 151    0x93CA5A1B368F752EULL, 0xECA4AAD306BAFC57ULL,
 152    0x6D17BB8B56E467DCULL, 0x12794B4366D1EEA5ULL,
 153    0x5AA8BF68AECEC3A1ULL, 0x25C64FA09EFB4AD8ULL,
 154    0xA4755EF8CEA5D153ULL, 0xDB1BAE30FE90582AULL,
 155    0xBCF7B7E3C7593BD8ULL, 0xC399472BF76CB2A1ULL,
 156    0x422A5673A732292AULL, 0x3D44A6BB9707A053ULL,
 157    0x759552905F188D57ULL, 0x0AFBA2586F2D042EULL,
 158    0x8B48B3003F739FA5ULL, 0xF42643C80F4616DCULL,
 159    0x1AEB5B57AF4DC5ADULL, 0x6585AB9F9F784CD4ULL,
 160    0xE436BAC7CF26D75FULL, 0x9B584A0FFF135E26ULL,
 161    0xD389BE24370C7322ULL, 0xACE74EEC0739FA5BULL,
 162    0x2D545FB4576761D0ULL, 0x523AAF7C6752E8A9ULL,
 163    0xC41748D84FE75459ULL, 0xBB79B8107FD2DD20ULL,
 164    0x3ACAA9482F8C46ABULL, 0x45A459801FB9CFD2ULL,
 165    0x0D75ADABD7A6E2D6ULL, 0x721B5D63E7936BAFULL,
 166    0xF3A84C3BB7CDF024ULL, 0x8CC6BCF387F8795DULL,
 167    0x620BA46C27F3AA2CULL, 0x1D6554A417C62355ULL,
 168    0x9CD645FC4798B8DEULL, 0xE3B8B53477AD31A7ULL,
 169    0xAB69411FBFB21CA3ULL, 0xD407B1D78F8795DAULL,
 170    0x55B4A08FDFD90E51ULL, 0x2ADA5047EFEC8728ULL,
 171};
 172
 173static inline size_t nvme_pi_tuple_size(NvmeNamespace *ns)
 174{
 175    return ns->pif ? 16 : 8;
 176}
 177
 178uint16_t nvme_check_prinfo(NvmeNamespace *ns, uint8_t prinfo, uint64_t slba,
 179                           uint64_t reftag);
 180uint16_t nvme_dif_mangle_mdata(NvmeNamespace *ns, uint8_t *mbuf, size_t mlen,
 181                               uint64_t slba);
 182void nvme_dif_pract_generate_dif(NvmeNamespace *ns, uint8_t *buf, size_t len,
 183                                 uint8_t *mbuf, size_t mlen, uint16_t apptag,
 184                                 uint64_t *reftag);
 185uint16_t nvme_dif_check(NvmeNamespace *ns, uint8_t *buf, size_t len,
 186                        uint8_t *mbuf, size_t mlen, uint8_t prinfo,
 187                        uint64_t slba, uint16_t apptag,
 188                        uint16_t appmask, uint64_t *reftag);
 189uint16_t nvme_dif_rw(NvmeCtrl *n, NvmeRequest *req);
 190
 191#endif /* HW_NVME_DIF_H */
 192