All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:312:6: warning: no previous prototype for 'optc2_align_vblanks'
Date: Tue, 07 Dec 2021 07:17:26 +0800	[thread overview]
Message-ID: <202112070707.FwbdQm85-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 16444 bytes --]

Hi Vladimir,

FYI, the error/warning still remains.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   f80ef9e49fdfbfbc4197711230098b90e6b05a7e
commit: 77a2b7265f20ee827e527eaa6f82b87e88388947 drm/amd/display: Synchronize displays with different timings
date:   10 months ago
config: i386-buildonly-randconfig-r002-20211205 (https://download.01.org/0day-ci/archive/20211207/202112070707.FwbdQm85-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=77a2b7265f20ee827e527eaa6f82b87e88388947
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout 77a2b7265f20ee827e527eaa6f82b87e88388947
        # save the config file to linux build tree
        mkdir build_dir
        make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/gpu/drm/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:80:6: warning: no previous prototype for 'optc2_set_timing_db_mode' [-Wmissing-prototypes]
      80 | void optc2_set_timing_db_mode(struct timing_generator *optc, bool enable)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:114:6: warning: no previous prototype for 'optc2_use_gsl_as_master_update_lock' [-Wmissing-prototypes]
     114 | void optc2_use_gsl_as_master_update_lock(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:124:6: warning: no previous prototype for 'optc2_set_gsl_window' [-Wmissing-prototypes]
     124 | void optc2_set_gsl_window(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:142:6: warning: no previous prototype for 'optc2_set_vupdate_keepout' [-Wmissing-prototypes]
     142 | void optc2_set_vupdate_keepout(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:176:6: warning: no previous prototype for 'optc2_set_dsc_encoder_frame_start' [-Wmissing-prototypes]
     176 | void optc2_set_dsc_encoder_frame_start(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:299:6: warning: no previous prototype for 'optc2_set_dwb_source' [-Wmissing-prototypes]
     299 | void optc2_set_dwb_source(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:312:6: warning: no previous prototype for 'optc2_align_vblanks' [-Wmissing-prototypes]
     312 | void optc2_align_vblanks(
         |      ^~~~~~~~~~~~~~~~~~~
--
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:74:6: warning: no previous prototype for 'print_microsec' [-Wmissing-prototypes]
      74 | void print_microsec(struct dc_context *dc_ctx,
         |      ^~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:129:6: warning: no previous prototype for 'dcn10_log_hubbub_state' [-Wmissing-prototypes]
     129 | void dcn10_log_hubbub_state(struct dc *dc, struct dc_log_buffer_ctx *log_ctx)
         |      ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1854:10: warning: no previous prototype for 'reduceSizeAndFraction' [-Wmissing-prototypes]
    1854 | uint64_t reduceSizeAndFraction(
         |          ^~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1900:6: warning: no previous prototype for 'is_low_refresh_rate' [-Wmissing-prototypes]
    1900 | bool is_low_refresh_rate(struct pipe_ctx *pipe)
         |      ^~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1909:9: warning: no previous prototype for 'get_clock_divider' [-Wmissing-prototypes]
    1909 | uint8_t get_clock_divider(struct pipe_ctx *pipe, bool account_low_refresh_rate)
         |         ^~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1929:5: warning: no previous prototype for 'dcn10_align_pixel_clocks' [-Wmissing-prototypes]
    1929 | int dcn10_align_pixel_clocks(
         |     ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c: In function 'dcn10_align_pixel_clocks':
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1944:7: warning: variable 'clamshell_closed' set but not used [-Wunused-but-set-variable]
    1944 |  bool clamshell_closed = false;
         |       ^~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c: At top level:
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:2344:6: warning: no previous prototype for 'dcn10_program_pte_vm' [-Wmissing-prototypes]
    2344 | void dcn10_program_pte_vm(struct dce_hwseq *hws, struct hubp *hubp)
         |      ^~~~~~~~~~~~~~~~~~~~


vim +/optc2_align_vblanks +312 drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c

   136	
   137	/**
   138	 * Vupdate keepout can be set to a window to block the update lock for that pipe from changing.
   139	 * Start offset begins with vstartup and goes for x number of clocks,
   140	 * end offset starts from end of vupdate to x number of clocks.
   141	 */
 > 142	void optc2_set_vupdate_keepout(struct timing_generator *optc,
   143			   const struct vupdate_keepout_params *params)
   144	{
   145		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   146	
   147		REG_SET_3(OTG_VUPDATE_KEEPOUT, 0,
   148			MASTER_UPDATE_LOCK_VUPDATE_KEEPOUT_START_OFFSET, params->start_offset,
   149			MASTER_UPDATE_LOCK_VUPDATE_KEEPOUT_END_OFFSET, params->end_offset,
   150			OTG_MASTER_UPDATE_LOCK_VUPDATE_KEEPOUT_EN, params->enable);
   151	}
   152	
   153	void optc2_set_gsl_source_select(
   154			struct timing_generator *optc,
   155			int group_idx,
   156			uint32_t gsl_ready_signal)
   157	{
   158		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   159	
   160		switch (group_idx) {
   161		case 1:
   162			REG_UPDATE(GSL_SOURCE_SELECT, GSL0_READY_SOURCE_SEL, gsl_ready_signal);
   163			break;
   164		case 2:
   165			REG_UPDATE(GSL_SOURCE_SELECT, GSL1_READY_SOURCE_SEL, gsl_ready_signal);
   166			break;
   167		case 3:
   168			REG_UPDATE(GSL_SOURCE_SELECT, GSL2_READY_SOURCE_SEL, gsl_ready_signal);
   169			break;
   170		default:
   171			break;
   172		}
   173	}
   174	
   175	/* DSC encoder frame start controls: x = h position, line_num = # of lines from vstartup */
   176	void optc2_set_dsc_encoder_frame_start(struct timing_generator *optc,
   177						int x_position,
   178						int line_num)
   179	{
   180		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   181	
   182		REG_SET_2(OTG_DSC_START_POSITION, 0,
   183				OTG_DSC_START_POSITION_X, x_position,
   184				OTG_DSC_START_POSITION_LINE_NUM, line_num);
   185	}
   186	
   187	/* Set DSC-related configuration.
   188	 *   dsc_mode: 0 disables DSC, other values enable DSC in specified format
   189	 *   sc_bytes_per_pixel: Bytes per pixel in u3.28 format
   190	 *   dsc_slice_width: Slice width in pixels
   191	 */
   192	void optc2_set_dsc_config(struct timing_generator *optc,
   193						enum optc_dsc_mode dsc_mode,
   194						uint32_t dsc_bytes_per_pixel,
   195						uint32_t dsc_slice_width)
   196	{
   197		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   198	
   199		REG_UPDATE(OPTC_DATA_FORMAT_CONTROL,
   200			OPTC_DSC_MODE, dsc_mode);
   201	
   202		REG_SET(OPTC_BYTES_PER_PIXEL, 0,
   203			OPTC_DSC_BYTES_PER_PIXEL, dsc_bytes_per_pixel);
   204	
   205		REG_UPDATE(OPTC_WIDTH_CONTROL,
   206			OPTC_DSC_SLICE_WIDTH, dsc_slice_width);
   207	}
   208	
   209	/*TEMP: Need to figure out inheritance model here.*/
   210	bool optc2_is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
   211	{
   212		return optc1_is_two_pixels_per_containter(timing);
   213	}
   214	
   215	void optc2_set_odm_bypass(struct timing_generator *optc,
   216			const struct dc_crtc_timing *dc_crtc_timing)
   217	{
   218		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   219		uint32_t h_div_2 = 0;
   220	
   221		REG_SET_3(OPTC_DATA_SOURCE_SELECT, 0,
   222				OPTC_NUM_OF_INPUT_SEGMENT, 0,
   223				OPTC_SEG0_SRC_SEL, optc->inst,
   224				OPTC_SEG1_SRC_SEL, 0xf);
   225		REG_WRITE(OTG_H_TIMING_CNTL, 0);
   226	
   227		h_div_2 = optc2_is_two_pixels_per_containter(dc_crtc_timing);
   228		REG_UPDATE(OTG_H_TIMING_CNTL,
   229				OTG_H_TIMING_DIV_BY2, h_div_2);
   230		REG_SET(OPTC_MEMORY_CONFIG, 0,
   231				OPTC_MEM_SEL, 0);
   232		optc1->opp_count = 1;
   233	}
   234	
   235	void optc2_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_cnt,
   236			struct dc_crtc_timing *timing)
   237	{
   238		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   239		int mpcc_hactive = (timing->h_addressable + timing->h_border_left + timing->h_border_right)
   240				/ opp_cnt;
   241		uint32_t memory_mask;
   242	
   243		ASSERT(opp_cnt == 2);
   244	
   245		/* TODO: In pseudocode but does not affect maximus, delete comment if we dont need on asic
   246		 * REG_SET(OTG_GLOBAL_CONTROL2, 0, GLOBAL_UPDATE_LOCK_EN, 1);
   247		 * Program OTG register MASTER_UPDATE_LOCK_DB_X/Y to the position before DP frame start
   248		 * REG_SET_2(OTG_GLOBAL_CONTROL1, 0,
   249		 *		MASTER_UPDATE_LOCK_DB_X, 160,
   250		 *		MASTER_UPDATE_LOCK_DB_Y, 240);
   251		 */
   252	
   253		/* 2 pieces of memory required for up to 5120 displays, 4 for up to 8192,
   254		 * however, for ODM combine we can simplify by always using 4.
   255		 * To make sure there's no overlap, each instance "reserves" 2 memories and
   256		 * they are uniquely combined here.
   257		 */
   258		memory_mask = 0x3 << (opp_id[0] * 2) | 0x3 << (opp_id[1] * 2);
   259	
   260		if (REG(OPTC_MEMORY_CONFIG))
   261			REG_SET(OPTC_MEMORY_CONFIG, 0,
   262				OPTC_MEM_SEL, memory_mask);
   263	
   264		REG_SET_3(OPTC_DATA_SOURCE_SELECT, 0,
   265				OPTC_NUM_OF_INPUT_SEGMENT, 1,
   266				OPTC_SEG0_SRC_SEL, opp_id[0],
   267				OPTC_SEG1_SRC_SEL, opp_id[1]);
   268	
   269		REG_UPDATE(OPTC_WIDTH_CONTROL,
   270				OPTC_SEGMENT_WIDTH, mpcc_hactive);
   271	
   272		REG_SET(OTG_H_TIMING_CNTL, 0, OTG_H_TIMING_DIV_BY2, 1);
   273		optc1->opp_count = opp_cnt;
   274	}
   275	
   276	void optc2_get_optc_source(struct timing_generator *optc,
   277			uint32_t *num_of_src_opp,
   278			uint32_t *src_opp_id_0,
   279			uint32_t *src_opp_id_1)
   280	{
   281		uint32_t num_of_input_segments;
   282		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   283	
   284		REG_GET_3(OPTC_DATA_SOURCE_SELECT,
   285				OPTC_NUM_OF_INPUT_SEGMENT, &num_of_input_segments,
   286				OPTC_SEG0_SRC_SEL, src_opp_id_0,
   287				OPTC_SEG1_SRC_SEL, src_opp_id_1);
   288	
   289		if (num_of_input_segments == 1)
   290			*num_of_src_opp = 2;
   291		else
   292			*num_of_src_opp = 1;
   293	
   294		/* Work around VBIOS not updating OPTC_NUM_OF_INPUT_SEGMENT */
   295		if (*src_opp_id_1 == 0xf)
   296			*num_of_src_opp = 1;
   297	}
   298	
   299	void optc2_set_dwb_source(struct timing_generator *optc,
   300			uint32_t dwb_pipe_inst)
   301	{
   302		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   303	
   304		if (dwb_pipe_inst == 0)
   305			REG_UPDATE(DWB_SOURCE_SELECT,
   306					OPTC_DWB0_SOURCE_SELECT, optc->inst);
   307		else if (dwb_pipe_inst == 1)
   308			REG_UPDATE(DWB_SOURCE_SELECT,
   309					OPTC_DWB1_SOURCE_SELECT, optc->inst);
   310	}
   311	
 > 312	void optc2_align_vblanks(
   313		struct timing_generator *optc_master,
   314		struct timing_generator *optc_slave,
   315		uint32_t master_pixel_clock_100Hz,
   316		uint32_t slave_pixel_clock_100Hz,
   317		uint8_t master_clock_divider,
   318		uint8_t slave_clock_divider)
   319	{
   320		/* accessing slave OTG registers */
   321		struct optc *optc1 = DCN10TG_FROM_TG(optc_slave);
   322	
   323		uint32_t master_v_active = 0;
   324		uint32_t master_h_total = 0;
   325		uint32_t slave_h_total = 0;
   326		uint64_t L, XY, p = 10000;
   327		uint32_t X, Y;
   328		uint32_t master_update_lock;
   329	
   330		/* disable slave OTG */
   331		REG_UPDATE(OTG_CONTROL, OTG_MASTER_EN, 0);
   332		/* wait until disabled */
   333		REG_WAIT(OTG_CONTROL,
   334				 OTG_CURRENT_MASTER_EN_STATE,
   335				 0, 10, 5000);
   336	
   337		REG_GET(OTG_H_TOTAL, OTG_H_TOTAL, &slave_h_total);
   338	
   339		/* assign slave OTG to be controlled by master update lock */
   340		REG_SET(OTG_GLOBAL_CONTROL0, 0,
   341				OTG_MASTER_UPDATE_LOCK_SEL, optc_master->inst);
   342	
   343		/* accessing master OTG registers */
   344		optc1 = DCN10TG_FROM_TG(optc_master);
   345	
   346		/* saving update lock state, not sure if it's needed */
   347		REG_GET(OTG_MASTER_UPDATE_LOCK,
   348				OTG_MASTER_UPDATE_LOCK, &master_update_lock);
   349		/* unlocking master OTG */
   350		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   351				OTG_MASTER_UPDATE_LOCK, 0);
   352	
   353		REG_GET(OTG_V_BLANK_START_END,
   354				OTG_V_BLANK_START, &master_v_active);
   355		REG_GET(OTG_H_TOTAL, OTG_H_TOTAL, &master_h_total);
   356	
   357		/* calculate when to enable slave OTG */
   358		L = p * slave_h_total * master_pixel_clock_100Hz /
   359			master_h_total / slave_pixel_clock_100Hz;
   360		XY = L / p;
   361		Y = master_v_active - XY - 1;
   362		X = ((XY + 1) * p - L) * master_h_total / master_clock_divider / p;
   363	
   364		/*
   365		 * set master OTG to unlock when V/H
   366		 * counters reach calculated values
   367		 */
   368		REG_UPDATE(OTG_GLOBAL_CONTROL1,
   369				   MASTER_UPDATE_LOCK_DB_EN, 1);
   370		REG_UPDATE_2(OTG_GLOBAL_CONTROL1,
   371					 MASTER_UPDATE_LOCK_DB_X,
   372					 X,
   373					 MASTER_UPDATE_LOCK_DB_Y,
   374					 Y);
   375	
   376		/* lock master OTG */
   377		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   378				OTG_MASTER_UPDATE_LOCK, 1);
   379		REG_WAIT(OTG_MASTER_UPDATE_LOCK,
   380				 UPDATE_LOCK_STATUS, 1, 1, 10);
   381	
   382		/* accessing slave OTG registers */
   383		optc1 = DCN10TG_FROM_TG(optc_slave);
   384	
   385		/*
   386		 * enable slave OTG, the OTG is locked with
   387		 * master's update lock, so it will not run
   388		 */
   389		REG_UPDATE(OTG_CONTROL,
   390				   OTG_MASTER_EN, 1);
   391	
   392		/* accessing master OTG registers */
   393		optc1 = DCN10TG_FROM_TG(optc_master);
   394	
   395		/*
   396		 * unlock master OTG. When master H/V counters reach
   397		 * DB_XY point, slave OTG will start
   398		 */
   399		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   400				OTG_MASTER_UPDATE_LOCK, 0);
   401	
   402		/* accessing slave OTG registers */
   403		optc1 = DCN10TG_FROM_TG(optc_slave);
   404	
   405		/* wait for slave OTG to start running*/
   406		REG_WAIT(OTG_CONTROL,
   407				 OTG_CURRENT_MASTER_EN_STATE,
   408				 1, 10, 5000);
   409	
   410		/* accessing master OTG registers */
   411		optc1 = DCN10TG_FROM_TG(optc_master);
   412	
   413		/* disable the XY point*/
   414		REG_UPDATE(OTG_GLOBAL_CONTROL1,
   415				   MASTER_UPDATE_LOCK_DB_EN, 0);
   416		REG_UPDATE_2(OTG_GLOBAL_CONTROL1,
   417					 MASTER_UPDATE_LOCK_DB_X,
   418					 0,
   419					 MASTER_UPDATE_LOCK_DB_Y,
   420					 0);
   421	
   422		/*restore master update lock*/
   423		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   424				OTG_MASTER_UPDATE_LOCK, master_update_lock);
   425	
   426		/* accessing slave OTG registers */
   427		optc1 = DCN10TG_FROM_TG(optc_slave);
   428		/* restore slave to be controlled by it's own */
   429		REG_SET(OTG_GLOBAL_CONTROL0, 0,
   430				OTG_MASTER_UPDATE_LOCK_SEL, optc_slave->inst);
   431	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Vladimir Stempen <vladimir.stempen@amd.com>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org,
	Alex Deucher <alexander.deucher@amd.com>
Subject: drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:312:6: warning: no previous prototype for 'optc2_align_vblanks'
Date: Tue, 7 Dec 2021 07:17:26 +0800	[thread overview]
Message-ID: <202112070707.FwbdQm85-lkp@intel.com> (raw)

Hi Vladimir,

FYI, the error/warning still remains.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   f80ef9e49fdfbfbc4197711230098b90e6b05a7e
commit: 77a2b7265f20ee827e527eaa6f82b87e88388947 drm/amd/display: Synchronize displays with different timings
date:   10 months ago
config: i386-buildonly-randconfig-r002-20211205 (https://download.01.org/0day-ci/archive/20211207/202112070707.FwbdQm85-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=77a2b7265f20ee827e527eaa6f82b87e88388947
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout 77a2b7265f20ee827e527eaa6f82b87e88388947
        # save the config file to linux build tree
        mkdir build_dir
        make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/gpu/drm/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:80:6: warning: no previous prototype for 'optc2_set_timing_db_mode' [-Wmissing-prototypes]
      80 | void optc2_set_timing_db_mode(struct timing_generator *optc, bool enable)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:114:6: warning: no previous prototype for 'optc2_use_gsl_as_master_update_lock' [-Wmissing-prototypes]
     114 | void optc2_use_gsl_as_master_update_lock(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:124:6: warning: no previous prototype for 'optc2_set_gsl_window' [-Wmissing-prototypes]
     124 | void optc2_set_gsl_window(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:142:6: warning: no previous prototype for 'optc2_set_vupdate_keepout' [-Wmissing-prototypes]
     142 | void optc2_set_vupdate_keepout(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:176:6: warning: no previous prototype for 'optc2_set_dsc_encoder_frame_start' [-Wmissing-prototypes]
     176 | void optc2_set_dsc_encoder_frame_start(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:299:6: warning: no previous prototype for 'optc2_set_dwb_source' [-Wmissing-prototypes]
     299 | void optc2_set_dwb_source(struct timing_generator *optc,
         |      ^~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:312:6: warning: no previous prototype for 'optc2_align_vblanks' [-Wmissing-prototypes]
     312 | void optc2_align_vblanks(
         |      ^~~~~~~~~~~~~~~~~~~
--
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:74:6: warning: no previous prototype for 'print_microsec' [-Wmissing-prototypes]
      74 | void print_microsec(struct dc_context *dc_ctx,
         |      ^~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:129:6: warning: no previous prototype for 'dcn10_log_hubbub_state' [-Wmissing-prototypes]
     129 | void dcn10_log_hubbub_state(struct dc *dc, struct dc_log_buffer_ctx *log_ctx)
         |      ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1854:10: warning: no previous prototype for 'reduceSizeAndFraction' [-Wmissing-prototypes]
    1854 | uint64_t reduceSizeAndFraction(
         |          ^~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1900:6: warning: no previous prototype for 'is_low_refresh_rate' [-Wmissing-prototypes]
    1900 | bool is_low_refresh_rate(struct pipe_ctx *pipe)
         |      ^~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1909:9: warning: no previous prototype for 'get_clock_divider' [-Wmissing-prototypes]
    1909 | uint8_t get_clock_divider(struct pipe_ctx *pipe, bool account_low_refresh_rate)
         |         ^~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1929:5: warning: no previous prototype for 'dcn10_align_pixel_clocks' [-Wmissing-prototypes]
    1929 | int dcn10_align_pixel_clocks(
         |     ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c: In function 'dcn10_align_pixel_clocks':
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:1944:7: warning: variable 'clamshell_closed' set but not used [-Wunused-but-set-variable]
    1944 |  bool clamshell_closed = false;
         |       ^~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c: At top level:
   drivers/gpu/drm/amd/amdgpu/../display/dc/dcn10/dcn10_hw_sequencer.c:2344:6: warning: no previous prototype for 'dcn10_program_pte_vm' [-Wmissing-prototypes]
    2344 | void dcn10_program_pte_vm(struct dce_hwseq *hws, struct hubp *hubp)
         |      ^~~~~~~~~~~~~~~~~~~~


vim +/optc2_align_vblanks +312 drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c

   136	
   137	/**
   138	 * Vupdate keepout can be set to a window to block the update lock for that pipe from changing.
   139	 * Start offset begins with vstartup and goes for x number of clocks,
   140	 * end offset starts from end of vupdate to x number of clocks.
   141	 */
 > 142	void optc2_set_vupdate_keepout(struct timing_generator *optc,
   143			   const struct vupdate_keepout_params *params)
   144	{
   145		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   146	
   147		REG_SET_3(OTG_VUPDATE_KEEPOUT, 0,
   148			MASTER_UPDATE_LOCK_VUPDATE_KEEPOUT_START_OFFSET, params->start_offset,
   149			MASTER_UPDATE_LOCK_VUPDATE_KEEPOUT_END_OFFSET, params->end_offset,
   150			OTG_MASTER_UPDATE_LOCK_VUPDATE_KEEPOUT_EN, params->enable);
   151	}
   152	
   153	void optc2_set_gsl_source_select(
   154			struct timing_generator *optc,
   155			int group_idx,
   156			uint32_t gsl_ready_signal)
   157	{
   158		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   159	
   160		switch (group_idx) {
   161		case 1:
   162			REG_UPDATE(GSL_SOURCE_SELECT, GSL0_READY_SOURCE_SEL, gsl_ready_signal);
   163			break;
   164		case 2:
   165			REG_UPDATE(GSL_SOURCE_SELECT, GSL1_READY_SOURCE_SEL, gsl_ready_signal);
   166			break;
   167		case 3:
   168			REG_UPDATE(GSL_SOURCE_SELECT, GSL2_READY_SOURCE_SEL, gsl_ready_signal);
   169			break;
   170		default:
   171			break;
   172		}
   173	}
   174	
   175	/* DSC encoder frame start controls: x = h position, line_num = # of lines from vstartup */
   176	void optc2_set_dsc_encoder_frame_start(struct timing_generator *optc,
   177						int x_position,
   178						int line_num)
   179	{
   180		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   181	
   182		REG_SET_2(OTG_DSC_START_POSITION, 0,
   183				OTG_DSC_START_POSITION_X, x_position,
   184				OTG_DSC_START_POSITION_LINE_NUM, line_num);
   185	}
   186	
   187	/* Set DSC-related configuration.
   188	 *   dsc_mode: 0 disables DSC, other values enable DSC in specified format
   189	 *   sc_bytes_per_pixel: Bytes per pixel in u3.28 format
   190	 *   dsc_slice_width: Slice width in pixels
   191	 */
   192	void optc2_set_dsc_config(struct timing_generator *optc,
   193						enum optc_dsc_mode dsc_mode,
   194						uint32_t dsc_bytes_per_pixel,
   195						uint32_t dsc_slice_width)
   196	{
   197		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   198	
   199		REG_UPDATE(OPTC_DATA_FORMAT_CONTROL,
   200			OPTC_DSC_MODE, dsc_mode);
   201	
   202		REG_SET(OPTC_BYTES_PER_PIXEL, 0,
   203			OPTC_DSC_BYTES_PER_PIXEL, dsc_bytes_per_pixel);
   204	
   205		REG_UPDATE(OPTC_WIDTH_CONTROL,
   206			OPTC_DSC_SLICE_WIDTH, dsc_slice_width);
   207	}
   208	
   209	/*TEMP: Need to figure out inheritance model here.*/
   210	bool optc2_is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
   211	{
   212		return optc1_is_two_pixels_per_containter(timing);
   213	}
   214	
   215	void optc2_set_odm_bypass(struct timing_generator *optc,
   216			const struct dc_crtc_timing *dc_crtc_timing)
   217	{
   218		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   219		uint32_t h_div_2 = 0;
   220	
   221		REG_SET_3(OPTC_DATA_SOURCE_SELECT, 0,
   222				OPTC_NUM_OF_INPUT_SEGMENT, 0,
   223				OPTC_SEG0_SRC_SEL, optc->inst,
   224				OPTC_SEG1_SRC_SEL, 0xf);
   225		REG_WRITE(OTG_H_TIMING_CNTL, 0);
   226	
   227		h_div_2 = optc2_is_two_pixels_per_containter(dc_crtc_timing);
   228		REG_UPDATE(OTG_H_TIMING_CNTL,
   229				OTG_H_TIMING_DIV_BY2, h_div_2);
   230		REG_SET(OPTC_MEMORY_CONFIG, 0,
   231				OPTC_MEM_SEL, 0);
   232		optc1->opp_count = 1;
   233	}
   234	
   235	void optc2_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_cnt,
   236			struct dc_crtc_timing *timing)
   237	{
   238		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   239		int mpcc_hactive = (timing->h_addressable + timing->h_border_left + timing->h_border_right)
   240				/ opp_cnt;
   241		uint32_t memory_mask;
   242	
   243		ASSERT(opp_cnt == 2);
   244	
   245		/* TODO: In pseudocode but does not affect maximus, delete comment if we dont need on asic
   246		 * REG_SET(OTG_GLOBAL_CONTROL2, 0, GLOBAL_UPDATE_LOCK_EN, 1);
   247		 * Program OTG register MASTER_UPDATE_LOCK_DB_X/Y to the position before DP frame start
   248		 * REG_SET_2(OTG_GLOBAL_CONTROL1, 0,
   249		 *		MASTER_UPDATE_LOCK_DB_X, 160,
   250		 *		MASTER_UPDATE_LOCK_DB_Y, 240);
   251		 */
   252	
   253		/* 2 pieces of memory required for up to 5120 displays, 4 for up to 8192,
   254		 * however, for ODM combine we can simplify by always using 4.
   255		 * To make sure there's no overlap, each instance "reserves" 2 memories and
   256		 * they are uniquely combined here.
   257		 */
   258		memory_mask = 0x3 << (opp_id[0] * 2) | 0x3 << (opp_id[1] * 2);
   259	
   260		if (REG(OPTC_MEMORY_CONFIG))
   261			REG_SET(OPTC_MEMORY_CONFIG, 0,
   262				OPTC_MEM_SEL, memory_mask);
   263	
   264		REG_SET_3(OPTC_DATA_SOURCE_SELECT, 0,
   265				OPTC_NUM_OF_INPUT_SEGMENT, 1,
   266				OPTC_SEG0_SRC_SEL, opp_id[0],
   267				OPTC_SEG1_SRC_SEL, opp_id[1]);
   268	
   269		REG_UPDATE(OPTC_WIDTH_CONTROL,
   270				OPTC_SEGMENT_WIDTH, mpcc_hactive);
   271	
   272		REG_SET(OTG_H_TIMING_CNTL, 0, OTG_H_TIMING_DIV_BY2, 1);
   273		optc1->opp_count = opp_cnt;
   274	}
   275	
   276	void optc2_get_optc_source(struct timing_generator *optc,
   277			uint32_t *num_of_src_opp,
   278			uint32_t *src_opp_id_0,
   279			uint32_t *src_opp_id_1)
   280	{
   281		uint32_t num_of_input_segments;
   282		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   283	
   284		REG_GET_3(OPTC_DATA_SOURCE_SELECT,
   285				OPTC_NUM_OF_INPUT_SEGMENT, &num_of_input_segments,
   286				OPTC_SEG0_SRC_SEL, src_opp_id_0,
   287				OPTC_SEG1_SRC_SEL, src_opp_id_1);
   288	
   289		if (num_of_input_segments == 1)
   290			*num_of_src_opp = 2;
   291		else
   292			*num_of_src_opp = 1;
   293	
   294		/* Work around VBIOS not updating OPTC_NUM_OF_INPUT_SEGMENT */
   295		if (*src_opp_id_1 == 0xf)
   296			*num_of_src_opp = 1;
   297	}
   298	
   299	void optc2_set_dwb_source(struct timing_generator *optc,
   300			uint32_t dwb_pipe_inst)
   301	{
   302		struct optc *optc1 = DCN10TG_FROM_TG(optc);
   303	
   304		if (dwb_pipe_inst == 0)
   305			REG_UPDATE(DWB_SOURCE_SELECT,
   306					OPTC_DWB0_SOURCE_SELECT, optc->inst);
   307		else if (dwb_pipe_inst == 1)
   308			REG_UPDATE(DWB_SOURCE_SELECT,
   309					OPTC_DWB1_SOURCE_SELECT, optc->inst);
   310	}
   311	
 > 312	void optc2_align_vblanks(
   313		struct timing_generator *optc_master,
   314		struct timing_generator *optc_slave,
   315		uint32_t master_pixel_clock_100Hz,
   316		uint32_t slave_pixel_clock_100Hz,
   317		uint8_t master_clock_divider,
   318		uint8_t slave_clock_divider)
   319	{
   320		/* accessing slave OTG registers */
   321		struct optc *optc1 = DCN10TG_FROM_TG(optc_slave);
   322	
   323		uint32_t master_v_active = 0;
   324		uint32_t master_h_total = 0;
   325		uint32_t slave_h_total = 0;
   326		uint64_t L, XY, p = 10000;
   327		uint32_t X, Y;
   328		uint32_t master_update_lock;
   329	
   330		/* disable slave OTG */
   331		REG_UPDATE(OTG_CONTROL, OTG_MASTER_EN, 0);
   332		/* wait until disabled */
   333		REG_WAIT(OTG_CONTROL,
   334				 OTG_CURRENT_MASTER_EN_STATE,
   335				 0, 10, 5000);
   336	
   337		REG_GET(OTG_H_TOTAL, OTG_H_TOTAL, &slave_h_total);
   338	
   339		/* assign slave OTG to be controlled by master update lock */
   340		REG_SET(OTG_GLOBAL_CONTROL0, 0,
   341				OTG_MASTER_UPDATE_LOCK_SEL, optc_master->inst);
   342	
   343		/* accessing master OTG registers */
   344		optc1 = DCN10TG_FROM_TG(optc_master);
   345	
   346		/* saving update lock state, not sure if it's needed */
   347		REG_GET(OTG_MASTER_UPDATE_LOCK,
   348				OTG_MASTER_UPDATE_LOCK, &master_update_lock);
   349		/* unlocking master OTG */
   350		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   351				OTG_MASTER_UPDATE_LOCK, 0);
   352	
   353		REG_GET(OTG_V_BLANK_START_END,
   354				OTG_V_BLANK_START, &master_v_active);
   355		REG_GET(OTG_H_TOTAL, OTG_H_TOTAL, &master_h_total);
   356	
   357		/* calculate when to enable slave OTG */
   358		L = p * slave_h_total * master_pixel_clock_100Hz /
   359			master_h_total / slave_pixel_clock_100Hz;
   360		XY = L / p;
   361		Y = master_v_active - XY - 1;
   362		X = ((XY + 1) * p - L) * master_h_total / master_clock_divider / p;
   363	
   364		/*
   365		 * set master OTG to unlock when V/H
   366		 * counters reach calculated values
   367		 */
   368		REG_UPDATE(OTG_GLOBAL_CONTROL1,
   369				   MASTER_UPDATE_LOCK_DB_EN, 1);
   370		REG_UPDATE_2(OTG_GLOBAL_CONTROL1,
   371					 MASTER_UPDATE_LOCK_DB_X,
   372					 X,
   373					 MASTER_UPDATE_LOCK_DB_Y,
   374					 Y);
   375	
   376		/* lock master OTG */
   377		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   378				OTG_MASTER_UPDATE_LOCK, 1);
   379		REG_WAIT(OTG_MASTER_UPDATE_LOCK,
   380				 UPDATE_LOCK_STATUS, 1, 1, 10);
   381	
   382		/* accessing slave OTG registers */
   383		optc1 = DCN10TG_FROM_TG(optc_slave);
   384	
   385		/*
   386		 * enable slave OTG, the OTG is locked with
   387		 * master's update lock, so it will not run
   388		 */
   389		REG_UPDATE(OTG_CONTROL,
   390				   OTG_MASTER_EN, 1);
   391	
   392		/* accessing master OTG registers */
   393		optc1 = DCN10TG_FROM_TG(optc_master);
   394	
   395		/*
   396		 * unlock master OTG. When master H/V counters reach
   397		 * DB_XY point, slave OTG will start
   398		 */
   399		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   400				OTG_MASTER_UPDATE_LOCK, 0);
   401	
   402		/* accessing slave OTG registers */
   403		optc1 = DCN10TG_FROM_TG(optc_slave);
   404	
   405		/* wait for slave OTG to start running*/
   406		REG_WAIT(OTG_CONTROL,
   407				 OTG_CURRENT_MASTER_EN_STATE,
   408				 1, 10, 5000);
   409	
   410		/* accessing master OTG registers */
   411		optc1 = DCN10TG_FROM_TG(optc_master);
   412	
   413		/* disable the XY point*/
   414		REG_UPDATE(OTG_GLOBAL_CONTROL1,
   415				   MASTER_UPDATE_LOCK_DB_EN, 0);
   416		REG_UPDATE_2(OTG_GLOBAL_CONTROL1,
   417					 MASTER_UPDATE_LOCK_DB_X,
   418					 0,
   419					 MASTER_UPDATE_LOCK_DB_Y,
   420					 0);
   421	
   422		/*restore master update lock*/
   423		REG_SET(OTG_MASTER_UPDATE_LOCK, 0,
   424				OTG_MASTER_UPDATE_LOCK, master_update_lock);
   425	
   426		/* accessing slave OTG registers */
   427		optc1 = DCN10TG_FROM_TG(optc_slave);
   428		/* restore slave to be controlled by it's own */
   429		REG_SET(OTG_GLOBAL_CONTROL0, 0,
   430				OTG_MASTER_UPDATE_LOCK_SEL, optc_slave->inst);
   431	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

             reply	other threads:[~2021-12-06 23:17 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-06 23:17 kernel test robot [this message]
2021-12-06 23:17 ` drivers/gpu/drm/amd/amdgpu/../display/dc/dcn20/dcn20_optc.c:312:6: warning: no previous prototype for 'optc2_align_vblanks' kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2021-11-21  4:44 kernel test robot
2021-11-21  4:44 ` kernel test robot
2021-06-26 20:34 kernel test robot
2021-06-26 20:34 ` kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202112070707.FwbdQm85-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild-all@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.