dp: rx: mst: Set PBN values for each connected downstream port.

Signed-off-by: Andrei-Liviu Simion <andrei.simion@xilinx.com>
This commit is contained in:
Andrei-Liviu Simion 2015-04-29 17:09:49 -07:00 committed by Nava kishore Manne
parent 80effc4ccf
commit 89d29bdaac
2 changed files with 71 additions and 0 deletions

View file

@ -622,6 +622,11 @@ typedef struct {
message, it responds with the
associated DPCD map for the
requested port. */
u16 FullPbn; /**< The payload bandwidth number (PBN)
associated with the sink
connected to this port. */
u16 AvailPbn; /**< The available PBN of the sink
connected to this port. */
u8 Exposed; /**< When set to 1, the RX branch device
will expose the port in the
LINK_ADDRESS reply. */
@ -1050,6 +1055,7 @@ void XDp_RxMstSetPort(XDp *InstancePtr, u8 PortNum,
XDp_SbMsgLinkAddressReplyPortDetail *PortDetails);
void XDp_RxMstSetInputPort(XDp *InstancePtr, u8 PortNum,
XDp_SbMsgLinkAddressReplyPortDetail *PortOverride);
void XDp_RxMstSetPbn(XDp *InstancePtr, u8 PortNum, u16 PbnVal);
/* xdp_selftest.c: Self test function. */
u32 XDp_SelfTest(XDp *InstancePtr);

View file

@ -155,6 +155,7 @@ static u32 XDp_RxSetRemoteDpcdReadReply(XDp *InstancePtr, XDp_SidebandMsg *Msg);
static u32 XDp_RxSetRemoteIicReadReply(XDp *InstancePtr, XDp_SidebandMsg *Msg);
static void XDp_RxDeviceInfoToRawData(XDp *InstancePtr, XDp_SidebandMsg *Msg);
static void XDp_RxAllocatePayload(XDp *InstancePtr, XDp_SidebandMsg *Msg);
static void XDp_RxSetAvailPbn(XDp *InstancePtr, XDp_SidebandMsg *Msg);
static void XDp_TxIssueGuid(XDp *InstancePtr, u8 LinkCountTotal,
u8 *RelativeAddress, XDp_TxTopology *Topology,
u32 *Guid);
@ -2513,6 +2514,27 @@ void XDp_RxMstSetInputPort(XDp *InstancePtr, u8 PortNum,
XDp_RxMstExposePort(InstancePtr, PortNum, 1);
}
/******************************************************************************/
/**
* This function will set the available payload bandwidth number (PBN) of the
* specified port that is available for allocation, and the full PBN that the
* port is capable of using.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param PortNum is the port number to set the PBN values for.
* @param PbnVal is the value to set the port's available and full PBN to.
*
* @return None.
*
* @note The available PBN is set to 100% of the full PBN.
*
*******************************************************************************/
void XDp_RxMstSetPbn(XDp *InstancePtr, u8 PortNum, u16 PbnVal)
{
InstancePtr->RxInstance.Topology.Ports[PortNum].FullPbn = PbnVal;
InstancePtr->RxInstance.Topology.Ports[PortNum].AvailPbn = PbnVal;
}
/******************************************************************************/
/**
* This function will set and format a sideband message structure for replying
@ -2896,6 +2918,49 @@ static void XDp_RxAllocatePayload(XDp *InstancePtr, XDp_SidebandMsg *Msg)
XDP_RX_MST_CAP_VCP_UPDATE_MASK);
}
/******************************************************************************/
/**
* This function will set the available and full payload bandwidth numbers (PBN)
* based on CLEAR_PAYLOAD and ALLOCATE_PAYLOAD sideband messages.
*
* @param InstancePtr is a pointer to the XDp instance.
* @param Msg is a pointer to the structure holding the CLEAR_PAYLOAD or
* ALLOCATE_PAYLOAD sideband message.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
static void XDp_RxSetAvailPbn(XDp *InstancePtr, XDp_SidebandMsg *Msg)
{
u8 Index;
u8 PortNum;
u16 PbnReq;
XDp_RxTopology *Topology;
Topology = &InstancePtr->RxInstance.Topology;
if (Msg->Body.MsgData[0] == XDP_TX_SBMSG_CLEAR_PAYLOAD_ID_TABLE) {
for (Index = 0; Index < 16; Index++) {
Topology->Ports[Index].AvailPbn =
Topology->Ports[Index].FullPbn;
}
}
else if (Msg->Body.MsgData[0] == XDP_TX_SBMSG_ALLOCATE_PAYLOAD) {
PortNum = Msg->Body.MsgData[1] >> 4;
PbnReq = (Msg->Body.MsgData[3] << 8) | Msg->Body.MsgData[4];
if (PbnReq) {
Topology->Ports[PortNum].AvailPbn = 0;
}
else {
Topology->Ports[PortNum].AvailPbn =
Topology->Ports[PortNum].FullPbn;
}
}
}
/******************************************************************************/
/**
* This function will check whether or not a DisplayPort device has a global