mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.4 KiB
108 lines
3.4 KiB
================= |
|
SoundWire Locking |
|
================= |
|
|
|
This document explains locking mechanism of the SoundWire Bus. Bus uses |
|
following locks in order to avoid race conditions in Bus operations on |
|
shared resources. |
|
|
|
- Bus lock |
|
|
|
- Message lock |
|
|
|
Bus lock |
|
======== |
|
|
|
SoundWire Bus lock is a mutex and is part of Bus data structure |
|
(sdw_bus) which is used for every Bus instance. This lock is used to |
|
serialize each of the following operations(s) within SoundWire Bus instance. |
|
|
|
- Addition and removal of Slave(s), changing Slave status. |
|
|
|
- Prepare, Enable, Disable and De-prepare stream operations. |
|
|
|
- Access of Stream data structure. |
|
|
|
Message lock |
|
============ |
|
|
|
SoundWire message transfer lock. This mutex is part of |
|
Bus data structure (sdw_bus). This lock is used to serialize the message |
|
transfers (read/write) within a SoundWire Bus instance. |
|
|
|
Below examples show how locks are acquired. |
|
|
|
Example 1 |
|
--------- |
|
|
|
Message transfer. |
|
|
|
1. For every message transfer |
|
|
|
a. Acquire Message lock. |
|
|
|
b. Transfer message (Read/Write) to Slave1 or broadcast message on |
|
Bus in case of bank switch. |
|
|
|
c. Release Message lock |
|
|
|
:: |
|
|
|
+----------+ +---------+ |
|
| | | | |
|
| Bus | | Master | |
|
| | | Driver | |
|
| | | | |
|
+----+-----+ +----+----+ |
|
| | |
|
| bus->ops->xfer_msg() | |
|
<-------------------------------+ a. Acquire Message lock |
|
| | b. Transfer message |
|
| | |
|
+-------------------------------> c. Release Message lock |
|
| return success/error | d. Return success/error |
|
| | |
|
+ + |
|
|
|
Example 2 |
|
--------- |
|
|
|
Prepare operation. |
|
|
|
1. Acquire lock for Bus instance associated with Master 1. |
|
|
|
2. For every message transfer in Prepare operation |
|
|
|
a. Acquire Message lock. |
|
|
|
b. Transfer message (Read/Write) to Slave1 or broadcast message on |
|
Bus in case of bank switch. |
|
|
|
c. Release Message lock. |
|
|
|
3. Release lock for Bus instance associated with Master 1 :: |
|
|
|
+----------+ +---------+ |
|
| | | | |
|
| Bus | | Master | |
|
| | | Driver | |
|
| | | | |
|
+----+-----+ +----+----+ |
|
| | |
|
| sdw_prepare_stream() | |
|
<-------------------------------+ 1. Acquire bus lock |
|
| | 2. Perform stream prepare |
|
| | |
|
| | |
|
| bus->ops->xfer_msg() | |
|
<-------------------------------+ a. Acquire Message lock |
|
| | b. Transfer message |
|
| | |
|
+-------------------------------> c. Release Message lock |
|
| return success/error | d. Return success/error |
|
| | |
|
| | |
|
| return success/error | 3. Release bus lock |
|
+-------------------------------> 4. Return success/error |
|
| | |
|
+ +
|
|
|