[{"data":1,"prerenderedAt":1671},["ShallowReactive",2],{"blog:2020:ddr4-information-in-linux":3,"blogMore-Technology":1638,"comments-ddr4-information-in-linux":1651},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":11,"tags":12,"excerpt":15,"body":31,"_type":1627,"_id":1628,"_source":1629,"_file":1630,"_stem":1631,"_extension":1632,"url":1633,"wordCount":1634,"minutes":1635,"commentCount":1209,"image":1636},"/blog/2020/ddr4-information-in-linux","2020",false,"en","DDR4 memory information in Linux","","2020-02-08T08:15:00-05:00","Technology",[13,14],"Linux","I2C",{"type":16,"children":17},"root",[18,26],{"type":19,"tag":20,"props":21,"children":22},"element","p",{},[23],{"type":24,"value":25},"text","If you've built a PC desktop in the last few years, you've probably been exposed to the confusing array of DDR4 information when it comes to buying RAM.",{"type":19,"tag":20,"props":27,"children":28},{},[29],{"type":24,"value":30},"What it comes down to is not all RAM is created equal. Once you get past pin size and memory capacity, you'll have to filter down by speed. Speed isn't a simple one-figure number - you may see a rated speed like 2400MHz, but you may also see another bunch of numbers like 16-16-16-39 indicating the necessary clock cycles to perform certain types of memory operations.",{"type":16,"children":32,"toc":1617},[33,40,44,52,56,81,86,91,97,102,131,137,648,662,668,698,707,712,717,729,760,766,778,787,792,800,821,850,870,878,891,899,928,936,941,949,963,975,981,994,999,1007,1012,1017,1025,1030,1036,1048,1056,1077,1097,1105,1111,1116,1136,1143,1148,1155,1160,1168,1196,1240,1252,1260,1265,1289,1294,1398,1403,1424,1429,1437,1443,1448,1453,1466,1506,1511,1519,1524,1537,1563,1575,1599,1604,1612],{"type":19,"tag":34,"props":35,"children":37},"h2",{"id":36},"background",[38],{"type":24,"value":39},"Background",{"type":19,"tag":20,"props":41,"children":42},{},[43],{"type":24,"value":25},{"type":19,"tag":45,"props":46,"children":51},"img",{"src":47,"alt":48,"className":49},"https://img.damieng.com/blog/trident-z-ddr4.webp","A shot of G-Skill Trident Z RGB memory modules glowing in my PC",[50],"photo",[],{"type":19,"tag":20,"props":53,"children":54},{},[55],{"type":24,"value":30},{"type":19,"tag":20,"props":57,"children":58},{},[59,61,70,72,79],{"type":24,"value":60},"While ",{"type":19,"tag":62,"props":63,"children":67},"a",{"href":64,"rel":65},"https://www.jedec.org/document_search/field_keywords/ddr4-3702",[66],"nofollow",[68],{"type":24,"value":69},"JEDEC",{"type":24,"value":71}," - the people behind the DDR4 standard - ratify the well-known speeds like 2400 they've been quite behind the desires of consumers and manufacturers, so Intel created ",{"type":19,"tag":62,"props":73,"children":76},{"href":74,"rel":75},"https://www.intel.com/content/www/us/en/gaming/extreme-memory-profile-xmp.html",[66],[77],{"type":24,"value":78},"Extreme Memory Profile (XMP)",{"type":24,"value":80},". XMP lets the RAM tell the PC a faster set of timings and clock speed it can support and what voltage it needs to do that. Things get a little more complicated as these memory modules are qualified only for specific speeds on tested motherboards and CPU combinations. XMP knows nothing about that - head to the RAM's Qualified Vendor List (QVL) to check it instead.",{"type":19,"tag":20,"props":82,"children":83},{},[84],{"type":24,"value":85},"While all of this used to be only of interest to people wishing to \"overclock\" their systems, the latest Ryzen Zen 2 CPU's like the 3900X really benefit from increasing the memory speeds as the \"Infinity Fabric\" interconnect between the chiplets and the outside world runs at the speed of the memory controller (at least initially). Any Zen 2 owner wanting to take full advantage of the CPU they have purchased will need to dig in.",{"type":19,"tag":20,"props":87,"children":88},{},[89],{"type":24,"value":90},"Fortunately, memory modules for some time have a little bit of persistent memory called Serial Presence Detect (SPD) on them. It is accessed over the \"I2C/SMBus\" device bus in your machine so your BIOS or other tools can find out what the manufacturer has rated them for as well as who manufactured the actual memory chips themselves, when, where, and using what kind of die/process.",{"type":19,"tag":34,"props":92,"children":94},{"id":93},"reading-the-serial-presence-detect",[95],{"type":24,"value":96},"Reading the Serial Presence Detect",{"type":19,"tag":20,"props":98,"children":99},{},[100],{"type":24,"value":101},"So given all that, what do you do to take a look at this info?",{"type":19,"tag":20,"props":103,"children":104},{},[105,107,114,116,122,124,129],{"type":24,"value":106},"Well, on Windows, you can just fire up a tool like ",{"type":19,"tag":62,"props":108,"children":111},{"href":109,"rel":110},"https://www.softnology.biz/files.html",[66],[112],{"type":24,"value":113},"Thaiphoon Burner",{"type":24,"value":115},", click ",{"type":19,"tag":117,"props":118,"children":119},"em",{},[120],{"type":24,"value":121},"EEPROM",{"type":24,"value":123}," in the menu and then ",{"type":19,"tag":117,"props":125,"children":126},{},[127],{"type":24,"value":128},"Read SPD on SMBus...",{"type":24,"value":130}," which gives you something like this:",{"type":19,"tag":132,"props":133,"children":134},"style",{},[135],{"type":24,"value":136},"\n.thaiphoon { margin: 0 }\n.thaiphoon th { background-color:#565656;color:#FFFFFF;height:20px;text-align:left;font-weight:bold }\n.thaiphoon td { background: #E6E6E6 }\n.thaiphoon .parnm { color:#333333;font-weight:Bold;text-transform:uppercase }\n.thaiphoon .val { color:#000000 }\n",{"type":19,"tag":138,"props":139,"children":143},"div",{"className":140},[141,142],"columns-2","text-xs",[144,401],{"type":19,"tag":145,"props":146,"children":149},"table",{"className":147},[148],"thaiphoon",[150],{"type":19,"tag":151,"props":152,"children":153},"tbody",{},[154,164,175,185,194,203,212,221,230,239,248,257,266,275,284,293,302,311,320,329,338,347,356,365,374,383,392],{"type":19,"tag":155,"props":156,"children":157},"tr",{},[158],{"type":19,"tag":159,"props":160,"children":161},"th",{},[162],{"type":24,"value":163},"MEMORY MODULE",{"type":19,"tag":155,"props":165,"children":166},{},[167],{"type":19,"tag":168,"props":169,"children":172},"td",{"className":170},[171],"parnm",[173],{"type":24,"value":174},"Manufacturer",{"type":19,"tag":155,"props":176,"children":177},{},[178],{"type":19,"tag":168,"props":179,"children":182},{"className":180},[181],"val",[183],{"type":24,"value":184},"Crucial Technology",{"type":19,"tag":155,"props":186,"children":187},{},[188],{"type":19,"tag":168,"props":189,"children":191},{"className":190},[171],[192],{"type":24,"value":193},"Series",{"type":19,"tag":155,"props":195,"children":196},{},[197],{"type":19,"tag":168,"props":198,"children":200},{"className":199},[181],[201],{"type":24,"value":202},"Ballistix Sport LT Red",{"type":19,"tag":155,"props":204,"children":205},{},[206],{"type":19,"tag":168,"props":207,"children":209},{"className":208},[171],[210],{"type":24,"value":211},"Part Number",{"type":19,"tag":155,"props":213,"children":214},{},[215],{"type":19,"tag":168,"props":216,"children":218},{"className":217},[181],[219],{"type":24,"value":220},"BLS16G4D240FSE.16FBD",{"type":19,"tag":155,"props":222,"children":223},{},[224],{"type":19,"tag":168,"props":225,"children":227},{"className":226},[171],[228],{"type":24,"value":229},"Serial Number",{"type":19,"tag":155,"props":231,"children":232},{},[233],{"type":19,"tag":168,"props":234,"children":236},{"className":235},[181],[237],{"type":24,"value":238},"3982077Bh",{"type":19,"tag":155,"props":240,"children":241},{},[242],{"type":19,"tag":168,"props":243,"children":245},{"className":244},[171],[246],{"type":24,"value":247},"JEDEC DIMM Label",{"type":19,"tag":155,"props":249,"children":250},{},[251],{"type":19,"tag":168,"props":252,"children":254},{"className":253},[181],[255],{"type":24,"value":256},"16GB 2Rx8 PC4-2400R-UB0-11",{"type":19,"tag":155,"props":258,"children":259},{},[260],{"type":19,"tag":168,"props":261,"children":263},{"className":262},[171],[264],{"type":24,"value":265},"Architecture",{"type":19,"tag":155,"props":267,"children":268},{},[269],{"type":19,"tag":168,"props":270,"children":272},{"className":271},[181],[273],{"type":24,"value":274},"DDR4 SDRAM UDIMM",{"type":19,"tag":155,"props":276,"children":277},{},[278],{"type":19,"tag":168,"props":279,"children":281},{"className":280},[171],[282],{"type":24,"value":283},"Speed Grade",{"type":19,"tag":155,"props":285,"children":286},{},[287],{"type":19,"tag":168,"props":288,"children":290},{"className":289},[181],[291],{"type":24,"value":292},"DDR4-2400R",{"type":19,"tag":155,"props":294,"children":295},{},[296],{"type":19,"tag":168,"props":297,"children":299},{"className":298},[171],[300],{"type":24,"value":301},"Capacity",{"type":19,"tag":155,"props":303,"children":304},{},[305],{"type":19,"tag":168,"props":306,"children":308},{"className":307},[181],[309],{"type":24,"value":310},"16 GB (16 components)",{"type":19,"tag":155,"props":312,"children":313},{},[314],{"type":19,"tag":168,"props":315,"children":317},{"className":316},[171],[318],{"type":24,"value":319},"Organization",{"type":19,"tag":155,"props":321,"children":322},{},[323],{"type":19,"tag":168,"props":324,"children":326},{"className":325},[181],[327],{"type":24,"value":328},"2048M x64 (2 ranks)",{"type":19,"tag":155,"props":330,"children":331},{},[332],{"type":19,"tag":168,"props":333,"children":335},{"className":334},[171],[336],{"type":24,"value":337},"Register Model",{"type":19,"tag":155,"props":339,"children":340},{},[341],{"type":19,"tag":168,"props":342,"children":344},{"className":343},[181],[345],{"type":24,"value":346},"N/A",{"type":19,"tag":155,"props":348,"children":349},{},[350],{"type":19,"tag":168,"props":351,"children":353},{"className":352},[171],[354],{"type":24,"value":355},"Manufacturing Date",{"type":19,"tag":155,"props":357,"children":358},{},[359],{"type":19,"tag":168,"props":360,"children":362},{"className":361},[181],[363],{"type":24,"value":364},"Undefined",{"type":19,"tag":155,"props":366,"children":367},{},[368],{"type":19,"tag":168,"props":369,"children":371},{"className":370},[171],[372],{"type":24,"value":373},"Manufacturing Location",{"type":19,"tag":155,"props":375,"children":376},{},[377],{"type":19,"tag":168,"props":378,"children":380},{"className":379},[181],[381],{"type":24,"value":382},"Boise, USA (SIG)",{"type":19,"tag":155,"props":384,"children":385},{},[386],{"type":19,"tag":168,"props":387,"children":389},{"className":388},[171],[390],{"type":24,"value":391},"Revision / Raw Card",{"type":19,"tag":155,"props":393,"children":394},{},[395],{"type":19,"tag":168,"props":396,"children":398},{"className":397},[181],[399],{"type":24,"value":400},"0000h / B0 (8 layers)",{"type":19,"tag":145,"props":402,"children":404},{"className":403},[148],[405],{"type":19,"tag":151,"props":406,"children":407},{},[408,416,424,433,441,450,459,468,477,486,495,504,513,522,531,540,549,558,567,576,585,594,603,612,621,630,639],{"type":19,"tag":155,"props":409,"children":410},{},[411],{"type":19,"tag":159,"props":412,"children":413},{},[414],{"type":24,"value":415},"DRAM COMPONENTS",{"type":19,"tag":155,"props":417,"children":418},{},[419],{"type":19,"tag":168,"props":420,"children":422},{"className":421},[171],[423],{"type":24,"value":174},{"type":19,"tag":155,"props":425,"children":426},{},[427],{"type":19,"tag":168,"props":428,"children":430},{"className":429},[181],[431],{"type":24,"value":432},"Micron Technology",{"type":19,"tag":155,"props":434,"children":435},{},[436],{"type":19,"tag":168,"props":437,"children":439},{"className":438},[171],[440],{"type":24,"value":211},{"type":19,"tag":155,"props":442,"children":443},{},[444],{"type":19,"tag":168,"props":445,"children":447},{"className":446},[181],[448],{"type":24,"value":449},"D9TBH (MT40A1G8WE-083E:B)",{"type":19,"tag":155,"props":451,"children":452},{},[453],{"type":19,"tag":168,"props":454,"children":456},{"className":455},[171],[457],{"type":24,"value":458},"Package",{"type":19,"tag":155,"props":460,"children":461},{},[462],{"type":19,"tag":168,"props":463,"children":465},{"className":464},[181],[466],{"type":24,"value":467},"Standard Monolithic 78-ball FBGA",{"type":19,"tag":155,"props":469,"children":470},{},[471],{"type":19,"tag":168,"props":472,"children":474},{"className":473},[171],[475],{"type":24,"value":476},"Die Density / Count",{"type":19,"tag":155,"props":478,"children":479},{},[480],{"type":19,"tag":168,"props":481,"children":483},{"className":482},[181],[484],{"type":24,"value":485},"8 Gb B-die (Z01A / 20 nm) / 1 die",{"type":19,"tag":155,"props":487,"children":488},{},[489],{"type":19,"tag":168,"props":490,"children":492},{"className":491},[171],[493],{"type":24,"value":494},"Composition",{"type":19,"tag":155,"props":496,"children":497},{},[498],{"type":19,"tag":168,"props":499,"children":501},{"className":500},[181],[502],{"type":24,"value":503},"1024Mb x8 (64Mb x8 x 16 banks)",{"type":19,"tag":155,"props":505,"children":506},{},[507],{"type":19,"tag":168,"props":508,"children":510},{"className":509},[171],[511],{"type":24,"value":512},"Clock Frequency",{"type":19,"tag":155,"props":514,"children":515},{},[516],{"type":19,"tag":168,"props":517,"children":519},{"className":518},[181],[520],{"type":24,"value":521},"1200 MHz (0.833 ns)",{"type":19,"tag":155,"props":523,"children":524},{},[525],{"type":19,"tag":168,"props":526,"children":528},{"className":527},[171],[529],{"type":24,"value":530},"Minimum Timing Delays",{"type":19,"tag":155,"props":532,"children":533},{},[534],{"type":19,"tag":168,"props":535,"children":537},{"className":536},[181],[538],{"type":24,"value":539},"16-16-16-39-55",{"type":19,"tag":155,"props":541,"children":542},{},[543],{"type":19,"tag":168,"props":544,"children":546},{"className":545},[171],[547],{"type":24,"value":548},"Read Latencies Supported",{"type":19,"tag":155,"props":550,"children":551},{},[552],{"type":19,"tag":168,"props":553,"children":555},{"className":554},[181],[556],{"type":24,"value":557},"20T, 18T, 16T, 15T, 14T, 13T, 12T...",{"type":19,"tag":155,"props":559,"children":560},{},[561],{"type":19,"tag":168,"props":562,"children":564},{"className":563},[171],[565],{"type":24,"value":566},"Supply Voltage",{"type":19,"tag":155,"props":568,"children":569},{},[570],{"type":19,"tag":168,"props":571,"children":573},{"className":572},[181],[574],{"type":24,"value":575},"1.20 V",{"type":19,"tag":155,"props":577,"children":578},{},[579],{"type":19,"tag":168,"props":580,"children":582},{"className":581},[171],[583],{"type":24,"value":584},"XMP Certified",{"type":19,"tag":155,"props":586,"children":587},{},[588],{"type":19,"tag":168,"props":589,"children":591},{"className":590},[181],[592],{"type":24,"value":593},"1200 MHz / 16-16-16-39-55 / 1.20 V",{"type":19,"tag":155,"props":595,"children":596},{},[597],{"type":19,"tag":168,"props":598,"children":600},{"className":599},[171],[601],{"type":24,"value":602},"XMP Extreme",{"type":19,"tag":155,"props":604,"children":605},{},[606],{"type":19,"tag":168,"props":607,"children":609},{"className":608},[181],[610],{"type":24,"value":611},"Not programmed",{"type":19,"tag":155,"props":613,"children":614},{},[615],{"type":19,"tag":168,"props":616,"children":618},{"className":617},[171],[619],{"type":24,"value":620},"SPD Revision",{"type":19,"tag":155,"props":622,"children":623},{},[624],{"type":19,"tag":168,"props":625,"children":627},{"className":626},[181],[628],{"type":24,"value":629},"1.1 / September 2015",{"type":19,"tag":155,"props":631,"children":632},{},[633],{"type":19,"tag":168,"props":634,"children":636},{"className":635},[171],[637],{"type":24,"value":638},"XMP Revision",{"type":19,"tag":155,"props":640,"children":641},{},[642],{"type":19,"tag":168,"props":643,"children":645},{"className":644},[181],[646],{"type":24,"value":647},"2.0 / December 2013",{"type":19,"tag":20,"props":649,"children":650},{},[651,653,660],{"type":24,"value":652},"You can then feed these values into something like ",{"type":19,"tag":62,"props":654,"children":657},{"href":655,"rel":656},"https://www.techpowerup.com/download/ryzen-dram-calculator/",[66],[658],{"type":24,"value":659},"DRAM Calculator for Ryzen",{"type":24,"value":661}," to figure out good fast timings to enter into your BIOS.",{"type":19,"tag":34,"props":663,"children":665},{"id":664},"what-about-linux",[666],{"type":24,"value":667},"What about Linux?",{"type":19,"tag":20,"props":669,"children":670},{},[671,673,680,682,688,690,696],{"type":24,"value":672},"If you Google around, you'll find guides that tell you to run various ",{"type":19,"tag":674,"props":675,"children":677},"code",{"className":676},[],[678],{"type":24,"value":679},"modprobe",{"type":24,"value":681},", ",{"type":19,"tag":674,"props":683,"children":685},{"className":684},[],[686],{"type":24,"value":687},"i2cdetect",{"type":24,"value":689}," commands, and probably ",{"type":19,"tag":674,"props":691,"children":693},{"className":692},[],[694],{"type":24,"value":695},"decode-dimms",{"type":24,"value":697}," however...",{"type":19,"tag":20,"props":699,"children":700},{},[701],{"type":19,"tag":702,"props":703,"children":704},"strong",{},[705],{"type":24,"value":706},"DDR4 uses a different type of SPD memory chips. Linux support is new and incomplete.",{"type":19,"tag":20,"props":708,"children":709},{},[710],{"type":24,"value":711},"Previously these chips were a type known as eeprom - electronically-erasable programmable read-only-memory (the previous tech was just known as eprom as you needed an ultraviolet box to wipe them through a little window on the top).",{"type":19,"tag":20,"props":713,"children":714},{},[715],{"type":24,"value":716},"DDR4, however, has switched from the very dated eeprom technology to more popular flash memory.",{"type":19,"tag":20,"props":718,"children":719},{},[720,722,727],{"type":24,"value":721},"So if you run those commands, you'll likely find ",{"type":19,"tag":674,"props":723,"children":725},{"className":724},[],[726],{"type":24,"value":695},{"type":24,"value":728}," doesn't tell you much at all. There are two possible scenarios:",{"type":19,"tag":730,"props":731,"children":732},"ol",{},[733,747],{"type":19,"tag":734,"props":735,"children":736},"li",{},[737,739,745],{"type":24,"value":738},"It tells you no eeprom found meaning the existing ",{"type":19,"tag":674,"props":740,"children":742},{"className":741},[],[743],{"type":24,"value":744},"eeprom",{"type":24,"value":746}," driver can't find your SPD, and you're most likely going to need to obtain and load an alternative i2c driver.",{"type":19,"tag":734,"props":748,"children":749},{},[750,752,758],{"type":24,"value":751},"It shows you some generic RAM information but says SPD is invalid, meaning i2c is communicating with the SPD, but Linux doesn't understand the DDR4 flash eeprom. You need to set up the ",{"type":19,"tag":674,"props":753,"children":755},{"className":754},[],[756],{"type":24,"value":757},"ee1004",{"type":24,"value":759}," driver.",{"type":19,"tag":34,"props":761,"children":763},{"id":762},"identifying-the-right-i2c-bus",[764],{"type":24,"value":765},"Identifying the right I2C bus",{"type":19,"tag":20,"props":767,"children":768},{},[769,771,776],{"type":24,"value":770},"Either way, you're going to need to get the i2c device number your SPD is connected to by way of ",{"type":19,"tag":674,"props":772,"children":774},{"className":773},[],[775],{"type":24,"value":687},{"type":24,"value":777},", so run:",{"type":19,"tag":779,"props":780,"children":782},"pre",{"code":781},"i2cdetect -l\n",[783],{"type":19,"tag":674,"props":784,"children":785},{"__ignoreMap":9},[786],{"type":24,"value":781},{"type":19,"tag":20,"props":788,"children":789},{},[790],{"type":24,"value":791},"Which will give you some output like this:",{"type":19,"tag":779,"props":793,"children":795},{"code":794},"i2c-3   i2c         i915 gmbus dpd                          I2C adapter\ni2c-1   i2c         i915 gmbus dpc                          I2C adapter\ni2c-4   i2c         DPDDC-E                                 I2C adapter\ni2c-2   i2c         i915 gmbus dpb                          I2C adapter\ni2c-0   smbus       SMBus I801 adapter at f040              SMBus adapter\n",[796],{"type":19,"tag":674,"props":797,"children":798},{"__ignoreMap":9},[799],{"type":24,"value":794},{"type":19,"tag":20,"props":801,"children":802},{},[803,805,811,813,819],{"type":24,"value":804},"The results are system-dependent, but you need to deduce which one your SPD is on. The Intel Z370 chipset my Linux box runs uses the ",{"type":19,"tag":674,"props":806,"children":808},{"className":807},[],[809],{"type":24,"value":810},"SMBus I801",{"type":24,"value":812}," interface, so I need to make a note of ",{"type":19,"tag":674,"props":814,"children":816},{"className":815},[],[817],{"type":24,"value":818},"i2c-0",{"type":24,"value":820},".",{"type":19,"tag":20,"props":822,"children":823},{},[824,826,832,834,840,842,848],{"type":24,"value":825},"If you're not sure, then it may be a process of elimination based on the names. ",{"type":19,"tag":674,"props":827,"children":829},{"className":828},[],[830],{"type":24,"value":831},"i915",{"type":24,"value":833}," is the Intel onboard CPU graphic support, so it wouldn't be that, and a quick Google also associated the ",{"type":19,"tag":674,"props":835,"children":837},{"className":836},[],[838],{"type":24,"value":839},"DPDDC-E",{"type":24,"value":841}," with that too. I'd probably also give some preference to ",{"type":19,"tag":674,"props":843,"children":845},{"className":844},[],[846],{"type":24,"value":847},"SMBus adapter",{"type":24,"value":849}," ones rather than I2C, but I couldn't find any confirmation that this is always the case.",{"type":19,"tag":20,"props":851,"children":852},{},[853,855,861,863,869],{"type":24,"value":854},"If you're not sure which one, you can try dumping information from each to see if you can find the right-looking data using this command but changing ",{"type":19,"tag":674,"props":856,"children":858},{"className":857},[],[859],{"type":24,"value":860},"0",{"type":24,"value":862}," to the likely candidates to the i2c device number from the first column in ",{"type":19,"tag":674,"props":864,"children":866},{"className":865},[],[867],{"type":24,"value":868},"i2cdetect -l",{"type":24,"value":820},{"type":19,"tag":779,"props":871,"children":873},{"code":872},"i2cdetect -y 0\n",[874],{"type":19,"tag":674,"props":875,"children":876},{"__ignoreMap":9},[877],{"type":24,"value":872},{"type":19,"tag":20,"props":879,"children":880},{},[881,883,889],{"type":24,"value":882},"With any luck, it should look something like this. If all you see are ",{"type":19,"tag":674,"props":884,"children":886},{"className":885},[],[887],{"type":24,"value":888},"--",{"type":24,"value":890}," then try another.",{"type":19,"tag":779,"props":892,"children":894},{"code":893},"     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n00:          -- -- -- -- -- 08 -- -- -- -- -- -- --\n10: -- -- -- -- 14 15 -- -- -- -- -- -- -- -- -- --\n20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n30: 30 31 -- -- 34 35 -- -- -- -- -- -- -- -- -- --\n40: 40 -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --\n50: 50 51 52 53 -- -- -- -- -- -- -- -- -- -- -- --\n60: -- -- -- -- -- -- -- -- -- -- 6a -- -- -- -- --\n70: -- -- -- -- -- -- -- --\n",[895],{"type":19,"tag":674,"props":896,"children":897},{"__ignoreMap":9},[898],{"type":24,"value":893},{"type":19,"tag":20,"props":900,"children":901},{},[902,904,909,911,917,919,926],{"type":24,"value":903},"Now there's a chance - especially if ",{"type":19,"tag":674,"props":905,"children":907},{"className":906},[],[908],{"type":24,"value":695},{"type":24,"value":910}," told you ",{"type":19,"tag":674,"props":912,"children":914},{"className":913},[],[915],{"type":24,"value":916},"no eeprom found",{"type":24,"value":918}," that you don't actually have the i2c driver loaded. The i801 driver is ",{"type":19,"tag":62,"props":920,"children":923},{"href":921,"rel":922},"https://www.kernel.org/doc/Documentation/i2c/busses/i2c-i801",[66],[924],{"type":24,"value":925},"compatible with many Intel chipsets",{"type":24,"value":927},". To load that, you can use:",{"type":19,"tag":779,"props":929,"children":931},{"code":930},"modprobe i2c-i801\n",[932],{"type":19,"tag":674,"props":933,"children":934},{"__ignoreMap":9},[935],{"type":24,"value":930},{"type":19,"tag":20,"props":937,"children":938},{},[939],{"type":24,"value":940},"If you're running an AMD CPU, you might get away with:",{"type":19,"tag":779,"props":942,"children":944},{"code":943},"modprobe i2c-amd-mp2-pci\n",[945],{"type":19,"tag":674,"props":946,"children":947},{"__ignoreMap":9},[948],{"type":24,"value":943},{"type":19,"tag":20,"props":950,"children":951},{},[952,954,961],{"type":24,"value":953},"if your Linux is really up to date. If not check out the ",{"type":19,"tag":62,"props":955,"children":958},{"href":956,"rel":957},"https://github.com/Syniurge/i2c-amd-mp2",[66],[959],{"type":24,"value":960},"i2c-amd-mp2 repo",{"type":24,"value":962}," for manual installation instructions.",{"type":19,"tag":20,"props":964,"children":965},{},[966,968,973],{"type":24,"value":967},"You can also try running ",{"type":19,"tag":674,"props":969,"children":971},{"className":970},[],[972],{"type":24,"value":695},{"type":24,"value":974}," again, and hopefully, now you should see some generic memory information.",{"type":19,"tag":34,"props":976,"children":978},{"id":977},"introducing-ee1004",[979],{"type":24,"value":980},"Introducing ee1004",{"type":19,"tag":20,"props":982,"children":983},{},[984,986,993],{"type":24,"value":985},"Now that you have i2c working and identified, you can move on to the ",{"type":19,"tag":62,"props":987,"children":990},{"href":988,"rel":989},"https://www.phoronix.com/scan.php?page=news_item&px=Linux-DDR4-SPD-Driver-EE1004",[66],[991],{"type":24,"value":992},"ee1004 flash driver for DDR4",{"type":24,"value":820},{"type":19,"tag":20,"props":995,"children":996},{},[997],{"type":24,"value":998},"If so then just typing:",{"type":19,"tag":779,"props":1000,"children":1002},{"code":1001},"modprobe ee1004\n",[1003],{"type":19,"tag":674,"props":1004,"children":1005},{"__ignoreMap":9},[1006],{"type":24,"value":1001},{"type":19,"tag":20,"props":1008,"children":1009},{},[1010],{"type":24,"value":1011},"Should get you up and running. If so, you can skip the next section and go straight to registering the SPD devices.",{"type":19,"tag":20,"props":1013,"children":1014},{},[1015],{"type":24,"value":1016},"If you don't have the kernel module (Ubuntu 18 doesn't have it), you will see an error like this one:",{"type":19,"tag":779,"props":1018,"children":1020},{"code":1019},"modprobe: FATAL: Module ee1004 not found in directory /lib/modules/...\n",[1021],{"type":19,"tag":674,"props":1022,"children":1023},{"__ignoreMap":9},[1024],{"type":24,"value":1019},{"type":19,"tag":20,"props":1026,"children":1027},{},[1028],{"type":24,"value":1029},"and so you'll need to install it...",{"type":19,"tag":34,"props":1031,"children":1033},{"id":1032},"installing-latest-ee1004-driver",[1034],{"type":24,"value":1035},"Installing latest ee1004 driver",{"type":19,"tag":20,"props":1037,"children":1038},{},[1039,1041,1046],{"type":24,"value":1040},"So either you don't have ",{"type":19,"tag":674,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":24,"value":757},{"type":24,"value":1047}," or you need the latest. Let's CURL it down from the maintainers site. I wouldn't recommend building kernel drivers from untrusted sources but...",{"type":19,"tag":779,"props":1049,"children":1051},{"code":1050},"curl -O http://jdelvare.nerim.net/devel/lm-sensors/drivers/ee1004/Makefile\ncurl -O http://jdelvare.nerim.net/devel/lm-sensors/drivers/ee1004/ee1004.c\nsudo make install\n",[1052],{"type":19,"tag":674,"props":1053,"children":1054},{"__ignoreMap":9},[1055],{"type":24,"value":1050},{"type":19,"tag":20,"props":1057,"children":1058},{},[1059,1061,1067,1069,1075],{"type":24,"value":1060},"(If make doesn't work, you're going to need to install things like ",{"type":19,"tag":674,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":24,"value":1066},"build-essentials",{"type":24,"value":1068}," etc., via ",{"type":19,"tag":674,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":24,"value":1074},"apt",{"type":24,"value":1076}," or your package manager of choice).",{"type":19,"tag":20,"props":1078,"children":1079},{},[1080,1082,1088,1090,1095],{"type":24,"value":1081},"Now that is compiled and copied into ",{"type":19,"tag":674,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":24,"value":1087},"/lib/modules/.../kernel/drivers/misc/eeprom/ee1004.ko",{"type":24,"value":1089}," we need to load it. Now there's a small chance your system already has the older ",{"type":19,"tag":674,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":24,"value":744},{"type":24,"value":1096}," driver loaded, so we'll unload that as well, so it doesn't interfere:",{"type":19,"tag":779,"props":1098,"children":1100},{"code":1099},"modprobe -r eeprom\nmodprobe ee1004\n",[1101],{"type":19,"tag":674,"props":1102,"children":1103},{"__ignoreMap":9},[1104],{"type":24,"value":1099},{"type":19,"tag":34,"props":1106,"children":1108},{"id":1107},"registering-the-spd-devices",[1109],{"type":24,"value":1110},"Registering the SPD devices",{"type":19,"tag":20,"props":1112,"children":1113},{},[1114],{"type":24,"value":1115},"OK, so you now have the ee1004 driver installed, and you can see the bus your SPD devices are on. There are just a few more steps to make sure ee1004 knows which SPD devices it's supposed to be using.",{"type":19,"tag":20,"props":1117,"children":1118},{},[1119,1121,1126,1128,1134],{"type":24,"value":1120},"Run the following command replacing ",{"type":19,"tag":674,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":24,"value":860},{"type":24,"value":1127}," with the number after ",{"type":19,"tag":674,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":24,"value":1133},"i2c-",{"type":24,"value":1135}," you identified as the bus your SPD devices are located on:",{"type":19,"tag":779,"props":1137,"children":1138},{"code":872},[1139],{"type":19,"tag":674,"props":1140,"children":1141},{"__ignoreMap":9},[1142],{"type":24,"value":872},{"type":19,"tag":20,"props":1144,"children":1145},{},[1146],{"type":24,"value":1147},"Now this will dump out that basic I2C information we saw earlier. On my system, it looks like this:",{"type":19,"tag":779,"props":1149,"children":1150},{"code":893},[1151],{"type":19,"tag":674,"props":1152,"children":1153},{"__ignoreMap":9},[1154],{"type":24,"value":893},{"type":19,"tag":20,"props":1156,"children":1157},{},[1158],{"type":24,"value":1159},"Notice those '50 51 52 53` bytes? Those are my four DDR4 DIMM sticks, and we need to register those numbers with the ee1004 driver.",{"type":19,"tag":20,"props":1161,"children":1162},{},[1163],{"type":19,"tag":702,"props":1164,"children":1165},{},[1166],{"type":24,"value":1167},"Note: I couldn't find out if the numbers that are important or the location.",{"type":19,"tag":20,"props":1169,"children":1170},{},[1171,1173,1178,1180,1186,1188,1194],{"type":24,"value":1172},"You can start by just registering one to see if it works (replace ",{"type":19,"tag":674,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":24,"value":818},{"type":24,"value":1179}," with your ",{"type":19,"tag":674,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":24,"value":1185},"i2c",{"type":24,"value":1187}," device from the previous section and ",{"type":19,"tag":674,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":24,"value":1193},"0x50",{"type":24,"value":1195}," with the bank number of your memory module you figured out in the chart above:",{"type":19,"tag":779,"props":1197,"children":1201},{"code":1198,"language":1199,"meta":9,"className":1200,"style":9},"echo ee1004 0x50 > /sys/bus/i2c/devices/i2c-0/new_device\n","bash","language-bash shiki shiki-themes everforest-light dracula",[1202],{"type":19,"tag":674,"props":1203,"children":1204},{"__ignoreMap":9},[1205],{"type":19,"tag":1206,"props":1207,"children":1210},"span",{"class":1208,"line":1209},"line",1,[1211,1217,1223,1229,1235],{"type":19,"tag":1206,"props":1212,"children":1214},{"style":1213},"--shiki-default:#DFA000;--shiki-dark:#8BE9FD",[1215],{"type":24,"value":1216},"echo",{"type":19,"tag":1206,"props":1218,"children":1220},{"style":1219},"--shiki-default:#DFA000;--shiki-dark:#F1FA8C",[1221],{"type":24,"value":1222}," ee1004",{"type":19,"tag":1206,"props":1224,"children":1226},{"style":1225},"--shiki-default:#DF69BA;--shiki-dark:#BD93F9",[1227],{"type":24,"value":1228}," 0x50",{"type":19,"tag":1206,"props":1230,"children":1232},{"style":1231},"--shiki-default:#F57D26;--shiki-dark:#FF79C6",[1233],{"type":24,"value":1234}," >",{"type":19,"tag":1206,"props":1236,"children":1237},{"style":1219},[1238],{"type":24,"value":1239}," /sys/bus/i2c/devices/i2c-0/new_device\n",{"type":19,"tag":20,"props":1241,"children":1242},{},[1243,1245,1250],{"type":24,"value":1244},"now run ",{"type":19,"tag":674,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":24,"value":695},{"type":24,"value":1251}," and, with any luck, you will see output like this:",{"type":19,"tag":779,"props":1253,"children":1255},{"code":1254},"Memory Serial Presence Detect Decoder\nBy Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,\nJean Delvare, Trent Piepho and others\n\n\nDecoding EEPROM: /sys/bus/i2c/drivers/ee1004/0-0050\nGuessing DIMM is in                              bank 1\n\n---=== SPD EEPROM Information ===---\nEEPROM CRC of bytes 0-125                        OK (0x05EA)\n# of bytes written to SDRAM EEPROM               384\nTotal number of bytes in EEPROM                  512\nFundamental Memory type                          DDR4 SDRAM\nSPD Revision                                     1.1\nModule Type                                      UDIMM\nEEPROM CRC of bytes 128-253                      OK (0x27DE)\n",[1256],{"type":19,"tag":674,"props":1257,"children":1258},{"__ignoreMap":9},[1259],{"type":24,"value":1254},{"type":19,"tag":20,"props":1261,"children":1262},{},[1263],{"type":24,"value":1264},"If it did not register correctly, you should de-register the bank with the command:",{"type":19,"tag":779,"props":1266,"children":1268},{"code":1267,"language":1199,"meta":9,"className":1200,"style":9},"echo 0x51 /sys/bus/i2c/devices/i2c-0/delete_device\n",[1269],{"type":19,"tag":674,"props":1270,"children":1271},{"__ignoreMap":9},[1272],{"type":19,"tag":1206,"props":1273,"children":1274},{"class":1208,"line":1209},[1275,1279,1284],{"type":19,"tag":1206,"props":1276,"children":1277},{"style":1213},[1278],{"type":24,"value":1216},{"type":19,"tag":1206,"props":1280,"children":1281},{"style":1225},[1282],{"type":24,"value":1283}," 0x51",{"type":19,"tag":1206,"props":1285,"children":1286},{"style":1219},[1287],{"type":24,"value":1288}," /sys/bus/i2c/devices/i2c-0/delete_device\n",{"type":19,"tag":20,"props":1290,"children":1291},{},[1292],{"type":24,"value":1293},"If it worked, go ahead and register the rest of your modules depending on what banks you have memory sticks in. For example, on my system, the complete registration is:",{"type":19,"tag":779,"props":1295,"children":1297},{"code":1296,"language":1199,"meta":9,"className":1200,"style":9},"echo ee1004 0x50 > /sys/bus/i2c/devices/i2c-0/new_device\necho ee1004 0x51 > /sys/bus/i2c/devices/i2c-0/new_device\necho ee1004 0x52 > /sys/bus/i2c/devices/i2c-0/new_device\necho ee1004 0x53 > /sys/bus/i2c/devices/i2c-0/new_device\n",[1298],{"type":19,"tag":674,"props":1299,"children":1300},{"__ignoreMap":9},[1301,1324,1348,1373],{"type":19,"tag":1206,"props":1302,"children":1303},{"class":1208,"line":1209},[1304,1308,1312,1316,1320],{"type":19,"tag":1206,"props":1305,"children":1306},{"style":1213},[1307],{"type":24,"value":1216},{"type":19,"tag":1206,"props":1309,"children":1310},{"style":1219},[1311],{"type":24,"value":1222},{"type":19,"tag":1206,"props":1313,"children":1314},{"style":1225},[1315],{"type":24,"value":1228},{"type":19,"tag":1206,"props":1317,"children":1318},{"style":1231},[1319],{"type":24,"value":1234},{"type":19,"tag":1206,"props":1321,"children":1322},{"style":1219},[1323],{"type":24,"value":1239},{"type":19,"tag":1206,"props":1325,"children":1327},{"class":1208,"line":1326},2,[1328,1332,1336,1340,1344],{"type":19,"tag":1206,"props":1329,"children":1330},{"style":1213},[1331],{"type":24,"value":1216},{"type":19,"tag":1206,"props":1333,"children":1334},{"style":1219},[1335],{"type":24,"value":1222},{"type":19,"tag":1206,"props":1337,"children":1338},{"style":1225},[1339],{"type":24,"value":1283},{"type":19,"tag":1206,"props":1341,"children":1342},{"style":1231},[1343],{"type":24,"value":1234},{"type":19,"tag":1206,"props":1345,"children":1346},{"style":1219},[1347],{"type":24,"value":1239},{"type":19,"tag":1206,"props":1349,"children":1351},{"class":1208,"line":1350},3,[1352,1356,1360,1365,1369],{"type":19,"tag":1206,"props":1353,"children":1354},{"style":1213},[1355],{"type":24,"value":1216},{"type":19,"tag":1206,"props":1357,"children":1358},{"style":1219},[1359],{"type":24,"value":1222},{"type":19,"tag":1206,"props":1361,"children":1362},{"style":1225},[1363],{"type":24,"value":1364}," 0x52",{"type":19,"tag":1206,"props":1366,"children":1367},{"style":1231},[1368],{"type":24,"value":1234},{"type":19,"tag":1206,"props":1370,"children":1371},{"style":1219},[1372],{"type":24,"value":1239},{"type":19,"tag":1206,"props":1374,"children":1376},{"class":1208,"line":1375},4,[1377,1381,1385,1390,1394],{"type":19,"tag":1206,"props":1378,"children":1379},{"style":1213},[1380],{"type":24,"value":1216},{"type":19,"tag":1206,"props":1382,"children":1383},{"style":1219},[1384],{"type":24,"value":1222},{"type":19,"tag":1206,"props":1386,"children":1387},{"style":1225},[1388],{"type":24,"value":1389}," 0x53",{"type":19,"tag":1206,"props":1391,"children":1392},{"style":1231},[1393],{"type":24,"value":1234},{"type":19,"tag":1206,"props":1395,"children":1396},{"style":1219},[1397],{"type":24,"value":1239},{"type":19,"tag":20,"props":1399,"children":1400},{},[1401],{"type":24,"value":1402},"Now you can finally run",{"type":19,"tag":779,"props":1404,"children":1406},{"code":1405,"language":1199,"meta":9,"className":1200,"style":9},"decode-dimms --side-by-side\n",[1407],{"type":19,"tag":674,"props":1408,"children":1409},{"__ignoreMap":9},[1410],{"type":19,"tag":1206,"props":1411,"children":1412},{"class":1208,"line":1209},[1413,1418],{"type":19,"tag":1206,"props":1414,"children":1416},{"style":1415},"--shiki-default:#8DA101;--shiki-dark:#50FA7B",[1417],{"type":24,"value":695},{"type":19,"tag":1206,"props":1419,"children":1421},{"style":1420},"--shiki-default:#DFA000;--shiki-dark:#BD93F9",[1422],{"type":24,"value":1423}," --side-by-side\n",{"type":19,"tag":20,"props":1425,"children":1426},{},[1427],{"type":24,"value":1428},"And get to see timings, manufacturer, etc.",{"type":19,"tag":779,"props":1430,"children":1432},{"code":1431},"Decoding EEPROM                                  0-0050                0-0051                0-0052                0-0053\nGuessing DIMM is in                              bank 1                bank 2                bank 3                bank 4\n\n---=== SPD EEPROM Information ===---\nEEPROM CRC of bytes 0-125                        OK (0x05EA)           OK (0x699E)           OK (0x05EA)           OK (0x699E)\n# of bytes written to SDRAM EEPROM               384\nTotal number of bytes in EEPROM                  512\nFundamental Memory type                          DDR4 SDRAM\nSPD Revision                                     1.1                   1.0                   1.1                   1.0\nModule Type                                      UDIMM\nEEPROM CRC of bytes 128-253                      OK (0x27DE)\n\n---=== Memory Characteristics ===---\nMaximum module speed                             2400 MHz (PC4-19200)\nSize                                             16384 MB\nBanks x Rows x Columns x Bits                    16 x 16 x 10 x 64\nSDRAM Device Width                               8 bits\nRanks                                            2\nRank Mix                                         Symmetrical\nAA-RCD-RP-RAS (cycles)                           16-16-16-39\nSupported CAS Latencies                          20T, 18T, 16T, 15T, 14T, 13T, 12T, 11T, 10T, 9T\n\n---=== Timings at Standard Speeds ===---\nAA-RCD-RP-RAS (cycles) as DDR4-2400              16-16-16-39\nAA-RCD-RP-RAS (cycles) as DDR4-2133              15-15-15-35\nAA-RCD-RP-RAS (cycles) as DDR4-1866              13-13-13-30\nAA-RCD-RP-RAS (cycles) as DDR4-1600              11-11-11-26\n\n---=== Timing Parameters ===---\nMinimum Cycle Time (tCKmin)                      0.833 ns\nMaximum Cycle Time (tCKmax)                      1.600 ns              1.500 ns              1.600 ns              1.500 ns\nMinimum CAS Latency Time (tAA)                   13.320 ns\nMinimum RAS to CAS Delay (tRCD)                  13.320 ns\nMinimum Row Precharge Delay (tRP)                13.320 ns\nMinimum Active to Precharge Delay (tRAS)         32.000 ns\nMinimum Active to Auto-Refresh Delay (tRC)       45.320 ns\nMinimum Recovery Delay (tRFC1)                   350.000 ns\nMinimum Recovery Delay (tRFC2)                   260.000 ns\nMinimum Recovery Delay (tRFC4)                   160.000 ns\nMinimum Four Activate Window Delay (tFAW)        21.000 ns\nMinimum Row Active to Row Active Delay (tRRD_S)  3.299 ns\nMinimum Row Active to Row Active Delay (tRRD_L)  4.900 ns\nMinimum CAS to CAS Delay (tCCD_L)                5.000 ns\nMinimum Write Recovery Time (tWR)                15.000 ns             N/A                   15.000 ns             N/A\nMinimum Write to Read Time (tWTR_S)              2.500 ns              N/A                   2.500 ns              N/A\nMinimum Write to Read Time (tWTR_L)              7.500 ns              N/A                   7.500 ns              N/A\n\n---=== Other Information ===---\nPackage Type                                     Monolithic\nMaximum Activate Count                           Unlimited\nPost Package Repair                              Not supported\nModule Nominal Voltage                           1.2 V\nThermal Sensor                                   No\n\n---=== Physical Characteristics ===---\nModule Height                                    32 mm\nModule Thickness                                 2 mm front, 2 mm back\nModule Reference Card                            B revision 0\n\n---=== Manufacturer Data ===---\nModule Manufacturer                              Crucial Technology\nDRAM Manufacturer                                Micron Technology\nAssembly Serial Number                           0x3982077B            0xA02071FC            0x3982077D            0xA02071AC\nPart Number                                      BLS16G4D240FSE.16FBD  BLS16G4D240FSE.16FAD  BLS16G4D240FSE.16FBD  BLS16G4D240FSE.16FAD\n",[1433],{"type":19,"tag":674,"props":1434,"children":1435},{"__ignoreMap":9},[1436],{"type":24,"value":1431},{"type":19,"tag":34,"props":1438,"children":1440},{"id":1439},"identifying-die-revisions",[1441],{"type":24,"value":1442},"Identifying die revisions",{"type":19,"tag":20,"props":1444,"children":1445},{},[1446],{"type":24,"value":1447},"One of the things you don't see here is the die version. If you're overclocking, it is important to determine what timings and tweaks you can get at (right now, Micron E-die is the newest hotness after Samsung B-die had a good run).",{"type":19,"tag":20,"props":1449,"children":1450},{},[1451],{"type":24,"value":1452},"Die is not part of the specification, and it seems from playing with Thaiphoon, it's a bunch of matching bytes. I'm looking into putting together a small Linux script/binary that will identify them, but in the mean-time, you have two options if you need this extra info:",{"type":19,"tag":20,"props":1454,"children":1455},{},[1456,1458,1464],{"type":24,"value":1457},"Either way, you'll need to make a Thaiphoon-compatible hex dump (replacing ",{"type":19,"tag":674,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":24,"value":1463},"0-0050",{"type":24,"value":1465}," with the i2c bus number followed by a dash then the memory bank number)",{"type":19,"tag":779,"props":1467,"children":1469},{"code":1468,"language":1199,"meta":9,"className":1200,"style":9},"od -Ax -t x1 -v /sys/bus/i2c/drivers/ee1004/0-0050/eeprom\n",[1470],{"type":19,"tag":674,"props":1471,"children":1472},{"__ignoreMap":9},[1473],{"type":19,"tag":1206,"props":1474,"children":1475},{"class":1208,"line":1209},[1476,1481,1486,1491,1496,1501],{"type":19,"tag":1206,"props":1477,"children":1478},{"style":1415},[1479],{"type":24,"value":1480},"od",{"type":19,"tag":1206,"props":1482,"children":1483},{"style":1420},[1484],{"type":24,"value":1485}," -Ax",{"type":19,"tag":1206,"props":1487,"children":1488},{"style":1420},[1489],{"type":24,"value":1490}," -t",{"type":19,"tag":1206,"props":1492,"children":1493},{"style":1219},[1494],{"type":24,"value":1495}," x1",{"type":19,"tag":1206,"props":1497,"children":1498},{"style":1420},[1499],{"type":24,"value":1500}," -v",{"type":19,"tag":1206,"props":1502,"children":1503},{"style":1219},[1504],{"type":24,"value":1505}," /sys/bus/i2c/drivers/ee1004/0-0050/eeprom\n",{"type":19,"tag":20,"props":1507,"children":1508},{},[1509],{"type":24,"value":1510},"You'll see some output like this which you should copy to the clipboard:",{"type":19,"tag":779,"props":1512,"children":1514},{"code":1513},"000000 23 11 0c 02 85 21 00 08 00 00 00 03 09 03 00 00\n000010 00 00 07 0d fc 2b 00 00 6b 6b 6b 11 00 6b f0 0a\n000020 20 08 00 05 00 a8 1b 28 28 00 78 00 14 3c 00 00\n000030 00 00 00 00 00 00 00 00 00 00 00 00 16 36 16 36\n000040 16 36 16 36 00 20 2b 0c 2b 0c 2b 0c 2b 0c 00 00\n000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000070 00 00 00 00 00 00 9c b4 c9 c9 c9 c9 e7 d6 ea 05\n000080 11 11 01 01 00 00 00 00 00 00 00 00 00 00 00 00\n000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 de 27\n000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000140 85 9b 00 00 00 39 82 07 7b 42 4c 53 31 36 47 34\n000150 44 32 34 30 46 53 45 2e 31 36 46 42 44 00 80 2c\n000160 00 44 50 41 47 48 34 47 30 30 31 ff 00 00 00 00\n000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000180 0c 4a 05 20 00 00 00 00 00 94 00 00 07 ff 3f 00\n000190 00 6a 6a 6a 11 00 6b f0 0a 20 08 00 05 00 a8 1b\n0001a0 28 00 00 00 00 00 00 00 00 cf b5 ca ca ca ca d6\n0001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n000200\n",[1515],{"type":19,"tag":674,"props":1516,"children":1517},{"__ignoreMap":9},[1518],{"type":24,"value":1513},{"type":19,"tag":20,"props":1520,"children":1521},{},[1522],{"type":24,"value":1523},"Now either:",{"type":19,"tag":730,"props":1525,"children":1526},{},[1527,1532],{"type":19,"tag":734,"props":1528,"children":1529},{},[1530],{"type":24,"value":1531},"Send it to a Windows-using friend who can run Thaiphoon",{"type":19,"tag":734,"props":1533,"children":1534},{},[1535],{"type":24,"value":1536},"Run Thaiphoon via WINE (which should now work as it won't need low-level hardware access to the SMBus)",{"type":19,"tag":20,"props":1538,"children":1539},{},[1540,1542,1547,1549,1554,1556,1561],{"type":24,"value":1541},"Inside Thaiphoon in the ",{"type":19,"tag":117,"props":1543,"children":1544},{},[1545],{"type":24,"value":1546},"File",{"type":24,"value":1548}," menu, you'll see ",{"type":19,"tag":117,"props":1550,"children":1551},{},[1552],{"type":24,"value":1553},"Import from Clipboard",{"type":24,"value":1555}," which should reveal a lot of information, including the ",{"type":19,"tag":702,"props":1557,"children":1558},{},[1559],{"type":24,"value":1560},"DRAM Die Revision / Process Node",{"type":24,"value":1562}," you're after.",{"type":19,"tag":20,"props":1564,"children":1565},{},[1566,1568,1573],{"type":24,"value":1567},"If you want to read another individuals hex dumps on your Linux box ",{"type":19,"tag":674,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":24,"value":695},{"type":24,"value":1574}," can do that too:",{"type":19,"tag":779,"props":1576,"children":1578},{"code":1577,"language":1199,"meta":9,"className":1200,"style":9},"decode-dimms -x myspd1.hex\n",[1579],{"type":19,"tag":674,"props":1580,"children":1581},{"__ignoreMap":9},[1582],{"type":19,"tag":1206,"props":1583,"children":1584},{"class":1208,"line":1209},[1585,1589,1594],{"type":19,"tag":1206,"props":1586,"children":1587},{"style":1415},[1588],{"type":24,"value":695},{"type":19,"tag":1206,"props":1590,"children":1591},{"style":1420},[1592],{"type":24,"value":1593}," -x",{"type":19,"tag":1206,"props":1595,"children":1596},{"style":1219},[1597],{"type":24,"value":1598}," myspd1.hex\n",{"type":19,"tag":20,"props":1600,"children":1601},{},[1602],{"type":24,"value":1603},"Enjoy!",{"type":19,"tag":20,"props":1605,"children":1606},{},[1607],{"type":19,"tag":117,"props":1608,"children":1609},{},[1610],{"type":24,"value":1611},"[)amien",{"type":19,"tag":132,"props":1613,"children":1614},{},[1615],{"type":24,"value":1616},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":9,"searchDepth":1326,"depth":1326,"links":1618},[1619,1620,1621,1622,1623,1624,1625,1626],{"id":36,"depth":1326,"text":39},{"id":93,"depth":1326,"text":96},{"id":664,"depth":1326,"text":667},{"id":762,"depth":1326,"text":765},{"id":977,"depth":1326,"text":980},{"id":1032,"depth":1326,"text":1035},{"id":1107,"depth":1326,"text":1110},{"id":1439,"depth":1326,"text":1442},"markdown","content:blog:2020:ddr4-information-in-linux.md","content","blog/2020/ddr4-information-in-linux.md","blog/2020/ddr4-information-in-linux","md","/blog/2020/ddr4-information-in-linux/",3072,14,{"src":47,"alt":48,"className":1637},[50],[1639,1643,1647],{"title":1640,"date":1641,"url":1642},"VTX5000: Part 4 - Communications ","2026-05-06T10:19:24.727Z","/blog/2026/vtx5000-part-4-comms-routines/",{"title":1644,"date":1645,"url":1646},"VTX5000: Part 3 - Software ROM","2026-04-15T23:00:00.000Z","/blog/2026/vtx5000-part-3-software-rom/",{"title":1648,"date":1649,"url":1650},"VTX5000: Part 2 - Hardware","2026-03-30T23:00:00.000Z","/blog/2026/prism-vtx5000-part-2/",[1652],{"_path":1653,"_dir":1654,"_draft":6,"_partial":6,"_locale":7,"title":1655,"description":1656,"id":1657,"date":1658,"name":1659,"avatar":1659,"body":1660,"_type":1627,"_id":1668,"_source":1629,"_file":1669,"_stem":1670,"_extension":1632},"/comments/ddr4-information-in-linux/461459ce-0b81-4e74-8f46-4cddba6b9119","ddr4-information-in-linux","461459ce 0b81 4e74 8f46 4cddba6b9119","\"Timing Parameters\" is supposed to give current information, correct?\nMine returns stock DDR4-3200 22-22-22-52 settings (i.e. the ns equivalent), while the 2 DIMMs are actually running 18-18-18-38 (also as detected by Memtest).\nRunning Team Group Elite TED416G3200C2201 on MSI B550M Pro-VDH. Not sure how \"elite\" that is, but surely the cheapest ones I found xD","461459ce-0b81-4e74-8f46-4cddba6b9119","2025-02-19T17:24:07.015Z","batyanko",{"type":16,"children":1661,"toc":1666},[1662],{"type":19,"tag":20,"props":1663,"children":1664},{},[1665],{"type":24,"value":1656},{"title":9,"searchDepth":1326,"depth":1326,"links":1667},[],"content:comments:ddr4-information-in-linux:461459ce-0b81-4e74-8f46-4cddba6b9119.md","comments/ddr4-information-in-linux/461459ce-0b81-4e74-8f46-4cddba6b9119.md","comments/ddr4-information-in-linux/461459ce-0b81-4e74-8f46-4cddba6b9119",1779224642201]