| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * This file is subject to the terms and conditions of the GNU General Public | 
 | 3 |  * License.  See the file "COPYING" in the main directory of this archive | 
 | 4 |  * for more details. | 
 | 5 |  * | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 6 |  * Copyright (C) 2005-2009 Cavium Networks | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 7 |  */ | 
 | 8 | #include <linux/kernel.h> | 
 | 9 | #include <linux/init.h> | 
 | 10 | #include <linux/pci.h> | 
 | 11 | #include <linux/interrupt.h> | 
 | 12 | #include <linux/time.h> | 
 | 13 | #include <linux/delay.h> | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 14 | #include <linux/swiotlb.h> | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 15 |  | 
 | 16 | #include <asm/time.h> | 
 | 17 |  | 
 | 18 | #include <asm/octeon/octeon.h> | 
 | 19 | #include <asm/octeon/cvmx-npi-defs.h> | 
 | 20 | #include <asm/octeon/cvmx-pci-defs.h> | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 21 | #include <asm/octeon/pci-octeon.h> | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 22 |  | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 23 | #include <dma-coherence.h> | 
 | 24 |  | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 25 | #define USE_OCTEON_INTERNAL_ARBITER | 
 | 26 |  | 
 | 27 | /* | 
 | 28 |  * Octeon's PCI controller uses did=3, subdid=2 for PCI IO | 
 | 29 |  * addresses. Use PCI endian swapping 1 so no address swapping is | 
 | 30 |  * necessary. The Linux io routines will endian swap the data. | 
 | 31 |  */ | 
 | 32 | #define OCTEON_PCI_IOSPACE_BASE     0x80011a0400000000ull | 
 | 33 | #define OCTEON_PCI_IOSPACE_SIZE     (1ull<<32) | 
 | 34 |  | 
 | 35 | /* Octeon't PCI controller uses did=3, subdid=3 for PCI memory. */ | 
 | 36 | #define OCTEON_PCI_MEMSPACE_OFFSET  (0x00011b0000000000ull) | 
 | 37 |  | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 38 | u64 octeon_bar1_pci_phys; | 
 | 39 |  | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 40 | /** | 
 | 41 |  * This is the bit decoding used for the Octeon PCI controller addresses | 
 | 42 |  */ | 
 | 43 | union octeon_pci_address { | 
 | 44 | 	uint64_t u64; | 
 | 45 | 	struct { | 
 | 46 | 		uint64_t upper:2; | 
 | 47 | 		uint64_t reserved:13; | 
 | 48 | 		uint64_t io:1; | 
 | 49 | 		uint64_t did:5; | 
 | 50 | 		uint64_t subdid:3; | 
 | 51 | 		uint64_t reserved2:4; | 
 | 52 | 		uint64_t endian_swap:2; | 
 | 53 | 		uint64_t reserved3:10; | 
 | 54 | 		uint64_t bus:8; | 
 | 55 | 		uint64_t dev:5; | 
 | 56 | 		uint64_t func:3; | 
 | 57 | 		uint64_t reg:8; | 
 | 58 | 	} s; | 
 | 59 | }; | 
 | 60 |  | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 61 | int __initdata (*octeon_pcibios_map_irq)(const struct pci_dev *dev, | 
 | 62 | 					 u8 slot, u8 pin); | 
 | 63 | enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID; | 
 | 64 |  | 
 | 65 | /** | 
 | 66 |  * Map a PCI device to the appropriate interrupt line | 
 | 67 |  * | 
 | 68 |  * @dev:    The Linux PCI device structure for the device to map | 
 | 69 |  * @slot:   The slot number for this device on __BUS 0__. Linux | 
 | 70 |  *               enumerates through all the bridges and figures out the | 
 | 71 |  *               slot on Bus 0 where this device eventually hooks to. | 
 | 72 |  * @pin:    The PCI interrupt pin read from the device, then swizzled | 
 | 73 |  *               as it goes through each bridge. | 
 | 74 |  * Returns Interrupt number for the device | 
 | 75 |  */ | 
 | 76 | int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | 
 | 77 | { | 
 | 78 | 	if (octeon_pcibios_map_irq) | 
 | 79 | 		return octeon_pcibios_map_irq(dev, slot, pin); | 
 | 80 | 	else | 
 | 81 | 		panic("octeon_pcibios_map_irq not set."); | 
 | 82 | } | 
 | 83 |  | 
 | 84 |  | 
 | 85 | /* | 
 | 86 |  * Called to perform platform specific PCI setup | 
 | 87 |  */ | 
 | 88 | int pcibios_plat_dev_init(struct pci_dev *dev) | 
 | 89 | { | 
 | 90 | 	uint16_t config; | 
 | 91 | 	uint32_t dconfig; | 
 | 92 | 	int pos; | 
 | 93 | 	/* | 
 | 94 | 	 * Force the Cache line setting to 64 bytes. The standard | 
 | 95 | 	 * Linux bus scan doesn't seem to set it. Octeon really has | 
 | 96 | 	 * 128 byte lines, but Intel bridges get really upset if you | 
 | 97 | 	 * try and set values above 64 bytes. Value is specified in | 
 | 98 | 	 * 32bit words. | 
 | 99 | 	 */ | 
 | 100 | 	pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 64 / 4); | 
 | 101 | 	/* Set latency timers for all devices */ | 
| David Daney | 53efc98 | 2011-12-08 12:26:28 +0000 | [diff] [blame] | 102 | 	pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64); | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 103 |  | 
 | 104 | 	/* Enable reporting System errors and parity errors on all devices */ | 
 | 105 | 	/* Enable parity checking and error reporting */ | 
 | 106 | 	pci_read_config_word(dev, PCI_COMMAND, &config); | 
 | 107 | 	config |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR; | 
 | 108 | 	pci_write_config_word(dev, PCI_COMMAND, config); | 
 | 109 |  | 
 | 110 | 	if (dev->subordinate) { | 
 | 111 | 		/* Set latency timers on sub bridges */ | 
| David Daney | 53efc98 | 2011-12-08 12:26:28 +0000 | [diff] [blame] | 112 | 		pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 64); | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 113 | 		/* More bridge error detection */ | 
 | 114 | 		pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config); | 
 | 115 | 		config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR; | 
 | 116 | 		pci_write_config_word(dev, PCI_BRIDGE_CONTROL, config); | 
 | 117 | 	} | 
 | 118 |  | 
 | 119 | 	/* Enable the PCIe normal error reporting */ | 
 | 120 | 	pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | 
 | 121 | 	if (pos) { | 
 | 122 | 		/* Update Device Control */ | 
 | 123 | 		pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config); | 
| David Daney | 53efc98 | 2011-12-08 12:26:28 +0000 | [diff] [blame] | 124 | 		config |= PCI_EXP_DEVCTL_CERE; /* Correctable Error Reporting */ | 
 | 125 | 		config |= PCI_EXP_DEVCTL_NFERE; /* Non-Fatal Error Reporting */ | 
 | 126 | 		config |= PCI_EXP_DEVCTL_FERE;  /* Fatal Error Reporting */ | 
 | 127 | 		config |= PCI_EXP_DEVCTL_URRE;  /* Unsupported Request */ | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 128 | 		pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config); | 
 | 129 | 	} | 
 | 130 |  | 
 | 131 | 	/* Find the Advanced Error Reporting capability */ | 
 | 132 | 	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); | 
 | 133 | 	if (pos) { | 
 | 134 | 		/* Clear Uncorrectable Error Status */ | 
 | 135 | 		pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, | 
 | 136 | 				      &dconfig); | 
 | 137 | 		pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, | 
 | 138 | 				       dconfig); | 
 | 139 | 		/* Enable reporting of all uncorrectable errors */ | 
 | 140 | 		/* Uncorrectable Error Mask - turned on bits disable errors */ | 
 | 141 | 		pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, 0); | 
 | 142 | 		/* | 
 | 143 | 		 * Leave severity at HW default. This only controls if | 
 | 144 | 		 * errors are reported as uncorrectable or | 
 | 145 | 		 * correctable, not if the error is reported. | 
 | 146 | 		 */ | 
 | 147 | 		/* PCI_ERR_UNCOR_SEVER - Uncorrectable Error Severity */ | 
 | 148 | 		/* Clear Correctable Error Status */ | 
 | 149 | 		pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &dconfig); | 
 | 150 | 		pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, dconfig); | 
 | 151 | 		/* Enable reporting of all correctable errors */ | 
 | 152 | 		/* Correctable Error Mask - turned on bits disable errors */ | 
 | 153 | 		pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, 0); | 
 | 154 | 		/* Advanced Error Capabilities */ | 
 | 155 | 		pci_read_config_dword(dev, pos + PCI_ERR_CAP, &dconfig); | 
 | 156 | 		/* ECRC Generation Enable */ | 
 | 157 | 		if (config & PCI_ERR_CAP_ECRC_GENC) | 
 | 158 | 			config |= PCI_ERR_CAP_ECRC_GENE; | 
 | 159 | 		/* ECRC Check Enable */ | 
 | 160 | 		if (config & PCI_ERR_CAP_ECRC_CHKC) | 
 | 161 | 			config |= PCI_ERR_CAP_ECRC_CHKE; | 
 | 162 | 		pci_write_config_dword(dev, pos + PCI_ERR_CAP, dconfig); | 
 | 163 | 		/* PCI_ERR_HEADER_LOG - Header Log Register (16 bytes) */ | 
 | 164 | 		/* Report all errors to the root complex */ | 
 | 165 | 		pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, | 
 | 166 | 				       PCI_ERR_ROOT_CMD_COR_EN | | 
 | 167 | 				       PCI_ERR_ROOT_CMD_NONFATAL_EN | | 
 | 168 | 				       PCI_ERR_ROOT_CMD_FATAL_EN); | 
 | 169 | 		/* Clear the Root status register */ | 
 | 170 | 		pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &dconfig); | 
 | 171 | 		pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, dconfig); | 
 | 172 | 	} | 
 | 173 |  | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 174 | 	dev->dev.archdata.dma_ops = octeon_pci_dma_map_ops; | 
 | 175 |  | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 176 | 	return 0; | 
 | 177 | } | 
 | 178 |  | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 179 | /** | 
 | 180 |  * Return the mapping of PCI device number to IRQ line. Each | 
 | 181 |  * character in the return string represents the interrupt | 
 | 182 |  * line for the device at that position. Device 1 maps to the | 
 | 183 |  * first character, etc. The characters A-D are used for PCI | 
 | 184 |  * interrupts. | 
 | 185 |  * | 
 | 186 |  * Returns PCI interrupt mapping | 
 | 187 |  */ | 
 | 188 | const char *octeon_get_pci_interrupts(void) | 
 | 189 | { | 
 | 190 | 	/* | 
 | 191 | 	 * Returning an empty string causes the interrupts to be | 
 | 192 | 	 * routed based on the PCI specification. From the PCI spec: | 
 | 193 | 	 * | 
 | 194 | 	 * INTA# of Device Number 0 is connected to IRQW on the system | 
 | 195 | 	 * board.  (Device Number has no significance regarding being | 
 | 196 | 	 * located on the system board or in a connector.) INTA# of | 
 | 197 | 	 * Device Number 1 is connected to IRQX on the system | 
 | 198 | 	 * board. INTA# of Device Number 2 is connected to IRQY on the | 
 | 199 | 	 * system board. INTA# of Device Number 3 is connected to IRQZ | 
 | 200 | 	 * on the system board. The table below describes how each | 
 | 201 | 	 * agent's INTx# lines are connected to the system board | 
 | 202 | 	 * interrupt lines. The following equation can be used to | 
 | 203 | 	 * determine to which INTx# signal on the system board a given | 
 | 204 | 	 * device's INTx# line(s) is connected. | 
 | 205 | 	 * | 
 | 206 | 	 * MB = (D + I) MOD 4 MB = System board Interrupt (IRQW = 0, | 
 | 207 | 	 * IRQX = 1, IRQY = 2, and IRQZ = 3) D = Device Number I = | 
 | 208 | 	 * Interrupt Number (INTA# = 0, INTB# = 1, INTC# = 2, and | 
 | 209 | 	 * INTD# = 3) | 
 | 210 | 	 */ | 
 | 211 | 	switch (octeon_bootinfo->board_type) { | 
 | 212 | 	case CVMX_BOARD_TYPE_NAO38: | 
 | 213 | 		/* This is really the NAC38 */ | 
 | 214 | 		return "AAAAADABAAAAAAAAAAAAAAAAAAAAAAAA"; | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 215 | 	case CVMX_BOARD_TYPE_EBH3100: | 
 | 216 | 	case CVMX_BOARD_TYPE_CN3010_EVB_HS5: | 
 | 217 | 	case CVMX_BOARD_TYPE_CN3005_EVB_HS5: | 
 | 218 | 		return "AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; | 
 | 219 | 	case CVMX_BOARD_TYPE_BBGW_REF: | 
 | 220 | 		return "AABCD"; | 
| Roel Kluin | 2fe0626 | 2010-01-20 00:59:27 +0100 | [diff] [blame] | 221 | 	case CVMX_BOARD_TYPE_THUNDER: | 
 | 222 | 	case CVMX_BOARD_TYPE_EBH3000: | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 223 | 	default: | 
 | 224 | 		return ""; | 
 | 225 | 	} | 
 | 226 | } | 
 | 227 |  | 
 | 228 | /** | 
 | 229 |  * Map a PCI device to the appropriate interrupt line | 
 | 230 |  * | 
 | 231 |  * @dev:    The Linux PCI device structure for the device to map | 
 | 232 |  * @slot:   The slot number for this device on __BUS 0__. Linux | 
 | 233 |  *               enumerates through all the bridges and figures out the | 
 | 234 |  *               slot on Bus 0 where this device eventually hooks to. | 
 | 235 |  * @pin:    The PCI interrupt pin read from the device, then swizzled | 
 | 236 |  *               as it goes through each bridge. | 
 | 237 |  * Returns Interrupt number for the device | 
 | 238 |  */ | 
 | 239 | int __init octeon_pci_pcibios_map_irq(const struct pci_dev *dev, | 
 | 240 | 				      u8 slot, u8 pin) | 
 | 241 | { | 
 | 242 | 	int irq_num; | 
 | 243 | 	const char *interrupts; | 
 | 244 | 	int dev_num; | 
 | 245 |  | 
 | 246 | 	/* Get the board specific interrupt mapping */ | 
 | 247 | 	interrupts = octeon_get_pci_interrupts(); | 
 | 248 |  | 
 | 249 | 	dev_num = dev->devfn >> 3; | 
 | 250 | 	if (dev_num < strlen(interrupts)) | 
 | 251 | 		irq_num = ((interrupts[dev_num] - 'A' + pin - 1) & 3) + | 
 | 252 | 			OCTEON_IRQ_PCI_INT0; | 
 | 253 | 	else | 
 | 254 | 		irq_num = ((slot + pin - 3) & 3) + OCTEON_IRQ_PCI_INT0; | 
 | 255 | 	return irq_num; | 
 | 256 | } | 
 | 257 |  | 
 | 258 |  | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 259 | /* | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 260 |  * Read a value from configuration space | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 261 |  */ | 
 | 262 | static int octeon_read_config(struct pci_bus *bus, unsigned int devfn, | 
 | 263 | 			      int reg, int size, u32 *val) | 
 | 264 | { | 
 | 265 | 	union octeon_pci_address pci_addr; | 
 | 266 |  | 
 | 267 | 	pci_addr.u64 = 0; | 
 | 268 | 	pci_addr.s.upper = 2; | 
 | 269 | 	pci_addr.s.io = 1; | 
 | 270 | 	pci_addr.s.did = 3; | 
 | 271 | 	pci_addr.s.subdid = 1; | 
 | 272 | 	pci_addr.s.endian_swap = 1; | 
 | 273 | 	pci_addr.s.bus = bus->number; | 
 | 274 | 	pci_addr.s.dev = devfn >> 3; | 
 | 275 | 	pci_addr.s.func = devfn & 0x7; | 
 | 276 | 	pci_addr.s.reg = reg; | 
 | 277 |  | 
 | 278 | #if PCI_CONFIG_SPACE_DELAY | 
 | 279 | 	udelay(PCI_CONFIG_SPACE_DELAY); | 
 | 280 | #endif | 
 | 281 | 	switch (size) { | 
 | 282 | 	case 4: | 
 | 283 | 		*val = le32_to_cpu(cvmx_read64_uint32(pci_addr.u64)); | 
 | 284 | 		return PCIBIOS_SUCCESSFUL; | 
 | 285 | 	case 2: | 
 | 286 | 		*val = le16_to_cpu(cvmx_read64_uint16(pci_addr.u64)); | 
 | 287 | 		return PCIBIOS_SUCCESSFUL; | 
 | 288 | 	case 1: | 
 | 289 | 		*val = cvmx_read64_uint8(pci_addr.u64); | 
 | 290 | 		return PCIBIOS_SUCCESSFUL; | 
 | 291 | 	} | 
 | 292 | 	return PCIBIOS_FUNC_NOT_SUPPORTED; | 
 | 293 | } | 
 | 294 |  | 
 | 295 |  | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 296 | /* | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 297 |  * Write a value to PCI configuration space | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 298 |  */ | 
 | 299 | static int octeon_write_config(struct pci_bus *bus, unsigned int devfn, | 
 | 300 | 			       int reg, int size, u32 val) | 
 | 301 | { | 
 | 302 | 	union octeon_pci_address pci_addr; | 
 | 303 |  | 
 | 304 | 	pci_addr.u64 = 0; | 
 | 305 | 	pci_addr.s.upper = 2; | 
 | 306 | 	pci_addr.s.io = 1; | 
 | 307 | 	pci_addr.s.did = 3; | 
 | 308 | 	pci_addr.s.subdid = 1; | 
 | 309 | 	pci_addr.s.endian_swap = 1; | 
 | 310 | 	pci_addr.s.bus = bus->number; | 
 | 311 | 	pci_addr.s.dev = devfn >> 3; | 
 | 312 | 	pci_addr.s.func = devfn & 0x7; | 
 | 313 | 	pci_addr.s.reg = reg; | 
 | 314 |  | 
 | 315 | #if PCI_CONFIG_SPACE_DELAY | 
 | 316 | 	udelay(PCI_CONFIG_SPACE_DELAY); | 
 | 317 | #endif | 
 | 318 | 	switch (size) { | 
 | 319 | 	case 4: | 
 | 320 | 		cvmx_write64_uint32(pci_addr.u64, cpu_to_le32(val)); | 
 | 321 | 		return PCIBIOS_SUCCESSFUL; | 
 | 322 | 	case 2: | 
 | 323 | 		cvmx_write64_uint16(pci_addr.u64, cpu_to_le16(val)); | 
 | 324 | 		return PCIBIOS_SUCCESSFUL; | 
 | 325 | 	case 1: | 
 | 326 | 		cvmx_write64_uint8(pci_addr.u64, val); | 
 | 327 | 		return PCIBIOS_SUCCESSFUL; | 
 | 328 | 	} | 
 | 329 | 	return PCIBIOS_FUNC_NOT_SUPPORTED; | 
 | 330 | } | 
 | 331 |  | 
 | 332 |  | 
 | 333 | static struct pci_ops octeon_pci_ops = { | 
 | 334 | 	octeon_read_config, | 
 | 335 | 	octeon_write_config, | 
 | 336 | }; | 
 | 337 |  | 
 | 338 | static struct resource octeon_pci_mem_resource = { | 
 | 339 | 	.start = 0, | 
 | 340 | 	.end = 0, | 
 | 341 | 	.name = "Octeon PCI MEM", | 
 | 342 | 	.flags = IORESOURCE_MEM, | 
 | 343 | }; | 
 | 344 |  | 
 | 345 | /* | 
 | 346 |  * PCI ports must be above 16KB so the ISA bus filtering in the PCI-X to PCI | 
 | 347 |  * bridge | 
 | 348 |  */ | 
 | 349 | static struct resource octeon_pci_io_resource = { | 
 | 350 | 	.start = 0x4000, | 
 | 351 | 	.end = OCTEON_PCI_IOSPACE_SIZE - 1, | 
 | 352 | 	.name = "Octeon PCI IO", | 
 | 353 | 	.flags = IORESOURCE_IO, | 
 | 354 | }; | 
 | 355 |  | 
 | 356 | static struct pci_controller octeon_pci_controller = { | 
 | 357 | 	.pci_ops = &octeon_pci_ops, | 
 | 358 | 	.mem_resource = &octeon_pci_mem_resource, | 
 | 359 | 	.mem_offset = OCTEON_PCI_MEMSPACE_OFFSET, | 
 | 360 | 	.io_resource = &octeon_pci_io_resource, | 
 | 361 | 	.io_offset = 0, | 
 | 362 | 	.io_map_base = OCTEON_PCI_IOSPACE_BASE, | 
 | 363 | }; | 
 | 364 |  | 
 | 365 |  | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 366 | /* | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 367 |  * Low level initialize the Octeon PCI controller | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 368 |  */ | 
 | 369 | static void octeon_pci_initialize(void) | 
 | 370 | { | 
 | 371 | 	union cvmx_pci_cfg01 cfg01; | 
 | 372 | 	union cvmx_npi_ctl_status ctl_status; | 
 | 373 | 	union cvmx_pci_ctl_status_2 ctl_status_2; | 
 | 374 | 	union cvmx_pci_cfg19 cfg19; | 
 | 375 | 	union cvmx_pci_cfg16 cfg16; | 
 | 376 | 	union cvmx_pci_cfg22 cfg22; | 
 | 377 | 	union cvmx_pci_cfg56 cfg56; | 
 | 378 |  | 
 | 379 | 	/* Reset the PCI Bus */ | 
 | 380 | 	cvmx_write_csr(CVMX_CIU_SOFT_PRST, 0x1); | 
 | 381 | 	cvmx_read_csr(CVMX_CIU_SOFT_PRST); | 
 | 382 |  | 
 | 383 | 	udelay(2000);		/* Hold PCI reset for 2 ms */ | 
 | 384 |  | 
 | 385 | 	ctl_status.u64 = 0;	/* cvmx_read_csr(CVMX_NPI_CTL_STATUS); */ | 
 | 386 | 	ctl_status.s.max_word = 1; | 
 | 387 | 	ctl_status.s.timer = 1; | 
 | 388 | 	cvmx_write_csr(CVMX_NPI_CTL_STATUS, ctl_status.u64); | 
 | 389 |  | 
 | 390 | 	/* Deassert PCI reset and advertize PCX Host Mode Device Capability | 
 | 391 | 	   (64b) */ | 
 | 392 | 	cvmx_write_csr(CVMX_CIU_SOFT_PRST, 0x4); | 
 | 393 | 	cvmx_read_csr(CVMX_CIU_SOFT_PRST); | 
 | 394 |  | 
 | 395 | 	udelay(2000);		/* Wait 2 ms after deasserting PCI reset */ | 
 | 396 |  | 
 | 397 | 	ctl_status_2.u32 = 0; | 
 | 398 | 	ctl_status_2.s.tsr_hwm = 1;	/* Initializes to 0.  Must be set | 
 | 399 | 					   before any PCI reads. */ | 
 | 400 | 	ctl_status_2.s.bar2pres = 1;	/* Enable BAR2 */ | 
 | 401 | 	ctl_status_2.s.bar2_enb = 1; | 
 | 402 | 	ctl_status_2.s.bar2_cax = 1;	/* Don't use L2 */ | 
 | 403 | 	ctl_status_2.s.bar2_esx = 1; | 
 | 404 | 	ctl_status_2.s.pmo_amod = 1;	/* Round robin priority */ | 
 | 405 | 	if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG) { | 
 | 406 | 		/* BAR1 hole */ | 
 | 407 | 		ctl_status_2.s.bb1_hole = OCTEON_PCI_BAR1_HOLE_BITS; | 
 | 408 | 		ctl_status_2.s.bb1_siz = 1;  /* BAR1 is 2GB */ | 
 | 409 | 		ctl_status_2.s.bb_ca = 1;    /* Don't use L2 with big bars */ | 
 | 410 | 		ctl_status_2.s.bb_es = 1;    /* Big bar in byte swap mode */ | 
 | 411 | 		ctl_status_2.s.bb1 = 1;      /* BAR1 is big */ | 
 | 412 | 		ctl_status_2.s.bb0 = 1;      /* BAR0 is big */ | 
 | 413 | 	} | 
 | 414 |  | 
 | 415 | 	octeon_npi_write32(CVMX_NPI_PCI_CTL_STATUS_2, ctl_status_2.u32); | 
 | 416 | 	udelay(2000);		/* Wait 2 ms before doing PCI reads */ | 
 | 417 |  | 
 | 418 | 	ctl_status_2.u32 = octeon_npi_read32(CVMX_NPI_PCI_CTL_STATUS_2); | 
 | 419 | 	pr_notice("PCI Status: %s %s-bit\n", | 
 | 420 | 		  ctl_status_2.s.ap_pcix ? "PCI-X" : "PCI", | 
 | 421 | 		  ctl_status_2.s.ap_64ad ? "64" : "32"); | 
 | 422 |  | 
 | 423 | 	if (OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN50XX)) { | 
 | 424 | 		union cvmx_pci_cnt_reg cnt_reg_start; | 
 | 425 | 		union cvmx_pci_cnt_reg cnt_reg_end; | 
 | 426 | 		unsigned long cycles, pci_clock; | 
 | 427 |  | 
 | 428 | 		cnt_reg_start.u64 = cvmx_read_csr(CVMX_NPI_PCI_CNT_REG); | 
 | 429 | 		cycles = read_c0_cvmcount(); | 
 | 430 | 		udelay(1000); | 
 | 431 | 		cnt_reg_end.u64 = cvmx_read_csr(CVMX_NPI_PCI_CNT_REG); | 
 | 432 | 		cycles = read_c0_cvmcount() - cycles; | 
 | 433 | 		pci_clock = (cnt_reg_end.s.pcicnt - cnt_reg_start.s.pcicnt) / | 
 | 434 | 			    (cycles / (mips_hpt_frequency / 1000000)); | 
 | 435 | 		pr_notice("PCI Clock: %lu MHz\n", pci_clock); | 
 | 436 | 	} | 
 | 437 |  | 
 | 438 | 	/* | 
 | 439 | 	 * TDOMC must be set to one in PCI mode. TDOMC should be set to 4 | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 440 | 	 * in PCI-X mode to allow four outstanding splits. Otherwise, | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 441 | 	 * should not change from its reset value. Don't write PCI_CFG19 | 
 | 442 | 	 * in PCI mode (0x82000001 reset value), write it to 0x82000004 | 
 | 443 | 	 * after PCI-X mode is known. MRBCI,MDWE,MDRE -> must be zero. | 
 | 444 | 	 * MRBCM -> must be one. | 
 | 445 | 	 */ | 
 | 446 | 	if (ctl_status_2.s.ap_pcix) { | 
 | 447 | 		cfg19.u32 = 0; | 
 | 448 | 		/* | 
 | 449 | 		 * Target Delayed/Split request outstanding maximum | 
 | 450 | 		 * count. [1..31] and 0=32.  NOTE: If the user | 
 | 451 | 		 * programs these bits beyond the Designed Maximum | 
 | 452 | 		 * outstanding count, then the designed maximum table | 
 | 453 | 		 * depth will be used instead.  No additional | 
 | 454 | 		 * Deferred/Split transactions will be accepted if | 
 | 455 | 		 * this outstanding maximum count is | 
 | 456 | 		 * reached. Furthermore, no additional deferred/split | 
 | 457 | 		 * transactions will be accepted if the I/O delay/ I/O | 
 | 458 | 		 * Split Request outstanding maximum is reached. | 
 | 459 | 		 */ | 
 | 460 | 		cfg19.s.tdomc = 4; | 
 | 461 | 		/* | 
 | 462 | 		 * Master Deferred Read Request Outstanding Max Count | 
 | 463 | 		 * (PCI only).  CR4C[26:24] Max SAC cycles MAX DAC | 
 | 464 | 		 * cycles 000 8 4 001 1 0 010 2 1 011 3 1 100 4 2 101 | 
 | 465 | 		 * 5 2 110 6 3 111 7 3 For example, if these bits are | 
 | 466 | 		 * programmed to 100, the core can support 2 DAC | 
 | 467 | 		 * cycles, 4 SAC cycles or a combination of 1 DAC and | 
 | 468 | 		 * 2 SAC cycles. NOTE: For the PCI-X maximum | 
 | 469 | 		 * outstanding split transactions, refer to | 
 | 470 | 		 * CRE0[22:20]. | 
 | 471 | 		 */ | 
 | 472 | 		cfg19.s.mdrrmc = 2; | 
 | 473 | 		/* | 
 | 474 | 		 * Master Request (Memory Read) Byte Count/Byte Enable | 
 | 475 | 		 * select. 0 = Byte Enables valid. In PCI mode, a | 
 | 476 | 		 * burst transaction cannot be performed using Memory | 
 | 477 | 		 * Read command=4?h6. 1 = DWORD Byte Count valid | 
 | 478 | 		 * (default). In PCI Mode, the memory read byte | 
 | 479 | 		 * enables are automatically generated by the | 
 | 480 | 		 * core. Note: N3 Master Request transaction sizes are | 
 | 481 | 		 * always determined through the | 
 | 482 | 		 * am_attr[<35:32>|<7:0>] field. | 
 | 483 | 		 */ | 
 | 484 | 		cfg19.s.mrbcm = 1; | 
 | 485 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG19, cfg19.u32); | 
 | 486 | 	} | 
 | 487 |  | 
 | 488 |  | 
 | 489 | 	cfg01.u32 = 0; | 
 | 490 | 	cfg01.s.msae = 1;	/* Memory Space Access Enable */ | 
 | 491 | 	cfg01.s.me = 1;		/* Master Enable */ | 
 | 492 | 	cfg01.s.pee = 1;	/* PERR# Enable */ | 
 | 493 | 	cfg01.s.see = 1;	/* System Error Enable */ | 
 | 494 | 	cfg01.s.fbbe = 1;	/* Fast Back to Back Transaction Enable */ | 
 | 495 |  | 
 | 496 | 	octeon_npi_write32(CVMX_NPI_PCI_CFG01, cfg01.u32); | 
 | 497 |  | 
 | 498 | #ifdef USE_OCTEON_INTERNAL_ARBITER | 
 | 499 | 	/* | 
 | 500 | 	 * When OCTEON is a PCI host, most systems will use OCTEON's | 
 | 501 | 	 * internal arbiter, so must enable it before any PCI/PCI-X | 
 | 502 | 	 * traffic can occur. | 
 | 503 | 	 */ | 
 | 504 | 	{ | 
 | 505 | 		union cvmx_npi_pci_int_arb_cfg pci_int_arb_cfg; | 
 | 506 |  | 
 | 507 | 		pci_int_arb_cfg.u64 = 0; | 
 | 508 | 		pci_int_arb_cfg.s.en = 1;	/* Internal arbiter enable */ | 
 | 509 | 		cvmx_write_csr(CVMX_NPI_PCI_INT_ARB_CFG, pci_int_arb_cfg.u64); | 
 | 510 | 	} | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 511 | #endif	/* USE_OCTEON_INTERNAL_ARBITER */ | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 512 |  | 
 | 513 | 	/* | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 514 | 	 * Preferably written to 1 to set MLTD. [RDSATI,TRTAE, | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 515 | 	 * TWTAE,TMAE,DPPMR -> must be zero. TILT -> must not be set to | 
 | 516 | 	 * 1..7. | 
 | 517 | 	 */ | 
 | 518 | 	cfg16.u32 = 0; | 
 | 519 | 	cfg16.s.mltd = 1;	/* Master Latency Timer Disable */ | 
 | 520 | 	octeon_npi_write32(CVMX_NPI_PCI_CFG16, cfg16.u32); | 
 | 521 |  | 
 | 522 | 	/* | 
 | 523 | 	 * Should be written to 0x4ff00. MTTV -> must be zero. | 
 | 524 | 	 * FLUSH -> must be 1. MRV -> should be 0xFF. | 
 | 525 | 	 */ | 
 | 526 | 	cfg22.u32 = 0; | 
 | 527 | 	/* Master Retry Value [1..255] and 0=infinite */ | 
 | 528 | 	cfg22.s.mrv = 0xff; | 
 | 529 | 	/* | 
 | 530 | 	 * AM_DO_FLUSH_I control NOTE: This bit MUST BE ONE for proper | 
 | 531 | 	 * N3K operation. | 
 | 532 | 	 */ | 
 | 533 | 	cfg22.s.flush = 1; | 
 | 534 | 	octeon_npi_write32(CVMX_NPI_PCI_CFG22, cfg22.u32); | 
 | 535 |  | 
 | 536 | 	/* | 
 | 537 | 	 * MOST Indicates the maximum number of outstanding splits (in -1 | 
 | 538 | 	 * notation) when OCTEON is in PCI-X mode.  PCI-X performance is | 
 | 539 | 	 * affected by the MOST selection.  Should generally be written | 
 | 540 | 	 * with one of 0x3be807, 0x2be807, 0x1be807, or 0x0be807, | 
 | 541 | 	 * depending on the desired MOST of 3, 2, 1, or 0, respectively. | 
 | 542 | 	 */ | 
 | 543 | 	cfg56.u32 = 0; | 
 | 544 | 	cfg56.s.pxcid = 7;	/* RO - PCI-X Capability ID */ | 
 | 545 | 	cfg56.s.ncp = 0xe8;	/* RO - Next Capability Pointer */ | 
 | 546 | 	cfg56.s.dpere = 1;	/* Data Parity Error Recovery Enable */ | 
 | 547 | 	cfg56.s.roe = 1;	/* Relaxed Ordering Enable */ | 
 | 548 | 	cfg56.s.mmbc = 1;	/* Maximum Memory Byte Count | 
 | 549 | 				   [0=512B,1=1024B,2=2048B,3=4096B] */ | 
 | 550 | 	cfg56.s.most = 3;	/* Maximum outstanding Split transactions [0=1 | 
 | 551 | 				   .. 7=32] */ | 
 | 552 |  | 
 | 553 | 	octeon_npi_write32(CVMX_NPI_PCI_CFG56, cfg56.u32); | 
 | 554 |  | 
 | 555 | 	/* | 
 | 556 | 	 * Affects PCI performance when OCTEON services reads to its | 
 | 557 | 	 * BAR1/BAR2. Refer to Section 10.6.1.  The recommended values are | 
 | 558 | 	 * 0x22, 0x33, and 0x33 for PCI_READ_CMD_6, PCI_READ_CMD_C, and | 
 | 559 | 	 * PCI_READ_CMD_E, respectively. Unfortunately due to errata DDR-700, | 
 | 560 | 	 * these values need to be changed so they won't possibly prefetch off | 
 | 561 | 	 * of the end of memory if PCI is DMAing a buffer at the end of | 
 | 562 | 	 * memory. Note that these values differ from their reset values. | 
 | 563 | 	 */ | 
 | 564 | 	octeon_npi_write32(CVMX_NPI_PCI_READ_CMD_6, 0x21); | 
 | 565 | 	octeon_npi_write32(CVMX_NPI_PCI_READ_CMD_C, 0x31); | 
 | 566 | 	octeon_npi_write32(CVMX_NPI_PCI_READ_CMD_E, 0x31); | 
 | 567 | } | 
 | 568 |  | 
 | 569 |  | 
| David Daney | 01a6221 | 2009-06-29 17:18:51 -0700 | [diff] [blame] | 570 | /* | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 571 |  * Initialize the Octeon PCI controller | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 572 |  */ | 
 | 573 | static int __init octeon_pci_setup(void) | 
 | 574 | { | 
 | 575 | 	union cvmx_npi_mem_access_subidx mem_access; | 
 | 576 | 	int index; | 
 | 577 |  | 
 | 578 | 	/* Only these chips have PCI */ | 
 | 579 | 	if (octeon_has_feature(OCTEON_FEATURE_PCIE)) | 
 | 580 | 		return 0; | 
 | 581 |  | 
 | 582 | 	/* Point pcibios_map_irq() to the PCI version of it */ | 
 | 583 | 	octeon_pcibios_map_irq = octeon_pci_pcibios_map_irq; | 
 | 584 |  | 
 | 585 | 	/* Only use the big bars on chips that support it */ | 
 | 586 | 	if (OCTEON_IS_MODEL(OCTEON_CN31XX) || | 
 | 587 | 	    OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2) || | 
 | 588 | 	    OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1)) | 
 | 589 | 		octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_SMALL; | 
 | 590 | 	else | 
 | 591 | 		octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG; | 
 | 592 |  | 
 | 593 | 	/* PCI I/O and PCI MEM values */ | 
 | 594 | 	set_io_port_base(OCTEON_PCI_IOSPACE_BASE); | 
 | 595 | 	ioport_resource.start = 0; | 
 | 596 | 	ioport_resource.end = OCTEON_PCI_IOSPACE_SIZE - 1; | 
 | 597 | 	if (!octeon_is_pci_host()) { | 
 | 598 | 		pr_notice("Not in host mode, PCI Controller not initialized\n"); | 
 | 599 | 		return 0; | 
 | 600 | 	} | 
 | 601 |  | 
 | 602 | 	pr_notice("%s Octeon big bar support\n", | 
 | 603 | 		  (octeon_dma_bar_type == | 
 | 604 | 		  OCTEON_DMA_BAR_TYPE_BIG) ? "Enabling" : "Disabling"); | 
 | 605 |  | 
 | 606 | 	octeon_pci_initialize(); | 
 | 607 |  | 
 | 608 | 	mem_access.u64 = 0; | 
 | 609 | 	mem_access.s.esr = 1;	/* Endian-Swap on read. */ | 
 | 610 | 	mem_access.s.esw = 1;	/* Endian-Swap on write. */ | 
 | 611 | 	mem_access.s.nsr = 0;	/* No-Snoop on read. */ | 
 | 612 | 	mem_access.s.nsw = 0;	/* No-Snoop on write. */ | 
 | 613 | 	mem_access.s.ror = 0;	/* Relax Read on read. */ | 
 | 614 | 	mem_access.s.row = 0;	/* Relax Order on write. */ | 
 | 615 | 	mem_access.s.ba = 0;	/* PCI Address bits [63:36]. */ | 
 | 616 | 	cvmx_write_csr(CVMX_NPI_MEM_ACCESS_SUBID3, mem_access.u64); | 
 | 617 |  | 
 | 618 | 	/* | 
 | 619 | 	 * Remap the Octeon BAR 2 above all 32 bit devices | 
 | 620 | 	 * (0x8000000000ul).  This is done here so it is remapped | 
 | 621 | 	 * before the readl()'s below. We don't want BAR2 overlapping | 
 | 622 | 	 * with BAR0/BAR1 during these reads. | 
 | 623 | 	 */ | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 624 | 	octeon_npi_write32(CVMX_NPI_PCI_CFG08, | 
 | 625 | 			   (u32)(OCTEON_BAR2_PCI_ADDRESS & 0xffffffffull)); | 
 | 626 | 	octeon_npi_write32(CVMX_NPI_PCI_CFG09, | 
 | 627 | 			   (u32)(OCTEON_BAR2_PCI_ADDRESS >> 32)); | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 628 |  | 
 | 629 | 	if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG) { | 
 | 630 | 		/* Remap the Octeon BAR 0 to 0-2GB */ | 
 | 631 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG04, 0); | 
 | 632 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG05, 0); | 
 | 633 |  | 
 | 634 | 		/* | 
 | 635 | 		 * Remap the Octeon BAR 1 to map 2GB-4GB (minus the | 
 | 636 | 		 * BAR 1 hole). | 
 | 637 | 		 */ | 
 | 638 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG06, 2ul << 30); | 
 | 639 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG07, 0); | 
 | 640 |  | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 641 | 		/* BAR1 movable mappings set for identity mapping */ | 
 | 642 | 		octeon_bar1_pci_phys = 0x80000000ull; | 
 | 643 | 		for (index = 0; index < 32; index++) { | 
 | 644 | 			union cvmx_pci_bar1_indexx bar1_index; | 
 | 645 |  | 
 | 646 | 			bar1_index.u32 = 0; | 
 | 647 | 			/* Address bits[35:22] sent to L2C */ | 
 | 648 | 			bar1_index.s.addr_idx = | 
 | 649 | 				(octeon_bar1_pci_phys >> 22) + index; | 
 | 650 | 			/* Don't put PCI accesses in L2. */ | 
 | 651 | 			bar1_index.s.ca = 1; | 
 | 652 | 			/* Endian Swap Mode */ | 
 | 653 | 			bar1_index.s.end_swp = 1; | 
 | 654 | 			/* Set '1' when the selected address range is valid. */ | 
 | 655 | 			bar1_index.s.addr_v = 1; | 
 | 656 | 			octeon_npi_write32(CVMX_NPI_PCI_BAR1_INDEXX(index), | 
 | 657 | 					   bar1_index.u32); | 
 | 658 | 		} | 
 | 659 |  | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 660 | 		/* Devices go after BAR1 */ | 
 | 661 | 		octeon_pci_mem_resource.start = | 
 | 662 | 			OCTEON_PCI_MEMSPACE_OFFSET + (4ul << 30) - | 
 | 663 | 			(OCTEON_PCI_BAR1_HOLE_SIZE << 20); | 
 | 664 | 		octeon_pci_mem_resource.end = | 
 | 665 | 			octeon_pci_mem_resource.start + (1ul << 30); | 
 | 666 | 	} else { | 
 | 667 | 		/* Remap the Octeon BAR 0 to map 128MB-(128MB+4KB) */ | 
 | 668 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG04, 128ul << 20); | 
 | 669 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG05, 0); | 
 | 670 |  | 
 | 671 | 		/* Remap the Octeon BAR 1 to map 0-128MB */ | 
 | 672 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG06, 0); | 
 | 673 | 		octeon_npi_write32(CVMX_NPI_PCI_CFG07, 0); | 
 | 674 |  | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 675 | 		/* BAR1 movable regions contiguous to cover the swiotlb */ | 
 | 676 | 		octeon_bar1_pci_phys = | 
 | 677 | 			virt_to_phys(octeon_swiotlb) & ~((1ull << 22) - 1); | 
 | 678 |  | 
 | 679 | 		for (index = 0; index < 32; index++) { | 
 | 680 | 			union cvmx_pci_bar1_indexx bar1_index; | 
 | 681 |  | 
 | 682 | 			bar1_index.u32 = 0; | 
 | 683 | 			/* Address bits[35:22] sent to L2C */ | 
 | 684 | 			bar1_index.s.addr_idx = | 
 | 685 | 				(octeon_bar1_pci_phys >> 22) + index; | 
 | 686 | 			/* Don't put PCI accesses in L2. */ | 
 | 687 | 			bar1_index.s.ca = 1; | 
 | 688 | 			/* Endian Swap Mode */ | 
 | 689 | 			bar1_index.s.end_swp = 1; | 
 | 690 | 			/* Set '1' when the selected address range is valid. */ | 
 | 691 | 			bar1_index.s.addr_v = 1; | 
 | 692 | 			octeon_npi_write32(CVMX_NPI_PCI_BAR1_INDEXX(index), | 
 | 693 | 					   bar1_index.u32); | 
 | 694 | 		} | 
 | 695 |  | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 696 | 		/* Devices go after BAR0 */ | 
 | 697 | 		octeon_pci_mem_resource.start = | 
 | 698 | 			OCTEON_PCI_MEMSPACE_OFFSET + (128ul << 20) + | 
 | 699 | 			(4ul << 10); | 
 | 700 | 		octeon_pci_mem_resource.end = | 
 | 701 | 			octeon_pci_mem_resource.start + (1ul << 30); | 
 | 702 | 	} | 
 | 703 |  | 
 | 704 | 	register_pci_controller(&octeon_pci_controller); | 
 | 705 |  | 
 | 706 | 	/* | 
 | 707 | 	 * Clear any errors that might be pending from before the bus | 
 | 708 | 	 * was setup properly. | 
 | 709 | 	 */ | 
 | 710 | 	cvmx_write_csr(CVMX_NPI_PCI_INT_SUM2, -1); | 
| David Daney | b93b2ab | 2010-10-01 13:27:34 -0700 | [diff] [blame] | 711 |  | 
 | 712 | 	octeon_pci_dma_init(); | 
 | 713 |  | 
| David Daney | e8635b4 | 2009-04-23 17:44:38 -0700 | [diff] [blame] | 714 | 	return 0; | 
 | 715 | } | 
 | 716 |  | 
 | 717 | arch_initcall(octeon_pci_setup); |