146 lines
7.6 KiB
ReStructuredText
146 lines
7.6 KiB
ReStructuredText
.. 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| | | | |
|
|
<-------| | | | |
|