From 650d61d69919d9427c5b240897f9087dd212a029 Mon Sep 17 00:00:00 2001 From: Andrei-Liviu Simion Date: Wed, 5 Nov 2014 19:06:00 -0800 Subject: [PATCH] dptx: Added a function that fetches a DisplayID EDID extension block. Given a sink, the function will attempt to retrieve an EDID extension block of type DisplayID. Signed-off-by: Andrei-Liviu Simion --- XilinxProcessorIPLib/drivers/dptx/src/xdptx.h | 2 ++ .../drivers/dptx/src/xdptx_edid.c | 33 +++++++++++++++++++ .../drivers/dptx/src/xdptx_hw.h | 22 +++++++++++++ 3 files changed, 57 insertions(+) diff --git a/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h b/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h index 958dd31f..232acc45 100644 --- a/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h +++ b/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h @@ -882,5 +882,7 @@ u32 XDptx_GetRemoteEdid(XDptx *InstancePtr, u8 LinkCountTotal, u32 XDptx_GetEdidBlock(XDptx *InstancePtr, u8 *Data, u8 BlockNum); u32 XDptx_GetRemoteEdidBlock(XDptx *InstancePtr, u8 *Data, u8 BlockNum, u8 LinkCountTotal, u8 *RelativeAddress); +u32 XDptx_GetRemoteEdidDispIdExt(XDptx *InstancePtr, u8 *Data, + u8 LinkCountTotal, u8 *RelativeAddress); #endif /* XDPTX_H_ */ diff --git a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_edid.c b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_edid.c index 3ff88a2d..f1ae313b 100644 --- a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_edid.c +++ b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_edid.c @@ -160,3 +160,36 @@ u32 XDptx_GetRemoteEdidBlock(XDptx *InstancePtr, u8 *Data, u8 BlockNum, return Status; } + +u32 XDptx_GetRemoteEdidDispIdExt(XDptx *InstancePtr, u8 *Data, + u8 LinkCountTotal, u8 *RelativeAddress) +{ + u32 Status; + u8 NumExt; + u8 ExtIndex; + + /* Get the base EDID block. */ + Status = XDptx_GetRemoteEdid(InstancePtr, LinkCountTotal, RelativeAddress, Data); + if (Status != XST_SUCCESS) { + return Status; + } + + NumExt = XDptx_GetExtBlockCount(Data); + for (ExtIndex = 0; ExtIndex < NumExt; ExtIndex++) { + /* Get an EDID extension block. */ + Status = XDptx_GetRemoteEdidBlock(InstancePtr, Data, + ExtIndex + 1, LinkCountTotal, RelativeAddress); + if (Status != XST_SUCCESS) { + return Status; + } + + if (XDptx_IsEdidExtBlockDispId(Data)) { + /* The current extension block is of type DisplayID. */ + return XST_SUCCESS; + } + } + + /* All extension blocks have been searched; no DisplayID extension block + * exists in sink's EDID structure. */ + return XST_FAILURE; +} diff --git a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_hw.h b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_hw.h index cf6a982f..c9f24a24 100644 --- a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_hw.h +++ b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_hw.h @@ -1107,6 +1107,7 @@ #define XDPTX_EDID_BLOCK_SIZE 128 #define XDPTX_EDID_DTD_DD(Num) (0x36 + (18 * Num)) #define XDPTX_EDID_PTM XDPTX_EDID_DTD_DD(0) +#define XDPTX_EDID_EXT_BLOCK_COUNT 0x7E /* @} */ /** @name Extended Display Identification Data: Register offsets for the @@ -1158,6 +1159,20 @@ #define XDPTX_EDID_DTD_SIGNAL_VPOLARITY_SHIFT 2 /* @} */ +/** @name Extended Display Identification Data: Register offsets for the + * DisplayID extension block. + * @{ + */ +#define XDPTX_EDID_EXT_BLOCK_TAG 0x00 +/* @} */ + +/** @name Extended Display Identification Data: Masks, shifts, and register + * values for the DisplayID extension block. + * @{ + */ +#define XDPTX_EDID_EXT_BLOCK_TAG_DISPID 0x70 +/* @} */ + /******************************************************************************/ /** * Multi-stream transport (MST) definitions. @@ -1227,4 +1242,11 @@ #define XDptx_WriteReg(BaseAddress, RegOffset, Data) \ XDptx_Out32((BaseAddress) + (RegOffset), (Data)) + + +#define XDptx_GetExtBlockCount(E) (E[XDPTX_EDID_EXT_BLOCK_COUNT]) + +#define XDptx_IsEdidExtBlockDispId(B) \ + (B[XDPTX_EDID_EXT_BLOCK_TAG] == XDPTX_EDID_EXT_BLOCK_TAG_DISPID) + #endif /* XDPTX_HW_H_ */