diff options
author | Oliver Brown <oliver.brown@nxp.com> | 2017-12-13 18:16:08 -0600 |
---|---|---|
committer | Oliver Brown <oliver.brown@nxp.com> | 2017-12-18 13:24:22 -0600 |
commit | 9d26caaf2e532f4b02e695e6f2ad31ad493f2add (patch) | |
tree | 4449f4129e198867f559b3a60c010b6012f013b3 | |
parent | aca7f55fc7cdc6048cc39d2b9355e379c42c88dd (diff) |
MLK-17206 hdp: Disable firmware hdp loading
Disabling HDP firmware loading except for debug.
Added simple checks to test HDP firmware status.
Signed-off-by: Oliver Brown <oliver.brown@nxp.com>
-rw-r--r-- | drivers/gpu/drm/imx/hdp/imx-dp.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/hdp/imx-dp.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/hdp/imx-hdmi.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/hdp/imx-hdmi.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/hdp/imx-hdp.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/hdp/imx-hdp.h | 4 |
6 files changed, 50 insertions, 13 deletions
diff --git a/drivers/gpu/drm/imx/hdp/imx-dp.c b/drivers/gpu/drm/imx/hdp/imx-dp.c index 93ed753ab2a4..cfdd3c1667e1 100644 --- a/drivers/gpu/drm/imx/hdp/imx-dp.c +++ b/drivers/gpu/drm/imx/hdp/imx-dp.c @@ -13,11 +13,14 @@ */ #include <linux/clk.h> +#ifdef DEBUG_FW_LOAD #include "mhdp_firmware.h" +#endif #include "imx-hdp.h" #include "imx-hdmi.h" #include "imx-dp.h" +#ifdef DEBUG_FW_LOAD void dp_fw_load(state_struct *state) { pr_info("loading hdmi firmware\n"); @@ -27,8 +30,8 @@ void dp_fw_load(state_struct *state) (u8 *)mhdp_dram0_get_ptr(), mhdp_dram0_get_size()); } - -void dp_fw_init(state_struct *state) +#endif +int dp_fw_init(state_struct *state) { u8 echo_msg[] = "echo test"; u8 echo_resp[sizeof(echo_msg) + 1]; @@ -47,7 +50,11 @@ void dp_fw_init(state_struct *state) pr_info("Started firmware!\n"); ret = CDN_API_CheckAlive_blocking(state); - pr_info("CDN_API_CheckAlive returned (ret = %d)\n", ret); + if (ret != 0) { + pr_err("CDN_API_CheckAlive failed - check firmware!\n"); + return -ENXIO; + } else + pr_info("CDN_API_CheckAlive returned ret = %d\n", ret); /* turn on IP activity */ ret = CDN_API_MainControl_blocking(state, 1, &resp); @@ -56,6 +63,10 @@ void dp_fw_init(state_struct *state) ret = CDN_API_General_Test_Echo_Ext_blocking(state, echo_msg, echo_resp, sizeof(echo_msg), CDN_BUS_TYPE_APB); + if (0 != strncmp(echo_msg, echo_resp, sizeof(echo_msg))) { + pr_err("CDN_API_General_Test_Echo_Ext_blocking - echo test failed, check firmware!"); + return -ENXIO; + } pr_info("CDN_API_General_Test_Echo_Ext_blocking (ret = %d echo_resp = %s)\n", ret, echo_resp); @@ -63,6 +74,8 @@ void dp_fw_init(state_struct *state) CDN_API_General_Write_Register_blocking(state, ADDR_SOURCD_PHY + (LANES_CONFIG << 2), 0x0040001b); pr_info("CDN_API_General_Write_Register_blockin ... setting LANES_CONFIG\n"); + + return 0; } int dp_phy_init(state_struct *state, int vic, int format, int color_depth) diff --git a/drivers/gpu/drm/imx/hdp/imx-dp.h b/drivers/gpu/drm/imx/hdp/imx-dp.h index 26300a8f9980..dc597a94d072 100644 --- a/drivers/gpu/drm/imx/hdp/imx-dp.h +++ b/drivers/gpu/drm/imx/hdp/imx-dp.h @@ -15,7 +15,7 @@ #define _IMX_DP_H_ void dp_fw_load(state_struct *state); -void dp_fw_init(state_struct *state); +int dp_fw_init(state_struct *state); void dp_mode_set(state_struct *state, int vic, int format, int color_depth, int max_link_rate); int dp_phy_init(state_struct *state, int vic, int format, int color_depth); int dp_get_edid_block(void *data, u8 *buf, u32 block, size_t len); diff --git a/drivers/gpu/drm/imx/hdp/imx-hdmi.c b/drivers/gpu/drm/imx/hdp/imx-hdmi.c index ecba30c31c8c..08632b4974c6 100644 --- a/drivers/gpu/drm/imx/hdp/imx-hdmi.c +++ b/drivers/gpu/drm/imx/hdp/imx-hdmi.c @@ -13,14 +13,16 @@ */ #include <linux/clk.h> +#ifdef DEBUG_FW_LOAD #include "hdmitx_firmware.h" +#endif #include "imx-hdp.h" #include "imx-hdmi.h" #include "API_AFE_ss28fdsoi_kiran_hdmitx.h" #include "API_AFE_t28hpc_hdmitx.h" static int character_freq_khz; - +#ifdef DEBUG_FW_LOAD void hdmi_fw_load(state_struct *state) { pr_info("loading hdmi firmware\n"); @@ -30,8 +32,8 @@ void hdmi_fw_load(state_struct *state) (u8 *)hdmitx_dram0_get_ptr(), hdmitx_dram0_get_size()); } - -void hdmi_fw_init(state_struct *state) +#endif +int hdmi_fw_init(state_struct *state) { u8 echo_msg[] = "echo test"; u8 echo_resp[sizeof(echo_msg) + 1]; @@ -51,7 +53,11 @@ void hdmi_fw_init(state_struct *state) pr_info("Started firmware!\n"); ret = CDN_API_CheckAlive_blocking(state); - pr_info("CDN_API_CheckAlive returned ret = %d\n", ret); + if (ret != 0) { + pr_err("CDN_API_CheckAlive failed - check firmware!\n"); + return -ENXIO; + } else + pr_info("CDN_API_CheckAlive returned ret = %d\n", ret); /* turn on IP activity */ ret = CDN_API_MainControl_blocking(state, 1, &sts); @@ -59,8 +65,15 @@ void hdmi_fw_init(state_struct *state) ret = CDN_API_General_Test_Echo_Ext_blocking(state, echo_msg, echo_resp, sizeof(echo_msg), CDN_BUS_TYPE_APB); - pr_info("CDN_API_General_Test_Echo_Ext_blocking - APB(ret = %d echo_resp = %s)\n", - ret, echo_resp); + + if (0 != strncmp(echo_msg, echo_resp, sizeof(echo_msg))) { + pr_err("CDN_API_General_Test_Echo_Ext_blocking - echo test failed, check firmware!"); + return -ENXIO; + } + pr_info("CDN_API_General_Test_Echo_Ext_blocking - APB(ret = %d echo_resp = %s)\n", + ret, echo_resp); + + return 0; } int hdmi_phy_init(state_struct *state, int vic, int format, int color_depth) diff --git a/drivers/gpu/drm/imx/hdp/imx-hdmi.h b/drivers/gpu/drm/imx/hdp/imx-hdmi.h index e6c4b7c7ce26..de4646219a93 100644 --- a/drivers/gpu/drm/imx/hdp/imx-hdmi.h +++ b/drivers/gpu/drm/imx/hdp/imx-hdmi.h @@ -15,7 +15,7 @@ #define _IMX_HDMI_H_ void hdmi_fw_load(state_struct *state); -void hdmi_fw_init(state_struct *state); +int hdmi_fw_init(state_struct *state); int hdmi_phy_init(state_struct *state, int vic, int format, int color_depth); void hdmi_mode_set(state_struct *state, int vic, int format, int color_depth, int temp); int hdmi_get_edid_block(void *data, u8 *buf, u32 block, size_t len); diff --git a/drivers/gpu/drm/imx/hdp/imx-hdp.c b/drivers/gpu/drm/imx/hdp/imx-hdp.c index fd81e4b07795..0a998e5487cf 100644 --- a/drivers/gpu/drm/imx/hdp/imx-hdp.c +++ b/drivers/gpu/drm/imx/hdp/imx-hdp.c @@ -883,7 +883,9 @@ static struct hdp_rw_func imx8qm_rw = { }; static struct hdp_ops imx8qm_dp_ops = { +#ifdef DEBUG_FW_LOAD .fw_load = dp_fw_load, +#endif .fw_init = dp_fw_init, .phy_init = dp_phy_init, .mode_set = dp_mode_set, @@ -905,7 +907,9 @@ static struct hdp_ops imx8qm_dp_ops = { }; static struct hdp_ops imx8qm_hdmi_ops = { +#ifdef DEBUG_FW_LOAD .fw_load = hdmi_fw_load, +#endif .fw_init = hdmi_fw_init, .phy_init = hdmi_phy_init, .mode_set = hdmi_mode_set, @@ -1097,7 +1101,12 @@ static int imx_hdp_imx_bind(struct device *dev, struct device *master, imx_hdp_call(hdp, fw_load, &hdp->state); - imx_hdp_call(hdp, fw_init, &hdp->state); + ret = imx_hdp_call(hdp, fw_init, &hdp->state); + if (ret < 0) { + pr_err("Failed to initialise HDP firmware\n"); + DRM_ERROR("Failed to initialise HDP firmware\n"); + return ret; + } /* Pixel Format - 1 RGB, 2 YCbCr 444, 3 YCbCr 420 */ /* bpp (bits per subpixel) - 8 24bpp, 10 30bpp, 12 36bpp, 16 48bpp */ diff --git a/drivers/gpu/drm/imx/hdp/imx-hdp.h b/drivers/gpu/drm/imx/hdp/imx-hdp.h index 1323baecabe8..5ece81345aa4 100644 --- a/drivers/gpu/drm/imx/hdp/imx-hdp.h +++ b/drivers/gpu/drm/imx/hdp/imx-hdp.h @@ -27,6 +27,8 @@ #include <drm/drm_dp_helper.h> #include "../../../../mxc/hdp/all.h" +/* For testing hdp firmware define DEBUG_FW_LOAD */ +#undef DEBUG_FW_LOAD #define PLL_1188MHZ (1188000000) #define PLL_675MHZ (675000000) @@ -81,7 +83,7 @@ struct hdp_clks; struct hdp_ops { void (*fw_load)(state_struct *state); - void (*fw_init)(state_struct *state); + int (*fw_init)(state_struct *state); int (*phy_init)(state_struct *state, int vic, int format, int color_depth); void (*mode_set)(state_struct *state, int vic, int format, int color_depth, int max_link); int (*get_edid_block)(void *data, u8 *buf, u32 block, size_t len); |