summaryrefslogtreecommitdiffstats
path: root/Documentation/mysteries_intel.txt
blob: 55921cfce8526e2cb7405ed77cac5457d87af163 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
= BBAR on ICH8 =
 There is no sign of BBAR (BIOS Base Address Configuration Register) in the
 public datasheet (or specification update) of the ICH8. Also, the offset of
 that register has changed between ICH7 (SPIBAR + 50h) and ICH9 (SPIBAR +
 A0h), so we have no clue if or where it is on ICH8. Out current policy is to
 not touch it at all and assume/hope it is 0.

= Accesses beyond region bounds in descriptor mode =
 Intel's flash image tool will always expand the last region so that it covers
 the whole flash chip, but some boards ship with a different configuration.
 It seems that in descriptor mode all addresses outside the used regions can not
 be accessed whatsoever. This is not specified anywhere publicly as far as we
 could tell. flashrom does not handle this explicitly yet. It will just fail
 when trying to touch an address outside of any region.
 See also http://www.flashrom.org/pipermail/flashrom/2011-August/007606.html

= Unlocking the ME region =
 If the ME region is locked by the FRAP register in descriptor mode, the host
 software is not allowed to read or write any address inside that region. There
 are different ways to unlock access:

 - A pin strap: Flash Descriptor Security Override Strap (as indicated by the
   Flash Descriptor Override Pin Strap Status (FDOPSS) in HSFS. That pin is
   probably not accessible to end users on consumer boards (every Intel doc i
   have seen stresses that this is for debugging in manufacturing only and
   should not be available for end users).
   The ME indicates this in bits [19:16] (Operation Mode) in the HFS register of
   the HECI/MEI PCI device by setting them to 4 (SECOVR_JMPR) [MODE_CTRL].

 - Intel Management Engine BIOS Extension (MEBx) Disable
   This option may be available to end users on some boards usually accessible
   by hitting ctrl+p after BIOS POST. Quote: "'Disabling' the Intel ME does not
   really disable it: it causes the Intel ME code to be halted at an early stage
   of the Intel ME's booting so that the system has no traffic originating from
   the Intel ME on any of the buses." [MEBX] The ME indicates this in
   bits [19:16] (Operation Mode) in the HFS register of the HECI/MEI PCI device
   by setting them to 3 (Soft Temporary Disable) [MODE_CTRL].

 - Previous to Ibex Peak/5 Series chipsets removing the DIMM from slot (or
   channel?) #0 disables the ME completely, which may give the host access to
   the ME region.

 - HMRFPO (Host ME Region Flash Protection Override) Enable MEI command
   This is the most interesting one because it allows to temporarily disable
   the ME region protection by software. The ME indicates this in bits [19:16]
   (Operation Mode) in the HFS register of the HECI/MEI PCI device by setting
   them to 5 (SECOVER_MEI_MSG) [MODE_CTRL].

== MEI/HECI ==
 Communication between the host software and the different services provided by
 the ME is done via a packet-based protocol that uses MMIO transfers to one or
 more virtual PCI devices. Upon this layer there exist various services that can
 be used to read out hardware management values (e.g. temperatures, fan speeds
 etc.). The lower levels of that protocol are well documented:
 The locations/offsets of the PCI MMIO registers are noted in the chipset
 datasheets. The actually communication is documented in a whitepaper [DCMI] and
 an outdated as well as a current Linux kernel implementation (currently in
 staging/ exist [KERNEL]. There exists a patch that re-implements this in user
 space (as part of flashrom).
 
== Problems ==
 The problem is that only very few higher level protocols are documented publicly,
 especially the bunch of messages that contain the HMRFPO commands is probably
 well protected and only documented in ME-specific docs and the BIOS writer's
 guides. We are aware of a few leaked documents though that give us a few hints
 about it, but nothing substantial regarding its implementation.
 
 The documents are somewhat contradicting each other in various points which
 might be due to factual changes in process of time or due to the different
 capabilities of the ME firmwares, example:
 
 Intel's Flash Programming Tool (FPT) "automatically stops ME writing to SPI
 ME Region, to prevent both writing at the same time, causing data corruption." [ME8]
 
 "FPT is not HMRFPO-capable, so needs [the help of the FDOPS pin] HDA_SDO if
 used to update the ME Region." [SPS]
 
 When looking at the various ME firmware editions (and different chipsets), things
 get very unclear. Some docs say that HMRFPO needs to be sent before End-of-POST
 (EOP), others say that the ME region can be updated in the field or that some
 vendor tools use it for updates. This needs to be investigated further before
 drawing any conclusion.

[MODE_CTRL] Client Platform Enabling Tour: Platform Software
            Document Number: 439167, Revision 1.2, page 52
[MEBX]      Intel Management Engine BIOS Extension (MEBX) User's Guide
            Revision 1.2, Section 3.1 and 3.5
[DCMI]      DCMI Host Interface Specification
            Revision 1.0
[KERNEL]    http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=tree;f=drivers/staging/mei;hb=HEAD
[SPI_PROG]  Ibex Peak SPI Programming Guide
            Document Number: 403598, Revision 1.3, page 79
[ME8]       Manufacturing with Intel Management Engine (ME) Firmware 8.X on Intel 7 Series
            Revision 2.0, page 59
[SPS]       Manufacturing with Intel Management Engine (ME) on Intel C600 Series Chipset 1
            for Romley Server 2 Platforms using Server Platform Services (SPS) Firmware
            Revision 2.2, page 51
OpenPOWER on IntegriCloud