xref: /openbmc/qemu/hw/nvme/dif.h (revision ac0b34c58d0de09ce692af0a6c9a00a4eed0f3cd)
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) */
505f7ae45SKlaus Jensen static const uint16_t t10_dif_crc_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*ac0b34c5SKlaus Jensen static inline size_t nvme_pi_tuple_size(NvmeNamespace *ns)
41*ac0b34c5SKlaus Jensen {
42*ac0b34c5SKlaus Jensen     return sizeof(NvmeDifTuple);
43*ac0b34c5SKlaus Jensen }
44*ac0b34c5SKlaus Jensen 
4505f7ae45SKlaus Jensen uint16_t nvme_check_prinfo(NvmeNamespace *ns, uint8_t prinfo, uint64_t slba,
4605f7ae45SKlaus Jensen                            uint32_t reftag);
4705f7ae45SKlaus Jensen uint16_t nvme_dif_mangle_mdata(NvmeNamespace *ns, uint8_t *mbuf, size_t mlen,
4805f7ae45SKlaus Jensen                                uint64_t slba);
4905f7ae45SKlaus Jensen void nvme_dif_pract_generate_dif(NvmeNamespace *ns, uint8_t *buf, size_t len,
5005f7ae45SKlaus Jensen                                  uint8_t *mbuf, size_t mlen, uint16_t apptag,
5105f7ae45SKlaus Jensen                                  uint32_t *reftag);
5205f7ae45SKlaus Jensen uint16_t nvme_dif_check(NvmeNamespace *ns, uint8_t *buf, size_t len,
5305f7ae45SKlaus Jensen                         uint8_t *mbuf, size_t mlen, uint8_t prinfo,
5405f7ae45SKlaus Jensen                         uint64_t slba, uint16_t apptag,
5505f7ae45SKlaus Jensen                         uint16_t appmask, uint32_t *reftag);
5605f7ae45SKlaus Jensen uint16_t nvme_dif_rw(NvmeCtrl *n, NvmeRequest *req);
5705f7ae45SKlaus Jensen 
5805f7ae45SKlaus Jensen #endif /* HW_NVME_DIF_H */
59