From: kernel test robot <lkp@intel.com>
To: dayou5941@163.com, dlemoal@kernel.org, cassel@kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org,
liyouhong@kylinos.cn
Subject: Re: [PATCH] ata: libahci: fix panic when accessing ports beyond MMIO region
Date: Thu, 30 Apr 2026 08:59:57 +0800 [thread overview]
Message-ID: <202604300815.6kpEidbJ-lkp@intel.com> (raw)
In-Reply-To: <20260422080322.1006592-1-dayou5941@163.com>
Hi,
kernel test robot noticed the following build errors:
[auto build test ERROR on linus/master]
[also build test ERROR on v7.1-rc1 next-20260429]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/dayou5941-163-com/ata-libahci-fix-panic-when-accessing-ports-beyond-MMIO-region/20260422-192119
base: linus/master
patch link: https://lore.kernel.org/r/20260422080322.1006592-1-dayou5941%40163.com
patch subject: [PATCH] ata: libahci: fix panic when accessing ports beyond MMIO region
config: arm64-randconfig-003-20260430 (https://download.01.org/0day-ci/archive/20260430/202604300815.6kpEidbJ-lkp@intel.com/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 5bac06718f502014fade905512f1d26d578a18f3)
rustc: rustc 1.88.0 (6b00bc388 2025-06-23)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260430/202604300815.6kpEidbJ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604300815.6kpEidbJ-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/ata/libahci.c:614:18: warning: missing terminating '"' character [-Winvalid-pp-token]
614 | dev_warn(dev, "Port %d (offset 0x%llx) exceeds MMIO region (0x%llx),
| ^
drivers/ata/libahci.c:615:44: warning: missing terminating '"' character [-Winvalid-pp-token]
615 | truncating port map at port %d\n",
| ^
>> drivers/ata/libahci.c:614:18: error: expected expression
614 | dev_warn(dev, "Port %d (offset 0x%llx) exceeds MMIO region (0x%llx),
| ^
2 warnings and 1 error generated.
vim +614 drivers/ata/libahci.c
428
429 /**
430 * ahci_save_initial_config - Save and fixup initial config values
431 * @dev: target AHCI device
432 * @hpriv: host private area to store config values
433 *
434 * Some registers containing configuration info might be setup by
435 * BIOS and might be cleared on reset. This function saves the
436 * initial values of those registers into @hpriv such that they
437 * can be restored after controller reset.
438 *
439 * If inconsistent, config values are fixed up by this function.
440 *
441 * If it is not set already this function sets hpriv->start_engine to
442 * ahci_start_engine.
443 *
444 * LOCKING:
445 * None.
446 */
447 void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
448 {
449 void __iomem *mmio = hpriv->mmio;
450 void __iomem *port_mmio;
451 unsigned long port_map;
452 u32 cap, cap2, vers;
453 unsigned long long mmio_size = 0;
454 bool is_pci_dev = false;
455 int i;
456
457 /* make sure AHCI mode is enabled before accessing CAP */
458 ahci_enable_ahci(mmio);
459
460 /*
461 * Values prefixed with saved_ are written back to the HBA and ports
462 * registers after reset. Values without are used for driver operation.
463 */
464
465 /*
466 * Override HW-init HBA capability fields with the platform-specific
467 * values. The rest of the HBA capabilities are defined as Read-only
468 * and can't be modified in CSR anyway.
469 */
470 cap = readl(mmio + HOST_CAP);
471 if (hpriv->saved_cap)
472 cap = (cap & ~(HOST_CAP_SSS | HOST_CAP_MPS)) | hpriv->saved_cap;
473 hpriv->saved_cap = cap;
474
475 /* CAP2 register is only defined for AHCI 1.2 and later */
476 vers = readl(mmio + HOST_VERSION);
477 if ((vers >> 16) > 1 ||
478 ((vers >> 16) == 1 && (vers & 0xFFFF) >= 0x200))
479 hpriv->saved_cap2 = cap2 = readl(mmio + HOST_CAP2);
480 else
481 hpriv->saved_cap2 = cap2 = 0;
482
483 /* some chips have errata preventing 64bit use */
484 if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) {
485 dev_info(dev, "controller can't do 64bit DMA, forcing 32bit\n");
486 cap &= ~HOST_CAP_64;
487 }
488
489 if ((cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_NO_NCQ)) {
490 dev_info(dev, "controller can't do NCQ, turning off CAP_NCQ\n");
491 cap &= ~HOST_CAP_NCQ;
492 }
493
494 if (!(cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_YES_NCQ)) {
495 dev_info(dev, "controller can do NCQ, turning on CAP_NCQ\n");
496 cap |= HOST_CAP_NCQ;
497 }
498
499 if ((cap & HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) {
500 dev_info(dev, "controller can't do PMP, turning off CAP_PMP\n");
501 cap &= ~HOST_CAP_PMP;
502 }
503
504 if ((cap & HOST_CAP_SNTF) && (hpriv->flags & AHCI_HFLAG_NO_SNTF)) {
505 dev_info(dev,
506 "controller can't do SNTF, turning off CAP_SNTF\n");
507 cap &= ~HOST_CAP_SNTF;
508 }
509
510 if ((cap2 & HOST_CAP2_SDS) && (hpriv->flags & AHCI_HFLAG_NO_DEVSLP)) {
511 dev_info(dev,
512 "controller can't do DEVSLP, turning off\n");
513 cap2 &= ~HOST_CAP2_SDS;
514 cap2 &= ~HOST_CAP2_SADM;
515 }
516
517 if (!(cap & HOST_CAP_FBS) && (hpriv->flags & AHCI_HFLAG_YES_FBS)) {
518 dev_info(dev, "controller can do FBS, turning on CAP_FBS\n");
519 cap |= HOST_CAP_FBS;
520 }
521
522 if ((cap & HOST_CAP_FBS) && (hpriv->flags & AHCI_HFLAG_NO_FBS)) {
523 dev_info(dev, "controller can't do FBS, turning off CAP_FBS\n");
524 cap &= ~HOST_CAP_FBS;
525 }
526
527 if (!(cap & HOST_CAP_ALPM) && (hpriv->flags & AHCI_HFLAG_YES_ALPM)) {
528 dev_info(dev, "controller can do ALPM, turning on CAP_ALPM\n");
529 cap |= HOST_CAP_ALPM;
530 }
531
532 if ((cap & HOST_CAP_SXS) && (hpriv->flags & AHCI_HFLAG_NO_SXS)) {
533 dev_info(dev, "controller does not support SXS, disabling CAP_SXS\n");
534 cap &= ~HOST_CAP_SXS;
535 }
536
537 /* Override the HBA ports mapping if the platform needs it */
538 port_map = readl(mmio + HOST_PORTS_IMPL);
539 if (hpriv->saved_port_map && port_map != hpriv->saved_port_map) {
540 dev_info(dev, "forcing port_map 0x%lx -> 0x%x\n",
541 port_map, hpriv->saved_port_map);
542 port_map = hpriv->saved_port_map;
543 } else {
544 hpriv->saved_port_map = port_map;
545 }
546
547 /* mask_port_map not set means that all ports are available */
548 if (hpriv->mask_port_map) {
549 dev_warn(dev, "masking port_map 0x%lx -> 0x%lx\n",
550 port_map,
551 port_map & hpriv->mask_port_map);
552 port_map &= hpriv->mask_port_map;
553 }
554
555 /* cross check port_map and cap.n_ports */
556 if (port_map) {
557 int map_ports = 0;
558
559 for (i = 0; i < AHCI_MAX_PORTS; i++)
560 if (port_map & (1 << i))
561 map_ports++;
562
563 /* If PI has more ports than n_ports, whine, clear
564 * port_map and let it be generated from n_ports.
565 */
566 if (map_ports > ahci_nr_ports(cap)) {
567 dev_warn(dev,
568 "implemented port map (0x%lx) contains more ports than nr_ports (%u), using nr_ports\n",
569 port_map, ahci_nr_ports(cap));
570 port_map = 0;
571 }
572 }
573
574 /* fabricate port_map from cap.nr_ports for < AHCI 1.3 */
575 if (!port_map && vers < 0x10300) {
576 port_map = (1 << ahci_nr_ports(cap)) - 1;
577 dev_warn(dev, "forcing PORTS_IMPL to 0x%lx\n", port_map);
578
579 /* write the fixed up value to the PI register */
580 hpriv->saved_port_map = port_map;
581 }
582
583 is_pci_dev = dev_is_pci(dev);
584 if (is_pci_dev) {
585 struct pci_dev *pdev = to_pci_dev(dev);
586
587 mmio_size = (unsigned long long)pci_resource_len(pdev, 5);
588 }
589
590 /*
591 * Preserve the ports capabilities defined by the platform. Note there
592 * is no need in storing the rest of the P#.CMD fields since they are
593 * volatile.
594 */
595 for_each_set_bit(i, &port_map, AHCI_MAX_PORTS) {
596 if (hpriv->saved_port_cap[i])
597 continue;
598
599 port_mmio = __ahci_port_base(hpriv, i);
600
601 /* Calculate offset from MMIO base */
602 unsigned long long port_offset = (unsigned long long)port_mmio -
603 (unsigned long long)mmio;
604 /* Check if port register block is within MMIO region */
605 if (is_pci_dev && port_offset >= mmio_size) {
606 /*
607 * Port registers exceed MMIO region boundary.
608 * Since ports are sequentially mapped (0x100 + i*0x80),
609 * all subsequent ports will also exceed the boundary.
610 *
611 * Update port_map to exclude this and all higher ports,
612 * then break out of the loop.
613 */
> 614 dev_warn(dev, "Port %d (offset 0x%llx) exceeds MMIO region (0x%llx),
615 truncating port map at port %d\n",
616 i, port_offset, mmio_size, i-1);
617
618 port_map = (1UL << i) - 1;
619 hpriv->saved_port_map = port_map;
620 break;
621 }
622
623 hpriv->saved_port_cap[i] =
624 readl(port_mmio + PORT_CMD) & PORT_CMD_CAP;
625 }
626
627 /* record values to use during operation */
628 hpriv->cap = cap;
629 hpriv->cap2 = cap2;
630 hpriv->version = vers;
631 hpriv->port_map = port_map;
632
633 if (!hpriv->start_engine)
634 hpriv->start_engine = ahci_start_engine;
635
636 if (!hpriv->stop_engine)
637 hpriv->stop_engine = ahci_stop_engine;
638
639 if (!hpriv->irq_handler)
640 hpriv->irq_handler = ahci_single_level_irq_intr;
641 }
642 EXPORT_SYMBOL_GPL(ahci_save_initial_config);
643
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
prev parent reply other threads:[~2026-04-30 1:00 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-22 8:03 [PATCH] ata: libahci: fix panic when accessing ports beyond MMIO region dayou5941
2026-04-22 14:36 ` Niklas Cassel
[not found] ` <55809835.8838.19db9be1205.Coremail.dayou5941@163.com>
2026-04-23 17:19 ` Niklas Cassel
2026-04-24 2:43 ` Damien Le Moal
[not found] ` <13d7d471.6389.19dbe594e14.Coremail.dayou5941@163.com>
2026-04-24 11:07 ` Niklas Cassel
2026-04-24 11:15 ` Damien Le Moal
2026-04-25 6:15 ` Re:Re: " 李佑鸿
[not found] ` <26f59adf.571d.19dbe310f41.Coremail.dayou5941@163.com>
2026-04-24 11:07 ` Niklas Cassel
2026-04-30 0:59 ` kernel test robot [this message]
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=202604300815.6kpEidbJ-lkp@intel.com \
--to=lkp@intel.com \
--cc=cassel@kernel.org \
--cc=dayou5941@163.com \
--cc=dlemoal@kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=liyouhong@kylinos.cn \
--cc=llvm@lists.linux.dev \
--cc=oe-kbuild-all@lists.linux.dev \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox