2015-04-08 11:21:35 -07:00
/*
* Copyright ( C ) 2014 - 2015 Broadcom Corporation
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed " as is " WITHOUT ANY WARRANTY of any
* kind , whether express or implied ; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# ifndef _PCIE_IPROC_H
# define _PCIE_IPROC_H
2015-12-04 09:34:59 -08:00
/**
* iProc PCIe interface type
*
* PAXB is the wrapper used in root complex that can be connected to an
* external endpoint device .
*
* PAXC is the wrapper used in root complex dedicated for internal emulated
* endpoint devices .
*/
enum iproc_pcie_type {
IPROC_PCIE_PAXB = 0 ,
IPROC_PCIE_PAXC ,
} ;
2015-10-16 08:18:24 -05:00
/**
* iProc PCIe outbound mapping
* @ set_oarr_size : indicates the OARR size bit needs to be set
* @ axi_offset : offset from the AXI address to the internal address used by
* the iProc PCIe core
* @ window_size : outbound window size
*/
struct iproc_pcie_ob {
bool set_oarr_size ;
resource_size_t axi_offset ;
resource_size_t window_size ;
} ;
2016-01-06 18:04:35 -06:00
struct iproc_msi ;
2015-04-08 11:21:35 -07:00
/**
* iProc PCIe device
2015-12-04 09:34:59 -08:00
*
2015-04-08 11:21:35 -07:00
* @ dev : pointer to device data structure
2015-12-04 09:34:59 -08:00
* @ type : iProc PCIe interface type
* @ reg_offsets : register offsets
2015-04-08 11:21:35 -07:00
* @ base : PCIe host controller I / O register base
2016-01-06 18:04:35 -06:00
* @ base_addr : PCIe host controller register base physical address
2015-07-21 18:29:40 -07:00
* @ sysdata : Per PCI controller data ( ARM - specific )
2015-04-08 11:21:35 -07:00
* @ root_bus : pointer to root bus
* @ phy : optional PHY device that controls the Serdes
2015-09-15 17:39:15 -07:00
* @ map_irq : function callback to map interrupts
2016-01-06 18:04:35 -06:00
* @ need_ob_cfg : indicates SW needs to configure the outbound mapping window
2015-10-16 08:18:24 -05:00
* @ ob : outbound mapping parameters
2016-01-06 18:04:35 -06:00
* @ msi : MSI data
2015-04-08 11:21:35 -07:00
*/
struct iproc_pcie {
struct device * dev ;
2015-12-04 09:34:59 -08:00
enum iproc_pcie_type type ;
const u16 * reg_offsets ;
2015-04-08 11:21:35 -07:00
void __iomem * base ;
2016-01-06 18:04:35 -06:00
phys_addr_t base_addr ;
2015-07-21 18:29:40 -07:00
# ifdef CONFIG_ARM
2015-04-08 11:21:35 -07:00
struct pci_sys_data sysdata ;
2015-07-21 18:29:40 -07:00
# endif
2015-04-08 11:21:35 -07:00
struct pci_bus * root_bus ;
struct phy * phy ;
2015-05-12 23:23:00 +02:00
int ( * map_irq ) ( const struct pci_dev * , u8 , u8 ) ;
2015-10-16 08:18:24 -05:00
bool need_ob_cfg ;
struct iproc_pcie_ob ob ;
2016-01-06 18:04:35 -06:00
struct iproc_msi * msi ;
2015-04-08 11:21:35 -07:00
} ;
2015-05-24 22:37:02 +02:00
int iproc_pcie_setup ( struct iproc_pcie * pcie , struct list_head * res ) ;
2015-04-08 11:21:35 -07:00
int iproc_pcie_remove ( struct iproc_pcie * pcie ) ;
2016-01-06 18:04:35 -06:00
# ifdef CONFIG_PCIE_IPROC_MSI
int iproc_msi_init ( struct iproc_pcie * pcie , struct device_node * node ) ;
void iproc_msi_exit ( struct iproc_pcie * pcie ) ;
# else
static inline int iproc_msi_init ( struct iproc_pcie * pcie ,
struct device_node * node )
{
return - ENODEV ;
}
static inline void iproc_msi_exit ( struct iproc_pcie * pcie )
{
}
# endif
2015-04-08 11:21:35 -07:00
# endif /* _PCIE_IPROC_H */