Message ID | 20240712181246.811044-2-superm1@kernel.org |
---|---|
State | New |
Headers | show |
Series | [v3,1/5] PCI: Use an enum for reset type in pci_dev_wait() | expand |
Hi, kernel test robot noticed the following build warnings: [auto build test WARNING on usb/usb-testing] [also build test WARNING on usb/usb-next usb/usb-linus westeri-thunderbolt/next linus/master v6.10-rc7 next-20240712] [cannot apply to pci/next pci/for-linus] [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/superm1-kernel-org/PCI-Use-an-enum-for-reset-type-in-pci_dev_wait/20240713-022018 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing patch link: https://lore.kernel.org/r/20240712181246.811044-2-superm1%40kernel.org patch subject: [PATCH v3 1/5] PCI: Use an enum for reset type in pci_dev_wait() config: x86_64-randconfig-121-20240713 (https://download.01.org/0day-ci/archive/20240713/202407131650.S68TetNP-lkp@intel.com/config) compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240713/202407131650.S68TetNP-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/202407131650.S68TetNP-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/pci/pci.c:184:12: sparse: sparse: symbol 'pci_reset_types' was not declared. Should it be static? drivers/pci/pci.c:1208:36: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted pci_power_t [usertype] current_state @@ got int @@ drivers/pci/pci.c:1208:36: sparse: expected restricted pci_power_t [usertype] current_state drivers/pci/pci.c:1208:36: sparse: got int drivers/pci/pci.c:1367:15: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted pci_power_t [assigned] [usertype] state @@ got int @@ drivers/pci/pci.c:1367:15: sparse: expected restricted pci_power_t [assigned] [usertype] state drivers/pci/pci.c:1367:15: sparse: got int drivers/pci/pci.c:1369:50: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1369:69: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1422:28: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted pci_power_t [usertype] current_state @@ got int @@ drivers/pci/pci.c:1422:28: sparse: expected restricted pci_power_t [usertype] current_state drivers/pci/pci.c:1422:28: sparse: got int drivers/pci/pci.c:1512:16: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1512:35: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1512:52: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1512:70: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1534:15: sparse: sparse: invalid assignment: |= drivers/pci/pci.c:1534:15: sparse: left side has type unsigned short drivers/pci/pci.c:1534:15: sparse: right side has type restricted pci_power_t drivers/pci/pci.c:1546:28: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted pci_power_t [usertype] current_state @@ got int @@ drivers/pci/pci.c:1546:28: sparse: expected restricted pci_power_t [usertype] current_state drivers/pci/pci.c:1546:28: sparse: got int drivers/pci/pci.c:1563:13: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1563:21: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1565:18: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1565:26: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1588:13: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1588:22: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:1920:38: sparse: sparse: array of flexible structures drivers/pci/pci.c:2370:44: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:2689:60: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:2690:30: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:2861:20: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:2861:38: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:2884:49: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:2884:67: sparse: sparse: restricted pci_power_t degrades to integer drivers/pci/pci.c:4580:13: sparse: sparse: invalid assignment: |= drivers/pci/pci.c:4580:13: sparse: left side has type unsigned short drivers/pci/pci.c:4580:13: sparse: right side has type restricted pci_power_t drivers/pci/pci.c:4585:13: sparse: sparse: invalid assignment: |= drivers/pci/pci.c:4585:13: sparse: left side has type unsigned short drivers/pci/pci.c:4585:13: sparse: right side has type restricted pci_power_t drivers/pci/pci.c: note: in included file (through include/linux/resource_ext.h, include/linux/acpi.h): include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true drivers/pci/pci.c:1163:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected int @@ got restricted pci_power_t [usertype] @@ drivers/pci/pci.c:1163:24: sparse: expected int drivers/pci/pci.c:1163:24: sparse: got restricted pci_power_t [usertype] drivers/pci/pci.c:1163:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected int @@ got restricted pci_power_t [usertype] @@ drivers/pci/pci.c:1163:24: sparse: expected int drivers/pci/pci.c:1163:24: sparse: got restricted pci_power_t [usertype] vim +/pci_reset_types +184 drivers/pci/pci.c 183 > 184 const char * const pci_reset_types[] = { 185 "FLR", 186 "AF_FLR", 187 "PM D3HOT->D0", 188 "bus reset", 189 "resume", 190 "DPC", 191 }; 192
On Fri, 12 Jul 2024, superm1@kernel.org wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > A string is passed to all callers of pci_dev_wait() which is utilized > to demonstrate what kind of reset happened when there was a problem. > > This doesn't allow making the behavior for different reset types > conditional though. Lay some plumbing to allow making comparisons of > reset types with integers instead. No functional changes. > > Suggested-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/pci/pci-driver.c | 2 +- > drivers/pci/pci.c | 29 +++++++++++++++++++---------- > drivers/pci/pci.h | 11 ++++++++++- > drivers/pci/pcie/dpc.c | 2 +- > 4 files changed, 31 insertions(+), 13 deletions(-) > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c > index af2996d0d17ff..ff97d08741df7 100644 > --- a/drivers/pci/pci-driver.c > +++ b/drivers/pci/pci-driver.c > @@ -572,7 +572,7 @@ static void pci_pm_bridge_power_up_actions(struct pci_dev *pci_dev) > { > int ret; > > - ret = pci_bridge_wait_for_secondary_bus(pci_dev, "resume"); > + ret = pci_bridge_wait_for_secondary_bus(pci_dev, PCI_DEV_WAIT_RESUME); > if (ret) { > /* > * The downstream link failed to come up, so mark the > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index 35fb1f17a589c..115361a08d9e3 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -181,6 +181,15 @@ static int __init pcie_port_pm_setup(char *str) > } > __setup("pcie_port_pm=", pcie_port_pm_setup); > > +const char * const pci_reset_types[] = { Sparse is not happy about this and expects static as it is not defined by any header (LKP seems to also have caught this). > + "FLR", > + "AF_FLR", > + "PM D3HOT->D0", > + "bus reset", > + "resume", > + "DPC", Perhaps the index-based array initialization format would be beneficial here.
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index af2996d0d17ff..ff97d08741df7 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -572,7 +572,7 @@ static void pci_pm_bridge_power_up_actions(struct pci_dev *pci_dev) { int ret; - ret = pci_bridge_wait_for_secondary_bus(pci_dev, "resume"); + ret = pci_bridge_wait_for_secondary_bus(pci_dev, PCI_DEV_WAIT_RESUME); if (ret) { /* * The downstream link failed to come up, so mark the diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 35fb1f17a589c..115361a08d9e3 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -181,6 +181,15 @@ static int __init pcie_port_pm_setup(char *str) } __setup("pcie_port_pm=", pcie_port_pm_setup); +const char * const pci_reset_types[] = { + "FLR", + "AF_FLR", + "PM D3HOT->D0", + "bus reset", + "resume", + "DPC", +}; + /** * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children * @bus: pointer to PCI bus structure to search @@ -1250,7 +1259,7 @@ void pci_resume_bus(struct pci_bus *bus) pci_walk_bus(bus, pci_resume_one, NULL); } -static int pci_dev_wait(struct pci_dev *dev, char *reset_type, int timeout) +static int pci_dev_wait(struct pci_dev *dev, enum pci_reset_type reset_type, int timeout) { int delay = 1; bool retrain = false; @@ -1288,7 +1297,7 @@ static int pci_dev_wait(struct pci_dev *dev, char *reset_type, int timeout) if (delay > timeout) { pci_warn(dev, "not ready %dms after %s; giving up\n", - delay - 1, reset_type); + delay - 1, pci_reset_types[reset_type]); return -ENOTTY; } @@ -1301,7 +1310,7 @@ static int pci_dev_wait(struct pci_dev *dev, char *reset_type, int timeout) } } pci_info(dev, "not ready %dms after %s; waiting\n", - delay - 1, reset_type); + delay - 1, pci_reset_types[reset_type]); } msleep(delay); @@ -1310,10 +1319,10 @@ static int pci_dev_wait(struct pci_dev *dev, char *reset_type, int timeout) if (delay > PCI_RESET_WAIT) pci_info(dev, "ready %dms after %s\n", delay - 1, - reset_type); + pci_reset_types[reset_type]); else pci_dbg(dev, "ready %dms after %s\n", delay - 1, - reset_type); + pci_reset_types[reset_type]); return 0; } @@ -4465,7 +4474,7 @@ int pcie_flr(struct pci_dev *dev) */ msleep(100); - return pci_dev_wait(dev, "FLR", PCIE_RESET_READY_POLL_MS); + return pci_dev_wait(dev, PCI_DEV_WAIT_FLR, PCIE_RESET_READY_POLL_MS); } EXPORT_SYMBOL_GPL(pcie_flr); @@ -4532,7 +4541,7 @@ static int pci_af_flr(struct pci_dev *dev, bool probe) */ msleep(100); - return pci_dev_wait(dev, "AF_FLR", PCIE_RESET_READY_POLL_MS); + return pci_dev_wait(dev, PCI_DEV_WAIT_AF_FLR, PCIE_RESET_READY_POLL_MS); } /** @@ -4577,7 +4586,7 @@ static int pci_pm_reset(struct pci_dev *dev, bool probe) pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, csr); pci_dev_d3_sleep(dev); - return pci_dev_wait(dev, "PM D3hot->D0", PCIE_RESET_READY_POLL_MS); + return pci_dev_wait(dev, PCI_DEV_WAIT_D3HOT_D0, PCIE_RESET_READY_POLL_MS); } /** @@ -4751,7 +4760,7 @@ static int pci_bus_max_d3cold_delay(const struct pci_bus *bus) * Return 0 on success or -ENOTTY if the first device on the secondary bus * failed to become accessible. */ -int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type) +int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, enum pci_reset_type reset_type) { struct pci_dev *child; int delay; @@ -4885,7 +4894,7 @@ int pci_bridge_secondary_bus_reset(struct pci_dev *dev) { pcibios_reset_secondary_bus(dev); - return pci_bridge_wait_for_secondary_bus(dev, "bus reset"); + return pci_bridge_wait_for_secondary_bus(dev, PCI_DEV_WAIT_BUS_RESET); } EXPORT_SYMBOL_GPL(pci_bridge_secondary_bus_reset); diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index fd44565c47562..88f54d22118dc 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -4,6 +4,15 @@ #include <linux/pci.h> +enum pci_reset_type { + PCI_DEV_WAIT_FLR, + PCI_DEV_WAIT_AF_FLR, + PCI_DEV_WAIT_D3HOT_D0, + PCI_DEV_WAIT_BUS_RESET, + PCI_DEV_WAIT_RESUME, + PCI_DEV_WAIT_DPC, +}; + /* Number of possible devfns: 0.0 to 1f.7 inclusive */ #define MAX_NR_DEVFNS 256 @@ -94,7 +103,7 @@ void pci_msi_init(struct pci_dev *dev); void pci_msix_init(struct pci_dev *dev); bool pci_bridge_d3_possible(struct pci_dev *dev); void pci_bridge_d3_update(struct pci_dev *dev); -int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type); +int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, enum pci_reset_type reset_type); static inline void pci_wakeup_event(struct pci_dev *dev) { diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c index a668820696dc0..306efc399e503 100644 --- a/drivers/pci/pcie/dpc.c +++ b/drivers/pci/pcie/dpc.c @@ -174,7 +174,7 @@ pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) pci_write_config_word(pdev, cap + PCI_EXP_DPC_STATUS, PCI_EXP_DPC_STATUS_TRIGGER); - if (pci_bridge_wait_for_secondary_bus(pdev, "DPC")) { + if (pci_bridge_wait_for_secondary_bus(pdev, PCI_DEV_WAIT_DPC)) { clear_bit(PCI_DPC_RECOVERED, &pdev->priv_flags); ret = PCI_ERS_RESULT_DISCONNECT; } else {