xref: /openbmc/linux/Documentation/hid/amd-sfh-hid.rst (revision 907286d1420d28bead47da37b9a081377c070322)
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