| 131 | } |
| 132 | |
| 133 | static int |
| 134 | octopci_attach(device_t dev) |
| 135 | { |
| 136 | struct octopci_softc *sc; |
| 137 | unsigned subbus; |
| 138 | int error; |
| 139 | |
| 140 | sc = device_get_softc(dev); |
| 141 | sc->sc_dev = dev; |
| 142 | |
| 143 | if (octeon_has_feature(OCTEON_FEATURE_PCIE)) { |
| 144 | sc->sc_domain = device_get_unit(dev); |
| 145 | |
| 146 | error = cvmx_pcie_rc_initialize(sc->sc_domain); |
| 147 | if (error != 0) { |
| 148 | device_printf(dev, "Failed to put PCIe bus in host mode.\n"); |
| 149 | return (ENXIO); |
| 150 | } |
| 151 | |
| 152 | /* |
| 153 | * In RC mode, the Simple Executive programs the first bus to |
| 154 | * be numbered as bus 1, because some IDT bridges used in |
| 155 | * Octeon systems object to being attached to bus 0. |
| 156 | */ |
| 157 | sc->sc_bus = 1; |
| 158 | |
| 159 | sc->sc_io_base = CVMX_ADD_IO_SEG(cvmx_pcie_get_io_base_address(sc->sc_domain)); |
| 160 | sc->sc_io.rm_descr = "Cavium Octeon PCIe I/O Ports"; |
| 161 | |
| 162 | sc->sc_mem1_base = CVMX_ADD_IO_SEG(cvmx_pcie_get_mem_base_address(sc->sc_domain)); |
| 163 | sc->sc_mem1.rm_descr = "Cavium Octeon PCIe Memory"; |
| 164 | } else { |
| 165 | octopci_init_pci(dev); |
| 166 | |
| 167 | sc->sc_domain = 0; |
| 168 | sc->sc_bus = 0; |
| 169 | |
| 170 | sc->sc_io_base = CVMX_ADDR_DID(CVMX_FULL_DID(CVMX_OCT_DID_PCI, CVMX_OCT_SUBDID_PCI_IO)); |
| 171 | sc->sc_io.rm_descr = "Cavium Octeon PCI I/O Ports"; |
| 172 | |
| 173 | sc->sc_mem1_base = CVMX_ADDR_DID(CVMX_FULL_DID(CVMX_OCT_DID_PCI, CVMX_OCT_SUBDID_PCI_MEM1)); |
| 174 | sc->sc_mem1.rm_descr = "Cavium Octeon PCI Memory"; |
| 175 | } |
| 176 | |
| 177 | sc->sc_io.rm_type = RMAN_ARRAY; |
| 178 | error = rman_init(&sc->sc_io); |
| 179 | if (error != 0) |
| 180 | return (error); |
| 181 | |
| 182 | error = rman_manage_region(&sc->sc_io, CVMX_OCT_PCI_IO_BASE, |
| 183 | CVMX_OCT_PCI_IO_BASE + CVMX_OCT_PCI_IO_SIZE); |
| 184 | if (error != 0) |
| 185 | return (error); |
| 186 | |
| 187 | sc->sc_mem1.rm_type = RMAN_ARRAY; |
| 188 | error = rman_init(&sc->sc_mem1); |
| 189 | if (error != 0) |
| 190 | return (error); |
nothing calls this directly
no test coverage detected