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