Module Name: src
Committed By: riastradh
Date: Sun Dec 19 10:45:33 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/dist/drm: drm_file.c
src/sys/external/bsd/drm2/drm: drm_cdevsw.c files.drmkms
Removed Files:
src/sys/external/bsd/drm2/drm: drm_file.c
Log Message:
Eliminate drm_file.c copypasta.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/drm_file.c
cvs rdiff -u -r1.25 -r1.26 src/sys/external/bsd/drm2/drm/drm_cdevsw.c
cvs rdiff -u -r1.4 -r0 src/sys/external/bsd/drm2/drm/drm_file.c
cvs rdiff -u -r1.58 -r1.59 src/sys/external/bsd/drm2/drm/files.drmkms
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/drm_file.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_file.c:1.2 src/sys/external/bsd/drm2/dist/drm/drm_file.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/drm_file.c:1.2 Sat Dec 18 23:44:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_file.c Sun Dec 19 10:45:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_file.c,v 1.2 2021/12/18 23:44:57 riastradh Exp $ */
+/* $NetBSD: drm_file.c,v 1.3 2021/12/19 10:45:33 riastradh Exp $ */
/*
* \author Rickard E. (Rik) Faith <[email protected]>
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_file.c,v 1.2 2021/12/18 23:44:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_file.c,v 1.3 2021/12/19 10:45:33 riastradh Exp $");
#include <linux/anon_inodes.h>
#include <linux/dma-fence.h>
@@ -53,8 +53,17 @@ __KERNEL_RCSID(0, "$NetBSD: drm_file.c,v
#include "drm_internal.h"
#include "drm_legacy.h"
+#ifdef __NetBSD__
+#include <sys/poll.h>
+#include <sys/select.h>
+#endif
+
+#include <linux/nbsd-namespace.h>
+
/* from BKL pushdown */
+#ifndef __NetBSD__
DEFINE_MUTEX(drm_global_mutex);
+#endif
/**
* DOC: file operations
@@ -131,7 +140,9 @@ struct drm_file *drm_file_alloc(struct d
if (!file)
return ERR_PTR(-ENOMEM);
+#ifndef __NetBSD__
file->pid = get_pid(task_pid(current));
+#endif
file->minor = minor;
/* for compatibility root is always authenticated */
@@ -143,10 +154,19 @@ struct drm_file *drm_file_alloc(struct d
INIT_LIST_HEAD(&file->blobs);
INIT_LIST_HEAD(&file->pending_event_list);
INIT_LIST_HEAD(&file->event_list);
+#ifdef __NetBSD__
+ DRM_INIT_WAITQUEUE(&file->event_wait, "drmevent");
+ selinit(&file->event_selq);
+#else
init_waitqueue_head(&file->event_wait);
+#endif
file->event_space = 4096; /* set aside 4k for event buffer */
+#ifdef __NetBSD__
+ file->event_read_lock = NULL;
+#else
mutex_init(&file->event_read_lock);
+#endif
if (drm_core_check_feature(dev, DRIVER_GEM))
drm_gem_open(dev, file);
@@ -170,7 +190,18 @@ out_prime_destroy:
drm_syncobj_release(file);
if (drm_core_check_feature(dev, DRIVER_GEM))
drm_gem_release(dev, file);
+#ifdef __NetBSD__
+ KASSERT(file->event_read_lock == NULL);
+#else
+ mutex_destroy(&file->event_read_lock);
+#endif
+ mutex_destroy(&file->fbs_lock);
+#ifdef __NetBSD__
+ DRM_DESTROY_WAITQUEUE(&file->event_wait);
+ seldestroy(&file->event_selq);
+#else
put_pid(file->pid);
+#endif
kfree(file);
return ERR_PTR(ret);
@@ -224,7 +255,11 @@ void drm_file_free(struct drm_file *file
DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
task_pid_nr(current),
+#ifdef __NetBSD__
+ (unsigned long)device_unit(file->minor->dev->dev),
+#else
(long)old_encode_dev(file->minor->kdev->devt),
+#endif
dev->open_count);
if (drm_core_check_feature(dev, DRIVER_LEGACY) &&
@@ -262,10 +297,18 @@ void drm_file_free(struct drm_file *file
WARN_ON(!list_empty(&file->event_list));
+#ifdef __NetBSD__
+ DRM_DESTROY_WAITQUEUE(&file->event_wait);
+ seldestroy(&file->event_selq);
+#else
put_pid(file->pid);
+ mutex_destroy(&file->event_read_lock);
+#endif
+ mutex_destroy(&file->fbs_lock);
kfree(file);
}
+#ifndef __NetBSD__
static void drm_close_helper(struct file *filp)
{
struct drm_file *file_priv = filp->private_data;
@@ -277,12 +320,14 @@ static void drm_close_helper(struct file
drm_file_free(file_priv);
}
+#endif
/*
* Check whether DRI will run on this CPU.
*
* \return non-zero if the DRI will run on this CPU, or zero otherwise.
*/
+__unused
static int drm_cpu_valid(void)
{
#if defined(__sparc__) && !defined(__sparc_v9__)
@@ -301,6 +346,7 @@ static int drm_cpu_valid(void)
* Creates and initializes a drm_file structure for the file private data in \p
* filp and add it into the double linked list in \p dev.
*/
+#ifndef __NetBSD__
static int drm_open_helper(struct file *filp, struct drm_minor *minor)
{
struct drm_device *dev = minor->dev;
@@ -358,6 +404,7 @@ static int drm_open_helper(struct file *
return 0;
}
+#endif
/**
* drm_open - open method for DRM file
@@ -372,6 +419,7 @@ static int drm_open_helper(struct file *
*
* 0 on success or negative errno value on falure.
*/
+#ifndef __NetBSD__
int drm_open(struct inode *inode, struct file *filp)
{
struct drm_device *dev;
@@ -408,6 +456,7 @@ err_undo:
return retcode;
}
EXPORT_SYMBOL(drm_open);
+#endif
void drm_lastclose(struct drm_device * dev)
{
@@ -437,6 +486,7 @@ void drm_lastclose(struct drm_device * d
*
* Always succeeds and returns 0.
*/
+#ifndef __NetBSD__
int drm_release(struct inode *inode, struct file *filp)
{
struct drm_file *file_priv = filp->private_data;
@@ -459,6 +509,7 @@ int drm_release(struct inode *inode, str
return 0;
}
EXPORT_SYMBOL(drm_release);
+#endif
/**
* drm_read - read method for DRM file
@@ -486,6 +537,7 @@ EXPORT_SYMBOL(drm_release);
* Number of bytes read (always aligned to full events, and can be 0) or a
* negative error code on failure.
*/
+#ifndef __NetBSD__
ssize_t drm_read(struct file *filp, char __user *buffer,
size_t count, loff_t *offset)
{
@@ -556,6 +608,7 @@ put_back_event:
return ret;
}
EXPORT_SYMBOL(drm_read);
+#endif
/**
* drm_poll - poll method for DRM file
@@ -573,6 +626,7 @@ EXPORT_SYMBOL(drm_read);
*
* Mask of POLL flags indicating the current status of the file.
*/
+#ifndef __NetBSD__
__poll_t drm_poll(struct file *filp, struct poll_table_struct *wait)
{
struct drm_file *file_priv = filp->private_data;
@@ -586,6 +640,7 @@ __poll_t drm_poll(struct file *filp, str
return mask;
}
EXPORT_SYMBOL(drm_poll);
+#endif
/**
* drm_event_reserve_init_locked - init a DRM event and reserve space for it
@@ -733,7 +788,12 @@ void drm_send_event_locked(struct drm_de
list_del(&e->pending_link);
list_add_tail(&e->link,
&e->file_priv->event_list);
+#ifdef __NetBSD__
+ DRM_SPIN_WAKEUP_ONE(&e->file_priv->event_wait, &dev->event_lock);
+ selnotify(&e->file_priv->event_selq, POLLIN|POLLRDNORM, NOTE_SUBMIT);
+#else
wake_up_interruptible(&e->file_priv->event_wait);
+#endif
}
EXPORT_SYMBOL(drm_send_event_locked);
@@ -776,6 +836,7 @@ EXPORT_SYMBOL(drm_send_event);
* RETURNS:
* Pointer to newly created struct file, ERR_PTR on failure.
*/
+#ifndef __NetBSD__
struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags)
{
struct drm_device *dev = minor->dev;
@@ -801,3 +862,4 @@ struct file *mock_drm_getfile(struct drm
return file;
}
EXPORT_SYMBOL_FOR_TESTS_ONLY(mock_drm_getfile);
+#endif
Index: src/sys/external/bsd/drm2/drm/drm_cdevsw.c
diff -u src/sys/external/bsd/drm2/drm/drm_cdevsw.c:1.25 src/sys/external/bsd/drm2/drm/drm_cdevsw.c:1.26
--- src/sys/external/bsd/drm2/drm/drm_cdevsw.c:1.25 Sun Dec 19 10:35:59 2021
+++ src/sys/external/bsd/drm2/drm/drm_cdevsw.c Sun Dec 19 10:45:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_cdevsw.c,v 1.25 2021/12/19 10:35:59 riastradh Exp $ */
+/* $NetBSD: drm_cdevsw.c,v 1.26 2021/12/19 10:45:33 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_cdevsw.c,v 1.25 2021/12/19 10:35:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_cdevsw.c,v 1.26 2021/12/19 10:45:33 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -69,8 +69,6 @@ __KERNEL_RCSID(0, "$NetBSD: drm_cdevsw.c
static dev_type_open(drm_open);
-static int drm_firstopen(struct drm_device *);
-
static int drm_close(struct file *);
static int drm_read(struct file *, off_t *, struct uio *, kauth_cred_t,
int);
@@ -122,15 +120,19 @@ drm_open(dev_t d, int flags, int fmt, st
{
struct drm_minor *dminor;
struct drm_device *dev;
- bool firstopen, lastclose;
+ bool lastclose;
int fd;
struct file *fp;
+ struct drm_file *priv;
+ int need_setup = 0;
int error;
error = drm_guarantee_initialized();
if (error)
goto fail0;
+ /* Synchronize with drm_file.c, drm_open and drm_open_helper. */
+
if (flags & O_EXCL) {
error = EBUSY;
goto fail0;
@@ -154,35 +156,51 @@ drm_open(dev_t d, int flags, int fmt, st
error = EBUSY;
goto fail1;
}
- firstopen = (dev->open_count == 0);
- dev->open_count++;
+ if (dev->open_count++ == 0)
+ need_setup = 1;
mutex_unlock(&drm_global_mutex);
- if (firstopen) {
- /* XXX errno Linux->NetBSD */
- error = -drm_firstopen(dev);
- if (error)
- goto fail2;
- }
-
error = fd_allocfile(&fp, &fd);
if (error)
goto fail2;
- struct drm_file *const file = kmem_zalloc(sizeof(*file), KM_SLEEP);
- /* XXX errno Linux->NetBSD */
- error = -drm_open_file(file, fp, dminor);
- if (error)
+ priv = drm_file_alloc(dminor);
+ if (IS_ERR(priv)) {
+ /* XXX errno Linux->NetBSD */
+ error = -PTR_ERR(priv);
goto fail3;
+ }
- error = fd_clone(fp, fd, flags, &drm_fileops, file);
+ if (drm_is_primary_client(priv)) {
+ /* XXX errno Linux->NetBSD */
+ error = -drm_master_open(priv);
+ if (error)
+ goto fail4;
+ }
+
+ mutex_lock(&dev->filelist_mutex);
+ list_add(&priv->lhead, &dev->filelist);
+ mutex_unlock(&dev->filelist_mutex);
+ /* XXX Alpha hose? */
+
+ if (need_setup) {
+ /* XXX errno Linux->NetBSD */
+ error = -drm_legacy_setup(dev);
+ if (error)
+ goto fail5;
+ }
+
+ error = fd_clone(fp, fd, flags, &drm_fileops, priv);
KASSERT(error == EMOVEFD); /* XXX */
/* Success! (But error has to be EMOVEFD, not 0.) */
return error;
-fail3: kmem_free(file, sizeof(*file));
- fd_abort(curproc, fp, fd);
+fail5: mutex_lock(&dev->filelist_mutex);
+ list_del(&priv->lhead);
+ mutex_unlock(&dev->filelist_mutex);
+fail4: drm_file_free(priv);
+fail3: fd_abort(curproc, fp, fd);
fail2: mutex_lock(&drm_global_mutex);
KASSERT(0 < dev->open_count);
--dev->open_count;
@@ -200,13 +218,18 @@ fail0: KASSERT(error);
static int
drm_close(struct file *fp)
{
- struct drm_file *const file = fp->f_data;
- struct drm_minor *const dminor = file->minor;
+ struct drm_file *const priv = fp->f_data;
+ struct drm_minor *const dminor = priv->minor;
struct drm_device *const dev = dminor->dev;
bool lastclose;
- drm_close_file(file);
- kmem_free(file, sizeof(*file));
+ /* Synchronize with drm_file.c, drm_release. */
+
+ mutex_lock(&dev->filelist_mutex);
+ list_del(&priv->lhead);
+ mutex_unlock(&dev->filelist_mutex);
+
+ drm_file_free(priv);
mutex_lock(&drm_global_mutex);
KASSERT(0 < dev->open_count);
@@ -223,66 +246,6 @@ drm_close(struct file *fp)
}
static int
-drm_firstopen(struct drm_device *dev)
-{
- int ret;
-
- if (drm_core_check_feature(dev, DRIVER_MODESET))
- return 0;
-
- if (dev->driver->firstopen) {
- ret = (*dev->driver->firstopen)(dev);
- if (ret)
- goto fail0;
- }
-
- ret = drm_legacy_dma_setup(dev);
- if (ret)
- goto fail1;
-
- return 0;
-
-fail2: __unused
-#if IS_ENABLED(CONFIG_DRM_LEGACY)
- drm_legacy_dma_takedown(dev);
-#endif
-fail1: if (dev->driver->lastclose)
- (*dev->driver->lastclose)(dev);
-fail0: KASSERT(ret);
- return ret;
-}
-
-void
-drm_lastclose(struct drm_device *dev)
-{
-
- /* XXX Order is sketchy here... */
- if (dev->driver->lastclose)
- (*dev->driver->lastclose)(dev);
- if (dev->irq_enabled && !drm_core_check_feature(dev, DRIVER_MODESET))
- drm_irq_uninstall(dev);
-
- mutex_lock(&dev->struct_mutex);
- if (dev->agp)
- drm_legacy_agp_clear(dev);
-#if IS_ENABLED(CONFIG_DRM_LEGACY)
- drm_legacy_sg_cleanup(dev);
- drm_legacy_dma_takedown(dev);
-#endif
- mutex_unlock(&dev->struct_mutex);
-
- /* XXX Synchronize with drm_legacy_dev_reinit. */
- if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
-#if IS_ENABLED(CONFIG_DRM_LEGACY)
- dev->sigdata.lock = NULL;
- dev->context_flag = 0;
- dev->last_context = 0;
-#endif
- dev->if_version = 0;
- }
-}
-
-static int
drm_read(struct file *fp, off_t *off, struct uio *uio, kauth_cred_t cred,
int flags)
{
Index: src/sys/external/bsd/drm2/drm/files.drmkms
diff -u src/sys/external/bsd/drm2/drm/files.drmkms:1.58 src/sys/external/bsd/drm2/drm/files.drmkms:1.59
--- src/sys/external/bsd/drm2/drm/files.drmkms:1.58 Sun Dec 19 10:39:57 2021
+++ src/sys/external/bsd/drm2/drm/files.drmkms Sun Dec 19 10:45:33 2021
@@ -1,4 +1,4 @@
-# $NetBSD: files.drmkms,v 1.58 2021/12/19 10:39:57 riastradh Exp $
+# $NetBSD: files.drmkms,v 1.59 2021/12/19 10:45:33 riastradh Exp $
version 20180827
@@ -115,7 +115,7 @@ file external/bsd/drm2/dist/drm/drm_edid
file external/bsd/drm2/dist/drm/drm_encoder.c drmkms
file external/bsd/drm2/i2c/drm_encoder_slave.c drmkms
file external/bsd/drm2/dist/drm/drm_fb_helper.c drmkms
-file external/bsd/drm2/drm/drm_file.c drmkms
+file external/bsd/drm2/dist/drm/drm_file.c drmkms
file external/bsd/drm2/dist/drm/drm_flip_work.c drmkms
#file external/bsd/drm2/dist/drm/drm_format_helper.c drmkms
file external/bsd/drm2/dist/drm/drm_fourcc.c drmkms