aboutsummaryrefslogtreecommitdiff
path: root/linux-core/drm_stub.c
diff options
context:
space:
mode:
authorJon Smirl <jonsmirl@yahoo.com>2004-10-12 03:59:17 +0000
committerJon Smirl <jonsmirl@yahoo.com>2004-10-12 03:59:17 +0000
commitad70dc676ebf8f2f86d171dccb873a04a3e5b87b (patch)
tree1ee7e58021f8348bff535b1301c3c50d99572f48 /linux-core/drm_stub.c
parentad549c5ae62fd75aa2bdb8bf5efc4913c476cb02 (diff)
Breakout heads into their own data structures.
Diffstat (limited to 'linux-core/drm_stub.c')
-rw-r--r--linux-core/drm_stub.c159
1 files changed, 63 insertions, 96 deletions
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;
}