Qualcomm Linux SMD » History » Revision 6
Revision 5 (laforge, 12/26/2016 07:47 PM) → Revision 6/12 (laforge, 12/26/2016 07:51 PM)
{{>toc}}
h1. Qualcomm Linux SMD (Shared Memory Device)
Individual processors / sub-systems in a multi-CPU SOC provide SMD channels. This is basically a pipe abstraction over a shared memory protocol. Each channel exists between two given CPU cores, so called _SMD sub-systems_.
* SMD sub-systems we know of:
** APPS (applications processor, this is the Linux system)
** Modem (assumed to be hexagon with modem firmware?)
** Q6 (formerly known as LPASS == Low Power Audio SubSystem)
** DSPS
** WCNSS (Wireless Connectivity Sub System) aka 'riva'
** RPM (Resource Power Manager)
* inter-processor-interrupts for various 'edges'
In the MDM9615/9x07 based devices it seems there is only the RPM, MODEM and APPS.
h2. core driver
* arch/arm/mach-msm/smd.c
h3. api
* smd_open() / smd_named_open_on_edge()
* smd_close()
* smd_write*()
* smd_read*()
* smsm_*()
h2. SMD based drivers
h3. smd_tty
Seems to expose tty devices (/dev/smdN) bound to SMD channels.
h3. smd_nmea
Exposes a tty device (/dev/nmea) bound to a SMD channel named "GPSNMEA".
h3. diagfwd
DIAG forwarding, see [[DIAG]]
h3. u_smd usb gadget
Used to forward data of certain USB endpoints towards other processors (mainly MDSP)
h3. packet ports
* Some kind of packet oriented interface towards the SMD
* msm_smd_pkt.c contains driver
** smdpkt0..7+smd22 devices, 2048 byte buffer
** open/release/read/write/poll syscalls implemented
h3. hci_smd
Apparently used to talk HCI to a bluetooth chip on a different processor. Not used in the modem devices we've seen.
h3. smd_qmi
Binds to the following channels and exposes the related devices:
|_.SMD Pipe|_.QMI Device|
|SMD_DATA5_CNTL|/dev/qmi0|
|SMD_DATA6_CNTL|/dev/qmi1|
|SMD_DATA7_CNTL|/dev/qmi2|
h2. MSM IPC (Inter Process Communications) socket
Qualcomm implements a socket-based inter process communication on Linux. It is implemented using a new address family, @AF_MSM_IPC@ (27).
The socket is used as datagram type socket (SOCK_DGRAM).
The socket address of a related socket consists of:
* the socket family (AF_MSM_IPC)
* a @struct msm_ipc_addr@, consisting of
** a single address type byte
** a port address (node_id, port_id)
** a port name (service, instance)
* arch/arm/mach-msm/ipc_socket.c
* AF_MSM_IPC
h2. available SMD pipes
h3. SMD pipes on an [[EC25]]
<pre>
Primary allocation table:
root@mdm9607-perf:~# cat /sys/kernel/debug/smd/ch
ID|CHANNEL NAME |T|PROC |STATE |FIFO SZ|RDPTR |WRPTR |FLAGS |DATAPEN
-------------------------------------------------------------------------------
4|rpm_requests |P|APPS |OPENED |0x00400|0x001E0|0x001E0|DCCiwRsB|0x00000
| | |RPM |OPENED |0x00400|0x00118|0x00118|DCCiwrsB|0x00000
-------------------------------------------------------------------------------
5|rpm_requests |P|MDMSW| Access Restricted
| | |RPM | Access Restricted
-------------------------------------------------------------------------------
6|rpm_requests |P|WCNSS| Access Restricted
| | |RPM | Access Restricted
-------------------------------------------------------------------------------
7|rpm_requests |P|TZ | Access Restricted
| | |RPM | Access Restricted
-------------------------------------------------------------------------------
8|rpm_requests |P|ADSP | Access Restricted
| | |RPM | Access Restricted
-------------------------------------------------------------------------------
APPS <-> MDMSW Primary allocation table:
ID|CHANNEL NAME |T|PROC |STATE |FIFO SZ|RDPTR |WRPTR |FLAGS |DATAPEN
-------------------------------------------------------------------------------
0|DS |S|APPS |OPENED |0x02000|0x00000|0x00000|dcCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000
-------------------------------------------------------------------------------
1|IPCRTR |P|APPS |OPENED |0x02000|0x012E4|0x012E4|DCCiwrsB|0x00000
| | |MDMSW|OPENED |0x02000|0x011F8|0x011F8|DCCiwrsB|0x00000
-------------------------------------------------------------------------------
2|SSM_RTR_MODEM_APPS |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000
| | |MDMSW|OPENING|0x02000|0x00000|0x00000|DCCiwrSb|0x00000
-------------------------------------------------------------------------------
3|DIAG_2_CMD |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
-------------------------------------------------------------------------------
4|DIAG_2 |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
-------------------------------------------------------------------------------
5|DIAG_CNTL |P|APPS |OPENED |0x02000|0x00062|0x00062|DCCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x007F5|0x007F5|DCCiwrsB|0x00000
-------------------------------------------------------------------------------
6|DIAG_CMD |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
-------------------------------------------------------------------------------
7|DIAG |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x00026|0x00026|DCCiwrsB|0x00000
-------------------------------------------------------------------------------
8|apr_audio_svc |P|APPS |OPENED |0x02000|0x002F0|0x002F0|DCCiwrsB|0x00000
| | |MDMSW|OPENED |0x02000|0x00248|0x00248|DCCiwrsB|0x00000
-------------------------------------------------------------------------------
9|apr_apps2 |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000
| | |MDMSW|OPENING|0x02000|0x00000|0x00000|DCCiwrSb|0x00000
-------------------------------------------------------------------------------
10|DATA1 |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsB|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000
-------------------------------------------------------------------------------
11|DATA2 |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000
| | |MDMSW|OPENING|0x02000|0x00000|0x00000|dCciwrSb|0x00000
-------------------------------------------------------------------------------
12|DATA3 |P|APPS |OPENED |0x02000|0x00000|0x00000|dcCiwrsb|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000
-------------------------------------------------------------------------------
13|DATA4 |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsB|0x00000
| | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000
-------------------------------------------------------------------------------
14|DATA11 |S|APPS |OPENED |0x02000|0x00089|0x00089|dcCiwRsb|0x00000
| | |MDMSW|OPENED |0x02000|0x0012B|0x0012B|dCciwrsB|0x00000
-------------------------------------------------------------------------------
15|DATA40 |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000
| | |MDMSW|OPENING|0x02000|0x00000|0x00000|dcciwrSb|0x00000
-------------------------------------------------------------------------------
16|DATA5_CNTL |P|APPS |CLOSED |0x00400|0x00000|0x00000|dcciwrsb|0x00000
| | |MDMSW|OPENING|0x00400|0x00000|0x00000|DCCiwrSb|0x00000
-------------------------------------------------------------------------------
17|DATA40_CNTL |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsB|0x00000
| | |MDMSW|OPENED |0x02000|0x00100|0x00100|DCCiwrsB|0x00000
-------------------------------------------------------------------------------
</pre>
h3. SMD pipes on an [[EC20]]:
<pre>
/sys/kernel/debug/smd # cat ch
ch00: OPENED(0000/0000) dcCiwrsb <-> OPENED(0000/0000) dCciwrsB : 2000
ch04: OPENED(27336/27336) DCCiwrsB <-> OPENED(6552/6552) DCCiwrsB : 8000
ch05: OPENED(0000/0000) DCCiwrsb <-> OPENED(12568/12568) DCCiwrsB : 10000
ch06: OPENED(1872/1872) DCCiwrsB <-> OPENED(0216/0216) DCCiwrsB : 2000
ch07: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000
ch08: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 400
ch09: OPENED(0952/0952) DCCiwrsb <-> OPENED(0438/0438) DCCiwrsB : 400
ch10: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsb : 2000
ch11: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000
ch12: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsb : 2000
ch13: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000
ch14: OPENED(0480/0480) DCCiwrsB <-> OPENED(0376/0376) DCCiwrsB : 400
ch15: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000
ch16: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000
ch17: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 400
ch18: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsb : 2000
ch19: OPENED(0952/0952) DCCiwrsb <-> OPENED(0370/0370) DCCiwrsB : 400
ch20: OPENED(0021/0021) DCCiwrsb <-> OPENED(0078/0078) DCCiwrsB : 2000
ch21: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000
ch22: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dCciwrSb : 2000
ch23: OPENED(0000/0000) dcCiwrsb <-> OPENED(0000/0000) dCciwrsB : 2000
ch24: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) dCciwrsb : 2000
ch25: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dCciwrSb : 2000
ch26: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dCciwrSb : 2000
ch27: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dcciwrSb : 2000
ch28: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsB : 2000
ch29: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dcciwrSb : 2000
ch30: OPENED(0295/0295) DCCiwrsB <-> OPENED(0563/0563) DCCiwrsB : 400
ch31: OPENED(0237/0237) DCCiwrsB <-> OPENED(0415/0415) DCCiwrsB : 400
ch32: OPENED(0237/0237) DCCiwrsB <-> OPENED(0415/0415) DCCiwrsB : 400
ch33: OPENED(0237/0237) DCCiwrsB <-> OPENED(0415/0415) DCCiwrsB : 400
ch34: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) dCciwrsb : 2000
</pre>
<pre>
/sys/kernel/debug/smd # cat tbl
name=DS cid=0 ch type=0 xfer type=1 ref_count=2
name= cid=0 ch type=0 xfer type=0 ref_count=0
name= cid=0 ch type=0 xfer type=0 ref_count=0
name= cid=0 ch type=0 xfer type=0 ref_count=0
name=MSGR_SMD_P1 cid=4 ch type=11 xfer type=2 ref_count=2
name=MSGR_SMD_P0 cid=5 ch type=11 xfer type=2 ref_count=2
name=IPCRTR cid=6 ch type=1 xfer type=2 ref_count=1
name=IPCRTR cid=7 ch type=2 xfer type=2 ref_count=1
name=sys_mon cid=8 ch type=1 xfer type=2 ref_count=1
name=DIAG_CNTL cid=9 ch type=1 xfer type=2 ref_count=2
name=DIAG cid=10 ch type=1 xfer type=2 ref_count=2
name=apr_audio_svc cid=11 ch type=1 xfer type=2 ref_count=1
name=apr_voice_svc cid=12 ch type=2 xfer type=2 ref_count=2
name=apr_apps2 cid=13 ch type=1 xfer type=2 ref_count=1
name=RPCRPY_CNTL cid=14 ch type=0 xfer type=2 ref_count=2
name=IPCROUTER cid=15 ch type=0 xfer type=0 ref_count=1
name=SSM_RTR cid=16 ch type=0 xfer type=2 ref_count=1
name=sys_mon cid=17 ch type=0 xfer type=2 ref_count=1
name=DIAG_2 cid=18 ch type=0 xfer type=2 ref_count=2
name=DIAG_CNTL cid=19 ch type=0 xfer type=2 ref_count=2
name=DIAG cid=20 ch type=0 xfer type=2 ref_count=2
name=apr_voice_svc cid=21 ch type=0 xfer type=2 ref_count=1
name=DATA1 cid=22 ch type=0 xfer type=2 ref_count=2
name=DATA2 cid=23 ch type=0 xfer type=2 ref_count=2
name=DATA3 cid=24 ch type=0 xfer type=2 ref_count=2
name=DATA4 cid=25 ch type=0 xfer type=2 ref_count=2
name=DATA11 cid=26 ch type=0 xfer type=1 ref_count=2
name=DATA40 cid=27 ch type=0 xfer type=2 ref_count=2
name=DATA40_CNTL cid=28 ch type=0 xfer type=2 ref_count=2
name=DATA8 cid=29 ch type=0 xfer type=2 ref_count=2
name=DATA5_CNTL cid=30 ch type=0 xfer type=2 ref_count=2
name=DATA6_CNTL cid=31 ch type=0 xfer type=2 ref_count=2
name=DATA7_CNTL cid=32 ch type=0 xfer type=2 ref_count=2
name=DATA8_CNTL cid=33 ch type=0 xfer type=2 ref_count=2
name=GPSNMEA cid=34 ch type=0 xfer type=2 ref_count=2
</pre>