MLK-17489-1: hdp api: merge CDN api V1.0.36 code
authorSandor Yu <Sandor.yu@nxp.com>
Tue, 30 Jan 2018 08:03:55 +0000 (16:03 +0800)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
Merge Cadence HDMI API V1.0.36 code.

Signed-off-by: Sandor Yu <Sandor.yu@nxp.com>
drivers/mxc/hdp/API_AFE.h
drivers/mxc/hdp/API_DPTX.c
drivers/mxc/hdp/API_DPTX.h
drivers/mxc/hdp/API_General.c
drivers/mxc/hdp/API_General.h
drivers/mxc/hdp/API_HDMITX.c
drivers/mxc/hdp/general_handler.h
drivers/mxc/hdp/opcodes.h
drivers/mxc/hdp/util.c
drivers/mxc/hdp/util.h
drivers/mxc/hdp/vic_table.h

index 1e41b02..1c93af2 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
 #include "util.h"
 
 typedef enum {
-       AFE_LINK_RATE_1_6 = 0x6,
-       AFE_LINK_RATE_2_7 = 0xA,
-       AFE_LINK_RATE_5_4 = 0x14,
-       AFE_LINK_RATE_8_1 = 0x1A,
+       AFE_LINK_RATE_1_6 = 0x6,  /* 1.62 Gb/s */
+       AFE_LINK_RATE_2_1 = 0x8,  /* 2.16 Gb/s */
+       AFE_LINK_RATE_2_4 = 0x9,  /* 2.43 Gb/s */
+       AFE_LINK_RATE_2_7 = 0xA,  /* 2.70 Gb/s */
+       AFE_LINK_RATE_3_2 = 0xC,  /* 3.24 Gb/s */
+       AFE_LINK_RATE_4_3 = 0x10, /* 4.32 Gb/s */
+       AFE_LINK_RATE_5_4 = 0x14, /* 5.40 Gb/s */
+       AFE_LINK_RATE_8_1 = 0x1E, /* 8.10 Gb/s */
 } ENUM_AFE_LINK_RATE;
 
+/* Some of the PHY programming sequences
+ * depend on the reference clock frequency.
+ * Variable of this type is used to control
+ * the programming flow. */
+typedef enum {
+       REFCLK_24MHZ,
+       REFCLK_27MHZ
+} REFCLK_FREQ;
+
 typedef enum {
        CLK_RATIO_1_1,
        CLK_RATIO_5_4,
@@ -72,6 +85,7 @@ typedef struct {
        u8 msb;
 } reg_field_t;
 
+u8 AFE_check_rate_supported(ENUM_AFE_LINK_RATE rate);
 void Afe_write(state_struct *state, u32 offset, u16 val);
 u16 Afe_read(state_struct *state, u32 offset);
 void AFE_init(state_struct *state, int num_lanes,
index bb07aef..ecdaad6 100644 (file)
@@ -35,6 +35,8 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
+ * Copyright 2017-2018 NXP
+ *
  ******************************************************************************
  *
  * API_DPTX.c
@@ -126,6 +128,8 @@ CDN_API_STATUS CDN_API_DPTX_SetHostCap(state_struct *state, u8 maxLinkRate,
                                       u8 fastLinkTraining,
                                       u8 laneMapping, u8 enchanced)
 {
+       /* fifth bit of lanesCount_SSC is used to declare eDP. */
+       state->edp = ((lanesCount_SSC >> 5) & 1);
        if (!state->running) {
                if (!internal_apb_available(state))
                        return CDN_BSY;
@@ -199,10 +203,39 @@ CDN_API_STATUS CDN_API_DPTX_Control_blocking(state_struct *state, u32 mode)
        internal_block_function(&state->mutex, CDN_API_DPTX_Control(state, mode));
 }
 
+CDN_API_STATUS CDN_API_DPTX_EDP_Training(state_struct *state,
+                                               u8 mode, ENUM_AFE_LINK_RATE linkRate,
+                                               u8 rateId)
+{
+       if (AFE_check_rate_supported(linkRate) == 0)
+               return CDN_ERROR_NOT_SUPPORTED;
+
+       if (!state->running) {
+               if (!internal_apb_available(state))
+                       return CDN_BSY;
+           internal_tx_mkfullmsg(state, MB_MODULE_ID_DP_TX, DPTX_EDP_RATE_TRAINING, 3,
+                                                               1, mode,
+                                                               1, (u8)linkRate,
+                                                               1, rateId);
+               state->bus_type = CDN_BUS_TYPE_APB;
+               return CDN_STARTED;
+       }
+       internal_process_messages(state);
+       return CDN_OK;
+}
+
+CDN_API_STATUS CDN_API_DPTX_EDP_Training_blocking(state_struct *state,
+                                                                       u8 mode,
+                                                                       ENUM_AFE_LINK_RATE linkRate,
+                                                                       u8 rateId)
+{
+       internal_block_function(&state->mutex, CDN_API_DPTX_EDP_Training(state, mode, linkRate, rateId));
+}
+
 CDN_API_STATUS CDN_API_DPTX_Write_DPCD(state_struct *state, u32 numOfBytes,
-                                      u32 addr, u8 *buff,
-                                      DPTX_Write_DPCD_response *resp,
-                                      CDN_BUS_TYPE bus_type)
+                                                                       u32 addr, u8 *buff,
+                                                                       DPTX_Write_DPCD_response *resp,
+                                                                       CDN_BUS_TYPE bus_type)
 {
        CDN_API_STATUS ret;
        if (!state->running) {
index 6004ea1..a4e4530 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -47,8 +47,9 @@
 #ifndef _API_DPTX_H_
 #define _API_DPTX_H_
 
-# include "API_General.h"
-# include "vic_table.h"
+#include "API_General.h"
+#include "vic_table.h"
+#include "API_AFE.h"
 
 #define MAX_NUM_OF_EVENTS 4
 
@@ -274,6 +275,25 @@ CDN_API_STATUS CDN_API_DPTX_Control(state_struct *state, u32 mode);
  */
 CDN_API_STATUS CDN_API_DPTX_Control_blocking(state_struct *state, u32 mode);
 
+/**
+  * \brief Performs Fast Link Training, using LINK_RATE_SET DPCD register.
+  * \param [in] mode - 0 to stop training, 1 to start it, 2 to restart it.
+  * \param [in] linkRate - Link Rate to be used for training.
+  * \param [in] rateId - index of selected Link Rate in DPCd registers.
+  *
+  * Performs Fast Link Training, selecting Link Rate using LINK_RATE_SET DPCD
+  * register, characteristic to Embedded DisplayPort (eDP) v1.4 standard.
+  * If requested link rate is not supported by DPTX, function will return error
+  * code CDN_ERROR_NOT_SUPPORTED, and will take no further action.
+  * rateId is used to select, which Link Rate supported by sink (enumerated in
+  * SUPPORTED_LINK_RATES DPCD registers) is equal to rate requested. This value
+  * will be written to first 3 bits of LINK_RATE_SET DPCD registers. Allowed
+  * range is 0-7. If it is not known beforehand, SUPPORTED_LINK_RATES DPCD
+  * registers may be read by an upper layer, and then used to determine the
+  * correct value to use.
+  */
+CDN_API_STATUS CDN_API_DPTX_EDP_Training(state_struct *state, u8 mode, ENUM_AFE_LINK_RATE linkRate, u8 rateId);
+CDN_API_STATUS CDN_API_DPTX_EDP_Training_blocking(state_struct *state, u8 mode, ENUM_AFE_LINK_RATE linkRate, u8 rateId);
 /**
   * \brief send DPX_ENABLE_EVENT command
   */
index 4f4d307..3bec3c5 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -49,6 +49,7 @@
 #include "apb_cfg.h"
 #include "opcodes.h"
 #include "general_handler.h"
+#include "util.h"
 
 static u32 alive;
 
@@ -473,3 +474,32 @@ CDN_API_STATUS CDN_API_General_Phy_Test_Access_blocking(state_struct *state,
 {
        internal_block_function(&state->mutex, CDN_API_General_Phy_Test_Access(state, resp));
 }
+
+CDN_API_STATUS CDN_API_General_GetHpdState(state_struct *state, u8 *hpd_state)
+{
+       CDN_API_STATUS ret;
+       *hpd_state = 0;
+
+       if (!state->running) {
+           if (!internal_apb_available(state))
+                       return CDN_BSY;
+               internal_tx_mkfullmsg(state, MB_MODULE_ID_GENERAL, GENERAL_GET_HPD_STATE, 0);
+               state->bus_type = CDN_BUS_TYPE_APB;
+               state->rxEnable = 1;
+               return CDN_STARTED;
+       }
+
+       internal_process_messages(state);
+       ret = internal_test_rx_head(state, MB_MODULE_ID_GENERAL, GENERAL_GET_HPD_STATE);
+       if (ret != CDN_OK)
+           return ret;
+
+       internal_readmsg(state, 1, 1, hpd_state);
+
+       return CDN_OK;
+}
+
+CDN_API_STATUS CDN_API_General_GetHpdState_blocking(state_struct *state, u8 *hpd_state)
+{
+    internal_block_function(&state->mutex, CDN_API_General_GetHpdState(state, hpd_state));
+}
index beeb386..f41c332 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -240,5 +240,7 @@ CDN_API_STATUS CDN_API_General_Write_Field_blocking(state_struct *state,
 CDN_API_STATUS CDN_API_General_Phy_Test_Access(state_struct *state, u8 *resp);
 CDN_API_STATUS CDN_API_General_Phy_Test_Access_blocking(state_struct *state,
                                                        u8 *resp);
+CDN_API_STATUS CDN_API_General_GetHpdState(state_struct *state, u8 *hpd_state);
 
+CDN_API_STATUS CDN_API_General_GetHpdState_blocking(state_struct *state, u8 *hpd_state);
 #endif
index 34025e1..1e16395 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -52,6 +52,7 @@
 #include "address.h"
 #include "source_car.h"
 #include "source_vif.h"
+#include "general_handler.h"
 #include <soc/imx8/soc.h>
 
 CDN_API_STATUS CDN_API_HDMITX_DDC_READ(state_struct *state,
@@ -489,16 +490,14 @@ CDN_API_STATUS CDN_API_HDMITX_GetHpdStatus(state_struct *state, u8 *hpd_sts)
        if (!state->running) {
                if (!internal_apb_available(state))
                        return CDN_BSY;
-               internal_tx_mkfullmsg(state, MB_MODULE_ID_HDMI_TX,
-                                     HDMI_TX_HPD_STATUS, 0);
+               internal_tx_mkfullmsg(state, MB_MODULE_ID_GENERAL, GENERAL_GET_HPD_STATE, 0);
                state->rxEnable = 1;
                state->bus_type = CDN_BUS_TYPE_APB;
                return CDN_STARTED;
        }
        internal_process_messages(state);
        ret =
-           internal_test_rx_head(state, MB_MODULE_ID_HDMI_TX,
-                                 HDMI_TX_HPD_STATUS);
+           internal_test_rx_head(state, MB_MODULE_ID_GENERAL, GENERAL_GET_HPD_STATE);
        if (ret != CDN_OK)
                return ret;
        internal_readmsg(state, 1, 1, hpd_sts);
index 3b03bc9..8ff69a2 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -68,6 +68,7 @@
 #define GENERAL_WRITE_REGISTER          0x05
 #define GENERAL_WRITE_FIELD             0x06
 #define GENERAL_READ_REGISTER           0x07
+#define GENERAL_GET_HPD_STATE           0x11
 
 #define GENERAL_TEST_TRNG_SIMPLE        0xF0
 
index 04da5ac..0313d63 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -71,6 +71,7 @@
 #define DPTX_SET_LINK_BREAK_POINT        0x0F
 #define DPTX_FORCE_LANES                0x10
 #define DPTX_HPD_STATE                             0x11
+#define DPTX_EDP_RATE_TRAINING          0x12
 #define DPTX_DBG_SET                               0xF0
 #define DP_TX_OPCODE_READ_I2C_REQUEST              0xA5
 #define DP_TX_OPCODE_WRITE_I2C_REQUEST             0xA6
index a0c9771..61d2c87 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
index c7329b2..212e54c 100644 (file)
@@ -91,6 +91,8 @@ typedef enum {
        CDN_CEC_ERR_RX_FAILED,
     /** Operation aborted. */
        CDN_CEC_ERR_ABORT,
+    /** All Logical Addresses are in use. */
+       CDN_CEC_ERR_ALL_LA_IN_USE,
 } CDN_API_STATUS;
 
 typedef enum {
@@ -153,6 +155,7 @@ typedef struct {
        u8 running;
        CDN_BUS_TYPE bus_type;
        u32 tmp;
+       u32 edp; /* use eDP */
 
        struct mutex mutex;     //mutex may replace running
        struct hdp_mem *mem;
index 738c056..139c485 100644 (file)
@@ -35,7 +35,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  ******************************************************************************
  *
@@ -95,7 +95,11 @@ typedef enum {
 
 typedef enum {
        RATE_1_6 = 162,
+       RATE_2_1 = 216,
+       RATE_2_4 = 243,
        RATE_2_7 = 270,
+       RATE_3_2 = 324,
+       RATE_4_3 = 432,
        RATE_5_4 = 540,
        RATE_8_1 = 810,
 } VIC_SYMBOL_RATE;