blob: ed7ca8700d9a6642e0c8a5e648c8d7f8f2861ecf [file] [log] [blame]
/*
* (C) Copyright 2010 Quantenna Communications Inc.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* 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; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#define PCIE_REGION_BASE 0x00000000
#define PCIE_REGION_END 0xCFFFFFFF
#define PCIE_CFG_MSI 1
#define PCIE_CFG_BAR64 0
#define PCIE_ROM_MASK_ADDR 0xE9001030
#define PCIE_BAR_32 0
#define PCIE_BAR_64 (RUBY_BIT(2))
#define PCIE_BAR_PREFETCH (RUBY_BIT(3))
#define PCIE_BAR_CFG(bar64) (PCIE_BAR_PREFETCH | ((bar64) ? PCIE_BAR_64 : PCIE_BAR_32))
#define PCIE_BAR_ATU_MIN_SIZE (0x10000)
#define PCIE_BAR_SYSCTL 0
#define PCIE_BAR_SYSCTL_LEN 0xFFFF
#define PCIE_BAR_SYSCTL_LO 0xE0000000
#define PCIE_BAR_SYSCTL_HI 0x00000000
#define PCIE_BAR_SHMEM 2
#define PCIE_BAR_SHMEM_LEN (PCIE_BAR_ATU_MIN_SIZE - 1)
#define PCIE_BAR_SHMEM_LO (virt_to_bus((void *)RUBY_PCIE_BDA_ADDR))
#define PCIE_BAR_SHMEM_HI 0x00000000
#define PCIE_BAR_DMAREG 3
#define PCIE_BAR_DMAREG_LEN 0xFFFF
#define PCIE_BAR_DMAREG_LO 0xE9000000
#define PCIE_BAR_DMAREG_HI 0x00000000
#define PCIE_QUANTENNA_BBIC3 (0x00081bb5)
#define PCIE_BASE_ADDRESS (0xe9000000)
#define PCIE_CMDSTS (PCIE_BASE_ADDRESS + 0x04)
#define PCIE_CAP_PTR (PCIE_BASE_ADDRESS + 0x34)
#define PCIE_GEN2_CTL (PCIE_BASE_ADDRESS + 0x80C)
#define PCIE_ATU_VIEWPORT (PCIE_BASE_ADDRESS + 0x900)
#define PCIE_ATU_CTRL1 (PCIE_ATU_VIEWPORT + 0x04)
#define PCIE_ATU_CTRL2 (PCIE_ATU_VIEWPORT + 0x08)
#define PCIE_ATU_BASE_LOW (PCIE_ATU_VIEWPORT + 0x0C)
#define PCIE_ATU_BASE_HIGH (PCIE_ATU_VIEWPORT + 0x10)
#define PCIE_ATU_BASE_LIMIT (PCIE_ATU_VIEWPORT + 0x14)
#define PCIE_ATU_TGT_LOW (PCIE_ATU_VIEWPORT + 0x18)
#define PCIE_ATU_TGT_HIGH (PCIE_ATU_VIEWPORT + 0x1C)
#define PCIE_DMA_BASE (PCIE_BASE_ADDRESS + 0x970)
#define PCIE_DMA_WR_ENABLE (PCIE_BASE_ADDRESS + 0x97C)
#define PCIE_DMA_WR_DOORBELL (PCIE_BASE_ADDRESS + 0x980)
#define PCIE_DMA_WR_CHWTLOW (PCIE_BASE_ADDRESS + 0x988)
#define PCIE_DMA_WR_CHWTHIG (PCIE_BASE_ADDRESS + 0x98C)
#define PCIE_DMA_RD_ENABLE (PCIE_BASE_ADDRESS + 0x99C)
#define PCIE_DMA_RD_DOORBELL (PCIE_BASE_ADDRESS + 0x9A0)
#define PCIE_DMA_RD_CHWTLOW (PCIE_BASE_ADDRESS + 0x9A8)
#define PCIE_DMA_RD_CHWTHIG (PCIE_BASE_ADDRESS + 0x9AC)
#define PCIE_DMA_WR_INTSTS (PCIE_BASE_ADDRESS + 0x9BC)
#define PCIE_DMA_WR_INTMASK (PCIE_BASE_ADDRESS + 0x9C4)
#define PCIE_DMA_WR_INTCLER (PCIE_BASE_ADDRESS + 0x9C8)
#define PCIE_DMA_RD_INTSTS (PCIE_BASE_ADDRESS + 0xA10)
#define PCIE_DMA_RD_INTMASK (PCIE_BASE_ADDRESS + 0xA18)
#define PCIE_DMA_RD_INTCLER (PCIE_BASE_ADDRESS + 0xA1C)
#define PCIE_DMA_RD_INT_ERR_STS_LO (PCIE_BASE_ADDRESS + 0xA24)
#define PCIE_DMA_RD_INT_ERR_STS_HI (PCIE_BASE_ADDRESS + 0xA28)
#define PCIE_DMA_CHNL_CONTEXT (PCIE_BASE_ADDRESS + 0xA6C)
#define PCIE_DMA_CHNL_CNTRL (PCIE_BASE_ADDRESS + 0xA70)
#define PCIE_DMA_XFR_SIZE (PCIE_BASE_ADDRESS + 0xA78)
#define PCIE_DMA_SAR_LOW (PCIE_BASE_ADDRESS + 0xA7C)
#define PCIE_DMA_SAR_HIGH (PCIE_BASE_ADDRESS + 0xA80)
#define PCIE_DMA_DAR_LOW (PCIE_BASE_ADDRESS + 0xA84)
#define PCIE_DMA_DAR_HIGH (PCIE_BASE_ADDRESS + 0xA88)
#define PCIE_DMA_LLPTR_LOW (PCIE_BASE_ADDRESS + 0xA8C)
#define PCIE_DMA_LLPTR_HIGH (PCIE_BASE_ADDRESS + 0xA90)
#define PCIE_DMA_RD_DONE_STS(ch) (1 << (ch))
#define PCIE_DMA_RD_ABORT_STS(ch) ((PCIE_DMA_RD_DONE_STS(ch)) << 16)
#define PCIE_DMA_RD_DONE_STS_CLR(ch) (1 << (ch))
#define PCIE_DMA_RD_ABORT_STS_CLR(ch) ((PCIE_DMA_RD_DONE_STS_CLR(ch)) << 16)
#define PCIE_DMA_RD_INT_WRITE_ERR_STS(err, ch) (((err) & (1 << (ch))) & 0x000000FF)
#define PCIE_DMA_RD_INT_LLE_ERR_STS(err, ch) ((((err) >> 16) & 0x000000FF) & (1 << (ch)))
#define PCIE_LINKUP (RUBY_BIT(8)|RUBY_BIT(9))
#if !TOPAZ_FPGA_PLATFORM
#define PCIE_DEFAULT_CFG0 (0x7fe06410)
#else
#define PCIE_DEFAULT_CFG0 (0xff3c9410)
#endif
/* ATU defines */
#define PCIE_ATU_MEMREGION 0x00000000
#define PCIE_ATU_BAR_MATCH 0xC0000000
#define PCIE_ATU_BAR_MIN_SIZE 0x00010000 /* 64k */
#define PCIE_ATU_BAR_EN(n) (((n) << 8) | PCIE_ATU_BAR_MATCH)
/* Shared memory ATU BAR setup */
#define PCIE_SHMEM_REGION RUBY_PCIE_ATU_IB_REGION(0)
#define PCIE_SHMEM_ENABLE (PCIE_ATU_BAR_EN(PCIE_BAR_SHMEM))
/* Syscfg ATU BAR setup */
#define PCIE_SYSCTL_REGION RUBY_PCIE_ATU_IB_REGION(1)
#define PCIE_SYSCTL_ENABLE (PCIE_ATU_BAR_EN(PCIE_BAR_SYSCTL))
/* PCIe DMA register setup */
#define PCIE_DMAREG_REGION RUBY_PCIE_ATU_IB_REGION(2)
#define PCIE_DMAREG_ENABLE (PCIE_ATU_BAR_EN(PCIE_BAR_DMAREG))
/* Size of MSI region */
#define PCIE_MSIMEM_SIZE PCIE_ATU_BAR_MIN_SIZE
#define PCIE_MSIMEM_SIZE_MASK (PCIE_ATU_BAR_MIN_SIZE - 1)
/* Size of Shared memory in Host */
#define PCIE_HOSTBD_SIZE (2 * PCIE_ATU_BAR_MIN_SIZE)
#define PCIE_HOSTBD_SIZE_MASK (PCIE_HOSTBD_SIZE - 1)
/* Outbound Host Memory translation setup */
#define PCIE_HOSTMEM_EP_START PCIE_REGION_BASE
#define PCIE_HOSTMEM_EP_END 0xBFFFFFFF
#define PCIE_HOSTMEM_DMA_MASK (PCIE_HOSTMEM_EP_END - PCIE_HOSTMEM_EP_START)
#define PCIE_HOSTMEM_REGION (RUBY_PCIE_ATU_OB_REGION(1))
#define PCIE_HOSTMEM_EP_START_LO PCIE_HOSTMEM_EP_START
#define PCIE_HOSTMEM_EP_START_HI 0x00000000
#define PCIE_HOSTMEM_START_LO 0x00000000
#define PCIE_HOSTMEM_START_HI 0x00000000
#define PCIE_HOSTMEM_REGION_ENABLE RUBY_PCIE_ATU_OB_ENABLE
#define PCIE_HOSTMEM_ADDR_ALIGN_MASK (0xffff0000)
/* Outbound MSI ATU setup */
/* MSI region is the upper 64kbytes of the PCIE slave area */
#define PCIE_MSI_BASE 0xE9000050
#define PCIE_MSI_CAP (PCIE_MSI_BASE + 0x0)
#define PCIE_MSI_LOW_ADDR (PCIE_MSI_BASE + 0x4)
#define PCIE_MSI_HIG_ADDR (PCIE_MSI_BASE + 0x8)
#define PCIE_MSI_REGION (RUBY_PCIE_ATU_OB_REGION(0))
#define PCIE_MSI_REGION_ENABLE RUBY_PCIE_ATU_OB_ENABLE
#define MSI_EN RUBY_BIT(0)
#define MSI_64_EN RUBY_BIT(7)
#define PCIE_MSI_EP_END PCIE_REGION_END
#define PCIE_MSI_EP_START_LO (PCIE_REGION_END - PCIE_MSIMEM_SIZE_MASK)
#define PCIE_MSI_EP_START_HI 0x00000000
#define PCIE_MSI_ADDR_OFFSET(a) ((a) & 0xFFFF)
#define PCIE_MSI_ADDR_ALIGN(a) ((a) & (~0xFFFF))
/* Outbound Host buffer descriptor ATU setup */
/* Host BD region is the 128kbytes area just below MSI region */
#define PCIE_HOSTBD_EP_END (PCIE_REGION_END - PCIE_MSIMEM_SIZE)
#define PCIE_HOSTBD_EP_START_LO (PCIE_HOSTBD_EP_END - PCIE_HOSTBD_SIZE_MASK)
#define PCIE_HOSTBD_EP_START_HI 0x00000000
#define PCIE_HOSTBD_REGION (RUBY_PCIE_ATU_OB_REGION(2))
/* Default pcie lzma load addr */
#define PCIE_FW_LZMA_LOAD QTNBOOT_COPY_DRAM_ADDR
/* pcie Root Complex defines */
#define SYS_RST_PCIE (0x00002000)
#define SYS_RST_IOSS (0x00000020)
#if !TOPAZ_FPGA_PLATFORM
#define PCIE_CFG0_DEFAULT_VALUE (0x7fe06410)
#define PCIE_CFG_RC_MODE (0x4)
#else
#define PCIE_CFG0_DEFAULT_VALUE (0xff3c9400)
#define PCIE_CFG_RC_MODE (0x14)
#endif
#define PCIE_IO_EN RUBY_BIT(0)
#define PCIE_MEM_EN RUBY_BIT(1)
#define PCIE_BUS_MASTER_EN RUBY_BIT(2)
#define BUS_SCAN_TRY_MAX 1000
#define PCIE_DEV_LINKUP_MASK 0x700
void pcie_ep_early_init(uint32_t flags);
void board_pcie_init(size_t memsz, uint32_t flags );