Message ID | 20240802-pci-bridge-d3-v5-2-2426dd9e8e27@linaro.org (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | PCI: Allow D3Hot for PCI bridges in Devicetree based platforms | expand |
Hi Manivannan, kernel test robot noticed the following build errors: [auto build test ERROR on 705c1da8fa4816fb0159b5602fef1df5946a3ee2] url: https://github.com/intel-lab-lkp/linux/commits/Manivannan-Sadhasivam-via-B4-Relay/PCI-portdrv-Make-use-of-pci_dev-bridge_d3-for-checking-the-D3-possibility/20240803-074434 base: 705c1da8fa4816fb0159b5602fef1df5946a3ee2 patch link: https://lore.kernel.org/r/20240802-pci-bridge-d3-v5-2-2426dd9e8e27%40linaro.org patch subject: [PATCH v5 2/4] PCI: Rename pci_bridge_d3_possible() to pci_bridge_d3_allowed() config: i386-allyesconfig (https://download.01.org/0day-ci/archive/20240803/202408031855.TEPJlfzl-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240803/202408031855.TEPJlfzl-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/202408031855.TEPJlfzl-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/gpu/drm/radeon/radeon_atpx_handler.c: In function 'radeon_atpx_detect': >> drivers/gpu/drm/radeon/radeon_atpx_handler.c:568:59: error: 'struct pci_dev' has no member named 'bridge_d3' 568 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ^~ drivers/gpu/drm/radeon/radeon_atpx_handler.c:578:59: error: 'struct pci_dev' has no member named 'bridge_d3' 578 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ^~ -- drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c: In function 'amdgpu_atpx_detect': >> drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c:628:59: error: 'struct pci_dev' has no member named 'bridge_d3' 628 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ^~ drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c:638:59: error: 'struct pci_dev' has no member named 'bridge_d3' 638 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ^~ -- drivers/gpu/drm/nouveau/nouveau_acpi.c: In function 'nouveau_dsm_pci_probe': >> drivers/gpu/drm/nouveau/nouveau_acpi.c:229:32: error: 'struct pci_dev' has no member named 'bridge_d3' 229 | if (parent_pdev->bridge_d3) | ^~ vim +568 drivers/gpu/drm/radeon/radeon_atpx_handler.c 6a9ee8af344e3b Dave Airlie 2010-02-01 545 82e029357d4726 Alex Deucher 2012-08-16 546 /** 82e029357d4726 Alex Deucher 2012-08-16 547 * radeon_atpx_detect - detect whether we have PX 82e029357d4726 Alex Deucher 2012-08-16 548 * 82e029357d4726 Alex Deucher 2012-08-16 549 * Check if we have a PX system (all asics). 82e029357d4726 Alex Deucher 2012-08-16 550 * Returns true if we have a PX system, false if not. 82e029357d4726 Alex Deucher 2012-08-16 551 */ 6a9ee8af344e3b Dave Airlie 2010-02-01 552 static bool radeon_atpx_detect(void) 6a9ee8af344e3b Dave Airlie 2010-02-01 553 { 6a9ee8af344e3b Dave Airlie 2010-02-01 554 char acpi_method_name[255] = { 0 }; 6a9ee8af344e3b Dave Airlie 2010-02-01 555 struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name}; 6a9ee8af344e3b Dave Airlie 2010-02-01 556 struct pci_dev *pdev = NULL; 6a9ee8af344e3b Dave Airlie 2010-02-01 557 bool has_atpx = false; 6a9ee8af344e3b Dave Airlie 2010-02-01 558 int vga_count = 0; bcfdd5d5105087 Alex Deucher 2016-11-28 559 bool d3_supported = false; bcfdd5d5105087 Alex Deucher 2016-11-28 560 struct pci_dev *parent_pdev; 6a9ee8af344e3b Dave Airlie 2010-02-01 561 6a9ee8af344e3b Dave Airlie 2010-02-01 562 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { 6a9ee8af344e3b Dave Airlie 2010-02-01 563 vga_count++; 6a9ee8af344e3b Dave Airlie 2010-02-01 564 6a9ee8af344e3b Dave Airlie 2010-02-01 565 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); bcfdd5d5105087 Alex Deucher 2016-11-28 566 bcfdd5d5105087 Alex Deucher 2016-11-28 567 parent_pdev = pci_upstream_bridge(pdev); bcfdd5d5105087 Alex Deucher 2016-11-28 @568 d3_supported |= parent_pdev && parent_pdev->bridge_d3; 6a9ee8af344e3b Dave Airlie 2010-02-01 569 } 6a9ee8af344e3b Dave Airlie 2010-02-01 570 e9a4099a59cc59 Alex Deucher 2014-04-15 571 /* some newer PX laptops mark the dGPU as a non-VGA display device */ e9a4099a59cc59 Alex Deucher 2014-04-15 572 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { e9a4099a59cc59 Alex Deucher 2014-04-15 573 vga_count++; e9a4099a59cc59 Alex Deucher 2014-04-15 574 e9a4099a59cc59 Alex Deucher 2014-04-15 575 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); bcfdd5d5105087 Alex Deucher 2016-11-28 576 bcfdd5d5105087 Alex Deucher 2016-11-28 577 parent_pdev = pci_upstream_bridge(pdev); bcfdd5d5105087 Alex Deucher 2016-11-28 578 d3_supported |= parent_pdev && parent_pdev->bridge_d3; e9a4099a59cc59 Alex Deucher 2014-04-15 579 } e9a4099a59cc59 Alex Deucher 2014-04-15 580 6a9ee8af344e3b Dave Airlie 2010-02-01 581 if (has_atpx && vga_count == 2) { 492b49a2f21a7c Alex Deucher 2012-08-16 582 acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); 7ca85295d8cc28 Joe Perches 2017-02-28 583 pr_info("vga_switcheroo: detected switching method %s handle\n", 6a9ee8af344e3b Dave Airlie 2010-02-01 584 acpi_method_name); 6a9ee8af344e3b Dave Airlie 2010-02-01 585 radeon_atpx_priv.atpx_detected = true; bcfdd5d5105087 Alex Deucher 2016-11-28 586 radeon_atpx_priv.bridge_pm_usable = d3_supported; 69ee9742f945cd Alex Deucher 2016-07-27 587 radeon_atpx_init(); 6a9ee8af344e3b Dave Airlie 2010-02-01 588 return true; 6a9ee8af344e3b Dave Airlie 2010-02-01 589 } 6a9ee8af344e3b Dave Airlie 2010-02-01 590 return false; 6a9ee8af344e3b Dave Airlie 2010-02-01 591 } 6a9ee8af344e3b Dave Airlie 2010-02-01 592
On Sat, Aug 03, 2024 at 07:03:56PM +0800, kernel test robot wrote: > Hi Manivannan, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on 705c1da8fa4816fb0159b5602fef1df5946a3ee2] > > url: https://github.com/intel-lab-lkp/linux/commits/Manivannan-Sadhasivam-via-B4-Relay/PCI-portdrv-Make-use-of-pci_dev-bridge_d3-for-checking-the-D3-possibility/20240803-074434 > base: 705c1da8fa4816fb0159b5602fef1df5946a3ee2 > patch link: https://lore.kernel.org/r/20240802-pci-bridge-d3-v5-2-2426dd9e8e27%40linaro.org > patch subject: [PATCH v5 2/4] PCI: Rename pci_bridge_d3_possible() to pci_bridge_d3_allowed() > config: i386-allyesconfig (https://download.01.org/0day-ci/archive/20240803/202408031855.TEPJlfzl-lkp@intel.com/config) > compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240803/202408031855.TEPJlfzl-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/202408031855.TEPJlfzl-lkp@intel.com/ > > All errors (new ones prefixed by >>): > > drivers/gpu/drm/radeon/radeon_atpx_handler.c: In function 'radeon_atpx_detect': > >> drivers/gpu/drm/radeon/radeon_atpx_handler.c:568:59: error: 'struct pci_dev' has no member named 'bridge_d3' > 568 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; > | ^~ > drivers/gpu/drm/radeon/radeon_atpx_handler.c:578:59: error: 'struct pci_dev' has no member named 'bridge_d3' > 578 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; > | ^~ > -- > drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c: In function 'amdgpu_atpx_detect': > >> drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c:628:59: error: 'struct pci_dev' has no member named 'bridge_d3' > 628 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; > | ^~ > drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c:638:59: error: 'struct pci_dev' has no member named 'bridge_d3' > 638 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; > | ^~ > -- > drivers/gpu/drm/nouveau/nouveau_acpi.c: In function 'nouveau_dsm_pci_probe': > >> drivers/gpu/drm/nouveau/nouveau_acpi.c:229:32: error: 'struct pci_dev' has no member named 'bridge_d3' > 229 | if (parent_pdev->bridge_d3) > | ^~ Ok, there seems to be a couple of drivers making use of pci_dev::bridge_d3 to check if D3Cold is supported or not. And this further strengthens the fact that PCI core should not rely on pci_bridge_d3_possible() as proposed in patch 1. - Mani > > > vim +568 drivers/gpu/drm/radeon/radeon_atpx_handler.c > > 6a9ee8af344e3b Dave Airlie 2010-02-01 545 > 82e029357d4726 Alex Deucher 2012-08-16 546 /** > 82e029357d4726 Alex Deucher 2012-08-16 547 * radeon_atpx_detect - detect whether we have PX > 82e029357d4726 Alex Deucher 2012-08-16 548 * > 82e029357d4726 Alex Deucher 2012-08-16 549 * Check if we have a PX system (all asics). > 82e029357d4726 Alex Deucher 2012-08-16 550 * Returns true if we have a PX system, false if not. > 82e029357d4726 Alex Deucher 2012-08-16 551 */ > 6a9ee8af344e3b Dave Airlie 2010-02-01 552 static bool radeon_atpx_detect(void) > 6a9ee8af344e3b Dave Airlie 2010-02-01 553 { > 6a9ee8af344e3b Dave Airlie 2010-02-01 554 char acpi_method_name[255] = { 0 }; > 6a9ee8af344e3b Dave Airlie 2010-02-01 555 struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name}; > 6a9ee8af344e3b Dave Airlie 2010-02-01 556 struct pci_dev *pdev = NULL; > 6a9ee8af344e3b Dave Airlie 2010-02-01 557 bool has_atpx = false; > 6a9ee8af344e3b Dave Airlie 2010-02-01 558 int vga_count = 0; > bcfdd5d5105087 Alex Deucher 2016-11-28 559 bool d3_supported = false; > bcfdd5d5105087 Alex Deucher 2016-11-28 560 struct pci_dev *parent_pdev; > 6a9ee8af344e3b Dave Airlie 2010-02-01 561 > 6a9ee8af344e3b Dave Airlie 2010-02-01 562 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { > 6a9ee8af344e3b Dave Airlie 2010-02-01 563 vga_count++; > 6a9ee8af344e3b Dave Airlie 2010-02-01 564 > 6a9ee8af344e3b Dave Airlie 2010-02-01 565 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); > bcfdd5d5105087 Alex Deucher 2016-11-28 566 > bcfdd5d5105087 Alex Deucher 2016-11-28 567 parent_pdev = pci_upstream_bridge(pdev); > bcfdd5d5105087 Alex Deucher 2016-11-28 @568 d3_supported |= parent_pdev && parent_pdev->bridge_d3; > 6a9ee8af344e3b Dave Airlie 2010-02-01 569 } > 6a9ee8af344e3b Dave Airlie 2010-02-01 570 > e9a4099a59cc59 Alex Deucher 2014-04-15 571 /* some newer PX laptops mark the dGPU as a non-VGA display device */ > e9a4099a59cc59 Alex Deucher 2014-04-15 572 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { > e9a4099a59cc59 Alex Deucher 2014-04-15 573 vga_count++; > e9a4099a59cc59 Alex Deucher 2014-04-15 574 > e9a4099a59cc59 Alex Deucher 2014-04-15 575 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); > bcfdd5d5105087 Alex Deucher 2016-11-28 576 > bcfdd5d5105087 Alex Deucher 2016-11-28 577 parent_pdev = pci_upstream_bridge(pdev); > bcfdd5d5105087 Alex Deucher 2016-11-28 578 d3_supported |= parent_pdev && parent_pdev->bridge_d3; > e9a4099a59cc59 Alex Deucher 2014-04-15 579 } > e9a4099a59cc59 Alex Deucher 2014-04-15 580 > 6a9ee8af344e3b Dave Airlie 2010-02-01 581 if (has_atpx && vga_count == 2) { > 492b49a2f21a7c Alex Deucher 2012-08-16 582 acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); > 7ca85295d8cc28 Joe Perches 2017-02-28 583 pr_info("vga_switcheroo: detected switching method %s handle\n", > 6a9ee8af344e3b Dave Airlie 2010-02-01 584 acpi_method_name); > 6a9ee8af344e3b Dave Airlie 2010-02-01 585 radeon_atpx_priv.atpx_detected = true; > bcfdd5d5105087 Alex Deucher 2016-11-28 586 radeon_atpx_priv.bridge_pm_usable = d3_supported; > 69ee9742f945cd Alex Deucher 2016-07-27 587 radeon_atpx_init(); > 6a9ee8af344e3b Dave Airlie 2010-02-01 588 return true; > 6a9ee8af344e3b Dave Airlie 2010-02-01 589 } > 6a9ee8af344e3b Dave Airlie 2010-02-01 590 return false; > 6a9ee8af344e3b Dave Airlie 2010-02-01 591 } > 6a9ee8af344e3b Dave Airlie 2010-02-01 592 > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 004575091596..0f260cdc4592 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -1429,12 +1429,12 @@ void pci_acpi_setup(struct device *dev, struct acpi_device *adev) device_set_wakeup_capable(dev, true); /* - * For bridges that can do D3 we enable wake automatically (as - * we do for the power management itself in that case). The + * For bridges that are allowed to do D3, we enable wake automatically + * (as we do for the power management itself in that case). The * reason is that the bridge may have additional methods such as * _DSW that need to be called. */ - if (pci_dev->bridge_d3) + if (pci_dev->bridge_d3_allowed) device_wakeup_enable(dev); acpi_pci_wakeup(pci_dev, false); @@ -1452,7 +1452,7 @@ void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev) pci_acpi_remove_pm_notifier(adev); if (adev->wakeup.flags.valid) { acpi_device_power_remove_dependent(adev, dev); - if (pci_dev->bridge_d3) + if (pci_dev->bridge_d3_allowed) device_wakeup_disable(dev); device_set_wakeup_capable(dev, false); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e5f243dd4288..0edc4e448c2d 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -2967,13 +2967,13 @@ static const struct dmi_system_id bridge_d3_blacklist[] = { }; /** - * pci_bridge_d3_possible - Is it possible to put the bridge into D3 + * pci_bridge_d3_allowed - Is it allowed to put the bridge into D3 * @bridge: Bridge to check * - * This function checks if it is possible to move the bridge to D3. + * This function checks if the bridge is allowed to move to D3. * Currently we only allow D3 for recent enough PCIe ports and Thunderbolt. */ -bool pci_bridge_d3_possible(struct pci_dev *bridge) +bool pci_bridge_d3_allowed(struct pci_dev *bridge) { if (!pci_is_pcie(bridge)) return false; @@ -3060,14 +3060,14 @@ void pci_bridge_d3_update(struct pci_dev *dev) bool d3cold_ok = true; bridge = pci_upstream_bridge(dev); - if (!bridge || !pci_bridge_d3_possible(bridge)) + if (!bridge || !pci_bridge_d3_allowed(bridge)) return; /* * If D3 is currently allowed for the bridge, removing one of its * children won't change that. */ - if (remove && bridge->bridge_d3) + if (remove && bridge->bridge_d3_allowed) return; /* @@ -3087,12 +3087,12 @@ void pci_bridge_d3_update(struct pci_dev *dev) * so we need to go through all children to find out if one of them * continues to block D3. */ - if (d3cold_ok && !bridge->bridge_d3) + if (d3cold_ok && !bridge->bridge_d3_allowed) pci_walk_bus(bridge->subordinate, pci_dev_check_d3cold, &d3cold_ok); - if (bridge->bridge_d3 != d3cold_ok) { - bridge->bridge_d3 = d3cold_ok; + if (bridge->bridge_d3_allowed != d3cold_ok) { + bridge->bridge_d3_allowed = d3cold_ok; /* Propagate change to upstream bridges */ pci_bridge_d3_update(bridge); } @@ -3167,7 +3167,7 @@ void pci_pm_init(struct pci_dev *dev) dev->pm_cap = pm; dev->d3hot_delay = PCI_PM_D3HOT_WAIT; dev->d3cold_delay = PCI_PM_D3COLD_WAIT; - dev->bridge_d3 = pci_bridge_d3_possible(dev); + dev->bridge_d3_allowed = pci_bridge_d3_allowed(dev); dev->d3cold_allowed = true; dev->d1_support = false; diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 17fed1846847..53ca75639201 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -92,7 +92,7 @@ void pci_pm_init(struct pci_dev *dev); void pci_ea_init(struct pci_dev *dev); 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); +bool pci_bridge_d3_allowed(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); @@ -113,7 +113,7 @@ static inline bool pci_power_manageable(struct pci_dev *pci_dev) * Currently we allow normal PCI devices and PCI bridges transition * into D3 if their bridge_d3 is set. */ - return !pci_has_subordinate(pci_dev) || pci_dev->bridge_d3; + return !pci_has_subordinate(pci_dev) || pci_dev->bridge_d3_allowed; } static inline bool pcie_downstream_port(const struct pci_dev *dev) diff --git a/drivers/pci/pcie/portdrv.c b/drivers/pci/pcie/portdrv.c index 1f02e5d7b2e9..8401a0f7b394 100644 --- a/drivers/pci/pcie/portdrv.c +++ b/drivers/pci/pcie/portdrv.c @@ -632,7 +632,7 @@ __setup("pcie_ports=", pcie_port_setup); #ifdef CONFIG_PM static int pcie_port_runtime_suspend(struct device *dev) { - if (!to_pci_dev(dev)->bridge_d3) + if (!to_pci_dev(dev)->bridge_d3_allowed) return -EBUSY; return pcie_port_device_runtime_suspend(dev); @@ -641,11 +641,11 @@ static int pcie_port_runtime_suspend(struct device *dev) static int pcie_port_runtime_idle(struct device *dev) { /* - * Assume the PCI core has set bridge_d3 whenever it thinks the port - * should be good to go to D3. Everything else, including moving + * Assume the PCI core has set bridge_d3_allowed whenever it thinks the + * port should be good to go to D3. Everything else, including moving * the port to D3, is handled by the PCI core. */ - return to_pci_dev(dev)->bridge_d3 ? 0 : -EBUSY; + return to_pci_dev(dev)->bridge_d3_allowed ? 0 : -EBUSY; } static const struct dev_pm_ops pcie_portdrv_pm_ops = { @@ -702,7 +702,7 @@ static int pcie_portdrv_probe(struct pci_dev *dev, dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE | DPM_FLAG_SMART_SUSPEND); - if (dev->bridge_d3) { + if (dev->bridge_d3_allowed) { /* * Keep the port resumed 100ms to make sure things like * config space accesses from userspace (lspci) will not @@ -720,7 +720,7 @@ static int pcie_portdrv_probe(struct pci_dev *dev, static void pcie_portdrv_remove(struct pci_dev *dev) { - if (dev->bridge_d3) { + if (dev->bridge_d3_allowed) { pm_runtime_forbid(&dev->dev); pm_runtime_get_noresume(&dev->dev); pm_runtime_dont_use_autosuspend(&dev->dev); @@ -733,7 +733,7 @@ static void pcie_portdrv_remove(struct pci_dev *dev) static void pcie_portdrv_shutdown(struct pci_dev *dev) { - if (dev->bridge_d3) { + if (dev->bridge_d3_allowed) { pm_runtime_forbid(&dev->dev); pm_runtime_get_noresume(&dev->dev); pm_runtime_dont_use_autosuspend(&dev->dev); diff --git a/include/linux/pci.h b/include/linux/pci.h index 16493426a04f..2a48c88512e1 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -375,7 +375,7 @@ struct pci_dev { unsigned int d2_support:1; /* Low power state D2 is supported */ unsigned int no_d1d2:1; /* D1 and D2 are forbidden */ unsigned int no_d3cold:1; /* D3cold is forbidden */ - unsigned int bridge_d3:1; /* Allow D3 for bridge */ + unsigned int bridge_d3_allowed:1; /* Allow D3 for bridge */ unsigned int d3cold_allowed:1; /* D3cold is allowed by user */ unsigned int mmio_always_on:1; /* Disallow turning off io/mem decoding during BAR sizing */