tree:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git 
next-test
head:   2e60265c1feb6848c77dbea22d38bbe262ec49db
commit: b90e1cfa05bddc2fa0e314a790df603479259637 [179/194] powerpc/pseries/eeh: 
Rework device EEH PE determination
config: powerpc64-randconfig-r035-20200923 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 
d6ac649ccda289ecc2d2c0cb51892d57e8ec328c)
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 powerpc64 cross compiling tool for clang build
        # apt-get install binutils-powerpc64-linux-gnu
        git checkout b90e1cfa05bddc2fa0e314a790df603479259637
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross 
ARCH=powerpc64 

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

All errors (new ones prefixed by >>):

   arch/powerpc/platforms/pseries/eeh_pseries.c:46:6: error: no previous 
prototype for function 'pseries_pcibios_bus_add_device' 
[-Werror,-Wmissing-prototypes]
   void pseries_pcibios_bus_add_device(struct pci_dev *pdev)
        ^
   arch/powerpc/platforms/pseries/eeh_pseries.c:46:1: note: declare 'static' if 
the function is not intended to be used outside of this translation unit
   void pseries_pcibios_bus_add_device(struct pci_dev *pdev)
   ^
   static 
>> arch/powerpc/platforms/pseries/eeh_pseries.c:420:6: error: variable 'ret' is 
>> used uninitialized whenever 'if' condition is true 
>> [-Werror,-Wsometimes-uninitialized]
           if (addr == 0) {
               ^~~~~~~~~
   arch/powerpc/platforms/pseries/eeh_pseries.c:449:67: note: uninitialized use 
occurs here
           eeh_edev_dbg(edev, "EEH is unsupported on device (code = %d)\n", 
ret);
                                                                            ^~~
   arch/powerpc/include/asm/eeh.h:162:75: note: expanded from macro 
'eeh_edev_dbg'
   #define eeh_edev_dbg(edev, fmt, ...) EEH_EDEV_PRINT(debug, (edev), fmt, 
##__VA_ARGS__)
                                                                             
^~~~~~~~~~~
   arch/powerpc/include/asm/eeh.h:161:52: note: expanded from macro 
'EEH_EDEV_PRINT'
           ((edev)->pe ? (edev)->pe_config_addr : 0xffff), ##__VA_ARGS__)
                                                             ^~~~~~~~~~~
   include/linux/printk.h:423:35: note: expanded from macro 'pr_debug'
           printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
                                            ^~~~~~~~~~~
   arch/powerpc/platforms/pseries/eeh_pseries.c:420:2: note: remove the 'if' if 
its condition is always false
           if (addr == 0) {
           ^~~~~~~~~~~~~~~~
   arch/powerpc/platforms/pseries/eeh_pseries.c:362:9: note: initialize the 
variable 'ret' to silence this warning
           int ret;
                  ^
                   = 0
   2 errors generated.

# 
https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id=b90e1cfa05bddc2fa0e314a790df603479259637
git remote add powerpc 
https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git
git fetch --no-tags powerpc next-test
git checkout b90e1cfa05bddc2fa0e314a790df603479259637
vim +420 arch/powerpc/platforms/pseries/eeh_pseries.c

   345  
   346  /**
   347   * pseries_eeh_init_edev - initialise the eeh_dev and eeh_pe for a 
pci_dn
   348   *
   349   * @pdn: PCI device node
   350   *
   351   * When we discover a new PCI device via the device-tree we create a
   352   * corresponding pci_dn and we allocate, but don't initialise, an 
eeh_dev.
   353   * This function takes care of the initialisation and inserts the 
eeh_dev
   354   * into the correct eeh_pe. If no eeh_pe exists we'll allocate one.
   355   */
   356  void pseries_eeh_init_edev(struct pci_dn *pdn)
   357  {
   358          struct eeh_pe pe, *parent;
   359          struct eeh_dev *edev;
   360          int addr;
   361          u32 pcie_flags;
   362          int ret;
   363  
   364          if (WARN_ON_ONCE(!eeh_has_flag(EEH_PROBE_MODE_DEVTREE)))
   365                  return;
   366  
   367          /*
   368           * Find the eeh_dev for this pdn. The storage for the eeh_dev 
was
   369           * allocated at the same time as the pci_dn.
   370           *
   371           * XXX: We should probably re-visit that.
   372           */
   373          edev = pdn_to_eeh_dev(pdn);
   374          if (!edev)
   375                  return;
   376  
   377          /*
   378           * If ->pe is set then we've already probed this device. We hit
   379           * this path when a pci_dev is removed and rescanned while 
recovering
   380           * a PE (i.e. for devices where the driver doesn't support error
   381           * recovery).
   382           */
   383          if (edev->pe)
   384                  return;
   385  
   386          /* Check class/vendor/device IDs */
   387          if (!pdn->vendor_id || !pdn->device_id || !pdn->class_code)
   388                  return;
   389  
   390          /* Skip for PCI-ISA bridge */
   391          if ((pdn->class_code >> 8) == PCI_CLASS_BRIDGE_ISA)
   392                  return;
   393  
   394          eeh_edev_dbg(edev, "Probing device\n");
   395  
   396          /*
   397           * Update class code and mode of eeh device. We need
   398           * correctly reflects that current device is root port
   399           * or PCIe switch downstream port.
   400           */
   401          edev->pcix_cap = pseries_eeh_find_cap(pdn, PCI_CAP_ID_PCIX);
   402          edev->pcie_cap = pseries_eeh_find_cap(pdn, PCI_CAP_ID_EXP);
   403          edev->aer_cap = pseries_eeh_find_ecap(pdn, PCI_EXT_CAP_ID_ERR);
   404          edev->mode &= 0xFFFFFF00;
   405          if ((pdn->class_code >> 8) == PCI_CLASS_BRIDGE_PCI) {
   406                  edev->mode |= EEH_DEV_BRIDGE;
   407                  if (edev->pcie_cap) {
   408                          rtas_read_config(pdn, edev->pcie_cap + 
PCI_EXP_FLAGS,
   409                                           2, &pcie_flags);
   410                          pcie_flags = (pcie_flags & PCI_EXP_FLAGS_TYPE) 
>> 4;
   411                          if (pcie_flags == PCI_EXP_TYPE_ROOT_PORT)
   412                                  edev->mode |= EEH_DEV_ROOT_PORT;
   413                          else if (pcie_flags == PCI_EXP_TYPE_DOWNSTREAM)
   414                                  edev->mode |= EEH_DEV_DS_PORT;
   415                  }
   416          }
   417  
   418          /* first up, find the pe_config_addr for the PE containing the 
device */
   419          addr = pseries_eeh_get_pe_config_addr(pdn);
 > 420          if (addr == 0) {
   421                  eeh_edev_dbg(edev, "Unable to find pe_config_addr\n");
   422                  goto err;
   423          }
   424  
   425          /* Try enable EEH on the fake PE */
   426          memset(&pe, 0, sizeof(struct eeh_pe));
   427          pe.phb = pdn->phb;
   428          pe.addr = addr;
   429  
   430          eeh_edev_dbg(edev, "Enabling EEH on device\n");
   431          ret = eeh_ops->set_option(&pe, EEH_OPT_ENABLE);
   432          if (ret) {
   433                  eeh_edev_dbg(edev, "EEH failed to enable on device 
(code %d)\n", ret);
   434                  goto err;
   435          }
   436  
   437          edev->pe_config_addr = addr;
   438  
   439          eeh_add_flag(EEH_ENABLED);
   440  
   441          parent = pseries_eeh_pe_get_parent(edev);
   442          eeh_pe_tree_insert(edev, parent);
   443          eeh_save_bars(edev);
   444          eeh_edev_dbg(edev, "EEH enabled for device");
   445  
   446          return;
   447  
   448  err:
   449          eeh_edev_dbg(edev, "EEH is unsupported on device (code = 
%d)\n", ret);
   450  }
   451  

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

Attachment: .config.gz
Description: application/gzip

Reply via email to