1*907286d1SJiri Kosina.. SPDX-License-Identifier: GPL-2.0 2*907286d1SJiri Kosina 3*907286d1SJiri Kosina 4*907286d1SJiri KosinaAMD Sensor Fusion Hub 5*907286d1SJiri Kosina===================== 6*907286d1SJiri KosinaAMD Sensor Fusion Hub (SFH) is part of an SOC starting from Ryzen based platforms. 7*907286d1SJiri KosinaThe solution is working well on several OEM products. AMD SFH uses HID over PCIe bus. 8*907286d1SJiri KosinaIn terms of architecture it resembles ISH, however the major difference is all 9*907286d1SJiri Kosinathe HID reports are generated as part of the kernel driver. 10*907286d1SJiri Kosina 11*907286d1SJiri Kosina1. Block Diagram 12*907286d1SJiri Kosina================ 13*907286d1SJiri Kosina 14*907286d1SJiri Kosina:: 15*907286d1SJiri Kosina 16*907286d1SJiri Kosina --------------------------------- 17*907286d1SJiri Kosina | HID User Space Applications | 18*907286d1SJiri Kosina - ------------------------------- 19*907286d1SJiri Kosina 20*907286d1SJiri Kosina --------------------------------------------- 21*907286d1SJiri Kosina --------------------------------- 22*907286d1SJiri Kosina | HID Core | 23*907286d1SJiri Kosina --------------------------------- 24*907286d1SJiri Kosina 25*907286d1SJiri Kosina --------------------------------- 26*907286d1SJiri Kosina | AMD HID Transport | 27*907286d1SJiri Kosina --------------------------------- 28*907286d1SJiri Kosina 29*907286d1SJiri Kosina -------------------------------- 30*907286d1SJiri Kosina | AMD HID Client | 31*907286d1SJiri Kosina | with HID Report Generator| 32*907286d1SJiri Kosina -------------------------------- 33*907286d1SJiri Kosina 34*907286d1SJiri Kosina -------------------------------- 35*907286d1SJiri Kosina | AMD MP2 PCIe Driver | 36*907286d1SJiri Kosina -------------------------------- 37*907286d1SJiri Kosina OS 38*907286d1SJiri Kosina --------------------------------------------- 39*907286d1SJiri Kosina Hardware + Firmware 40*907286d1SJiri Kosina -------------------------------- 41*907286d1SJiri Kosina | SFH MP2 Processor | 42*907286d1SJiri Kosina -------------------------------- 43*907286d1SJiri Kosina 44*907286d1SJiri Kosina 45*907286d1SJiri KosinaAMD HID Transport Layer 46*907286d1SJiri Kosina----------------------- 47*907286d1SJiri KosinaAMD SFH transport is also implemented as a bus. Each client application executing in the AMD MP2 is 48*907286d1SJiri Kosinaregistered as a device on this bus. Here: MP2 which is an ARM core connected to x86 for processing 49*907286d1SJiri Kosinasensor data. The layer, which binds each device (AMD SFH HID driver) identifies the device type and 50*907286d1SJiri Kosinaregisters with the hid core. Transport layer attach a constant "struct hid_ll_driver" object with 51*907286d1SJiri Kosinaeach device. Once a device is registered with HID core, the callbacks provided via this struct are 52*907286d1SJiri Kosinaused by HID core to communicate with the device. AMD HID Transport layer implements the synchronous calls. 53*907286d1SJiri Kosina 54*907286d1SJiri KosinaAMD HID Client Layer 55*907286d1SJiri Kosina-------------------- 56*907286d1SJiri KosinaThis layer is responsible to implement HID request and descriptors. As firmware is OS agnostic, HID 57*907286d1SJiri Kosinaclient layer fills the HID request structure and descriptors. HID client layer is complex as it is 58*907286d1SJiri Kosinainterface between MP2 PCIe layer and HID. HID client layer initialized the MP2 PCIe layer and holds 59*907286d1SJiri Kosinathe instance of MP2 layer. It identifies the number of sensors connected using MP2-PCIe layer. Base 60*907286d1SJiri Kosinaon that allocates the DRAM address for each and every sensor and pass it to MP2-PCIe driver.On 61*907286d1SJiri Kosinaenumeration of each the sensor, client layer fills the HID Descriptor structure and HID input repor 62*907286d1SJiri Kosinastructure. HID Feature report structure is optional. The report descriptor structure varies from 63*907286d1SJiri Kosinasensor to sensor. 64*907286d1SJiri Kosina 65*907286d1SJiri KosinaAMD MP2 PCIe layer 66*907286d1SJiri Kosina------------------ 67*907286d1SJiri KosinaMP2 PCIe Layer is responsible for making all transactions with the firmware over PCIe. 68*907286d1SJiri KosinaThe connection establishment between firmware and PCIe happens here. 69*907286d1SJiri Kosina 70*907286d1SJiri KosinaThe communication between X86 and MP2 is split into three parts. 71*907286d1SJiri Kosina1. Command transfer via the C2P mailbox registers. 72*907286d1SJiri Kosina2. Data transfer via DRAM. 73*907286d1SJiri Kosina3. Supported sensor info via P2C registers. 74*907286d1SJiri Kosina 75*907286d1SJiri KosinaCommands are sent to MP2 using C2P Mailbox registers. Writing into C2P Message registers generate 76*907286d1SJiri Kosinainterrupt to MP2. The client layer allocates the physical memory and the same is sent to MP2 via 77*907286d1SJiri Kosinathe PCI layer. MP2 firmware writes the command output to the access DRAM memory which the client 78*907286d1SJiri Kosinalayer has allocated. Firmware always writes minimum of 32 bytes into DRAM. So as a protocol driver 79*907286d1SJiri Kosinashall allocate minimum of 32 bytes DRAM space. 80*907286d1SJiri Kosina 81*907286d1SJiri KosinaEnumeration and Probing flow 82*907286d1SJiri Kosina---------------------------- 83*907286d1SJiri Kosina:: 84*907286d1SJiri Kosina 85*907286d1SJiri Kosina HID AMD AMD AMD -PCIe MP2 86*907286d1SJiri Kosina Core Transport Client layer layer FW 87*907286d1SJiri Kosina | | | | | 88*907286d1SJiri Kosina | | | on Boot Driver Loaded | 89*907286d1SJiri Kosina | | | | | 90*907286d1SJiri Kosina | | | MP2-PCIe Int | 91*907286d1SJiri Kosina | | | | | 92*907286d1SJiri Kosina | | |---Get Number of sensors-> | | 93*907286d1SJiri Kosina | | | Read P2C | 94*907286d1SJiri Kosina | | | Register | 95*907286d1SJiri Kosina | | | | | 96*907286d1SJiri Kosina | | | Loop(for No of Sensors) | | 97*907286d1SJiri Kosina | | |----------------------| | | 98*907286d1SJiri Kosina | | | Create HID Descriptor| | | 99*907286d1SJiri Kosina | | | Create Input report | | | 100*907286d1SJiri Kosina | | | Descriptor Map | | | 101*907286d1SJiri Kosina | | | the MP2 FW Index to | | | 102*907286d1SJiri Kosina | | | HID Index | | | 103*907286d1SJiri Kosina | | | Allocate the DRAM | Enable | 104*907286d1SJiri Kosina | | | address | Sensors | 105*907286d1SJiri Kosina | | |----------------------| | | 106*907286d1SJiri Kosina | | HID transport| | Enable | 107*907286d1SJiri Kosina | |<--Probe------| |---Sensor CMD--> | 108*907286d1SJiri Kosina | | Create the | | | 109*907286d1SJiri Kosina | | HID device | | | 110*907286d1SJiri Kosina | | (MFD) | | | 111*907286d1SJiri Kosina | | by Populating| | | 112*907286d1SJiri Kosina | | the HID | | | 113*907286d1SJiri Kosina | | ll_driver | | | 114*907286d1SJiri Kosina | HID | | | | 115*907286d1SJiri Kosina | add | | | | 116*907286d1SJiri Kosina |Device | | | | 117*907286d1SJiri Kosina |<------------- | | | | 118*907286d1SJiri Kosina 119*907286d1SJiri Kosina 120*907286d1SJiri KosinaData Flow from Application to the AMD SFH Driver 121*907286d1SJiri Kosina------------------------------------------------ 122*907286d1SJiri Kosina 123*907286d1SJiri Kosina:: 124*907286d1SJiri Kosina 125*907286d1SJiri Kosina | | | | | 126*907286d1SJiri Kosina | | | | | 127*907286d1SJiri Kosina | | | | | 128*907286d1SJiri Kosina | | | | | 129*907286d1SJiri Kosina | | | | | 130*907286d1SJiri Kosina |HID_req | | | | 131*907286d1SJiri Kosina |get_report | | | | 132*907286d1SJiri Kosina |------------->| | | | 133*907286d1SJiri Kosina | | HID_get_input| | | 134*907286d1SJiri Kosina | | report | | | 135*907286d1SJiri Kosina | |------------->|------------------------| | | 136*907286d1SJiri Kosina | | | Read the DRAM data for| | | 137*907286d1SJiri Kosina | | | requested sensor and | | | 138*907286d1SJiri Kosina | | | create the HID input | | | 139*907286d1SJiri Kosina | | | report | | | 140*907286d1SJiri Kosina | | |------------------------| | | 141*907286d1SJiri Kosina | |Data received | | | 142*907286d1SJiri Kosina | | in HID report| | | 143*907286d1SJiri Kosina To |<-------------|<-------------| | | 144*907286d1SJiri Kosina Applications| | | | | 145*907286d1SJiri Kosina <-------| | | | | 146