[PATCH RFC 1/2] Add required changes for audio packports

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>
---
 backport/Kconfig.sources                           |   2 +
 backport/Makefile.kernel                           |   2 +
 backport/backport-include/linux/firewire.h         |  12 +
 backport/backport-include/linux/genalloc.h         |   9 +
 backport/backport-include/linux/hrtimer.h          |  12 +
 backport/backport-include/linux/skbuff.h           |   2 +
 backport/backport-include/linux/uio.h              | 246 +++++++++++++++++++++
 dependencies                                       |   2 +
 .../sound/0001-pcm-native-fix-v41-changes.patch    | 128 +++++++++++
 patches/collateral-evolutions/sound/README         |   1 +
 10 files changed, 416 insertions(+)
 create mode 100644 backport/backport-include/linux/firewire.h
 create mode 100644 backport/backport-include/linux/genalloc.h
 create mode 100644 backport/backport-include/linux/hrtimer.h
 create mode 100644 backport/backport-include/linux/uio.h
 create mode 100644 patches/collateral-evolutions/sound/0001-pcm-native-fix-v41-changes.patch
 create mode 100644 patches/collateral-evolutions/sound/README

diff --git a/backport/Kconfig.sources b/backport/Kconfig.sources
index 5711433..b076648 100644
--- a/backport/Kconfig.sources
+++ b/backport/Kconfig.sources
@@ -22,3 +22,5 @@ source "$BACKPORT_DIR/net/mac802154/Kconfig"
 source "$BACKPORT_DIR/drivers/net/ieee802154/Kconfig"
 
 source "$BACKPORT_DIR/drivers/usb/class/Kconfig"
+
+source "$BACKPORT_DIR/sound/Kconfig"
\ No newline at end of file
diff --git a/backport/Makefile.kernel b/backport/Makefile.kernel
index 42333ad..cbdcd28 100644
--- a/backport/Makefile.kernel
+++ b/backport/Makefile.kernel
@@ -54,3 +54,5 @@ obj-$(CPTCFG_IEEE802154) += drivers/net/ieee802154/
 
 obj-$(CPTCFG_USB_WDM) += drivers/usb/class/
 obj-$(CPTCFG_USB_USBNET) += drivers/net/usb/
+
+obj-$(CPTCFG_SOUND) += sound/
diff --git a/backport/backport-include/linux/firewire.h b/backport/backport-include/linux/firewire.h
new file mode 100644
index 0000000..3306ce8
--- /dev/null
+++ b/backport/backport-include/linux/firewire.h
@@ -0,0 +1,12 @@
+#ifndef __BACKPORT_LINUX_FIREWIRE_H
+#define __BACKPORT_LINUX_FIREWIRE_H
+#include_next <linux/firewire.h>
+#include <linux/version.h>
+
+#if  LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0)
+
+void fw_schedule_bus_reset(struct fw_card *card, bool delayed,
+			   bool short_reset);
+#endif /* < 3.16 */
+
+#endif /* __BACKPORT_LINUX_FIREWIRE_H */
diff --git a/backport/backport-include/linux/genalloc.h b/backport/backport-include/linux/genalloc.h
new file mode 100644
index 0000000..a7917f3
--- /dev/null
+++ b/backport/backport-include/linux/genalloc.h
@@ -0,0 +1,9 @@
+#ifndef __BACKPORT_LINUX_GENALLOC_H
+#define __BACKPORT_LINUX_GENALLOC_H
+#include_next <linux/genalloc.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0)
+#define of_gen_pool_get of_get_named_gen_pool
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) */
+
+#endif /* __BACKPORT_LINUX_GENALLOC_H */
diff --git a/backport/backport-include/linux/hrtimer.h b/backport/backport-include/linux/hrtimer.h
new file mode 100644
index 0000000..e951315
--- /dev/null
+++ b/backport/backport-include/linux/hrtimer.h
@@ -0,0 +1,12 @@
+#ifndef __BACKPORT_LINUX_HRTIMER_H
+#define __BACKPORT_LINUX_HRTIMER_H
+#include_next <linux/hrtimer.h>
+#include <linux/version.h>
+
+#if  LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0)
+
+#define hrtimer_resolution	(unsigned int)LOW_RES_NSEC
+
+#endif /* < 4.2 */
+
+#endif /* __BACKPORT_LINUX_HRTIMER_H */
diff --git a/backport/backport-include/linux/skbuff.h b/backport/backport-include/linux/skbuff.h
index a21e6cc..2c56141 100644
--- a/backport/backport-include/linux/skbuff.h
+++ b/backport/backport-include/linux/skbuff.h
@@ -258,6 +258,8 @@ static inline struct page *dev_alloc_page(void)
 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) */
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
+
+#include <linux/uio.h>
 #define skb_copy_datagram_msg LINUX_BACKPORT(skb_copy_datagram_msg)
 static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
 					struct msghdr *msg, int size)
diff --git a/backport/backport-include/linux/uio.h b/backport/backport-include/linux/uio.h
new file mode 100644
index 0000000..0aa5e87
--- /dev/null
+++ b/backport/backport-include/linux/uio.h
@@ -0,0 +1,246 @@
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0))
+#include_next <linux/uio.h>
+
+#ifndef __iter_is_iovec_h_
+#define __iter_is_iovec_h_
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0))
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0))
+
+/* iov_iter is defined elsewhere */
+#include_next <linux/fs.h>
+static inline bool iter_is_iovec(struct iov_iter *i)
+{
+	return true;
+}
+
+#else
+static inline bool iter_is_iovec(struct iov_iter *i)
+{
+	return !(i->type & (ITER_BVEC | ITER_KVEC));
+}
+#endif
+#endif
+
+#endif /* __iter_is_iovec_h_ */
+
+#else
+
+#ifndef _LINUX_UIO_H
+#define _LINUX_UIO_H
+
+/*
+ * A set of types for the internal kernel types representing uids and gids.
+ *
+ * The types defined in this header allow distinguishing which uids and gids in
+ * the kernel are values used by userspace and which uid and gid values are
+ * the internal kernel values.  With the addition of user namespaces the values
+ * can be different.  Using the type system makes it possible for the compiler
+ * to detect when we overlook these differences.
+ *
+ */
+#include <linux/types.h>
+#include <linux/highuid.h>
+
+struct user_namespace;
+extern struct user_namespace init_user_ns;
+
+#ifdef CONFIG_UIO_STRICT_TYPE_CHECKS
+
+typedef struct {
+	uid_t val;
+} kuid_t;
+
+
+typedef struct {
+	gid_t val;
+} kgid_t;
+
+#define KUIDT_INIT(value) (kuid_t){ value }
+#define KGIDT_INIT(value) (kgid_t){ value }
+
+static inline uid_t __kuid_val(kuid_t uid)
+{
+	return uid.val;
+}
+
+static inline gid_t __kgid_val(kgid_t gid)
+{
+	return gid.val;
+}
+
+#else
+
+typedef uid_t kuid_t;
+typedef gid_t kgid_t;
+
+static inline uid_t __kuid_val(kuid_t uid)
+{
+	return uid;
+}
+
+static inline gid_t __kgid_val(kgid_t gid)
+{
+	return gid;
+}
+
+#define KUIDT_INIT(value) ((kuid_t) value )
+#define KGIDT_INIT(value) ((kgid_t) value )
+
+#endif
+
+#define GLOBAL_ROOT_UID KUIDT_INIT(0)
+#define GLOBAL_ROOT_GID KGIDT_INIT(0)
+
+#define INVALID_UID KUIDT_INIT(-1)
+#define INVALID_GID KGIDT_INIT(-1)
+
+static inline bool uid_eq(kuid_t left, kuid_t right)
+{
+	return __kuid_val(left) == __kuid_val(right);
+}
+
+static inline bool gid_eq(kgid_t left, kgid_t right)
+{
+	return __kgid_val(left) == __kgid_val(right);
+}
+
+static inline bool uid_gt(kuid_t left, kuid_t right)
+{
+	return __kuid_val(left) > __kuid_val(right);
+}
+
+static inline bool gid_gt(kgid_t left, kgid_t right)
+{
+	return __kgid_val(left) > __kgid_val(right);
+}
+
+static inline bool uid_gte(kuid_t left, kuid_t right)
+{
+	return __kuid_val(left) >= __kuid_val(right);
+}
+
+static inline bool gid_gte(kgid_t left, kgid_t right)
+{
+	return __kgid_val(left) >= __kgid_val(right);
+}
+
+static inline bool uid_lt(kuid_t left, kuid_t right)
+{
+	return __kuid_val(left) < __kuid_val(right);
+}
+
+static inline bool gid_lt(kgid_t left, kgid_t right)
+{
+	return __kgid_val(left) < __kgid_val(right);
+}
+
+static inline bool uid_lte(kuid_t left, kuid_t right)
+{
+	return __kuid_val(left) <= __kuid_val(right);
+}
+
+static inline bool gid_lte(kgid_t left, kgid_t right)
+{
+	return __kgid_val(left) <= __kgid_val(right);
+}
+
+static inline bool uid_valid(kuid_t uid)
+{
+	return !uid_eq(uid, INVALID_UID);
+}
+
+static inline bool gid_valid(kgid_t gid)
+{
+	return !gid_eq(gid, INVALID_GID);
+}
+
+#ifdef CONFIG_USER_NS
+
+#define make_kuid LINUX_BACKPORT(make_kuid)
+extern kuid_t make_kuid(struct user_namespace *from, uid_t uid);
+#define make_kgid LINUX_BACKPORT(make_kgid)
+extern kgid_t make_kgid(struct user_namespace *from, gid_t gid);
+
+#define from_kuid LINUX_BACKPORT(from_kuid)
+extern uid_t from_kuid(struct user_namespace *to, kuid_t uid);
+#define from_kgid LINUX_BACKPORT(from_kgid)
+extern gid_t from_kgid(struct user_namespace *to, kgid_t gid);
+#define from_kuid_munged LINUX_BACKPORT(from_kuid_munged)
+extern uid_t from_kuid_munged(struct user_namespace *to, kuid_t uid);
+#define from_kgid_munged LINUX_BACKPORT(from_kgid_munged)
+extern gid_t from_kgid_munged(struct user_namespace *to, kgid_t gid);
+
+#define kuid_has_mapping LINUX_BACKPORT(kuid_has_mapping)
+static inline bool kuid_has_mapping(struct user_namespace *ns, kuid_t uid)
+{
+	return from_kuid(ns, uid) != (uid_t) -1;
+}
+
+#define kgid_has_mapping LINUX_BACKPORT(kgid_has_mapping)
+static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid)
+{
+	return from_kgid(ns, gid) != (gid_t) -1;
+}
+
+#else
+
+#define make_kuid LINUX_BACKPORT(make_kuid)
+static inline kuid_t make_kuid(struct user_namespace *from, uid_t uid)
+{
+	return KUIDT_INIT(uid);
+}
+
+#define make_kgid LINUX_BACKPORT(make_kgid)
+static inline kgid_t make_kgid(struct user_namespace *from, gid_t gid)
+{
+	return KGIDT_INIT(gid);
+}
+
+#define from_kuid LINUX_BACKPORT(from_kuid)
+static inline uid_t from_kuid(struct user_namespace *to, kuid_t kuid)
+{
+	return __kuid_val(kuid);
+}
+
+#define from_kgid LINUX_BACKPORT(from_kgid)
+static inline gid_t from_kgid(struct user_namespace *to, kgid_t kgid)
+{
+	return __kgid_val(kgid);
+}
+
+#define from_kuid_munged LINUX_BACKPORT(from_kuid_munged)
+static inline uid_t from_kuid_munged(struct user_namespace *to, kuid_t kuid)
+{
+	uid_t uid = from_kuid(to, kuid);
+	if (uid == (uid_t)-1)
+		uid = overflowuid;
+	return uid;
+}
+
+#define from_kgid_munged LINUX_BACKPORT(from_kgid_munged)
+static inline gid_t from_kgid_munged(struct user_namespace *to, kgid_t kgid)
+{
+	gid_t gid = from_kgid(to, kgid);
+	if (gid == (gid_t)-1)
+		gid = overflowgid;
+	return gid;
+}
+
+#define kuid_has_mapping LINUX_BACKPORT(kuid_has_mapping)
+static inline bool kuid_has_mapping(struct user_namespace *ns, kuid_t uid)
+{
+	return true;
+}
+
+#define kgid_has_mapping LINUX_BACKPORT(kgid_has_mapping)
+static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid)
+{
+	return true;
+}
+
+#endif /* CONFIG_USER_NS */
+
+#endif /* _LINUX_UIO_H */
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) */
diff --git a/dependencies b/dependencies
index ba78004..bd84a6e 100644
--- a/dependencies
+++ b/dependencies
@@ -178,3 +178,5 @@ IGB 3.5
 
 # This driver needs mmc_hw_reset() which was added in kernel version 3.2
 MWIFIEX_SDIO 3.2
+
+SOUND 3.13
\ No newline at end of file
diff --git a/patches/collateral-evolutions/sound/0001-pcm-native-fix-v41-changes.patch b/patches/collateral-evolutions/sound/0001-pcm-native-fix-v41-changes.patch
new file mode 100644
index 0000000..12a57c5
--- /dev/null
+++ b/patches/collateral-evolutions/sound/0001-pcm-native-fix-v41-changes.patch
@@ -0,0 +1,128 @@
+diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
+index 75888dd..2b4a149 100644
+--- a/sound/core/pcm_native.c
++++ b/sound/core/pcm_native.c
+@@ -3068,6 +3068,91 @@ static ssize_t snd_pcm_write(struct file *file, const char __user *buf,
+ 	return result;
+ }
+ 
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
++
++/*
++ * FIXME: this structure is in aio.h or linux/include.h,
++ * include it here for now to avoid compilation issues
++ */
++
++struct kiocb {
++	struct file		*ki_filp;
++	loff_t			ki_pos;
++	void (*ki_complete)(struct kiocb *iocb, long ret, long ret2);
++	void			*private;
++	int			ki_flags;
++};
++
++static ssize_t snd_pcm_aio_read(struct kiocb *iocb, const struct iovec *iov,
++			     unsigned long nr_segs, loff_t pos)
++
++{
++	struct snd_pcm_file *pcm_file;
++	struct snd_pcm_substream *substream;
++	struct snd_pcm_runtime *runtime;
++	snd_pcm_sframes_t result;
++	unsigned long i;
++	void __user **bufs;
++	snd_pcm_uframes_t frames;
++
++	pcm_file = iocb->ki_filp->private_data;
++	substream = pcm_file->substream;
++	if (PCM_RUNTIME_CHECK(substream))
++		return -ENXIO;
++	runtime = substream->runtime;
++	if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
++		return -EBADFD;
++	if (nr_segs > 1024 || nr_segs != runtime->channels)
++		return -EINVAL;
++	if (!frame_aligned(runtime, iov->iov_len))
++		return -EINVAL;
++	frames = bytes_to_samples(runtime, iov->iov_len);
++	bufs = kmalloc(sizeof(void *) * nr_segs, GFP_KERNEL);
++	if (bufs == NULL)
++		return -ENOMEM;
++	for (i = 0; i < nr_segs; ++i)
++		bufs[i] = iov[i].iov_base;
++	result = snd_pcm_lib_readv(substream, bufs, frames);
++	if (result > 0)
++		result = frames_to_bytes(runtime, result);
++	kfree(bufs);
++	return result;
++}
++
++static ssize_t snd_pcm_aio_write(struct kiocb *iocb, const struct iovec *iov,
++			      unsigned long nr_segs, loff_t pos)
++{
++	struct snd_pcm_file *pcm_file;
++	struct snd_pcm_substream *substream;
++	struct snd_pcm_runtime *runtime;
++	snd_pcm_sframes_t result;
++	unsigned long i;
++	void __user **bufs;
++	snd_pcm_uframes_t frames;
++
++	pcm_file = iocb->ki_filp->private_data;
++	substream = pcm_file->substream;
++	if (PCM_RUNTIME_CHECK(substream))
++		return -ENXIO;
++	runtime = substream->runtime;
++	if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
++		return -EBADFD;
++	if (nr_segs > 128 || nr_segs != runtime->channels ||
++	    !frame_aligned(runtime, iov->iov_len))
++		return -EINVAL;
++	frames = bytes_to_samples(runtime, iov->iov_len);
++	bufs = kmalloc(sizeof(void *) * nr_segs, GFP_KERNEL);
++	if (bufs == NULL)
++		return -ENOMEM;
++	for (i = 0; i < nr_segs; ++i)
++		bufs[i] = iov[i].iov_base;
++	result = snd_pcm_lib_writev(substream, bufs, frames);
++	if (result > 0)
++		result = frames_to_bytes(runtime, result);
++	kfree(bufs);
++	return result;
++}
++#else
+ static ssize_t snd_pcm_readv(struct kiocb *iocb, struct iov_iter *to)
+ {
+ 	struct snd_pcm_file *pcm_file;
+@@ -3138,6 +3223,7 @@ static ssize_t snd_pcm_writev(struct kiocb *iocb, struct iov_iter *from)
+ 	kfree(bufs);
+ 	return result;
+ }
++#endif
+ 
+ static unsigned int snd_pcm_playback_poll(struct file *file, poll_table * wait)
+ {
+@@ -3669,7 +3755,11 @@ const struct file_operations snd_pcm_f_ops[2] = {
+ 	{
+ 		.owner =		THIS_MODULE,
+ 		.write =		snd_pcm_write,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
++		.aio_write =             snd_pcm_aio_write,
++#else
+ 		.write_iter =		snd_pcm_writev,
++#endif
+ 		.open =			snd_pcm_playback_open,
+ 		.release =		snd_pcm_release,
+ 		.llseek =		no_llseek,
+@@ -3683,7 +3773,11 @@ const struct file_operations snd_pcm_f_ops[2] = {
+ 	{
+ 		.owner =		THIS_MODULE,
+ 		.read =			snd_pcm_read,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
++		.aio_read =             snd_pcm_aio_read,
++#else
+ 		.read_iter =		snd_pcm_readv,
++#endif
+ 		.open =			snd_pcm_capture_open,
+ 		.release =		snd_pcm_release,
+ 		.llseek =		no_llseek,
diff --git a/patches/collateral-evolutions/sound/README b/patches/collateral-evolutions/sound/README
new file mode 100644
index 0000000..4797e65
--- /dev/null
+++ b/patches/collateral-evolutions/sound/README
@@ -0,0 +1 @@
+This holds collateral evolutions that apply to any driver we backport
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe backports" in



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux