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