Commit 1e7f3551 authored by Baihan Li's avatar Baihan Li Committed by Dmitry Baryshkov
Browse files

drm/hisilicon/hibmc: Refactor the member of drm_aux in struct hibmc_dp



Because the drm_aux of struct hibmc_dp_dev's member is not easy to get in
hibmc_drm_dp.c, move the drm_aux to struct hibmc_dp. Then there are some
adaptations and modifications to make this patch compile.

Signed-off-by: default avatarBaihan Li <libaihan@huawei.com>
Signed-off-by: default avatarYongbang Shi <shiyongbang@huawei.com>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://lore.kernel.org/r/20250331074212.3370287-5-shiyongbang@huawei.com


Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
parent 5f80fb4d
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#include <drm/drm_print.h>
#include "dp_comm.h"
#include "dp_reg.h"
#include "dp_hw.h"

#define HIBMC_AUX_CMD_REQ_LEN		GENMASK(7, 4)
#define HIBMC_AUX_CMD_ADDR		GENMASK(27, 8)
@@ -124,7 +125,8 @@ static int hibmc_dp_aux_parse_xfer(struct hibmc_dp_dev *dp, struct drm_dp_aux_ms
/* ret >= 0 ,ret is size; ret < 0, ret is err code */
static ssize_t hibmc_dp_aux_xfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
{
	struct hibmc_dp_dev *dp = container_of(aux, struct hibmc_dp_dev, aux);
	struct hibmc_dp *dp_priv = container_of(aux, struct hibmc_dp, aux);
	struct hibmc_dp_dev *dp = dp_priv->dp_dev;
	u32 aux_cmd;
	int ret;
	u32 val; /* val will be assigned at the beginning of readl_poll_timeout function */
@@ -151,14 +153,15 @@ static ssize_t hibmc_dp_aux_xfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *
	return hibmc_dp_aux_parse_xfer(dp, msg);
}

void hibmc_dp_aux_init(struct hibmc_dp_dev *dp)
void hibmc_dp_aux_init(struct hibmc_dp *dp)
{
	hibmc_dp_reg_write_field(dp, HIBMC_DP_AUX_REQ, HIBMC_DP_CFG_AUX_SYNC_LEN_SEL, 0x0);
	hibmc_dp_reg_write_field(dp, HIBMC_DP_AUX_REQ, HIBMC_DP_CFG_AUX_TIMER_TIMEOUT, 0x1);
	hibmc_dp_reg_write_field(dp, HIBMC_DP_AUX_REQ, HIBMC_DP_CFG_AUX_MIN_PULSE_NUM,
	hibmc_dp_reg_write_field(dp->dp_dev, HIBMC_DP_AUX_REQ, HIBMC_DP_CFG_AUX_SYNC_LEN_SEL, 0x0);
	hibmc_dp_reg_write_field(dp->dp_dev, HIBMC_DP_AUX_REQ, HIBMC_DP_CFG_AUX_TIMER_TIMEOUT, 0x1);
	hibmc_dp_reg_write_field(dp->dp_dev, HIBMC_DP_AUX_REQ, HIBMC_DP_CFG_AUX_MIN_PULSE_NUM,
				 HIBMC_DP_MIN_PULSE_NUM);

	dp->aux.transfer = hibmc_dp_aux_xfer;
	dp->aux.is_remote = 0;
	drm_dp_aux_init(&dp->aux);
	dp->dp_dev->aux = &dp->aux;
}
+4 −2
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
#include <linux/io.h>
#include <drm/display/drm_dp_helper.h>

#include "dp_hw.h"

#define HIBMC_DP_LANE_NUM_MAX 2

struct hibmc_link_status {
@@ -32,7 +34,7 @@ struct hibmc_dp_link {
};

struct hibmc_dp_dev {
	struct drm_dp_aux aux;
	struct drm_dp_aux *aux;
	struct drm_device *dev;
	void __iomem *base;
	struct mutex lock; /* protects concurrent RW in hibmc_dp_reg_write_field() */
@@ -58,7 +60,7 @@ struct hibmc_dp_dev {
		mutex_unlock(&_dp->lock);				\
	} while (0)

void hibmc_dp_aux_init(struct hibmc_dp_dev *dp);
void hibmc_dp_aux_init(struct hibmc_dp *dp);
int hibmc_dp_link_training(struct hibmc_dp_dev *dp);
int hibmc_dp_serdes_init(struct hibmc_dp_dev *dp);
int hibmc_dp_serdes_rate_switch(u8 rate, struct hibmc_dp_dev *dp);
+1 −1
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ int hibmc_dp_hw_init(struct hibmc_dp *dp)
	dp_dev->dev = drm_dev;
	dp_dev->base = dp->mmio + HIBMC_DP_OFFSET;

	hibmc_dp_aux_init(dp_dev);
	hibmc_dp_aux_init(dp);

	ret = hibmc_dp_serdes_init(dp_dev);
	if (ret)
+2 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <drm/drm_encoder.h>
#include <drm/drm_connector.h>
#include <drm/drm_print.h>
#include <drm/display/drm_dp_helper.h>

struct hibmc_dp_dev;

@@ -19,6 +20,7 @@ struct hibmc_dp {
	struct drm_encoder encoder;
	struct drm_connector connector;
	void __iomem *mmio;
	struct drm_dp_aux aux;
};

int hibmc_dp_hw_init(struct hibmc_dp *dp);
+11 −11
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ static int hibmc_dp_link_training_configure(struct hibmc_dp_dev *dp)
	/* set rate and lane count */
	buf[0] = dp->link.cap.link_rate;
	buf[1] = DP_LANE_COUNT_ENHANCED_FRAME_EN | dp->link.cap.lanes;
	ret = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, sizeof(buf));
	ret = drm_dp_dpcd_write(dp->aux, DP_LINK_BW_SET, buf, sizeof(buf));
	if (ret != sizeof(buf)) {
		drm_dbg_dp(dp->dev, "dp aux write link rate and lanes failed, ret: %d\n", ret);
		return ret >= 0 ? -EIO : ret;
@@ -51,7 +51,7 @@ static int hibmc_dp_link_training_configure(struct hibmc_dp_dev *dp)
	/* set 8b/10b and downspread */
	buf[0] = DP_SPREAD_AMP_0_5;
	buf[1] = DP_SET_ANSI_8B10B;
	ret = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf));
	ret = drm_dp_dpcd_write(dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf));
	if (ret != sizeof(buf)) {
		drm_dbg_dp(dp->dev, "dp aux write 8b/10b and downspread failed, ret: %d\n", ret);
		return ret >= 0 ? -EIO : ret;
@@ -96,7 +96,7 @@ static int hibmc_dp_link_set_pattern(struct hibmc_dp_dev *dp, int pattern)

	hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_PAT_SEL, val);

	ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_PATTERN_SET, &buf, sizeof(buf));
	ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_PATTERN_SET, &buf, sizeof(buf));
	if (ret != sizeof(buf)) {
		drm_dbg_dp(dp->dev, "dp aux write training pattern set failed\n");
		return ret >= 0 ? -EIO : ret;
@@ -126,7 +126,7 @@ static int hibmc_dp_link_training_cr_pre(struct hibmc_dp_dev *dp)
	if (ret)
		return ret;

	ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, train_set, dp->link.cap.lanes);
	ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET, train_set, dp->link.cap.lanes);
	if (ret != dp->link.cap.lanes) {
		drm_dbg_dp(dp->dev, "dp aux write training lane set failed\n");
		return ret >= 0 ? -EIO : ret;
@@ -210,9 +210,9 @@ static int hibmc_dp_link_training_cr(struct hibmc_dp_dev *dp)

	voltage_tries = 1;
	for (cr_tries = 0; cr_tries < 80; cr_tries++) {
		drm_dp_link_train_clock_recovery_delay(&dp->aux, dp->dpcd);
		drm_dp_link_train_clock_recovery_delay(dp->aux, dp->dpcd);

		ret = drm_dp_dpcd_read_link_status(&dp->aux, lane_status);
		ret = drm_dp_dpcd_read_link_status(dp->aux, lane_status);
		if (ret) {
			drm_err(dp->dev, "Get lane status failed\n");
			return ret;
@@ -236,7 +236,7 @@ static int hibmc_dp_link_training_cr(struct hibmc_dp_dev *dp)
		if (ret)
			return ret;

		ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, dp->link.train_set,
		ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET, dp->link.train_set,
					dp->link.cap.lanes);
		if (ret != dp->link.cap.lanes) {
			drm_dbg_dp(dp->dev, "Update link training failed\n");
@@ -263,9 +263,9 @@ static int hibmc_dp_link_training_channel_eq(struct hibmc_dp_dev *dp)
		return ret;

	for (eq_tries = 0; eq_tries < HIBMC_EQ_MAX_RETRY; eq_tries++) {
		drm_dp_link_train_channel_eq_delay(&dp->aux, dp->dpcd);
		drm_dp_link_train_channel_eq_delay(dp->aux, dp->dpcd);

		ret = drm_dp_dpcd_read_link_status(&dp->aux, lane_status);
		ret = drm_dp_dpcd_read_link_status(dp->aux, lane_status);
		if (ret) {
			drm_err(dp->dev, "get lane status failed\n");
			break;
@@ -290,7 +290,7 @@ static int hibmc_dp_link_training_channel_eq(struct hibmc_dp_dev *dp)
		if (ret)
			return ret;

		ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
		ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET,
					dp->link.train_set, dp->link.cap.lanes);
		if (ret != dp->link.cap.lanes) {
			drm_dbg_dp(dp->dev, "Update link training failed\n");
@@ -330,7 +330,7 @@ int hibmc_dp_link_training(struct hibmc_dp_dev *dp)
	struct hibmc_dp_link *link = &dp->link;
	int ret;

	ret = drm_dp_read_dpcd_caps(&dp->aux, dp->dpcd);
	ret = drm_dp_read_dpcd_caps(dp->aux, dp->dpcd);
	if (ret)
		drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret);