lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202502090741.9ypSEryz-lkp@intel.com>
Date: Sun, 9 Feb 2025 07:52:52 +0800
From: kernel test robot <lkp@...el.com>
To: Baihan Li <libaihan@...wei.com>
Cc: oe-kbuild-all@...ts.linux.dev, linux-kernel@...r.kernel.org,
	Dmitry Baryshkov <dmitry.baryshkov@...aro.org>,
	Yongbang Shi <shiyongbang@...wei.com>,
	Tian Tao <tiantao6@...ilicon.com>
Subject: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:87: undefined reference
 to `drm_dp_dpcd_write'

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   493f3f38da21cf61b25254f7a3dc817179b497c8
commit: 54063d86e0369f53f180137e5e889bc19cd9015b drm/hisilicon/hibmc: add dp link moduel in hibmc drivers
date:   5 weeks ago
config: x86_64-randconfig-r063-20250208 (https://download.01.org/0day-ci/archive/20250209/202502090741.9ypSEryz-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250209/202502090741.9ypSEryz-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502090741.9ypSEryz-lkp@intel.com/

All errors (new ones prefixed by >>):

   ld: vmlinux.o: in function `hibmc_dp_aux_init':
   drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c:163: undefined reference to `drm_dp_aux_init'
   ld: vmlinux.o: in function `hibmc_dp_link_set_pattern':
>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:87: undefined reference to `drm_dp_dpcd_write'
   ld: vmlinux.o: in function `hibmc_dp_link_training_configure':
   drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:29: undefined reference to `drm_dp_dpcd_write'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:38: undefined reference to `drm_dp_dpcd_write'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:44: undefined reference to `drm_dp_read_dpcd_caps'
   ld: vmlinux.o: in function `hibmc_dp_link_get_adjust_train':
>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:129: undefined reference to `drm_dp_get_adjust_request_voltage'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:130: undefined reference to `drm_dp_get_adjust_request_pre_emphasis'
   ld: vmlinux.o: in function `hibmc_dp_link_training_cr':
>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:196: undefined reference to `drm_dp_clock_recovery_ok'
   ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:209: undefined reference to `drm_dp_dpcd_write'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:188: undefined reference to `drm_dp_link_train_clock_recovery_delay'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:190: undefined reference to `drm_dp_dpcd_read_link_status'
   ld: vmlinux.o: in function `hibmc_dp_link_training_channel_eq':
>> drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:236: undefined reference to `drm_dp_link_train_channel_eq_delay'
   ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:238: undefined reference to `drm_dp_dpcd_read_link_status'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:244: undefined reference to `drm_dp_clock_recovery_ok'
>> ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:251: undefined reference to `drm_dp_channel_eq_ok'
   ld: drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:258: undefined reference to `drm_dp_dpcd_write'
   ld: vmlinux.o: in function `hibmc_dp_link_training_cr_pre':
   drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c:113: undefined reference to `drm_dp_dpcd_write'


vim +87 drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c

    11	
    12	static int hibmc_dp_link_training_configure(struct hibmc_dp_dev *dp)
    13	{
    14		u8 buf[2];
    15		int ret;
    16	
    17		/* DP 2 lane */
    18		hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_LANE_DATA_EN,
    19					 dp->link.cap.lanes == 0x2 ? 0x3 : 0x1);
    20		hibmc_dp_reg_write_field(dp, HIBMC_DP_DPTX_GCTL0, HIBMC_DP_CFG_PHY_LANE_NUM,
    21					 dp->link.cap.lanes == 0x2 ? 0x1 : 0);
    22	
    23		/* enhanced frame */
    24		hibmc_dp_reg_write_field(dp, HIBMC_DP_VIDEO_CTRL, HIBMC_DP_CFG_STREAM_FRAME_MODE, 0x1);
    25	
    26		/* set rate and lane count */
    27		buf[0] = dp->link.cap.link_rate;
    28		buf[1] = DP_LANE_COUNT_ENHANCED_FRAME_EN | dp->link.cap.lanes;
    29		ret = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, sizeof(buf));
    30		if (ret != sizeof(buf)) {
    31			drm_dbg_dp(dp->dev, "dp aux write link rate and lanes failed, ret: %d\n", ret);
    32			return ret >= 0 ? -EIO : ret;
    33		}
    34	
    35		/* set 8b/10b and downspread */
    36		buf[0] = DP_SPREAD_AMP_0_5;
    37		buf[1] = DP_SET_ANSI_8B10B;
  > 38		ret = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf));
    39		if (ret != sizeof(buf)) {
    40			drm_dbg_dp(dp->dev, "dp aux write 8b/10b and downspread failed, ret: %d\n", ret);
    41			return ret >= 0 ? -EIO : ret;
    42		}
    43	
  > 44		ret = drm_dp_read_dpcd_caps(&dp->aux, dp->dpcd);
    45		if (ret)
    46			drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret);
    47	
    48		return ret;
    49	}
    50	
    51	static int hibmc_dp_link_set_pattern(struct hibmc_dp_dev *dp, int pattern)
    52	{
    53		int ret;
    54		u8 val;
    55		u8 buf;
    56	
    57		buf = (u8)pattern;
    58		if (pattern != DP_TRAINING_PATTERN_DISABLE && pattern != DP_TRAINING_PATTERN_4) {
    59			buf |= DP_LINK_SCRAMBLING_DISABLE;
    60			hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_SCRAMBLE_EN, 0x1);
    61		} else {
    62			hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_SCRAMBLE_EN, 0);
    63		}
    64	
    65		switch (pattern) {
    66		case DP_TRAINING_PATTERN_DISABLE:
    67			val = 0;
    68			break;
    69		case DP_TRAINING_PATTERN_1:
    70			val = 1;
    71			break;
    72		case DP_TRAINING_PATTERN_2:
    73			val = 2;
    74			break;
    75		case DP_TRAINING_PATTERN_3:
    76			val = 3;
    77			break;
    78		case DP_TRAINING_PATTERN_4:
    79			val = 4;
    80			break;
    81		default:
    82			return -EINVAL;
    83		}
    84	
    85		hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_PAT_SEL, val);
    86	
  > 87		ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_PATTERN_SET, &buf, sizeof(buf));
    88		if (ret != sizeof(buf)) {
    89			drm_dbg_dp(dp->dev, "dp aux write training pattern set failed\n");
    90			return ret >= 0 ? -EIO : ret;
    91		}
    92	
    93		return 0;
    94	}
    95	
    96	static int hibmc_dp_link_training_cr_pre(struct hibmc_dp_dev *dp)
    97	{
    98		u8 *train_set = dp->link.train_set;
    99		int ret;
   100		u8 i;
   101	
   102		ret = hibmc_dp_link_training_configure(dp);
   103		if (ret)
   104			return ret;
   105	
   106		ret = hibmc_dp_link_set_pattern(dp, DP_TRAINING_PATTERN_1);
   107		if (ret)
   108			return ret;
   109	
   110		for (i = 0; i < dp->link.cap.lanes; i++)
   111			train_set[i] = DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
   112	
   113		ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, train_set, dp->link.cap.lanes);
   114		if (ret != dp->link.cap.lanes) {
   115			drm_dbg_dp(dp->dev, "dp aux write training lane set failed\n");
   116			return ret >= 0 ? -EIO : ret;
   117		}
   118	
   119		return 0;
   120	}
   121	
   122	static bool hibmc_dp_link_get_adjust_train(struct hibmc_dp_dev *dp,
   123						   u8 lane_status[DP_LINK_STATUS_SIZE])
   124	{
   125		u8 train_set[HIBMC_DP_LANE_NUM_MAX] = {0};
   126		u8 lane;
   127	
   128		for (lane = 0; lane < dp->link.cap.lanes; lane++)
 > 129			train_set[lane] = drm_dp_get_adjust_request_voltage(lane_status, lane) |
 > 130					  drm_dp_get_adjust_request_pre_emphasis(lane_status, lane);
   131	
   132		if (memcmp(dp->link.train_set, train_set, HIBMC_DP_LANE_NUM_MAX)) {
   133			memcpy(dp->link.train_set, train_set, HIBMC_DP_LANE_NUM_MAX);
   134			return true;
   135		}
   136	
   137		return false;
   138	}
   139	
   140	static inline int hibmc_dp_link_reduce_rate(struct hibmc_dp_dev *dp)
   141	{
   142		switch (dp->link.cap.link_rate) {
   143		case DP_LINK_BW_2_7:
   144			dp->link.cap.link_rate = DP_LINK_BW_1_62;
   145			return 0;
   146		case DP_LINK_BW_5_4:
   147			dp->link.cap.link_rate = DP_LINK_BW_2_7;
   148			return 0;
   149		case DP_LINK_BW_8_1:
   150			dp->link.cap.link_rate = DP_LINK_BW_5_4;
   151			return 0;
   152		default:
   153			return -EINVAL;
   154		}
   155	}
   156	
   157	static inline int hibmc_dp_link_reduce_lane(struct hibmc_dp_dev *dp)
   158	{
   159		switch (dp->link.cap.lanes) {
   160		case 0x2:
   161			dp->link.cap.lanes--;
   162			break;
   163		case 0x1:
   164			drm_err(dp->dev, "dp link training reduce lane failed, already reach minimum\n");
   165			return -EIO;
   166		default:
   167			return -EINVAL;
   168		}
   169	
   170		return 0;
   171	}
   172	
   173	static int hibmc_dp_link_training_cr(struct hibmc_dp_dev *dp)
   174	{
   175		u8 lane_status[DP_LINK_STATUS_SIZE] = {0};
   176		bool level_changed;
   177		u32 voltage_tries;
   178		u32 cr_tries;
   179		int ret;
   180	
   181		/*
   182		 * DP 1.4 spec define 10 for maxtries value, for pre DP 1.4 version set a limit of 80
   183		 * (4 voltage levels x 4 preemphasis levels x 5 identical voltage retries)
   184		 */
   185	
   186		voltage_tries = 1;
   187		for (cr_tries = 0; cr_tries < 80; cr_tries++) {
 > 188			drm_dp_link_train_clock_recovery_delay(&dp->aux, dp->dpcd);
   189	
 > 190			ret = drm_dp_dpcd_read_link_status(&dp->aux, lane_status);
   191			if (ret != DP_LINK_STATUS_SIZE) {
   192				drm_err(dp->dev, "Get lane status failed\n");
   193				return ret;
   194			}
   195	
 > 196			if (drm_dp_clock_recovery_ok(lane_status, dp->link.cap.lanes)) {
   197				drm_dbg_dp(dp->dev, "dp link training cr done\n");
   198				dp->link.status.clock_recovered = true;
   199				return 0;
   200			}
   201	
   202			if (voltage_tries == 5) {
   203				drm_dbg_dp(dp->dev, "same voltage tries 5 times\n");
   204				dp->link.status.clock_recovered = false;
   205				return 0;
   206			}
   207	
   208			level_changed = hibmc_dp_link_get_adjust_train(dp, lane_status);
   209			ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, dp->link.train_set,
   210						dp->link.cap.lanes);
   211			if (ret != dp->link.cap.lanes) {
   212				drm_dbg_dp(dp->dev, "Update link training failed\n");
   213				return ret >= 0 ? -EIO : ret;
   214			}
   215	
   216			voltage_tries = level_changed ? 1 : voltage_tries + 1;
   217		}
   218	
   219		drm_err(dp->dev, "dp link training clock recovery 80 times failed\n");
   220		dp->link.status.clock_recovered = false;
   221	
   222		return 0;
   223	}
   224	
   225	static int hibmc_dp_link_training_channel_eq(struct hibmc_dp_dev *dp)
   226	{
   227		u8 lane_status[DP_LINK_STATUS_SIZE] = {0};
   228		u8 eq_tries;
   229		int ret;
   230	
   231		ret = hibmc_dp_link_set_pattern(dp, DP_TRAINING_PATTERN_2);
   232		if (ret)
   233			return ret;
   234	
   235		for (eq_tries = 0; eq_tries < HIBMC_EQ_MAX_RETRY; eq_tries++) {
 > 236			drm_dp_link_train_channel_eq_delay(&dp->aux, dp->dpcd);
   237	
   238			ret = drm_dp_dpcd_read_link_status(&dp->aux, lane_status);
   239			if (ret != DP_LINK_STATUS_SIZE) {
   240				drm_err(dp->dev, "get lane status failed\n");
   241				break;
   242			}
   243	
 > 244			if (!drm_dp_clock_recovery_ok(lane_status, dp->link.cap.lanes)) {
   245				drm_dbg_dp(dp->dev, "clock recovery check failed\n");
   246				drm_dbg_dp(dp->dev, "cannot continue channel equalization\n");
   247				dp->link.status.clock_recovered = false;
   248				break;
   249			}
   250	
 > 251			if (drm_dp_channel_eq_ok(lane_status, dp->link.cap.lanes)) {
   252				dp->link.status.channel_equalized = true;
   253				drm_dbg_dp(dp->dev, "dp link training eq done\n");
   254				break;
   255			}
   256	
   257			hibmc_dp_link_get_adjust_train(dp, lane_status);
   258			ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
   259						dp->link.train_set, dp->link.cap.lanes);
   260			if (ret != dp->link.cap.lanes) {
   261				drm_dbg_dp(dp->dev, "Update link training failed\n");
   262				ret = (ret >= 0) ? -EIO : ret;
   263				break;
   264			}
   265		}
   266	
   267		if (eq_tries == HIBMC_EQ_MAX_RETRY)
   268			drm_err(dp->dev, "channel equalization failed %u times\n", eq_tries);
   269	
   270		hibmc_dp_link_set_pattern(dp, DP_TRAINING_PATTERN_DISABLE);
   271	
   272		return ret < 0 ? ret : 0;
   273	}
   274	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ