Message ID | 20241216-fd-dp-audio-fixup-v4-2-f8d1961cf22f@linaro.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | drm/msm/dp: perform misc cleanups | expand |
Quoting Dmitry Baryshkov (2024-12-15 14:44:07) > 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.baryshkov@linaro.org> > --- Reviewed-by: Stephen Boyd <swboyd@chromium.org> Tested-by: Stephen Boyd <swboyd@chromium.org> # sc7180-trogdor
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.baryshkov@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); >
On Mon, Dec 16, 2024 at 11:32:57AM -0800, Abhinav Kumar wrote: > > > 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.baryshkov@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? A leftover from the previous patchset. > > > #include "dp_display.h" > > #include "dp_utils.h"
On 12/16/2024 2:24 PM, Dmitry Baryshkov wrote: > On Mon, Dec 16, 2024 at 11:32:57AM -0800, Abhinav Kumar wrote: >> >> >> 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.baryshkov@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? > > A leftover from the previous patchset. Feel free to add my Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Once this include is dropped. > >> >>> #include "dp_display.h" >>> #include "dp_utils.h" >
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" #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);
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.baryshkov@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(-)