forked from Minki/linux
drm/nouveau: allocate structure to store per-client data
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
1562ffde94
commit
3f0a68d8f8
@ -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,
|
||||
|
@ -46,9 +46,15 @@
|
||||
#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 *);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user