From 438b463a8f5f739eb02422a3d00b8dfcbeefc2e9 Mon Sep 17 00:00:00 2001 From: Philipp Deppenwiese Date: Sun, 13 May 2018 15:47:18 +0200 Subject: Documentation: Update index.md and move files * Add more subdirectories and index.mds. * Move "getting started" and "lessons" into sub-directories. * Move "NativeRaminit" into northbridge/intel/sandybridge folder. * Move "MultiProcessorInit" into soc/intel/icelake folder. * Reference new files Change-Id: I78c3ec0e8bcc342686277ae141a88d0486680978 Signed-off-by: Philipp Deppenwiese Signed-off-by: Patrick Rudolph Reviewed-on: https://review.coreboot.org/26262 Reviewed-by: Patrick Georgi Reviewed-by: Philipp Deppenwiese Tested-by: build bot (Jenkins) --- .../northbridge/intel/sandybridge/nri_freq.md | 165 +++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 Documentation/northbridge/intel/sandybridge/nri_freq.md (limited to 'Documentation/northbridge/intel/sandybridge/nri_freq.md') diff --git a/Documentation/northbridge/intel/sandybridge/nri_freq.md b/Documentation/northbridge/intel/sandybridge/nri_freq.md new file mode 100644 index 0000000000..d8b73b3aec --- /dev/null +++ b/Documentation/northbridge/intel/sandybridge/nri_freq.md @@ -0,0 +1,165 @@ +# Frequency selection + +## Introduction +This chapter explains the frequency selection done on Sandybride and Ivybridge. + +## Definitions +```eval_rst ++---------+-------------------------------------------------------------------+------------+--------------+ +| Symbol | Description | Units | Valid region | ++=========+===================================================================+============+==============+ +| SCK | DRAM system clock cycle time | s | | ++---------+-------------------------------------------------------------------+------------+--------------+ +| tCK | DRAM system clock cycle time | 1/256th ns | | ++---------+-------------------------------------------------------------------+------------+--------------+ +| DCK | Data clock cycle time: The time between two SCK clock edges | s | | ++---------+-------------------------------------------------------------------+------------+--------------+ +| SPD | Manufacturer set memory timings located on an EEPROM on every DIMM| bytes | | ++---------+-------------------------------------------------------------------+------------+--------------+ +| REFCK | Reference clock, either 100 or 133 | MHz | 100, 133 | ++---------+-------------------------------------------------------------------+------------+--------------+ +| MULT | DRAM PLL multiplier | | [3-12] | ++---------+-------------------------------------------------------------------+------------+--------------+ +| XMP | Extreme Memory Profiles | | | ++---------+-------------------------------------------------------------------+------------+--------------+ +``` +## SPD +The [SPD](https://de.wikipedia.org/wiki/Serial_Presence_Detect "Serial Presence Detect") +located on every DIMM is factory program with various timings. One of them +specifies the maximum clock frequency the DIMM should be used with. The +operating frequency is stores as fixed point value (tCK), rounded to the next +smallest supported operating frequency. Some +[SPD](https://de.wikipedia.org/wiki/Serial_Presence_Detect "Serial Presence Detect") +contains additional and optional +[XMP](https://de.wikipedia.org/wiki/Extreme_Memory_Profile "Extreme Memory Profile") +data, that stores so called "performance" modes, that advertises higher clock +frequencies. + +## XMP profiles +At time of writing coreboot's raminit is able to parse XMP profile 1 and 2. +Only **XMP profile 1** is being used in case it advertises: +* 1.5V operating voltage +* The channel's installed DIMM count doesn't exceed the XMP coded limit + +In case the XMP profile doesn't fullfill those limits, the regular SPD will be +used. +> **Note:** XMP Profiles are supported since coreboot 4.4. + +It is possible to ignore the max DIMM count limit set by XMP profiles. +By activating Kconfig option `NATIVE_RAMINIT_IGNORE_XMP_MAX_DIMMS` it is +possible to install two DIMMs per channel, even if XMP tells you not to do. + +> **Note:** Ignoring XMP Profiles limit is supported since coreboot 4.7. + +## Soft fuses +Every board manufacturer does program "soft" fuses to indicate the maximum +DRAM frequency supported. However, those fuses don't set a limit in hardware +and thus are called "soft" fuses, as it is possible to ignore them. + +> **Note:** Ignoring the fuses might cause system instability ! + +On Sandy Bride *CAPID0_A* is being read, and on Ivybridge *CAPID0_B* is being +read. coreboot reads those registers and honors the limit in case the Kconfig +option `CONFIG_NATIVE_RAMINIT_IGNORE_MAX_MEM_FUSES` wasn't set. +Power users that want to let their RAM run at DRAM's "stock" frequency need to +enable the Kconfig symbol. + +It is possible to override the soft fuses limit by using a board-specific +[devicetree](#devicetree) setting. + +> **Note:** Ignoring max mem freq. fuses is supported since coreboot 4.7. + +## Hard fuses +"Hard" fuses are programmed by Intel and limit the maximum frequency that can +be used on a given CPU/board/chipset. At time of writing there's no register +to read this limit, before trying to set a given DRAM frequency. The memory PLL +won't lock, indicating that the chosen memory multiplier isn't available. In +this case coreboot tries the next smaller memory multiplier until the PLL will +lock. + +## Devicetree +The devicetree register `max_mem_clock_mhz` overrides the "soft" fuses set +by the board manufacturer. + +By using this register it's possible to force a minimum operating frequency. + +## Reference clock +While Sandybride supports 133 MHz reference clock (REFCK), Ivy Bridge also +supports 100 MHz reference clock. The reference clock is multiplied by the DRAM +multiplier to select the DRAM frequency (SCK) by the following formula: + + REFCK * MULT = 1 / DCK + +> **Note:** Since coreboot 4.6 Ivy Bridge supports 100MHz REFCK. + +## Sandy Bride's supported frequencies +```eval_rst ++------------+-----------+------------------+-------------------------+---------------+ +| SCK [Mhz] | DDR [Mhz] | Mutiplier (MULT) | Reference clock (REFCK) | Comment | ++============+===========+==================+=========================+===============+ +| 400 | DDR3-800 | 3 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 533 | DDR3-1066 | 4 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 666 | DDR3-1333 | 5 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 800 | DDR3-1600 | 6 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 933 | DDR3-1866 | 7 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 1066 | DDR3-2166 | 8 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +``` + +## Ivybridge's supported frequencies +```eval_rst ++------------+-----------+------------------+-------------------------+---------------+ +| SCK [Mhz] | DDR [Mhz] | Mutiplier (MULT) | Reference clock (REFCK) | Comment | ++============+===========+==================+=========================+===============+ +| 400 | DDR3-800 | 3 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 533 | DDR3-1066 | 4 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 666 | DDR3-1333 | 5 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 800 | DDR3-1600 | 6 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 933 | DDR3-1866 | 7 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 1066 | DDR3-2166 | 8 | 133 MHz | | ++------------+-----------+------------------+-------------------------+---------------+ +| 700 | DDR3-1400 | 7 | 100 MHz | '1 | ++------------+-----------+------------------+-------------------------+---------------+ +| 800 | DDR3-1600 | 8 | 100 MHz | '1 | ++------------+-----------+------------------+-------------------------+---------------+ +| 900 | DDR3-1800 | 9 | 100 MHz | '1 | ++------------+-----------+------------------+-------------------------+---------------+ +| 1000 | DDR3-2000 | 10 | 100 MHz | '1 | ++------------+-----------+------------------+-------------------------+---------------+ +| 1100 | DDR3-2200 | 11 | 100 MHz | '1 | ++------------+-----------+------------------+-------------------------+---------------+ +| 1200 | DDR3-2400 | 12 | 100 MHz | '1 | ++------------+-----------+------------------+-------------------------+---------------+ +``` +> '1: since coreboot 4.6 + +## Multiplier selection +coreboot select the maximum frequency to operate at by the following formula: +``` +if devicetree's max_mem_clock_mhz > 0: + freq_max := max_mem_clock_mhz +else: + freq_max := soft_fuse_max_mhz + +for i in SPDs: + freq_max := MIN(freq_max, ddr_spd_max_mhz[i]) +``` + +As you can see, by using DIMMs with different maximum DRAM frequencies, the +slowest DIMMs' frequency will be selected, to prevent over-clocking it. + +The selected frequency gives the PLL multiplier to operate at. In case the PLL +locks (see Take me to [Hard fuses](#hard_fuses)) the frequency will be used for +all DIMMs. At this point it's not possible to change the multiplier again, +until the system has been powered off. In case the PLL doesn't lock, the next +smaller multiplier will be used until a working multiplier will be found. -- cgit v1.2.3