xref: /openbmc/linux/Documentation/mhi/mhi.rst (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
1*9435dc3bSManivannan Sadhasivam.. SPDX-License-Identifier: GPL-2.0
2*9435dc3bSManivannan Sadhasivam
3*9435dc3bSManivannan Sadhasivam==========================
4*9435dc3bSManivannan SadhasivamMHI (Modem Host Interface)
5*9435dc3bSManivannan Sadhasivam==========================
6*9435dc3bSManivannan Sadhasivam
7*9435dc3bSManivannan SadhasivamThis document provides information about the MHI protocol.
8*9435dc3bSManivannan Sadhasivam
9*9435dc3bSManivannan SadhasivamOverview
10*9435dc3bSManivannan Sadhasivam========
11*9435dc3bSManivannan Sadhasivam
12*9435dc3bSManivannan SadhasivamMHI is a protocol developed by Qualcomm Innovation Center, Inc. It is used
13*9435dc3bSManivannan Sadhasivamby the host processors to control and communicate with modem devices over high
14*9435dc3bSManivannan Sadhasivamspeed peripheral buses or shared memory. Even though MHI can be easily adapted
15*9435dc3bSManivannan Sadhasivamto any peripheral buses, it is primarily used with PCIe based devices. MHI
16*9435dc3bSManivannan Sadhasivamprovides logical channels over the physical buses and allows transporting the
17*9435dc3bSManivannan Sadhasivammodem protocols, such as IP data packets, modem control messages, and
18*9435dc3bSManivannan Sadhasivamdiagnostics over at least one of those logical channels. Also, the MHI
19*9435dc3bSManivannan Sadhasivamprotocol provides data acknowledgment feature and manages the power state of the
20*9435dc3bSManivannan Sadhasivammodems via one or more logical channels.
21*9435dc3bSManivannan Sadhasivam
22*9435dc3bSManivannan SadhasivamMHI Internals
23*9435dc3bSManivannan Sadhasivam=============
24*9435dc3bSManivannan Sadhasivam
25*9435dc3bSManivannan SadhasivamMMIO
26*9435dc3bSManivannan Sadhasivam----
27*9435dc3bSManivannan Sadhasivam
28*9435dc3bSManivannan SadhasivamMMIO (Memory mapped IO) consists of a set of registers in the device hardware,
29*9435dc3bSManivannan Sadhasivamwhich are mapped to the host memory space by the peripheral buses like PCIe.
30*9435dc3bSManivannan SadhasivamFollowing are the major components of MMIO register space:
31*9435dc3bSManivannan Sadhasivam
32*9435dc3bSManivannan SadhasivamMHI control registers: Access to MHI configurations registers
33*9435dc3bSManivannan Sadhasivam
34*9435dc3bSManivannan SadhasivamMHI BHI registers: BHI (Boot Host Interface) registers are used by the host
35*9435dc3bSManivannan Sadhasivamfor downloading the firmware to the device before MHI initialization.
36*9435dc3bSManivannan Sadhasivam
37*9435dc3bSManivannan SadhasivamChannel Doorbell array: Channel Doorbell (DB) registers used by the host to
38*9435dc3bSManivannan Sadhasivamnotify the device when there is new work to do.
39*9435dc3bSManivannan Sadhasivam
40*9435dc3bSManivannan SadhasivamEvent Doorbell array: Associated with event context array, the Event Doorbell
41*9435dc3bSManivannan Sadhasivam(DB) registers are used by the host to notify the device when new events are
42*9435dc3bSManivannan Sadhasivamavailable.
43*9435dc3bSManivannan Sadhasivam
44*9435dc3bSManivannan SadhasivamDebug registers: A set of registers and counters used by the device to expose
45*9435dc3bSManivannan Sadhasivamdebugging information like performance, functional, and stability to the host.
46*9435dc3bSManivannan Sadhasivam
47*9435dc3bSManivannan SadhasivamData structures
48*9435dc3bSManivannan Sadhasivam---------------
49*9435dc3bSManivannan Sadhasivam
50*9435dc3bSManivannan SadhasivamAll data structures used by MHI are in the host system memory. Using the
51*9435dc3bSManivannan Sadhasivamphysical interface, the device accesses those data structures. MHI data
52*9435dc3bSManivannan Sadhasivamstructures and data buffers in the host system memory regions are mapped for
53*9435dc3bSManivannan Sadhasivamthe device.
54*9435dc3bSManivannan Sadhasivam
55*9435dc3bSManivannan SadhasivamChannel context array: All channel configurations are organized in channel
56*9435dc3bSManivannan Sadhasivamcontext data array.
57*9435dc3bSManivannan Sadhasivam
58*9435dc3bSManivannan SadhasivamTransfer rings: Used by the host to schedule work items for a channel. The
59*9435dc3bSManivannan Sadhasivamtransfer rings are organized as a circular queue of Transfer Descriptors (TD).
60*9435dc3bSManivannan Sadhasivam
61*9435dc3bSManivannan SadhasivamEvent context array: All event configurations are organized in the event context
62*9435dc3bSManivannan Sadhasivamdata array.
63*9435dc3bSManivannan Sadhasivam
64*9435dc3bSManivannan SadhasivamEvent rings: Used by the device to send completion and state transition messages
65*9435dc3bSManivannan Sadhasivamto the host
66*9435dc3bSManivannan Sadhasivam
67*9435dc3bSManivannan SadhasivamCommand context array: All command configurations are organized in command
68*9435dc3bSManivannan Sadhasivamcontext data array.
69*9435dc3bSManivannan Sadhasivam
70*9435dc3bSManivannan SadhasivamCommand rings: Used by the host to send MHI commands to the device. The command
71*9435dc3bSManivannan Sadhasivamrings are organized as a circular queue of Command Descriptors (CD).
72*9435dc3bSManivannan Sadhasivam
73*9435dc3bSManivannan SadhasivamChannels
74*9435dc3bSManivannan Sadhasivam--------
75*9435dc3bSManivannan Sadhasivam
76*9435dc3bSManivannan SadhasivamMHI channels are logical, unidirectional data pipes between a host and a device.
77*9435dc3bSManivannan SadhasivamThe concept of channels in MHI is similar to endpoints in USB. MHI supports up
78*9435dc3bSManivannan Sadhasivamto 256 channels. However, specific device implementations may support less than
79*9435dc3bSManivannan Sadhasivamthe maximum number of channels allowed.
80*9435dc3bSManivannan Sadhasivam
81*9435dc3bSManivannan SadhasivamTwo unidirectional channels with their associated transfer rings form a
82*9435dc3bSManivannan Sadhasivambidirectional data pipe, which can be used by the upper-layer protocols to
83*9435dc3bSManivannan Sadhasivamtransport application data packets (such as IP packets, modem control messages,
84*9435dc3bSManivannan Sadhasivamdiagnostics messages, and so on). Each channel is associated with a single
85*9435dc3bSManivannan Sadhasivamtransfer ring.
86*9435dc3bSManivannan Sadhasivam
87*9435dc3bSManivannan SadhasivamTransfer rings
88*9435dc3bSManivannan Sadhasivam--------------
89*9435dc3bSManivannan Sadhasivam
90*9435dc3bSManivannan SadhasivamTransfers between the host and device are organized by channels and defined by
91*9435dc3bSManivannan SadhasivamTransfer Descriptors (TD). TDs are managed through transfer rings, which are
92*9435dc3bSManivannan Sadhasivamdefined for each channel between the device and host and reside in the host
93*9435dc3bSManivannan Sadhasivammemory. TDs consist of one or more ring elements (or transfer blocks)::
94*9435dc3bSManivannan Sadhasivam
95*9435dc3bSManivannan Sadhasivam        [Read Pointer (RP)] ----------->[Ring Element] } TD
96*9435dc3bSManivannan Sadhasivam        [Write Pointer (WP)]-           [Ring Element]
97*9435dc3bSManivannan Sadhasivam                             -          [Ring Element]
98*9435dc3bSManivannan Sadhasivam                              --------->[Ring Element]
99*9435dc3bSManivannan Sadhasivam                                        [Ring Element]
100*9435dc3bSManivannan Sadhasivam
101*9435dc3bSManivannan SadhasivamBelow is the basic usage of transfer rings:
102*9435dc3bSManivannan Sadhasivam
103*9435dc3bSManivannan Sadhasivam* Host allocates memory for transfer ring.
104*9435dc3bSManivannan Sadhasivam* Host sets the base pointer, read pointer, and write pointer in corresponding
105*9435dc3bSManivannan Sadhasivam  channel context.
106*9435dc3bSManivannan Sadhasivam* Ring is considered empty when RP == WP.
107*9435dc3bSManivannan Sadhasivam* Ring is considered full when WP + 1 == RP.
108*9435dc3bSManivannan Sadhasivam* RP indicates the next element to be serviced by the device.
109*9435dc3bSManivannan Sadhasivam* When the host has a new buffer to send, it updates the ring element with
110*9435dc3bSManivannan Sadhasivam  buffer information, increments the WP to the next element and rings the
111*9435dc3bSManivannan Sadhasivam  associated channel DB.
112*9435dc3bSManivannan Sadhasivam
113*9435dc3bSManivannan SadhasivamEvent rings
114*9435dc3bSManivannan Sadhasivam-----------
115*9435dc3bSManivannan Sadhasivam
116*9435dc3bSManivannan SadhasivamEvents from the device to host are organized in event rings and defined by Event
117*9435dc3bSManivannan SadhasivamDescriptors (ED). Event rings are used by the device to report events such as
118*9435dc3bSManivannan Sadhasivamdata transfer completion status, command completion status, and state changes
119*9435dc3bSManivannan Sadhasivamto the host. Event rings are the array of EDs that resides in the host
120*9435dc3bSManivannan Sadhasivammemory. EDs consist of one or more ring elements (or transfer blocks)::
121*9435dc3bSManivannan Sadhasivam
122*9435dc3bSManivannan Sadhasivam        [Read Pointer (RP)] ----------->[Ring Element] } ED
123*9435dc3bSManivannan Sadhasivam        [Write Pointer (WP)]-           [Ring Element]
124*9435dc3bSManivannan Sadhasivam                             -          [Ring Element]
125*9435dc3bSManivannan Sadhasivam                              --------->[Ring Element]
126*9435dc3bSManivannan Sadhasivam                                        [Ring Element]
127*9435dc3bSManivannan Sadhasivam
128*9435dc3bSManivannan SadhasivamBelow is the basic usage of event rings:
129*9435dc3bSManivannan Sadhasivam
130*9435dc3bSManivannan Sadhasivam* Host allocates memory for event ring.
131*9435dc3bSManivannan Sadhasivam* Host sets the base pointer, read pointer, and write pointer in corresponding
132*9435dc3bSManivannan Sadhasivam  channel context.
133*9435dc3bSManivannan Sadhasivam* Both host and device has a local copy of RP, WP.
134*9435dc3bSManivannan Sadhasivam* Ring is considered empty (no events to service) when WP + 1 == RP.
135*9435dc3bSManivannan Sadhasivam* Ring is considered full of events when RP == WP.
136*9435dc3bSManivannan Sadhasivam* When there is a new event the device needs to send, the device updates ED
137*9435dc3bSManivannan Sadhasivam  pointed by RP, increments the RP to the next element and triggers the
138*9435dc3bSManivannan Sadhasivam  interrupt.
139*9435dc3bSManivannan Sadhasivam
140*9435dc3bSManivannan SadhasivamRing Element
141*9435dc3bSManivannan Sadhasivam------------
142*9435dc3bSManivannan Sadhasivam
143*9435dc3bSManivannan SadhasivamA Ring Element is a data structure used to transfer a single block
144*9435dc3bSManivannan Sadhasivamof data between the host and the device. Transfer ring element types contain a
145*9435dc3bSManivannan Sadhasivamsingle buffer pointer, the size of the buffer, and additional control
146*9435dc3bSManivannan Sadhasivaminformation. Other ring element types may only contain control and status
147*9435dc3bSManivannan Sadhasivaminformation. For single buffer operations, a ring descriptor is composed of a
148*9435dc3bSManivannan Sadhasivamsingle element. For large multi-buffer operations (such as scatter and gather),
149*9435dc3bSManivannan Sadhasivamelements can be chained to form a longer descriptor.
150*9435dc3bSManivannan Sadhasivam
151*9435dc3bSManivannan SadhasivamMHI Operations
152*9435dc3bSManivannan Sadhasivam==============
153*9435dc3bSManivannan Sadhasivam
154*9435dc3bSManivannan SadhasivamMHI States
155*9435dc3bSManivannan Sadhasivam----------
156*9435dc3bSManivannan Sadhasivam
157*9435dc3bSManivannan SadhasivamMHI_STATE_RESET
158*9435dc3bSManivannan Sadhasivam~~~~~~~~~~~~~~~
159*9435dc3bSManivannan SadhasivamMHI is in reset state after power-up or hardware reset. The host is not allowed
160*9435dc3bSManivannan Sadhasivamto access device MMIO register space.
161*9435dc3bSManivannan Sadhasivam
162*9435dc3bSManivannan SadhasivamMHI_STATE_READY
163*9435dc3bSManivannan Sadhasivam~~~~~~~~~~~~~~~
164*9435dc3bSManivannan SadhasivamMHI is ready for initialization. The host can start MHI initialization by
165*9435dc3bSManivannan Sadhasivamprogramming MMIO registers.
166*9435dc3bSManivannan Sadhasivam
167*9435dc3bSManivannan SadhasivamMHI_STATE_M0
168*9435dc3bSManivannan Sadhasivam~~~~~~~~~~~~
169*9435dc3bSManivannan SadhasivamMHI is running and operational in the device. The host can start channels by
170*9435dc3bSManivannan Sadhasivamissuing channel start command.
171*9435dc3bSManivannan Sadhasivam
172*9435dc3bSManivannan SadhasivamMHI_STATE_M1
173*9435dc3bSManivannan Sadhasivam~~~~~~~~~~~~
174*9435dc3bSManivannan SadhasivamMHI operation is suspended by the device. This state is entered when the
175*9435dc3bSManivannan Sadhasivamdevice detects inactivity at the physical interface within a preset time.
176*9435dc3bSManivannan Sadhasivam
177*9435dc3bSManivannan SadhasivamMHI_STATE_M2
178*9435dc3bSManivannan Sadhasivam~~~~~~~~~~~~
179*9435dc3bSManivannan SadhasivamMHI is in low power state. MHI operation is suspended and the device may
180*9435dc3bSManivannan Sadhasivamenter lower power mode.
181*9435dc3bSManivannan Sadhasivam
182*9435dc3bSManivannan SadhasivamMHI_STATE_M3
183*9435dc3bSManivannan Sadhasivam~~~~~~~~~~~~
184*9435dc3bSManivannan SadhasivamMHI operation stopped by the host. This state is entered when the host suspends
185*9435dc3bSManivannan SadhasivamMHI operation.
186*9435dc3bSManivannan Sadhasivam
187*9435dc3bSManivannan SadhasivamMHI Initialization
188*9435dc3bSManivannan Sadhasivam------------------
189*9435dc3bSManivannan Sadhasivam
190*9435dc3bSManivannan SadhasivamAfter system boots, the device is enumerated over the physical interface.
191*9435dc3bSManivannan SadhasivamIn the case of PCIe, the device is enumerated and assigned BAR-0 for
192*9435dc3bSManivannan Sadhasivamthe device's MMIO register space. To initialize the MHI in a device,
193*9435dc3bSManivannan Sadhasivamthe host performs the following operations:
194*9435dc3bSManivannan Sadhasivam
195*9435dc3bSManivannan Sadhasivam* Allocates the MHI context for event, channel and command arrays.
196*9435dc3bSManivannan Sadhasivam* Initializes the context array, and prepares interrupts.
197*9435dc3bSManivannan Sadhasivam* Waits until the device enters READY state.
198*9435dc3bSManivannan Sadhasivam* Programs MHI MMIO registers and sets device into MHI_M0 state.
199*9435dc3bSManivannan Sadhasivam* Waits for the device to enter M0 state.
200*9435dc3bSManivannan Sadhasivam
201*9435dc3bSManivannan SadhasivamMHI Data Transfer
202*9435dc3bSManivannan Sadhasivam-----------------
203*9435dc3bSManivannan Sadhasivam
204*9435dc3bSManivannan SadhasivamMHI data transfer is initiated by the host to transfer data to the device.
205*9435dc3bSManivannan SadhasivamFollowing are the sequence of operations performed by the host to transfer
206*9435dc3bSManivannan Sadhasivamdata to device:
207*9435dc3bSManivannan Sadhasivam
208*9435dc3bSManivannan Sadhasivam* Host prepares TD with buffer information.
209*9435dc3bSManivannan Sadhasivam* Host increments the WP of the corresponding channel transfer ring.
210*9435dc3bSManivannan Sadhasivam* Host rings the channel DB register.
211*9435dc3bSManivannan Sadhasivam* Device wakes up to process the TD.
212*9435dc3bSManivannan Sadhasivam* Device generates a completion event for the processed TD by updating ED.
213*9435dc3bSManivannan Sadhasivam* Device increments the RP of the corresponding event ring.
214*9435dc3bSManivannan Sadhasivam* Device triggers IRQ to wake up the host.
215*9435dc3bSManivannan Sadhasivam* Host wakes up and checks the event ring for completion event.
216*9435dc3bSManivannan Sadhasivam* Host updates the WP of the corresponding event ring to indicate that the
217*9435dc3bSManivannan Sadhasivam  data transfer has been completed successfully.
218*9435dc3bSManivannan Sadhasivam
219