| ====================================== | 
 | IBM's Flexible Service Interface (FSI) | 
 | ====================================== | 
 |  | 
 | The QEMU FSI emulation implements hardware interfaces between ASPEED SOC, FSI | 
 | master/slave and the end engine. | 
 |  | 
 | FSI is a point-to-point two wire interface which is capable of supporting | 
 | distances of up to 4 meters. FSI interfaces have been used successfully for | 
 | many years in IBM servers to attach IBM Flexible Support Processors(FSP) to | 
 | CPUs and IBM ASICs. | 
 |  | 
 | FSI allows a service processor access to the internal buses of a host POWER | 
 | processor to perform configuration or debugging. FSI has long existed in POWER | 
 | processes and so comes with some baggage, including how it has been integrated | 
 | into the ASPEED SoC. | 
 |  | 
 | Working backwards from the POWER processor, the fundamental pieces of interest | 
 | for the implementation are: (see the `FSI specification`_ for more details) | 
 |  | 
 | 1. The Common FRU Access Macro (CFAM), an address space containing various | 
 |    "engines" that drive accesses on buses internal and external to the POWER | 
 |    chip. Examples include the SBEFIFO and I2C masters. The engines hang off of | 
 |    an internal Local Bus (LBUS) which is described by the CFAM configuration | 
 |    block. | 
 |  | 
 | 2. The FSI slave: The slave is the terminal point of the FSI bus for FSI | 
 |    symbols addressed to it. Slaves can be cascaded off of one another. The | 
 |    slave's configuration registers appear in address space of the CFAM to | 
 |    which it is attached. | 
 |  | 
 | 3. The FSI master: A controller in the platform service processor (e.g. BMC) | 
 |    driving CFAM engine accesses into the POWER chip. At the hardware level | 
 |    FSI is a bit-based protocol supporting synchronous and DMA-driven accesses | 
 |    of engines in a CFAM. | 
 |  | 
 | 4. The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in POWER | 
 |    processors. This now makes an appearance in the ASPEED SoC due to tight | 
 |    integration of the FSI master IP with the OPB, mainly the existence of an | 
 |    MMIO-mapping of the CFAM address straight onto a sub-region of the OPB | 
 |    address space. | 
 |  | 
 | 5. An APB-to-OPB bridge enabling access to the OPB from the ARM core in the | 
 |    AST2600. Hardware limitations prevent the OPB from being directly mapped | 
 |    into APB, so all accesses are indirect through the bridge. | 
 |  | 
 | The LBUS is modelled to maintain the qdev bus hierarchy and to take advantages | 
 | of the object model to automatically generate the CFAM configuration block. | 
 | The configuration block presents engines in the order they are attached to the | 
 | CFAM's LBUS. Engine implementations should subclass the LBusDevice and set the | 
 | 'config' member of LBusDeviceClass to match the engine's type. | 
 |  | 
 | CFAM designs offer a lot of flexibility, for instance it is possible for a | 
 | CFAM to be simultaneously driven from multiple FSI links. The modeling is not | 
 | so complete; it's assumed that each CFAM is attached to a single FSI slave (as | 
 | a consequence the CFAM subclasses the FSI slave). | 
 |  | 
 | As for FSI, its symbols and wire-protocol are not modelled at all. This is not | 
 | necessary to get FSI off the ground thanks to the mapping of the CFAM address | 
 | space onto the OPB address space - the models follow this directly and map the | 
 | CFAM memory region into the OPB's memory region. | 
 |  | 
 | The following commands start the ``rainier-bmc`` machine with built-in FSI | 
 | model. There are no model specific arguments. Please check this document to | 
 | learn more about Aspeed ``rainier-bmc`` machine: (:doc:`../../system/arm/aspeed`) | 
 |  | 
 | .. code-block:: console | 
 |  | 
 |   qemu-system-arm -M rainier-bmc -nographic \ | 
 |   -kernel fitImage-linux.bin \ | 
 |   -dtb aspeed-bmc-ibm-rainier.dtb \ | 
 |   -initrd obmc-phosphor-initramfs.rootfs.cpio.xz \ | 
 |   -drive file=obmc-phosphor-image.rootfs.wic.qcow2,if=sd,index=2 \ | 
 |   -append "rootwait console=ttyS4,115200n8 root=PARTLABEL=rofs-a" | 
 |  | 
 | The implementation appears as following in the qemu device tree: | 
 |  | 
 | .. code-block:: console | 
 |  | 
 |   (qemu) info qtree | 
 |   bus: main-system-bus | 
 |     type System | 
 |     ... | 
 |     dev: aspeed.apb2opb, id "" | 
 |       gpio-out "sysbus-irq" 1 | 
 |       mmio 000000001e79b000/0000000000001000 | 
 |       bus: opb.1 | 
 |         type opb | 
 |         dev: fsi.master, id "" | 
 |           bus: fsi.bus.1 | 
 |             type fsi.bus | 
 |             dev: cfam.config, id "" | 
 |             dev: cfam, id "" | 
 |               bus: lbus.1 | 
 |                 type lbus | 
 |                 dev: scratchpad, id "" | 
 |                   address = 0 (0x0) | 
 |       bus: opb.0 | 
 |         type opb | 
 |         dev: fsi.master, id "" | 
 |           bus: fsi.bus.0 | 
 |             type fsi.bus | 
 |             dev: cfam.config, id "" | 
 |             dev: cfam, id "" | 
 |               bus: lbus.0 | 
 |                 type lbus | 
 |                 dev: scratchpad, id "" | 
 |                   address = 0 (0x0) | 
 |  | 
 | pdbg is a simple application to allow debugging of the host POWER processors | 
 | from the BMC. (see the `pdbg source repository`_ for more details) | 
 |  | 
 | .. code-block:: console | 
 |  | 
 |   root@p10bmc:~# pdbg -a getcfam 0x0 | 
 |   p0: 0x0 = 0xc0022d15 | 
 |  | 
 | .. _FSI specification: | 
 |    https://openpowerfoundation.org/specifications/fsi/ | 
 |  | 
 | .. _pdbg source repository: | 
 |    https://github.com/open-power/pdbg |