123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- .. SPDX-License-Identifier: GPL-2.0
- AMD Sensor Fusion Hub
- =====================
- AMD Sensor Fusion Hub (SFH) is part of an SOC starting from Ryzen-based platforms.
- The solution is working well on several OEM products. AMD SFH uses HID over PCIe bus.
- In terms of architecture it resembles ISH, however the major difference is all
- the HID reports are generated as part of the kernel driver.
- Block Diagram
- -------------
- ::
- ---------------------------------
- | HID User Space Applications |
- - -------------------------------
- ---------------------------------------------
- ---------------------------------
- | HID Core |
- ---------------------------------
- ---------------------------------
- | AMD HID Transport |
- ---------------------------------
- --------------------------------
- | AMD HID Client |
- | with HID Report Generator|
- --------------------------------
- --------------------------------
- | AMD MP2 PCIe Driver |
- --------------------------------
- OS
- ---------------------------------------------
- Hardware + Firmware
- --------------------------------
- | SFH MP2 Processor |
- --------------------------------
- AMD HID Transport Layer
- -----------------------
- AMD SFH transport is also implemented as a bus. Each client application executing in the AMD MP2 is
- registered as a device on this bus. Here, MP2 is an ARM core connected to x86 for processing
- sensor data. The layer, which binds each device (AMD SFH HID driver) identifies the device type and
- registers with the HID core. Transport layer attaches a constant "struct hid_ll_driver" object with
- each device. Once a device is registered with HID core, the callbacks provided via this struct are
- used by HID core to communicate with the device. AMD HID Transport layer implements the synchronous calls.
- AMD HID Client Layer
- --------------------
- This layer is responsible to implement HID requests and descriptors. As firmware is OS agnostic, HID
- client layer fills the HID request structure and descriptors. HID client layer is complex as it is
- interface between MP2 PCIe layer and HID. HID client layer initializes the MP2 PCIe layer and holds
- the instance of MP2 layer. It identifies the number of sensors connected using MP2-PCIe layer. Based
- on that allocates the DRAM address for each and every sensor and passes it to MP2-PCIe driver. On
- enumeration of each sensor, client layer fills the HID Descriptor structure and HID input report
- structure. HID Feature report structure is optional. The report descriptor structure varies from
- sensor to sensor.
- AMD MP2 PCIe layer
- ------------------
- MP2 PCIe Layer is responsible for making all transactions with the firmware over PCIe.
- The connection establishment between firmware and PCIe happens here.
- The communication between X86 and MP2 is split into three parts.
- 1. Command transfer via the C2P mailbox registers.
- 2. Data transfer via DRAM.
- 3. Supported sensor info via P2C registers.
- Commands are sent to MP2 using C2P Mailbox registers. Writing into C2P Message registers generates
- interrupt to MP2. The client layer allocates the physical memory and the same is sent to MP2 via
- the PCI layer. MP2 firmware writes the command output to the access DRAM memory which the client
- layer has allocated. Firmware always writes minimum of 32 bytes into DRAM. So as a protocol driver
- shall allocate minimum of 32 bytes DRAM space.
- Enumeration and Probing flow
- ----------------------------
- ::
- HID AMD AMD AMD -PCIe MP2
- Core Transport Client layer layer FW
- | | | | |
- | | | on Boot Driver Loaded |
- | | | | |
- | | | MP2-PCIe Int |
- | | | | |
- | | |---Get Number of sensors-> | |
- | | | Read P2C |
- | | | Register |
- | | | | |
- | | | Loop(for No of Sensors) | |
- | | |----------------------| | |
- | | | Create HID Descriptor| | |
- | | | Create Input report | | |
- | | | Descriptor Map | | |
- | | | the MP2 FW Index to | | |
- | | | HID Index | | |
- | | | Allocate the DRAM | Enable |
- | | | address | Sensors |
- | | |----------------------| | |
- | | HID transport| | Enable |
- | |<--Probe------| |---Sensor CMD--> |
- | | Create the | | |
- | | HID device | | |
- | | (MFD) | | |
- | | by Populating| | |
- | | the HID | | |
- | | ll_driver | | |
- | HID | | | |
- | add | | | |
- |Device | | | |
- |<------------- | | | |
- Data Flow from Application to the AMD SFH Driver
- ------------------------------------------------
- ::
- | | | | |
- | | | | |
- | | | | |
- | | | | |
- | | | | |
- |HID_req | | | |
- |get_report | | | |
- |------------->| | | |
- | | HID_get_input| | |
- | | report | | |
- | |------------->|------------------------| | |
- | | | Read the DRAM data for| | |
- | | | requested sensor and | | |
- | | | create the HID input | | |
- | | | report | | |
- | | |------------------------| | |
- | |Data received | | |
- | | in HID report| | |
- To |<-------------|<-------------| | |
- Applications| | | | |
- <-------| | | | |
|