2018-01-26 21:50:27 +03:00
// SPDX-License-Identifier: GPL-2.0
2016-03-12 00:35:55 +03:00
/*
2016-08-23 00:59:48 +03:00
* Generic PCI host driver common code
*
2016-03-12 00:35:55 +03:00
* Copyright ( C ) 2014 ARM Limited
*
* Author : Will Deacon < will . deacon @ arm . com >
*/
# include <linux/kernel.h>
2020-04-10 02:49:22 +03:00
# include <linux/module.h>
2023-07-14 20:48:25 +03:00
# include <linux/of.h>
2016-03-12 00:35:55 +03:00
# include <linux/of_address.h>
# include <linux/of_pci.h>
2016-06-10 22:55:09 +03:00
# include <linux/pci-ecam.h>
2016-03-12 00:35:55 +03:00
# include <linux/platform_device.h>
2016-05-12 01:34:46 +03:00
static void gen_pci_unmap_cfg ( void * ptr )
{
pci_ecam_free ( ( struct pci_config_window * ) ptr ) ;
}
static struct pci_config_window * gen_pci_init ( struct device * dev ,
2020-05-23 02:48:20 +03:00
struct pci_host_bridge * bridge , const struct pci_ecam_ops * ops )
2016-03-12 00:35:55 +03:00
{
int err ;
2016-05-12 01:34:46 +03:00
struct resource cfgres ;
2020-07-22 05:25:13 +03:00
struct resource_entry * bus ;
2016-05-12 01:34:46 +03:00
struct pci_config_window * cfg ;
2016-03-12 00:35:55 +03:00
2016-05-12 01:34:46 +03:00
err = of_address_to_resource ( dev - > of_node , 0 , & cfgres ) ;
2016-03-12 00:35:55 +03:00
if ( err ) {
dev_err ( dev , " missing \" reg \" property \n " ) ;
2020-05-23 02:48:20 +03:00
return ERR_PTR ( err ) ;
2016-03-12 00:35:55 +03:00
}
2020-07-22 05:25:13 +03:00
bus = resource_list_first_type ( & bridge - > windows , IORESOURCE_BUS ) ;
if ( ! bus )
return ERR_PTR ( - ENODEV ) ;
cfg = pci_ecam_create ( dev , & cfgres , bus - > res , ops ) ;
2020-05-23 02:48:20 +03:00
if ( IS_ERR ( cfg ) )
return cfg ;
2016-03-12 00:35:55 +03:00
2019-07-08 15:33:54 +03:00
err = devm_add_action_or_reset ( dev , gen_pci_unmap_cfg , cfg ) ;
2020-05-23 02:48:20 +03:00
if ( err )
return ERR_PTR ( err ) ;
2016-05-12 01:34:46 +03:00
2020-05-23 02:48:20 +03:00
return cfg ;
2016-03-12 00:35:55 +03:00
}
2020-04-10 02:49:23 +03:00
int pci_host_common_probe ( struct platform_device * pdev )
2016-03-12 00:35:55 +03:00
{
struct device * dev = & pdev - > dev ;
2017-06-28 23:14:00 +03:00
struct pci_host_bridge * bridge ;
2016-05-12 01:34:46 +03:00
struct pci_config_window * cfg ;
2020-04-10 02:49:23 +03:00
const struct pci_ecam_ops * ops ;
2017-06-28 23:14:00 +03:00
2020-04-10 02:49:23 +03:00
ops = of_device_get_match_data ( & pdev - > dev ) ;
if ( ! ops )
return - ENODEV ;
2017-06-28 23:14:00 +03:00
bridge = devm_pci_alloc_host_bridge ( dev , 0 ) ;
if ( ! bridge )
return - ENOMEM ;
2016-03-12 00:35:55 +03:00
2021-01-25 19:29:31 +03:00
platform_set_drvdata ( pdev , bridge ) ;
2016-03-12 00:35:55 +03:00
of_pci_check_probe_only ( ) ;
/* Parse and map our Configuration Space windows */
2020-05-23 02:48:20 +03:00
cfg = gen_pci_init ( dev , bridge , ops ) ;
2016-05-12 01:34:46 +03:00
if ( IS_ERR ( cfg ) )
return PTR_ERR ( cfg ) ;
2016-03-12 00:35:55 +03:00
/* Do not reassign resources if probe only */
if ( ! pci_has_flag ( PCI_PROBE_ONLY ) )
PCI: Remove PCI_REASSIGN_ALL_RSRC use on arm and arm64
On arm, PCI_REASSIGN_ALL_RSRC is used only in pcibios_assign_all_busses(),
which helps decide whether to reconfigure bridge bus numbers. It has
nothing to do with BAR assignments. On arm64 and powerpc,
pcibios_assign_all_busses() tests PCI_REASSIGN_ALL_BUS, which makes more
sense.
Align arm with arm64 and powerpc, so they all use PCI_REASSIGN_ALL_BUS for
pcibios_assign_all_busses().
Remove PCI_REASSIGN_ALL_RSRC from the generic, Tegra, Versatile, and
R-Car drivers. These drivers are used only on arm or arm64, where
PCI_REASSIGN_ALL_RSRC is not used after this change, so removing it
should have no effect.
No functional change intended.
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
2017-11-30 20:21:57 +03:00
pci_add_flags ( PCI_REASSIGN_ALL_BUS ) ;
2016-03-12 00:35:55 +03:00
2017-06-28 23:14:00 +03:00
bridge - > sysdata = cfg ;
2020-04-10 02:49:21 +03:00
bridge - > ops = ( struct pci_ops * ) & ops - > pci_ops ;
2021-03-30 18:11:42 +03:00
bridge - > msi_domain = true ;
2017-06-28 23:14:00 +03:00
2020-05-23 02:48:20 +03:00
return pci_host_probe ( bridge ) ;
2018-05-15 12:07:06 +03:00
}
2020-04-10 02:49:22 +03:00
EXPORT_SYMBOL_GPL ( pci_host_common_probe ) ;
2018-05-15 12:07:06 +03:00
2023-10-20 12:21:07 +03:00
void pci_host_common_remove ( struct platform_device * pdev )
2018-05-15 12:07:06 +03:00
{
2020-05-23 02:48:20 +03:00
struct pci_host_bridge * bridge = platform_get_drvdata ( pdev ) ;
2018-05-15 12:07:06 +03:00
pci_lock_rescan_remove ( ) ;
2020-05-23 02:48:20 +03:00
pci_stop_root_bus ( bridge - > bus ) ;
pci_remove_root_bus ( bridge - > bus ) ;
2018-05-15 12:07:06 +03:00
pci_unlock_rescan_remove ( ) ;
2016-03-12 00:35:55 +03:00
}
2020-04-10 02:49:22 +03:00
EXPORT_SYMBOL_GPL ( pci_host_common_remove ) ;
MODULE_LICENSE ( " GPL v2 " ) ;