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