| 246 | } |
| 247 | |
| 248 | rt_err_t rt_pci_ofw_parse_ranges(struct rt_ofw_node *dev_np, |
| 249 | struct rt_pci_host_bridge *host_bridge) |
| 250 | { |
| 251 | rt_err_t err; |
| 252 | int phy_addr_cells = -1, phy_size_cells = -1, cpu_addr_cells; |
| 253 | |
| 254 | if (!dev_np || !host_bridge) |
| 255 | { |
| 256 | return -RT_EINVAL; |
| 257 | } |
| 258 | |
| 259 | cpu_addr_cells = rt_ofw_io_addr_cells(dev_np); |
| 260 | rt_ofw_prop_read_s32(dev_np, "#address-cells", &phy_addr_cells); |
| 261 | rt_ofw_prop_read_s32(dev_np, "#size-cells", &phy_size_cells); |
| 262 | |
| 263 | if (phy_addr_cells != 3 || phy_size_cells < 1 || cpu_addr_cells < 1) |
| 264 | { |
| 265 | return -RT_EINVAL; |
| 266 | } |
| 267 | |
| 268 | if (pci_ofw_parse_ranges(dev_np, "ranges", |
| 269 | phy_addr_cells, phy_size_cells, cpu_addr_cells, |
| 270 | &host_bridge->bus_regions, &host_bridge->bus_regions_nr)) |
| 271 | { |
| 272 | return -RT_EINVAL; |
| 273 | } |
| 274 | |
| 275 | if ((err = rt_pci_region_setup(host_bridge))) |
| 276 | { |
| 277 | rt_free(host_bridge->bus_regions); |
| 278 | host_bridge->bus_regions_nr = 0; |
| 279 | |
| 280 | return err; |
| 281 | } |
| 282 | |
| 283 | err = pci_ofw_parse_ranges(dev_np, "dma-ranges", |
| 284 | phy_addr_cells, phy_size_cells, cpu_addr_cells, |
| 285 | &host_bridge->dma_regions, &host_bridge->dma_regions_nr); |
| 286 | |
| 287 | if (err && err != -RT_EEMPTY) |
| 288 | { |
| 289 | rt_free(host_bridge->bus_regions); |
| 290 | host_bridge->bus_regions_nr = 0; |
| 291 | |
| 292 | LOG_E("%s: Read dma-ranges error = %s", rt_ofw_node_full_name(dev_np), |
| 293 | rt_strerror(err)); |
| 294 | |
| 295 | return err; |
| 296 | } |
| 297 | |
| 298 | return RT_EOK; |
| 299 | } |
| 300 | |
| 301 | rt_err_t rt_pci_ofw_host_bridge_init(struct rt_ofw_node *dev_np, |
| 302 | struct rt_pci_host_bridge *host_bridge) |
no test coverage detected