Qualcomm Linux SMD » History » Version 9
laforge, 12/26/2016 08:40 PM
1 | 1 | laforge | {{>toc}} |
---|---|---|---|
2 | |||
3 | h1. Qualcomm Linux SMD (Shared Memory Device) |
||
4 | |||
5 | 2 | laforge | 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_. |
6 | 1 | laforge | |
7 | 2 | laforge | * SMD sub-systems we know of: |
8 | ** APPS (applications processor, this is the Linux system) |
||
9 | 1 | laforge | ** Modem (assumed to be hexagon with modem firmware?) |
10 | ** Q6 (formerly known as LPASS == Low Power Audio SubSystem) |
||
11 | ** DSPS |
||
12 | ** WCNSS (Wireless Connectivity Sub System) aka 'riva' |
||
13 | ** RPM (Resource Power Manager) |
||
14 | * inter-processor-interrupts for various 'edges' |
||
15 | 2 | laforge | |
16 | In the MDM9615/9x07 based devices it seems there is only the RPM, MODEM and APPS. |
||
17 | 1 | laforge | |
18 | h2. core driver |
||
19 | |||
20 | * arch/arm/mach-msm/smd.c |
||
21 | |||
22 | h3. api |
||
23 | |||
24 | 5 | laforge | * smd_open() / smd_named_open_on_edge() |
25 | 1 | laforge | * smd_close() |
26 | * smd_write*() |
||
27 | * smd_read*() |
||
28 | * smsm_*() |
||
29 | |||
30 | h2. SMD based drivers |
||
31 | |||
32 | h3. smd_tty |
||
33 | |||
34 | Seems to expose tty devices (/dev/smdN) bound to SMD channels. |
||
35 | |||
36 | h3. smd_nmea |
||
37 | |||
38 | Exposes a tty device (/dev/nmea) bound to a SMD channel named "GPSNMEA". |
||
39 | |||
40 | h3. diagfwd |
||
41 | |||
42 | DIAG forwarding, see [[DIAG]] |
||
43 | |||
44 | h3. u_smd usb gadget |
||
45 | |||
46 | Used to forward data of certain USB endpoints towards other processors (mainly MDSP) |
||
47 | |||
48 | 3 | laforge | h3. packet ports |
49 | 1 | laforge | |
50 | 3 | laforge | * Some kind of packet oriented interface towards the SMD |
51 | * msm_smd_pkt.c contains driver |
||
52 | ** smdpkt0..7+smd22 devices, 2048 byte buffer |
||
53 | ** open/release/read/write/poll syscalls implemented |
||
54 | |||
55 | 8 | laforge | |_.Pipe|_.Device| |
56 | |DATA5_CNTL|smdcntl0| |
||
57 | |DATA6_CNTL|smdcntl1| |
||
58 | |DATA7_CNTL|smdcntl2| |
||
59 | |DATA8_CNTL|smdcntl3| |
||
60 | |DATA9_CNTL|smdcntl4| |
||
61 | |DATA12_CNTL|smdcntl5| |
||
62 | |DATA13_CNTL|smdcntl6| |
||
63 | |DATA14_CNTL|smdcntl7| |
||
64 | |DATA22|smd22| |
||
65 | |||
66 | |||
67 | |||
68 | 4 | laforge | h3. hci_smd |
69 | |||
70 | Apparently used to talk HCI to a bluetooth chip on a different processor. Not used in the modem devices we've seen. |
||
71 | |||
72 | 6 | laforge | h3. smd_qmi |
73 | |||
74 | Binds to the following channels and exposes the related devices: |
||
75 | |||
76 | |_.SMD Pipe|_.QMI Device| |
||
77 | |SMD_DATA5_CNTL|/dev/qmi0| |
||
78 | |SMD_DATA6_CNTL|/dev/qmi1| |
||
79 | |SMD_DATA7_CNTL|/dev/qmi2| |
||
80 | |||
81 | 7 | laforge | It seems this is an older generation of accessing [[QMI]] from the Linux application processor, which has now been replaced by qmuxd which opens @/dev/smdcntl@ devices and thus bypasses any QMI message parsing/interpretation inside the kernel? |
82 | 4 | laforge | |
83 | 9 | laforge | h3. msm_rmnet |
84 | |||
85 | Implements a Linux kernel network device based on a SMD pipe |
||
86 | |||
87 | |_.SMD Pipe|_.netdev| |
||
88 | |DATA5|rmnet0| |
||
89 | |DATA6|rmnet1| |
||
90 | |DATA7|rmnet2| |
||
91 | |DATA8|rmnet3| |
||
92 | |DATA9|rmnet4| |
||
93 | |DATA12|rmnet5| |
||
94 | |DATA13|rmnet6| |
||
95 | |DATA14|rmnet7| |
||
96 | |||
97 | 1 | laforge | h2. MSM IPC (Inter Process Communications) socket |
98 | |||
99 | Qualcomm implements a socket-based inter process communication on Linux. It is implemented using a new address family, @AF_MSM_IPC@ (27). |
||
100 | |||
101 | The socket is used as datagram type socket (SOCK_DGRAM). |
||
102 | |||
103 | The socket address of a related socket consists of: |
||
104 | |||
105 | * the socket family (AF_MSM_IPC) |
||
106 | * a @struct msm_ipc_addr@, consisting of |
||
107 | ** a single address type byte |
||
108 | ** a port address (node_id, port_id) |
||
109 | ** a port name (service, instance) |
||
110 | |||
111 | * arch/arm/mach-msm/ipc_socket.c |
||
112 | * AF_MSM_IPC |
||
113 | |||
114 | |||
115 | h2. available SMD pipes |
||
116 | |||
117 | h3. SMD pipes on an [[EC25]] |
||
118 | |||
119 | <pre> |
||
120 | Primary allocation table: |
||
121 | root@mdm9607-perf:~# cat /sys/kernel/debug/smd/ch |
||
122 | ID|CHANNEL NAME |T|PROC |STATE |FIFO SZ|RDPTR |WRPTR |FLAGS |DATAPEN |
||
123 | ------------------------------------------------------------------------------- |
||
124 | 4|rpm_requests |P|APPS |OPENED |0x00400|0x001E0|0x001E0|DCCiwRsB|0x00000 |
||
125 | | | |RPM |OPENED |0x00400|0x00118|0x00118|DCCiwrsB|0x00000 |
||
126 | ------------------------------------------------------------------------------- |
||
127 | 5|rpm_requests |P|MDMSW| Access Restricted |
||
128 | | | |RPM | Access Restricted |
||
129 | ------------------------------------------------------------------------------- |
||
130 | 6|rpm_requests |P|WCNSS| Access Restricted |
||
131 | | | |RPM | Access Restricted |
||
132 | ------------------------------------------------------------------------------- |
||
133 | 7|rpm_requests |P|TZ | Access Restricted |
||
134 | | | |RPM | Access Restricted |
||
135 | ------------------------------------------------------------------------------- |
||
136 | 8|rpm_requests |P|ADSP | Access Restricted |
||
137 | | | |RPM | Access Restricted |
||
138 | ------------------------------------------------------------------------------- |
||
139 | |||
140 | |||
141 | APPS <-> MDMSW Primary allocation table: |
||
142 | ID|CHANNEL NAME |T|PROC |STATE |FIFO SZ|RDPTR |WRPTR |FLAGS |DATAPEN |
||
143 | ------------------------------------------------------------------------------- |
||
144 | 0|DS |S|APPS |OPENED |0x02000|0x00000|0x00000|dcCiwrsb|0x00000 |
||
145 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000 |
||
146 | ------------------------------------------------------------------------------- |
||
147 | 1|IPCRTR |P|APPS |OPENED |0x02000|0x012E4|0x012E4|DCCiwrsB|0x00000 |
||
148 | | | |MDMSW|OPENED |0x02000|0x011F8|0x011F8|DCCiwrsB|0x00000 |
||
149 | ------------------------------------------------------------------------------- |
||
150 | 2|SSM_RTR_MODEM_APPS |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000 |
||
151 | | | |MDMSW|OPENING|0x02000|0x00000|0x00000|DCCiwrSb|0x00000 |
||
152 | ------------------------------------------------------------------------------- |
||
153 | 3|DIAG_2_CMD |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
154 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
155 | ------------------------------------------------------------------------------- |
||
156 | 4|DIAG_2 |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
157 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
158 | ------------------------------------------------------------------------------- |
||
159 | 5|DIAG_CNTL |P|APPS |OPENED |0x02000|0x00062|0x00062|DCCiwrsb|0x00000 |
||
160 | | | |MDMSW|OPENED |0x02000|0x007F5|0x007F5|DCCiwrsB|0x00000 |
||
161 | ------------------------------------------------------------------------------- |
||
162 | 6|DIAG_CMD |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
163 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
164 | ------------------------------------------------------------------------------- |
||
165 | 7|DIAG |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsb|0x00000 |
||
166 | | | |MDMSW|OPENED |0x02000|0x00026|0x00026|DCCiwrsB|0x00000 |
||
167 | ------------------------------------------------------------------------------- |
||
168 | 8|apr_audio_svc |P|APPS |OPENED |0x02000|0x002F0|0x002F0|DCCiwrsB|0x00000 |
||
169 | | | |MDMSW|OPENED |0x02000|0x00248|0x00248|DCCiwrsB|0x00000 |
||
170 | ------------------------------------------------------------------------------- |
||
171 | 9|apr_apps2 |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000 |
||
172 | | | |MDMSW|OPENING|0x02000|0x00000|0x00000|DCCiwrSb|0x00000 |
||
173 | ------------------------------------------------------------------------------- |
||
174 | 10|DATA1 |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsB|0x00000 |
||
175 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000 |
||
176 | ------------------------------------------------------------------------------- |
||
177 | 11|DATA2 |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000 |
||
178 | | | |MDMSW|OPENING|0x02000|0x00000|0x00000|dCciwrSb|0x00000 |
||
179 | ------------------------------------------------------------------------------- |
||
180 | 12|DATA3 |P|APPS |OPENED |0x02000|0x00000|0x00000|dcCiwrsb|0x00000 |
||
181 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000 |
||
182 | ------------------------------------------------------------------------------- |
||
183 | 13|DATA4 |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsB|0x00000 |
||
184 | | | |MDMSW|OPENED |0x02000|0x00000|0x00000|dCciwrsb|0x00000 |
||
185 | ------------------------------------------------------------------------------- |
||
186 | 14|DATA11 |S|APPS |OPENED |0x02000|0x00089|0x00089|dcCiwRsb|0x00000 |
||
187 | | | |MDMSW|OPENED |0x02000|0x0012B|0x0012B|dCciwrsB|0x00000 |
||
188 | ------------------------------------------------------------------------------- |
||
189 | 15|DATA40 |P|APPS |CLOSED |0x02000|0x00000|0x00000|dcciwrsb|0x00000 |
||
190 | | | |MDMSW|OPENING|0x02000|0x00000|0x00000|dcciwrSb|0x00000 |
||
191 | ------------------------------------------------------------------------------- |
||
192 | 16|DATA5_CNTL |P|APPS |CLOSED |0x00400|0x00000|0x00000|dcciwrsb|0x00000 |
||
193 | | | |MDMSW|OPENING|0x00400|0x00000|0x00000|DCCiwrSb|0x00000 |
||
194 | ------------------------------------------------------------------------------- |
||
195 | 17|DATA40_CNTL |P|APPS |OPENED |0x02000|0x00000|0x00000|DCCiwrsB|0x00000 |
||
196 | | | |MDMSW|OPENED |0x02000|0x00100|0x00100|DCCiwrsB|0x00000 |
||
197 | ------------------------------------------------------------------------------- |
||
198 | </pre> |
||
199 | |||
200 | h3. SMD pipes on an [[EC20]]: |
||
201 | |||
202 | <pre> |
||
203 | /sys/kernel/debug/smd # cat ch |
||
204 | ch00: OPENED(0000/0000) dcCiwrsb <-> OPENED(0000/0000) dCciwrsB : 2000 |
||
205 | ch04: OPENED(27336/27336) DCCiwrsB <-> OPENED(6552/6552) DCCiwrsB : 8000 |
||
206 | ch05: OPENED(0000/0000) DCCiwrsb <-> OPENED(12568/12568) DCCiwrsB : 10000 |
||
207 | ch06: OPENED(1872/1872) DCCiwrsB <-> OPENED(0216/0216) DCCiwrsB : 2000 |
||
208 | ch07: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000 |
||
209 | ch08: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 400 |
||
210 | ch09: OPENED(0952/0952) DCCiwrsb <-> OPENED(0438/0438) DCCiwrsB : 400 |
||
211 | ch10: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsb : 2000 |
||
212 | ch11: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000 |
||
213 | ch12: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsb : 2000 |
||
214 | ch13: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000 |
||
215 | ch14: OPENED(0480/0480) DCCiwrsB <-> OPENED(0376/0376) DCCiwrsB : 400 |
||
216 | ch15: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000 |
||
217 | ch16: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000 |
||
218 | ch17: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 400 |
||
219 | ch18: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsb : 2000 |
||
220 | ch19: OPENED(0952/0952) DCCiwrsb <-> OPENED(0370/0370) DCCiwrsB : 400 |
||
221 | ch20: OPENED(0021/0021) DCCiwrsb <-> OPENED(0078/0078) DCCiwrsB : 2000 |
||
222 | ch21: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) DCCiwrSb : 2000 |
||
223 | ch22: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dCciwrSb : 2000 |
||
224 | ch23: OPENED(0000/0000) dcCiwrsb <-> OPENED(0000/0000) dCciwrsB : 2000 |
||
225 | ch24: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) dCciwrsb : 2000 |
||
226 | ch25: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dCciwrSb : 2000 |
||
227 | ch26: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dCciwrSb : 2000 |
||
228 | ch27: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dcciwrSb : 2000 |
||
229 | ch28: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) DCCiwrsB : 2000 |
||
230 | ch29: CLOSED(0000/0000) dcciwrsb <-> OPENING(0000/0000) dcciwrSb : 2000 |
||
231 | ch30: OPENED(0295/0295) DCCiwrsB <-> OPENED(0563/0563) DCCiwrsB : 400 |
||
232 | ch31: OPENED(0237/0237) DCCiwrsB <-> OPENED(0415/0415) DCCiwrsB : 400 |
||
233 | ch32: OPENED(0237/0237) DCCiwrsB <-> OPENED(0415/0415) DCCiwrsB : 400 |
||
234 | ch33: OPENED(0237/0237) DCCiwrsB <-> OPENED(0415/0415) DCCiwrsB : 400 |
||
235 | ch34: OPENED(0000/0000) DCCiwrsb <-> OPENED(0000/0000) dCciwrsb : 2000 |
||
236 | </pre> |
||
237 | |||
238 | <pre> |
||
239 | /sys/kernel/debug/smd # cat tbl |
||
240 | name=DS cid=0 ch type=0 xfer type=1 ref_count=2 |
||
241 | name= cid=0 ch type=0 xfer type=0 ref_count=0 |
||
242 | name= cid=0 ch type=0 xfer type=0 ref_count=0 |
||
243 | name= cid=0 ch type=0 xfer type=0 ref_count=0 |
||
244 | name=MSGR_SMD_P1 cid=4 ch type=11 xfer type=2 ref_count=2 |
||
245 | name=MSGR_SMD_P0 cid=5 ch type=11 xfer type=2 ref_count=2 |
||
246 | name=IPCRTR cid=6 ch type=1 xfer type=2 ref_count=1 |
||
247 | name=IPCRTR cid=7 ch type=2 xfer type=2 ref_count=1 |
||
248 | name=sys_mon cid=8 ch type=1 xfer type=2 ref_count=1 |
||
249 | name=DIAG_CNTL cid=9 ch type=1 xfer type=2 ref_count=2 |
||
250 | name=DIAG cid=10 ch type=1 xfer type=2 ref_count=2 |
||
251 | name=apr_audio_svc cid=11 ch type=1 xfer type=2 ref_count=1 |
||
252 | name=apr_voice_svc cid=12 ch type=2 xfer type=2 ref_count=2 |
||
253 | name=apr_apps2 cid=13 ch type=1 xfer type=2 ref_count=1 |
||
254 | name=RPCRPY_CNTL cid=14 ch type=0 xfer type=2 ref_count=2 |
||
255 | name=IPCROUTER cid=15 ch type=0 xfer type=0 ref_count=1 |
||
256 | name=SSM_RTR cid=16 ch type=0 xfer type=2 ref_count=1 |
||
257 | name=sys_mon cid=17 ch type=0 xfer type=2 ref_count=1 |
||
258 | name=DIAG_2 cid=18 ch type=0 xfer type=2 ref_count=2 |
||
259 | name=DIAG_CNTL cid=19 ch type=0 xfer type=2 ref_count=2 |
||
260 | name=DIAG cid=20 ch type=0 xfer type=2 ref_count=2 |
||
261 | name=apr_voice_svc cid=21 ch type=0 xfer type=2 ref_count=1 |
||
262 | name=DATA1 cid=22 ch type=0 xfer type=2 ref_count=2 |
||
263 | name=DATA2 cid=23 ch type=0 xfer type=2 ref_count=2 |
||
264 | name=DATA3 cid=24 ch type=0 xfer type=2 ref_count=2 |
||
265 | name=DATA4 cid=25 ch type=0 xfer type=2 ref_count=2 |
||
266 | name=DATA11 cid=26 ch type=0 xfer type=1 ref_count=2 |
||
267 | name=DATA40 cid=27 ch type=0 xfer type=2 ref_count=2 |
||
268 | name=DATA40_CNTL cid=28 ch type=0 xfer type=2 ref_count=2 |
||
269 | name=DATA8 cid=29 ch type=0 xfer type=2 ref_count=2 |
||
270 | name=DATA5_CNTL cid=30 ch type=0 xfer type=2 ref_count=2 |
||
271 | name=DATA6_CNTL cid=31 ch type=0 xfer type=2 ref_count=2 |
||
272 | name=DATA7_CNTL cid=32 ch type=0 xfer type=2 ref_count=2 |
||
273 | name=DATA8_CNTL cid=33 ch type=0 xfer type=2 ref_count=2 |
||
274 | name=GPSNMEA cid=34 ch type=0 xfer type=2 ref_count=2 |
||
275 | </pre> |