Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
765 changes: 765 additions & 0 deletions bridges/anxdp/anx_dp.c

Large diffs are not rendered by default.

237 changes: 237 additions & 0 deletions bridges/anxdp/anx_dp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@

/*-
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2021 Jesper Schmitz Mouridsen <jsm@FreeBSD.org>
* Copyright (c) 2019 Jonathan A. Kollasch <jakllsch@kollasch.net>

* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/


#ifndef __ANXEDP_H__
#define __ANXEDP_H__
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#undef CONFIG_DRM_DP_CEC
#include <drm/drm_crtc_helper.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_edid.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_panel.h>
#include <drm/drm_connector.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_edid.h>
#include <linux/bitops.h>
#define __BITS(hi,lo) ((~((~0)<<((hi)+1)))&((~0)<<(lo)))
#define __BIT BIT
#define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask))
#define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask))
#define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask))
#define ANXDP_AUDIO 0
#define ANXDP_DP_TX_VERSION 0x010
#define ANXDP_TX_SW_RESET 0x014
#define RESET_DP_TX __BIT(0)
#define ANXDP_FUNC_EN_1 0x018
#define MASTER_VID_FUNC_EN_N __BIT(7)
#define RK_VID_CAP_FUNC_EN_N __BIT(6)
#define SLAVE_VID_FUNC_EN_N __BIT(5)
#define RK_VID_FIFO_FUNC_EN_N __BIT(5)
#define AUD_FIFO_FUNC_EN_N __BIT(4)
#define AUD_FUNC_EN_N __BIT(3)
#define HDCP_FUNC_EN_N __BIT(2)
#define CRC_FUNC_EN_N __BIT(1)
#define SW_FUNC_EN_N __BIT(0)
#define ANXDP_FUNC_EN_2 0x01c
#define SSC_FUNC_EN_N __BIT(7)
#define AUX_FUNC_EN_N __BIT(2)
#define SERDES_FIFO_FUNC_EN_N __BIT(1)
#define LS_CLK_DOMAIN_FUNC_EN_N __BIT(0)
#define ANXDP_VIDEO_CTL_1 0x020
#define VIDEO_EN __BIT(7)
#define VIDEO_MUTE __BIT(6)
#define ANXDP_VIDEO_CTL_2 0x024
#define ANXDP_VIDEO_CTL_3 0x028
#define ANXDP_VIDEO_CTL_4 0x02c
#define ANXDP_VIDEO_CTL_8 0x03c
#define ANXDP_VIDEO_CTL_10 0x044
#define F_SEL __BIT(4)
#define SLAVE_I_SCAN_CFG __BIT(2)
#define SLAVE_VSYNC_P_CFG __BIT(1)
#define SLAVE_HSYNC_P_CFG __BIT(0)
#define ANXDP_PLL_REG_1 0x0fc
#define REF_CLK_24M __BIT(0)
#define RKANXDP_PD 0x12c
#define DP_INC_BG __BIT(7)
#define DP_EXP_PD __BIT(6)
#define DP_PHY_PD __BIT(5)
#define RK_AUX_PD __BIT(5)
#define AUX_PD __BIT(4)
#define RK_PLL_PD __BIT(4)
#define CHx_PD(x) __BIT(x) /* 0<=x<=3 */
#define DP_ALL_PD __BITS(7,0)
#define ANXDP_LANE_MAP 0x35c
#define ANXDP_ANALOG_CTL_1 0x370
#define TX_TERMINAL_CTRL_50_OHM __BIT(4)
#define ANXDP_ANALOG_CTL_2 0x374
#define SEL_24M __BIT(3)
#define TX_DVDD_BIT_1_0625V 0x4
#define ANXDP_ANALOG_CTL_3 0x378
#define DRIVE_DVDD_BIT_1_0625V (0x4 << 5)
#define VCO_BIT_600_MICRO (0x5 << 0)
#define ANXDP_PLL_FILTER_CTL_1 0x37c
#define PD_RING_OSC __BIT(6)
#define AUX_TERMINAL_CTRL_50_OHM (2 << 4)
#define TX_CUR1_2X __BIT(2)
#define TX_CUR_16_MA 3
#define ANXDP_TX_AMP_TUNING_CTL 0x380
#define ANXDP_AUX_HW_RETRY_CTL 0x390
#define AUX_BIT_PERIOD_EXPECTED_DELAY(x) __SHIFTIN((x), __BITS(10,8))
#define AUX_HW_RETRY_INTERVAL_600_US __SHIFTIN(0, __BITS(4,3))
#define AUX_HW_RETRY_INTERVAL_800_US __SHIFTIN(1, __BITS(4,3))
#define AUX_HW_RETRY_INTERVAL_1000_US __SHIFTIN(2, __BITS(4,3))
#define AUX_HW_RETRY_INTERVAL_1800_US __SHIFTIN(3, __BITS(4,3))
#define AUX_HW_RETRY_COUNT_SEL(x) __SHIFTIN((x), __BITS(2,0))
#define ANXDP_COMMON_INT_STA_1 0x3c4
#define PLL_LOCK_CHG __BIT(6)
#define ANXDP_COMMON_INT_STA_2 0x3c8
#define ANXDP_COMMON_INT_STA_3 0x3cc
#define ANXDP_COMMON_INT_STA_4 0x3d0
#define ANXDP_DP_INT_STA 0x3dc
#define INT_HPD __BIT(6)
#define HW_TRAINING_FINISH __BIT(5)
#define RPLY_RECEIV __BIT(1)
#define AUX_ERR __BIT(0)
#define ANXDP_SYS_CTL_1 0x600
#define DET_STA __BIT(2)
#define FORCE_DET __BIT(1)
#define DET_CTRL __BIT(0)
#define ANXDP_SYS_CTL_2 0x604
#define ANXDP_SYS_CTL_3 0x608
#define HPD_STATUS __BIT(6)
#define F_HPD __BIT(5)
#define HPD_CTRL __BIT(4)
#define HDCP_RDY __BIT(3)
#define STRM_VALID __BIT(2)
#define F_VALID __BIT(1)
#define VALID_CTRL __BIT(0)
#define ANXDP_SYS_CTL_4 0x60c
#define ANXDP_PKT_SEND_CTL 0x640
#define ANXDP_HDCP_CTL 0x648
#define ANXDP_LINK_BW_SET 0x680
#define ANXDP_LANE_COUNT_SET 0x684
#define ANXDP_TRAINING_PTN_SET 0x688
#define SCRAMBLING_DISABLE __BIT(5)
#define SW_TRAINING_PATTERN_SET_PTN2 __SHIFTIN(2, __BITS(1,0))
#define SW_TRAINING_PATTERN_SET_PTN1 __SHIFTIN(1, __BITS(1,0))
#define ANXDP_LNx_LINK_TRAINING_CTL(x) (0x68c + 4 * (x)) /* 0 <= x <= 3 */
#define MAX_PRE_REACH __BIT(5)
#define PRE_EMPHASIS_SET(x) __SHIFTIN((x), __BITS(4,3))
#define MAX_DRIVE_REACH __BIT(2)
#define DRIVE_CURRENT_SET(x) __SHIFTIN((x), __BITS(1,0))
#define ANXDP_DEBUG_CTL 0x6c0
#define PLL_LOCK __BIT(4)
#define F_PLL_LOCK __BIT(3)
#define PLL_LOCK_CTRL __BIT(2)
#define PN_INV __BIT(0)
#define ANXDP_LINK_DEBUG_CTL 0x6e0
#define ANXDP_PLL_CTL 0x71c
#define ANXDP_PHY_PD 0x720
#define ANXDP_PHY_TEST 0x724
#define MACRO_RST __BIT(5)
#define ANXDP_M_AUD_GEN_FILTER_TH 0x778
#define ANXDP_AUX_CH_STA 0x780
#define AUX_BUSY __BIT(4)
#define AUX_STATUS(x) __SHIFTOUT((x), __BITS(3,0))
#define ANXDP_AUX_ERR_NUM 0x784
#define ANXDP_AUX_CH_DEFER_CTL 0x788
#define DEFER_CTRL_EN __BIT(7)
#define DEFER_COUNT(x) __SHIFTIN((x), __BITS(6,0))
#define ANXDP_AUX_RX_COMM 0x78c
#define AUX_RX_COMM_I2C_DEFER __BIT(3)
#define AUX_RX_COMM_AUX_DEFER __BIT(1)
#define ANXDP_BUFFER_DATA_CTL 0x790
#define BUF_CLR __BIT(7)
#define BUF_DATA_COUNT(x) __SHIFTIN((x), __BITS(4,0))
#define ANXDP_AUX_CH_CTL_1 0x794
#define AUX_LENGTH(x) __SHIFTIN((x) - 1, __BITS(7,4))
#define AUX_TX_COMM_I2C_TRANSACTION (0x0 << 3)

#define AUX_TX_COMM(x) __SHIFTOUT(x, __BITS(3,0))
#define AUX_TX_COMM_DP __BIT(3)
#define AUX_TX_COMM_MOT __BIT(2)
#define AUX_TX_COMM_READ __BIT(0)
#define ANXDP_AUX_ADDR_7_0 0x798
#define AUX_ADDR_7_0(x) (((x) >> 0) & 0xff)
#define ANXDP_AUX_ADDR_15_8 0x79c
#define AUX_ADDR_15_8(x) (((x) >> 8) & 0xff)
#define ANXDP_AUX_ADDR_19_16 0x7a0
#define AUX_ADDR_19_16(x) (((x) >> 16) & 0xf)
#define ANXDP_AUX_CH_CTL_2 0x7a4
#define ADDR_ONLY __BIT(1)
#define AUX_EN __BIT(0)
#define ANXDP_BUF_DATA(x) (0x7c0 + 4 * (x))
#define ANXDP_SOC_GENERAL_CTL 0x800
#define AUDIO_MODE_SPDIF_MODE __BIT(8)
#define VIDEO_MODE_SLAVE_MODE __BIT(1)
#define ANXDP_CRC_CON 0x890
#define ANXDP_PLL_REG_2 0x9e4
#define ANXDP_PLL_REG_3 0x9e8
#define ANXDP_PLL_REG_4 0x9ec
#define ANXDP_PLL_REG_5 0xa00




struct anxdp_softc {
struct mtx mtx;
device_t iicbus;
struct device* sc_dev;

struct resource *res[2];
u_int sc_flags;
#define ANXDP_FLAG_ROCKCHIP __BIT(0)
struct drm_connector sc_connector;
struct drm_encoder sc_encoder;
struct drm_dp_aux sc_dpaux;
struct drm_panel * sc_panel;
uint8_t sc_dpcd[DP_RECEIVER_CAP_SIZE];
struct drm_bridge sc_bridge;
struct drm_display_mode sc_curmode;
};

#define ANXDP_LOCK(sc) mtx_lock(&(sc)->mtx)
#define ANXDP_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
#define ANXDP_WRITE(sc, reg, val) bus_write_4((sc)->res[0], (reg), (val))
#define ANXDP_READ(sc, reg) bus_read_4((sc)->res[0], (reg))

#define to_edp_connector(x) container_of(x, struct anxdp_connector, base)
int anxdp_attach(struct anxdp_softc *sc);
void anxdp_add_bridge(struct anxdp_softc *sc,struct drm_encoder *encoder);

DECLARE_CLASS(anxdp_driver);
#endif /* ANXEDP_H */

7 changes: 4 additions & 3 deletions core/drm_dp_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -957,13 +957,13 @@ static void unlock_bus(struct i2c_adapter *i2c, unsigned int flags)
{
mutex_unlock(&i2c_to_aux(i2c)->hw_mutex);
}

#ifndef __FreeBSD__
static const struct i2c_lock_operations drm_dp_i2c_lock_ops = {
.lock_bus = lock_bus,
.trylock_bus = trylock_bus,
.unlock_bus = unlock_bus,
};

#endif
static int drm_dp_aux_get_crc(struct drm_dp_aux *aux, u8 *crc)
{
u8 buf, count;
Expand Down Expand Up @@ -1067,8 +1067,9 @@ void drm_dp_aux_init(struct drm_dp_aux *aux)
aux->ddc.algo = &drm_dp_i2c_algo;
aux->ddc.algo_data = aux;
aux->ddc.retries = 3;

#ifndef __FreeBSD__
aux->ddc.lock_ops = &drm_dp_i2c_lock_ops;
#endif
}
EXPORT_SYMBOL(drm_dp_aux_init);

Expand Down
14 changes: 10 additions & 4 deletions core/drm_dp_mst_topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
#ifdef __linux__
#include <linux/iopoll.h>
#endif

#if IS_ENABLED(CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS)
#include <linux/stacktrace.h>
Expand Down Expand Up @@ -2116,9 +2118,10 @@ static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb,
int drm_dp_mst_connector_late_register(struct drm_connector *connector,
struct drm_dp_mst_port *port)
{
#ifndef __FreeBSD__
DRM_DEBUG_KMS("registering %s remote bus for %s\n",
port->aux.name, connector->kdev->kobj.name);

#endif
port->aux.dev = connector->kdev;
return drm_dp_aux_register_devnode(&port->aux);
}
Expand All @@ -2136,8 +2139,10 @@ EXPORT_SYMBOL(drm_dp_mst_connector_late_register);
void drm_dp_mst_connector_early_unregister(struct drm_connector *connector,
struct drm_dp_mst_port *port)
{
#ifndef __FreeBSD__
DRM_DEBUG_KMS("unregistering %s remote bus for %s\n",
port->aux.name, connector->kdev->kobj.name);
#endif
drm_dp_aux_unregister_devnode(&port->aux);
}
EXPORT_SYMBOL(drm_dp_mst_connector_early_unregister);
Expand Down Expand Up @@ -4391,6 +4396,7 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
return ret;
}

#ifndef __FreeBSD__
static int do_get_act_status(struct drm_dp_aux *aux)
{
int ret;
Expand All @@ -4402,7 +4408,6 @@ static int do_get_act_status(struct drm_dp_aux *aux)

return status;
}

/**
* drm_dp_check_act_status() - Polls for ACT handled status.
* @mgr: manager to use
Expand Down Expand Up @@ -4445,7 +4450,7 @@ int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
return 0;
}
EXPORT_SYMBOL(drm_dp_check_act_status);

#endif
/**
* drm_dp_calc_pbn_mode() - Calculate the PBN for a mode.
* @clock: dot clock for the mode
Expand Down Expand Up @@ -5359,8 +5364,9 @@ static int drm_dp_mst_register_i2c_bus(struct drm_dp_aux *aux)
aux->ddc.class = I2C_CLASS_DDC;
aux->ddc.owner = THIS_MODULE;
aux->ddc.dev.parent = aux->dev;
#ifndef __FreeBSD__
aux->ddc.dev.of_node = aux->dev->of_node;

#endif
strlcpy(aux->ddc.name, aux->name ? aux->name : dev_name(aux->dev),
sizeof(aux->ddc.name));

Expand Down
3 changes: 2 additions & 1 deletion core/include/drm/drm_dp_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@

#ifndef _DRM_DP_HELPER_H_
#define _DRM_DP_HELPER_H_

#include <linux/mutex.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/types.h>
Expand Down
18 changes: 3 additions & 15 deletions core/include/drm/drm_print.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,14 +351,7 @@ void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
* @fmt: printf() like format string.
*/
#define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \
({ \
static DEFINE_RATELIMIT_STATE(_rs, \
DEFAULT_RATELIMIT_INTERVAL, \
DEFAULT_RATELIMIT_BURST); \
\
if (__ratelimit(&_rs)) \
DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \
})
DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__);

#define DRM_DEV_INFO(dev, fmt, ...) \
drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__)
Expand Down Expand Up @@ -508,13 +501,8 @@ void __drm_err(const char *format, ...);


#define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) \
({ \
static DEFINE_RATELIMIT_STATE(_rs, \
DEFAULT_RATELIMIT_INTERVAL, \
DEFAULT_RATELIMIT_BURST); \
if (__ratelimit(&_rs)) \
drm_dev_dbg(NULL, DRM_UT_KMS, fmt, ##__VA_ARGS__); \
})
drm_dev_dbg(NULL, DRM_UT_KMS, fmt, ##__VA_ARGS__)


/*
* struct drm_device based WARNs
Expand Down
Loading