dp: HDCP additions and unplug interrupt.

Added new interrupts, callbacks, and macros related to HDCP (High-bandwidth
Digital Content Protection).
Added new interrupts, callbacks, and macros for an unplug event.

Signed-off-by: Andrei-Liviu Simion <andrei.simion@xilinx.com>
Reviewed-by: Hyun Kwon <hyun.kwon@xilinx.com>
This commit is contained in:
Andrei-Liviu Simion 2015-08-04 01:38:17 -07:00 committed by Nava kishore Manne
parent f3e3c76a68
commit 0ebb5dbdfe
3 changed files with 352 additions and 3 deletions

View file

@ -343,6 +343,8 @@
* XDp_TxSbMsgLinkAddressReplyDeviceInfo
* GUID type change for ease of use:
* 'u32 Guid[4]' changed to 'u8 Guid[16]'
* Added handlers and setter functions for HDCP and unplug
* events.
* </pre>
*
*******************************************************************************/
@ -809,7 +811,7 @@ typedef struct {
} XDp_Tx;
/**
* The XDp driver instance data representing the TX mode of operation.
* The XDp driver instance data representing the RX mode of operation.
*/
typedef struct {
XDp_RxTopology Topology; /**< Topology of connected sinks
@ -944,6 +946,53 @@ typedef struct {
passed to the CRC test
start callback
function. */
XDp_IntrHandler IntrHdcpDbgWrHandler; /**< Callback function for
HDCP debug register
write interrupts. */
void *IntrHdcpDbgWrCallbackRef; /**< A pointer to the user data
passed to the hdcp
debug register write
callback function. */
XDp_IntrHandler IntrHdcpAksvWrHandler; /**< Callback function for
HDCP Aksv MSB register
write interrupts. */
void *IntrHdcpAksvWrCallbackRef; /**< A pointer to the user data
passed to the HDCP
Aksv MSB register write
callback function. */
XDp_IntrHandler IntrHdcpAnWrHandler; /**< Callback function for
HDCP An MSB register
write interrupts. */
void *IntrHdcpAnWrCallbackRef; /**< A pointer to the user data
passed to the HDCP
An MSB register write
callback function. */
XDp_IntrHandler IntrHdcpAinfoWrHandler; /**< Callback function for
HDCP Ainfo register
write interrupts. */
void *IntrHdcpAinfoWrCallbackRef; /**< A pointer to the user data
passed to the HDCP
Ainfo register write
callback function. */
XDp_IntrHandler IntrHdcpRoRdHandler; /**< Callback function for
HDCP Ro register
read interrupts. */
void *IntrHdcpRoRdCallbackRef; /**< A pointer to the user data
passed to the HDCP
Ro register read
callback function. */
XDp_IntrHandler IntrHdcpBinfoRdHandler; /**< Callback function for
HDCP Binfo register
read interrupts. */
void *IntrHdcpBinfoRdCallbackRef; /**< A pointer to the user data
passed to the HDCP
Binfo register read
callback function. */
XDp_IntrHandler IntrUnplugHandler; /**< Callback function for
unplug interrupts. */
void *IntrUnplugCallbackRef; /**< A pointer to the user data
passed to the unplug
callback function. */
} XDp_Rx;
/**
@ -1088,6 +1137,20 @@ void XDp_RxSetIntrActRxHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrCrcTestHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrHdcpDebugWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrHdcpAksvWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrHdcpAnWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrHdcpAinfoWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrHdcpRoReadHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrHdcpBinfoReadHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
void XDp_RxSetIntrUnplugHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef);
/* xdp_mst.c: Multi-stream transport (MST) functions for enabling or disabling
* MST mode. */

View file

@ -300,6 +300,12 @@
extension packet. */
/* @} */
/** @name DPTX core registers: HDCP.
* @{
*/
#define XDP_TX_HDCP_ENABLE 0x400 /**< Enables HDCP core. */
/* @} */
/** @name DPTX core registers: Main stream attributes for MST STREAM2, 3, and 4.
* @{
*/
@ -748,6 +754,11 @@
#define XDP_TX_GT_DRP_COMMAND_DRP_W_DATA_SHIFT \
16 /**< Shift bits for DRP write
data. */
/* 0x400: XDP_TX_HDCP_ENABLE */
#define XDP_TX_HDCP_ENABLE_BYPASS_DISABLE_MASK \
0x0001 /**< Disables bypass of the
HDCP core. */
/* @} */
/******************************************************************************/
@ -1128,6 +1139,13 @@
of stream 1. */
/* @} */
/** @name DPRX core registers: DPCD registers for HDCP.
* @{
*/
#define XDP_RX_DPCD_HDCP_TABLE 0x900 /**< HDCP register table
(0x100 bytes). */
/* @} */
/** @name DPRX core registers: MST field for sideband message buffers and the
* virtual channel payload table.
* @{
@ -1259,6 +1277,30 @@
#define XDP_RX_INTERRUPT_MASK_TP3_MASK 0x00040000 /**< Mask the interrupt
assertion for start of
training pattern 3. */
#define XDP_RX_INTERRUPT_MASK_HDCP_DEBUG_WRITE_MASK \
0x00080000 /**< Mask the interrupt
for a write to any HDCP
debug register. */
#define XDP_RX_INTERRUPT_MASK_HDCP_AKSV_WRITE_MASK \
0x00100000 /**< Mask the interrupt
for a write to the HDCP
AKSV MSB register. */
#define XDP_RX_INTERRUPT_MASK_HDCP_AN_WRITE_MASK \
0x00200000 /**< Mask the interrupt
for a write to the HDCP
An MSB register. */
#define XDP_RX_INTERRUPT_MASK_HDCP_AINFO_WRITE_MASK \
0x00400000 /**< Mask the interrupt
for a write to the HDCP
AInfo register. */
#define XDP_RX_INTERRUPT_MASK_HDCP_RO_READ_MASK \
0x00800000 /**< Mask the interrupt
for a read of the HDCP
Ro register. */
#define XDP_RX_INTERRUPT_MASK_HDCP_BINFO_READ_MASK \
0x01000000 /**< Mask the interrupt
for a read of the HDCP
BInfo register. */
#define XDP_RX_INTERRUPT_MASK_AUDIO_OVER_MASK \
0x08000000 /**< Mask the interrupt
assertion caused for an
@ -1281,8 +1323,10 @@
0x40000000 /**< Mask the interrupt
assertion for the start
of a CRC test. */
#define XDP_RX_INTERRUPT_MASK_ALL_MASK 0x7807FFFF /**< Mask all interrupts. */
#define XDP_RX_INTERRUPT_MASK_UNPLUG_MASK \
0x80000000 /**< Mask the unplug event
interrupt. */
#define XDP_RX_INTERRUPT_MASK_ALL_MASK 0xF9FFFFFF /**< Mask all interrupts. */
/* 0x018: MISC_CTRL */
#define XDP_RX_MISC_CTRL_USE_FILT_MSA_MASK \
0x1 /**< When set, two matching
@ -1407,6 +1451,9 @@
#define XDP_RX_INTERRUPT_CAUSE_CRC_TEST_MASK \
XDP_RX_INTERRUPT_MASK_CRC_TEST_MASK /**< Interrupt caused by the
start of a CRC test. */
#define XDP_RX_INTERRUPT_CAUSE_UNPLUG_MASK \
XDP_RX_INTERRUPT_MASK_UNPLUG_MASK /**< Interrupt caused by the
an unplug event. */
/* 0x044: INTERRUPT_MASK_1 */
#define XDP_RX_INTERRUPT_MASK_1_EXT_PKT_STREAM234_MASK(Stream) \
(0x00001 << ((Stream - 2) * 6)) /**< Mask the interrupt
@ -1531,6 +1578,9 @@
0x02 /**< Reflects the
SINK_SPECIFIC_IRQ
state. */
#define XDP_RX_DEVICE_SERVICE_IRQ_CP_IRQ_MASK \
0x04 /**< Generates a CP IRQ
event */
#define XDP_RX_DEVICE_SERVICE_IRQ_NEW_DOWN_REPLY_MASK \
0x10 /**< Indicates a new DOWN_REPLY
buffer message is

View file

@ -45,6 +45,8 @@
* ----- ---- -------- -----------------------------------------------
* 1.0 als 01/20/15 Initial release. TX code merged from the dptx driver.
* 2.0 als 06/08/15 Added MST interrupt handlers for RX.
* Added HDCP interrupts.
* Added unplug interrupt.
* </pre>
*
*******************************************************************************/
@ -593,6 +595,174 @@ void XDp_RxSetIntrTp3Handler(XDp *InstancePtr,
InstancePtr->RxInstance.IntrTp3CallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a write to any hdcp
* debug register occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrHdcpDebugWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrHdcpDbgWrHandler = CallbackFunc;
InstancePtr->RxInstance.IntrHdcpDbgWrCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a write to the hdcp
* Aksv MSB register occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrHdcpAksvWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrHdcpAksvWrHandler = CallbackFunc;
InstancePtr->RxInstance.IntrHdcpAksvWrCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a write to the hdcp
* An MSB register occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrHdcpAnWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrHdcpAnWrHandler = CallbackFunc;
InstancePtr->RxInstance.IntrHdcpAnWrCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a write to the hdcp
* Ainfo MSB register occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrHdcpAinfoWriteHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrHdcpAinfoWrHandler = CallbackFunc;
InstancePtr->RxInstance.IntrHdcpAinfoWrCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a read of the hdcp
* Ro/Ri MSB register occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrHdcpRoReadHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrHdcpRoRdHandler = CallbackFunc;
InstancePtr->RxInstance.IntrHdcpRoRdCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a read of the hdcp
* Binfo register occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrHdcpBinfoReadHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrHdcpBinfoRdHandler = CallbackFunc;
InstancePtr->RxInstance.IntrHdcpBinfoRdCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when a down request interrupt
@ -762,6 +932,34 @@ void XDp_RxSetIntrCrcTestHandler(XDp *InstancePtr,
InstancePtr->RxInstance.IntrCrcTestCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function installs a callback function for when an unplug event interrupt
* occurs.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param CallbackFunc is the address to the callback function.
* @param CallbackRef is the user data item that will be passed to the
* callback function when it is invoked.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XDp_RxSetIntrUnplugHandler(XDp *InstancePtr,
XDp_IntrHandler CallbackFunc, void *CallbackRef)
{
/* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(XDp_GetCoreType(InstancePtr) == XDP_RX);
Xil_AssertVoid(CallbackFunc != NULL);
Xil_AssertVoid(CallbackRef != NULL);
InstancePtr->RxInstance.IntrUnplugHandler = CallbackFunc;
InstancePtr->RxInstance.IntrUnplugCallbackRef = CallbackRef;
}
/******************************************************************************/
/**
* This function is the interrupt handler for the XDp driver operating in TX
@ -952,4 +1150,42 @@ static void XDp_RxInterruptHandler(XDp *InstancePtr)
InstancePtr->RxInstance.IntrCrcTestHandler(
InstancePtr->RxInstance.IntrCrcTestCallbackRef);
}
/* A write to one of the HDCP debug registers has been performed. */
if (IntrStatus & XDP_RX_INTERRUPT_MASK_HDCP_DEBUG_WRITE_MASK) {
InstancePtr->RxInstance.IntrHdcpDbgWrHandler(
InstancePtr->RxInstance.IntrHdcpDbgWrCallbackRef);
}
/* A write to the HDCP Aksv MSB register has been performed. */
if (IntrStatus & XDP_RX_INTERRUPT_MASK_HDCP_AKSV_WRITE_MASK) {
InstancePtr->RxInstance.IntrHdcpAksvWrHandler(
InstancePtr->RxInstance.IntrHdcpAksvWrCallbackRef);
}
/* A write to the HDCP An MSB register has been performed. */
if (IntrStatus & XDP_RX_INTERRUPT_MASK_HDCP_AN_WRITE_MASK) {
InstancePtr->RxInstance.IntrHdcpAnWrHandler(
InstancePtr->RxInstance.IntrHdcpAnWrCallbackRef);
}
/* A write to the HDCP Ainfo MSB register has been performed. */
if (IntrStatus & XDP_RX_INTERRUPT_MASK_HDCP_AINFO_WRITE_MASK) {
InstancePtr->RxInstance.IntrHdcpAinfoWrHandler(
InstancePtr->RxInstance.IntrHdcpAinfoWrCallbackRef);
}
/* A read of the HDCP Ro register has been performed. */
if (IntrStatus & XDP_RX_INTERRUPT_MASK_HDCP_RO_READ_MASK) {
InstancePtr->RxInstance.IntrHdcpRoRdHandler(
InstancePtr->RxInstance.IntrHdcpRoRdCallbackRef);
}
/* A read of the HDCP Binfo register has been performed. */
if (IntrStatus & XDP_RX_INTERRUPT_MASK_HDCP_BINFO_READ_MASK) {
InstancePtr->RxInstance.IntrHdcpBinfoRdHandler(
InstancePtr->RxInstance.IntrHdcpBinfoRdCallbackRef);
}
/* An unplug event has occurred. */
if ((IntrStatus & XDP_RX_INTERRUPT_CAUSE_UNPLUG_MASK) &&
InstancePtr->RxInstance.IntrUnplugHandler) {
InstancePtr->RxInstance.IntrUnplugHandler(
InstancePtr->RxInstance.IntrUnplugCallbackRef);
}
}