1*8119dad8SRobert Mustacchi /* 2*8119dad8SRobert Mustacchi * This file and its contents are supplied under the terms of the 3*8119dad8SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4*8119dad8SRobert Mustacchi * You may only use this file in accordance with the terms of version 5*8119dad8SRobert Mustacchi * 1.0 of the CDDL. 6*8119dad8SRobert Mustacchi * 7*8119dad8SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8*8119dad8SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9*8119dad8SRobert Mustacchi * http://www.illumos.org/license/CDDL. 10*8119dad8SRobert Mustacchi */ 11*8119dad8SRobert Mustacchi 12*8119dad8SRobert Mustacchi /* 13*8119dad8SRobert Mustacchi * Copyright 2024 Oxide Computer Company 14*8119dad8SRobert Mustacchi */ 15*8119dad8SRobert Mustacchi 16*8119dad8SRobert Mustacchi #ifndef _LIBJEDEC_HEX2SPD_H 17*8119dad8SRobert Mustacchi #define _LIBJEDEC_HEX2SPD_H 18*8119dad8SRobert Mustacchi 19*8119dad8SRobert Mustacchi /* 20*8119dad8SRobert Mustacchi * Common definitions for the hex2spd test. 21*8119dad8SRobert Mustacchi */ 22*8119dad8SRobert Mustacchi 23*8119dad8SRobert Mustacchi #ifdef __cplusplus 24*8119dad8SRobert Mustacchi extern "C" { 25*8119dad8SRobert Mustacchi #endif 26*8119dad8SRobert Mustacchi 27*8119dad8SRobert Mustacchi #include <libnvpair.h> 28*8119dad8SRobert Mustacchi #include <stdint.h> 29*8119dad8SRobert Mustacchi #include <stdbool.h> 30*8119dad8SRobert Mustacchi 31*8119dad8SRobert Mustacchi /* 32*8119dad8SRobert Mustacchi * This is an arbitrary value to give us an upper bound on the number of array 33*8119dad8SRobert Mustacchi * entries that we'll support. Currently the largest array we have is 15 entries 34*8119dad8SRobert Mustacchi * which is the DDR3 LRDIMM personality bytes. 35*8119dad8SRobert Mustacchi */ 36*8119dad8SRobert Mustacchi #define HEX2SPD_ARR_MAX 16 37*8119dad8SRobert Mustacchi 38*8119dad8SRobert Mustacchi /* 39*8119dad8SRobert Mustacchi * Represents an individual check against a particular nvlist_t payload. The 40*8119dad8SRobert Mustacchi * data type is the nvlist_t type of the key. The corresponding value will be 41*8119dad8SRobert Mustacchi * used. 42*8119dad8SRobert Mustacchi */ 43*8119dad8SRobert Mustacchi typedef struct { 44*8119dad8SRobert Mustacchi const char *hs_key; 45*8119dad8SRobert Mustacchi data_type_t hs_type; 46*8119dad8SRobert Mustacchi union { 47*8119dad8SRobert Mustacchi uint32_t hs_u32; 48*8119dad8SRobert Mustacchi uint64_t hs_u64; 49*8119dad8SRobert Mustacchi const char *hs_str; 50*8119dad8SRobert Mustacchi bool hs_bool; 51*8119dad8SRobert Mustacchi struct { 52*8119dad8SRobert Mustacchi uint32_t ha_nval; 53*8119dad8SRobert Mustacchi uint8_t ha_vals[HEX2SPD_ARR_MAX]; 54*8119dad8SRobert Mustacchi } hs_u8a; 55*8119dad8SRobert Mustacchi struct { 56*8119dad8SRobert Mustacchi uint32_t ha_nval; 57*8119dad8SRobert Mustacchi uint32_t ha_vals[HEX2SPD_ARR_MAX]; 58*8119dad8SRobert Mustacchi } hs_u32a; 59*8119dad8SRobert Mustacchi struct { 60*8119dad8SRobert Mustacchi uint32_t ha_nval; 61*8119dad8SRobert Mustacchi uint64_t ha_vals[HEX2SPD_ARR_MAX]; 62*8119dad8SRobert Mustacchi } hs_u64a; 63*8119dad8SRobert Mustacchi struct { 64*8119dad8SRobert Mustacchi uint32_t ha_nval; 65*8119dad8SRobert Mustacchi boolean_t ha_vals[HEX2SPD_ARR_MAX]; 66*8119dad8SRobert Mustacchi } hs_ba; 67*8119dad8SRobert Mustacchi } hs_val; 68*8119dad8SRobert Mustacchi } hex2spd_spd_t; 69*8119dad8SRobert Mustacchi 70*8119dad8SRobert Mustacchi /* 71*8119dad8SRobert Mustacchi * Represents a set of tests to run against a specific SPD file. The last of the 72*8119dad8SRobert Mustacchi * checks should have a key of NULL to indicate the end of the run. 73*8119dad8SRobert Mustacchi */ 74*8119dad8SRobert Mustacchi typedef struct { 75*8119dad8SRobert Mustacchi const char *ht_file; 76*8119dad8SRobert Mustacchi hex2spd_spd_t ht_checks[]; 77*8119dad8SRobert Mustacchi } hex2spd_test_t; 78*8119dad8SRobert Mustacchi 79*8119dad8SRobert Mustacchi extern const hex2spd_test_t samsung_ddr3_rdimm; 80*8119dad8SRobert Mustacchi extern const hex2spd_test_t micron_ddr3_lrdimm; 81*8119dad8SRobert Mustacchi 82*8119dad8SRobert Mustacchi extern const hex2spd_test_t micron_ddr4_rdimm; 83*8119dad8SRobert Mustacchi extern const hex2spd_test_t samsung_ddr4_lrdimm; 84*8119dad8SRobert Mustacchi extern const hex2spd_test_t advantech_ddr4_sodimm; 85*8119dad8SRobert Mustacchi extern const hex2spd_test_t advantech_ddr4_udimm; 86*8119dad8SRobert Mustacchi 87*8119dad8SRobert Mustacchi extern const hex2spd_test_t micron_ddr5_rdimm; 88*8119dad8SRobert Mustacchi extern const hex2spd_test_t advantech_ddr5_rdimm; 89*8119dad8SRobert Mustacchi 90*8119dad8SRobert Mustacchi extern const hex2spd_test_t nanya_lp3; 91*8119dad8SRobert Mustacchi extern const hex2spd_test_t micron_lp4; 92*8119dad8SRobert Mustacchi extern const hex2spd_test_t micron_lp5; 93*8119dad8SRobert Mustacchi extern const hex2spd_test_t fake_lp5_camm2; 94*8119dad8SRobert Mustacchi 95*8119dad8SRobert Mustacchi #ifdef __cplusplus 96*8119dad8SRobert Mustacchi } 97*8119dad8SRobert Mustacchi #endif 98*8119dad8SRobert Mustacchi 99*8119dad8SRobert Mustacchi #endif /* _LIBJEDEC_HEX2SPD_H */ 100