From ad70dc676ebf8f2f86d171dccb873a04a3e5b87b Mon Sep 17 00:00:00 2001 From: Jon Smirl Date: Tue, 12 Oct 2004 03:59:17 +0000 Subject: Breakout heads into their own data structures. --- linux-core/drm_stub.c | 159 ++++++++++++++++++++------------------------------ 1 file changed, 63 insertions(+), 96 deletions(-) (limited to 'linux-core/drm_stub.c') diff --git a/linux-core/drm_stub.c b/linux-core/drm_stub.c index 03327839..95ecd2d4 100644 --- a/linux-core/drm_stub.c +++ b/linux-core/drm_stub.c @@ -48,7 +48,7 @@ MODULE_PARM_DESC(debug, "Enable debug output"); module_param(cards_limit, int, 0444); module_param(debug, int, 0666); -drm_minor_t *drm_minors; +drm_head_t **drm_heads; struct drm_sysfs_class *drm_class; struct proc_dir_entry *drm_proc_root; @@ -120,16 +120,9 @@ static int fill_in_dev(drm_device_t * dev, struct pci_dev *pdev, goto error_out_unreg; } - dev->device = MKDEV(DRM_MAJOR, dev->minor); - - /* postinit is a required function to display the signon banner */ - /* drivers add secondary heads here if needed */ - if ((retcode = dev->driver->postinit(dev, ent->driver_data))) - goto error_out_unreg; - return 0; - error_out_unreg: +error_out_unreg: drm_takedown(dev); return retcode; } @@ -145,76 +138,47 @@ static int fill_in_dev(drm_device_t * dev, struct pci_dev *pdev, * then register the character device and inter module information. * Try and register, if we fail to register, backout previous work. */ -int drm_probe(struct pci_dev *pdev, const struct pci_device_id *ent, +int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, struct drm_driver *driver) { - struct class_device *dev_class; drm_device_t *dev; int ret; - int minor; - drm_minor_t *minors = &drm_minors[0]; DRM_DEBUG("\n"); - for (minor = 0; minor < cards_limit; minor++, minors++) { - if (minors->class == DRM_MINOR_FREE) { - - DRM_DEBUG("assigning minor %d\n", minor); - dev = drm_calloc(1, sizeof(*dev), DRM_MEM_STUB); - if (!dev) - return -ENOMEM; - - *minors = (drm_minor_t) { - .dev = dev,.class = DRM_MINOR_PRIMARY}; - dev->minor = minor; - if (!drm_fb_loaded) { - pci_set_drvdata(pdev, dev); - pci_request_regions(pdev, DRIVER_NAME); - pci_enable_device(pdev); - } - if ((ret = fill_in_dev(dev, pdev, ent, driver))) { - printk(KERN_ERR "DRM: Fill_in_dev failed.\n"); - goto err_g1; - } - if ((ret = - drm_proc_init(dev, minor, drm_proc_root, - &minors->dev_root))) { - printk(KERN_ERR - "DRM: Failed to initialize /proc/dri.\n"); - goto err_g1; - } - dev_class = drm_sysfs_device_add(drm_class, - MKDEV(DRM_MAJOR, - minor), - DRM_PCI_DEV(pdev), - "card%d", minor); - if (IS_ERR(dev_class)) { - printk(KERN_ERR - "DRM: Error sysfs_device_add.\n"); - ret = PTR_ERR(dev_class); - goto err_g2; - } + dev = drm_calloc(1, sizeof(*dev), DRM_MEM_STUB); + if (!dev) + return -ENOMEM; - DRM_DEBUG("new primary minor assigned %d\n", minor); - return 0; - } + if (!drm_fb_loaded) { + pci_set_drvdata(pdev, dev); + pci_request_regions(pdev, DRIVER_NAME); + pci_enable_device(pdev); } - DRM_ERROR("out of minors\n"); - return -ENOMEM; -err_g2: - drm_proc_cleanup(minor, drm_proc_root, minors->dev_root); + if ((ret = fill_in_dev(dev, pdev, ent, driver))) { + printk(KERN_ERR "DRM: Fill_in_dev failed.\n"); + goto err_g1; + } + if ((ret = drm_get_head(dev, &dev->primary))) + goto err_g1; + + /* postinit is a required function to display the signon banner */ + /* drivers add secondary heads here if needed */ + if ((ret = dev->driver->postinit(dev, ent->driver_data))) + goto err_g1; + + return 0; + err_g1: if (!drm_fb_loaded) { pci_set_drvdata(pdev, NULL); pci_release_regions(pdev); pci_disable_device(pdev); } - *minors = (drm_minor_t) { - .dev = NULL,.class = DRM_MINOR_FREE}; drm_free(dev, sizeof(*dev), DRM_MEM_STUB); return ret; } -EXPORT_SYMBOL(drm_probe); +EXPORT_SYMBOL(drm_get_dev); /** * Get a secondary minor number. @@ -227,53 +191,54 @@ EXPORT_SYMBOL(drm_probe); * create the proc init entry via proc_init(). This routines assigns * minor numbers to secondary heads of multi-headed cards */ -int drm_get_secondary_minor(drm_device_t * dev, drm_minor_t ** sec_minor) +int drm_get_head(drm_device_t * dev, drm_head_t * head) { - drm_minor_t *minors = &drm_minors[0]; - struct class_device *dev_class; + drm_head_t **heads = drm_heads; int ret; int minor; DRM_DEBUG("\n"); - for (minor = 0; minor < cards_limit; minor++, minors++) { - if (minors->class == DRM_MINOR_FREE) { + for (minor = 0; minor < cards_limit; minor++, heads++) { + if (!*heads) { - *minors = (drm_minor_t) { - .dev = dev,.class = DRM_MINOR_SECONDARY}; + *head = (drm_head_t) { + .dev = dev, + .device = MKDEV(DRM_MAJOR, minor), + .minor = minor, + }; if ((ret = drm_proc_init(dev, minor, drm_proc_root, - &minors->dev_root))) { + &head->dev_root))) { printk(KERN_ERR "DRM: Failed to initialize /proc/dri.\n"); goto err_g1; } - dev_class = drm_sysfs_device_add(drm_class, + head->dev_class = drm_sysfs_device_add(drm_class, MKDEV(DRM_MAJOR, minor), DRM_PCI_DEV(dev->pdev), "card%d", minor); - if (IS_ERR(dev_class)) { + if (IS_ERR(head->dev_class)) { printk(KERN_ERR "DRM: Error sysfs_device_add.\n"); - ret = PTR_ERR(dev_class); + ret = PTR_ERR(head->dev_class); goto err_g2; } - *sec_minor = minors; + *heads = head; - DRM_DEBUG("new secondary minor assigned %d\n", minor); + DRM_DEBUG("new minor assigned %d\n", minor); return 0; } } DRM_ERROR("out of minors\n"); return -ENOMEM; - err_g2: - drm_proc_cleanup(minor, drm_proc_root, minors->dev_root); - err_g1: - *minors = (drm_minor_t) { - .dev = NULL,.class = DRM_MINOR_FREE}; - drm_free(dev, sizeof(*dev), DRM_MEM_STUB); +err_g2: + drm_proc_cleanup(minor, drm_proc_root, head->dev_root); +err_g1: + *head = (drm_head_t) { + .dev = NULL}; return ret; } @@ -287,19 +252,21 @@ int drm_get_secondary_minor(drm_device_t * dev, drm_minor_t ** sec_minor) * "drm" data, otherwise unregisters the "drm" data, frees the dev list and * unregisters the character device. */ -int drm_put_minor(drm_device_t * dev) +int drm_put_dev(drm_device_t * dev) { - drm_minor_t *minors = &drm_minors[dev->minor]; + DRM_DEBUG("release primary %s\n", dev->pdev->driver->name); - DRM_DEBUG("release primary minor %d\n", dev->minor); - - drm_proc_cleanup(dev->minor, drm_proc_root, minors->dev_root); - drm_sysfs_device_remove(MKDEV(DRM_MAJOR, dev->minor)); - - *minors = (drm_minor_t) { - .dev = NULL,.class = DRM_MINOR_FREE}; + if (dev->unique) { + drm_free(dev->unique, strlen(dev->unique) + 1, DRM_MEM_DRIVER); + dev->unique = NULL; + dev->unique_len = 0; + } + if (dev->devname) { + drm_free(dev->devname, strlen(dev->devname) + 1, + DRM_MEM_DRIVER); + dev->devname = NULL; + } drm_free(dev, sizeof(*dev), DRM_MEM_STUB); - return 0; } @@ -313,17 +280,17 @@ int drm_put_minor(drm_device_t * dev) * last minor released. * */ -int drm_put_secondary_minor(drm_minor_t * sec_minor) +int drm_put_head(drm_head_t * head) { - int minor = sec_minor - &drm_minors[0]; + int minor = head->minor; DRM_DEBUG("release secondary minor %d\n", minor); - drm_proc_cleanup(minor, drm_proc_root, sec_minor->dev_root); - drm_sysfs_device_remove(MKDEV(DRM_MAJOR, minor)); + drm_proc_cleanup(minor, drm_proc_root, head->dev_root); + drm_sysfs_device_remove(MKDEV(DRM_MAJOR, head->minor)); - *sec_minor = (drm_minor_t) { - .dev = NULL,.class = DRM_MINOR_FREE}; + *head = (drm_head_t){.dev = NULL}; + drm_heads[minor] = NULL; return 0; } -- cgit v1.2.3