int pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev) { int i, j, fd; for (i = 0, j = 0; i < DRM_MAX_MINOR; i++) { fd = open_drm_minor(i); if (fd < 0) continue; if (j >= ndev || !pipe_loader_drm_probe_fd(&devs[j], fd)) close(fd); j++; } return j; }
int pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev) { int i, k, fd, num_render_node_devs; int j = 0; struct { unsigned vendor_id; unsigned chip_id; } render_node_devs[DRM_RENDER_NODE_MAX_NODES]; /* Look for render nodes first */ for (i = DRM_RENDER_NODE_MIN_MINOR, j = 0; i <= DRM_RENDER_NODE_MAX_MINOR; i++) { fd = open_drm_render_node_minor(i); struct pipe_loader_device *dev; if (fd < 0) continue; if (!pipe_loader_drm_probe_fd(&dev, fd, false)) { close(fd); continue; } render_node_devs[j].vendor_id = dev->u.pci.vendor_id; render_node_devs[j].chip_id = dev->u.pci.chip_id; if (j < ndev) { devs[j] = dev; } else { close(fd); dev->ops->release(&dev); } j++; } num_render_node_devs = j; /* Next look for drm devices. */ for (i = 0; i < DRM_MAX_MINOR; i++) { struct pipe_loader_device *dev; boolean duplicate = FALSE; fd = open_drm_minor(i); if (fd < 0) continue; if (!pipe_loader_drm_probe_fd(&dev, fd, true)) { close(fd); continue; } /* Check to make sure we aren't already accessing this device via * render nodes. */ for (k = 0; k < num_render_node_devs; k++) { if (dev->u.pci.vendor_id == render_node_devs[k].vendor_id && dev->u.pci.chip_id == render_node_devs[k].chip_id) { close(fd); dev->ops->release(&dev); duplicate = TRUE; break; } } if (duplicate) continue; if (j < ndev) { devs[j] = dev; } else { dev->ops->release(&dev); } j++; } return j; }