2015-04-08 21:21:35 +03: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 20:34:59 +03: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 {
2016-11-01 03:38:32 +03:00
IPROC_PCIE_PAXB_BCMA = 0 ,
IPROC_PCIE_PAXB ,
2016-11-01 03:38:41 +03:00
IPROC_PCIE_PAXB_V2 ,
2015-12-04 20:34:59 +03:00
IPROC_PCIE_PAXC ,
2016-11-01 03:38:35 +03:00
IPROC_PCIE_PAXC_V2 ,
2015-12-04 20:34:59 +03:00
} ;
2015-10-16 16:18:24 +03:00
/**
* iProc PCIe outbound mapping
* @ axi_offset : offset from the AXI address to the internal address used by
* the iProc PCIe core
2016-11-01 03:38:37 +03:00
* @ nr_windows : total number of supported outbound mapping windows
2015-10-16 16:18:24 +03:00
*/
struct iproc_pcie_ob {
resource_size_t axi_offset ;
2016-11-01 03:38:37 +03:00
unsigned int nr_windows ;
2015-10-16 16:18:24 +03:00
} ;
2016-11-01 03:38:39 +03:00
/**
* iProc PCIe inbound mapping
* @ nr_regions : total number of supported inbound mapping regions
*/
struct iproc_pcie_ib {
unsigned int nr_regions ;
} ;
2016-11-01 03:38:37 +03:00
struct iproc_pcie_ob_map ;
2016-11-01 03:38:39 +03:00
struct iproc_pcie_ib_map ;
2016-01-07 03:04:35 +03:00
struct iproc_msi ;
2015-04-08 21:21:35 +03:00
/**
* iProc PCIe device
2015-12-04 20:34:59 +03:00
*
2015-04-08 21:21:35 +03:00
* @ dev : pointer to device data structure
2015-12-04 20:34:59 +03:00
* @ type : iProc PCIe interface type
* @ reg_offsets : register offsets
2015-04-08 21:21:35 +03:00
* @ base : PCIe host controller I / O register base
2016-01-07 03:04:35 +03:00
* @ base_addr : PCIe host controller register base physical address
2015-07-22 04:29:40 +03:00
* @ sysdata : Per PCI controller data ( ARM - specific )
2015-04-08 21:21:35 +03:00
* @ root_bus : pointer to root bus
* @ phy : optional PHY device that controls the Serdes
2015-09-16 03:39:15 +03:00
* @ map_irq : function callback to map interrupts
2016-11-01 03:38:30 +03:00
* @ ep_is_internal : indicates an internal emulated endpoint device is connected
2016-11-01 03:38:33 +03:00
* @ has_apb_err_disable : indicates the controller can be configured to prevent
* unsupported request from being forwarded as an APB bus error
2016-11-01 03:38:37 +03:00
*
2016-01-07 03:04:35 +03:00
* @ need_ob_cfg : indicates SW needs to configure the outbound mapping window
2016-11-01 03:38:37 +03:00
* @ ob : outbound mapping related parameters
* @ ob_map : outbound mapping related parameters specific to the controller
*
2016-11-01 03:38:39 +03:00
* @ ib : inbound mapping related parameters
* @ ib_map : outbound mapping region related parameters
*
2016-11-01 03:38:35 +03:00
* @ need_msi_steer : indicates additional configuration of the iProc PCIe
* controller is required to steer MSI writes to external interrupt controller
2016-01-07 03:04:35 +03:00
* @ msi : MSI data
2015-04-08 21:21:35 +03:00
*/
struct iproc_pcie {
struct device * dev ;
2015-12-04 20:34:59 +03:00
enum iproc_pcie_type type ;
2016-11-01 03:38:30 +03:00
u16 * reg_offsets ;
2015-04-08 21:21:35 +03:00
void __iomem * base ;
2016-01-07 03:04:35 +03:00
phys_addr_t base_addr ;
2015-07-22 04:29:40 +03:00
# ifdef CONFIG_ARM
2015-04-08 21:21:35 +03:00
struct pci_sys_data sysdata ;
2015-07-22 04:29:40 +03:00
# endif
2015-04-08 21:21:35 +03:00
struct pci_bus * root_bus ;
struct phy * phy ;
2015-05-13 00:23:00 +03:00
int ( * map_irq ) ( const struct pci_dev * , u8 , u8 ) ;
2016-11-01 03:38:30 +03:00
bool ep_is_internal ;
2016-11-01 03:38:33 +03:00
bool has_apb_err_disable ;
2016-11-01 03:38:37 +03:00
2015-10-16 16:18:24 +03:00
bool need_ob_cfg ;
struct iproc_pcie_ob ob ;
2016-11-01 03:38:37 +03:00
const struct iproc_pcie_ob_map * ob_map ;
2016-11-01 03:38:39 +03:00
struct iproc_pcie_ib ib ;
const struct iproc_pcie_ib_map * ib_map ;
2016-11-01 03:38:35 +03:00
bool need_msi_steer ;
2016-01-07 03:04:35 +03:00
struct iproc_msi * msi ;
2015-04-08 21:21:35 +03:00
} ;
2015-05-24 23:37:02 +03:00
int iproc_pcie_setup ( struct iproc_pcie * pcie , struct list_head * res ) ;
2015-04-08 21:21:35 +03:00
int iproc_pcie_remove ( struct iproc_pcie * pcie ) ;
2016-01-07 03:04:35 +03: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 21:21:35 +03:00
# endif /* _PCIE_IPROC_H */