All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [cxl:preview 63/78] drivers/cxl/region.c:698:7: warning: Branch condition evaluates to a garbage value [clang-analyzer-core.uninitialized.Branch]
Date: Sun, 08 May 2022 07:17:26 +0800	[thread overview]
Message-ID: <202205080702.50dD2up2-lkp@intel.com> (raw)

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

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: Alison Schofield <alison.schofield@intel.com>
CC: Vishal Verma <vishal.l.verma@intel.com>
CC: Ira Weiny <ira.weiny@intel.com>
CC: Ben Widawsky <ben.widawsky@intel.com>
CC: Dan Williams <dan.j.williams@intel.com>
CC: linux-kernel(a)vger.kernel.org
TO: Ben Widawsky <ben.widawsky@intel.com>
CC: Dan Williams <dan.j.williams@intel.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git preview
head:   9b688fc651b9d2b633e8d959454670aba1c39162
commit: 968e6c3d87e25ab658488f054bf46392d360b5cd [63/78] cxl: Program decoders for regions
:::::: branch date: 2 months ago
:::::: commit date: 3 months ago
config: riscv-randconfig-c006-20220504 (https://download.01.org/0day-ci/archive/20220508/202205080702.50dD2up2-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 5e004fb787698440a387750db7f8028e7cb14cfc)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git/commit/?id=968e6c3d87e25ab658488f054bf46392d360b5cd
        git remote add cxl https://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git
        git fetch --no-tags cxl preview
        git checkout 968e6c3d87e25ab658488f054bf46392d360b5cd
        # save the config file
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer 

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


clang-analyzer warnings: (new ones prefixed by >>)
                                   ^
   drivers/cxl/region.c:507:5: note: Taking true branch
                                   if (port_grouping == -1)
                                   ^
   drivers/cxl/region.c:514:5: note: Taking false branch
                                   if ((idx & position_mask) != port_grouping) {
                                   ^
   drivers/cxl/region.c:520:10: note: 'state_update' is true
                                   if (!state_update)
                                        ^~~~~~~~~~~~
   drivers/cxl/region.c:520:5: note: Taking false branch
                                   if (!state_update)
                                   ^
   drivers/cxl/region.c:524:9: note: Assuming 'port_grouping' is < field 'nr_targets'
                                                     port_grouping >= cxld->nr_targets,
                                                     ^
   include/linux/dev_printk.h:274:12: note: expanded from macro 'dev_WARN_ONCE'
           WARN_ONCE(condition, "%s %s: " format, \
                     ^~~~~~~~~
   include/asm-generic/bug.h:150:18: note: expanded from macro 'WARN_ONCE'
           DO_ONCE_LITE_IF(condition, WARN, 1, format)
                           ^~~~~~~~~
   include/linux/once_lite.h:15:27: note: expanded from macro 'DO_ONCE_LITE_IF'
                   bool __ret_do_once = !!(condition);                     \
                                           ^~~~~~~~~
   drivers/cxl/region.c:523:9: note: '__ret_do_once' is false
                                   if (dev_WARN_ONCE(&cxld->dev,
                                       ^
   include/linux/dev_printk.h:274:2: note: expanded from macro 'dev_WARN_ONCE'
           WARN_ONCE(condition, "%s %s: " format, \
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/asm-generic/bug.h:150:2: note: expanded from macro 'WARN_ONCE'
           DO_ONCE_LITE_IF(condition, WARN, 1, format)
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/once_lite.h:17:16: note: expanded from macro 'DO_ONCE_LITE_IF'
                   if (unlikely(__ret_do_once && !__already_done)) {       \
                                ^~~~~~~~~~~~~
   include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                               ^
   drivers/cxl/region.c:523:9: note: Left side of '&&' is false
                                   if (dev_WARN_ONCE(&cxld->dev,
                                       ^
   include/linux/dev_printk.h:274:2: note: expanded from macro 'dev_WARN_ONCE'
           WARN_ONCE(condition, "%s %s: " format, \
           ^
   include/asm-generic/bug.h:150:2: note: expanded from macro 'WARN_ONCE'
           DO_ONCE_LITE_IF(condition, WARN, 1, format)
           ^
   include/linux/once_lite.h:17:30: note: expanded from macro 'DO_ONCE_LITE_IF'
                   if (unlikely(__ret_do_once && !__already_done)) {       \
                                              ^
   drivers/cxl/region.c:523:9: note: Taking false branch
                                   if (dev_WARN_ONCE(&cxld->dev,
                                       ^
   include/linux/dev_printk.h:274:2: note: expanded from macro 'dev_WARN_ONCE'
           WARN_ONCE(condition, "%s %s: " format, \
           ^
   include/asm-generic/bug.h:150:2: note: expanded from macro 'WARN_ONCE'
           DO_ONCE_LITE_IF(condition, WARN, 1, format)
           ^
   include/linux/once_lite.h:17:3: note: expanded from macro 'DO_ONCE_LITE_IF'
                   if (unlikely(__ret_do_once && !__already_done)) {       \
                   ^
   drivers/cxl/region.c:523:5: note: Taking false branch
                                   if (dev_WARN_ONCE(&cxld->dev,
                                   ^
   drivers/cxl/region.c:536:9: note: Assuming field 'depth' is not equal to 2
                                   if (ep->port->depth == 2)
                                       ^~~~~~~~~~~~~~~~~~~~
   drivers/cxl/region.c:536:5: note: Taking false branch
                                   if (ep->port->depth == 2)
                                   ^
   drivers/cxl/region.c:543:5: note: Loop condition is true.  Entering loop body
                                   list_for_each_entry(switch_cxld, &cxlr->staged_list, region_link) {
                                   ^
   include/linux/list.h:638:2: note: expanded from macro 'list_for_each_entry'
           for (pos = list_first_entry(head, typeof(*pos), member);        \
           ^
   drivers/cxl/region.c:544:10: note: Assuming the condition is true
                                           if (to_cxl_port(switch_cxld->dev.parent) == switch_port)
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/cxl/region.c:544:6: note: Taking true branch
                                           if (to_cxl_port(switch_cxld->dev.parent) == switch_port)
                                           ^
   drivers/cxl/region.c:543:5: note: Loop condition is false. Execution continues on line 548
                                   list_for_each_entry(switch_cxld, &cxlr->staged_list, region_link) {
                                   ^
   include/linux/list.h:638:2: note: expanded from macro 'list_for_each_entry'
           for (pos = list_first_entry(head, typeof(*pos), member);        \
           ^
   drivers/cxl/region.c:548:9: note: 'found' is true
                                   if (found) {
                                       ^~~~~
   drivers/cxl/region.c:548:5: note: Taking true branch
                                   if (found) {
                                   ^
   drivers/cxl/region.c:550:26: note: The expression is an uninitialized value. The computed value will also be garbage
                                           switch_cxld->target[target_ndx++] = target;
                                                               ^~~~~~~~~~
>> drivers/cxl/region.c:698:7: warning: Branch condition evaluates to a garbage value [clang-analyzer-core.uninitialized.Branch]
                   if (rc) {
                       ^~
   drivers/cxl/region.c:684:2: note: 'rc' declared without an initial value
           int rc;
           ^~~~~~
   drivers/cxl/region.c:686:2: note: Loop condition is false. Execution continues on line 697
           list_for_each_entry_safe(cxld, d, &cxlr->staged_list, region_link) {
           ^
   include/linux/list.h:725:2: note: expanded from macro 'list_for_each_entry_safe'
           for (pos = list_first_entry(head, typeof(*pos), member),        \
           ^
   drivers/cxl/region.c:697:2: note: Loop condition is true.  Entering loop body
           list_for_each_entry_safe(cxld, d, &cxlr->commit_list, region_link) {
           ^
   include/linux/list.h:725:2: note: expanded from macro 'list_for_each_entry_safe'
           for (pos = list_first_entry(head, typeof(*pos), member),        \
           ^
   drivers/cxl/region.c:698:7: note: Branch condition evaluates to a garbage value
                   if (rc) {
                       ^~
   drivers/cxl/region.c:704:6: warning: Branch condition evaluates to a garbage value [clang-analyzer-core.uninitialized.Branch]
           if (rc)
               ^~
   drivers/cxl/region.c:684:2: note: 'rc' declared without an initial value
           int rc;
           ^~~~~~
   drivers/cxl/region.c:686:2: note: Loop condition is false. Execution continues on line 697
           list_for_each_entry_safe(cxld, d, &cxlr->staged_list, region_link) {
           ^
   include/linux/list.h:725:2: note: expanded from macro 'list_for_each_entry_safe'
           for (pos = list_first_entry(head, typeof(*pos), member),        \
           ^
   drivers/cxl/region.c:697:2: note: Loop condition is false. Execution continues on line 704
           list_for_each_entry_safe(cxld, d, &cxlr->commit_list, region_link) {
           ^
   include/linux/list.h:725:2: note: expanded from macro 'list_for_each_entry_safe'
           for (pos = list_first_entry(head, typeof(*pos), member),        \
           ^
   drivers/cxl/region.c:704:6: note: Branch condition evaluates to a garbage value
           if (rc)
               ^~
   Suppressed 13 warnings (6 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   14 warnings generated.
   Suppressed 14 warnings (7 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   14 warnings generated.
   Suppressed 14 warnings (7 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   14 warnings generated.
   Suppressed 14 warnings (7 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   15 warnings generated.
   block/blk-mq-cpumap.c:21:33: warning: Division by zero [clang-analyzer-core.DivideZero]
           return qmap->queue_offset + (q % nr_queues);
                                          ^
   block/blk-mq-cpumap.c:38:2: note: 'nr_queues' initialized here
           unsigned int nr_queues = qmap->nr_queues;
           ^~~~~~~~~~~~~~~~~~~~~~
   block/blk-mq-cpumap.c:41:2: note: Assuming 'cpu' is >= 'nr_cpu_ids'
           for_each_possible_cpu(cpu)
           ^
   include/linux/cpumask.h:814:36: note: expanded from macro 'for_each_possible_cpu'
   #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cpumask.h:278:3: note: expanded from macro 'for_each_cpu'
                   (cpu) < nr_cpu_ids;)
                   ^~~~~~~~~~~~~~~~~~
   block/blk-mq-cpumap.c:41:2: note: Loop condition is false. Execution continues on line 48
           for_each_possible_cpu(cpu)
           ^
   include/linux/cpumask.h:814:36: note: expanded from macro 'for_each_possible_cpu'
   #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
                                      ^
   include/linux/cpumask.h:276:2: note: expanded from macro 'for_each_cpu'
           for ((cpu) = -1;                                \
           ^
   block/blk-mq-cpumap.c:48:2: note: Assuming 'cpu' is >= 'nr_cpu_ids'
           for_each_present_cpu(cpu) {
           ^
   include/linux/cpumask.h:816:36: note: expanded from macro 'for_each_present_cpu'
   #define for_each_present_cpu(cpu)  for_each_cpu((cpu), cpu_present_mask)
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cpumask.h:278:3: note: expanded from macro 'for_each_cpu'
                   (cpu) < nr_cpu_ids;)
                   ^~~~~~~~~~~~~~~~~~
   block/blk-mq-cpumap.c:48:2: note: Loop condition is false. Execution continues on line 54
           for_each_present_cpu(cpu) {
           ^
   include/linux/cpumask.h:816:36: note: expanded from macro 'for_each_present_cpu'
   #define for_each_present_cpu(cpu)  for_each_cpu((cpu), cpu_present_mask)
                                      ^
   include/linux/cpumask.h:276:2: note: expanded from macro 'for_each_cpu'
           for ((cpu) = -1;                                \
           ^
   block/blk-mq-cpumap.c:54:2: note: Assuming 'cpu' is < 'nr_cpu_ids'
           for_each_possible_cpu(cpu) {
           ^
   include/linux/cpumask.h:814:36: note: expanded from macro 'for_each_possible_cpu'
   #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)

vim +698 drivers/cxl/region.c

b15cb12c2369e0 Ben Widawsky 2022-02-11  413  
786e9e58377374 Ben Widawsky 2022-02-11  414  /**
786e9e58377374 Ben Widawsky 2022-02-11  415   * region_hb_rp_config_valid() - determine root port ordering is correct
786e9e58377374 Ben Widawsky 2022-02-11  416   * @cxlr: Region to validate
786e9e58377374 Ben Widawsky 2022-02-11  417   * @rootd: root decoder for this @cxlr
b15cb12c2369e0 Ben Widawsky 2022-02-11  418   * @state_update: Whether or not to update port state
786e9e58377374 Ben Widawsky 2022-02-11  419   *
786e9e58377374 Ben Widawsky 2022-02-11  420   * The algorithm is outlined in 2.13.15 "Verify HB root port configuration
786e9e58377374 Ben Widawsky 2022-02-11  421   * sequence" of the CXL Memory Device SW Guide (Rev1p0).
786e9e58377374 Ben Widawsky 2022-02-11  422   *
786e9e58377374 Ben Widawsky 2022-02-11  423   * Returns true if the configuration is valid.
786e9e58377374 Ben Widawsky 2022-02-11  424   */
b15cb12c2369e0 Ben Widawsky 2022-02-11  425  static bool region_hb_rp_config_valid(struct cxl_region *cxlr,
b15cb12c2369e0 Ben Widawsky 2022-02-11  426  				      const struct cxl_decoder *rootd,
b15cb12c2369e0 Ben Widawsky 2022-02-11  427  				      bool state_update)
786e9e58377374 Ben Widawsky 2022-02-11  428  {
2ecd98fe1cb074 Ben Widawsky 2022-02-11  429  	const int region_ig = cxl_to_ig(cxlr->config.interleave_granularity);
2ecd98fe1cb074 Ben Widawsky 2022-02-11  430  	const int region_eniw = cxl_to_eniw(cxlr->config.interleave_ways);
8ed598d187016c Ben Widawsky 2022-02-11  431  	const int num_root_ports = get_num_root_ports(cxlr);
8ed598d187016c Ben Widawsky 2022-02-11  432  	struct cxl_port *hbs[CXL_DECODER_MAX_INTERLEAVE];
b15cb12c2369e0 Ben Widawsky 2022-02-11  433  	struct cxl_decoder *cxld, *c;
8ed598d187016c Ben Widawsky 2022-02-11  434  	int hb_count, i;
8ed598d187016c Ben Widawsky 2022-02-11  435  
8ed598d187016c Ben Widawsky 2022-02-11  436  	hb_count = get_unique_hostbridges(cxlr, hbs);
8ed598d187016c Ben Widawsky 2022-02-11  437  
2ecd98fe1cb074 Ben Widawsky 2022-02-11  438  	/* TODO: support multiple levels of switches */
2ecd98fe1cb074 Ben Widawsky 2022-02-11  439  	if (has_multi_switch(cxlr))
2ecd98fe1cb074 Ben Widawsky 2022-02-11  440  		return false;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  441  
2ecd98fe1cb074 Ben Widawsky 2022-02-11  442  	/* TODO: x3 interleave for switches is hard. */
2ecd98fe1cb074 Ben Widawsky 2022-02-11  443  	if (has_switch(cxlr) && !is_power_of_2(region_ways(cxlr)))
8ed598d187016c Ben Widawsky 2022-02-11  444  		return false;
8ed598d187016c Ben Widawsky 2022-02-11  445  
8ed598d187016c Ben Widawsky 2022-02-11  446  	/*
8ed598d187016c Ben Widawsky 2022-02-11  447  	 * Are all devices in this region on the same CXL Host Bridge
8ed598d187016c Ben Widawsky 2022-02-11  448  	 * Root Port?
8ed598d187016c Ben Widawsky 2022-02-11  449  	 */
b15cb12c2369e0 Ben Widawsky 2022-02-11  450  	if (num_root_ports == 1 && !has_switch(cxlr) && state_update)
b15cb12c2369e0 Ben Widawsky 2022-02-11  451  		return simple_config(cxlr, hbs[0]);
8ed598d187016c Ben Widawsky 2022-02-11  452  
8ed598d187016c Ben Widawsky 2022-02-11  453  	for (i = 0; i < hb_count; i++) {
a87877add7dded Ben Widawsky 2022-02-11  454  		struct cxl_decoder *cxld;
8ed598d187016c Ben Widawsky 2022-02-11  455  		int idx, position_mask;
8ed598d187016c Ben Widawsky 2022-02-11  456  		struct cxl_dport *rp;
8ed598d187016c Ben Widawsky 2022-02-11  457  		struct cxl_port *hb;
8ed598d187016c Ben Widawsky 2022-02-11  458  
8ed598d187016c Ben Widawsky 2022-02-11  459  		/* Get next CXL Host Bridge this region spans */
8ed598d187016c Ben Widawsky 2022-02-11  460  		hb = hbs[i];
8ed598d187016c Ben Widawsky 2022-02-11  461  
b15cb12c2369e0 Ben Widawsky 2022-02-11  462  		if (state_update) {
b15cb12c2369e0 Ben Widawsky 2022-02-11  463  			cxld = get_decoder(cxlr, hb);
b15cb12c2369e0 Ben Widawsky 2022-02-11  464  			if (IS_ERR(cxld)) {
b15cb12c2369e0 Ben Widawsky 2022-02-11  465  				dev_dbg(&cxlr->dev,
b15cb12c2369e0 Ben Widawsky 2022-02-11  466  					"Couldn't get decoder for %s\n",
b15cb12c2369e0 Ben Widawsky 2022-02-11  467  					dev_name(&hb->dev));
b15cb12c2369e0 Ben Widawsky 2022-02-11  468  				goto err;
b15cb12c2369e0 Ben Widawsky 2022-02-11  469  			}
b15cb12c2369e0 Ben Widawsky 2022-02-11  470  			cxld->interleave_ways = 0;
b15cb12c2369e0 Ben Widawsky 2022-02-11  471  			cxld->interleave_granularity = region_granularity(cxlr);
b15cb12c2369e0 Ben Widawsky 2022-02-11  472  		} else {
b15cb12c2369e0 Ben Widawsky 2022-02-11  473  			cxld = NULL;
b15cb12c2369e0 Ben Widawsky 2022-02-11  474  		}
b15cb12c2369e0 Ben Widawsky 2022-02-11  475  
8ed598d187016c Ben Widawsky 2022-02-11  476  		/*
8ed598d187016c Ben Widawsky 2022-02-11  477  		 * Calculate the position mask: NumRootPorts = 2^PositionMask
8ed598d187016c Ben Widawsky 2022-02-11  478  		 * for this region.
8ed598d187016c Ben Widawsky 2022-02-11  479  		 *
8ed598d187016c Ben Widawsky 2022-02-11  480  		 * XXX: pos_mask is actually (1 << PositionMask)  - 1
8ed598d187016c Ben Widawsky 2022-02-11  481  		 */
8ed598d187016c Ben Widawsky 2022-02-11  482  		position_mask = (1 << (ilog2(num_root_ports))) - 1;
8ed598d187016c Ben Widawsky 2022-02-11  483  
8ed598d187016c Ben Widawsky 2022-02-11  484  		/*
8ed598d187016c Ben Widawsky 2022-02-11  485  		 * Calculate the PortGrouping for each device on this CXL Host
8ed598d187016c Ben Widawsky 2022-02-11  486  		 * Bridge Root Port:
8ed598d187016c Ben Widawsky 2022-02-11  487  		 * PortGrouping = RegionLabel.Position & PositionMask
8ed598d187016c Ben Widawsky 2022-02-11  488  		 *
8ed598d187016c Ben Widawsky 2022-02-11  489  		 * The following nest iterators effectively iterate over each
8ed598d187016c Ben Widawsky 2022-02-11  490  		 * root port in the region.
8ed598d187016c Ben Widawsky 2022-02-11  491  		 *   for_each_unique_rootport(rp, cxlr)
8ed598d187016c Ben Widawsky 2022-02-11  492  		 */
8ed598d187016c Ben Widawsky 2022-02-11  493  		list_for_each_entry(rp, &hb->dports, list) {
8ed598d187016c Ben Widawsky 2022-02-11  494  			struct cxl_memdev *ep;
8ed598d187016c Ben Widawsky 2022-02-11  495  			int port_grouping = -1;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  496  			int target_ndx;
8ed598d187016c Ben Widawsky 2022-02-11  497  
8ed598d187016c Ben Widawsky 2022-02-11  498  			for_each_cxl_endpoint_hb(ep, cxlr, hb, idx) {
2ecd98fe1cb074 Ben Widawsky 2022-02-11  499  				struct cxl_decoder *switch_cxld;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  500  				struct cxl_dport *target;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  501  				struct cxl_port *switch_port;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  502  				bool found = false;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  503  
8ed598d187016c Ben Widawsky 2022-02-11  504  				if (get_rp(ep) != rp)
8ed598d187016c Ben Widawsky 2022-02-11  505  					continue;
8ed598d187016c Ben Widawsky 2022-02-11  506  
8ed598d187016c Ben Widawsky 2022-02-11  507  				if (port_grouping == -1)
8ed598d187016c Ben Widawsky 2022-02-11  508  					port_grouping = idx & position_mask;
8ed598d187016c Ben Widawsky 2022-02-11  509  
8ed598d187016c Ben Widawsky 2022-02-11  510  				/*
8ed598d187016c Ben Widawsky 2022-02-11  511  				 * Do all devices in the region connected to this CXL
8ed598d187016c Ben Widawsky 2022-02-11  512  				 * Host Bridge Root Port have the same PortGrouping?
8ed598d187016c Ben Widawsky 2022-02-11  513  				 */
8ed598d187016c Ben Widawsky 2022-02-11  514  				if ((idx & position_mask) != port_grouping) {
8ed598d187016c Ben Widawsky 2022-02-11  515  					dev_dbg(&cxlr->dev,
8ed598d187016c Ben Widawsky 2022-02-11  516  						"One or more devices are not connected to the correct Host Bridge Root Port\n");
b15cb12c2369e0 Ben Widawsky 2022-02-11  517  					goto err;
8ed598d187016c Ben Widawsky 2022-02-11  518  				}
a87877add7dded Ben Widawsky 2022-02-11  519  
a87877add7dded Ben Widawsky 2022-02-11  520  				if (!state_update)
a87877add7dded Ben Widawsky 2022-02-11  521  					continue;
a87877add7dded Ben Widawsky 2022-02-11  522  
a87877add7dded Ben Widawsky 2022-02-11  523  				if (dev_WARN_ONCE(&cxld->dev,
a87877add7dded Ben Widawsky 2022-02-11  524  						  port_grouping >= cxld->nr_targets,
a87877add7dded Ben Widawsky 2022-02-11  525  						  "Invalid port grouping %d/%d\n",
a87877add7dded Ben Widawsky 2022-02-11  526  						  port_grouping, cxld->nr_targets))
a87877add7dded Ben Widawsky 2022-02-11  527  					goto err;
a87877add7dded Ben Widawsky 2022-02-11  528  
a87877add7dded Ben Widawsky 2022-02-11  529  				cxld->interleave_ways++;
a87877add7dded Ben Widawsky 2022-02-11  530  				cxld->target[port_grouping] = get_rp(ep);
2ecd98fe1cb074 Ben Widawsky 2022-02-11  531  
2ecd98fe1cb074 Ben Widawsky 2022-02-11  532  				/*
2ecd98fe1cb074 Ben Widawsky 2022-02-11  533  				 * At least one switch is connected here if the endpoint
2ecd98fe1cb074 Ben Widawsky 2022-02-11  534  				 * has a depth > 2
2ecd98fe1cb074 Ben Widawsky 2022-02-11  535  				 */
2ecd98fe1cb074 Ben Widawsky 2022-02-11  536  				if (ep->port->depth == 2)
2ecd98fe1cb074 Ben Widawsky 2022-02-11  537  					continue;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  538  
2ecd98fe1cb074 Ben Widawsky 2022-02-11  539  				/* Check the staged list to see if this
2ecd98fe1cb074 Ben Widawsky 2022-02-11  540  				 * port has already been added
2ecd98fe1cb074 Ben Widawsky 2022-02-11  541  				 */
2ecd98fe1cb074 Ben Widawsky 2022-02-11  542  				switch_port = get_switch(ep);
2ecd98fe1cb074 Ben Widawsky 2022-02-11  543  				list_for_each_entry(switch_cxld, &cxlr->staged_list, region_link) {
2ecd98fe1cb074 Ben Widawsky 2022-02-11  544  					if (to_cxl_port(switch_cxld->dev.parent) == switch_port)
2ecd98fe1cb074 Ben Widawsky 2022-02-11  545  						found = true;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  546  				}
2ecd98fe1cb074 Ben Widawsky 2022-02-11  547  
2ecd98fe1cb074 Ben Widawsky 2022-02-11 @548  				if (found) {
2ecd98fe1cb074 Ben Widawsky 2022-02-11  549  					target = cxl_find_dport_by_dev(switch_port, ep->dev.parent->parent);
2ecd98fe1cb074 Ben Widawsky 2022-02-11  550  					switch_cxld->target[target_ndx++] = target;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  551  					continue;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  552  				}
2ecd98fe1cb074 Ben Widawsky 2022-02-11  553  
2ecd98fe1cb074 Ben Widawsky 2022-02-11  554  				target_ndx = 0;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  555  
2ecd98fe1cb074 Ben Widawsky 2022-02-11  556  				switch_cxld = get_decoder(cxlr, switch_port);
2ecd98fe1cb074 Ben Widawsky 2022-02-11  557  				switch_cxld->interleave_ways++;
2ecd98fe1cb074 Ben Widawsky 2022-02-11  558  				switch_cxld->interleave_granularity = cxl_to_ways(region_ig + region_eniw);
8ed598d187016c Ben Widawsky 2022-02-11  559  			}
8ed598d187016c Ben Widawsky 2022-02-11  560  		}
8ed598d187016c Ben Widawsky 2022-02-11  561  	}
8ed598d187016c Ben Widawsky 2022-02-11  562  
786e9e58377374 Ben Widawsky 2022-02-11  563  	return true;
b15cb12c2369e0 Ben Widawsky 2022-02-11  564  
b15cb12c2369e0 Ben Widawsky 2022-02-11  565  err:
b15cb12c2369e0 Ben Widawsky 2022-02-11  566  	dev_dbg(&cxlr->dev, "Couldn't get decoder for region\n");
b15cb12c2369e0 Ben Widawsky 2022-02-11  567  	list_for_each_entry_safe(cxld, c, &cxlr->staged_list, region_link)
b15cb12c2369e0 Ben Widawsky 2022-02-11  568  		cxl_put_decoder(cxld);
b15cb12c2369e0 Ben Widawsky 2022-02-11  569  
b15cb12c2369e0 Ben Widawsky 2022-02-11  570  	return false;
786e9e58377374 Ben Widawsky 2022-02-11  571  }
786e9e58377374 Ben Widawsky 2022-02-11  572  
786e9e58377374 Ben Widawsky 2022-02-11  573  /**
786e9e58377374 Ben Widawsky 2022-02-11  574   * rootd_contains() - determine if this region can exist in the root decoder
786e9e58377374 Ben Widawsky 2022-02-11  575   * @rootd: root decoder that potentially decodes to this region
786e9e58377374 Ben Widawsky 2022-02-11  576   * @cxlr: region to be routed by the @rootd
786e9e58377374 Ben Widawsky 2022-02-11  577   */
786e9e58377374 Ben Widawsky 2022-02-11  578  static bool rootd_contains(const struct cxl_region *cxlr,
786e9e58377374 Ben Widawsky 2022-02-11  579  			   const struct cxl_decoder *rootd)
786e9e58377374 Ben Widawsky 2022-02-11  580  {
786e9e58377374 Ben Widawsky 2022-02-11  581  	/* TODO: */
786e9e58377374 Ben Widawsky 2022-02-11  582  	return true;
786e9e58377374 Ben Widawsky 2022-02-11  583  }
786e9e58377374 Ben Widawsky 2022-02-11  584  
786e9e58377374 Ben Widawsky 2022-02-11  585  static bool rootd_valid(const struct cxl_region *cxlr,
b15cb12c2369e0 Ben Widawsky 2022-02-11  586  			const struct cxl_decoder *rootd, bool state_update)
786e9e58377374 Ben Widawsky 2022-02-11  587  {
786e9e58377374 Ben Widawsky 2022-02-11  588  	const struct cxl_memdev *endpoint = cxlr->config.targets[0];
786e9e58377374 Ben Widawsky 2022-02-11  589  
786e9e58377374 Ben Widawsky 2022-02-11  590  	if (!qtg_match(rootd, endpoint))
786e9e58377374 Ben Widawsky 2022-02-11  591  		return false;
786e9e58377374 Ben Widawsky 2022-02-11  592  
786e9e58377374 Ben Widawsky 2022-02-11  593  	if (!cxl_is_pmem_t3(rootd->flags))
786e9e58377374 Ben Widawsky 2022-02-11  594  		return false;
786e9e58377374 Ben Widawsky 2022-02-11  595  
786e9e58377374 Ben Widawsky 2022-02-11  596  	if (!region_xhb_config_valid(cxlr, rootd))
786e9e58377374 Ben Widawsky 2022-02-11  597  		return false;
786e9e58377374 Ben Widawsky 2022-02-11  598  
b15cb12c2369e0 Ben Widawsky 2022-02-11  599  	if (!region_hb_rp_config_valid((struct cxl_region *)cxlr, rootd,
b15cb12c2369e0 Ben Widawsky 2022-02-11  600  				       state_update))
786e9e58377374 Ben Widawsky 2022-02-11  601  		return false;
786e9e58377374 Ben Widawsky 2022-02-11  602  
786e9e58377374 Ben Widawsky 2022-02-11  603  	if (!rootd_contains(cxlr, rootd))
786e9e58377374 Ben Widawsky 2022-02-11  604  		return false;
786e9e58377374 Ben Widawsky 2022-02-11  605  
786e9e58377374 Ben Widawsky 2022-02-11  606  	return true;
786e9e58377374 Ben Widawsky 2022-02-11  607  }
786e9e58377374 Ben Widawsky 2022-02-11  608  
786e9e58377374 Ben Widawsky 2022-02-11  609  struct rootd_context {
786e9e58377374 Ben Widawsky 2022-02-11  610  	const struct cxl_region *cxlr;
a87877add7dded Ben Widawsky 2022-02-11  611  	const struct cxl_port *hbs[CXL_DECODER_MAX_INTERLEAVE];
786e9e58377374 Ben Widawsky 2022-02-11  612  	int count;
786e9e58377374 Ben Widawsky 2022-02-11  613  };
786e9e58377374 Ben Widawsky 2022-02-11  614  
786e9e58377374 Ben Widawsky 2022-02-11  615  static int rootd_match(struct device *dev, void *data)
786e9e58377374 Ben Widawsky 2022-02-11  616  {
786e9e58377374 Ben Widawsky 2022-02-11  617  	struct rootd_context *ctx = (struct rootd_context *)data;
786e9e58377374 Ben Widawsky 2022-02-11  618  	const struct cxl_region *cxlr = ctx->cxlr;
786e9e58377374 Ben Widawsky 2022-02-11  619  
786e9e58377374 Ben Widawsky 2022-02-11  620  	if (!is_root_decoder(dev))
786e9e58377374 Ben Widawsky 2022-02-11  621  		return 0;
786e9e58377374 Ben Widawsky 2022-02-11  622  
b15cb12c2369e0 Ben Widawsky 2022-02-11  623  	return !!rootd_valid(cxlr, to_cxl_decoder(dev), false);
786e9e58377374 Ben Widawsky 2022-02-11  624  }
786e9e58377374 Ben Widawsky 2022-02-11  625  
786e9e58377374 Ben Widawsky 2022-02-11  626  /*
786e9e58377374 Ben Widawsky 2022-02-11  627   * This is a roughly equivalent implementation to "Figure 45 - High-level
786e9e58377374 Ben Widawsky 2022-02-11  628   * sequence: Finding CFMWS for region" from the CXL Memory Device SW Guide
786e9e58377374 Ben Widawsky 2022-02-11  629   * Rev1p0.
786e9e58377374 Ben Widawsky 2022-02-11  630   */
786e9e58377374 Ben Widawsky 2022-02-11  631  static struct cxl_decoder *find_rootd(const struct cxl_region *cxlr,
786e9e58377374 Ben Widawsky 2022-02-11  632  				      const struct cxl_port *root)
786e9e58377374 Ben Widawsky 2022-02-11  633  {
786e9e58377374 Ben Widawsky 2022-02-11  634  	struct rootd_context ctx;
786e9e58377374 Ben Widawsky 2022-02-11  635  	struct device *ret;
786e9e58377374 Ben Widawsky 2022-02-11  636  
a87877add7dded Ben Widawsky 2022-02-11  637  	ctx.cxlr = (struct cxl_region *)cxlr;
786e9e58377374 Ben Widawsky 2022-02-11  638  
786e9e58377374 Ben Widawsky 2022-02-11  639  	ret = device_find_child((struct device *)&root->dev, &ctx, rootd_match);
786e9e58377374 Ben Widawsky 2022-02-11  640  	if (ret)
786e9e58377374 Ben Widawsky 2022-02-11  641  		return to_cxl_decoder(ret);
786e9e58377374 Ben Widawsky 2022-02-11  642  
786e9e58377374 Ben Widawsky 2022-02-11  643  	return NULL;
786e9e58377374 Ben Widawsky 2022-02-11  644  }
786e9e58377374 Ben Widawsky 2022-02-11  645  
b15cb12c2369e0 Ben Widawsky 2022-02-11  646  static void cleanup_staged_decoders(struct cxl_region *cxlr)
786e9e58377374 Ben Widawsky 2022-02-11  647  {
b15cb12c2369e0 Ben Widawsky 2022-02-11  648  	struct cxl_decoder *cxld, *d;
b15cb12c2369e0 Ben Widawsky 2022-02-11  649  
b15cb12c2369e0 Ben Widawsky 2022-02-11  650  	list_for_each_entry_safe(cxld, d, &cxlr->staged_list, region_link) {
b15cb12c2369e0 Ben Widawsky 2022-02-11  651  		cxl_put_decoder(cxld);
b15cb12c2369e0 Ben Widawsky 2022-02-11  652  		list_del_init(&cxld->region_link);
b15cb12c2369e0 Ben Widawsky 2022-02-11  653  	}
b15cb12c2369e0 Ben Widawsky 2022-02-11  654  }
b15cb12c2369e0 Ben Widawsky 2022-02-11  655  
b15cb12c2369e0 Ben Widawsky 2022-02-11  656  static int collect_ep_decoders(struct cxl_region *cxlr)
b15cb12c2369e0 Ben Widawsky 2022-02-11  657  {
b15cb12c2369e0 Ben Widawsky 2022-02-11  658  	struct cxl_memdev *ep;
b15cb12c2369e0 Ben Widawsky 2022-02-11  659  	int i, rc = 0;
b15cb12c2369e0 Ben Widawsky 2022-02-11  660  
b15cb12c2369e0 Ben Widawsky 2022-02-11  661  	for_each_cxl_endpoint(ep, cxlr, i) {
b15cb12c2369e0 Ben Widawsky 2022-02-11  662  		struct cxl_decoder *cxld;
b15cb12c2369e0 Ben Widawsky 2022-02-11  663  
b15cb12c2369e0 Ben Widawsky 2022-02-11  664  		cxld = get_decoder(cxlr, ep->port);
b15cb12c2369e0 Ben Widawsky 2022-02-11  665  		if (IS_ERR(cxld)) {
b15cb12c2369e0 Ben Widawsky 2022-02-11  666  			rc = PTR_ERR(cxld);
b15cb12c2369e0 Ben Widawsky 2022-02-11  667  			goto err;
b15cb12c2369e0 Ben Widawsky 2022-02-11  668  		}
b15cb12c2369e0 Ben Widawsky 2022-02-11  669  
b15cb12c2369e0 Ben Widawsky 2022-02-11  670  		cxld->interleave_granularity = region_granularity(cxlr);
b15cb12c2369e0 Ben Widawsky 2022-02-11  671  		cxld->interleave_ways = region_ways(cxlr);
b15cb12c2369e0 Ben Widawsky 2022-02-11  672  	}
b15cb12c2369e0 Ben Widawsky 2022-02-11  673  
786e9e58377374 Ben Widawsky 2022-02-11  674  	return 0;
b15cb12c2369e0 Ben Widawsky 2022-02-11  675  
b15cb12c2369e0 Ben Widawsky 2022-02-11  676  err:
b15cb12c2369e0 Ben Widawsky 2022-02-11  677  	cleanup_staged_decoders(cxlr);
b15cb12c2369e0 Ben Widawsky 2022-02-11  678  	return rc;
786e9e58377374 Ben Widawsky 2022-02-11  679  }
786e9e58377374 Ben Widawsky 2022-02-11  680  
968e6c3d87e25a Ben Widawsky 2022-02-11  681  static int bind_region(struct cxl_region *cxlr)
786e9e58377374 Ben Widawsky 2022-02-11  682  {
968e6c3d87e25a Ben Widawsky 2022-02-11  683  	struct cxl_decoder *cxld, *d;
968e6c3d87e25a Ben Widawsky 2022-02-11  684  	int rc;
968e6c3d87e25a Ben Widawsky 2022-02-11  685  
968e6c3d87e25a Ben Widawsky 2022-02-11  686  	list_for_each_entry_safe(cxld, d, &cxlr->staged_list, region_link) {
968e6c3d87e25a Ben Widawsky 2022-02-11  687  		rc = cxl_commit_decoder(cxld);
968e6c3d87e25a Ben Widawsky 2022-02-11  688  		if (!rc) {
968e6c3d87e25a Ben Widawsky 2022-02-11  689  			list_move_tail(&cxld->region_link, &cxlr->commit_list);
968e6c3d87e25a Ben Widawsky 2022-02-11  690  		} else {
968e6c3d87e25a Ben Widawsky 2022-02-11  691  			dev_dbg(&cxlr->dev, "Failed to commit %s\n",
968e6c3d87e25a Ben Widawsky 2022-02-11  692  				dev_name(&cxld->dev));
968e6c3d87e25a Ben Widawsky 2022-02-11  693  			break;
968e6c3d87e25a Ben Widawsky 2022-02-11  694  		}
968e6c3d87e25a Ben Widawsky 2022-02-11  695  	}
968e6c3d87e25a Ben Widawsky 2022-02-11  696  
968e6c3d87e25a Ben Widawsky 2022-02-11  697  	list_for_each_entry_safe(cxld, d, &cxlr->commit_list, region_link) {
968e6c3d87e25a Ben Widawsky 2022-02-11 @698  		if (rc) {
968e6c3d87e25a Ben Widawsky 2022-02-11  699  			cxl_disable_decoder(cxld);
968e6c3d87e25a Ben Widawsky 2022-02-11  700  			list_del(&cxld->region_link);
968e6c3d87e25a Ben Widawsky 2022-02-11  701  		}
968e6c3d87e25a Ben Widawsky 2022-02-11  702  	}
968e6c3d87e25a Ben Widawsky 2022-02-11  703  
968e6c3d87e25a Ben Widawsky 2022-02-11  704  	if (rc)
968e6c3d87e25a Ben Widawsky 2022-02-11  705  		cleanup_staged_decoders(cxlr);
968e6c3d87e25a Ben Widawsky 2022-02-11  706  
968e6c3d87e25a Ben Widawsky 2022-02-11  707  	BUG_ON(!list_empty(&cxlr->staged_list));
968e6c3d87e25a Ben Widawsky 2022-02-11  708  	return rc;
968e6c3d87e25a Ben Widawsky 2022-02-11  709  }
968e6c3d87e25a Ben Widawsky 2022-02-11  710  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

                 reply	other threads:[~2022-05-07 23:17 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=202205080702.50dD2up2-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild@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.