SoundWire 鎖定

本文件解釋了 SoundWire 匯流排的鎖定機制。匯流排使用以下鎖來避免在共享資源的匯流排操作中出現競爭情況。

  • 匯流排鎖

  • 訊息鎖

匯流排鎖

SoundWire 匯流排鎖是一個互斥鎖,並且是匯流排資料結構 (sdw_bus) 的一部分,該結構用於每個匯流排例項。此鎖用於序列化 SoundWire 匯流排例項中的以下每個操作:

  • 新增和刪除從裝置,更改從裝置狀態。

  • 準備、啟用、停用和取消準備流操作。

  • 訪問流資料結構。

訊息鎖

SoundWire 訊息傳輸鎖。 此互斥鎖是匯流排資料結構 (sdw_bus) 的一部分。 此鎖用於序列化 SoundWire 匯流排例項中的訊息傳輸(讀取/寫入)。

以下示例顯示瞭如何獲取鎖。

示例 1

訊息傳輸。

  1. 對於每個訊息傳輸

    1. 獲取訊息鎖。

    2. 將訊息(讀取/寫入)傳輸到 Slave1 或在 bank switch 的情況下在總線上廣播訊息。

    3. 釋放訊息鎖

    +----------+                    +---------+
    |          |                    |         |
    |   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
         |                               |
         +                               +
    

示例 2

準備操作。

  1. 獲取與 Master 1 關聯的匯流排例項的鎖。

  2. 對於準備操作中的每個訊息傳輸

    1. 獲取訊息鎖。

    2. 將訊息(讀取/寫入)傳輸到 Slave1 或在 bank switch 的情況下在總線上廣播訊息。

    3. 釋放訊息鎖。

  3. 釋放與 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
         |                               |
         +                               +