On 12/15/2024 2:44 PM, Dmitry Baryshkov wrote:
Use msm_dp_utils_pack_sdp_header() and call msm_dp_write_link() directly
to program audio packet data. Use 0 as Packet ID, as it was not
programmed earlier.

Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
---
  drivers/gpu/drm/msm/dp/dp_audio.c   | 268 ++++++------------------------------
  drivers/gpu/drm/msm/dp/dp_catalog.c |  71 ++++++++++
  drivers/gpu/drm/msm/dp/dp_catalog.h |  10 ++
  3 files changed, 122 insertions(+), 227 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_audio.c 
b/drivers/gpu/drm/msm/dp/dp_audio.c
index 
5cbb11986460d1e4ed1890bdf66d0913e013083c..46fbf8601eea8e43a152049dfd1dc1d77943d922
 100644
--- a/drivers/gpu/drm/msm/dp/dp_audio.c
+++ b/drivers/gpu/drm/msm/dp/dp_audio.c
@@ -14,6 +14,7 @@
  #include "dp_catalog.h"
  #include "dp_audio.h"
  #include "dp_panel.h"
+#include "dp_reg.h"

This change still does reg writes through catalog. Why do you need to include dp_reg.h here?

  #include "dp_display.h"
  #include "dp_utils.h"
@@ -28,251 +29,64 @@ struct msm_dp_audio_private {
        struct msm_dp_audio msm_dp_audio;
  };
-static u32 msm_dp_audio_get_header(struct msm_dp_catalog *catalog,
-               enum msm_dp_catalog_audio_sdp_type sdp,
-               enum msm_dp_catalog_audio_header_type header)
-{
-       return msm_dp_catalog_audio_get_header(catalog, sdp, header);
-}
-
-static void msm_dp_audio_set_header(struct msm_dp_catalog *catalog,
-               u32 data,
-               enum msm_dp_catalog_audio_sdp_type sdp,
-               enum msm_dp_catalog_audio_header_type header)
-{
-       msm_dp_catalog_audio_set_header(catalog, sdp, header, data);
-}
-
  static void msm_dp_audio_stream_sdp(struct msm_dp_audio_private *audio)
  {
-       struct msm_dp_catalog *catalog = audio->catalog;
-       u32 value, new_value;
-       u8 parity_byte;
-
-       /* Config header and parity byte 1 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
-
-       new_value = 0x02;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_1_BIT)
-                       | (parity_byte << PARITY_BYTE_1_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
-
-       /* Config header and parity byte 2 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
-       new_value = value;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_2_BIT)
-                       | (parity_byte << PARITY_BYTE_2_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
-
-       /* Config header and parity byte 3 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
-
-       new_value = audio->channels - 1;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_3_BIT)
-                       | (parity_byte << PARITY_BYTE_3_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
-               value, parity_byte);
-
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
+       struct dp_sdp_header sdp_hdr = {
+               .HB0 = 0x00,
+               .HB1 = 0x02,
+               .HB2 = 0x00,
+               .HB3 = audio->channels - 1,
+       };
+
+       msm_dp_catalog_write_audio_stream(audio->catalog, &sdp_hdr);
  }
static void msm_dp_audio_timestamp_sdp(struct msm_dp_audio_private *audio)
  {
-       struct msm_dp_catalog *catalog = audio->catalog;
-       u32 value, new_value;
-       u8 parity_byte;
-
-       /* Config header and parity byte 1 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
-
-       new_value = 0x1;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_1_BIT)
-                       | (parity_byte << PARITY_BYTE_1_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
-
-       /* Config header and parity byte 2 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
-
-       new_value = 0x17;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_2_BIT)
-                       | (parity_byte << PARITY_BYTE_2_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
-
-       /* Config header and parity byte 3 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
-
-       new_value = (0x0 | (0x11 << 2));
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_3_BIT)
-                       | (parity_byte << PARITY_BYTE_3_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
+       struct dp_sdp_header sdp_hdr = {
+               .HB0 = 0x00,
+               .HB1 = 0x01,
+               .HB2 = 0x17,
+               .HB3 = 0x0 | (0x11 << 2),
+       };
+
+       msm_dp_catalog_write_audio_timestamp(audio->catalog, &sdp_hdr);
  }
static void msm_dp_audio_infoframe_sdp(struct msm_dp_audio_private *audio)
  {
-       struct msm_dp_catalog *catalog = audio->catalog;
-       u32 value, new_value;
-       u8 parity_byte;
-
-       /* Config header and parity byte 1 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
-
-       new_value = 0x84;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_1_BIT)
-                       | (parity_byte << PARITY_BYTE_1_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
-
-       /* Config header and parity byte 2 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
-
-       new_value = 0x1b;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_2_BIT)
-                       | (parity_byte << PARITY_BYTE_2_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
-
-       /* Config header and parity byte 3 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
-
-       new_value = (0x0 | (0x11 << 2));
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_3_BIT)
-                       | (parity_byte << PARITY_BYTE_3_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
-                       new_value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
+       struct dp_sdp_header sdp_hdr = {
+               .HB0 = 0x00,
+               .HB1 = 0x84,
+               .HB2 = 0x1b,
+               .HB3 = 0x0 | (0x11 << 2),
+       };
+
+       msm_dp_catalog_write_audio_infoframe(audio->catalog, &sdp_hdr);
  }
static void msm_dp_audio_copy_management_sdp(struct msm_dp_audio_private *audio)
  {
-       struct msm_dp_catalog *catalog = audio->catalog;
-       u32 value, new_value;
-       u8 parity_byte;
-
-       /* Config header and parity byte 1 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
-
-       new_value = 0x05;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_1_BIT)
-                       | (parity_byte << PARITY_BYTE_1_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
-
-       /* Config header and parity byte 2 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
-
-       new_value = 0x0F;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_2_BIT)
-                       | (parity_byte << PARITY_BYTE_2_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
-
-       /* Config header and parity byte 3 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
-
-       new_value = 0x0;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_3_BIT)
-                       | (parity_byte << PARITY_BYTE_3_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
+       struct dp_sdp_header sdp_hdr = {
+               .HB0 = 0x00,
+               .HB1 = 0x05,
+               .HB2 = 0x0f,
+               .HB3 = 0x00,
+       };
+
+       msm_dp_catalog_write_audio_copy_mgmt(audio->catalog, &sdp_hdr);
  }
static void msm_dp_audio_isrc_sdp(struct msm_dp_audio_private *audio)
  {
-       struct msm_dp_catalog *catalog = audio->catalog;
-       u32 value, new_value;
-       u8 parity_byte;
-
-       /* Config header and parity byte 1 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
-
-       new_value = 0x06;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_1_BIT)
-                       | (parity_byte << PARITY_BYTE_1_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
-
-       /* Config header and parity byte 2 */
-       value = msm_dp_audio_get_header(catalog,
-                       DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
-
-       new_value = 0x0F;
-       parity_byte = msm_dp_utils_calculate_parity(new_value);
-       value |= ((new_value << HEADER_BYTE_2_BIT)
-                       | (parity_byte << PARITY_BYTE_2_BIT));
-       drm_dbg_dp(audio->drm_dev,
-                       "Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
-                       value, parity_byte);
-       msm_dp_audio_set_header(catalog, value,
-               DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
+       struct dp_sdp_header sdp_hdr = {
+               .HB0 = 0x00,
+               .HB1 = 0x06,
+               .HB2 = 0x0f,
+               .HB3 = 0x00,
+       };
+
+       msm_dp_catalog_write_audio_isrc(audio->catalog, &sdp_hdr);
  }
static void msm_dp_audio_setup_sdp(struct msm_dp_audio_private *audio)
diff --git a/drivers/gpu/drm/msm/dp/dp_catalog.c 
b/drivers/gpu/drm/msm/dp/dp_catalog.c
index 
6a30996200bc7fbaacd0502f096e787f754752de..8fddfe5d85d6398c6582e1f74647f4cd83f5a4d9
 100644
--- a/drivers/gpu/drm/msm/dp/dp_catalog.c
+++ b/drivers/gpu/drm/msm/dp/dp_catalog.c
@@ -1122,6 +1122,77 @@ struct msm_dp_catalog *msm_dp_catalog_get(struct device 
*dev)
        return &catalog->msm_dp_catalog;
  }
+void msm_dp_catalog_write_audio_stream(struct msm_dp_catalog *msm_dp_catalog,
+                                      struct dp_sdp_header *sdp_hdr)
+{
+       struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
+                               struct msm_dp_catalog_private, msm_dp_catalog);
+       u32 header[2];
+
+       msm_dp_utils_pack_sdp_header(sdp_hdr, header);
+
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_STREAM_0, header[0]);
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_STREAM_1, header[1]);
+}
+
+void msm_dp_catalog_write_audio_timestamp(struct msm_dp_catalog 
*msm_dp_catalog,
+                                         struct dp_sdp_header *sdp_hdr)
+{
+       struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
+                               struct msm_dp_catalog_private, msm_dp_catalog);
+       u32 header[2];
+
+       msm_dp_utils_pack_sdp_header(sdp_hdr, header);
+
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_TIMESTAMP_0, header[0]);
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_TIMESTAMP_1, header[1]);
+}
+
+void msm_dp_catalog_write_audio_infoframe(struct msm_dp_catalog 
*msm_dp_catalog,
+                                         struct dp_sdp_header *sdp_hdr)
+{
+       struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
+                               struct msm_dp_catalog_private, msm_dp_catalog);
+       u32 header[2];
+
+       msm_dp_utils_pack_sdp_header(sdp_hdr, header);
+
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_INFOFRAME_0, header[0]);
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_INFOFRAME_1, header[1]);
+}
+
+void msm_dp_catalog_write_audio_copy_mgmt(struct msm_dp_catalog 
*msm_dp_catalog,
+                                         struct dp_sdp_header *sdp_hdr)
+{
+       struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
+                               struct msm_dp_catalog_private, msm_dp_catalog);
+       u32 header[2];
+
+       msm_dp_utils_pack_sdp_header(sdp_hdr, header);
+
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_COPYMANAGEMENT_0, header[0]);
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_COPYMANAGEMENT_1, header[1]);
+}
+
+void msm_dp_catalog_write_audio_isrc(struct msm_dp_catalog *msm_dp_catalog,
+                                    struct dp_sdp_header *sdp_hdr)
+{
+       struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
+                               struct msm_dp_catalog_private, msm_dp_catalog);
+       struct dp_sdp_header tmp = *sdp_hdr;
+       u32 header[2];
+       u32 reg;
+
+       /* XXX: is it necessary to preserve this field? */
+       reg = msm_dp_read_link(catalog, MMSS_DP_AUDIO_ISRC_1);
+       tmp.HB3 = FIELD_GET(HEADER_3_MASK, reg);
+
+       msm_dp_utils_pack_sdp_header(&tmp, header);
+
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_ISRC_0, header[0]);
+       msm_dp_write_link(catalog, MMSS_DP_AUDIO_ISRC_1, header[1]);
+}
+
  u32 msm_dp_catalog_audio_get_header(struct msm_dp_catalog *msm_dp_catalog,
                                enum msm_dp_catalog_audio_sdp_type sdp,
                                enum msm_dp_catalog_audio_header_type header)
diff --git a/drivers/gpu/drm/msm/dp/dp_catalog.h 
b/drivers/gpu/drm/msm/dp/dp_catalog.h
index 
62a401d8f75a6af06445a42af657d65e3fe542c5..4a5591d9f82a21d7a3bb64ad6b486e39bd406cd5
 100644
--- a/drivers/gpu/drm/msm/dp/dp_catalog.h
+++ b/drivers/gpu/drm/msm/dp/dp_catalog.h
@@ -111,6 +111,16 @@ void msm_dp_catalog_panel_tpg_disable(struct 
msm_dp_catalog *msm_dp_catalog);
  struct msm_dp_catalog *msm_dp_catalog_get(struct device *dev);
/* DP Audio APIs */
+void msm_dp_catalog_write_audio_stream(struct msm_dp_catalog *msm_dp_catalog,
+                                      struct dp_sdp_header *sdp_hdr);
+void msm_dp_catalog_write_audio_timestamp(struct msm_dp_catalog 
*msm_dp_catalog,
+                                         struct dp_sdp_header *sdp_hdr);
+void msm_dp_catalog_write_audio_infoframe(struct msm_dp_catalog 
*msm_dp_catalog,
+                                         struct dp_sdp_header *sdp_hdr);
+void msm_dp_catalog_write_audio_copy_mgmt(struct msm_dp_catalog 
*msm_dp_catalog,
+                                         struct dp_sdp_header *sdp_hdr);
+void msm_dp_catalog_write_audio_isrc(struct msm_dp_catalog *msm_dp_catalog,
+                                    struct dp_sdp_header *sdp_hdr);
  u32 msm_dp_catalog_audio_get_header(struct msm_dp_catalog *msm_dp_catalog,
                                enum msm_dp_catalog_audio_sdp_type sdp,
                                enum msm_dp_catalog_audio_header_type header);

Reply via email to