1 ================= 1 ================= 2 SoundWire Locking 2 SoundWire Locking 3 ================= 3 ================= 4 4 5 This document explains locking mechanism of th 5 This document explains locking mechanism of the SoundWire Bus. Bus uses 6 following locks in order to avoid race conditi 6 following locks in order to avoid race conditions in Bus operations on 7 shared resources. 7 shared resources. 8 8 9 - Bus lock 9 - Bus lock 10 10 11 - Message lock 11 - Message lock 12 12 13 Bus lock 13 Bus lock 14 ======== 14 ======== 15 15 16 SoundWire Bus lock is a mutex and is part of B 16 SoundWire Bus lock is a mutex and is part of Bus data structure 17 (sdw_bus) which is used for every Bus instance 17 (sdw_bus) which is used for every Bus instance. This lock is used to 18 serialize each of the following operations(s) 18 serialize each of the following operations(s) within SoundWire Bus instance. 19 19 20 - Addition and removal of Slave(s), changing 20 - Addition and removal of Slave(s), changing Slave status. 21 21 22 - Prepare, Enable, Disable and De-prepare st 22 - Prepare, Enable, Disable and De-prepare stream operations. 23 23 24 - Access of Stream data structure. 24 - Access of Stream data structure. 25 25 26 Message lock 26 Message lock 27 ============ 27 ============ 28 28 29 SoundWire message transfer lock. This mutex is 29 SoundWire message transfer lock. This mutex is part of 30 Bus data structure (sdw_bus). This lock is use 30 Bus data structure (sdw_bus). This lock is used to serialize the message 31 transfers (read/write) within a SoundWire Bus 31 transfers (read/write) within a SoundWire Bus instance. 32 32 33 Below examples show how locks are acquired. 33 Below examples show how locks are acquired. 34 34 35 Example 1 35 Example 1 36 --------- 36 --------- 37 37 38 Message transfer. 38 Message transfer. 39 39 40 1. For every message transfer 40 1. For every message transfer 41 41 42 a. Acquire Message lock. 42 a. Acquire Message lock. 43 43 44 b. Transfer message (Read/Write) to Slave 44 b. Transfer message (Read/Write) to Slave1 or broadcast message on 45 Bus in case of bank switch. 45 Bus in case of bank switch. 46 46 47 c. Release Message lock 47 c. Release Message lock 48 48 49 :: 49 :: 50 50 51 +----------+ +----- 51 +----------+ +---------+ 52 | | | 52 | | | | 53 | Bus | | Mast 53 | Bus | | Master | 54 | | | Driv 54 | | | Driver | 55 | | | 55 | | | | 56 +----+-----+ +----+ 56 +----+-----+ +----+----+ 57 | | 57 | | 58 | bus->ops->xfer_msg() | 58 | bus->ops->xfer_msg() | 59 <-------------------------------+ 59 <-------------------------------+ a. Acquire Message lock 60 | | 60 | | b. Transfer message 61 | | 61 | | 62 +-------------------------------> 62 +-------------------------------> c. Release Message lock 63 | return success/error | 63 | return success/error | d. Return success/error 64 | | 64 | | 65 + + 65 + + 66 66 67 Example 2 67 Example 2 68 --------- 68 --------- 69 69 70 Prepare operation. 70 Prepare operation. 71 71 72 1. Acquire lock for Bus instance associated 72 1. Acquire lock for Bus instance associated with Master 1. 73 73 74 2. For every message transfer in Prepare ope 74 2. For every message transfer in Prepare operation 75 75 76 a. Acquire Message lock. 76 a. Acquire Message lock. 77 77 78 b. Transfer message (Read/Write) to Slave 78 b. Transfer message (Read/Write) to Slave1 or broadcast message on 79 Bus in case of bank switch. 79 Bus in case of bank switch. 80 80 81 c. Release Message lock. 81 c. Release Message lock. 82 82 83 3. Release lock for Bus instance associated 83 3. Release lock for Bus instance associated with Master 1 :: 84 84 85 +----------+ +----- 85 +----------+ +---------+ 86 | | | 86 | | | | 87 | Bus | | Mast 87 | Bus | | Master | 88 | | | Driv 88 | | | Driver | 89 | | | 89 | | | | 90 +----+-----+ +----+ 90 +----+-----+ +----+----+ 91 | | 91 | | 92 | sdw_prepare_stream() | 92 | sdw_prepare_stream() | 93 <-------------------------------+ 93 <-------------------------------+ 1. Acquire bus lock 94 | | 94 | | 2. Perform stream prepare 95 | | 95 | | 96 | | 96 | | 97 | bus->ops->xfer_msg() | 97 | bus->ops->xfer_msg() | 98 <-------------------------------+ 98 <-------------------------------+ a. Acquire Message lock 99 | | 99 | | b. Transfer message 100 | | 100 | | 101 +-------------------------------> 101 +-------------------------------> c. Release Message lock 102 | return success/error | 102 | return success/error | d. Return success/error 103 | | 103 | | 104 | | 104 | | 105 | return success/error | 105 | return success/error | 3. Release bus lock 106 +-------------------------------> 106 +-------------------------------> 4. Return success/error 107 | | 107 | | 108 + + 108 + +
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.