# Multiple Processor (MP) Initialization

This section is intended to document the purpose of performing multiprocessor
initialization and its possible ways in coreboot space.

Entire CPU multiprocessor initialization can be divided into two parts
1. BSP (Boot Strap Processor) Initialization
2. AP (Application Processor) Initialization

* [Multiple Processor Init](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf) - section 8.4

## Problem Statement

1. coreboot is capable enough to handle multiprocessor initialization on
IA platforms.

2. With restricted CPU programming logic, there might be some cases where
certain feature programming can't be open sourced at early development of SOC.

Platform code might need to compromise on those closed source nature of CPU
programming if we don't plan to provide an alternate interface which can be
used by coreboot to get rid of such close sourced CPU programming.

## Possible Solution Space

Considering these facts, there are 3 possible solutions to perform MP
initialization from coreboot + FSP space.

1. coreboot to perform complete MP initialization by its own. This includes
BSP and AP programming of CPU features mostly non-restricted one. This is
the default configuration. Most SoCs like SKL, KBL, APL are okay to make use
of this MP initialization method.

2. Alternatively, SoC users also can skip coreboot doing MP initialization
and make use of FSP binary to perform same task. This can be achieved by using
Kconfig name USE_INTEL_FSP_MP_INIT. As of 2019 all Google Chrome products are
using coreboot native MP initialization mechanism and some IOTG platforms
are using FSP MP Init solution as well.

3. Final option is to let coreboot publish PPI (PEIM to PEIM Interface) to
perform some restricted (closed source) CPU programming. In that case,
coreboot will use its native MP init and additionally publish MP service PPI
for FSP to consume. FSP will execute some CPU programming using same PPI
service from its own context. One can use
USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI Kconfig to perform this
operation.

For latest SoCs like CNL, WHL, ICL, etc, its recommended to make use of this
option in order to perform SGX and C6DRAM enabling.

Typically all platforms supported by FSP 2.1 specification will have
external PPI service feature implemented.

## References
```{toctree}
:maxdepth: 1

PPI <../fsp/ppi/ppi.md>
MP Service PPI <../fsp/ppi/mp_service_ppi.md>
```