kms/impl-device: Add function to get a non-master fd
Add meta_kms_impl_device_open_non_privileged_fd() that returns a non-master file descriptor for a MetaKmsImplDevice. It'll be required to implement wp_drm_lease_device_v1_send_drm_fd() in a future commit. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3746>
This commit is contained in:
parent
4a5fcef38d
commit
4e4d88e537
@ -20,6 +20,7 @@
|
||||
#include "backends/native/meta-kms-impl-device.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <linux/dma-buf.h>
|
||||
#include <sys/ioctl.h>
|
||||
@ -1193,6 +1194,52 @@ meta_kms_impl_device_get_fd (MetaKmsImplDevice *impl_device)
|
||||
return meta_device_file_get_fd (priv->device_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_kms_impl_device_open_non_privileged_fd:
|
||||
* @impl_device: a #MetaKmsImplDevice object
|
||||
*
|
||||
* Returns a non-master file descriptor for the given impl_device. The caller is
|
||||
* responsable of closing the file descriptor.
|
||||
*
|
||||
* On error, returns a negative value.
|
||||
*/
|
||||
int
|
||||
meta_kms_impl_device_open_non_privileged_fd (MetaKmsImplDevice *impl_device)
|
||||
{
|
||||
int fd;
|
||||
const char *path;
|
||||
MetaKmsImplDevicePrivate *priv =
|
||||
meta_kms_impl_device_get_instance_private (impl_device);
|
||||
|
||||
if (!priv->device_file)
|
||||
return -1;
|
||||
|
||||
path = meta_device_file_get_path (priv->device_file);
|
||||
|
||||
fd = open (path, O_RDWR | O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
{
|
||||
meta_topic (META_DEBUG_KMS,
|
||||
"Error getting non-master fd for device at '%s': %s",
|
||||
path,
|
||||
g_strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (drmIsMaster (fd))
|
||||
{
|
||||
if (drmDropMaster (fd) < 0)
|
||||
{
|
||||
meta_topic (META_DEBUG_KMS,
|
||||
"Error dropping master for device at '%s'",
|
||||
path);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_kms_impl_device_get_signaled_sync_file:
|
||||
* @impl_device: a #MetaKmsImplDevice object
|
||||
|
@ -165,6 +165,8 @@ void meta_kms_impl_device_hold_fd (MetaKmsImplDevice *impl_device);
|
||||
|
||||
void meta_kms_impl_device_unhold_fd (MetaKmsImplDevice *impl_device);
|
||||
|
||||
int meta_kms_impl_device_open_non_privileged_fd (MetaKmsImplDevice *impl_device);
|
||||
|
||||
int meta_kms_impl_device_get_signaled_sync_file (MetaKmsImplDevice *impl_device);
|
||||
|
||||
MetaKmsResourceChanges meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,
|
||||
|
Loading…
x
Reference in New Issue
Block a user