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 "backends/native/meta-kms-impl-device.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <linux/dma-buf.h>
|
#include <linux/dma-buf.h>
|
||||||
#include <sys/ioctl.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);
|
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:
|
* meta_kms_impl_device_get_signaled_sync_file:
|
||||||
* @impl_device: a #MetaKmsImplDevice object
|
* @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);
|
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);
|
int meta_kms_impl_device_get_signaled_sync_file (MetaKmsImplDevice *impl_device);
|
||||||
|
|
||||||
MetaKmsResourceChanges meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,
|
MetaKmsResourceChanges meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user