From 0fd3fc6d541e0ee427eec50142a5649e859e7b40 Mon Sep 17 00:00:00 2001 From: Andrei-Liviu Simion Date: Sat, 4 Apr 2015 19:23:03 -0700 Subject: [PATCH] dp: rx: mst: Added ability to set an I2C map for each port. The "I2C map" terminology is used to refer to a set of I2C entries for a given port. Each I2C entry contains an I2C address associated with that entry, alongside a user-defined data structure which is to be pointed to. This is the mechanism for which the driver allows the RX application to control what data to be sent for a given I2C address when a REMOTE_I2C_READ is issued by an upstream device. Signed-off-by: Andrei-Liviu Simion --- XilinxProcessorIPLib/drivers/dp/src/xdp.h | 20 +++-- XilinxProcessorIPLib/drivers/dp/src/xdp_hw.h | 4 + XilinxProcessorIPLib/drivers/dp/src/xdp_mst.c | 83 +++++++++++++++++++ 3 files changed, 99 insertions(+), 8 deletions(-) diff --git a/XilinxProcessorIPLib/drivers/dp/src/xdp.h b/XilinxProcessorIPLib/drivers/dp/src/xdp.h index d2f600d7..633c6581 100644 --- a/XilinxProcessorIPLib/drivers/dp/src/xdp.h +++ b/XilinxProcessorIPLib/drivers/dp/src/xdp.h @@ -598,14 +598,14 @@ typedef struct { * duplicated here. */ typedef struct { - XDp_RxIicMapEntry IicMap[3]; /**< The I2C map of the internal sinks. - When the RX replies to a - REMOTE_I2C_READ sideband - message, it responds with the - associated I2C map for the - requested port. The driver - allows up to 3 I2C addresses per - port to be user-defined. */ + XDp_RxIicMapEntry IicMap[XDP_RX_NUM_I2C_ENTRIES_PER_PORT]; /**< When the + RX replies to a REMOTE_I2C_READ + sideband message, it responds + with the associated I2C map for + the requested port. The driver + allows the user to define up to + XDP_RX_NUM_I2C_ENTRIES_PER_PORT + I2C addresses per port. */ u8 Exposed; /**< When set to 1, the RX branch device will expose the port in the LINK_ADDRESS reply. */ @@ -1022,6 +1022,10 @@ void XDp_TxWriteGuid(XDp *InstancePtr, u8 LinkCountTotal, u8 *RelativeAddress, u32 Guid[4]); void XDp_TxGetGuid(XDp *InstancePtr, u8 LinkCountTotal, u8 *RelativeAddress, u32 *Guid); +XDp_RxIicMapEntry *XDp_RxGetIicMapEntry(XDp *InstancePtr, u8 PortNum, + u8 IicAddress); +u32 XDp_RxSetIicMapEntry(XDp *InstancePtr, u8 PortNum, u8 IicAddress, + u8 ReadNumBytes, u8 *ReadData); void XDp_RxMstExposePort(XDp *InstancePtr, u8 PortNum, u8 Expose); void XDp_RxMstSetPort(XDp *InstancePtr, u8 PortNum, XDp_SbMsgLinkAddressReplyPortDetail *PortDetails); diff --git a/XilinxProcessorIPLib/drivers/dp/src/xdp_hw.h b/XilinxProcessorIPLib/drivers/dp/src/xdp_hw.h index 53b58d53..ffc71a14 100644 --- a/XilinxProcessorIPLib/drivers/dp/src/xdp_hw.h +++ b/XilinxProcessorIPLib/drivers/dp/src/xdp_hw.h @@ -2291,6 +2291,10 @@ #define XDP_TX_SBMSG_REMOTE_I2C_WRITE 0x23 /* @} */ +#define XDP_RX_NUM_I2C_ENTRIES_PER_PORT 3 /**< The number of I2C user- + defined entries in the + I2C map of each port. */ + /******************* Macros (Inline Functions) Definitions ********************/ /** @name Register access macro definitions. diff --git a/XilinxProcessorIPLib/drivers/dp/src/xdp_mst.c b/XilinxProcessorIPLib/drivers/dp/src/xdp_mst.c index 96c5609b..3c77c282 100644 --- a/XilinxProcessorIPLib/drivers/dp/src/xdp_mst.c +++ b/XilinxProcessorIPLib/drivers/dp/src/xdp_mst.c @@ -2295,6 +2295,89 @@ void XDp_TxGetGuid(XDp *InstancePtr, u8 LinkCountTotal, u8 *RelativeAddress, } } +/******************************************************************************/ +/** + * This function returns a pointer to the I2C map entry at the supplied I2C + * address for the specified port. + * + * @param InstancePtr is a pointer to the XDp instance. + * @param PortNum is the port number for which to obtain the I2C map entry + * for. + * @param IicAddress is the I2C address of the map entry. + * + * @return + * - NULL if no entry exists in the I2C map corresponding to the + * supplied I2C address for the given port. + * - Otherwise, a pointer to the I2C map entry with the specified + * I2C address. + * + * @note None. + * +*******************************************************************************/ +XDp_RxIicMapEntry *XDp_RxGetIicMapEntry(XDp *InstancePtr, u8 PortNum, + u8 IicAddress) +{ + u8 Index; + XDp_RxIicMapEntry *IicMap; + + IicMap = InstancePtr->RxInstance.Topology.Ports[PortNum].IicMap; + + for (Index = 0; Index < XDP_RX_NUM_I2C_ENTRIES_PER_PORT; Index++) { + /* Return a pointer to the specified I2C address, or the first + * empty slot. */ + if ((IicMap[Index].IicAddress == IicAddress) || + (IicMap[Index].IicAddress == 0)) { + return &IicMap[Index]; + } + } + + /* No entry with the specified I2C address has been found and there are + * no empty slots. */ + return NULL; +} + +/******************************************************************************/ +/** + * This function adds an entry into the I2C map for a given port. The user + * provides a pointer to the data to be used for the specified I2C address. + * When an upstream device issues a REMOTE_I2C_READ sideband message, this I2C + * map will be searched for an entry matching the requested I2C address read. + * + * @param InstancePtr is a pointer to the XDp instance. + * @param PortNum is the port number for which to set the I2C map entry. + * @param IicAddress is the I2C address for which to set the data. + * @param ReadNumBytes is number of bytes available for reading from the + * associated IicAddress. + * @param ReadData is a pointer to a user-defined data structure that will + * be used as read data when an upstream device issues an I2C read. + * + * @return + * - XST_SUCCESS if there is an available slot in the I2C map for a + * new entry and the I2C address isn't taken. + * - XST_FAILURE, otherwise. + * + * @note None. + * +*******************************************************************************/ +u32 XDp_RxSetIicMapEntry(XDp *InstancePtr, u8 PortNum, u8 IicAddress, + u8 ReadNumBytes, u8 *ReadData) +{ + XDp_RxIicMapEntry *IicMapEntry; + + IicMapEntry = XDp_RxGetIicMapEntry(InstancePtr, PortNum, IicAddress); + if (!IicMapEntry) { + return XST_FAILURE; + } + + /* Definition at specified IicAddress exists. */ + IicMapEntry->IicAddress = IicAddress; + IicMapEntry->WriteVal = 0; + IicMapEntry->ReadNumBytes = ReadNumBytes; + IicMapEntry->ReadData = ReadData; + + return XST_SUCCESS; +} + /******************************************************************************/ /** * This function allows the user to select which ports will be exposed when