diff options
Diffstat (limited to 'recipes-bsp/u-boot-mainline/files/0011-MLK-17205-1-video-imx-hdp-Adding-support-for-HDP-fir.patch')
-rw-r--r-- | recipes-bsp/u-boot-mainline/files/0011-MLK-17205-1-video-imx-hdp-Adding-support-for-HDP-fir.patch | 2560 |
1 files changed, 2560 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot-mainline/files/0011-MLK-17205-1-video-imx-hdp-Adding-support-for-HDP-fir.patch b/recipes-bsp/u-boot-mainline/files/0011-MLK-17205-1-video-imx-hdp-Adding-support-for-HDP-fir.patch new file mode 100644 index 0000000..956ebe5 --- /dev/null +++ b/recipes-bsp/u-boot-mainline/files/0011-MLK-17205-1-video-imx-hdp-Adding-support-for-HDP-fir.patch @@ -0,0 +1,2560 @@ +From 94ed34cb71d660718acae960328c510f71fbf3dc Mon Sep 17 00:00:00 2001 +From: Oliver Brown <oliver.brown@nxp.com> +Date: Wed, 13 Dec 2017 17:09:14 -0600 +Subject: [PATCH 11/15] MLK-17205-1 video: imx: hdp: Adding support for HDP + firmware loading + +This adds a command to load the HDP firmware and supporting libraries. + +Signed-off-by: Oliver Brown <oliver.brown@nxp.com> +(cherry picked from downstream commit 94c9c7022c5b6cffb74bb2e34336cffc2790d0d8) +(cherry picked from downstream commit 21edff320e763585ebc6ab2d997c994561b69292) +--- + drivers/video/Makefile | 3 + + drivers/video/imx/Makefile | 1 + + drivers/video/imx/hdp/API_General.c | 477 ++++++++++++++++++++++++++++++++ + drivers/video/imx/hdp/API_General.h | 302 ++++++++++++++++++++ + drivers/video/imx/hdp/Makefile | 1 + + drivers/video/imx/hdp/address.h | 109 ++++++++ + drivers/video/imx/hdp/apb_cfg.h | 185 +++++++++++++ + drivers/video/imx/hdp/externs.h | 81 ++++++ + drivers/video/imx/hdp/general_handler.h | 162 +++++++++++ + drivers/video/imx/hdp/opcodes.h | 115 ++++++++ + drivers/video/imx/hdp/test_base_sw.c | 181 ++++++++++++ + drivers/video/imx/hdp/util.c | 329 ++++++++++++++++++++++ + drivers/video/imx/hdp/util.h | 278 +++++++++++++++++++ + drivers/video/imx/hdp_load.c | 107 +++++++ + drivers/video/imx/scfw_utils.h | 90 ++++++ + 15 files changed, 2421 insertions(+) + create mode 100644 drivers/video/imx/hdp/API_General.c + create mode 100644 drivers/video/imx/hdp/API_General.h + create mode 100644 drivers/video/imx/hdp/Makefile + create mode 100644 drivers/video/imx/hdp/address.h + create mode 100644 drivers/video/imx/hdp/apb_cfg.h + create mode 100644 drivers/video/imx/hdp/externs.h + create mode 100644 drivers/video/imx/hdp/general_handler.h + create mode 100644 drivers/video/imx/hdp/opcodes.h + create mode 100644 drivers/video/imx/hdp/test_base_sw.c + create mode 100644 drivers/video/imx/hdp/util.c + create mode 100644 drivers/video/imx/hdp/util.h + create mode 100644 drivers/video/imx/hdp_load.c + create mode 100644 drivers/video/imx/scfw_utils.h + +diff --git a/drivers/video/Makefile b/drivers/video/Makefile +index 349a207035..fdc57c71da 100644 +--- a/drivers/video/Makefile ++++ b/drivers/video/Makefile +@@ -65,3 +65,6 @@ obj-$(CONFIG_VIDEO_VESA) += vesa.o + + obj-y += bridge/ + obj-y += sunxi/ ++ ++UBOOTINCLUDE += -I$(srctree)/drivers/video/imx/hdp ++obj-$(CONFIG_VIDEO_IMX_HDP_LOAD) += imx/hdp_load.o imx/hdp/ +diff --git a/drivers/video/imx/Makefile b/drivers/video/imx/Makefile +index 179ea651fe..0f9d85f917 100644 +--- a/drivers/video/imx/Makefile ++++ b/drivers/video/imx/Makefile +@@ -4,3 +4,4 @@ + # Wolfgang Denk, DENX Software Engineering, wd@denx.de. + + obj-y += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o ++obj-$(CONFIG_VIDEO_IMX_HDP_LOAD) += hdp_load.o hdp/ +diff --git a/drivers/video/imx/hdp/API_General.c b/drivers/video/imx/hdp/API_General.c +new file mode 100644 +index 0000000000..83458d7fae +--- /dev/null ++++ b/drivers/video/imx/hdp/API_General.c +@@ -0,0 +1,477 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * API_General.c ++ * ++ ****************************************************************************** ++ */ ++ ++#include "API_General.h" ++#include "util.h" ++#ifndef __UBOOT__ ++#include <string.h> ++#endif ++#include "address.h" ++#include "apb_cfg.h" ++#include "opcodes.h" ++#include "general_handler.h" ++#include "externs.h" ++#ifndef __UBOOT__ ++#include <stdio.h> ++#endif ++ ++extern state_struct state; ++ ++void cdn_api_init(void) ++{ ++ memset(&state, 0, sizeof(state_struct)); ++} ++ ++CDN_API_STATUS cdn_api_loadfirmware(unsigned char *imem, int imemsize, ++ unsigned char *dmem, int dmemsize) ++{ ++ int i; ++ for (i = 0; i < imemsize; i += 4) ++ if (cdn_apb_write(ADDR_IMEM + i, ++ (unsigned int)imem[i] << 0 | ++ (unsigned int)imem[i + 1] << 8 | ++ (unsigned int)imem[i + 2] << 16 | ++ (unsigned int)imem[i + 3] << 24)) ++ return CDN_ERR; ++ for (i = 0; i < dmemsize; i += 4) ++ if (cdn_apb_write(ADDR_DMEM + i, ++ (unsigned int)dmem[i] << 0 | ++ (unsigned int)dmem[i + 1] << 8 | ++ (unsigned int)dmem[i + 2] << 16 | ++ (unsigned int)dmem[i + 3] << 24)) ++ return CDN_ERR; ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_general_test_echo(unsigned int val, ++ CDN_BUS_TYPE bus_type) ++{ ++ CDN_API_STATUS ret; ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ state.bus_type = bus_type; ++ state.rxenable = 1; ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, GENERAL_TEST_ECHO, ++ 1, 4, val); ++ return CDN_STARTED; ++ } ++ if (state.txenable && !internal_mbox_tx_process().txend) ++ return CDN_BSY; ++ if (state.rxenable && !internal_mbox_rx_process().rxend) ++ return CDN_BSY; ++ ret = internal_test_rx_head(MB_MODULE_ID_GENERAL, GENERAL_TEST_ECHO); ++ if (ret != CDN_OK) { ++ state.running = 0; ++ return ret; ++ } ++ state.running = 0; ++ if (val != internal_betoi(state.rxbuffer + INTERNAL_CMD_HEAD_SIZE, 4)) ++ return CDN_ERR; ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_general_test_echo_blocking(unsigned int val, ++ CDN_BUS_TYPE bus_type) ++{ ++ internal_block_function(cdn_api_general_test_echo(val, bus_type)); ++} ++ ++CDN_API_STATUS cdn_api_general_test_echo_ext(uint8_t const *msg, uint8_t *resp, ++ uint16_t num_bytes, ++ CDN_BUS_TYPE bus_type) ++{ ++ CDN_API_STATUS ret; ++ ++ if (!msg || !resp) ++ return CDN_ERR; ++ ++ if ((num_bytes > GENERAL_TEST_ECHO_MAX_PAYLOAD) || ++ (num_bytes < GENERAL_TEST_ECHO_MIN_PAYLOAD)) ++ return CDN_ERR; ++ ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ ++ state.bus_type = bus_type; ++ state.rxenable = 1; ++ ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, GENERAL_TEST_ECHO, ++ 1, -num_bytes, msg); ++ ++ return CDN_STARTED; ++ } ++ ++ if (state.txenable && !internal_mbox_tx_process().txend) ++ return CDN_BSY; ++ ++ if (state.rxenable && !internal_mbox_rx_process().rxend) ++ return CDN_BSY; ++ ++ ret = internal_test_rx_head(MB_MODULE_ID_GENERAL, GENERAL_TEST_ECHO); ++ ++ if (ret != CDN_OK) { ++ state.running = 0; ++ return ret; ++ } ++ ++ state.running = 0; ++ ++ memcpy(resp, state.rxbuffer + INTERNAL_CMD_HEAD_SIZE, num_bytes); ++ ++ if (memcmp(msg, resp, num_bytes) != 0) ++ return CDN_ERR; ++ ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_general_test_echo_ext_blocking(uint8_t const *msg, ++ uint8_t *resp, ++ uint16_t num_bytes, ++ CDN_BUS_TYPE bus_type) ++{ ++ internal_block_function(cdn_api_general_test_echo_ext ++ (msg, resp, num_bytes, bus_type) ++ ); ++} ++ ++CDN_API_STATUS cdn_api_general_getcurversion(unsigned short *ver, ++ unsigned short *verlib) ++{ ++ unsigned int vh, vl, vlh, vll; ++ if (cdn_apb_read(VER_L << 2, &vl)) ++ return CDN_ERR; ++ if (cdn_apb_read(VER_H << 2, &vh)) ++ return CDN_ERR; ++ if (cdn_apb_read(VER_LIB_L_ADDR << 2, &vll)) ++ return CDN_ERR; ++ if (cdn_apb_read(VER_LIB_H_ADDR << 2, &vlh)) ++ return CDN_ERR; ++ *ver = F_VER_MSB_RD(vh) << 8 | F_VER_LSB_RD(vl); ++ *verlib = F_SW_LIB_VER_H_RD(vlh) << 8 | F_SW_LIB_VER_L_RD(vll); ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_get_event(uint32_t *events) ++{ ++ uint32_t evt[4] = { 0 }; ++ ++ if (!events) { ++ printf("events pointer is NULL!\n"); ++ return CDN_ERR; ++ } ++ ++ if (cdn_apb_read(SW_EVENTS0 << 2, &evt[0]) || ++ cdn_apb_read(SW_EVENTS1 << 2, &evt[1]) || ++ cdn_apb_read(SW_EVENTS2 << 2, &evt[2]) || ++ cdn_apb_read(SW_EVENTS3 << 2, &evt[3])) { ++ printf("Failed to read events registers.\n"); ++ return CDN_ERR; ++ } ++ ++ *events = (evt[0] & 0xFF) ++ | ((evt[1] & 0xFF) << 8) ++ | ((evt[2] & 0xFF) << 16) ++ | ((evt[3] & 0xFF) << 24); ++ ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_get_debug_reg_val(uint16_t *val) ++{ ++ uint32_t dbg[2] = { 0 }; ++ ++ if (!val) { ++ printf("val pointer is NULL!\n"); ++ return CDN_ERR; ++ } ++ ++ if (cdn_apb_read(SW_DEBUG_L << 2, &dbg[0]) || ++ cdn_apb_read(SW_DEBUG_H << 2, &dbg[1])) { ++ printf("Failed to read debug registers.\n"); ++ return CDN_ERR; ++ } ++ ++ *val = (uint16_t) ((dbg[0] & 0xFF) | ((dbg[1] & 0xFF) << 8)); ++ ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_checkalive(void) ++{ ++ static unsigned int alive; ++ unsigned int newalive; ++ if (cdn_apb_read(KEEP_ALIVE << 2, &newalive)) ++ return CDN_ERR; ++ if (alive == newalive) ++ return CDN_BSY; ++ alive = newalive; ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_checkalive_blocking(void) ++{ ++ internal_block_function(cdn_api_checkalive()); ++} ++ ++CDN_API_STATUS cdn_api_maincontrol(unsigned char mode, unsigned char *resp) ++{ ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ state.bus_type = CDN_BUS_TYPE_APB; ++ state.rxenable = 1; ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, ++ GENERAL_MAIN_CONTROL, 1, 1, mode); ++ return CDN_STARTED; ++ } ++ INTERNAL_PROCESS_MESSAGES; ++ internal_opcode_ok_or_return(MB_MODULE_ID_GENERAL, ++ GENERAL_MAIN_CONTROL_RESP); ++ internal_readmsg(1, 1, resp); ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_maincontrol_blocking(unsigned char mode, ++ unsigned char *resp) ++{ ++ internal_block_function(cdn_api_maincontrol(mode, resp)); ++} ++ ++CDN_API_STATUS cdn_api_apbconf(uint8_t dpcd_bus_sel, uint8_t dpcd_bus_lock, ++ uint8_t hdcp_bus_sel, uint8_t hdcp_bus_lock, ++ uint8_t capb_bus_sel, uint8_t capb_bus_lock, ++ uint8_t *dpcd_resp, uint8_t *hdcp_resp, ++ uint8_t *capb_resp) ++{ ++ uint8_t resp; ++ uint8_t set = 0; ++ ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ ++ state.bus_type = CDN_BUS_TYPE_APB; ++ state.rxenable = 1; ++ ++ set |= (dpcd_bus_sel) ++ ? (1 << GENERAL_BUS_SETTINGS_DPCD_BUS_BIT) ++ : 0; ++ set |= (dpcd_bus_lock) ++ ? (1 << GENERAL_BUS_SETTINGS_DPCD_BUS_LOCK_BIT) ++ : 0; ++ set |= (hdcp_bus_sel) ++ ? (1 << GENERAL_BUS_SETTINGS_HDCP_BUS_BIT) ++ : 0; ++ set |= (hdcp_bus_lock) ++ ? (1 << GENERAL_BUS_SETTINGS_HDCP_BUS_LOCK_BIT) ++ : 0; ++ set |= (capb_bus_sel) ++ ? (1 << GENERAL_BUS_SETTINGS_CAPB_OWNER_BIT) ++ : 0; ++ set |= (capb_bus_lock) ++ ? (1 << GENERAL_BUS_SETTINGS_CAPB_OWNER_LOCK_BIT) ++ : 0; ++ ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, ++ GENERAL_BUS_SETTINGS, 1, 1, set); ++ ++ return CDN_STARTED; ++ } ++ ++ INTERNAL_PROCESS_MESSAGES; ++ internal_opcode_ok_or_return(MB_MODULE_ID_GENERAL, ++ GENERAL_BUS_SETTINGS_RESP); ++ ++ /* Read one one-byte response */ ++ internal_readmsg(1, 1, &resp); ++ ++ *dpcd_resp = ++ (resp & (1 << GENERAL_BUS_SETTINGS_RESP_DPCD_BUS_BIT)) ? 1 : 0; ++ *hdcp_resp = ++ (resp & (1 << GENERAL_BUS_SETTINGS_RESP_HDCP_BUS_BIT)) ? 1 : 0; ++ *capb_resp = ++ (resp & (1 << GENERAL_BUS_SETTINGS_RESP_CAPB_OWNER_BIT)) ? 1 : 0; ++ ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_apbconf_blocking(uint8_t dpcd_bus_sel, ++ uint8_t dpcd_bus_lock, ++ uint8_t hdcp_bus_sel, ++ uint8_t hdcp_bus_lock, ++ uint8_t capb_bus_sel, ++ uint8_t capb_bus_lock, ++ uint8_t *dpcd_resp, ++ uint8_t *hdcp_resp, ++ uint8_t *capb_resp) ++{ ++ internal_block_function(cdn_api_apbconf(dpcd_bus_sel, dpcd_bus_lock, ++ hdcp_bus_sel, hdcp_bus_lock, ++ capb_bus_sel, capb_bus_lock, ++ dpcd_resp, hdcp_resp, ++ capb_resp)); ++} ++ ++CDN_API_STATUS cdn_api_setclock(unsigned char mhz) ++{ ++ return cdn_apb_write(SW_CLK_H << 2, mhz); ++} ++ ++CDN_API_STATUS cdn_api_general_read_register(unsigned int addr, ++ GENERAL_READ_REGISTER_RESPONSE ++ *resp) ++{ ++ CDN_API_STATUS ret; ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, ++ GENERAL_READ_REGISTER, 1, 4, addr); ++ state.bus_type = CDN_BUS_TYPE_APB; ++ state.rxenable = 1; ++ return CDN_STARTED; ++ } ++ INTERNAL_PROCESS_MESSAGES; ++ ret = internal_test_rx_head(MB_MODULE_ID_GENERAL, ++ GENERAL_READ_REGISTER_RESP); ++ if (ret != CDN_OK) ++ return ret; ++ internal_readmsg(2, 4, &resp->addr, 4, &resp->val); ++ return CDN_OK; ++} ++ ++CDN_API_STATUS ++cdn_api_general_read_register_blocking(unsigned int addr, ++ GENERAL_READ_REGISTER_RESPONSE *resp) ++{ ++ internal_block_function(cdn_api_general_read_register(addr, resp)); ++} ++ ++CDN_API_STATUS cdn_api_general_write_register(unsigned int addr, ++ unsigned int val) ++{ ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, ++ GENERAL_WRITE_REGISTER, 2, 4, addr, 4, ++ val); ++ state.bus_type = CDN_BUS_TYPE_APB; ++ return CDN_STARTED; ++ } ++ INTERNAL_PROCESS_MESSAGES; ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_general_write_register_blocking(unsigned int addr, ++ unsigned int val) ++{ ++ internal_block_function(cdn_api_general_write_register(addr, val)); ++} ++ ++CDN_API_STATUS cdn_api_general_write_field(unsigned int addr, ++ unsigned char startbit, ++ unsigned char bitsno, ++ unsigned int val) ++{ ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, GENERAL_WRITE_FIELD, ++ 4, 4, addr, 1, startbit, 1, bitsno, 4, ++ val); ++ state.bus_type = CDN_BUS_TYPE_APB; ++ return CDN_STARTED; ++ } ++ INTERNAL_PROCESS_MESSAGES; ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_general_write_field_blocking(unsigned int addr, ++ unsigned char startbit, ++ unsigned char bitsno, ++ unsigned int val) ++{ ++ internal_block_function(cdn_api_general_write_field ++ (addr, startbit, bitsno, val)); ++} ++ ++CDN_API_STATUS cdn_api_general_phy_test_access(uint8_t *resp) ++{ ++ CDN_API_STATUS ret; ++ ++ *resp = 0; ++ ++ if (!state.running) { ++ if (!internal_apb_available()) ++ return CDN_BSY; ++ ++ internal_tx_mkfullmsg(MB_MODULE_ID_GENERAL, GENERAL_TEST_ACCESS, ++ 0); ++ state.bus_type = CDN_BUS_TYPE_APB; ++ state.rxenable = 1; ++ ++ return CDN_STARTED; ++ } ++ ++ INTERNAL_PROCESS_MESSAGES; ++ ++ ret = internal_test_rx_head(MB_MODULE_ID_GENERAL, GENERAL_TEST_ACCESS); ++ ++ if (ret != CDN_OK) ++ return ret; ++ ++ internal_readmsg(1, 1, resp); ++ ++ return CDN_OK; ++} ++ ++CDN_API_STATUS cdn_api_general_phy_test_access_blocking(uint8_t *resp) ++{ ++ internal_block_function(cdn_api_general_phy_test_access(resp)); ++} +diff --git a/drivers/video/imx/hdp/API_General.h b/drivers/video/imx/hdp/API_General.h +new file mode 100644 +index 0000000000..44e16e8ad7 +--- /dev/null ++++ b/drivers/video/imx/hdp/API_General.h +@@ -0,0 +1,302 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * API_General.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef API_GENERAL_H_ ++#define API_GENERAL_H_ ++ ++#ifndef __UBOOT__ ++#include <stdint.h> ++#else ++#include <common.h> ++#endif ++ ++#define GENERAL_TEST_ECHO_MAX_PAYLOAD 100 ++#define GENERAL_TEST_ECHO_MIN_PAYLOAD 1 ++ ++/** ++ * \addtogroup GENERAL_API ++ * \{ ++ */ ++/** status code returned by API calls */ ++typedef enum { ++ /** operation succedded */ ++ CDN_OK = 0, ++ /** CEC operation succedded */ ++ CDN_CEC_ERR_NONE = 0, ++ /** mailbox is currently sending or receiving data */ ++ CDN_BSY, ++ /** message set up and ready to be sent, no data sent yet */ ++ CDN_STARTED, ++ /** error encountered while reading/writing APB */ ++ CDN_ERR, ++ /** reply returned with bad opcode */ ++ CDN_BAD_OPCODE, ++ /** reply returned with bad module */ ++ CDN_BAD_MODULE, ++ /** reply not supported mode */ ++ CDN_ERROR_NOT_SUPPORTED, ++ /** Invalid argument passed to CEC API function */ ++ CDN_CEC_ERR_INVALID_ARG, ++ /** ++ * TX Buffer for CEC Messages is full. This is applicable only ++ * when TX Buffers for CEC Messages are implemented in the HW. ++ */ ++ CDN_CEC_ERR_TX_BUFF_FULL, ++ /** No Messages in the RX Buffers are present. */ ++ CDN_CEC_ERR_RX_BUFF_EMPTY, ++ /** Timeout during TX operation */ ++ CDN_CEC_ERR_TX_TIMEOUT, ++ /** Timeout during RX operation */ ++ CDN_CEC_ERR_RX_TIMEOUT, ++ /** Data transmision fail. */ ++ CDN_CEC_ERR_TX_FAILED, ++ /** Data reception fail. */ ++ 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 { ++ CDN_BUS_TYPE_APB = 0, ++ CDN_BUS_TYPE_SAPB = 1 ++} CDN_BUS_TYPE; ++ ++/** ++ * GENERAL_Read_Register response struct ++ */ ++typedef struct { ++ unsigned int addr; ++ unsigned int val; ++} GENERAL_READ_REGISTER_RESPONSE; ++ ++/** ++ * \brief set up API, must be called before any other API call ++ */ ++void cdn_api_init(void); ++ ++/** ++ * \brief Loads firmware ++ * ++ * \param iMem - pointer to instruction memory ++ * \param imemSize - size of instruction memory buffer ++ * \param dMem - pointer to data memory ++ * \param dmemSize - size of data memory buffer ++ * \return 0 if success, 1 if apb error encountered, 2 if CPU ++ * isn't alive after loading firmware ++ * ++ * This function does not require initialisation by #CDN_API_Init ++ */ ++ ++CDN_API_STATUS cdn_api_loadfirmware(unsigned char *imem, ++ int imemsize, ++ unsigned char *dmem, int dmemsize); ++/** ++ * \brief debug echo command for APB ++ * \param val - value to echo ++ * \return status ++ * ++ * will return #CDN_ERROR if reply message doesn't match request ++ */ ++CDN_API_STATUS cdn_api_general_test_echo(unsigned int val, ++ CDN_BUS_TYPE bus_type); ++ ++/** ++ * \brief blocking version of #CDN_API_General_Test_Echo ++ */ ++CDN_API_STATUS cdn_api_general_test_echo_blocking(unsigned int val, ++ CDN_BUS_TYPE bus_type); ++ ++/** ++ * \brief Extended Echo test for mailbox. ++ * ++ * This test will send msg buffer to firmware's mailbox and ++ * receive it back to the resp buffer. Received data will be ++ * check against data sent and status will be returned as well ++ * as received data. ++ * ++ * \param msg - Pointer to a buffer to send. ++ * \param resp - Pointer to buffer for receiving msg payload back. ++ * \param num_bytes - Number of bytes to send and receive. ++ * \param bus_type Bus type. ++ * \return status ++ * ++ * will return #CDN_ERROR if reply message doesn't match request or if ++ * arguments are invalid. ++ */ ++CDN_API_STATUS cdn_api_general_test_echo_ext(uint8_t const *msg, uint8_t *resp, ++ uint16_t num_bytes, ++ CDN_BUS_TYPE bus_type); ++ ++/** ++ * \brief blocking version of #CDN_API_General_Test_Echo_Ext ++ */ ++CDN_API_STATUS cdn_api_general_test_echo_ext_blocking(uint8_t const *msg, ++ uint8_t *resp, ++ uint16_t num_bytes, ++ CDN_BUS_TYPE bus_type); ++ ++/** ++ * \brief get current version ++ * \param [out] ver - fw version ++ * \param [out] libver - lib version ++ * \return status ++ * ++ * this fucntion does not require #CDN_API_Init ++ */ ++CDN_API_STATUS cdn_api_general_getcurversion(unsigned short *ver, ++ unsigned short *verlib); ++ ++/** ++ * \brief read event value ++ * \param [out] event - pointer to store 32-bit events value ++ * \return status ++ * ++ * this function does not require #CDN_API_Init ++ */ ++CDN_API_STATUS cdn_api_get_event(uint32_t *events); ++ ++/** ++ * \brief read debug register value ++ * \param [out] val - pointer to store 16-bit debug reg value ++ * \return status ++ * ++ * this function does not require #CDN_API_Init ++ */ ++CDN_API_STATUS cdn_api_get_debug_reg_val(uint16_t *val); ++ ++/** ++ * \brief check if KEEP_ALIVE register changed ++ * \return #CDN_BSY if KEEP_ALIVE not changed, #CDN_OK if changed and #CDN_ERR ++ * if error occured while reading ++ */ ++CDN_API_STATUS cdn_api_checkalive(void); ++ ++/** ++ * \breif blocking version of #CDN_API_CheckAlive ++ * blocks untill KEEP_ALIVE register changes or error occurs while reading ++ */ ++CDN_API_STATUS cdn_api_checkalive_blocking(void); ++ ++/** ++ * \brief set cpu to standby or active ++ * \param [in] state - 1 for active, 0 for standby ++ * \return status ++ */ ++CDN_API_STATUS cdn_api_maincontrol(unsigned char mode, unsigned char *resp); ++ ++/** ++ * \breif blocking version of #CDN_API_MainControl ++ */ ++CDN_API_STATUS cdn_api_maincontrol_blocking(unsigned char mode, ++ unsigned char *resp); ++ ++/** ++ * \brief settings for APB ++ * ++ * Sends GENERAL_APB_CONF Command via regular Mailbox. ++ * @param dpcd_bus_sel Set DPCD to use selected bus (0 for APB or 1 for SAPB) ++ * @param dpcd_bus_lock Lock bus type. Aftern that bus type cannot be changed ++ * by using this function. ++ * @param hdcp_bus_sel Same meaning as for DPCD but for HDCP. ++ * @param hdcp_bus_lock Same meaning as for DPCD but for HDCP. ++ * @param capb_bus_sel Same meaning as for DPCD but for Cipher APB. ++ * @param capb_bus_lock Same meaning as for DPCD but for Cipher APB. ++ * @param dpcd_resp [out] Status of the operation. ++ * If set to zero then DPCD bus type was successfuly changed. ++ * If not then error occurred, most likely due to locked DPCD bus. ++ * @param hdcp_resp [out] Same as for DPCD but for HDCP. ++ * @param capb_resp [out] Same as for DPCD but for Cipher APB. ++ * ++ * \return status ++ */ ++CDN_API_STATUS cdn_api_apbconf(uint8_t dpcd_bus_sel, uint8_t dpcd_bus_lock, ++ uint8_t hdcp_bus_sel, uint8_t hdcp_bus_lock, ++ uint8_t capb_bus_sel, uint8_t capb_bus_lock, ++ uint8_t *dpcd_resp, uint8_t *hdcp_resp, ++ uint8_t *capb_resp); ++ ++/** ++ * blocking version of #CDN_API_MainControl ++ */ ++CDN_API_STATUS cdn_api_apbconf_blocking(uint8_t dpcd_bus_sel, ++ uint8_t dpcd_bus_lock, ++ uint8_t hdcp_bus_sel, ++ uint8_t hdcp_bus_lock, ++ uint8_t capb_bus_sel, ++ uint8_t capb_bus_lock, ++ uint8_t *dpcd_resp, ++ uint8_t *hdcp_resp, ++ uint8_t *capb_resp); ++ ++/** ++ * \brief set the xtensa clk, write this api before turn on the cpu ++ */ ++CDN_API_STATUS cdn_api_setclock(unsigned char mhz); ++ ++CDN_API_STATUS cdn_api_general_read_register(unsigned int addr, ++ GENERAL_READ_REGISTER_RESPONSE ++ *resp); ++CDN_API_STATUS ++cdn_api_general_read_register_blocking(unsigned int addr, ++ GENERAL_READ_REGISTER_RESPONSE *resp); ++CDN_API_STATUS cdn_api_general_write_register(unsigned int addr, ++ unsigned int val); ++CDN_API_STATUS cdn_api_general_write_register_blocking(unsigned int addr, ++ unsigned int val); ++CDN_API_STATUS cdn_api_general_write_field(unsigned int addr, ++ unsigned char startbit, ++ unsigned char bitsno, ++ unsigned int val); ++CDN_API_STATUS cdn_api_general_write_field_blocking(unsigned int addr, ++ unsigned char startbit, ++ unsigned char bitsno, ++ unsigned int val); ++CDN_API_STATUS cdn_api_general_phy_test_access(uint8_t *resp); ++CDN_API_STATUS cdn_api_general_phy_test_access_blocking(uint8_t *resp); ++ ++#endif +diff --git a/drivers/video/imx/hdp/Makefile b/drivers/video/imx/hdp/Makefile +new file mode 100644 +index 0000000000..13dcefdee5 +--- /dev/null ++++ b/drivers/video/imx/hdp/Makefile +@@ -0,0 +1 @@ ++obj-y += API_General.o util.o test_base_sw.o +diff --git a/drivers/video/imx/hdp/address.h b/drivers/video/imx/hdp/address.h +new file mode 100644 +index 0000000000..327e7a90e4 +--- /dev/null ++++ b/drivers/video/imx/hdp/address.h +@@ -0,0 +1,109 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * address.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef ADDRESS_H_ ++# define ADDRESS_H_ ++ ++# define ADDR_IMEM 0x10000 ++# define ADDR_DMEM 0x20000 ++# define ADDR_CIPHER 0x60000 ++# define BASE_CIPHER 0x600 ++# define ADDR_APB_CFG 0x00000 ++# define BASE_APB_CFG 0x000 ++# define ADDR_SOURCE_AIF_DECODER 0x30000 ++# define BASE_SOURCE_AIF_DECODER 0x300 ++# define ADDR_SOURCE_AIF_SMPL2PCKT 0x30080 ++# define BASE_SOURCE_AIF_SMPL2PCKT 0x300 ++# define ADDR_AIF_ENCODER 0x30000 ++# define BASE_AIF_ENCODER 0x300 ++# define ADDR_SOURCE_PIF 0x30800 ++# define BASE_SOURCE_PIF 0x308 ++# define ADDR_SINK_PIF 0x30800 ++# define BASE_SINK_PIF 0x308 ++# define ADDR_APB_CFG 0x00000 ++# define BASE_APB_CFG 0x000 ++# define ADDR_SOURCE_CSC 0x40000 ++# define BASE_SOURCE_CSC 0x400 ++# define ADDR_UCPU_CFG 0x00000 ++# define BASE_UCPU_CFG 0x000 ++# define ADDR_SOURCE_CAR 0x00900 ++# define BASE_SOURCE_CAR 0x009 ++# define ADDR_SINK_CAR 0x00900 ++# define BASE_SINK_CAR 0x009 ++# define ADDR_CLOCK_METERS 0x00A00 ++# define BASE_CLOCK_METERS 0x00A ++# define ADDR_SOURCE_VIF 0x00b00 ++# define BASE_SOURCE_VIF 0x00b ++# define ADDR_SINK_MHL_HD 0x01000 ++# define ADDR_SINK_VIDEO_HD 0x01800 ++# define BASE_SINK_MHL_HD 0x010 ++# define ADDR_SINK_CORE 0x07800 ++# define BASE_SINK_CORE 0x078 ++# define ADDR_DPTX_PHY 0x02000 ++# define BASE_DPTX_PHY 0x020 ++# define ADDR_DPTX_HPD 0x02100 ++# define BASE_DPTX_HPD 0x021 ++# define ADDR_DPTX_FRAMER 0x02200 ++# define BASE_DPTX_FRAMER 0x022 ++# define ADDR_DPTX_STREAM 0x02200 ++# define BASE_DPTX_STREAM 0x022 ++# define ADDR_DPTX_GLBL 0x02300 ++# define BASE_DPTX_GLBL 0x023 ++# define ADDR_DPTX_HDCP 0x02400 ++# define BASE_DPTX_HDCP 0x024 ++# define ADDR_DP_AUX 0x02800 ++# define BASE_DP_AUX 0x028 ++# define ADDR_CRYPTO 0x05800 ++# define BASE_CRYPTO 0x058 ++# define ADDR_CIPHER 0x60000 ++# define BASE_CIPHER 0x600 ++# define ADDR_SOURCE_MHL_HD 0x01000 ++ ++# define ADDR_AFE (0x20000 * 4) ++# define ADDR_SOURCD_PHY (0x800) ++ ++#endif ++ +diff --git a/drivers/video/imx/hdp/apb_cfg.h b/drivers/video/imx/hdp/apb_cfg.h +new file mode 100644 +index 0000000000..cdcbd76c01 +--- /dev/null ++++ b/drivers/video/imx/hdp/apb_cfg.h +@@ -0,0 +1,185 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * This file was auto-generated. Do not edit it manually. ++ * ++ ****************************************************************************** ++ * ++ * apb_cfg.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef APB_CFG_H_ ++#define APB_CFG_H_ ++ ++/* register APB_CTRL */ ++#define APB_CTRL 0 ++#define F_APB_XT_RESET(x) (((x) & ((1 << 1) - 1)) << 0) ++#define F_APB_XT_RESET_RD(x) (((x) & (((1 << 1) - 1) << 0)) >> 0) ++#define F_APB_DRAM_PATH(x) (((x) & ((1 << 1) - 1)) << 1) ++#define F_APB_DRAM_PATH_RD(x) (((x) & (((1 << 1) - 1) << 1)) >> 1) ++#define F_APB_IRAM_PATH(x) (((x) & ((1 << 1) - 1)) << 2) ++#define F_APB_IRAM_PATH_RD(x) (((x) & (((1 << 1) - 1) << 2)) >> 2) ++ ++/* register XT_INT_CTRL */ ++#define XT_INT_CTRL 1 ++#define F_XT_INT_POLARITY(x) (((x) & ((1 << 2) - 1)) << 0) ++#define F_XT_INT_POLARITY_RD(x) (((x) & (((1 << 2) - 1) << 0)) >> 0) ++ ++/* register MAILBOX_FULL_ADDR */ ++#define MAILBOX_FULL_ADDR 2 ++#define F_MAILBOX_FULL(x) (((x) & ((1 << 1) - 1)) << 0) ++#define F_MAILBOX_FULL_RD(x) (((x) & (((1 << 1) - 1) << 0)) >> 0) ++ ++/* register MAILBOX_EMPTY_ADDR */ ++#define MAILBOX_EMPTY_ADDR 3 ++#define F_MAILBOX_EMPTY(x) (((x) & ((1 << 1) - 1)) << 0) ++#define F_MAILBOX_EMPTY_RD(x) (((x) & (((1 << 1) - 1) << 0)) >> 0) ++ ++/* register MAILBOX0_WR_DATA */ ++#define MAILBOX0_WR_DATA 4 ++#define F_MAILBOX0_WR_DATA(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_MAILBOX0_WR_DATA_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register MAILBOX0_RD_DATA */ ++#define MAILBOX0_RD_DATA 5 ++#define F_MAILBOX0_RD_DATA(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_MAILBOX0_RD_DATA_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register KEEP_ALIVE */ ++#define KEEP_ALIVE 6 ++#define F_KEEP_ALIVE_CNT(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_KEEP_ALIVE_CNT_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register VER_L */ ++#define VER_L 7 ++#define F_VER_LSB(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_VER_LSB_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register VER_H */ ++#define VER_H 8 ++#define F_VER_MSB(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_VER_MSB_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register VER_LIB_L_ADDR */ ++#define VER_LIB_L_ADDR 9 ++#define F_SW_LIB_VER_L(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_LIB_VER_L_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register VER_LIB_H_ADDR */ ++#define VER_LIB_H_ADDR 10 ++#define F_SW_LIB_VER_H(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_LIB_VER_H_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_DEBUG_L */ ++#define SW_DEBUG_L 11 ++#define F_SW_DEBUG_7_0(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_DEBUG_7_0_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_DEBUG_H */ ++#define SW_DEBUG_H 12 ++#define F_SW_DEBUG_15_8(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_DEBUG_15_8_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register MAILBOX_INT_MASK */ ++#define MAILBOX_INT_MASK 13 ++#define F_MAILBOX_INT_MASK(x) (((x) & ((1 << 2) - 1)) << 0) ++#define F_MAILBOX_INT_MASK_RD(x) (((x) & (((1 << 2) - 1) << 0)) >> 0) ++ ++/* register MAILBOX_INT_STATUS */ ++#define MAILBOX_INT_STATUS 14 ++#define F_MAILBOX_INT_STATUS(x) (((x) & ((1 << 2) - 1)) << 0) ++#define F_MAILBOX_INT_STATUS_RD(x) (((x) & (((1 << 2) - 1) << 0)) >> 0) ++ ++/* register SW_CLK_L */ ++#define SW_CLK_L 15 ++#define F_SW_CLOCK_VAL_L(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_CLOCK_VAL_L_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_CLK_H */ ++#define SW_CLK_H 16 ++#define F_SW_CLOCK_VAL_H(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_CLOCK_VAL_H_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_EVENTS0 */ ++#define SW_EVENTS0 17 ++#define F_SW_EVENTS7_0(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_EVENTS7_0_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_EVENTS1 */ ++#define SW_EVENTS1 18 ++#define F_SW_EVENTS15_8(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_EVENTS15_8_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_EVENTS2 */ ++#define SW_EVENTS2 19 ++#define F_SW_EVENTS23_16(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_EVENTS23_16_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register SW_EVENTS3 */ ++#define SW_EVENTS3 20 ++#define F_SW_EVENTS31_24(x) (((x) & ((1 << 8) - 1)) << 0) ++#define F_SW_EVENTS31_24_RD(x) (((x) & (((1 << 8) - 1) << 0)) >> 0) ++ ++/* register XT_OCD_CTRL */ ++#define XT_OCD_CTRL 24 ++#define F_XT_DRESET(x) (((x) & ((1 << 1) - 1)) << 0) ++#define F_XT_DRESET_RD(x) (((x) & (((1 << 1) - 1) << 0)) >> 0) ++#define F_XT_OCDHALTONRESET(x) (((x) & ((1 << 1) - 1)) << 1) ++#define F_XT_OCDHALTONRESET_RD(x) (((x) & (((1 << 1) - 1) << 1)) >> 1) ++ ++/* register XT_OCD_CTRL_RO */ ++#define XT_OCD_CTRL_RO 25 ++#define F_XT_XOCDMODE(x) (((x) & ((1 << 1) - 1)) << 0) ++#define F_XT_XOCDMODE_RD(x) (((x) & (((1 << 1) - 1) << 0)) >> 0) ++ ++/* register APB_INT_MASK */ ++#define APB_INT_MASK 27 ++#define F_APB_INTR_MASK(x) (((x) & ((1 << 3) - 1)) << 0) ++#define F_APB_INTR_MASK_RD(x) (((x) & (((1 << 3) - 1) << 0)) >> 0) ++ ++/* register APB_STATUS_MASK */ ++#define APB_STATUS_MASK 28 ++#define F_APB_INTR_STATUS(x) (((x) & ((1 << 3) - 1)) << 0) ++#define F_APB_INTR_STATUS_RD(x) (((x) & (((1 << 3) - 1) << 0)) >> 0) ++ ++#endif /*APB_CFG*/ +diff --git a/drivers/video/imx/hdp/externs.h b/drivers/video/imx/hdp/externs.h +new file mode 100644 +index 0000000000..055f6ea2e8 +--- /dev/null ++++ b/drivers/video/imx/hdp/externs.h +@@ -0,0 +1,81 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * externs.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef EXTERNS_H_ ++#define EXTERNS_H_ ++ ++#ifndef __UBOOT__ ++#include <stdint.h> ++ ++#else ++#include <common.h> ++#endif ++/** ++ * \addtogroup UTILS ++ * \{ ++ */ ++/** ++ * \brief read from apb ++ * \param addr - address to read ++ * \param value - pointer to store value ++ * \return non-zero value if error ++ */ ++/*extern int cdn_bus_read(unsigned int addr, unsigned int* value);*/ ++ ++/** ++ * \brief write to apb ++ * \param addr - address to write ++ * \param value - value to write ++ * \return non-zero if error ++ */ ++/*extern int cdn_bus_write(unsigned int addr, unsigned int value);*/ ++ ++uint32_t cdn_apb_read(uint32_t addr, uint32_t *value); ++uint32_t cdn_sapb_read(uint32_t addr, uint32_t *value); ++uint32_t cdn_apb_write(uint32_t addr, uint32_t value); ++uint32_t cdn_sapb_write(uint32_t addr, uint32_t value); ++#endif ++ +diff --git a/drivers/video/imx/hdp/general_handler.h b/drivers/video/imx/hdp/general_handler.h +new file mode 100644 +index 0000000000..3656ef8848 +--- /dev/null ++++ b/drivers/video/imx/hdp/general_handler.h +@@ -0,0 +1,162 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * general_handler.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef GENERAL_HANDLER_H ++#define GENERAL_HANDLER_H ++ ++/** ++ * \file ++ * \brief general handler, checks available messages, receives ++ * it from mailbox, handles requests and sends response ++ * to the host ++ */ ++#define DP_TX_MAIL_HANDLER_REQUEST_BUFFER_LEN 256 ++ ++/** ++ * \brief opcode defines host->controller ++ */ ++#define GENERAL_MAIN_CONTROL 0x01 ++#define GENERAL_TEST_ECHO 0x02 ++#define GENERAL_BUS_SETTINGS 0x03 ++#define GENERAL_TEST_ACCESS 0x04 ++ ++#define GENERAL_WRITE_REGISTER 0x05 ++#define GENERAL_WRITE_FIELD 0x06 ++#define GENERAL_READ_REGISTER 0x07 ++ ++#define GENERAL_TEST_TRNG_SIMPLE 0xF0 ++ ++#define GENERAL_MAIN_CONTROL_SET_ACTIVE_BIT 0 ++#define GENERAL_MAIN_CONTROL_SET_ALT_CIPHER_ADDR 1 ++#define GENERAL_MAIN_CONTROL_SET_FAST_HDCP_DELAYS 2 ++ ++#define GENERAL_BUS_SETTINGS_DPCD_BUS_BIT 0 ++#define GENERAL_BUS_SETTINGS_DPCD_BUS_LOCK_BIT 1 ++#define GENERAL_BUS_SETTINGS_HDCP_BUS_BIT 2 ++#define GENERAL_BUS_SETTINGS_HDCP_BUS_LOCK_BIT 3 ++#define GENERAL_BUS_SETTINGS_CAPB_OWNER_BIT 4 ++#define GENERAL_BUS_SETTINGS_CAPB_OWNER_LOCK_BIT 5 ++ ++/** ++ * \brief opcode defines controller->host ++ */ ++ ++#define GENERAL_MAIN_CONTROL_RESP 0x01 ++#define GENERAL_TEST_ECHO_RESP 0x02 ++#define GENERAL_BUS_SETTINGS_RESP 0x03 ++ ++#define GENERAL_READ_REGISTER_RESP 0x07 ++ ++#define GENERAL_BUS_SETTINGS_RESP_DPCD_BUS_BIT 0 ++#define GENERAL_BUS_SETTINGS_RESP_HDCP_BUS_BIT 1 ++#define GENERAL_BUS_SETTINGS_RESP_CAPB_OWNER_BIT 2 ++ ++#define GENERAL_BUS_SETTINGS_RESP_SUCCESS 0 ++#define GENERAL_BUS_SETTINGS_RESP_LOCK_ERROR 1 ++ ++typedef struct { ++ unsigned char dpcd_locked; ++ unsigned char hdcp_locked; ++ unsigned char capb_locked; ++ unsigned char active_mode; ++} S_GENERAL_HANDLER_DATA; ++ ++/** ++ * \brief event id sent to the host ++ */ ++typedef enum { ++ EVENT_ID_DPTX_HPD = 0, ++ EVENT_ID_HDMI_TX_HPD = 0, ++ EVENT_ID_HDMI_RX_5V = 0, ++ ++ EVENT_ID_DPTX_TRAINING = 1, ++ EVENT_ID_HDMI_RX_SCDC_CHANGE = 1, ++ ++ EVENT_ID_RESERVE0 = 2, ++ EVENT_ID_RESERVE1 = 3, ++ ++ EVENT_ID_HDCPTX_STATUS = 4, ++ EVENT_ID_HDCPRX_STATUS = 4, ++ ++ EVENT_ID_HDCPTX_IS_KM_STORED = 5, ++ EVENT_ID_HDCPTX_STORE_KM = 6, ++ EVENT_ID_HDCPTX_IS_RECEIVER_ID_VALID = 7, ++ EVENT_ID_HDMITX_READ_REQUEST = 8, ++} EVENT_ID; ++ ++/** ++ * \brief convert bank id and register number to address and write to ptr ++ */ ++ ++#define select_reg_old(bank, reg_no, ptr) \ ++do { \ ++ ptr = 0; \ ++ if ((bank == 0x22) || (bank == 0x20) || (bank == 0x0b) || \ ++ (bank == 0x09) || (bank == 0x0A)) \ ++ ptr = (unsigned int *)(bank << 8 | reg_no); \ ++} while (0) ++ ++#define select_reg(bank, reg_no, ptr) \ ++ ptr = (unsigned int *)(bank << 8 | reg_no) ++ ++#define select_reg4(pmsb, p2, p3, plsb, ptr) \ ++ ptr = (unsigned int *)((pmsb << 24) | (p2 << 16) | \ ++ (p3 << 8) | (plsb << 0)) ++ ++ ++#define EVENTS_DPTX_CNT 2 ++#define EVENTS_HDCPTX_CNT 4 ++ ++void general_handler_set_active_mode(void); ++void general_handler_set_standby_mode(void); ++ ++/** ++ * \brief request sending en event to the host ++ * \param [in] eventId ++ * \param [in] eventCode ++ */ ++ ++#endif /* GENERAL_HANDLER_H */ +diff --git a/drivers/video/imx/hdp/opcodes.h b/drivers/video/imx/hdp/opcodes.h +new file mode 100644 +index 0000000000..e0e7d93412 +--- /dev/null ++++ b/drivers/video/imx/hdp/opcodes.h +@@ -0,0 +1,115 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * This file was auto-generated. Do not edit it manually. ++ * ++ ****************************************************************************** ++ * ++ * opcodes.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef OPCODES_H_ ++# define OPCODES_H_ ++ ++# define DP_TX_MAIL_HANDLER_H ++# define DP_TX_MAIL_HANDLER_REQUEST_BUFFER_LEN 256 ++# define DPTX_SET_POWER_MNG 0x00 ++# define DPTX_SET_HOST_CAPABILITIES 0x01 ++# define DPTX_GET_EDID 0x02 ++# define DPTX_READ_DPCD 0x03 ++# define DPTX_WRITE_DPCD 0x04 ++# define DPTX_ENABLE_EVENT 0x05 ++# define DPTX_WRITE_REGISTER 0x06 ++# define DPTX_READ_REGISTER 0x07 ++# define DPTX_WRITE_FIELD 0x08 ++# define DPTX_TRAINING_CONTROL 0x09 ++# define DPTX_READ_EVENT 0x0A ++# define DPTX_READ_LINK_STAT 0x0B ++# define DPTX_SET_VIDEO 0x0C ++# define DPTX_SET_AUDIO 0x0D ++# define DPTX_GET_LAST_AUX_STAUS 0x0E ++# define DPTX_SET_LINK_BREAK_POINT 0x0F ++# define DPTX_FORCE_LANES 0x10 ++# define DPTX_HPD_STATE 0x11 ++# define DPTX_DBG_SET 0xF0 ++# define DP_TX_OPCODE_READ_I2C_REQUEST 0xA5 ++# define DP_TX_OPCODE_WRITE_I2C_REQUEST 0xA6 ++# define DP_TX_OPCODE_MESSAGE_FILTER 0xA7 ++# define DPTX_EDID_RESP 0x02 ++# define DPTX_DPCD_READ_RESP 0x03 ++# define DPTX_DPCD_WRITE_RESP 0x04 ++# define DPTX_READ_EVENT_RESP 0x0A ++# define DPTX_READ_REGISTER_RESP 0x07 ++# define DP_TX_OPCODE_MESSAGE 0x10 ++# define DP_TX_OPCODE_READ_I2C_RESPONSE 0x50 ++# define DP_TX_OPCODE_WRITE_I2C_RESPONSE 0x60 ++# define DP_TX_OPCODE_LOOPBACK_TEST 0xFE ++# define DP_TX_OPCODE_BIT_TEST 0xFF ++# define DP_TX_EVENT_ENABLE_HPD_BIT 0x00 ++# define DP_TX_EVENT_ENABLE_TRAINING_BIT 0x01 ++# define DP_TX_EVENT_CODE_HPD_HIGH 0x01 ++# define DP_TX_EVENT_CODE_HPD_LOW 0x02 ++# define DP_TX_EVENT_CODE_HPD_PULSE 0x04 ++# define DP_TX_EVENT_CODE_HPD_STATE_HIGH 0x08 ++# define DP_TX_EVENT_CODE_HPD_STATE_LOW 0x00 ++# define DP_TX_EVENT_CODE_TRAINING_FULL_STARTED 0x01 ++# define DP_TX_EVENT_CODE_TRAINING_FAST_STARTED 0x02 ++# define DP_TX_EVENT_CODE_TRAINING_FINISHED_CR 0x04 ++# define DP_TX_EVENT_CODE_TRAINING_FINISHED_EQ 0x08 ++# define DP_TX_EVENT_CODE_TRAINING_FINISHED_FAST 0x10 ++# define DP_TX_EVENT_CODE_TRAINING_FAILED_CR 0x20 ++# define DP_TX_EVENT_CODE_TRAINING_FAILED_EQ 0x40 ++# define DP_TX_EVENT_CODE_TRAINING_FAILED_FAST 0x80 ++# define MB_MODULE_ID_DP_TX 0x01 ++# define MB_MODULE_ID_DP_RX 0x02 ++# define MB_MODULE_ID_HDMI_TX 0x03 ++# define MB_MODULE_ID_HDMI_RX 0x04 ++# define MB_MODULE_ID_MHL_TX 0x05 ++# define MB_MODULE_ID_MHL_RX 0x06 ++# define MB_MODULE_ID_HDCP_TX 0x07 ++# define MB_MODULE_ID_HDCP_RX 0x08 ++# define MB_MODULE_ID_HDCP_GENERAL 0x09 ++# define MB_MODULE_ID_GENERAL 0x0A ++# define MB_MODULE_ID 1 ++ ++#endif +diff --git a/drivers/video/imx/hdp/test_base_sw.c b/drivers/video/imx/hdp/test_base_sw.c +new file mode 100644 +index 0000000000..7618323cd8 +--- /dev/null ++++ b/drivers/video/imx/hdp/test_base_sw.c +@@ -0,0 +1,181 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * test_base_sw.c ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef __UBOOT__ ++#include <stdlib.h> ++#include <string.h> ++#include <stdio.h> ++#else ++#include <common.h> ++#include <asm/io.h> ++ ++#ifdef CONFIG_ARCH_IMX8M ++/* mscale */ ++#define HDMI_BASE 0x32c00000 ++#define HDMI_PHY_BASE 0x32c80000 ++#define HDMI_SEC_BASE 0x32e40000 ++#endif ++#ifdef CONFIG_ARCH_IMX8 ++/* QM */ ++#define HDMI_BASE 0x56268000 ++#define HDMI_SEC_BASE 0x56269000 ++#define HDMI_OFFSET_ADDR 0x56261008 ++#define HDMI_SEC_OFFSET_ADDR 0x5626100c ++#endif ++ ++#endif ++ ++#ifdef CONFIG_ARCH_IMX8M ++int cdn_apb_read(unsigned int addr, unsigned int *value) ++{ ++ unsigned int temp; ++ uint64_t tmp_addr = addr + HDMI_BASE; ++ temp = __raw_readl(tmp_addr); ++ *value = temp; ++ return 0; ++} ++ ++int cdn_apb_write(unsigned int addr, unsigned int value) ++{ ++ uint64_t tmp_addr = addr + HDMI_BASE; ++ ++ __raw_writel(value, tmp_addr); ++ return 0; ++} ++ ++int cdn_sapb_read(unsigned int addr, unsigned int *value) ++{ ++ unsigned int temp; ++ uint64_t tmp_addr = addr + HDMI_SEC_BASE; ++ temp = __raw_readl(tmp_addr); ++ *value = temp; ++ return 0; ++} ++ ++int cdn_sapb_write(unsigned int addr, unsigned int value) ++{ ++ uint64_t tmp_addr = addr + HDMI_SEC_BASE; ++ __raw_writel(value, tmp_addr); ++ return 0; ++} ++ ++void cdn_sleep(uint32_t ms) ++{ ++ mdelay(ms); ++} ++ ++void cdn_usleep(uint32_t us) ++{ ++ udelay(us); ++} ++#endif ++#ifdef CONFIG_ARCH_IMX8 ++int cdn_apb_read(unsigned int addr, unsigned int *value) ++{ ++ unsigned int temp; ++ uint64_t tmp_addr = (addr & 0xfff) + HDMI_BASE; ++ ++ /* printf("%s():%d addr = 0x%08x, tmp_addr = 0x%08x, offset = 0x%08x\n", ++ __func__, __LINE__, addr, (unsigned int)tmp_addr, addr>>12); */ ++ ++ __raw_writel(addr >> 12, HDMI_OFFSET_ADDR); ++ ++ temp = __raw_readl(tmp_addr); ++ /* printf("%s():%d temp = 0x%08x\n", __func__, __LINE__, temp ); */ ++ ++ *value = temp; ++ return 0; ++} ++ ++int cdn_apb_write(unsigned int addr, unsigned int value) ++{ ++ uint64_t tmp_addr = (addr & 0xfff) + HDMI_BASE; ++ ++ /*printf("%s():%d addr=0x%08x, taddr=0x%08x, off=0x%08x, val=0x%08x\n", ++ __func__, __LINE__, addr, (unsigned int)tmp_addr, ++ addr>>12, value);*/ ++ ++ __raw_writel(addr >> 12, HDMI_OFFSET_ADDR); ++ ++ /* printf("%s():%d\n", __func__, __LINE__); */ ++ __raw_writel(value, tmp_addr); ++ ++ return 0; ++} ++ ++int cdn_sapb_read(unsigned int addr, unsigned int *value) ++{ ++ unsigned int temp; ++ uint64_t tmp_addr = (addr & 0xfff) + HDMI_SEC_BASE; ++ ++ __raw_writel(addr >> 12, HDMI_SEC_OFFSET_ADDR); ++ ++ temp = __raw_readl(tmp_addr); ++ *value = temp; ++ return 0; ++} ++ ++int cdn_sapb_write(unsigned int addr, unsigned int value) ++{ ++ uint64_t tmp_addr = (addr & 0xfff) + HDMI_SEC_BASE; ++ ++ __raw_writel(addr >> 12, HDMI_SEC_OFFSET_ADDR); ++ __raw_writel(value, tmp_addr); ++ ++ return 0; ++} ++ ++void cdn_sleep(uint32_t ms) ++{ ++ mdelay(ms); ++} ++ ++void cdn_usleep(uint32_t us) ++{ ++ udelay(us); ++} ++#endif ++ +diff --git a/drivers/video/imx/hdp/util.c b/drivers/video/imx/hdp/util.c +new file mode 100644 +index 0000000000..727946a796 +--- /dev/null ++++ b/drivers/video/imx/hdp/util.c +@@ -0,0 +1,329 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * util.c ++ * ++ ****************************************************************************** ++ */ ++ ++#include "util.h" ++#include "API_General.h" ++#include "externs.h" ++#ifndef __UBOOT__ ++#include <string.h> ++#endif ++#include "apb_cfg.h" ++#include "opcodes.h" ++#ifndef __UBOOT__ ++#include <stdio.h> ++ ++#endif ++state_struct state; ++ ++int cdn_bus_read(unsigned int addr, unsigned int *value) ++{ ++ return state.bus_type ? ++ cdn_sapb_read(addr, value) : cdn_apb_read(addr, value); ++} ++ ++int cdn_bus_write(unsigned int addr, unsigned int value) ++{ ++ return state.bus_type ? ++ cdn_sapb_write(addr, value) : cdn_apb_write(addr, value); ++} ++ ++void internal_itobe(int val, volatile unsigned char *dest, int bytes) ++{ ++ int i; ++ for (i = bytes - 1; i >= 0; --i) { ++ dest[i] = (unsigned char)val; ++ val >>= 8; ++ } ++} ++ ++uint32_t internal_betoi(volatile uint8_t const *src, uint8_t bytes) ++{ ++ uint32_t ret = 0; ++ int i; ++ ++ if (bytes > sizeof(ret)) { ++ printf("Warning. Read request for payload larger then supported.\n"); ++ bytes = sizeof(ret); ++ } ++ ++ for (i = 0; i < bytes; ++i) { ++ ret <<= 8; ++ ret |= (unsigned int)src[i]; ++ } ++ ++ return ret; ++} ++ ++unsigned int internal_mkmsg(volatile unsigned char *dest, int valno, ...) ++{ ++ va_list vl; ++ unsigned int len = 0; ++ va_start(vl, valno); ++ len = internal_vmkmsg(dest, valno, vl); ++ va_end(vl); ++ return len; ++} ++ ++unsigned int internal_vmkmsg(volatile unsigned char *dest, int valno, ++ va_list vl) ++{ ++ unsigned int len = 0; ++ int i; ++ for (i = 0; i < valno; ++i) { ++ int size = va_arg(vl, int); ++ if (size > 0) { ++ internal_itobe(va_arg(vl, int), dest, size); ++ dest += size; ++ len += size; ++ } else { ++ memcpy((void *)dest, va_arg(vl, void *), -size); ++ dest -= size; ++ len -= size; ++ } ++ } ++ return len; ++} ++ ++void internal_tx_mkfullmsg(unsigned char module, unsigned char opcode, ++ int valno, ...) ++{ ++ va_list vl; ++ va_start(vl, valno); ++ internal_vtx_mkfullmsg(module, opcode, valno, vl); ++ va_end(vl); ++} ++ ++void internal_vtx_mkfullmsg(unsigned char module, unsigned char opcode, ++ int valno, va_list vl) ++{ ++ unsigned int len = ++ internal_vmkmsg(state.txbuffer + INTERNAL_CMD_HEAD_SIZE, valno, vl); ++ internal_mbox_tx_enable(module, opcode, len); ++ state.txenable = 1; ++ state.running = 1; ++} ++ ++void internal_readmsg(int valno, ...) ++{ ++ va_list vl; ++ va_start(vl, valno); ++ internal_vreadmsg(valno, vl); ++ va_end(vl); ++} ++ ++void internal_vreadmsg(int valno, va_list vl) ++{ ++ uint8_t *src = state.rxbuffer + INTERNAL_CMD_HEAD_SIZE; ++ size_t i; ++ ++ for (i = 0; i < (size_t) valno; ++i) { ++ int size = va_arg(vl, int); ++ void *ptr = va_arg(vl, void *); ++ ++ if (!ptr) { ++ src += size; ++ } else if (!size) { ++ *((unsigned char **)ptr) = src; ++ } else if (size > 0) { ++ switch ((size_t) size) { ++ case sizeof(uint8_t): ++ *((uint8_t *)ptr) = internal_betoi(src, size); ++ break; ++ case sizeof(uint16_t): ++ *((uint16_t *)ptr) = internal_betoi(src, size); ++ break; ++ case 3: /* 3-byte value (e.g. DPCD address) ++ can be safely converted from BE.*/ ++ case sizeof(uint32_t): ++ *((uint32_t *)ptr) = internal_betoi(src, size); ++ break; ++ default: ++ printf("Warning. Unsupported variable size.\n"); ++ memcpy(ptr, src, size); ++ }; ++ ++ src += size; ++ } else { ++ memcpy(ptr, src, -size); ++ src -= size; ++ } ++ } ++} ++ ++INTERNAL_MBOX_STATUS mailbox_write(unsigned char val) ++{ ++ INTERNAL_MBOX_STATUS ret; ++ unsigned int full; ++ if (cdn_bus_read(MAILBOX_FULL_ADDR << 2, &full)) { ++ ret.tx_status = CDN_TX_APB_ERROR; ++ return ret; ++ } ++ if (full) { ++ ret.tx_status = CDN_TX_FULL; ++ return ret; ++ } ++ if (cdn_bus_write(MAILBOX0_WR_DATA << 2, val)) { ++ ret.tx_status = CDN_TX_APB_ERROR; ++ return ret; ++ } ++ ret.tx_status = CDN_TX_WRITE; ++ return ret; ++} ++ ++INTERNAL_MBOX_STATUS mailbox_read(volatile unsigned char *val) ++{ ++ INTERNAL_MBOX_STATUS ret; ++ unsigned int empty; ++ unsigned int rd; ++ if (cdn_bus_read(MAILBOX_EMPTY_ADDR << 2, &empty)) { ++ ret.rx_status = CDN_RX_APB_ERROR; ++ return ret; ++ } ++ if (empty) { ++ ret.rx_status = CDN_RX_EMPTY; ++ return ret; ++ } ++ if (cdn_bus_read(MAILBOX0_RD_DATA << 2, &rd)) { ++ ret.rx_status = CDN_RX_APB_ERROR; ++ return ret; ++ } ++ *val = (unsigned char)rd; ++ ret.rx_status = CDN_RX_READ; ++ return ret; ++} ++ ++INTERNAL_MBOX_STATUS internal_mbox_tx_process(void) ++{ ++ unsigned int txcount = 0; ++ unsigned int length = ++ (unsigned int)state.txbuffer[2] << 8 | (unsigned int)state. ++ txbuffer[3]; ++ INTERNAL_MBOX_STATUS ret = {.txend = 0 }; ++ ret.tx_status = CDN_TX_NOTHING; ++ INTERNAL_MBOX_STATUS tx_ret; ++ if (!state.txenable) ++ return ret; ++ while ((tx_ret.tx_status = ++ mailbox_write(state.txbuffer[state.txi]).tx_status) == ++ CDN_TX_WRITE) { ++ txcount++; ++ if (++state.txi >= length + 4) { ++ state.txenable = 0; ++ state.txi = 0; ++ ret.txend = 1; ++ break; ++ } ++ } ++ if (txcount && tx_ret.tx_status == CDN_TX_FULL) ++ ret.tx_status = CDN_TX_WRITE; ++ else ++ ret.tx_status = tx_ret.tx_status; ++ return ret; ++} ++ ++INTERNAL_MBOX_STATUS internal_mbox_rx_process(void) ++{ ++ unsigned int rxcount = 0; ++ INTERNAL_MBOX_STATUS ret = { 0, 0, 0, 0 }; ++ INTERNAL_MBOX_STATUS rx_ret; ++ while ((rx_ret.rx_status = ++ mailbox_read(state.rxbuffer + state.rxi).rx_status) == ++ CDN_RX_READ) { ++ rxcount++; ++ if (++state.rxi >= 4 + ++ ((unsigned int)state.rxbuffer[2] << 8 | ++ (unsigned int)state.rxbuffer[3])) { /* end of message */ ++ state.rxi = 0; ++ ret.rxend = 1; ++ state.rxenable = 0; ++ break; ++ } ++ } ++ ret.rx_status = rxcount ? CDN_RX_READ : CDN_RX_EMPTY; ++ return ret; ++} ++ ++unsigned int internal_apb_available(void) ++{ ++ return !(state.rxenable || state.txenable); ++} ++ ++void internal_mbox_tx_enable(unsigned char module, unsigned char opcode, ++ unsigned short length) ++{ ++ state.txbuffer[0] = opcode; ++ state.txbuffer[1] = module; ++ state.txbuffer[2] = (unsigned char)(length >> 8); ++ state.txbuffer[3] = (unsigned char)length; ++ state.txenable = 1; ++} ++ ++CDN_API_STATUS internal_test_rx_head(unsigned char module, unsigned char opcode) ++{ ++ if (opcode != state.rxbuffer[0]) ++ return CDN_BAD_OPCODE; ++ if (module != state.rxbuffer[1]) ++ return CDN_BAD_MODULE; ++ return CDN_OK; ++} ++ ++CDN_API_STATUS internal_test_rx_head_match(void) ++{ ++ return internal_test_rx_head(state.txbuffer[1], state.txbuffer[0]); ++} ++ ++void print_fw_ver(void) ++{ ++ unsigned short ver, verlib; ++ cdn_api_general_getcurversion(&ver, &verlib); ++ printf("FIRMWARE VERSION: %d, LIB VERSION: %d\n", ver, verlib); ++} ++ ++unsigned short internal_get_msg_len(void) ++{ ++ return ((unsigned short)state.rxbuffer[2] << 8) | (unsigned short)state. ++ rxbuffer[3]; ++} +diff --git a/drivers/video/imx/hdp/util.h b/drivers/video/imx/hdp/util.h +new file mode 100644 +index 0000000000..605f0f933b +--- /dev/null ++++ b/drivers/video/imx/hdp/util.h +@@ -0,0 +1,278 @@ ++/****************************************************************************** ++ * ++ * Copyright (C) 2016-2017 Cadence Design Systems, Inc. ++ * All rights reserved worldwide. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * ++ * 2. Redistributions in binary form must reproduce the above copyright notice, ++ * this list of conditions and the following disclaimer in the documentation ++ * and/or other materials provided with the distribution. ++ * ++ * 3. Neither the name of the copyright holder nor the names of its contributors ++ * may be used to endorse or promote products derived from this software without ++ * specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", ++ * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ++ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++ * 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 ++ * ++ ****************************************************************************** ++ * ++ * util.h ++ * ++ ****************************************************************************** ++ */ ++ ++#ifndef UTIL_H_ ++#define UTIL_H_ ++ ++#include "API_General.h" ++#ifndef __UBOOT__ ++#include <stdarg.h> ++#include <stdint.h> ++#else ++#include <common.h> ++#endif ++/** ++ * \addtogroup UTILS ++ * \{ ++ */ ++#define INTERNAL_CMD_HEAD_SIZE 4 ++ ++/** ++ * \brief expands to blocking function body ++ * \param x - function call ++ */ ++#define internal_block_function(x) \ ++do { \ ++ CDN_API_STATUS ret; \ ++ do { \ ++ ret = x; \ ++ } while (ret == CDN_BSY || ret == CDN_STARTED); \ ++ return ret; \ ++} while (0) ++ ++/** ++ * \brief write message and write response (if any), non-blocking way. Also sets state.running = 0 ++ */ ++#define INTERNAL_PROCESS_MESSAGES \ ++do { \ ++ if (state.txenable && !internal_mbox_tx_process().txend) \ ++ return CDN_BSY; \ ++ if (state.rxenable && !internal_mbox_rx_process().rxend) \ ++ return CDN_BSY; \ ++ state.running = 0; \ ++} while (0) ++ ++#define internal_opcode_ok_or_return(module, opcode) \ ++do { \ ++ CDN_API_STATUS ret = internal_test_rx_head(module, opcode); \ ++ if (ret != CDN_OK) \ ++ return ret; \ ++} while (0) ++ ++#define internal_opcode_match_or_return() \ ++do { \ ++ CDN_API_STATUS ret = internal_test_rx_head_match(); \ ++ if (ret != CDN_OK) \ ++ return ret; \ ++} while (0) ++ ++/* macro for simple tx only command, command format as in mkfullmsg ++ (with count) */ ++#define internal_macro_command_tx(module, opcode, bustype, command...) \ ++do { \ ++ if (!state.running) { \ ++ internal_tx_mkfullmsg(module, opcode, command); \ ++ state.bus_type = bustype; \ ++ return CDN_STARTED; \ ++ } \ ++ INTERNAL_PROCESS_MESSAGES; \ ++} while (0) ++ ++/* macro for command with response with matching opcode, command format as in ++ mkfullmsg (with count) */ ++#define internal_macro_command_txrx(module, opcode, bustype, command...) \ ++do { \ ++ if (!state.running) { \ ++ internal_tx_mkfullmsg(module, opcode, command); \ ++ state.bus_type = bustype; \ ++ state.rxenable = 1; \ ++ return CDN_STARTED; \ ++ } \ ++ INTERNAL_PROCESS_MESSAGES; \ ++ internal_opcode_match_or_return(); \ ++} while (0) ++ ++typedef struct { ++ /** apb write status */ ++ enum tx_status_enum { ++ /** one or more bytes written */ ++ CDN_TX_WRITE = 0, ++ /** nothing to write */ ++ CDN_TX_NOTHING = 1, ++ /** mailbox full, 0 bytes written */ ++ CDN_TX_FULL = 2, ++ /** APB error while writing */ ++ CDN_TX_APB_ERROR = 3 ++ } tx_status:3; ++ /** apb read status */ ++ enum rx_status_enum { ++ /** 1 or more bytes read */ ++ CDN_RX_READ = 0, ++ /** mailbox empty, 0 bytes read */ ++ CDN_RX_EMPTY = 1, ++ /** apb error while reading */ ++ CDN_RX_APB_ERROR = 2 ++ } rx_status:2; ++ /** indicates end of currenly recived message */ ++ unsigned char rxend:1; ++ /** end of tx message reached */ ++ unsigned char txend:1; ++} INTERNAL_MBOX_STATUS; ++ ++/** ++ * \brief put val into dest in big endian format ++ * \param val - value to put ++ * \param dest - place to put value ++ * \param bytes - true size of val in bytes. for example if ++ * bytes = 2 val is treated as short int ++ */ ++void internal_itobe(int val, volatile unsigned char *dest, int bytes); ++ ++/** ++ * \brief read big endian value from src and return it ++ * \param src - source to read from ++ * \param bytes - size of read value ++ * \return result ++ */ ++uint32_t internal_betoi(volatile uint8_t const *src, uint8_t bytes); ++ ++/** ++ * \brief create message from size and value pairs; also sets ++ * state.running and state.txEnable ++ * \param dest - pointer to write message to ++ * \param valNo - number of values to write ++ * \param ... - pairs of size and value, each value is written ++ * after another. if size is positive value, value is ++ * written with #internal_itobe, if size is negative, ++ * value is treated as src pointer for memcpy ++ * ++ * example: ++ * ++ * unsigned short x = 0xAABB; ++ * ++ * internal_mkmsg(dest, 3, 1, 1, 2, 3, -2, &x); ++ * ++ * will write 01 00 03 AA BB to dest ++ */ ++unsigned int internal_mkmsg(volatile unsigned char *dest, int valno, ...); ++unsigned int internal_vmkmsg(volatile unsigned char *dest, int valno, ++ va_list vl); ++ ++/** ++ * \brief setup message header in txBuffer, set txEnable = 1 ++ */ ++void internal_mbox_tx_enable(unsigned char module, unsigned char opcode, ++ unsigned short length); ++ ++/** ++ * \brief write from txBuffer to mailbox untill full or end of message. ++ * ++ * when txEnable == 0 writes nothing ++ * when write reaches end of message set txEnable = 0 ++ */ ++ ++/** ++ * \brief combination of #internal_mkmsg and #internal_mbox_tx_enable ++ * ++ * #internal_mkmsg dest and #internal_mbox_tx_enable length are determined ++ * automaticly this function also sets state.txEnable = 1 and ++ * state.running ++ */ ++void internal_tx_mkfullmsg(unsigned char module, unsigned char opcode, ++ int valno, ...); ++void internal_vtx_mkfullmsg(unsigned char module, unsigned char opcode, ++ int valno, va_list vl); ++ ++/** ++ * \brief read from state.txBuffer and store results in specified pointers ++ * \param valNo - numbero of values to read ++ * \param ... - pairs of size and ptr ++ * ++ * this function is similar to #internal_mkmsg - ++ * ++ * when size is positive read value using #internal_betoi ++ * when size is negative mempcy from txBuffer to ptr -size bytes ++ * when size is 0 write to ptr addres of current position in rxbuffer ++ * when ptr is NULL ignore size bytes (if size is negative this ++ * will rewind buffer) ++ */ ++void internal_readmsg(int valno, ...); ++void internal_vreadmsg(int valno, va_list vl); ++ ++INTERNAL_MBOX_STATUS internal_mbox_tx_process(void); ++/** ++ * \brief read to rxBuffer from mailbox untill empty or end of message ++ * ++ * when rxEnable == 0 reads nothing ++ * when end of message reached sets rxEnable = 0 ++ */ ++INTERNAL_MBOX_STATUS internal_mbox_rx_process(void); ++ ++/** ++ * \brief check if apb is available ++ * \return !(rxEnable && txEable) ++ */ ++unsigned int internal_apb_available(void); ++ ++/** ++ * \brief test if parameters match module and opcode in rxBuffer ++ * \return CDN_OK or CDN_BAD_OPCODE or CDN_BAD_MODULE ++ */ ++CDN_API_STATUS internal_test_rx_head(unsigned char module, ++ unsigned char opcode); ++ ++CDN_API_STATUS internal_test_rx_head_match(void); ++ ++/** ++ * \brief print current fw and lib version ++ */ ++void print_fw_ver(void); ++ ++typedef struct { ++ unsigned char txbuffer[1024]; ++ unsigned char rxbuffer[1024]; ++ unsigned int txi; /* iterators */ ++ unsigned int rxi; ++ unsigned char txenable; /*data readt to send*/ ++ unsigned char rxenable; ++ unsigned char running; ++ CDN_BUS_TYPE bus_type; ++ unsigned int tmp; ++} state_struct; ++ ++unsigned short internal_get_msg_len(void); ++ ++#endif +diff --git a/drivers/video/imx/hdp_load.c b/drivers/video/imx/hdp_load.c +new file mode 100644 +index 0000000000..d5eea2cf72 +--- /dev/null ++++ b/drivers/video/imx/hdp_load.c +@@ -0,0 +1,107 @@ ++/* ++ * Copyright 2017-2018 NXP ++ * ++ * SPDX-License-Identifier: GPL-2.0+ ++ */ ++ ++#include <common.h> ++#include <command.h> ++ ++#include "API_General.h" ++#include "scfw_utils.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#define ON 1 ++#define OFF 0 ++ ++static void display_set_power(int onoff) ++{ ++ sc_ipc_t ipcHndl = -1; ++ ++ SC_PM_SET_RESOURCE_POWER_MODE(ipcHndl, SC_R_DC_0, onoff); ++ SC_PM_SET_RESOURCE_POWER_MODE(ipcHndl, SC_R_HDMI, onoff); ++} ++ ++static void display_set_clocks(void) ++{ ++ sc_ipc_t ipcHndl = -1; ++ const sc_pm_clock_rate_t pll = 1188000000; ++ const sc_pm_clock_rate_t hdmi_core_clock = pll / 10; ++ const sc_pm_clock_rate_t hdmi_bus_clock = pll / 14; ++ ++ SC_PM_SET_RESOURCE_POWER_MODE(ipcHndl, ++ SC_R_HDMI_PLL_0, SC_PM_PW_MODE_OFF); ++ SC_PM_SET_CLOCK_RATE(ipcHndl, ++ SC_R_HDMI_PLL_0, SC_PM_CLK_PLL, pll); ++ SC_PM_SET_RESOURCE_POWER_MODE(ipcHndl, ++ SC_R_HDMI_PLL_0, SC_PM_PW_MODE_ON); ++ ++ /* HDMI DI Bus Clock */ ++ SC_PM_SET_CLOCK_RATE(ipcHndl, ++ SC_R_HDMI, SC_PM_CLK_MISC4, hdmi_bus_clock); ++ /* HDMI DI Core Clock */ ++ SC_PM_SET_CLOCK_RATE(ipcHndl, ++ SC_R_HDMI, SC_PM_CLK_MISC2, hdmi_core_clock); ++} ++ ++static void display_enable_clocks(int enable) ++{ ++ sc_ipc_t ipcHndl = -1; ++ ++ SC_PM_CLOCK_ENABLE(ipcHndl, SC_R_HDMI_PLL_0, SC_PM_CLK_PLL, enable); ++ SC_PM_CLOCK_ENABLE(ipcHndl, SC_R_HDMI, SC_PM_CLK_MISC2, enable); ++ SC_PM_CLOCK_ENABLE(ipcHndl, SC_R_HDMI, SC_PM_CLK_MISC4, enable); ++} ++ ++int do_hdp(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) ++{ ++ if (argc < 2) ++ return 0; ++ ++ if (strncmp(argv[1], "tracescfw", 9) == 0) { ++ g_debug_scfw = 1; ++ printf("Enabled SCFW API tracing\n"); ++ } else if (strncmp(argv[1], "load", 4) == 0) { ++ unsigned long address = 0; ++ unsigned long offset = 0x2000; ++ const int iram_size = 0x10000; ++ const int dram_size = 0x8000; ++ ++ if (argc > 2) { ++ address = simple_strtoul(argv[2], NULL, 0); ++ if (argc > 3) ++ offset = simple_strtoul(argv[3], NULL, 0); ++ } else ++ printf("Missing address\n"); ++ ++ printf("Loading hdp firmware from 0x%016lx offset 0x%016lx\n", ++ address, offset); ++ display_set_power(SC_PM_PW_MODE_ON); ++ display_set_clocks(); ++ display_enable_clocks(ON); ++ cdn_api_loadfirmware((unsigned char *)(address + offset), ++ iram_size, ++ (unsigned char *)(address + offset + ++ iram_size), ++ dram_size); ++ display_enable_clocks(OFF); ++ printf("Loading hdp firmware Complete\n"); ++ /* do not turn off hdmi power or firmware load will be lost */ ++ } else { ++ printf("test error argc %d\n", argc); ++ } ++ ++ return 0; ++} ++/***************************************************/ ++ ++U_BOOT_CMD( ++ hdp, CONFIG_SYS_MAXARGS, 1, do_hdp, ++ "load hdmi firmware ", ++ "[<command>] ...\n" ++ "hdpload [address] [<offset>]\n" ++ " address - address where the binary image starts\n" ++ " <offset> - IRAM offset in the binary image (8192 default)\n" ++ "tracescfw - Trace SCFW API calls for video commands\n" ++ ); +diff --git a/drivers/video/imx/scfw_utils.h b/drivers/video/imx/scfw_utils.h +new file mode 100644 +index 0000000000..a583d26a78 +--- /dev/null ++++ b/drivers/video/imx/scfw_utils.h +@@ -0,0 +1,90 @@ ++/* ++ * Copyright 2017 NXP ++ * ++ * SPDX-License-Identifier: GPL-2.0+ ++ */ ++#ifndef _SCFW_UTILS_H_ ++#define _SCFW_UTILS_H_ ++ ++#include <common.h> ++#include <asm/arch/sci/sci.h> ++ ++static int g_debug_scfw; /* set to one to turn on SCFW API tracing */ ++ ++#define SC_PM_SET_CLOCK_PARENT(__ipcHndl__, __res__, __clk__, __parent__) \ ++do { \ ++ char _res_str[] = #__res__;\ ++ char _clk_str[] = #__clk__;\ ++ sc_err_t _ret;\ ++ if (g_debug_scfw) \ ++ printf("(%4d) sc_pm_set_clock_parent %s:%s -> %d\n",\ ++ __LINE__, _res_str, _clk_str, __parent__);\ ++ _ret = sc_pm_set_clock_parent(__ipcHndl__,\ ++ __res__, __clk__, __parent__);\ ++ if (_ret != SC_ERR_NONE) \ ++ printf("(%d)>> sc_pm_set_clock_parent failed! %s:%s -> %d (error = %d)\n",\ ++ __LINE__, _res_str, _clk_str, __parent__, _ret);\ ++} while (0) ++ ++#define SC_PM_SET_CLOCK_RATE(__ipcHndl__, __res__, __clk__, __rate__) \ ++do { \ ++ char _res_str[] = #__res__;\ ++ char _clk_str[] = #__clk__;\ ++ sc_err_t _ret;\ ++ sc_pm_clock_rate_t _actual = __rate__;\ ++ if (g_debug_scfw) \ ++ printf("(%4d) sc_pm_set_clock_rate %s:%s -> %d\n",\ ++ __LINE__, _res_str, _clk_str, __rate__);\ ++ _ret = sc_pm_set_clock_rate(__ipcHndl__, __res__, __clk__, &_actual);\ ++ if (_ret != SC_ERR_NONE)\ ++ printf("(%4d)>> sc_pm_set_clock_rate failed! %s:%s -> %d (error = %d)\n",\ ++ __LINE__, _res_str, _clk_str, __rate__, _ret);\ ++ if (_actual != __rate__)\ ++ printf("(%4d)>> Actual rate for %s:%s is %d instead of %d\n", \ ++ __LINE__, _res_str, _clk_str, _actual, __rate__); \ ++} while (0) ++ ++#define SC_PM_CLOCK_ENABLE(__ipcHndl__, __res__, __clk__, __enable__) \ ++do { \ ++ char _res_str[] = #__res__;\ ++ char _clk_str[] = #__clk__;\ ++ sc_err_t _ret;\ ++ if (g_debug_scfw) \ ++ printf("(%4d) sc_pm_clock_enable %s:%s -> %d\n",\ ++ __LINE__, _res_str, _clk_str, __enable__);\ ++ _ret = sc_pm_clock_enable(ipcHndl,\ ++ __res__, __clk__, __enable__, false);\ ++ if (_ret != SC_ERR_NONE)\ ++ printf("(%4d)>> sc_pm_clock_enable failed! %s:%s -> %d (error = %d)\n",\ ++ __LINE__, _res_str, _clk_str, __enable__, _ret);\ ++} while (0) \ ++ ++#define SC_MISC_SET_CONTROL(__ipcHndl__, __res__, __clk__, __value__) \ ++do { \ ++ char _res_str[] = #__res__; \ ++ char _clk_str[] = #__clk__; \ ++ sc_err_t _ret; \ ++ if (g_debug_scfw) \ ++ printf("(%4d) sc_misc_set_control %s:%s -> %d\n",\ ++ __LINE__, _res_str, _clk_str, __value__);\ ++ _ret = sc_misc_set_control(ipcHndl, \ ++ __res__, __clk__, __value__); \ ++ if (_ret != SC_ERR_NONE) \ ++ printf("(%4d)>> sc_misc_set_control failed! %s:%s -> %d (error = %d)\n", \ ++ __LINE__, _res_str, _clk_str, __value__, _ret); \ ++} while (0) ++ ++#define SC_PM_SET_RESOURCE_POWER_MODE(__ipcHndl__, __res__, __enable__) \ ++do { \ ++ char _res_str[] = #__res__; \ ++ sc_err_t _ret; \ ++ if (g_debug_scfw) \ ++ printf("(%4d) sc_pm_set_resource_power_mode %s -> %d\n",\ ++ __LINE__, _res_str, __enable__);\ ++ _ret = sc_pm_set_resource_power_mode(ipcHndl, __res__, __enable__);\ ++ if (_ret != SC_ERR_NONE) \ ++ printf("(%4d)>> sc_pm_set_resource_power_mode failed! %s -> %d (error = %d)\n", \ ++ __LINE__, _res_str, __enable__, _ret);\ ++} while (0) ++ ++#endif /*_SCFW_UTILS_H_ */ +-- +2.13.6 + |