MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / rt_pci_ofw_parse_ranges

Function rt_pci_ofw_parse_ranges

components/drivers/pci/ofw.c:248–299  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

246}
247
248rt_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
301rt_err_t rt_pci_ofw_host_bridge_init(struct rt_ofw_node *dev_np,
302 struct rt_pci_host_bridge *host_bridge)

Callers 1

Calls 7

rt_ofw_io_addr_cellsFunction · 0.85
rt_ofw_prop_read_s32Function · 0.85
pci_ofw_parse_rangesFunction · 0.85
rt_pci_region_setupFunction · 0.85
rt_freeFunction · 0.85
rt_ofw_node_full_nameFunction · 0.85
rt_strerrorFunction · 0.85

Tested by

no test coverage detected