]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
drm/nouveau: allocate structure to store per-client data
authorBen Skeggs <bskeggs@redhat.com>
Tue, 31 May 2011 01:11:28 +0000 (11:11 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jun 2011 05:58:15 +0000 (15:58 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drv.c
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nouveau_state.c

index 7e25f5a6db969ededc3fc1702fd770e0e5740deb..76cd287c7cec6966fd63a775fda57d367bc82375 100644 (file)
@@ -393,7 +393,9 @@ static struct drm_driver driver = {
        .firstopen = nouveau_firstopen,
        .lastclose = nouveau_lastclose,
        .unload = nouveau_unload,
+       .open = nouveau_open,
        .preclose = nouveau_preclose,
+       .postclose = nouveau_postclose,
 #if defined(CONFIG_DRM_NOUVEAU_DEBUG)
        .debugfs_init = nouveau_debugfs_init,
        .debugfs_cleanup = nouveau_debugfs_takedown,
index 86eb3f40c4f865ca54d9c44093be13d5ccd36841..a378a9648198a68ddf15868e340fb94712b6d01b 100644 (file)
 #include "ttm/ttm_module.h"
 
 struct nouveau_fpriv {
-       struct ttm_object_file *tfile;
+       spinlock_t lock;
 };
 
+static inline struct nouveau_fpriv *
+nouveau_fpriv(struct drm_file *file_priv)
+{
+       return file_priv ? file_priv->driver_priv : NULL;
+}
+
 #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
 
 #include "nouveau_drm.h"
@@ -792,7 +798,9 @@ extern int nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state);
 extern int nouveau_pci_resume(struct pci_dev *pdev);
 
 /* nouveau_state.c */
+extern int  nouveau_open(struct drm_device *, struct drm_file *);
 extern void nouveau_preclose(struct drm_device *dev, struct drm_file *);
+extern void nouveau_postclose(struct drm_device *, struct drm_file *);
 extern int  nouveau_load(struct drm_device *, unsigned long flags);
 extern int  nouveau_firstopen(struct drm_device *);
 extern void nouveau_lastclose(struct drm_device *);
index a0e17340e145aea01cee02ecdb37cbe0f9b4c656..9aa96b9375ae02fc400744c7b95b4036c9ea9f59 100644 (file)
@@ -764,6 +764,20 @@ static void nouveau_card_takedown(struct drm_device *dev)
        vga_client_register(dev->pdev, NULL, NULL, NULL);
 }
 
+int
+nouveau_open(struct drm_device *dev, struct drm_file *file_priv)
+{
+       struct nouveau_fpriv *fpriv;
+
+       fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
+       if (unlikely(!fpriv))
+               return -ENOMEM;
+
+       spin_lock_init(&fpriv->lock);
+       file_priv->driver_priv = fpriv;
+       return 0;
+}
+
 /* here a client dies, release the stuff that was allocated for its
  * file_priv */
 void nouveau_preclose(struct drm_device *dev, struct drm_file *file_priv)
@@ -771,6 +785,13 @@ void nouveau_preclose(struct drm_device *dev, struct drm_file *file_priv)
        nouveau_channel_cleanup(dev, file_priv);
 }
 
+void
+nouveau_postclose(struct drm_device *dev, struct drm_file *file_priv)
+{
+       struct nouveau_fpriv *fpriv = nouveau_fpriv(file_priv);
+       kfree(fpriv);
+}
+
 /* first module load, setup the mmio/fb mapping */
 /* KMS: we need mmio at load time, not when the first drm client opens. */
 int nouveau_firstopen(struct drm_device *dev)