[PATCH] powerpc/pseries/iommu: IOMMU table is not initialized for kdump over SR-IOV
kernel test robot
lkp at intel.com
Thu Dec 14 22:56:45 AEDT 2023
Hi Gaurav,
kernel test robot noticed the following build warnings:
[auto build test WARNING on powerpc/next]
[also build test WARNING on powerpc/fixes linus/master v6.7-rc5 next-20231214]
[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/Gaurav-Batra/powerpc-pseries-iommu-IOMMU-table-is-not-initialized-for-kdump-over-SR-IOV/20231214-035436
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
patch link: https://lore.kernel.org/r/20231213195233.10329-1-gbatra%40linux.vnet.ibm.com
patch subject: [PATCH] powerpc/pseries/iommu: IOMMU table is not initialized for kdump over SR-IOV
config: powerpc64-randconfig-r113-20231214 (https://download.01.org/0day-ci/archive/20231214/202312141941.Qraw6P8l-lkp@intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 13.2.0
reproduce: (https://download.01.org/0day-ci/archive/20231214/202312141941.Qraw6P8l-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 at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312141941.Qraw6P8l-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> arch/powerpc/platforms/pseries/iommu.c:753:29: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] liobn @@ got unsigned int [usertype] @@
arch/powerpc/platforms/pseries/iommu.c:753:29: sparse: expected restricted __be32 [usertype] liobn
arch/powerpc/platforms/pseries/iommu.c:753:29: sparse: got unsigned int [usertype]
>> arch/powerpc/platforms/pseries/iommu.c:754:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be64 [usertype] dma_base @@ got unsigned long long [usertype] @@
arch/powerpc/platforms/pseries/iommu.c:754:32: sparse: expected restricted __be64 [usertype] dma_base
arch/powerpc/platforms/pseries/iommu.c:754:32: sparse: got unsigned long long [usertype]
>> arch/powerpc/platforms/pseries/iommu.c:755:33: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] tce_shift @@ got unsigned int [usertype] @@
arch/powerpc/platforms/pseries/iommu.c:755:33: sparse: expected restricted __be32 [usertype] tce_shift
arch/powerpc/platforms/pseries/iommu.c:755:33: sparse: got unsigned int [usertype]
>> arch/powerpc/platforms/pseries/iommu.c:756:36: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] window_shift @@ got unsigned int [usertype] @@
arch/powerpc/platforms/pseries/iommu.c:756:36: sparse: expected restricted __be32 [usertype] window_shift
arch/powerpc/platforms/pseries/iommu.c:756:36: sparse: got unsigned int [usertype]
>> arch/powerpc/platforms/pseries/iommu.c:762:29: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] liobn @@ got unsigned long [addressable] liobn @@
arch/powerpc/platforms/pseries/iommu.c:762:29: sparse: expected restricted __be32 [usertype] liobn
arch/powerpc/platforms/pseries/iommu.c:762:29: sparse: got unsigned long [addressable] liobn
>> arch/powerpc/platforms/pseries/iommu.c:763:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be64 [usertype] dma_base @@ got unsigned long [addressable] offset @@
arch/powerpc/platforms/pseries/iommu.c:763:32: sparse: expected restricted __be64 [usertype] dma_base
arch/powerpc/platforms/pseries/iommu.c:763:32: sparse: got unsigned long [addressable] offset
>> arch/powerpc/platforms/pseries/iommu.c:764:33: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] tce_shift @@ got int @@
arch/powerpc/platforms/pseries/iommu.c:764:33: sparse: expected restricted __be32 [usertype] tce_shift
arch/powerpc/platforms/pseries/iommu.c:764:33: sparse: got int
>> arch/powerpc/platforms/pseries/iommu.c:765:36: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] window_shift @@ got int @@
arch/powerpc/platforms/pseries/iommu.c:765:36: sparse: expected restricted __be32 [usertype] window_shift
arch/powerpc/platforms/pseries/iommu.c:765:36: sparse: got int
>> arch/powerpc/platforms/pseries/iommu.c:800:78: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected unsigned long liobn @@ got restricted __be32 [addressable] [usertype] liobn @@
arch/powerpc/platforms/pseries/iommu.c:800:78: sparse: expected unsigned long liobn
arch/powerpc/platforms/pseries/iommu.c:800:78: sparse: got restricted __be32 [addressable] [usertype] liobn
>> arch/powerpc/platforms/pseries/iommu.c:801:37: sparse: sparse: incorrect type in argument 4 (different base types) @@ expected unsigned long win_addr @@ got restricted __be64 [addressable] [usertype] dma_base @@
arch/powerpc/platforms/pseries/iommu.c:801:37: sparse: expected unsigned long win_addr
arch/powerpc/platforms/pseries/iommu.c:801:37: sparse: got restricted __be64 [addressable] [usertype] dma_base
>> arch/powerpc/platforms/pseries/iommu.c:801:60: sparse: sparse: restricted __be32 degrades to integer
>> arch/powerpc/platforms/pseries/iommu.c:802:37: sparse: sparse: incorrect type in argument 6 (different base types) @@ expected unsigned long page_shift @@ got restricted __be32 [addressable] [usertype] tce_shift @@
arch/powerpc/platforms/pseries/iommu.c:802:37: sparse: expected unsigned long page_shift
arch/powerpc/platforms/pseries/iommu.c:802:37: sparse: got restricted __be32 [addressable] [usertype] tce_shift
>> arch/powerpc/platforms/pseries/iommu.c:808:48: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] tce32_start @@ got restricted __be64 [addressable] [usertype] dma_base @@
arch/powerpc/platforms/pseries/iommu.c:808:48: sparse: expected unsigned int [usertype] tce32_start
arch/powerpc/platforms/pseries/iommu.c:808:48: sparse: got restricted __be64 [addressable] [usertype] dma_base
arch/powerpc/platforms/pseries/iommu.c:809:61: sparse: sparse: restricted __be32 degrades to integer
arch/powerpc/platforms/pseries/iommu.c:1594:77: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected unsigned long liobn @@ got restricted __be32 [addressable] [usertype] liobn @@
arch/powerpc/platforms/pseries/iommu.c:1594:77: sparse: expected unsigned long liobn
arch/powerpc/platforms/pseries/iommu.c:1594:77: sparse: got restricted __be32 [addressable] [usertype] liobn
arch/powerpc/platforms/pseries/iommu.c:1595:37: sparse: sparse: incorrect type in argument 4 (different base types) @@ expected unsigned long win_addr @@ got restricted __be64 [addressable] [usertype] dma_base @@
arch/powerpc/platforms/pseries/iommu.c:1595:37: sparse: expected unsigned long win_addr
arch/powerpc/platforms/pseries/iommu.c:1595:37: sparse: got restricted __be64 [addressable] [usertype] dma_base
arch/powerpc/platforms/pseries/iommu.c:1595:60: sparse: sparse: restricted __be32 degrades to integer
arch/powerpc/platforms/pseries/iommu.c:1596:37: sparse: sparse: incorrect type in argument 6 (different base types) @@ expected unsigned long page_shift @@ got restricted __be32 [addressable] [usertype] tce_shift @@
arch/powerpc/platforms/pseries/iommu.c:1596:37: sparse: expected unsigned long page_shift
arch/powerpc/platforms/pseries/iommu.c:1596:37: sparse: got restricted __be32 [addressable] [usertype] tce_shift
arch/powerpc/platforms/pseries/iommu.c:1602:47: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] tce32_start @@ got restricted __be64 [addressable] [usertype] dma_base @@
arch/powerpc/platforms/pseries/iommu.c:1602:47: sparse: expected unsigned int [usertype] tce32_start
arch/powerpc/platforms/pseries/iommu.c:1602:47: sparse: got restricted __be64 [addressable] [usertype] dma_base
arch/powerpc/platforms/pseries/iommu.c:1603:60: sparse: sparse: restricted __be32 degrades to integer
arch/powerpc/platforms/pseries/iommu.c: note: in included file (through include/linux/preempt.h, include/linux/spinlock.h, include/linux/mmzone.h, ...):
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true
vim +753 arch/powerpc/platforms/pseries/iommu.c
698
699 /*
700 * Find nearest ibm,dma-window (default DMA window) or direct DMA window or
701 * dynamic 64bit DMA window, walking up the device tree.
702 */
703 static struct device_node *pci_dma_find(struct device_node *dn,
704 struct dynamic_dma_window_prop *prop)
705 {
706 const __be32 *default_prop = NULL;
707 const __be32 *ddw_prop = NULL;
708 struct device_node *rdn = NULL;
709 bool default_win = false, ddw_win = false;
710
711 for ( ; dn && PCI_DN(dn); dn = dn->parent) {
712 default_prop = of_get_property(dn, "ibm,dma-window", NULL);
713 if (default_prop) {
714 rdn = dn;
715 default_win = true;
716 }
717 ddw_prop = of_get_property(dn, DIRECT64_PROPNAME, NULL);
718 if (ddw_prop) {
719 rdn = dn;
720 ddw_win = true;
721 break;
722 }
723 ddw_prop = of_get_property(dn, DMA64_PROPNAME, NULL);
724 if (ddw_prop) {
725 rdn = dn;
726 ddw_win = true;
727 break;
728 }
729
730 /* At least found default window, which is the case for normal boot */
731 if (default_win)
732 break;
733 }
734
735 /* For PCI devices there will always be a DMA window, either on the device
736 * or parent bus
737 */
738 WARN_ON(!(default_win | ddw_win));
739
740 /* caller doesn't want to get DMA window property */
741 if (!prop)
742 return rdn;
743
744 /* parse DMA window property. During normal system boot, only default
745 * DMA window is passed in OF. But, for kdump, a dedicated adapter might
746 * have both default and DDW in FDT. In this scenario, DDW takes precedence
747 * over default window.
748 */
749 if (ddw_win) {
750 struct dynamic_dma_window_prop *p;
751
752 p = (struct dynamic_dma_window_prop *)ddw_prop;
> 753 prop->liobn = be32_to_cpu(p->liobn);
> 754 prop->dma_base = be64_to_cpu(p->dma_base);
> 755 prop->tce_shift = be32_to_cpu(p->tce_shift);
> 756 prop->window_shift = be32_to_cpu(p->window_shift);
757 } else if (default_win) {
758 unsigned long offset, size, liobn;
759
760 of_parse_dma_window(rdn, default_prop, &liobn, &offset, &size);
761
> 762 prop->liobn = liobn;
> 763 prop->dma_base = offset;
> 764 prop->tce_shift = IOMMU_PAGE_SHIFT_4K;
> 765 prop->window_shift = order_base_2(size);
766 }
767
768 return rdn;
769 }
770
771 static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
772 {
773 struct iommu_table *tbl;
774 struct device_node *dn, *pdn;
775 struct pci_dn *ppci;
776 struct dynamic_dma_window_prop prop;
777
778 dn = pci_bus_to_OF_node(bus);
779
780 pr_debug("pci_dma_bus_setup_pSeriesLP: setting up bus %pOF\n",
781 dn);
782
783 pdn = pci_dma_find(dn, &prop);
784
785 /* In PPC architecture, there will always be DMA window on bus or one of the
786 * parent bus. During reboot, there will be ibm,dma-window property to
787 * define DMA window. For kdump, there will at least be default window or DDW
788 * or both.
789 */
790
791 ppci = PCI_DN(pdn);
792
793 pr_debug(" parent is %pOF, iommu_table: 0x%p\n",
794 pdn, ppci->table_group);
795
796 if (!ppci->table_group) {
797 ppci->table_group = iommu_pseries_alloc_group(ppci->phb->node);
798 tbl = ppci->table_group->tables[0];
799
> 800 iommu_table_setparms_common(tbl, ppci->phb->bus->number, prop.liobn,
> 801 prop.dma_base, 1ULL << prop.window_shift,
> 802 prop.tce_shift, NULL, &iommu_table_lpar_multi_ops);
803
804 /* Only for normal boot with default window. Doesn't matter even
805 * if we set these with DDW which is 64bit during kdump, since
806 * these will not be used during kdump.
807 */
> 808 ppci->table_group->tce32_start = prop.dma_base;
809 ppci->table_group->tce32_size = 1ULL << prop.window_shift;
810
811 if (!iommu_init_table(tbl, ppci->phb->node, 0, 0))
812 panic("Failed to initialize iommu table");
813
814 iommu_register_group(ppci->table_group,
815 pci_domain_nr(bus), 0);
816 pr_debug(" created table: %p\n", ppci->table_group);
817 }
818 }
819
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
More information about the Linuxppc-dev
mailing list