1b994efbdSBin Meng /* 2b994efbdSBin Meng * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 3b994efbdSBin Meng * 4b994efbdSBin Meng * SPDX-License-Identifier: GPL-2.0+ 5b994efbdSBin Meng */ 6b994efbdSBin Meng 7b994efbdSBin Meng #ifndef _QUARK_H_ 8b994efbdSBin Meng #define _QUARK_H_ 9b994efbdSBin Meng 10b994efbdSBin Meng /* Message Bus Ports */ 11b994efbdSBin Meng #define MSG_PORT_MEM_ARBITER 0x00 12b994efbdSBin Meng #define MSG_PORT_HOST_BRIDGE 0x03 13b994efbdSBin Meng #define MSG_PORT_RMU 0x04 14b994efbdSBin Meng #define MSG_PORT_MEM_MGR 0x05 15b06862b9SBin Meng #define MSG_PORT_USB_AFE 0x14 16316fd392SBin Meng #define MSG_PORT_PCIE_AFE 0x16 17b994efbdSBin Meng #define MSG_PORT_SOC_UNIT 0x31 18b994efbdSBin Meng 19b162257dSBin Meng /* Port 0x00: Memory Arbiter Message Port Registers */ 20b162257dSBin Meng 21b162257dSBin Meng /* Enhanced Configuration Space */ 22b162257dSBin Meng #define AEC_CTRL 0x00 23b162257dSBin Meng 24b162257dSBin Meng /* Port 0x03: Host Bridge Message Port Registers */ 25b162257dSBin Meng 26f82a7840SBin Meng /* Host Miscellaneous Controls 2 */ 27f82a7840SBin Meng #define HMISC2 0x03 28f82a7840SBin Meng 29f82a7840SBin Meng #define HMISC2_SEGE 0x00000002 30f82a7840SBin Meng #define HMISC2_SEGF 0x00000004 31f82a7840SBin Meng #define HMISC2_SEGAB 0x00000010 32f82a7840SBin Meng 33b994efbdSBin Meng /* Host Memory I/O Boundary */ 34b994efbdSBin Meng #define HM_BOUND 0x08 35693b5f6cSBin Meng #define HM_BOUND_LOCK 0x00000001 36b994efbdSBin Meng 37b162257dSBin Meng /* Extended Configuration Space */ 38b162257dSBin Meng #define HEC_REG 0x09 39b162257dSBin Meng 40*c6d4705fSBin Meng /* MTRR Registers */ 41*c6d4705fSBin Meng #define MTRR_CAP 0x40 42*c6d4705fSBin Meng #define MTRR_DEF_TYPE 0x41 43*c6d4705fSBin Meng 44*c6d4705fSBin Meng #define MTRR_FIX_64K_00000 0x42 45*c6d4705fSBin Meng #define MTRR_FIX_64K_40000 0x43 46*c6d4705fSBin Meng #define MTRR_FIX_16K_80000 0x44 47*c6d4705fSBin Meng #define MTRR_FIX_16K_90000 0x45 48*c6d4705fSBin Meng #define MTRR_FIX_16K_A0000 0x46 49*c6d4705fSBin Meng #define MTRR_FIX_16K_B0000 0x47 50*c6d4705fSBin Meng #define MTRR_FIX_4K_C0000 0x48 51*c6d4705fSBin Meng #define MTRR_FIX_4K_C4000 0x49 52*c6d4705fSBin Meng #define MTRR_FIX_4K_C8000 0x4a 53*c6d4705fSBin Meng #define MTRR_FIX_4K_CC000 0x4b 54*c6d4705fSBin Meng #define MTRR_FIX_4K_D0000 0x4c 55*c6d4705fSBin Meng #define MTRR_FIX_4K_D4000 0x4d 56*c6d4705fSBin Meng #define MTRR_FIX_4K_D8000 0x4e 57*c6d4705fSBin Meng #define MTRR_FIX_4K_DC000 0x4f 58*c6d4705fSBin Meng #define MTRR_FIX_4K_E0000 0x50 59*c6d4705fSBin Meng #define MTRR_FIX_4K_E4000 0x51 60*c6d4705fSBin Meng #define MTRR_FIX_4K_E8000 0x52 61*c6d4705fSBin Meng #define MTRR_FIX_4K_EC000 0x53 62*c6d4705fSBin Meng #define MTRR_FIX_4K_F0000 0x54 63*c6d4705fSBin Meng #define MTRR_FIX_4K_F4000 0x55 64*c6d4705fSBin Meng #define MTRR_FIX_4K_F8000 0x56 65*c6d4705fSBin Meng #define MTRR_FIX_4K_FC000 0x57 66*c6d4705fSBin Meng 67*c6d4705fSBin Meng #define MTRR_SMRR_PHYBASE 0x58 68*c6d4705fSBin Meng #define MTRR_SMRR_PHYMASK 0x59 69*c6d4705fSBin Meng 70*c6d4705fSBin Meng #define MTRR_VAR_PHYBASE(n) (0x5a + 2 * (n)) 71*c6d4705fSBin Meng #define MTRR_VAR_PHYMASK(n) (0x5b + 2 * (n)) 72*c6d4705fSBin Meng 73*c6d4705fSBin Meng #ifndef __ASSEMBLY__ 74*c6d4705fSBin Meng 75*c6d4705fSBin Meng /* variable range MTRR usage */ 76*c6d4705fSBin Meng enum { 77*c6d4705fSBin Meng MTRR_VAR_ROM, 78*c6d4705fSBin Meng MTRR_VAR_ESRAM, 79*c6d4705fSBin Meng MTRR_VAR_RAM 80*c6d4705fSBin Meng }; 81*c6d4705fSBin Meng 82*c6d4705fSBin Meng #endif /* __ASSEMBLY__ */ 83*c6d4705fSBin Meng 84b162257dSBin Meng /* Port 0x04: Remote Management Unit Message Port Registers */ 85b162257dSBin Meng 86b162257dSBin Meng /* ACPI PBLK Base Address Register */ 87b162257dSBin Meng #define PBLK_BA 0x70 88b162257dSBin Meng 89554778c2SBin Meng /* Control Register */ 90554778c2SBin Meng #define RMU_CTRL 0x71 91554778c2SBin Meng 92b162257dSBin Meng /* SPI DMA Base Address Register */ 93b162257dSBin Meng #define SPI_DMA_BA 0x7a 94b162257dSBin Meng 95554778c2SBin Meng /* Thermal Sensor Register */ 96554778c2SBin Meng #define TS_MODE 0xb0 97554778c2SBin Meng #define TS_TEMP 0xb1 98554778c2SBin Meng #define TS_TRIP 0xb2 99554778c2SBin Meng 100b162257dSBin Meng /* Port 0x05: Memory Manager Message Port Registers */ 101b162257dSBin Meng 102b994efbdSBin Meng /* eSRAM Block Page Control */ 103b994efbdSBin Meng #define ESRAM_BLK_CTRL 0x82 104b994efbdSBin Meng #define ESRAM_BLOCK_MODE 0x10000000 105b994efbdSBin Meng 106b06862b9SBin Meng /* Port 0x14: USB2 AFE Unit Port Registers */ 107b06862b9SBin Meng 108b06862b9SBin Meng #define USB2_GLOBAL_PORT 0x4001 109b06862b9SBin Meng #define USB2_PLL1 0x7f02 110b06862b9SBin Meng #define USB2_PLL2 0x7f03 111b06862b9SBin Meng #define USB2_COMPBG 0x7f04 112b06862b9SBin Meng 113316fd392SBin Meng /* Port 0x16: PCIe AFE Unit Port Registers */ 114316fd392SBin Meng 115316fd392SBin Meng #define PCIE_RXPICTRL0_L0 0x2080 116316fd392SBin Meng #define PCIE_RXPICTRL0_L1 0x2180 117316fd392SBin Meng 118316fd392SBin Meng /* Port 0x31: SoC Unit Port Registers */ 119316fd392SBin Meng 120554778c2SBin Meng /* Thermal Sensor Config */ 121554778c2SBin Meng #define TS_CFG1 0x31 122554778c2SBin Meng #define TS_CFG2 0x32 123554778c2SBin Meng #define TS_CFG3 0x33 124554778c2SBin Meng #define TS_CFG4 0x34 125554778c2SBin Meng 126316fd392SBin Meng /* PCIe Controller Config */ 127316fd392SBin Meng #define PCIE_CFG 0x36 128316fd392SBin Meng #define PCIE_CTLR_PRI_RST 0x00010000 129316fd392SBin Meng #define PCIE_PHY_SB_RST 0x00020000 130316fd392SBin Meng #define PCIE_CTLR_SB_RST 0x00040000 131316fd392SBin Meng #define PCIE_PHY_LANE_RST 0x00090000 132316fd392SBin Meng #define PCIE_CTLR_MAIN_RST 0x00100000 133316fd392SBin Meng 134b994efbdSBin Meng /* DRAM */ 135b994efbdSBin Meng #define DRAM_BASE 0x00000000 136b994efbdSBin Meng #define DRAM_MAX_SIZE 0x80000000 137b994efbdSBin Meng 138b994efbdSBin Meng /* eSRAM */ 139b994efbdSBin Meng #define ESRAM_SIZE 0x80000 140b994efbdSBin Meng 141b994efbdSBin Meng /* Memory BAR Enable */ 142b994efbdSBin Meng #define MEM_BAR_EN 0x00000001 143b994efbdSBin Meng 144b994efbdSBin Meng /* I/O BAR Enable */ 145b994efbdSBin Meng #define IO_BAR_EN 0x80000000 146b994efbdSBin Meng 147b994efbdSBin Meng /* 64KiB of RMU binary in flash */ 148b994efbdSBin Meng #define RMU_BINARY_SIZE 0x10000 149b994efbdSBin Meng 1502afb6230SBin Meng /* PCIe Root Port Configuration Registers */ 1512afb6230SBin Meng 1522afb6230SBin Meng #define PCIE_RP_CCFG 0xd0 1532afb6230SBin Meng #define CCFG_UPRS (1 << 14) 1542afb6230SBin Meng #define CCFG_UNRS (1 << 15) 1552afb6230SBin Meng #define CCFG_UNSD (1 << 23) 1562afb6230SBin Meng #define CCFG_UPSD (1 << 24) 1572afb6230SBin Meng 1582afb6230SBin Meng #define PCIE_RP_MPC2 0xd4 1592afb6230SBin Meng #define MPC2_IPF (1 << 11) 1602afb6230SBin Meng 1612afb6230SBin Meng #define PCIE_RP_MBC 0xf4 1622afb6230SBin Meng #define MBC_SBIC (3 << 16) 1632afb6230SBin Meng 164b162257dSBin Meng /* Legacy Bridge PCI Configuration Registers */ 165b162257dSBin Meng #define LB_GBA 0x44 166b162257dSBin Meng #define LB_PM1BLK 0x48 167b162257dSBin Meng #define LB_GPE0BLK 0x4c 168b162257dSBin Meng #define LB_ACTL 0x58 169b162257dSBin Meng #define LB_PABCDRC 0x60 170b162257dSBin Meng #define LB_PEFGHRC 0x64 171b162257dSBin Meng #define LB_WDTBA 0x84 172b162257dSBin Meng #define LB_BCE 0xd4 173b162257dSBin Meng #define LB_BC 0xd8 174b162257dSBin Meng #define LB_RCBA 0xf0 175b162257dSBin Meng 1762afb6230SBin Meng /* USB EHCI memory-mapped registers */ 1772afb6230SBin Meng #define EHCI_INSNREG01 0x94 1782afb6230SBin Meng 1792afb6230SBin Meng /* USB device memory-mapped registers */ 1802afb6230SBin Meng #define USBD_INT_MASK 0x410 1812afb6230SBin Meng #define USBD_EP_INT_STS 0x414 1822afb6230SBin Meng #define USBD_EP_INT_MASK 0x418 1832afb6230SBin Meng 18405b98ec3SBin Meng #ifndef __ASSEMBLY__ 18505b98ec3SBin Meng 18605b98ec3SBin Meng /* Root Complex Register Block */ 18705b98ec3SBin Meng struct quark_rcba { 18805b98ec3SBin Meng u32 rctl; 18905b98ec3SBin Meng u32 esd; 19005b98ec3SBin Meng u32 rsvd1[3150]; 19105b98ec3SBin Meng u16 rmu_ir; 19205b98ec3SBin Meng u16 d23_ir; 19305b98ec3SBin Meng u16 core_ir; 19405b98ec3SBin Meng u16 d20d21_ir; 19505b98ec3SBin Meng }; 19605b98ec3SBin Meng 1975750e5e2SBin Meng #include <asm/io.h> 1985750e5e2SBin Meng #include <asm/pci.h> 1995750e5e2SBin Meng 2005750e5e2SBin Meng /** 2015750e5e2SBin Meng * qrk_pci_read_config_dword() - Read a configuration value 2025750e5e2SBin Meng * 2035750e5e2SBin Meng * @dev: PCI device address: bus, device and function 2045750e5e2SBin Meng * @offset: Dword offset within the device's configuration space 2055750e5e2SBin Meng * @valuep: Place to put the returned value 2065750e5e2SBin Meng * 2075750e5e2SBin Meng * Note: This routine is inlined to provide better performance on Quark 2085750e5e2SBin Meng */ 2095750e5e2SBin Meng static inline void qrk_pci_read_config_dword(pci_dev_t dev, int offset, 2105750e5e2SBin Meng u32 *valuep) 2115750e5e2SBin Meng { 2125750e5e2SBin Meng outl(dev | offset | PCI_CFG_EN, PCI_REG_ADDR); 2135750e5e2SBin Meng *valuep = inl(PCI_REG_DATA); 2145750e5e2SBin Meng } 2155750e5e2SBin Meng 2165750e5e2SBin Meng /** 2175750e5e2SBin Meng * qrk_pci_write_config_dword() - Write a PCI configuration value 2185750e5e2SBin Meng * 2195750e5e2SBin Meng * @dev: PCI device address: bus, device and function 2205750e5e2SBin Meng * @offset: Dword offset within the device's configuration space 2215750e5e2SBin Meng * @value: Value to write 2225750e5e2SBin Meng * 2235750e5e2SBin Meng * Note: This routine is inlined to provide better performance on Quark 2245750e5e2SBin Meng */ 2255750e5e2SBin Meng static inline void qrk_pci_write_config_dword(pci_dev_t dev, int offset, 2265750e5e2SBin Meng u32 value) 2275750e5e2SBin Meng { 2285750e5e2SBin Meng outl(dev | offset | PCI_CFG_EN, PCI_REG_ADDR); 2295750e5e2SBin Meng outl(value, PCI_REG_DATA); 2305750e5e2SBin Meng } 2315750e5e2SBin Meng 232316fd392SBin Meng /** 233316fd392SBin Meng * board_assert_perst() - Assert the PERST# pin 234316fd392SBin Meng * 235316fd392SBin Meng * The CPU interface to the PERST# signal on Quark is platform dependent. 236316fd392SBin Meng * Board-specific codes need supply this routine to assert PCIe slot reset. 237316fd392SBin Meng * 238316fd392SBin Meng * The tricky part in this routine is that any APIs that may trigger PCI 239316fd392SBin Meng * enumeration process are strictly forbidden, as any access to PCIe root 240316fd392SBin Meng * port's configuration registers will cause system hang while it is held 241316fd392SBin Meng * in reset. 242316fd392SBin Meng */ 243316fd392SBin Meng void board_assert_perst(void); 244316fd392SBin Meng 245316fd392SBin Meng /** 246316fd392SBin Meng * board_deassert_perst() - De-assert the PERST# pin 247316fd392SBin Meng * 248316fd392SBin Meng * The CPU interface to the PERST# signal on Quark is platform dependent. 249316fd392SBin Meng * Board-specific codes need supply this routine to de-assert PCIe slot reset. 250316fd392SBin Meng * 251316fd392SBin Meng * The tricky part in this routine is that any APIs that may trigger PCI 252316fd392SBin Meng * enumeration process are strictly forbidden, as any access to PCIe root 253316fd392SBin Meng * port's configuration registers will cause system hang while it is held 254316fd392SBin Meng * in reset. 255316fd392SBin Meng */ 256316fd392SBin Meng void board_deassert_perst(void); 257316fd392SBin Meng 25805b98ec3SBin Meng #endif /* __ASSEMBLY__ */ 25905b98ec3SBin Meng 260b994efbdSBin Meng #endif /* _QUARK_H_ */ 261