| 160 | DRIVER_MODULE(localbus, ofwbus, localbus_driver, localbus_devclass, 0, 0); |
| 161 | |
| 162 | static int |
| 163 | fdt_localbus_reg_decode(phandle_t node, struct localbus_softc *sc, |
| 164 | struct localbus_devinfo *di) |
| 165 | { |
| 166 | u_long start, end, count; |
| 167 | pcell_t *reg, *regptr; |
| 168 | pcell_t addr_cells, size_cells; |
| 169 | int tuple_size, tuples; |
| 170 | int i, rv, bank; |
| 171 | |
| 172 | if (fdt_addrsize_cells(OF_parent(node), &addr_cells, &size_cells) != 0) |
| 173 | return (ENXIO); |
| 174 | |
| 175 | tuple_size = sizeof(pcell_t) * (addr_cells + size_cells); |
| 176 | tuples = OF_getprop_alloc_multi(node, "reg", tuple_size, (void **)®); |
| 177 | debugf("addr_cells = %d, size_cells = %d\n", addr_cells, size_cells); |
| 178 | debugf("tuples = %d, tuple size = %d\n", tuples, tuple_size); |
| 179 | if (tuples <= 0) |
| 180 | /* No 'reg' property in this node. */ |
| 181 | return (0); |
| 182 | |
| 183 | regptr = reg; |
| 184 | for (i = 0; i < tuples; i++) { |
| 185 | bank = fdt_data_get((void *)regptr, 1); |
| 186 | |
| 187 | if (bank >= MV_LOCALBUS_MAX_BANKS) { |
| 188 | device_printf(sc->sc_dev, "bank number [%d] out of " |
| 189 | "range\n", bank); |
| 190 | continue; |
| 191 | } |
| 192 | |
| 193 | /* |
| 194 | * If device doesn't have virtual to physical mapping don't add |
| 195 | * resources |
| 196 | */ |
| 197 | if (!(sc->sc_banks[bank].mapped)) { |
| 198 | device_printf(sc->sc_dev, "device [%d]: missing memory " |
| 199 | "mapping\n", bank); |
| 200 | continue; |
| 201 | } |
| 202 | |
| 203 | di->di_bank = bank; |
| 204 | regptr += 1; |
| 205 | |
| 206 | /* Get address/size. */ |
| 207 | rv = fdt_data_to_res(regptr, addr_cells - 1, size_cells, &start, |
| 208 | &count); |
| 209 | if (rv != 0) { |
| 210 | resource_list_free(&di->di_res); |
| 211 | goto out; |
| 212 | } |
| 213 | |
| 214 | /* Check if enough amount of memory is mapped */ |
| 215 | if (sc->sc_banks[bank].size < count) { |
| 216 | device_printf(sc->sc_dev, "device [%d]: not enough " |
| 217 | "memory reserved\n", bank); |
| 218 | continue; |
| 219 | } |
no test coverage detected