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

Reply via email to