On 23.01.2017 10:17, Archit Taneja wrote:
>
> On 01/20/2017 01:08 PM, Andrzej Hajda wrote:
>> MHL3 protocol requires registry adjustments depending on chosen video mode.
>> Necessary information is gathered in mode_fixup callback. In case of HDMI
>> video modes driver should also send special AVI and MHL infoframes.
>>
>> Signed-off-by: Andrzej Hajda <a.ha...@samsung.com>
>> ---
>>  drivers/gpu/drm/bridge/sil-sii8620.c | 249 
>> +++++++++++++++++++++++++++++++----
>>  drivers/gpu/drm/bridge/sil-sii8620.h |  15 ++-
>>  2 files changed, 231 insertions(+), 33 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c 
>> b/drivers/gpu/drm/bridge/sil-sii8620.c
>> index 1c76905..2c7b5b9 100644
>> --- a/drivers/gpu/drm/bridge/sil-sii8620.c
>> +++ b/drivers/gpu/drm/bridge/sil-sii8620.c
>> @@ -32,6 +32,8 @@
>>
>>  #define SII8620_BURST_BUF_LEN 288
>>  #define VAL_RX_HDMI_CTRL2_DEFVAL VAL_RX_HDMI_CTRL2_IDLE_CNT(3)
>> +#define MHL1_MAX_LCLK 225000
>> +#define MHL3_MAX_LCLK 600000
>>
>>  enum sii8620_mode {
>>      CM_DISCONNECTED,
>> @@ -62,6 +64,9 @@ struct sii8620 {
>>      struct regulator_bulk_data supplies[2];
>>      struct mutex lock; /* context lock, protects fields below */
>>      int error;
>> +    int pixel_clock;
>> +    unsigned int use_packed_pixel:1;
>> +    int video_code;
>>      enum sii8620_mode mode;
>>      enum sii8620_sink_type sink_type;
>>      u8 cbus_status;
>> @@ -69,7 +74,7 @@ struct sii8620 {
>>      u8 xstat[MHL_XDS_SIZE];
>>      u8 devcap[MHL_DCAP_SIZE];
>>      u8 xdevcap[MHL_XDC_SIZE];
>> -    u8 avif[19];
>> +    u8 avif[HDMI_INFOFRAME_SIZE(AVI)];
>>      struct edid *edid;
>>      unsigned int gen2_write_burst:1;
>>      enum sii8620_mt_state mt_state;
>> @@ -685,6 +690,40 @@ static void sii8620_burst_tx_rbuf_info(struct sii8620 
>> *ctx, int size)
>>      d->size = cpu_to_le16(size);
>>  }
>>
>> +static u8 sii8620_checksum(void *ptr, int size)
>> +{
>> +    u8 *d = ptr, sum = 0;
>> +
>> +    while (size--)
>> +            sum += *d++;
>> +
>> +    return sum;
>> +}
>> +
>> +static void sii8620_mhl_burst_hdr_set(struct mhl3_burst_header *h,
>> +    enum mhl_burst_id id)
>> +{
>> +    h->id = cpu_to_be16(id);
>> +    h->total_entries = 1;
>> +    h->sequence_index = 1;
>> +}
>> +
>> +static void sii8620_burst_tx_bits_per_pixel_fmt(struct sii8620 *ctx, u8 fmt)
>> +{
>> +    struct mhl_burst_bits_per_pixel_fmt *d;
>> +    const int size = sizeof(*d) + sizeof(d->desc[0]);
>> +
>> +    d = sii8620_burst_get_tx_buf(ctx, size);
>> +    if (!d)
>> +            return;
>> +
>> +    sii8620_mhl_burst_hdr_set(&d->hdr, MHL_BURST_ID_BITS_PER_PIXEL_FMT);
>> +    d->num_entries = 1;
>> +    d->desc[0].stream_id = 0;
>> +    d->desc[0].pixel_format = fmt;
>> +    d->hdr.checksum -= sii8620_checksum(d, size);
>> +}
>> +
>>  static void sii8620_burst_rx_all(struct sii8620 *ctx)
>>  {
>>      u8 *d = ctx->burst.rx_buf;
>> @@ -949,32 +988,162 @@ static void sii8620_stop_video(struct sii8620 *ctx)
>>      sii8620_write(ctx, REG_TPI_SC, val);
>>  }
>>
>> +static void sii8620_set_format(struct sii8620 *ctx)
>> +{
>> +    u8 out_fmt;
>> +
>> +    if (sii8620_is_mhl3(ctx)) {
>> +            sii8620_setbits(ctx, REG_M3_P0CTRL,
>> +                            BIT_M3_P0CTRL_MHL3_P0_PIXEL_MODE_PACKED,
>> +                            ctx->use_packed_pixel ? ~0 : 0);
>> +    } else {
>> +            if (ctx->use_packed_pixel)
>> +                    sii8620_write_seq_static(ctx,
>> +                            REG_VID_MODE, BIT_VID_MODE_M1080P,
>> +                            REG_MHL_TOP_CTL, BIT_MHL_TOP_CTL_MHL_PP_SEL | 1,
>> +                            REG_MHLTX_CTL6, 0x60
>> +                    );
>> +            else
>> +                    sii8620_write_seq_static(ctx,
>> +                            REG_VID_MODE, 0,
>> +                            REG_MHL_TOP_CTL, 1,
>> +                            REG_MHLTX_CTL6, 0xa0
>> +                    );
>> +    }
>> +
>> +    if (ctx->use_packed_pixel)
>> +            out_fmt = VAL_TPI_FORMAT(YCBCR422, FULL) |
>> +                    BIT_TPI_OUTPUT_CSCMODE709;
>> +    else
>> +            out_fmt = VAL_TPI_FORMAT(RGB, FULL);
>> +
>> +    sii8620_write_seq(ctx,
>> +            REG_TPI_INPUT, VAL_TPI_FORMAT(RGB, FULL),
>> +            REG_TPI_OUTPUT, out_fmt,
>> +    );
>> +}
>> +
>> +#define MHL3_VSIF_TYPE              0x81
>> +#define MHL3_VSIF_VERSION   0x03
>> +#define MHL3_VSIF_LENGTH    0x0f
>> +#define IEEE_OUI_MHL3               0x7CA61D
> Should these be in mhl.h?
>
> Some of these seem similar to the infoframe related defs
> in include/linux/hdmi.h
>
> Do you think there should be equivalent helpers for mhl infoframes
> similar to hdmi_vendor_infoframe_init
> and hdmi_vendor_infoframe_pack()?

Answer is yes, IMHO, for both questions, but since the only
documentation I have access to is vendor code I am little bit hesitant
in pushing such things into mhl header.
I am not sure if I can properly describe all fields of MHL3 VSIF
infoframe, but beside this I have no objections :)
One thing is in case of implementing mhl infoframe helpers: where to put
them to, ie which file?

Regards
Andrzej

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to