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.