Esempio n. 1
0
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;
}