The mentioned commit from 5.7 does not simply apply to focal master-next: cherry-pick says: Auto-merging arch/s390/pci/pci.c CONFLICT (content): Merge conflict in arch/s390/pci/pci.c Auto-merging arch/s390/include/asm/pci.h warning: inexact rename detection was skipped due to too many files. warning: you may want to set your merge.renamelimit variable to at least 2342 and retry the command. error: could not apply 969ae01bab2f... s390/pci: Fix zpci_alloc_domain() over allocation hint: after resolving the conflicts, mark the corrected paths hint: with 'git add ' or 'git rm ' hint: and commit the result with 'git commit' with status: On branch master-next Your branch is ahead of 'origin/master-next' by 2 commits. (use "git push" to publish your local commits) You are currently cherry-picking commit 969ae01bab2f. (fix conflicts and run "git cherry-pick --continue") (use "git cherry-pick --skip" to skip this patch) (use "git cherry-pick --abort" to cancel the cherry-pick operation) Changes to be committed: modified: arch/s390/include/asm/pci.h Unmerged paths: (use "git add ..." to mark resolution) both modified: arch/s390/pci/pci.c and the git diff is: diff --cc arch/s390/pci/pci.c index 6105b1b6e49b,2b90a90aa81d..000000000000 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@@ -39,11 -40,12 +39,12 @@@ static LIST_HEAD(zpci_list); static DEFINE_SPINLOCK(zpci_list_lock); - static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES); + static DECLARE_BITMAP(zpci_domain, ZPCI_DOMAIN_BITMAP_SIZE); static DEFINE_SPINLOCK(zpci_domain_lock); + static unsigned int zpci_num_domains_allocated; #define ZPCI_IOMAP_ENTRIES \ - min(((unsigned long) ZPCI_NR_DEVICES * PCI_STD_NUM_BARS / 2), \ + min(((unsigned long) ZPCI_NR_DEVICES * PCI_BAR_COUNT / 2), \ ZPCI_IOMAP_MAX_ENTRIES) static DEFINE_SPINLOCK(zpci_iomap_lock); @@@ -606,59 -608,22 +607,63 @@@ void pcibios_disable_device(struct pci_ zpci_debug_exit_device(zdev); } +#ifdef CONFIG_HIBERNATE_CALLBACKS +static int zpci_restore(struct device *dev) +{ + struct pci_dev *pdev = to_pci_dev(dev); + struct zpci_dev *zdev = to_zpci(pdev); + int ret = 0; + + if (zdev->state != ZPCI_FN_STATE_ONLINE) + goto out; + + ret = clp_enable_fh(zdev, ZPCI_NR_DMA_SPACES); + if (ret) + goto out; + + zpci_map_resources(pdev); + zpci_register_ioat(zdev, 0, zdev->start_dma, zdev->end_dma, + (u64) zdev->dma_table); + +out: + return ret; +} + +static int zpci_freeze(struct device *dev) +{ + struct pci_dev *pdev = to_pci_dev(dev); + struct zpci_dev *zdev = to_zpci(pdev); + + if (zdev->state != ZPCI_FN_STATE_ONLINE) + return 0; + + zpci_unregister_ioat(zdev, 0); + zpci_unmap_resources(pdev); + return clp_disable_fh(zdev); +} + +struct dev_pm_ops pcibios_pm_ops = { + .thaw_noirq = zpci_restore, + .freeze_noirq = zpci_freeze, + .restore_noirq = zpci_restore, + .poweroff_noirq = zpci_freeze, +}; +#endif /* CONFIG_HIBERNATE_CALLBACKS */ + static int zpci_alloc_domain(struct zpci_dev *zdev) { + spin_lock(&zpci_domain_lock); + if (zpci_num_domains_allocated > (ZPCI_NR_DEVICES - 1)) { + spin_unlock(&zpci_domain_lock); + pr_err("Adding PCI function %08x failed because the configured limit of %d is reached\n", + zdev->fid, ZPCI_NR_DEVICES); + return -ENOSPC; + } + if (zpci_unique_uid) { zdev->domain = (u16) zdev->uid; - if (zdev->domain >= ZPCI_NR_DEVICES) - return 0; - - spin_lock(&zpci_domain_lock); if (test_bit(zdev->domain, zpci_domain)) { spin_unlock(&zpci_domain_lock); - pr_err("Adding PCI function %08x failed because domain %04x is already assigned\n", - zdev->fid, zdev->domain); return -EEXIST; } set_bit(zdev->domain, zpci_domain); @@@ -665,14 -631,14 +671,21 @@@ spin_unlock(&zpci_domain_lock); return 0; } - - spin_lock(&zpci_domain_lock); + /* + * We can always auto allocate domains below ZPCI_NR_DEVICES. + * There is either a free domain or we have reached the maximum in + * which case we would have bailed earlier. + */ zdev->domain = find_first_zero_bit(zpci_domain, ZPCI_NR_DEVICES); ++<<<<<<< HEAD + if (zdev->domain == ZPCI_NR_DEVICES) { + spin_unlock(&zpci_domain_lock); + return -ENOSPC; + } ++======= ++>>>>>>> 969ae01bab2f... s390/pci: Fix zpci_alloc_domain() over allocation set_bit(zdev->domain, zpci_domain); + zpci_num_domains_allocated++; spin_unlock(&zpci_domain_lock); return 0; }