From 74177dcd4f59616dd096186dc71aa531cfd6faff Mon Sep 17 00:00:00 2001 From: "Wang, Kai Z" Date: Thu, 31 Jul 2025 16:11:01 +0800 Subject: [PATCH 1/2] [DO NOT MERGE] Remove kernel BSP diff for kernel 6.1 Signed-off-by: Wang, Kai Z --- ...-make-vmmouse-report-relative-values.patch | 28 - .../0002-greybus-Remove-Android.mk.patch | 33 - .../0003-Bluetooth-SCO-USB-driver.patch | 1128 ----------- ...-GET_DEF-probe-quirk-for-C922-camera.patch | 40 - ...005-btusb-snd-crash-while-disconnect.patch | 31 - ...Add-reset-on-close-quirk-for-Intel-a.patch | 39 - ...-aborts-when-use-wait_event_killable.patch | 40 - ...or-command-support-in-iwlwifi-driver.patch | 335 --- ...cs-Ignore-L4_PAGE_OFFSET-relocations.patch | 30 - ...ched-with-usleep_range-to-avoid-dead.patch | 57 - ...lchain-from-prebuilts-instead-of-gcc.patch | 28 - ...tusb_sco_snd_card-not-getting-probed.patch | 31 - ...d-support-for-AX211-GarfieldPeak-Gfp.patch | 26 - ...e-power-button-event-to-user-space-w.patch | 74 - ...IO-Freeze-and-Restore-Implementation.patch | 152 -- .../0016-Skip-hw-pmu-for-VM-on-ADL.patch | 38 - ...Add-reset-on-close-quirk-for-Intel-a.patch | 34 - ...in-few-setups-due-to-change-introduc.patch | 37 - ...dating-dummy-cpufreq_frequency_table.patch | 40 - ...-make-vmmouse-report-relative-values.patch | 28 - .../0002-greybus-Remove-Android.mk.patch | 33 - .../0003-Bluetooth-SCO-USB-driver.patch | 1127 ----------- ...-GET_DEF-probe-quirk-for-C922-camera.patch | 40 - ...005-btusb-snd-crash-while-disconnect.patch | 31 - ...Add-reset-on-close-quirk-for-Intel-a.patch | 35 - ...-aborts-when-use-wait_event_killable.patch | 40 - ...or-command-support-in-iwlwifi-driver.patch | 338 ---- ...cs-Ignore-L4_PAGE_OFFSET-relocations.patch | 30 - ...-cond_resched-with-usleep_range-to-a.patch | 57 - ...esnot-support-I-option.-So-replaced-.patch | 30 - ...tusb_sco_snd_card-not-getting-probed.patch | 39 - ...sfs-interface-to-get-GFX-shmem-usage.patch | 1800 ----------------- ...er-and-firmware-version-query-suppor.patch | 163 -- ...P-support-for-AX211-GarfieldPeak-Gfp.patch | 26 - ...e-power-button-event-to-user-space-w.patch | 74 - .../0020-Skip-hw-pmu-for-VM-on-ADL.patch | 38 - .../0021-fix-for-static-analysis-issues.patch | 45 - ...dating-dummy-cpufreq_frequency_table.patch | 40 - 38 files changed, 6235 deletions(-) delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0001-make-vmmouse-report-relative-values.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0002-greybus-Remove-Android.mk.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0003-Bluetooth-SCO-USB-driver.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0005-btusb-snd-crash-while-disconnect.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0007-9p-freezing-aborts-when-use-wait_event_killable.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0010-replace-cond_resched-with-usleep_range-to-avoid-dead.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0011-Use-clang-toolchain-from-prebuilts-instead-of-gcc.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0013-Add-support-for-AX211-GarfieldPeak-Gfp.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0014-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0015-VIRTIO-Freeze-and-Restore-Implementation.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0016-Skip-hw-pmu-for-VM-on-ADL.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0017-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0018-Fix-build-error-in-few-setups-due-to-change-introduc.patch delete mode 100644 bsp_diff/common/kernel/linux-intel-lts2021/0019-updating-dummy-cpufreq_frequency_table.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0001-make-vmmouse-report-relative-values.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0002-greybus-Remove-Android.mk.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0003-Bluetooth-SCO-USB-driver.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0005-btusb-snd-crash-while-disconnect.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0007-9p-freezing-aborts-when-use-wait_event_killable.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0010-drm-i915-replace-cond_resched-with-usleep_range-to-a.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0011-Prebuilts-tar-doesnot-support-I-option.-So-replaced-.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0014-drm-i915-Sysfs-interface-to-get-GFX-shmem-usage.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0016-iwl7000-Add-driver-and-firmware-version-query-suppor.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0017-Add-HFP-support-for-AX211-GarfieldPeak-Gfp.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0018-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0020-Skip-hw-pmu-for-VM-on-ADL.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0021-fix-for-static-analysis-issues.patch delete mode 100644 bsp_diff/common/kernel/lts2021-chromium/0023-updating-dummy-cpufreq_frequency_table.patch diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0001-make-vmmouse-report-relative-values.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0001-make-vmmouse-report-relative-values.patch deleted file mode 100644 index f5cb5642ba..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0001-make-vmmouse-report-relative-values.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f21ce39a4e1484ebb8695540b9c55dede2c154df Mon Sep 17 00:00:00 2001 -From: Zhi Jin -Date: Mon, 22 Jul 2019 18:20:28 +0800 -Subject: [PATCH] make vmmouse report relative values - -Change-Id: I6a89e81ca93cabd8a35848ebe61c2a29ad928738 -Tracked-On: -Signed-off-by: Zhi Jin ---- - drivers/input/mouse/vmmouse.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git drivers/input/mouse/vmmouse.c drivers/input/mouse/vmmouse.c -index 148245c69be7..4d08675e7f65 100644 ---- drivers/input/mouse/vmmouse.c -+++ drivers/input/mouse/vmmouse.c -@@ -304,7 +304,7 @@ static int vmmouse_enable(struct psmouse *psmouse) - VMMOUSE_CMD(ABSPOINTER_RESTRICT, VMMOUSE_RESTRICT_CPL0, - dummy1, dummy2, dummy3, dummy4); - -- VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_ABSOLUTE, -+ VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_RELATIVE, - dummy1, dummy2, dummy3, dummy4); - - return 0; --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0002-greybus-Remove-Android.mk.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0002-greybus-Remove-Android.mk.patch deleted file mode 100644 index c69f1a567f..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0002-greybus-Remove-Android.mk.patch +++ /dev/null @@ -1,33 +0,0 @@ -From ec323197e0c351081d37f8b4e21e02b235f05311 Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Wed, 1 Apr 2020 21:44:26 +0530 -Subject: [PATCH] greybus: Remove Android.mk - -Remove Android.mk as redefine errors are seen when multiple -kernels projects are used in the Android build. - -Signed-off-by: Jeevaka Prabu Badrappan ---- - drivers/staging/greybus/tools/Android.mk | 10 ---------- - 1 file changed, 10 deletions(-) - delete mode 100644 drivers/staging/greybus/tools/Android.mk - -diff --git a/drivers/staging/greybus/tools/Android.mk b/drivers/staging/greybus/tools/Android.mk -deleted file mode 100644 -index fdadbf611757..000000000000 ---- a/drivers/staging/greybus/tools/Android.mk -+++ /dev/null -@@ -1,10 +0,0 @@ --LOCAL_PATH:= $(call my-dir) -- --include $(CLEAR_VARS) -- --LOCAL_SRC_FILES:= loopback_test.c --LOCAL_MODULE_TAGS := optional --LOCAL_MODULE := gb_loopback_test -- --include $(BUILD_EXECUTABLE) -- --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0003-Bluetooth-SCO-USB-driver.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0003-Bluetooth-SCO-USB-driver.patch deleted file mode 100644 index 099f577a24..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0003-Bluetooth-SCO-USB-driver.patch +++ /dev/null @@ -1,1128 +0,0 @@ -From 3a798d6cd175e37b2dc3b37b7ae45bf4bf99d319 Mon Sep 17 00:00:00 2001 -From: Aiswarya Cyriac -Date: Wed, 20 May 2020 10:55:20 +0530 -Subject: [PATCH] Bluetooth SCO USB driver. - -This driver is required if you want to use Bluetooth devices -with USB interface to support SCO. - -Tracked-On: OAM-91225 -Signed-off-by: Aiswarya Cyriac ---- - sound/usb/Kconfig | 1 + - sound/usb/Makefile | 1 + - sound/usb/btusb/Kconfig | 12 + - sound/usb/btusb/Makefile | 2 + - sound/usb/btusb/btusb_sco_snd_card.c | 1051 ++++++++++++++++++++++++++ - 5 files changed, 1067 insertions(+) - create mode 100644 sound/usb/btusb/Kconfig - create mode 100644 sound/usb/btusb/Makefile - create mode 100644 sound/usb/btusb/btusb_sco_snd_card.c - -diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig -index 059242f15d75..7258064f5451 100644 ---- a/sound/usb/Kconfig -+++ b/sound/usb/Kconfig -@@ -166,6 +166,7 @@ config SND_BCD2000 - will be called snd-bcd2000. - - source "sound/usb/line6/Kconfig" -+source "sound/usb/btusb/Kconfig" - - endif # SND_USB - -diff --git a/sound/usb/Makefile b/sound/usb/Makefile -index 56031026b113..d207077f4bc7 100644 ---- a/sound/usb/Makefile -+++ b/sound/usb/Makefile -@@ -34,3 +34,4 @@ obj-$(CONFIG_SND_USB_US122L) += snd-usbmidi-lib.o - - obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/ bcd2000/ - obj-$(CONFIG_SND_USB_LINE6) += line6/ -+obj-$(CONFIG_BT_SCOHCI) += btusb/ -diff --git a/sound/usb/btusb/Kconfig b/sound/usb/btusb/Kconfig -new file mode 100644 -index 000000000000..8b7ab476494a ---- /dev/null -+++ b/sound/usb/btusb/Kconfig -@@ -0,0 +1,12 @@ -+ -+config BT_SCOHCI -+ tristate "BT HCI USB driver" -+ depends on BT -+ help -+ Bluetooth SCO USB driver. -+ This driver is required if you want to use Bluetooth devices with -+ USB interface to support SCO. -+ -+ Say Y here to compile support for Bluetooth USB devices into the -+ kernel or say M to compile it as module (btusb) -+ -diff --git a/sound/usb/btusb/Makefile b/sound/usb/btusb/Makefile -new file mode 100644 -index 000000000000..e4bb8d72099b ---- /dev/null -+++ b/sound/usb/btusb/Makefile -@@ -0,0 +1,2 @@ -+ -+obj-$(CONFIG_BT_SCOHCI) += btusb_sco_snd_card.o -diff --git a/sound/usb/btusb/btusb_sco_snd_card.c b/sound/usb/btusb/btusb_sco_snd_card.c -new file mode 100644 -index 000000000000..71e2059e217c ---- /dev/null -+++ b/sound/usb/btusb/btusb_sco_snd_card.c -@@ -0,0 +1,1051 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+// -+// btusb_sco_snd_card.c -- ALSA USB audio driver for BT -+// SCO over USB -+// -+// Copyright (C) 2019 Intel Corp. -+// -+// Authors: Aiswarya Cyriac -+// Pankaj Bharadiya -+// Jeevaka Badrappan -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+#define BTUSB_INTEL_NEW 0x2000 -+#define DEVICE_INDEX 0 -+#define NUM_PLAYBACK_SUBSTREAMS 1 -+#define NUM_CAPTURE_SUBSTREAMS 1 -+#define SCO_HDR_SIZE 3 -+#define SCO_HANDLE_SIZE 2 -+#define SCO_LENGTH_FIELD_SIZE 1 -+#define MIN_PERIOD_SIZE 48 -+#define MAX_PACKET_SIZE (SCO_HDR_SIZE + MIN_PERIOD_SIZE) -+#define BTUSB_MAX_ISOC_FRAMES 10 -+#define BTUSB_SCO_ALTERNATE_SETTING 2 -+#define BTUSB_ISOC_TX_EP_CONFIGURED 1 -+#define BTUSB_ISOC_RX_EP_CONFIGURED 2 -+#define BTUSB_ISOC_TX_START 3 -+#define BTUSB_ISOC_RX_START 4 -+#define MAX_URBS 12 -+#define BUFF_SIZE_MAX (PAGE_SIZE * 16) -+#define PRD_SIZE_MAX PAGE_SIZE /*4096*/ -+#define MIN_PERIODS 4 -+ -+static struct usb_driver btusb_sco_driver; -+static DEFINE_MUTEX(config_mutex); -+ -+struct capture_data_cb { -+ unsigned char *buf; -+ unsigned int pos; -+ unsigned int expected; -+}; -+ -+struct btusb_data { -+ struct snd_card *card; -+ struct snd_pcm *pcm; -+ struct usb_device *udev; -+ struct usb_interface *intf; -+ -+ unsigned int isoc_ifnum; -+ -+ unsigned long flags; -+ -+ spinlock_t txlock; -+ spinlock_t rxlock; -+ -+ struct usb_endpoint_descriptor *isoc_tx_ep; -+ struct usb_endpoint_descriptor *isoc_rx_ep; -+ -+ unsigned int sco_num; -+ int alternate_setting_num; -+ uint8_t *playback_data; -+ -+ struct capture_data_cb *capture_data; -+ -+ struct snd_pcm_substream *playback_stream; -+ struct snd_pcm_substream *capture_stream; -+ -+ unsigned int playback_hwptr_done; -+ unsigned int playback_transfer_done; -+ unsigned int capture_hwptr_done; -+ -+ struct usb_anchor rx_anchor; -+ -+ struct urb *tx_urb; -+ struct urb *rx_urb[MAX_URBS]; -+}; -+ -+ -+uint8_t handle[2]; -+ -+static const struct usb_device_id btusb_sco_table[] = { -+ /* Intel Bluetooth devices */ -+ { USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0026), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL_NEW }, -+ { } /* Terminating entry */ -+}; -+ -+MODULE_DEVICE_TABLE(usb, btusb_sco_table); -+ -+static void btusb_isoc_tx_complete(struct urb *urb); -+ -+static struct capture_data_cb *init_capture_data_cb(void) -+{ -+ -+ struct capture_data_cb *cb; -+ -+ cb = kzalloc(sizeof(struct capture_data_cb), GFP_KERNEL); -+ if (!cb) -+ return NULL; -+ cb->buf = kzalloc(HCI_MAX_SCO_SIZE, GFP_KERNEL); -+ if (!cb->buf) { -+ kfree(cb); -+ return NULL; -+ } -+ cb->pos = 0; -+ cb->expected = 0; -+ -+ return cb; -+} -+ -+static void deinit_capture_data_cb(struct capture_data_cb *cb) -+{ -+ kfree(cb->buf); -+ kfree(cb); -+ cb = NULL; -+} -+ -+static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu) -+{ -+ int i, offset = 0; -+ -+ for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu; -+ i++, offset += mtu, len -= mtu) { -+ urb->iso_frame_desc[i].offset = offset; -+ urb->iso_frame_desc[i].length = mtu; -+ } -+ -+ if (len && i < BTUSB_MAX_ISOC_FRAMES) { -+ urb->iso_frame_desc[i].offset = offset; -+ urb->iso_frame_desc[i].length = len; -+ i++; -+ } -+ -+ urb->number_of_packets = i; -+} -+ -+static int btusb_isoc_initialize_tx_urb(struct btusb_data *data) -+{ -+ unsigned int pipe; -+ struct device *dev = &(data->udev->dev); -+ -+ if (!data->isoc_tx_ep) { -+ dev_err(dev, "%s - isoc_tx_ep is NULL\n", __func__); -+ return -ENODEV; -+ } -+ data->tx_urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); -+ if (!data->tx_urb) { -+ dev_err(dev, "%s - usb_alloc_urb is NULL\n", __func__); -+ return -ENOMEM; -+ } -+ -+ pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress); -+ -+ usb_fill_int_urb(data->tx_urb, data->udev, pipe, data->playback_data, -+ MAX_PACKET_SIZE, btusb_isoc_tx_complete, data, -+ data->isoc_tx_ep->bInterval); -+ -+ data->tx_urb->transfer_flags = URB_ISO_ASAP; -+ -+ __fill_isoc_descriptor(data->tx_urb, MAX_PACKET_SIZE, -+ le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); -+ -+ return 0; -+} -+ -+static void btusb_isoc_prepare_tx_urb(struct btusb_data *data) -+{ -+ unsigned int stride, frames, bytes; -+ static unsigned int oldptr; -+ uint8_t period_elapsed = 0; -+ unsigned long flags; -+ uint8_t *playback_buf; -+ struct snd_pcm_runtime *runtime; -+ -+ runtime = data->playback_stream->runtime; -+ stride = runtime->frame_bits >> 3; -+ // TODO: Check to be added in hw_params to reject other period size -+ bytes = MIN_PERIOD_SIZE; -+ playback_buf = data->playback_data; -+ -+ memcpy(playback_buf, handle, SCO_HANDLE_SIZE); -+ memcpy(playback_buf + SCO_HANDLE_SIZE, &bytes, SCO_LENGTH_FIELD_SIZE); -+ -+ spin_lock_irqsave(&data->txlock, flags); -+ oldptr = data->playback_hwptr_done; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ -+ if (oldptr + bytes > runtime->buffer_size * stride) { -+ /* err, the transferred area goes over buffer boundary. */ -+ unsigned int bytes1 = -+ runtime->buffer_size * stride - oldptr; -+ memcpy(playback_buf + SCO_HDR_SIZE, -+ runtime->dma_area + oldptr, bytes1); -+ memcpy(playback_buf + SCO_HDR_SIZE + bytes1, -+ runtime->dma_area + oldptr+bytes1, bytes - bytes1); -+ } else { -+ memcpy(playback_buf + SCO_HDR_SIZE, -+ runtime->dma_area + oldptr, bytes); -+ } -+ frames = (bytes + (oldptr % stride)) / stride; -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_hwptr_done = (data->playback_hwptr_done + bytes) % -+ (runtime->buffer_size * stride); -+ data->playback_transfer_done += frames; -+ if (data->playback_transfer_done >= runtime->period_size) { -+ data->playback_transfer_done = 0; -+ period_elapsed = 1; -+ } -+ spin_unlock_irqrestore(&data->txlock, flags); -+ -+ if (period_elapsed == 1) { -+ period_elapsed = 0; -+ return snd_pcm_period_elapsed(data->playback_stream); -+ } -+} -+ -+static void btusb_isoc_submit_tx_urb(struct btusb_data *data) -+{ -+ struct device *dev = &(data->udev->dev); -+ int err; -+ -+ err = usb_submit_urb(data->tx_urb, GFP_ATOMIC); -+ if (err < 0) { -+ dev_err(dev, "%s urb %p submission failed (%d)", -+ __func__, data->tx_urb, -err); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ } -+} -+ -+static void btusb_isoc_tx_complete(struct urb *urb) -+{ -+ struct btusb_data *data = urb->context; -+ -+ if (test_bit(BTUSB_ISOC_TX_START, &data->flags)) { -+ btusb_isoc_prepare_tx_urb(data); -+ btusb_isoc_submit_tx_urb(data); -+ } -+} -+ -+static void process_sco_buffer(struct btusb_data *data) -+{ -+ unsigned long flags; -+ unsigned int hw_ptr; -+ int sco_data_count; -+ struct snd_pcm_runtime *runtime; -+ unsigned char *sco_buffer = data->capture_data->buf; -+ unsigned char *audio_buffer = data->capture_data->buf + SCO_HDR_SIZE; -+ unsigned int pending; -+ -+ sco_data_count = sco_buffer[SCO_HANDLE_SIZE]; -+ spin_lock_irqsave(&data->rxlock, flags); -+ hw_ptr = data->capture_hwptr_done; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ runtime = data->capture_stream->runtime; -+ pending = runtime->dma_bytes - hw_ptr; -+ -+ if (pending < sco_data_count) { -+ memcpy(runtime->dma_area + hw_ptr, audio_buffer, pending); -+ memcpy(runtime->dma_area, (void *)audio_buffer + pending, -+ sco_data_count - pending); -+ } else { -+ memcpy(runtime->dma_area + hw_ptr, (void *) audio_buffer, -+ sco_data_count); -+ } -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_hwptr_done = (hw_ptr + sco_data_count) % -+ runtime->dma_bytes; -+ hw_ptr = data->capture_hwptr_done; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+} -+ -+static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count) -+{ -+ int err = 0; -+ struct capture_data_cb *cb = data->capture_data; -+ int len; -+ struct hci_sco_hdr *sco_hdr; -+ struct device *dev = &(data->udev->dev); -+ -+ if (count == 0) -+ return -ENODATA; -+ -+ while (count) { -+ -+ if (cb->pos == 0) -+ cb->expected = SCO_HDR_SIZE; -+ -+ len = min_t(uint, cb->expected, count); -+ memcpy(cb->buf + cb->pos, buffer, len); -+ count -= len; -+ cb->expected -= len; -+ cb->pos += len; -+ buffer += len; -+ -+ if (cb->pos == SCO_HDR_SIZE) { -+ sco_hdr = (struct hci_sco_hdr *)cb->buf; -+ cb->expected = cb->buf[2]; -+ if (memcmp(cb->buf, handle, 2)) { -+ cb->pos = 0; -+ dev_err(dev, "%s Invalid SCO handle", __func__); -+ return -EPROTO; -+ } -+ if (cb->expected > 48) { -+ dev_err(dev, "%s:Error in capture", __func__); -+ return -EPROTO; -+ } -+ if ((HCI_MAX_SCO_SIZE - cb->pos) < cb->expected) { -+ dev_err(dev, "Invalid USB frame"); -+ cb->pos = 0; -+ err = -EPROTO; -+ return err; -+ } -+ } -+ if (!cb->expected) { -+ // copy data to stream buffer -+ process_sco_buffer(data); -+ cb->pos = 0; -+ } -+ } -+ return 0; -+} -+ -+static int btusb_isoc_submit_urb(struct urb *urb, struct btusb_data *data) -+{ -+ int err; -+ struct device *dev = &(data->udev->dev); -+ -+ usb_anchor_urb(urb, &data->rx_anchor); -+ err = usb_submit_urb(urb, GFP_ATOMIC); -+ if (err < 0) { -+ /* -EPERM: urb is being killed; -+ * -ENODEV: device got disconnected -+ */ -+ if (err != -EPERM && err != -ENODEV) -+ dev_err(dev, "urb %p failed to submit (%d)", -+ urb, err); -+ usb_unanchor_urb(urb); -+ } -+ return err; -+} -+static int btusb_isoc_submit_rx_urbs(struct btusb_data *data) -+{ -+ int i, err = 0; -+ struct device *dev = &(data->udev->dev); -+ -+ for (i = 0; i < MAX_URBS; i++) { -+ err = btusb_isoc_submit_urb(data->rx_urb[i], data); -+ if (err < 0) { -+ dev_err(dev, "%s - err: %d\n", __func__, err); -+ break; -+ } -+ } -+ return (i < 2) ? err : 0; -+} -+ -+static void btusb_isoc_rx_complete(struct urb *urb) -+{ -+ struct btusb_data *data = urb->context; -+ struct device *dev = &(data->udev->dev); -+ int i; -+ -+ if (!test_bit(BTUSB_ISOC_RX_START, &data->flags)) { -+ dev_dbg(dev, "%s BTUSB_ISOC_RX_START not set\n", __func__); -+ return; -+ } -+ -+ if (urb->status == 0) { -+ for (i = 0; i < urb->number_of_packets; i++) { -+ -+ unsigned int offset = urb->iso_frame_desc[i].offset; -+ unsigned int length = -+ urb->iso_frame_desc[i].actual_length; -+ -+ if (urb->iso_frame_desc[i].status) -+ continue; -+ if (length <= 0) -+ continue; -+ btusb_recv_isoc(data, urb->transfer_buffer + offset, -+ length); -+ } -+ } else if (urb->status == -ENOENT || urb->status == -ENODEV) { -+ /* Avoid suspend failed when usb_kill_urb */ -+ dev_err(dev, "USB disconnected or Endpoint not available\n"); -+ return; -+ } else { -+ dev_err(dev, "%s - urb->status= %d\n", __func__, urb->status); -+ goto submit; -+ } -+ snd_pcm_period_elapsed(data->capture_stream); -+submit: -+ if (btusb_isoc_submit_urb(urb, data)) -+ dev_err(dev, " btusb_isoc_submit_rx_urb failed\n"); -+} -+ -+static void btusb_free_rx_urbs(struct btusb_data *data) -+{ -+ int i; -+ struct device *dev; -+ -+ dev = &(data->udev->dev); -+ for (i = 0; i < MAX_URBS; i++) { -+ if (data->rx_urb[i]) { -+ dev_dbg(dev, "%s - Valid URB\n", __func__); -+ usb_free_urb(data->rx_urb[i]); -+ data->rx_urb[i] = NULL; -+ } -+ } -+} -+ -+static int btusb_isoc_prepare_rx_urbs(struct btusb_data *data) -+{ -+ struct urb *urb; -+ unsigned char *buf; -+ unsigned int pipe; -+ int i, size; -+ struct device *dev; -+ -+ dev = &(data->udev->dev); -+ -+ if (!data->isoc_rx_ep) { -+ dev_err(dev, "%s isoc_rx_ep is NULL\n", __func__); -+ return -ENODEV; -+ } -+ for (i = 0; i < MAX_URBS; i++) { -+ urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); -+ -+ if (!urb) { -+ dev_err(dev, "%s URB allocation failed\n", __func__); -+ return -ENOMEM; -+ } -+ -+ size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * -+ BTUSB_MAX_ISOC_FRAMES; -+ -+ buf = kmalloc(size, GFP_KERNEL); -+ if (!buf) { -+ btusb_free_rx_urbs(data); -+ return -ENOMEM; -+ } -+ pipe = usb_rcvisocpipe(data->udev, -+ data->isoc_rx_ep->bEndpointAddress); -+ -+ usb_fill_int_urb(urb, data->udev, pipe, buf, size, -+ btusb_isoc_rx_complete, data, -+ data->isoc_rx_ep->bInterval); -+ -+ urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; -+ -+ __fill_isoc_descriptor(urb, size, -+ le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); -+ -+ data->rx_urb[i] = urb; -+ } -+ return 0; -+} -+ -+static inline int __set_isoc_interface(struct snd_pcm_substream *substream, -+ int alternate_setting_num) -+{ -+ struct usb_endpoint_descriptor *ep_desc; -+ int i, err; -+ struct device *dev; -+ struct btusb_data *data = snd_pcm_substream_chip(substream); -+ -+ dev = &(data->udev->dev); -+ -+ if (!data->intf) -+ return -ENODEV; -+ -+ if (data->alternate_setting_num == alternate_setting_num) -+ return 0; -+ -+ err = usb_set_interface(data->udev, data->isoc_ifnum, -+ alternate_setting_num); -+ if (err < 0) { -+ dev_err(dev, "%s failed (%d)", __func__, -err); -+ return err; -+ } -+ data->alternate_setting_num = alternate_setting_num; -+ -+ data->isoc_tx_ep = NULL; -+ data->isoc_rx_ep = NULL; -+ -+ for (i = 0; i < data->intf->cur_altsetting->desc.bNumEndpoints; i++) { -+ ep_desc = &data->intf->cur_altsetting->endpoint[i].desc; -+ -+ if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { -+ data->isoc_tx_ep = ep_desc; -+ continue; -+ } -+ -+ if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { -+ data->isoc_rx_ep = ep_desc; -+ continue; -+ } -+ } -+ -+ if (!data->isoc_tx_ep || !data->isoc_rx_ep) { -+ dev_err(dev, "%s - invalid SCO descriptors", __func__); -+ return -ENODEV; -+ } -+ -+ return 0; -+} -+ -+static struct snd_pcm_hardware btsco_pcm_hardware = { -+ .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER -+ | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID, -+ .rates = SNDRV_PCM_RATE_CONTINUOUS, -+ .buffer_bytes_max = BUFF_SIZE_MAX, -+ .period_bytes_min = MIN_PERIOD_SIZE, -+ .period_bytes_max = 16384, -+ .periods_min = MIN_PERIODS, -+ .periods_max = 1024, -+ -+}; -+ -+static int bt_pcm_open(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ struct snd_pcm_runtime *runtime; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ if (!data) -+ return -ENOMEM; -+ -+ dev = &(data->udev->dev); -+ runtime = substream->runtime; -+ -+ if (runtime == NULL) { -+ dev_err(dev, "%s: value of runtime is NULL", __func__); -+ return -ENODEV; -+ } -+ -+ if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ data->capture_data = init_capture_data_cb(); -+ if (!data->capture_data) { -+ dev_err(dev, "value of capture_data is NULL"); -+ return -ENOMEM; -+ } -+ } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ data->playback_data = -+ kzalloc(sizeof(uint8_t) * MAX_PACKET_SIZE, GFP_KERNEL); -+ if (!data->playback_data) { -+ dev_err(dev, "playback_data memory allocation failed"); -+ return -ENOMEM; -+ } -+ } -+ -+ runtime->hw = btsco_pcm_hardware; -+ -+ runtime->hw.rate_min = 8000; -+ runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; -+ runtime->hw.channels_min = 1; -+ runtime->hw.period_bytes_min = MIN_PERIOD_SIZE; -+ runtime->hw.rate_max = 16000; -+ runtime->hw.channels_max = runtime->hw.channels_min; -+ snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); -+ -+ return 0; -+} -+ -+static int configure_endpoints(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ struct device *dev; -+ int err; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) -+ set_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags); -+ else -+ set_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags); -+ -+ if (test_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags) ^ -+ test_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags)) { -+ -+ err =__set_isoc_interface(substream, -+ BTUSB_SCO_ALTERNATE_SETTING); -+ if (err < 0) { -+ dev_err(dev, "setting alt settings failed\n"); -+ return -EIO; -+ } -+ } -+ return 0; -+} -+ -+ -+static int bt_pcm_prepare(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ int err; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ // TODO: Does endpoint needs to be configured separately for Tx and Rx -+ // endpoints? -+ mutex_lock(&config_mutex); -+ err = configure_endpoints(substream); -+ mutex_unlock(&config_mutex); -+ if (err < 0) { -+ dev_err(dev, "failed to configure Endpoints err:%d\n", err); -+ return err; -+ } -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ btusb_isoc_prepare_tx_urb(data); -+ err = btusb_isoc_initialize_tx_urb(data); -+ if (err < 0) { -+ dev_err(dev, "Failed in init tx urb err:%d\n", err); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ return err; -+ } -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ err = btusb_isoc_prepare_rx_urbs(data); -+ if (err < 0) { -+ dev_err(dev, "Failed to init Rx urb err:%d\n", err); -+ return err; -+ } -+ } -+ return err; -+} -+ -+static void btusb_isoc_stop_tx(struct btusb_data *data) -+{ -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+} -+ -+static int bt_pcm_close(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+ clear_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags); -+ kfree(data->playback_data); -+ data->playback_data = NULL; -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+ clear_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags); -+ deinit_capture_data_cb(data->capture_data); -+ } -+ if (!test_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags) -+ && !test_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags)) { -+ dev_dbg(dev, "%s Reset EP and Alternate settings\n", __func__); -+ if (__set_isoc_interface(substream, 0) < 0) { -+ dev_err(dev, "Resetting alt settings failed"); -+ return -ENOENT; -+ } -+ } -+ return 0; -+} -+ -+static int bt_pcm_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *hw_params) -+{ -+ struct btusb_data *data; -+ int err; -+ unsigned long flags; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ err = snd_pcm_lib_malloc_pages(substream, -+ params_buffer_bytes(hw_params)); -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_stream = substream; -+ data->playback_hwptr_done = 0; -+ data->playback_transfer_done = 0; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_stream = substream; -+ data->capture_hwptr_done = 0; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ } -+ -+ return 0; -+ -+} -+static int bt_pcm_hw_free(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ unsigned long flags; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+ if (data->tx_urb) { -+ usb_kill_urb(data->tx_urb); -+ kfree(data->tx_urb->setup_packet); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ } -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_stream = NULL; -+ data->playback_hwptr_done = 0; -+ data->playback_transfer_done = 0; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+ usb_kill_anchored_urbs(&data->rx_anchor); -+ btusb_free_rx_urbs(data); -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_stream = NULL; -+ data->capture_hwptr_done = 0; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ } -+ snd_pcm_lib_free_pages(substream); -+ return 0; -+} -+ -+static void btusb_isoc_stop_rx(struct btusb_data *data) -+{ -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+} -+ -+static int bt_pcm_capture_trigger(struct snd_pcm_substream *substream, int cmd) -+{ -+ struct btusb_data *data; -+ int err = 0; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_START) ? -+ "SNDRV_PCM_TRIGGER_START" : "SNDRV_PCM_TRIGGER_RESUME"); -+ set_bit(BTUSB_ISOC_RX_START, &data->flags); -+ err = btusb_isoc_submit_rx_urbs(data); -+ if (err < 0) -+ dev_err(dev, "%s err:%d\n", __func__, err); -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_STOP) ? -+ "SNDRV_PCM_TRIGGER_STOP" : "SNDRV_PCM_TRIGGER_SUSPEND"); -+ btusb_isoc_stop_rx(data); -+ break; -+ default: -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static int bt_pcm_playback_trigger(struct snd_pcm_substream *substream, int cmd) -+{ -+ struct btusb_data *data = snd_pcm_substream_chip(substream); -+ int err = 0; -+ struct device *dev = &(data->udev->dev); -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_START) -+ ? "SNDRV_PCM_TRIGGER_START" : "SNDRV_PCM_TRIGGER_RESUME"); -+ set_bit(BTUSB_ISOC_TX_START, &data->flags); -+ btusb_isoc_submit_tx_urb(data); -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_STOP) -+ ? "SNDRV_PCM_TRIGGER_STOP" : "SNDRV_PCM_TRIGGER_SUSPEND"); -+ btusb_isoc_stop_tx(data); -+ break; -+ default: -+ dev_err(dev, "%s - Invalid cmd: %d\n", __func__, cmd); -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static snd_pcm_uframes_t bt_pcm_pointer(struct snd_pcm_substream *substream) -+{ -+ unsigned int playback_hwptr_done; -+ unsigned int capture_hwptr_done; -+ unsigned long flags; -+ struct btusb_data *data = snd_pcm_substream_chip(substream); -+ -+ if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ spin_lock_irqsave(&data->rxlock, flags); -+ capture_hwptr_done = data->capture_hwptr_done; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ return capture_hwptr_done / -+ (substream->runtime->frame_bits >> 3); -+ } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ spin_lock_irqsave(&data->txlock, flags); -+ playback_hwptr_done = data->playback_hwptr_done; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ return playback_hwptr_done / -+ (substream->runtime->frame_bits >> 3); -+ } else -+ return -EINVAL; -+} -+static struct snd_pcm_ops btusb_isoc_capture_ops = { -+ .open = bt_pcm_open, -+ .close = bt_pcm_close, -+ .ioctl = snd_pcm_lib_ioctl, -+ .hw_params = bt_pcm_hw_params, -+ .hw_free = bt_pcm_hw_free, -+ .trigger = bt_pcm_capture_trigger, -+ .pointer = bt_pcm_pointer, -+ .prepare = bt_pcm_prepare, -+}; -+ -+static struct snd_pcm_ops btusb_isoc_playback_ops = { -+ .open = bt_pcm_open, -+ .close = bt_pcm_close, -+ .ioctl = snd_pcm_lib_ioctl, -+ .hw_params = bt_pcm_hw_params, -+ .hw_free = bt_pcm_hw_free, -+ .trigger = bt_pcm_playback_trigger, -+ .pointer = bt_pcm_pointer, -+ .prepare = bt_pcm_prepare, -+}; -+ -+static int snd_usb_audio_dev_free(struct snd_device *device) -+{ -+ struct btusb_data *data = device->device_data; -+ unsigned long flags; -+ -+ if (!data) -+ return 0; -+ -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+ -+ if (data->tx_urb) { -+ usb_kill_urb(data->tx_urb); -+ kfree(data->tx_urb->setup_packet); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ } -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_stream = NULL; -+ data->playback_hwptr_done = 0; -+ data->playback_transfer_done = 0; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+ usb_kill_anchored_urbs(&data->rx_anchor); -+ btusb_free_rx_urbs(data); -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_stream = NULL; -+ data->capture_hwptr_done = 0; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ return 0; -+} -+ -+static int btusb_snd_card_create(struct btusb_data *data) -+{ -+ int err = 0; -+ struct snd_card *card; -+ struct device *dev; -+ -+ static struct snd_device_ops ops = { -+ .dev_free = snd_usb_audio_dev_free, -+ }; -+ struct snd_pcm *pcm; -+ -+ dev = &(data->udev->dev); -+ err = snd_card_new(dev, -1, NULL, THIS_MODULE, 0, &card); -+ if (err) { -+ dev_err(dev, "%s:Fail to create sound card", __func__); -+ return err; -+ } -+ data->card = card; -+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, data, &ops); -+ -+ if (err) { -+ snd_card_free(card); -+ dev_err(dev, "Error in creating the sound device device"); -+ return err; -+ } -+ err = snd_pcm_new(card, "BT USB audio source", DEVICE_INDEX, -+ NUM_PLAYBACK_SUBSTREAMS, NUM_CAPTURE_SUBSTREAMS, -+ &pcm); -+ if (err) { -+ dev_err(dev, "%s: Fail to create PCM device ", __func__); -+ return err; -+ } -+ -+ pcm->private_data = data; -+ pcm->info_flags = 0; -+ data->pcm = pcm; -+ strlcpy(pcm->name, "USB Bluetooth audio", sizeof(pcm->name)); -+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, -+ &btusb_isoc_capture_ops); -+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, -+ &btusb_isoc_playback_ops); -+ snd_pcm_lib_preallocate_pages_for_all(pcm, -+ SNDRV_DMA_TYPE_CONTINUOUS, -+ snd_dma_continuous_data(GFP_KERNEL), -+ 64 * 1024, 64 * 1024); -+ strlcpy(card->driver, "bt_audio_source", sizeof(card->driver)); -+ strlcpy(card->shortname, card->driver, sizeof(card->shortname)); -+ strlcpy(card->longname, "USB Bluetooth audio source", -+ sizeof(card->longname)); -+ -+ err = snd_card_register(card); -+ if (err) -+ dev_err(dev, "%s: Failure in registering sound card", __func__); -+ -+ return err; -+} -+ -+int btusb_sco_probe(struct usb_interface *intf, const struct usb_device_id *id) -+{ -+ int err = 0; -+ struct btusb_data *data; -+ -+ data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL); -+ -+ if (!data) -+ return -ENOMEM; -+ -+ data->isoc_ifnum = intf->cur_altsetting->desc.bInterfaceNumber; -+ data->udev = interface_to_usbdev(intf); -+ data->intf = intf; -+ usb_set_intfdata(intf, data); -+ spin_lock_init(&data->txlock); -+ spin_lock_init(&data->rxlock); -+ init_usb_anchor(&data->rx_anchor); -+ -+ err = btusb_snd_card_create(data); -+ -+ return err; -+} -+ -+static void btusb_sco_disconnect(struct usb_interface *intf) -+{ -+ struct btusb_data *data = usb_get_intfdata(intf); -+ -+ if (!data) -+ return; -+ -+ if (data->intf) { -+ usb_set_intfdata(data->intf, NULL); -+ usb_driver_release_interface(&btusb_sco_driver, data->intf); -+ } -+ snd_card_disconnect(data->card); -+ snd_card_free_when_closed(data->card); -+ /* TODO: Freeing the resource causing kernel panic.Cleanup -+ part needs to be checked. -+ kfree(data); -+ data = NULL; */ -+ -+ snd_card_free_when_closed(data->card); -+} -+ -+static int btusb_sco_suspend(struct usb_interface *intf, pm_message_t message) -+{ -+ // TODO: Do we need to call snd_pcm_suspend_all -+ // snd_pcm_suspend_all(data->pcm); -+ return 0; -+} -+ -+static int btusb_sco_resume(struct usb_interface *intf) -+{ -+ // TODO: Do we need to call snd_power_change_state -+ // snd_power_change_state(data->card, SNDRV_CTL_POWER_D0); -+ -+ return 0; -+ -+ } -+ -+static int btusb_sco_ioctl(struct usb_interface *intf, unsigned int code, -+ void *buf) -+{ -+ struct device *dev; -+ int err; -+ -+ if (!buf) -+ return -EINVAL; -+ -+ dev = &(interface_to_usbdev(intf)->dev); -+ -+ if (code == USBDEVFS_IOCTL) { -+ memcpy(handle, (uint8_t *)buf, SCO_HANDLE_SIZE); -+ dev_dbg(dev, "value of handle = %x, %x", handle[0], handle[1]); -+ err = 0; -+ } else { -+ dev_err(dev, "%s:Invalid Ioctl code", __func__); -+ err = -ENOIOCTLCMD; -+ } -+ return err; -+} -+ -+static struct usb_driver btusb_sco_driver = { -+ .name = "btusb_sco", -+ .probe = btusb_sco_probe, -+ .unlocked_ioctl = btusb_sco_ioctl, -+ .disconnect = btusb_sco_disconnect, -+ .suspend = btusb_sco_suspend, -+ .resume = btusb_sco_resume, -+ .id_table = btusb_sco_table, -+ .supports_autosuspend = 0 -+ -+}; -+ -+module_usb_driver(btusb_sco_driver); -+ -+MODULE_DESCRIPTION("SCO over btusb driver for Android"); -+MODULE_LICENSE("GPL"); -+MODULE_VERSION("0.1"); --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch deleted file mode 100644 index 35134006e3..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch +++ /dev/null @@ -1,40 +0,0 @@ -From f94cec79544768f80a3541302af23af82a83c239 Mon Sep 17 00:00:00 2001 -From: saranya -Date: Thu, 4 Jun 2020 14:17:06 +0530 -Subject: [PATCH] uvc: Add UVC GET_DEF probe quirk for C922 camera - -In some of the C922 camera devices, we find that -GET_DEF request is not implemented for video probe -and commit controls. These cameras crash when this -request is received. Hence, add this quirk for C922 -cameras. - -Tracked-On: OAM-91289 -Signed-off-by: saranya ---- - drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c -index 99883550375e..59fa4b0f50b4 100644 ---- a/drivers/media/usb/uvc/uvc_driver.c -+++ b/drivers/media/usb/uvc/uvc_driver.c -@@ -2526,6 +2526,15 @@ static const struct usb_device_id uvc_ids[] = { - .bInterfaceSubClass = 1, - .bInterfaceProtocol = 0, - .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RESTORE_CTRLS_ON_INIT) }, -+ /* Logitech HD Pro Webcam C922 */ -+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE -+ | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x046d, -+ .idProduct = 0x085c, -+ .bInterfaceClass = USB_CLASS_VIDEO, -+ .bInterfaceSubClass = 1, -+ .bInterfaceProtocol = 0, -+ .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, - /* Chicony CNF7129 (Asus EEE 100HE) */ - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE - | USB_DEVICE_ID_MATCH_INT_INFO, --- -2.21.0 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0005-btusb-snd-crash-while-disconnect.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0005-btusb-snd-crash-while-disconnect.patch deleted file mode 100644 index 5012c90a96..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0005-btusb-snd-crash-while-disconnect.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 724679b3dfe228993a6200a94e25822d8ee085cd Mon Sep 17 00:00:00 2001 -From: Balaji M -Date: Mon, 28 Dec 2020 20:57:24 +0530 -Subject: [PATCH] btusb : snd : crash while disconnect - -removing the duplicacy of snd_card_free_when_closed() -function which is called inside btusb_sco_disconnect() -function. - -Tracked-On: OAM-95334 -Signed-off-by: Prabhat Chand Pandey prabhat.chand.pandey@intel.com ---- - sound/usb/btusb/btusb_sco_snd_card.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/sound/usb/btusb/btusb_sco_snd_card.c b/sound/usb/btusb/btusb_sco_snd_card.c -index 71e2059e217c..16a6dbb608e1 100644 ---- a/sound/usb/btusb/btusb_sco_snd_card.c -+++ b/sound/usb/btusb/btusb_sco_snd_card.c -@@ -990,8 +990,6 @@ static void btusb_sco_disconnect(struct usb_interface *intf) - part needs to be checked. - kfree(data); - data = NULL; */ -- -- snd_card_free_when_closed(data->card); - } - - static int btusb_sco_suspend(struct usb_interface *intf, pm_message_t message) --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch deleted file mode 100644 index 8f4ba34402..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 7df614cfa333425b6d6bb6a0b8f21209658a69a1 Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Wed, 22 Sep 2021 12:14:52 +0530 -Subject: [PATCH] Bluetooth: btusb: Add reset on close quirk for Intel adapters - -Intel Bluetooth adapter is not exiting the loopback mode on bluetooth -socket closure. So, when bluetooth socket is opened again, bluetooth is -not working. - -As per Bluetooth core specification, bluetooth adapter should exit loop -back mode on hci reset. Add HCI quirk reset to make sure adapter exits -loopback mode on bluetooth socket closure. - -Tracked-On: OAM-96067 -Signed-off-by: Jeevaka Prabu Badrappan -Signed-off-by: Amrita Raju ---- - drivers/bluetooth/btusb.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 14a3ae4dcde7..e6619b824368 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -3644,9 +3644,10 @@ static int btusb_probe(struct usb_interface *intf, - hdev->send = btusb_send_frame_intel; - hdev->cmd_timeout = btusb_intel_cmd_timeout; - -+ reset = false; - if (id->driver_info & BTUSB_INTEL_NO_WBS_SUPPORT) - btintel_set_flag(hdev, INTEL_ROM_LEGACY_NO_WBS_SUPPORT); -- -+ - if (id->driver_info & BTUSB_INTEL_BROKEN_INITIAL_NCMD) - btintel_set_flag(hdev, INTEL_BROKEN_INITIAL_NCMD); - --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0007-9p-freezing-aborts-when-use-wait_event_killable.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0007-9p-freezing-aborts-when-use-wait_event_killable.patch deleted file mode 100644 index 0a59a95df6..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0007-9p-freezing-aborts-when-use-wait_event_killable.patch +++ /dev/null @@ -1,40 +0,0 @@ -From d24497918c5bd64041684472e0bee75a7da8d652 Mon Sep 17 00:00:00 2001 -From: Kaushlendra Kumar -Date: Tue, 6 Oct 2020 14:46:37 +0530 -Subject: [PATCH] 9p: freezing aborts when use wait_event_killable() - -Freezing of process abort when a client is waiting uninterruptibly -for a response. This happens when system is entering to suspend and -trying to freeze all the processes and at that moment freezing aborts -which leads to suspend failure. So instead of wait_event_killable() -use wait_event_freezable() - -Signed-off-by: Kaushlendra Kumar ---- - net/9p/client.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/9p/client.c b/net/9p/client.c -index 09f1ec589b80..a5ce640eeee5 100644 ---- a/net/9p/client.c -+++ b/net/9p/client.c -@@ -11,6 +11,7 @@ - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - - #include -+#include - #include - #include - #include -@@ -754,7 +755,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) - } - again: - /* Wait for the response */ -- err = wait_event_killable(req->wq, req->status >= REQ_STATUS_RCVD); -+ err = wait_event_freezable(req->wq, req->status >= REQ_STATUS_RCVD); - - /* - * Make sure our req is coherent with regard to updates in other --- -2.28.0 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch deleted file mode 100644 index e61228e50e..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch +++ /dev/null @@ -1,335 +0,0 @@ -From a28ec6fe754876cdf5b7c1ab7fa8c5f6e25055d4 Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Fri, 25 Sep 2020 09:30:40 +0530 -Subject: [PATCH] iwlwifi: Vendor command support in iwlwifi driver - -Adding vendor command support for querying driver & firmware -version. - -Tracked-On: OAM-94267 -Signed-off-by: Jeevaka Prabu Badrappan -Signed-off-by: Amrita Raju ---- - .../wireless/intel/iwlwifi/iwl-vendor-cmd.h | 96 +++++++++++ - .../net/wireless/intel/iwlwifi/mvm/Makefile | 1 + - .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 2 + - drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 2 + - .../wireless/intel/iwlwifi/mvm/vendor-cmd.c | 158 ++++++++++++++++++ - 5 files changed, 259 insertions(+) - create mode 100644 drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h - create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c - -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h b/drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h -new file mode 100644 -index 000000000000..554d706d9b26 ---- /dev/null -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h -@@ -0,0 +1,96 @@ -+/****************************************************************************** -+ * -+ * This file is provided under a dual BSD/GPLv2 license. When using or -+ * redistributing this file, you may do so under either license. -+ * -+ * GPL LICENSE SUMMARY -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * The full GNU General Public License is included in this distribution -+ * in the file called COPYING. -+ * -+ * Contact Information: -+ * Intel Linux Wireless -+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 -+ * -+ * BSD LICENSE -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * -+ * * Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * * Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in -+ * the documentation and/or other materials provided with the -+ * distribution. -+ * * Neither the name Intel Corporation nor the names of its -+ * contributors may be used to endorse or promote products derived -+ * from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ *****************************************************************************/ -+#ifndef __VENDOR_CMD_H__ -+#define __VENDOR_CMD_H__ -+ -+#define INTEL_OUI 0x001735 -+ -+/** -+ * enum iwl_mvm_vendor_cmd - supported vendor commands -+ * @IWL_MVM_VENDOR_CMD_GET_FW_VERSION: -+ * @IWL_MVM_VENDOR_CMD_GET_DRV_VERSION: -+ */ -+ -+enum iwl_mvm_vendor_cmd { -+ IWL_MVM_VENDOR_CMD_GET_FW_VERSION = 0x00, -+ IWL_MVM_VENDOR_CMD_GET_DRV_VERSION = 0x01, -+}; -+ -+/** -+ * enum iwl_mvm_vendor_attr - attributes used in vendor commands -+ * @__IWL_MVM_VENDOR_ATTR_INVALID: attribute 0 is invalid -+ * @IWL_MVM_VENDOR_ATTR_DRV_VER: string attribute -+ * @IWL_MVM_VENDOR_ATTR_FW_VER: string attribute -+ * @NUM_IWL_MVM_VENDOR_ATTR: number of vendor attributes -+ * @MAX_IWL_MVM_VENDOR_ATTR: highest vendor attribute number -+ */ -+enum iwl_mvm_vendor_attr { -+ __IWL_MVM_VENDOR_ATTR_INVALID, -+ IWL_MVM_VENDOR_ATTR_FW_VER, -+ IWL_MVM_VENDOR_ATTR_DRV_VER, -+ -+ NUM_IWL_MVM_VENDOR_ATTR, -+ MAX_IWL_MVM_VENDOR_ATTR = NUM_IWL_MVM_VENDOR_ATTR - 1, -+}; -+#endif /* __VENDOR_CMD_H__ */ -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile -index 75fc2d935e5d..26cba9be28eb 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile -@@ -9,6 +9,7 @@ iwlmvm-y += ftm-responder.o ftm-initiator.o - iwlmvm-y += rfi.o - iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS) += debugfs.o debugfs-vif.o - iwlmvm-$(CONFIG_IWLWIFI_LEDS) += led.o -+iwlmvm-y += vendor-cmd.o - iwlmvm-$(CONFIG_PM) += d3.o - - ccflags-y += -I $(srctree)/$(src)/../ -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -index 56c7a68a6491..8bbb40132918 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -@@ -719,6 +719,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) - hw->wiphy->available_antennas_tx = iwl_mvm_get_valid_tx_ant(mvm); - hw->wiphy->available_antennas_rx = iwl_mvm_get_valid_rx_ant(mvm); - -+ iwl_mvm_set_wiphy_vendor_commands(hw->wiphy); -+ - ret = ieee80211_register_hw(mvm->hw); - if (ret) { - iwl_mvm_leds_exit(mvm); -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -index 46af8dd2dc93..033f0c0ac599 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -@@ -27,6 +27,7 @@ - #include "sta.h" - #include "fw-api.h" - #include "constants.h" -+#include "iwl-vendor-cmd.h" - #include "fw/runtime.h" - #include "fw/dbg.h" - #include "fw/acpi.h" -@@ -2021,6 +2022,7 @@ struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm); - struct ieee80211_vif *iwl_mvm_get_vif_by_macid(struct iwl_mvm *mvm, u32 macid); - bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm); - -+void iwl_mvm_set_wiphy_vendor_commands(struct wiphy *wiphy); - #define MVM_TCM_PERIOD_MSEC 500 - #define MVM_TCM_PERIOD (HZ * MVM_TCM_PERIOD_MSEC / 1000) - #define MVM_LL_PERIOD (10 * HZ) -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c b/drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c -new file mode 100644 -index 000000000000..a6311656958f ---- /dev/null -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c -@@ -0,0 +1,158 @@ -+/*****************************************************************************r -+ * -+ * This file is provided under a dual BSD/GPLv2 license. When using or -+ * redistributing this file, you may do so under either license. -+ * -+ * GPL LICENSE SUMMARY -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * Copyright (C) 2019 Intel Corporation -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * The full GNU General Public License is included in this distribution -+ * in the file called COPYING. -+ * -+ * Contact Information: -+ * Intel Linux Wireless -+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 -+ * -+ * BSD LICENSE -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * Copyright (C) 2019 Intel Corporation -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * -+ * * Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * * Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in -+ * the documentation and/or other materials provided with the -+ * distribution. -+ * * Neither the name Intel Corporation nor the names of its -+ * contributors may be used to endorse or promote products derived -+ * from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ *****************************************************************************/ -+#include -+#include -+#include -+#include -+#include -+#include "mvm.h" -+ -+#include "iwl-vendor-cmd.h" -+ -+#include "iwl-io.h" -+#include "iwl-prph.h" -+ -+static const struct nla_policy -+iwl_mvm_vendor_attr_policy[NUM_IWL_MVM_VENDOR_ATTR] = { -+ [IWL_MVM_VENDOR_ATTR_FW_VER] = { .type = NLA_STRING, .len = 50 }, -+ [IWL_MVM_VENDOR_ATTR_DRV_VER] = { .type = NLA_STRING, .len = 50 }, -+}; -+ -+static int iwl_mvm_vendor_get_fw_version(struct wiphy *wiphy, -+ struct wireless_dev *wdev, -+ const void *data, int data_len) -+{ -+ struct sk_buff *skb; -+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); -+ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); -+ const struct iwl_fw *fw = mvm->fw; -+ -+ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(fw->fw_version)); -+ if (!skb) -+ return -ENOMEM; -+ if (nla_put_string(skb, IWL_MVM_VENDOR_ATTR_FW_VER, fw->fw_version)) { -+ kfree_skb(skb); -+ return -ENOBUFS; -+ } -+ -+ return cfg80211_vendor_cmd_reply(skb); -+} -+ -+static int iwl_mvm_vendor_get_drv_version(struct wiphy *wiphy, -+ struct wireless_dev *wdev, -+ const void *data, int data_len) -+{ -+ struct sk_buff *skb; -+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); -+ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); -+ -+ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(utsname()->release)); -+ if (!skb) -+ return -ENOMEM; -+ if (nla_put_string(skb, IWL_MVM_VENDOR_ATTR_DRV_VER, utsname()->release)) { -+ kfree_skb(skb); -+ return -ENOBUFS; -+ } -+ -+ return cfg80211_vendor_cmd_reply(skb); -+} -+ -+static const struct wiphy_vendor_command iwl_mvm_vendor_commands[] = { -+ { -+ .info = { -+ .vendor_id = INTEL_OUI, -+ .subcmd = IWL_MVM_VENDOR_CMD_GET_FW_VERSION, -+ }, -+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV | -+ WIPHY_VENDOR_CMD_NEED_RUNNING, -+ .doit = iwl_mvm_vendor_get_fw_version, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ .policy = iwl_mvm_vendor_attr_policy, -+ .maxattr = MAX_IWL_MVM_VENDOR_ATTR, -+#endif -+ }, -+ { -+ .info = { -+ .vendor_id = INTEL_OUI, -+ .subcmd = IWL_MVM_VENDOR_CMD_GET_DRV_VERSION, -+ }, -+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV | -+ WIPHY_VENDOR_CMD_NEED_RUNNING, -+ .doit = iwl_mvm_vendor_get_drv_version, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ .policy = iwl_mvm_vendor_attr_policy, -+ .maxattr = MAX_IWL_MVM_VENDOR_ATTR, -+#endif -+ }, -+}; -+ -+void iwl_mvm_set_wiphy_vendor_commands(struct wiphy *wiphy) -+{ -+ wiphy->vendor_commands = iwl_mvm_vendor_commands; -+ wiphy->n_vendor_commands = ARRAY_SIZE(iwl_mvm_vendor_commands); -+ wiphy->vendor_events = NULL;; -+ wiphy->n_vendor_events = 0; -+} --- -2.35.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch deleted file mode 100644 index 50c548d6b3..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 30fb81948cb4dc94c47467847072a9732b7c9c7d Mon Sep 17 00:00:00 2001 -From: Sami Tolvanen -Date: Tue, 29 Dec 2020 12:48:52 +0530 -Subject: [PATCH] x86, relocs: Ignore L4_PAGE_OFFSET relocations - -L4_PAGE_OFFSET is a constant value, so don't warn about absolute -relocations. - -Tracked-On: OAM-95581 -Signed-off-by: Sami Tolvanen -Signed-off-by: Jeevaka Prabu Badrappan ---- - arch/x86/tools/relocs.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c -index ce7188cbdae5..8f3bf34840ce 100644 ---- a/arch/x86/tools/relocs.c -+++ b/arch/x86/tools/relocs.c -@@ -47,6 +47,7 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = { - [S_ABS] = - "^(xen_irq_disable_direct_reloc$|" - "xen_save_fl_direct_reloc$|" -+ "L4_PAGE_OFFSET|" - "VDSO|" - "__crc_)", - --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0010-replace-cond_resched-with-usleep_range-to-avoid-dead.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0010-replace-cond_resched-with-usleep_range-to-avoid-dead.patch deleted file mode 100644 index 7c30383438..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0010-replace-cond_resched-with-usleep_range-to-avoid-dead.patch +++ /dev/null @@ -1,57 +0,0 @@ -From b830931d95db3616fe2536d49be9b1d78c34da11 Mon Sep 17 00:00:00 2001 -From: feijiang1 -Date: Thu, 25 Mar 2021 00:09:15 +0800 -Subject: [PATCH] drm/i915: replace cond_resched with usleep_range to avoid - dead lock - -Found the deadlock issue most likely caused by thread scheduling, the -problem is like: -1, thread a call i915_active_acquire_barrier function, and will call -take_preallocated_barriers which is used to delete all list nodes with -llist_del_all -2, hw irq is raised up, thread a is scheduled out -3, thread b seems has higher priority and is scheduled in, -i915_gem_do_execbuffer->i915_active_acquire_preallocate_barrier function -is called, there is following code: -while (!llist_empty(&ref->preallocated_barriers)) - cond_resched(); -ref->preallocated_barriers is not empty, then will call cond_resched. -While due to CONFIG_PREEMPT is defined, cond_resched is defined as -"return 0;" It means thread b will busy wait and will not relinquish -CPU. From log, we didn't see thread a get chance to be scheduled in. -The result is thread b is busy waiting on ref->preallocated_barriers, -dead-lock happened. At end, when rcu_cpu_stall_timeout is reached, rcu -stall is detected and pop up the kernel error. -Fix this issue by replacing cond_resched with usleep_range, to let -thread b relinquished CPU on its own. - -Signed-off-by: feijiang1 ---- - drivers/gpu/drm/i915/i915_active.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c -index b0a499753526..49112379b251 100644 ---- a/drivers/gpu/drm/i915/i915_active.c -+++ b/drivers/gpu/drm/i915/i915_active.c -@@ -5,6 +5,7 @@ - */ - - #include -+#include - - #include "gt/intel_context.h" - #include "gt/intel_engine_pm.h" -@@ -615,7 +616,8 @@ int i915_active_acquire_preallocate_barrier(struct i915_active *ref, - - /* Wait until the previous preallocation is completed */ - while (!llist_empty(&ref->preallocated_barriers)) -- cond_resched(); -+ //cond_resched(); -+ usleep_range(10, 50); - - /* - * Preallocate a node for each physical engine supporting the target --- -2.30.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0011-Use-clang-toolchain-from-prebuilts-instead-of-gcc.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0011-Use-clang-toolchain-from-prebuilts-instead-of-gcc.patch deleted file mode 100644 index 609e7f20de..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0011-Use-clang-toolchain-from-prebuilts-instead-of-gcc.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 582727f68277437b764ccf185308fbc68a8f41a6 Mon Sep 17 00:00:00 2001 -From: yaravapa -Date: Wed, 17 Feb 2021 12:38:36 +0530 -Subject: [PATCH] Prebuilts tar doesnot support -I option. So replaced with -J - option - -Tracked-On: OAM-95316 -Signed-off-by: yaravapa ---- - kernel/gen_kheaders.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh -index c1510f0ab3ea..e3d0f62819bf 100755 ---- a/kernel/gen_kheaders.sh -+++ b/kernel/gen_kheaders.sh -@@ -88,7 +88,7 @@ find $cpio_dir -type f -print0 | - find $cpio_dir -printf "./%P\n" | LC_ALL=C sort | \ - tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \ - --owner=0 --group=0 --numeric-owner --no-recursion \ -- -I $XZ -cf $tarfile -C $cpio_dir/ -T - > /dev/null -+ -J -cf $tarfile -C $cpio_dir/ -T - > /dev/null - - echo $headers_md5 > kernel/kheaders.md5 - echo "$this_file_md5" >> kernel/kheaders.md5 --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch deleted file mode 100644 index fc2449fd16..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 23b22988ad1acd0a36f95f3dc3c4b1494fada840 Mon Sep 17 00:00:00 2001 -From: Aiswarya Cyriac -Date: Fri, 16 Sep 2022 17:34:05 +0530 -Subject: [PATCH] Fix for btusb_sco_snd_card not getting probed - -Tracked-On: OAM-99194 -Signed-off-by: Aiswarya Cyriac ---- - drivers/bluetooth/btusb.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index b4d8d34031e0..be1c391e329d 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -3927,10 +3927,12 @@ static int btusb_probe(struct usb_interface *intf, - if (id->driver_info & BTUSB_AMP) { - /* AMP controllers do not support SCO packets */ - data->isoc = NULL; -+#if (!IS_ENABLED(CONFIG_BT_SCOHCI)) - } else { - /* Interface orders are hardcoded in the specification */ - data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1); - data->isoc_ifnum = ifnum_base + 1; -+#endif - } - - if (IS_ENABLED(CONFIG_BT_HCIBTUSB_RTL) && --- -2.35.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0013-Add-support-for-AX211-GarfieldPeak-Gfp.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0013-Add-support-for-AX211-GarfieldPeak-Gfp.patch deleted file mode 100644 index 444a01ce39..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0013-Add-support-for-AX211-GarfieldPeak-Gfp.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 6b994113af2e0d4447428dcee9468c0483e7e0f6 Mon Sep 17 00:00:00 2001 -From: Aiswarya Cyriac -Date: Fri, 21 Jan 2022 10:41:16 +0530 -Subject: [PATCH] Add HFP support for AX211 GarfieldPeak (Gfp) - -Tracked-On: OAM-100635 -Signed-off-by: Aiswarya Cyriac ---- - sound/usb/btusb/btusb_sco_snd_card.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/sound/usb/btusb/btusb_sco_snd_card.c b/sound/usb/btusb/btusb_sco_snd_card.c -index 16a6dbb608e1..8e70f7d74422 100644 ---- a/sound/usb/btusb/btusb_sco_snd_card.c -+++ b/sound/usb/btusb/btusb_sco_snd_card.c -@@ -101,6 +101,7 @@ static const struct usb_device_id btusb_sco_table[] = { - { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW }, - { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW }, - { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0033), .driver_info = BTUSB_INTEL_NEW }, - { } /* Terminating entry */ - }; - --- -2.33.0 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0014-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0014-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch deleted file mode 100644 index 3e7691ebbc..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0014-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 10df525cb1eff8d7c326f6a9283c01ecaeafc9a0 Mon Sep 17 00:00:00 2001 -From: Kaushlendra Kumar -Date: Fri, 22 Apr 2022 14:38:58 +0530 -Subject: [PATCH] ACPI/PM: Propagate power button event to user space when - device wakes up - -Sometimes power button does not wake up the systemm, we get suspends -event -right after that. here Android needs to see KEY_POWER at resume. -Otherwise, its -opportunistic suspend will kick in shortly. - -However, other OS such as Ubuntu doesn't like KEY_POWER at resume. So -add a knob "/sys/module/button/parameters/key_power_at_resume" for users -to select. - -Tracked-On: OAM-101964 -Signed-off-by: Kaushlendra Kumar ---- - drivers/acpi/button.c | 6 +++++- - drivers/acpi/sleep.c | 6 ++++++ - 2 files changed, 11 insertions(+), 1 deletion(-) - -diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c -index 0d93a5ef4d07..db849acbaabf 100644 ---- a/drivers/acpi/button.c -+++ b/drivers/acpi/button.c -@@ -40,6 +40,10 @@ - #define ACPI_BUTTON_DEVICE_NAME_LID "Lid Switch" - #define ACPI_BUTTON_TYPE_LID 0x05 - -+/* does userspace want to see KEY_POWER at resume? */ -+static bool __read_mostly key_power_at_resume = true; -+module_param(key_power_at_resume, bool, 0644); -+ - enum { - ACPI_BUTTON_LID_INIT_IGNORE, - ACPI_BUTTON_LID_INIT_OPEN, -@@ -417,7 +421,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) - int keycode; - - acpi_pm_wakeup_event(&device->dev); -- if (button->suspended) -+ if (button->suspended && !key_power_at_resume) - break; - - keycode = test_bit(KEY_SLEEP, input->keybit) ? -diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c -index aae35872d851..64ba310bf3f7 100644 ---- a/drivers/acpi/sleep.c -+++ b/drivers/acpi/sleep.c -@@ -442,6 +442,11 @@ static int acpi_pm_prepare(void) - return error; - } - -+static void pwr_btn_notify(struct acpi_device *device) -+{ -+ device->driver->ops.notify(device, ACPI_FIXED_HARDWARE_EVENT); -+} -+ - /** - * acpi_pm_finish - Instruct the platform to leave a sleep state. - * -@@ -485,6 +490,7 @@ static void acpi_pm_finish(void) - NULL, -1); - if (pwr_btn_adev) { - pm_wakeup_event(&pwr_btn_adev->dev, 0); -+ pwr_btn_notify(pwr_btn_adev); - acpi_dev_put(pwr_btn_adev); - } - } --- -2.33.0 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0015-VIRTIO-Freeze-and-Restore-Implementation.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0015-VIRTIO-Freeze-and-Restore-Implementation.patch deleted file mode 100644 index cd79ece9c8..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0015-VIRTIO-Freeze-and-Restore-Implementation.patch +++ /dev/null @@ -1,152 +0,0 @@ -From ac91eeb67b4f235fee19c000aff27b8e1991ad53 Mon Sep 17 00:00:00 2001 -From: Vilas R K -Date: Wed, 23 Mar 2022 21:05:33 +0530 -Subject: [PATCH] Freeze and Restore Implementation. - -Whenever VM goes for suspend if there are any -active VSOCK connections used to communicate with host -respective vsock connections were unable to resume as -freeze and restore functionality was not implemented i -virtio driver. -This change will fix VSOCK reconnect in case -of Suspend and Resume - -In freeze case: -Change will reset all connected sockets when the devic -disappears and flush all device writes and interrupts -and also delete virtqueues and flush outstanding -callbacks if any. - -In Restore case: -Change will initialize all the necessary parameter to -make the virtio device ready - -Tracked-On: OAM-100107 -Signed-off-by: Stefano Garzarella -Signed-off-by: Bharat Panda ---- - net/vmw_vsock/virtio_transport.c | 100 +++++++++++++++++++++++++++++++ - 1 file changed, 100 insertions(+) - -diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c -index 9d012817cefc..f505f476973d 100644 ---- a/net/vmw_vsock/virtio_transport.c -+++ b/net/vmw_vsock/virtio_transport.c -@@ -696,6 +696,104 @@ static void virtio_vsock_remove(struct virtio_device *vdev) - kfree(vsock); - } - -+static int virtio_vsock_freeze(struct virtio_device *vdev) -+{ -+ struct virtio_vsock *vsock = vdev->priv; -+ struct virtio_vsock_pkt *pkt; -+ mutex_lock(&the_virtio_vsock_mutex); -+ rcu_assign_pointer(the_virtio_vsock, NULL); -+ synchronize_rcu(); -+ /* Reset all connected sockets when the device disappear */ -+ // vsock_for_each_connected_socket(&virtio_transport.transport,virtio_vsock_reset_sock); //Original -+ vsock_for_each_connected_socket(virtio_vsock_reset_sock); -+ /* Stop all work handlers to make sure no one is accessing the device, -+ * so we can safely call virtio_reset_device(). -+ */ -+ mutex_lock(&vsock->rx_lock); -+ vsock->rx_run = false; -+ mutex_unlock(&vsock->rx_lock); -+ mutex_lock(&vsock->tx_lock); -+ vsock->tx_run = false; -+ mutex_unlock(&vsock->tx_lock); -+ mutex_lock(&vsock->event_lock); -+ vsock->event_run = false; -+ mutex_unlock(&vsock->event_lock); -+ -+ mutex_lock(&vsock->rx_lock); -+ while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_RX]))) -+ virtio_transport_free_pkt(pkt); -+ mutex_unlock(&vsock->rx_lock); -+ mutex_lock(&vsock->tx_lock); -+ while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_TX]))) -+ virtio_transport_free_pkt(pkt); -+ mutex_unlock(&vsock->tx_lock); -+ spin_lock_bh(&vsock->send_pkt_list_lock); -+ while (!list_empty(&vsock->send_pkt_list)) { -+ pkt = list_first_entry(&vsock->send_pkt_list, -+ struct virtio_vsock_pkt, list); -+ list_del(&pkt->list); -+ virtio_transport_free_pkt(pkt); -+ } -+ spin_unlock_bh(&vsock->send_pkt_list_lock); -+ /* Delete virtqueues and flush outstanding callbacks if any */ -+ vdev->config->del_vqs(vdev); -+ -+ /* Other works can be queued before 'config->del_vqs()', so we flush -+ * all works before to free the vsock object to avoid use after free. -+ */ -+ flush_work(&vsock->rx_work); -+ flush_work(&vsock->tx_work); -+ flush_work(&vsock->event_work); -+ flush_work(&vsock->send_pkt_work); -+ -+ mutex_unlock(&the_virtio_vsock_mutex); -+ -+ printk("virtio_vsock_freeze: ok\n"); -+ -+ return 0; -+} -+ -+static int virtio_vsock_restore(struct virtio_device *vdev) -+{ -+ vq_callback_t *callbacks[] = { -+ virtio_vsock_rx_done, -+ virtio_vsock_tx_done, -+ virtio_vsock_event_done, -+ }; -+ static const char * const names[] = { -+ "rx", -+ "tx", -+ "event", -+ }; -+ struct virtio_vsock *vsock = vdev->priv; -+ int ret; -+ mutex_lock(&the_virtio_vsock_mutex); -+ ret = virtio_find_vqs(vsock->vdev, VSOCK_VQ_MAX, -+ vsock->vqs, callbacks, names, -+ NULL); -+ if (ret < 0) -+ goto out; -+ virtio_device_ready(vdev); -+ virtio_vsock_update_guest_cid(vsock); -+ vsock_for_each_connected_socket(virtio_vsock_reset_sock); -+ mutex_lock(&vsock->tx_lock); -+ vsock->tx_run = true; -+ mutex_unlock(&vsock->tx_lock); -+ mutex_lock(&vsock->rx_lock); -+ virtio_vsock_rx_fill(vsock); -+ vsock->rx_run = true; -+ mutex_unlock(&vsock->rx_lock); -+ mutex_lock(&vsock->event_lock); -+ virtio_vsock_event_fill(vsock); -+ vsock->event_run = true; -+ mutex_unlock(&vsock->event_lock); -+ rcu_assign_pointer(the_virtio_vsock, vsock); -+ printk("virtio_vsock_restore: ok\n"); -+ ret = 0; -+out: -+ mutex_unlock(&the_virtio_vsock_mutex); -+ return ret; -+} - static struct virtio_device_id id_table[] = { - { VIRTIO_ID_VSOCK, VIRTIO_DEV_ANY_ID }, - { 0 }, -@@ -712,6 +810,8 @@ static struct virtio_driver virtio_vsock_driver = { - .id_table = id_table, - .probe = virtio_vsock_probe, - .remove = virtio_vsock_remove, -+ .freeze = virtio_vsock_freeze, -+ .restore = virtio_vsock_restore, - }; - - static int __init virtio_vsock_init(void) --- -2.17.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0016-Skip-hw-pmu-for-VM-on-ADL.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0016-Skip-hw-pmu-for-VM-on-ADL.patch deleted file mode 100644 index 02cf0ed656..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0016-Skip-hw-pmu-for-VM-on-ADL.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 1cfc616118ffc0ac98cdbb6e3413c613345cd2f4 Mon Sep 17 00:00:00 2001 -From: Sun Jian -Date: Mon, 4 Oct 2021 06:41:16 +0800 -Subject: [PATCH] Skip hw pmu for VM on ADL - ---- - arch/x86/events/core.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c -index 81d5e0a1f48c..0594235a0cd0 100644 ---- a/arch/x86/events/core.c -+++ b/arch/x86/events/core.c -@@ -41,6 +41,7 @@ - #include - #include - #include -+#include - - #include "perf_event.h" - -@@ -252,6 +253,13 @@ bool check_hw_exists(struct pmu *pmu, int num_counters, int num_counters_fixed) - int bios_fail = 0; - int reg_safe = -1; - -+ if(boot_cpu_has(X86_FEATURE_HYPERVISOR) && -+ (boot_cpu_data.x86_model == INTEL_FAM6_ALDERLAKE || -+ boot_cpu_data.x86_model == INTEL_FAM6_ALDERLAKE_L)) { -+ pr_cont("Disabling PMU for VM on ADL.\n"); -+ goto msr_fail; -+ } -+ - /* - * Check to see if the BIOS enabled any of the counters, if so - * complain and bail. --- -2.35.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0017-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0017-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch deleted file mode 100644 index 0cae7ca648..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0017-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 08d146c36fd7f3e2477ca20cf7476710a59dd46b Mon Sep 17 00:00:00 2001 -From: "Suresh, Prashanth" -Date: Tue, 5 Jul 2022 23:58:22 +0530 -Subject: [PATCH] Bluetooth: btusb: Add reset on close quirk for Intel adapters - -Intel Bluetooth adapter is not exiting the loopback mode on bluetooth -socket closure. So, when bluetooth socket is opened again, bluetooth is -not working. - -As per Bluetooth core specification, bluetooth adapter should exit loop -back mode on hci reset. Add HCI quirk reset to make sure adapter exits -loopback mode on bluetooth socket closure. - -Tracked-On: OAM-102732 -Signed-off-by: Suresh, Prashanth ---- - drivers/bluetooth/btintel.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c -index f1705b46fc88..b684cb147210 100644 ---- a/drivers/bluetooth/btintel.c -+++ b/drivers/bluetooth/btintel.c -@@ -2228,6 +2228,7 @@ static int btintel_setup_combined(struct hci_dev *hdev) - } - - /* Apply the common HCI quirks for Intel device */ -+ set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); - set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); - set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); - set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks); --- -2.37.0 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0018-Fix-build-error-in-few-setups-due-to-change-introduc.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0018-Fix-build-error-in-few-setups-due-to-change-introduc.patch deleted file mode 100644 index 508ce26d64..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0018-Fix-build-error-in-few-setups-due-to-change-introduc.patch +++ /dev/null @@ -1,37 +0,0 @@ -From b86cb74443a9e7328b9eea29dff86209414d83cf Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Sat, 26 Nov 2022 08:22:32 +0530 -Subject: [PATCH] Fix build error in few setups due to change introduced for - clang-13 bug - -Revert "Kconfig: Add option for asm goto w/ tied outputs to workaround clang-13 bug" - -This reverts commit 64639d11186e208f371cbbff74115514ac53a606 as the fix -is intended as workaround for clang-13 bug whereas in Android 13 clang-14 -is used. - -Tracked-On: OAM-105014 -Signed-off-by: Jeevaka Prabu Badrappan ---- - init/Kconfig | 5 ----- - 1 file changed, 5 deletions(-) - -diff --git a/init/Kconfig b/init/Kconfig -index 641cd05d3e6b..722aa998006e 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -77,11 +77,6 @@ config CC_HAS_ASM_GOTO_OUTPUT - depends on CC_HAS_ASM_GOTO - def_bool $(success,echo 'int foo(int x) { asm goto ("": "=r"(x) ::: bar); return x; bar: return 0; }' | $(CC) -x c - -c -o /dev/null) - --config CC_HAS_ASM_GOTO_TIED_OUTPUT -- depends on CC_HAS_ASM_GOTO_OUTPUT -- # Detect buggy gcc and clang, fixed in gcc-11 clang-14. -- def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .\n": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null) -- - config TOOLS_SUPPORT_RELR - def_bool $(success,env "CC=$(CC)" "LD=$(LD)" "NM=$(NM)" "OBJCOPY=$(OBJCOPY)" $(srctree)/scripts/tools-support-relr.sh) - --- -2.38.1 - diff --git a/bsp_diff/common/kernel/linux-intel-lts2021/0019-updating-dummy-cpufreq_frequency_table.patch b/bsp_diff/common/kernel/linux-intel-lts2021/0019-updating-dummy-cpufreq_frequency_table.patch deleted file mode 100644 index e8691ef804..0000000000 --- a/bsp_diff/common/kernel/linux-intel-lts2021/0019-updating-dummy-cpufreq_frequency_table.patch +++ /dev/null @@ -1,40 +0,0 @@ -From c7fea08eedfe57b5f546376d53c5cf958145604c Mon Sep 17 00:00:00 2001 -From: raju -Date: Mon, 24 Jul 2023 06:39:53 +0000 -Subject: [PATCH] updating dummy cpufreq_frequency_table - -updating frequency tables that represent the available -CPU frequencies from ADL for scaling the CPU's clock -frequency dynamically. This structure allows the kernel -to manage the CPU's operating frequency based on the system's -workload and power-saving requirements. - -Reference platform (ADL-NUC): -Model name: 12th Gen Intel(R) Core(TM) i7-1260P -CPU min MHz: 400MHz -CPU max MHz: 4700MHz - -Tracked-On: OAM-111324 -Signed-off-by: raju ---- - drivers/cpufreq/dummy-cpufreq.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/cpufreq/dummy-cpufreq.c b/drivers/cpufreq/dummy-cpufreq.c -index e74ef6782e5a..9637280e5f8d 100644 ---- a/drivers/cpufreq/dummy-cpufreq.c -+++ b/drivers/cpufreq/dummy-cpufreq.c -@@ -6,8 +6,8 @@ - #include - - static struct cpufreq_frequency_table freq_table[] = { -- { .frequency = 1 }, -- { .frequency = 2 }, -+ { .frequency = 400000 }, -+ { .frequency = 4700000 }, - { .frequency = CPUFREQ_TABLE_END }, - }; - --- -2.39.2 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0001-make-vmmouse-report-relative-values.patch b/bsp_diff/common/kernel/lts2021-chromium/0001-make-vmmouse-report-relative-values.patch deleted file mode 100644 index 7e9f4fa29e..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0001-make-vmmouse-report-relative-values.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 4c129d7a16f229efc7353d92d9baebfefa8accd1 Mon Sep 17 00:00:00 2001 -From: Zhi Jin -Date: Mon, 22 Jul 2019 18:20:28 +0800 -Subject: [PATCH] make vmmouse report relative values - -Change-Id: I6a89e81ca93cabd8a35848ebe61c2a29ad928738 -Tracked-On: -Signed-off-by: Zhi Jin ---- - drivers/input/mouse/vmmouse.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c -index 42443ffba7c4..55ab6c9ea6ae 100644 ---- a/drivers/input/mouse/vmmouse.c -+++ b/drivers/input/mouse/vmmouse.c -@@ -304,7 +304,7 @@ static int vmmouse_enable(struct psmouse *psmouse) - VMMOUSE_CMD(ABSPOINTER_RESTRICT, VMMOUSE_RESTRICT_CPL0, - dummy1, dummy2, dummy3, dummy4); - -- VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_ABSOLUTE, -+ VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_RELATIVE, - dummy1, dummy2, dummy3, dummy4); - - return 0; --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0002-greybus-Remove-Android.mk.patch b/bsp_diff/common/kernel/lts2021-chromium/0002-greybus-Remove-Android.mk.patch deleted file mode 100644 index 2814f28253..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0002-greybus-Remove-Android.mk.patch +++ /dev/null @@ -1,33 +0,0 @@ -From e28ccb2c20dfe9440ebaf1b87ab138981da4069d Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Wed, 1 Apr 2020 21:44:26 +0530 -Subject: [PATCH] greybus: Remove Android.mk - -Remove Android.mk as redefine errors are seen when multiple -kernels projects are used in the Android build. - -Signed-off-by: Jeevaka Prabu Badrappan ---- - drivers/staging/greybus/tools/Android.mk | 10 ---------- - 1 file changed, 10 deletions(-) - delete mode 100644 drivers/staging/greybus/tools/Android.mk - -diff --git a/drivers/staging/greybus/tools/Android.mk b/drivers/staging/greybus/tools/Android.mk -deleted file mode 100644 -index fdadbf611757..000000000000 ---- a/drivers/staging/greybus/tools/Android.mk -+++ /dev/null -@@ -1,10 +0,0 @@ --LOCAL_PATH:= $(call my-dir) -- --include $(CLEAR_VARS) -- --LOCAL_SRC_FILES:= loopback_test.c --LOCAL_MODULE_TAGS := optional --LOCAL_MODULE := gb_loopback_test -- --include $(BUILD_EXECUTABLE) -- --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0003-Bluetooth-SCO-USB-driver.patch b/bsp_diff/common/kernel/lts2021-chromium/0003-Bluetooth-SCO-USB-driver.patch deleted file mode 100644 index 1a0bcf172e..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0003-Bluetooth-SCO-USB-driver.patch +++ /dev/null @@ -1,1127 +0,0 @@ -From 3b757ebe9db619ad41eb059f878aaa5dd2342219 Mon Sep 17 00:00:00 2001 -From: Aiswarya Cyriac -Date: Wed, 20 May 2020 10:55:20 +0530 -Subject: [PATCH] Bluetooth SCO USB driver. - -This driver is required if you want to use Bluetooth devices -with USB interface to support SCO. - -Tracked-On: OAM-91225 -Signed-off-by: Aiswarya Cyriac ---- - sound/usb/Kconfig | 1 + - sound/usb/Makefile | 1 + - sound/usb/btusb/Kconfig | 11 + - sound/usb/btusb/Makefile | 2 + - sound/usb/btusb/btusb_sco_snd_card.c | 1051 ++++++++++++++++++++++++++ - 5 files changed, 1066 insertions(+) - create mode 100644 sound/usb/btusb/Kconfig - create mode 100644 sound/usb/btusb/Makefile - create mode 100644 sound/usb/btusb/btusb_sco_snd_card.c - -diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig -index 059242f15d75..7258064f5451 100644 ---- a/sound/usb/Kconfig -+++ b/sound/usb/Kconfig -@@ -166,6 +166,7 @@ config SND_BCD2000 - will be called snd-bcd2000. - - source "sound/usb/line6/Kconfig" -+source "sound/usb/btusb/Kconfig" - - endif # SND_USB - -diff --git a/sound/usb/Makefile b/sound/usb/Makefile -index 9ccb21a4ff8a..94587acf66c5 100644 ---- a/sound/usb/Makefile -+++ b/sound/usb/Makefile -@@ -35,3 +35,4 @@ obj-$(CONFIG_SND_USB_US122L) += snd-usbmidi-lib.o - - obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/ bcd2000/ - obj-$(CONFIG_SND_USB_LINE6) += line6/ -+obj-$(CONFIG_BT_SCOHCI) += btusb/ -diff --git a/sound/usb/btusb/Kconfig b/sound/usb/btusb/Kconfig -new file mode 100644 -index 000000000000..f5b996373a67 ---- /dev/null -+++ b/sound/usb/btusb/Kconfig -@@ -0,0 +1,11 @@ -+ -+config BT_SCOHCI -+ tristate "BT HCI USB driver" -+ depends on BT -+ help -+ Bluetooth SCO USB driver. -+ This driver is required if you want to use Bluetooth devices with -+ USB interface to support SCO. -+ -+ Say Y here to compile support for Bluetooth USB devices into the -+ kernel or say M to compile it as module (btusb) -diff --git a/sound/usb/btusb/Makefile b/sound/usb/btusb/Makefile -new file mode 100644 -index 000000000000..e4bb8d72099b ---- /dev/null -+++ b/sound/usb/btusb/Makefile -@@ -0,0 +1,2 @@ -+ -+obj-$(CONFIG_BT_SCOHCI) += btusb_sco_snd_card.o -diff --git a/sound/usb/btusb/btusb_sco_snd_card.c b/sound/usb/btusb/btusb_sco_snd_card.c -new file mode 100644 -index 000000000000..71e2059e217c ---- /dev/null -+++ b/sound/usb/btusb/btusb_sco_snd_card.c -@@ -0,0 +1,1051 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+// -+// btusb_sco_snd_card.c -- ALSA USB audio driver for BT -+// SCO over USB -+// -+// Copyright (C) 2019 Intel Corp. -+// -+// Authors: Aiswarya Cyriac -+// Pankaj Bharadiya -+// Jeevaka Badrappan -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+#define BTUSB_INTEL_NEW 0x2000 -+#define DEVICE_INDEX 0 -+#define NUM_PLAYBACK_SUBSTREAMS 1 -+#define NUM_CAPTURE_SUBSTREAMS 1 -+#define SCO_HDR_SIZE 3 -+#define SCO_HANDLE_SIZE 2 -+#define SCO_LENGTH_FIELD_SIZE 1 -+#define MIN_PERIOD_SIZE 48 -+#define MAX_PACKET_SIZE (SCO_HDR_SIZE + MIN_PERIOD_SIZE) -+#define BTUSB_MAX_ISOC_FRAMES 10 -+#define BTUSB_SCO_ALTERNATE_SETTING 2 -+#define BTUSB_ISOC_TX_EP_CONFIGURED 1 -+#define BTUSB_ISOC_RX_EP_CONFIGURED 2 -+#define BTUSB_ISOC_TX_START 3 -+#define BTUSB_ISOC_RX_START 4 -+#define MAX_URBS 12 -+#define BUFF_SIZE_MAX (PAGE_SIZE * 16) -+#define PRD_SIZE_MAX PAGE_SIZE /*4096*/ -+#define MIN_PERIODS 4 -+ -+static struct usb_driver btusb_sco_driver; -+static DEFINE_MUTEX(config_mutex); -+ -+struct capture_data_cb { -+ unsigned char *buf; -+ unsigned int pos; -+ unsigned int expected; -+}; -+ -+struct btusb_data { -+ struct snd_card *card; -+ struct snd_pcm *pcm; -+ struct usb_device *udev; -+ struct usb_interface *intf; -+ -+ unsigned int isoc_ifnum; -+ -+ unsigned long flags; -+ -+ spinlock_t txlock; -+ spinlock_t rxlock; -+ -+ struct usb_endpoint_descriptor *isoc_tx_ep; -+ struct usb_endpoint_descriptor *isoc_rx_ep; -+ -+ unsigned int sco_num; -+ int alternate_setting_num; -+ uint8_t *playback_data; -+ -+ struct capture_data_cb *capture_data; -+ -+ struct snd_pcm_substream *playback_stream; -+ struct snd_pcm_substream *capture_stream; -+ -+ unsigned int playback_hwptr_done; -+ unsigned int playback_transfer_done; -+ unsigned int capture_hwptr_done; -+ -+ struct usb_anchor rx_anchor; -+ -+ struct urb *tx_urb; -+ struct urb *rx_urb[MAX_URBS]; -+}; -+ -+ -+uint8_t handle[2]; -+ -+static const struct usb_device_id btusb_sco_table[] = { -+ /* Intel Bluetooth devices */ -+ { USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0026), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL_NEW }, -+ { } /* Terminating entry */ -+}; -+ -+MODULE_DEVICE_TABLE(usb, btusb_sco_table); -+ -+static void btusb_isoc_tx_complete(struct urb *urb); -+ -+static struct capture_data_cb *init_capture_data_cb(void) -+{ -+ -+ struct capture_data_cb *cb; -+ -+ cb = kzalloc(sizeof(struct capture_data_cb), GFP_KERNEL); -+ if (!cb) -+ return NULL; -+ cb->buf = kzalloc(HCI_MAX_SCO_SIZE, GFP_KERNEL); -+ if (!cb->buf) { -+ kfree(cb); -+ return NULL; -+ } -+ cb->pos = 0; -+ cb->expected = 0; -+ -+ return cb; -+} -+ -+static void deinit_capture_data_cb(struct capture_data_cb *cb) -+{ -+ kfree(cb->buf); -+ kfree(cb); -+ cb = NULL; -+} -+ -+static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu) -+{ -+ int i, offset = 0; -+ -+ for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu; -+ i++, offset += mtu, len -= mtu) { -+ urb->iso_frame_desc[i].offset = offset; -+ urb->iso_frame_desc[i].length = mtu; -+ } -+ -+ if (len && i < BTUSB_MAX_ISOC_FRAMES) { -+ urb->iso_frame_desc[i].offset = offset; -+ urb->iso_frame_desc[i].length = len; -+ i++; -+ } -+ -+ urb->number_of_packets = i; -+} -+ -+static int btusb_isoc_initialize_tx_urb(struct btusb_data *data) -+{ -+ unsigned int pipe; -+ struct device *dev = &(data->udev->dev); -+ -+ if (!data->isoc_tx_ep) { -+ dev_err(dev, "%s - isoc_tx_ep is NULL\n", __func__); -+ return -ENODEV; -+ } -+ data->tx_urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); -+ if (!data->tx_urb) { -+ dev_err(dev, "%s - usb_alloc_urb is NULL\n", __func__); -+ return -ENOMEM; -+ } -+ -+ pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress); -+ -+ usb_fill_int_urb(data->tx_urb, data->udev, pipe, data->playback_data, -+ MAX_PACKET_SIZE, btusb_isoc_tx_complete, data, -+ data->isoc_tx_ep->bInterval); -+ -+ data->tx_urb->transfer_flags = URB_ISO_ASAP; -+ -+ __fill_isoc_descriptor(data->tx_urb, MAX_PACKET_SIZE, -+ le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); -+ -+ return 0; -+} -+ -+static void btusb_isoc_prepare_tx_urb(struct btusb_data *data) -+{ -+ unsigned int stride, frames, bytes; -+ static unsigned int oldptr; -+ uint8_t period_elapsed = 0; -+ unsigned long flags; -+ uint8_t *playback_buf; -+ struct snd_pcm_runtime *runtime; -+ -+ runtime = data->playback_stream->runtime; -+ stride = runtime->frame_bits >> 3; -+ // TODO: Check to be added in hw_params to reject other period size -+ bytes = MIN_PERIOD_SIZE; -+ playback_buf = data->playback_data; -+ -+ memcpy(playback_buf, handle, SCO_HANDLE_SIZE); -+ memcpy(playback_buf + SCO_HANDLE_SIZE, &bytes, SCO_LENGTH_FIELD_SIZE); -+ -+ spin_lock_irqsave(&data->txlock, flags); -+ oldptr = data->playback_hwptr_done; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ -+ if (oldptr + bytes > runtime->buffer_size * stride) { -+ /* err, the transferred area goes over buffer boundary. */ -+ unsigned int bytes1 = -+ runtime->buffer_size * stride - oldptr; -+ memcpy(playback_buf + SCO_HDR_SIZE, -+ runtime->dma_area + oldptr, bytes1); -+ memcpy(playback_buf + SCO_HDR_SIZE + bytes1, -+ runtime->dma_area + oldptr+bytes1, bytes - bytes1); -+ } else { -+ memcpy(playback_buf + SCO_HDR_SIZE, -+ runtime->dma_area + oldptr, bytes); -+ } -+ frames = (bytes + (oldptr % stride)) / stride; -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_hwptr_done = (data->playback_hwptr_done + bytes) % -+ (runtime->buffer_size * stride); -+ data->playback_transfer_done += frames; -+ if (data->playback_transfer_done >= runtime->period_size) { -+ data->playback_transfer_done = 0; -+ period_elapsed = 1; -+ } -+ spin_unlock_irqrestore(&data->txlock, flags); -+ -+ if (period_elapsed == 1) { -+ period_elapsed = 0; -+ return snd_pcm_period_elapsed(data->playback_stream); -+ } -+} -+ -+static void btusb_isoc_submit_tx_urb(struct btusb_data *data) -+{ -+ struct device *dev = &(data->udev->dev); -+ int err; -+ -+ err = usb_submit_urb(data->tx_urb, GFP_ATOMIC); -+ if (err < 0) { -+ dev_err(dev, "%s urb %p submission failed (%d)", -+ __func__, data->tx_urb, -err); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ } -+} -+ -+static void btusb_isoc_tx_complete(struct urb *urb) -+{ -+ struct btusb_data *data = urb->context; -+ -+ if (test_bit(BTUSB_ISOC_TX_START, &data->flags)) { -+ btusb_isoc_prepare_tx_urb(data); -+ btusb_isoc_submit_tx_urb(data); -+ } -+} -+ -+static void process_sco_buffer(struct btusb_data *data) -+{ -+ unsigned long flags; -+ unsigned int hw_ptr; -+ int sco_data_count; -+ struct snd_pcm_runtime *runtime; -+ unsigned char *sco_buffer = data->capture_data->buf; -+ unsigned char *audio_buffer = data->capture_data->buf + SCO_HDR_SIZE; -+ unsigned int pending; -+ -+ sco_data_count = sco_buffer[SCO_HANDLE_SIZE]; -+ spin_lock_irqsave(&data->rxlock, flags); -+ hw_ptr = data->capture_hwptr_done; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ runtime = data->capture_stream->runtime; -+ pending = runtime->dma_bytes - hw_ptr; -+ -+ if (pending < sco_data_count) { -+ memcpy(runtime->dma_area + hw_ptr, audio_buffer, pending); -+ memcpy(runtime->dma_area, (void *)audio_buffer + pending, -+ sco_data_count - pending); -+ } else { -+ memcpy(runtime->dma_area + hw_ptr, (void *) audio_buffer, -+ sco_data_count); -+ } -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_hwptr_done = (hw_ptr + sco_data_count) % -+ runtime->dma_bytes; -+ hw_ptr = data->capture_hwptr_done; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+} -+ -+static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count) -+{ -+ int err = 0; -+ struct capture_data_cb *cb = data->capture_data; -+ int len; -+ struct hci_sco_hdr *sco_hdr; -+ struct device *dev = &(data->udev->dev); -+ -+ if (count == 0) -+ return -ENODATA; -+ -+ while (count) { -+ -+ if (cb->pos == 0) -+ cb->expected = SCO_HDR_SIZE; -+ -+ len = min_t(uint, cb->expected, count); -+ memcpy(cb->buf + cb->pos, buffer, len); -+ count -= len; -+ cb->expected -= len; -+ cb->pos += len; -+ buffer += len; -+ -+ if (cb->pos == SCO_HDR_SIZE) { -+ sco_hdr = (struct hci_sco_hdr *)cb->buf; -+ cb->expected = cb->buf[2]; -+ if (memcmp(cb->buf, handle, 2)) { -+ cb->pos = 0; -+ dev_err(dev, "%s Invalid SCO handle", __func__); -+ return -EPROTO; -+ } -+ if (cb->expected > 48) { -+ dev_err(dev, "%s:Error in capture", __func__); -+ return -EPROTO; -+ } -+ if ((HCI_MAX_SCO_SIZE - cb->pos) < cb->expected) { -+ dev_err(dev, "Invalid USB frame"); -+ cb->pos = 0; -+ err = -EPROTO; -+ return err; -+ } -+ } -+ if (!cb->expected) { -+ // copy data to stream buffer -+ process_sco_buffer(data); -+ cb->pos = 0; -+ } -+ } -+ return 0; -+} -+ -+static int btusb_isoc_submit_urb(struct urb *urb, struct btusb_data *data) -+{ -+ int err; -+ struct device *dev = &(data->udev->dev); -+ -+ usb_anchor_urb(urb, &data->rx_anchor); -+ err = usb_submit_urb(urb, GFP_ATOMIC); -+ if (err < 0) { -+ /* -EPERM: urb is being killed; -+ * -ENODEV: device got disconnected -+ */ -+ if (err != -EPERM && err != -ENODEV) -+ dev_err(dev, "urb %p failed to submit (%d)", -+ urb, err); -+ usb_unanchor_urb(urb); -+ } -+ return err; -+} -+static int btusb_isoc_submit_rx_urbs(struct btusb_data *data) -+{ -+ int i, err = 0; -+ struct device *dev = &(data->udev->dev); -+ -+ for (i = 0; i < MAX_URBS; i++) { -+ err = btusb_isoc_submit_urb(data->rx_urb[i], data); -+ if (err < 0) { -+ dev_err(dev, "%s - err: %d\n", __func__, err); -+ break; -+ } -+ } -+ return (i < 2) ? err : 0; -+} -+ -+static void btusb_isoc_rx_complete(struct urb *urb) -+{ -+ struct btusb_data *data = urb->context; -+ struct device *dev = &(data->udev->dev); -+ int i; -+ -+ if (!test_bit(BTUSB_ISOC_RX_START, &data->flags)) { -+ dev_dbg(dev, "%s BTUSB_ISOC_RX_START not set\n", __func__); -+ return; -+ } -+ -+ if (urb->status == 0) { -+ for (i = 0; i < urb->number_of_packets; i++) { -+ -+ unsigned int offset = urb->iso_frame_desc[i].offset; -+ unsigned int length = -+ urb->iso_frame_desc[i].actual_length; -+ -+ if (urb->iso_frame_desc[i].status) -+ continue; -+ if (length <= 0) -+ continue; -+ btusb_recv_isoc(data, urb->transfer_buffer + offset, -+ length); -+ } -+ } else if (urb->status == -ENOENT || urb->status == -ENODEV) { -+ /* Avoid suspend failed when usb_kill_urb */ -+ dev_err(dev, "USB disconnected or Endpoint not available\n"); -+ return; -+ } else { -+ dev_err(dev, "%s - urb->status= %d\n", __func__, urb->status); -+ goto submit; -+ } -+ snd_pcm_period_elapsed(data->capture_stream); -+submit: -+ if (btusb_isoc_submit_urb(urb, data)) -+ dev_err(dev, " btusb_isoc_submit_rx_urb failed\n"); -+} -+ -+static void btusb_free_rx_urbs(struct btusb_data *data) -+{ -+ int i; -+ struct device *dev; -+ -+ dev = &(data->udev->dev); -+ for (i = 0; i < MAX_URBS; i++) { -+ if (data->rx_urb[i]) { -+ dev_dbg(dev, "%s - Valid URB\n", __func__); -+ usb_free_urb(data->rx_urb[i]); -+ data->rx_urb[i] = NULL; -+ } -+ } -+} -+ -+static int btusb_isoc_prepare_rx_urbs(struct btusb_data *data) -+{ -+ struct urb *urb; -+ unsigned char *buf; -+ unsigned int pipe; -+ int i, size; -+ struct device *dev; -+ -+ dev = &(data->udev->dev); -+ -+ if (!data->isoc_rx_ep) { -+ dev_err(dev, "%s isoc_rx_ep is NULL\n", __func__); -+ return -ENODEV; -+ } -+ for (i = 0; i < MAX_URBS; i++) { -+ urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); -+ -+ if (!urb) { -+ dev_err(dev, "%s URB allocation failed\n", __func__); -+ return -ENOMEM; -+ } -+ -+ size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * -+ BTUSB_MAX_ISOC_FRAMES; -+ -+ buf = kmalloc(size, GFP_KERNEL); -+ if (!buf) { -+ btusb_free_rx_urbs(data); -+ return -ENOMEM; -+ } -+ pipe = usb_rcvisocpipe(data->udev, -+ data->isoc_rx_ep->bEndpointAddress); -+ -+ usb_fill_int_urb(urb, data->udev, pipe, buf, size, -+ btusb_isoc_rx_complete, data, -+ data->isoc_rx_ep->bInterval); -+ -+ urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; -+ -+ __fill_isoc_descriptor(urb, size, -+ le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); -+ -+ data->rx_urb[i] = urb; -+ } -+ return 0; -+} -+ -+static inline int __set_isoc_interface(struct snd_pcm_substream *substream, -+ int alternate_setting_num) -+{ -+ struct usb_endpoint_descriptor *ep_desc; -+ int i, err; -+ struct device *dev; -+ struct btusb_data *data = snd_pcm_substream_chip(substream); -+ -+ dev = &(data->udev->dev); -+ -+ if (!data->intf) -+ return -ENODEV; -+ -+ if (data->alternate_setting_num == alternate_setting_num) -+ return 0; -+ -+ err = usb_set_interface(data->udev, data->isoc_ifnum, -+ alternate_setting_num); -+ if (err < 0) { -+ dev_err(dev, "%s failed (%d)", __func__, -err); -+ return err; -+ } -+ data->alternate_setting_num = alternate_setting_num; -+ -+ data->isoc_tx_ep = NULL; -+ data->isoc_rx_ep = NULL; -+ -+ for (i = 0; i < data->intf->cur_altsetting->desc.bNumEndpoints; i++) { -+ ep_desc = &data->intf->cur_altsetting->endpoint[i].desc; -+ -+ if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { -+ data->isoc_tx_ep = ep_desc; -+ continue; -+ } -+ -+ if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { -+ data->isoc_rx_ep = ep_desc; -+ continue; -+ } -+ } -+ -+ if (!data->isoc_tx_ep || !data->isoc_rx_ep) { -+ dev_err(dev, "%s - invalid SCO descriptors", __func__); -+ return -ENODEV; -+ } -+ -+ return 0; -+} -+ -+static struct snd_pcm_hardware btsco_pcm_hardware = { -+ .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER -+ | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID, -+ .rates = SNDRV_PCM_RATE_CONTINUOUS, -+ .buffer_bytes_max = BUFF_SIZE_MAX, -+ .period_bytes_min = MIN_PERIOD_SIZE, -+ .period_bytes_max = 16384, -+ .periods_min = MIN_PERIODS, -+ .periods_max = 1024, -+ -+}; -+ -+static int bt_pcm_open(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ struct snd_pcm_runtime *runtime; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ if (!data) -+ return -ENOMEM; -+ -+ dev = &(data->udev->dev); -+ runtime = substream->runtime; -+ -+ if (runtime == NULL) { -+ dev_err(dev, "%s: value of runtime is NULL", __func__); -+ return -ENODEV; -+ } -+ -+ if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ data->capture_data = init_capture_data_cb(); -+ if (!data->capture_data) { -+ dev_err(dev, "value of capture_data is NULL"); -+ return -ENOMEM; -+ } -+ } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ data->playback_data = -+ kzalloc(sizeof(uint8_t) * MAX_PACKET_SIZE, GFP_KERNEL); -+ if (!data->playback_data) { -+ dev_err(dev, "playback_data memory allocation failed"); -+ return -ENOMEM; -+ } -+ } -+ -+ runtime->hw = btsco_pcm_hardware; -+ -+ runtime->hw.rate_min = 8000; -+ runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; -+ runtime->hw.channels_min = 1; -+ runtime->hw.period_bytes_min = MIN_PERIOD_SIZE; -+ runtime->hw.rate_max = 16000; -+ runtime->hw.channels_max = runtime->hw.channels_min; -+ snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); -+ -+ return 0; -+} -+ -+static int configure_endpoints(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ struct device *dev; -+ int err; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) -+ set_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags); -+ else -+ set_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags); -+ -+ if (test_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags) ^ -+ test_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags)) { -+ -+ err =__set_isoc_interface(substream, -+ BTUSB_SCO_ALTERNATE_SETTING); -+ if (err < 0) { -+ dev_err(dev, "setting alt settings failed\n"); -+ return -EIO; -+ } -+ } -+ return 0; -+} -+ -+ -+static int bt_pcm_prepare(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ int err; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ // TODO: Does endpoint needs to be configured separately for Tx and Rx -+ // endpoints? -+ mutex_lock(&config_mutex); -+ err = configure_endpoints(substream); -+ mutex_unlock(&config_mutex); -+ if (err < 0) { -+ dev_err(dev, "failed to configure Endpoints err:%d\n", err); -+ return err; -+ } -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ btusb_isoc_prepare_tx_urb(data); -+ err = btusb_isoc_initialize_tx_urb(data); -+ if (err < 0) { -+ dev_err(dev, "Failed in init tx urb err:%d\n", err); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ return err; -+ } -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ err = btusb_isoc_prepare_rx_urbs(data); -+ if (err < 0) { -+ dev_err(dev, "Failed to init Rx urb err:%d\n", err); -+ return err; -+ } -+ } -+ return err; -+} -+ -+static void btusb_isoc_stop_tx(struct btusb_data *data) -+{ -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+} -+ -+static int bt_pcm_close(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+ clear_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags); -+ kfree(data->playback_data); -+ data->playback_data = NULL; -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+ clear_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags); -+ deinit_capture_data_cb(data->capture_data); -+ } -+ if (!test_bit(BTUSB_ISOC_RX_EP_CONFIGURED, &data->flags) -+ && !test_bit(BTUSB_ISOC_TX_EP_CONFIGURED, &data->flags)) { -+ dev_dbg(dev, "%s Reset EP and Alternate settings\n", __func__); -+ if (__set_isoc_interface(substream, 0) < 0) { -+ dev_err(dev, "Resetting alt settings failed"); -+ return -ENOENT; -+ } -+ } -+ return 0; -+} -+ -+static int bt_pcm_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *hw_params) -+{ -+ struct btusb_data *data; -+ int err; -+ unsigned long flags; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ err = snd_pcm_lib_malloc_pages(substream, -+ params_buffer_bytes(hw_params)); -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_stream = substream; -+ data->playback_hwptr_done = 0; -+ data->playback_transfer_done = 0; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s - SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_stream = substream; -+ data->capture_hwptr_done = 0; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ } -+ -+ return 0; -+ -+} -+static int bt_pcm_hw_free(struct snd_pcm_substream *substream) -+{ -+ struct btusb_data *data; -+ unsigned long flags; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_PLAYBACK\n", __func__); -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+ if (data->tx_urb) { -+ usb_kill_urb(data->tx_urb); -+ kfree(data->tx_urb->setup_packet); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ } -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_stream = NULL; -+ data->playback_hwptr_done = 0; -+ data->playback_transfer_done = 0; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ dev_dbg(dev, "%s SNDRV_PCM_STREAM_CAPTURE\n", __func__); -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+ usb_kill_anchored_urbs(&data->rx_anchor); -+ btusb_free_rx_urbs(data); -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_stream = NULL; -+ data->capture_hwptr_done = 0; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ } -+ snd_pcm_lib_free_pages(substream); -+ return 0; -+} -+ -+static void btusb_isoc_stop_rx(struct btusb_data *data) -+{ -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+} -+ -+static int bt_pcm_capture_trigger(struct snd_pcm_substream *substream, int cmd) -+{ -+ struct btusb_data *data; -+ int err = 0; -+ struct device *dev; -+ -+ data = snd_pcm_substream_chip(substream); -+ dev = &(data->udev->dev); -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_START) ? -+ "SNDRV_PCM_TRIGGER_START" : "SNDRV_PCM_TRIGGER_RESUME"); -+ set_bit(BTUSB_ISOC_RX_START, &data->flags); -+ err = btusb_isoc_submit_rx_urbs(data); -+ if (err < 0) -+ dev_err(dev, "%s err:%d\n", __func__, err); -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_STOP) ? -+ "SNDRV_PCM_TRIGGER_STOP" : "SNDRV_PCM_TRIGGER_SUSPEND"); -+ btusb_isoc_stop_rx(data); -+ break; -+ default: -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static int bt_pcm_playback_trigger(struct snd_pcm_substream *substream, int cmd) -+{ -+ struct btusb_data *data = snd_pcm_substream_chip(substream); -+ int err = 0; -+ struct device *dev = &(data->udev->dev); -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_START) -+ ? "SNDRV_PCM_TRIGGER_START" : "SNDRV_PCM_TRIGGER_RESUME"); -+ set_bit(BTUSB_ISOC_TX_START, &data->flags); -+ btusb_isoc_submit_tx_urb(data); -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ dev_dbg(dev, "%s - command: %s", __func__, -+ (cmd == SNDRV_PCM_TRIGGER_STOP) -+ ? "SNDRV_PCM_TRIGGER_STOP" : "SNDRV_PCM_TRIGGER_SUSPEND"); -+ btusb_isoc_stop_tx(data); -+ break; -+ default: -+ dev_err(dev, "%s - Invalid cmd: %d\n", __func__, cmd); -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static snd_pcm_uframes_t bt_pcm_pointer(struct snd_pcm_substream *substream) -+{ -+ unsigned int playback_hwptr_done; -+ unsigned int capture_hwptr_done; -+ unsigned long flags; -+ struct btusb_data *data = snd_pcm_substream_chip(substream); -+ -+ if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { -+ spin_lock_irqsave(&data->rxlock, flags); -+ capture_hwptr_done = data->capture_hwptr_done; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ return capture_hwptr_done / -+ (substream->runtime->frame_bits >> 3); -+ } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ spin_lock_irqsave(&data->txlock, flags); -+ playback_hwptr_done = data->playback_hwptr_done; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ return playback_hwptr_done / -+ (substream->runtime->frame_bits >> 3); -+ } else -+ return -EINVAL; -+} -+static struct snd_pcm_ops btusb_isoc_capture_ops = { -+ .open = bt_pcm_open, -+ .close = bt_pcm_close, -+ .ioctl = snd_pcm_lib_ioctl, -+ .hw_params = bt_pcm_hw_params, -+ .hw_free = bt_pcm_hw_free, -+ .trigger = bt_pcm_capture_trigger, -+ .pointer = bt_pcm_pointer, -+ .prepare = bt_pcm_prepare, -+}; -+ -+static struct snd_pcm_ops btusb_isoc_playback_ops = { -+ .open = bt_pcm_open, -+ .close = bt_pcm_close, -+ .ioctl = snd_pcm_lib_ioctl, -+ .hw_params = bt_pcm_hw_params, -+ .hw_free = bt_pcm_hw_free, -+ .trigger = bt_pcm_playback_trigger, -+ .pointer = bt_pcm_pointer, -+ .prepare = bt_pcm_prepare, -+}; -+ -+static int snd_usb_audio_dev_free(struct snd_device *device) -+{ -+ struct btusb_data *data = device->device_data; -+ unsigned long flags; -+ -+ if (!data) -+ return 0; -+ -+ clear_bit(BTUSB_ISOC_TX_START, &data->flags); -+ -+ if (data->tx_urb) { -+ usb_kill_urb(data->tx_urb); -+ kfree(data->tx_urb->setup_packet); -+ usb_free_urb(data->tx_urb); -+ data->tx_urb = NULL; -+ } -+ spin_lock_irqsave(&data->txlock, flags); -+ data->playback_stream = NULL; -+ data->playback_hwptr_done = 0; -+ data->playback_transfer_done = 0; -+ spin_unlock_irqrestore(&data->txlock, flags); -+ -+ clear_bit(BTUSB_ISOC_RX_START, &data->flags); -+ usb_kill_anchored_urbs(&data->rx_anchor); -+ btusb_free_rx_urbs(data); -+ spin_lock_irqsave(&data->rxlock, flags); -+ data->capture_stream = NULL; -+ data->capture_hwptr_done = 0; -+ spin_unlock_irqrestore(&data->rxlock, flags); -+ return 0; -+} -+ -+static int btusb_snd_card_create(struct btusb_data *data) -+{ -+ int err = 0; -+ struct snd_card *card; -+ struct device *dev; -+ -+ static struct snd_device_ops ops = { -+ .dev_free = snd_usb_audio_dev_free, -+ }; -+ struct snd_pcm *pcm; -+ -+ dev = &(data->udev->dev); -+ err = snd_card_new(dev, -1, NULL, THIS_MODULE, 0, &card); -+ if (err) { -+ dev_err(dev, "%s:Fail to create sound card", __func__); -+ return err; -+ } -+ data->card = card; -+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, data, &ops); -+ -+ if (err) { -+ snd_card_free(card); -+ dev_err(dev, "Error in creating the sound device device"); -+ return err; -+ } -+ err = snd_pcm_new(card, "BT USB audio source", DEVICE_INDEX, -+ NUM_PLAYBACK_SUBSTREAMS, NUM_CAPTURE_SUBSTREAMS, -+ &pcm); -+ if (err) { -+ dev_err(dev, "%s: Fail to create PCM device ", __func__); -+ return err; -+ } -+ -+ pcm->private_data = data; -+ pcm->info_flags = 0; -+ data->pcm = pcm; -+ strlcpy(pcm->name, "USB Bluetooth audio", sizeof(pcm->name)); -+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, -+ &btusb_isoc_capture_ops); -+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, -+ &btusb_isoc_playback_ops); -+ snd_pcm_lib_preallocate_pages_for_all(pcm, -+ SNDRV_DMA_TYPE_CONTINUOUS, -+ NULL, -+ 64 * 1024, 64 * 1024); -+ strlcpy(card->driver, "bt_audio_source", sizeof(card->driver)); -+ strlcpy(card->shortname, card->driver, sizeof(card->shortname)); -+ strlcpy(card->longname, "USB Bluetooth audio source", -+ sizeof(card->longname)); -+ -+ err = snd_card_register(card); -+ if (err) -+ dev_err(dev, "%s: Failure in registering sound card", __func__); -+ -+ return err; -+} -+ -+int btusb_sco_probe(struct usb_interface *intf, const struct usb_device_id *id) -+{ -+ int err = 0; -+ struct btusb_data *data; -+ -+ data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL); -+ -+ if (!data) -+ return -ENOMEM; -+ -+ data->isoc_ifnum = intf->cur_altsetting->desc.bInterfaceNumber; -+ data->udev = interface_to_usbdev(intf); -+ data->intf = intf; -+ usb_set_intfdata(intf, data); -+ spin_lock_init(&data->txlock); -+ spin_lock_init(&data->rxlock); -+ init_usb_anchor(&data->rx_anchor); -+ -+ err = btusb_snd_card_create(data); -+ -+ return err; -+} -+ -+static void btusb_sco_disconnect(struct usb_interface *intf) -+{ -+ struct btusb_data *data = usb_get_intfdata(intf); -+ -+ if (!data) -+ return; -+ -+ if (data->intf) { -+ usb_set_intfdata(data->intf, NULL); -+ usb_driver_release_interface(&btusb_sco_driver, data->intf); -+ } -+ snd_card_disconnect(data->card); -+ snd_card_free_when_closed(data->card); -+ /* TODO: Freeing the resource causing kernel panic.Cleanup -+ part needs to be checked. -+ kfree(data); -+ data = NULL; */ -+ -+ snd_card_free_when_closed(data->card); -+} -+ -+static int btusb_sco_suspend(struct usb_interface *intf, pm_message_t message) -+{ -+ // TODO: Do we need to call snd_pcm_suspend_all -+ // snd_pcm_suspend_all(data->pcm); -+ return 0; -+} -+ -+static int btusb_sco_resume(struct usb_interface *intf) -+{ -+ // TODO: Do we need to call snd_power_change_state -+ // snd_power_change_state(data->card, SNDRV_CTL_POWER_D0); -+ -+ return 0; -+ -+ } -+ -+static int btusb_sco_ioctl(struct usb_interface *intf, unsigned int code, -+ void *buf) -+{ -+ struct device *dev; -+ int err; -+ -+ if (!buf) -+ return -EINVAL; -+ -+ dev = &(interface_to_usbdev(intf)->dev); -+ -+ if (code == USBDEVFS_IOCTL) { -+ memcpy(handle, (uint8_t *)buf, SCO_HANDLE_SIZE); -+ dev_dbg(dev, "value of handle = %x, %x", handle[0], handle[1]); -+ err = 0; -+ } else { -+ dev_err(dev, "%s:Invalid Ioctl code", __func__); -+ err = -ENOIOCTLCMD; -+ } -+ return err; -+} -+ -+static struct usb_driver btusb_sco_driver = { -+ .name = "btusb_sco", -+ .probe = btusb_sco_probe, -+ .unlocked_ioctl = btusb_sco_ioctl, -+ .disconnect = btusb_sco_disconnect, -+ .suspend = btusb_sco_suspend, -+ .resume = btusb_sco_resume, -+ .id_table = btusb_sco_table, -+ .supports_autosuspend = 0 -+ -+}; -+ -+module_usb_driver(btusb_sco_driver); -+ -+MODULE_DESCRIPTION("SCO over btusb driver for Android"); -+MODULE_LICENSE("GPL"); -+MODULE_VERSION("0.1"); --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch b/bsp_diff/common/kernel/lts2021-chromium/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch deleted file mode 100644 index 6044aa058e..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0004-uvc-Add-UVC-GET_DEF-probe-quirk-for-C922-camera.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 4c67bdfbe1bb45e0efef56c4a4a2444f9dfe6562 Mon Sep 17 00:00:00 2001 -From: saranya -Date: Thu, 4 Jun 2020 14:17:06 +0530 -Subject: [PATCH] uvc: Add UVC GET_DEF probe quirk for C922 camera - -In some of the C922 camera devices, we find that -GET_DEF request is not implemented for video probe -and commit controls. These cameras crash when this -request is received. Hence, add this quirk for C922 -cameras. - -Tracked-On: OAM-91289 -Signed-off-by: saranya ---- - drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c -index b5308c7ca4b1..ec30aae47a9a 100644 ---- a/drivers/media/usb/uvc/uvc_driver.c -+++ b/drivers/media/usb/uvc/uvc_driver.c -@@ -2912,6 +2912,15 @@ static const struct usb_device_id uvc_ids[] = { - .bInterfaceSubClass = 1, - .bInterfaceProtocol = 0, - .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_FORCE_RESUME) }, -+ /* Logitech HD Pro Webcam C922 */ -+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE -+ | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x046d, -+ .idProduct = 0x085c, -+ .bInterfaceClass = USB_CLASS_VIDEO, -+ .bInterfaceSubClass = 1, -+ .bInterfaceProtocol = 0, -+ .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, - /* Chicony CNF7129 (Asus EEE 100HE) */ - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE - | USB_DEVICE_ID_MATCH_INT_INFO, --- -2.34.1 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0005-btusb-snd-crash-while-disconnect.patch b/bsp_diff/common/kernel/lts2021-chromium/0005-btusb-snd-crash-while-disconnect.patch deleted file mode 100644 index d665e10f1c..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0005-btusb-snd-crash-while-disconnect.patch +++ /dev/null @@ -1,31 +0,0 @@ -From b8926186d86eaf5bd2a5208cf8321aa6bee8bb37 Mon Sep 17 00:00:00 2001 -From: Balaji M -Date: Mon, 28 Dec 2020 20:57:24 +0530 -Subject: [PATCH] btusb : snd : crash while disconnect - -removing the duplicacy of snd_card_free_when_closed() -function which is called inside btusb_sco_disconnect() -function. - -Tracked-On: OAM-95334 -Signed-off-by: Prabhat Chand Pandey prabhat.chand.pandey@intel.com ---- - sound/usb/btusb/btusb_sco_snd_card.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/sound/usb/btusb/btusb_sco_snd_card.c b/sound/usb/btusb/btusb_sco_snd_card.c -index 71e2059e217c..16a6dbb608e1 100644 ---- a/sound/usb/btusb/btusb_sco_snd_card.c -+++ b/sound/usb/btusb/btusb_sco_snd_card.c -@@ -990,8 +990,6 @@ static void btusb_sco_disconnect(struct usb_interface *intf) - part needs to be checked. - kfree(data); - data = NULL; */ -- -- snd_card_free_when_closed(data->card); - } - - static int btusb_sco_suspend(struct usb_interface *intf, pm_message_t message) --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch b/bsp_diff/common/kernel/lts2021-chromium/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch deleted file mode 100644 index 73d67fbe75..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0006-Bluetooth-btusb-Add-reset-on-close-quirk-for-Intel-a.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 53c2b4387cacc0a5a065c54a6c14fdefdbd08231 Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Wed, 22 Sep 2021 12:14:52 +0530 -Subject: [PATCH] Bluetooth: btusb: Add reset on close quirk for Intel adapters - -Intel Bluetooth adapter is not exiting the loopback mode on bluetooth -socket closure. So, when bluetooth socket is opened again, bluetooth is -not working. - -As per Bluetooth core specification, bluetooth adapter should exit loop -back mode on hci reset. Add HCI quirk reset to make sure adapter exits -loopback mode on bluetooth socket closure. - -Tracked-On: OAM-96067 -Signed-off-by: Jeevaka Prabu Badrappan -Signed-off-by: Amrita Raju ---- - drivers/bluetooth/btusb.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index e34599fef79c..b8bce1e3b875 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -3758,6 +3758,7 @@ static int btusb_probe(struct usb_interface *intf, - hdev->send = btusb_send_frame_intel; - hdev->cmd_timeout = btusb_intel_cmd_timeout; - -+ reset = false; - if (id->driver_info & BTUSB_INTEL_NO_WBS_SUPPORT) - btintel_set_flag(hdev, INTEL_ROM_LEGACY_NO_WBS_SUPPORT); - --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0007-9p-freezing-aborts-when-use-wait_event_killable.patch b/bsp_diff/common/kernel/lts2021-chromium/0007-9p-freezing-aborts-when-use-wait_event_killable.patch deleted file mode 100644 index c6d4ea43bc..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0007-9p-freezing-aborts-when-use-wait_event_killable.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6ecbfb01039ccd03ca25995dbbf7c45ef5376aeb Mon Sep 17 00:00:00 2001 -From: Kaushlendra Kumar -Date: Tue, 6 Oct 2020 14:46:37 +0530 -Subject: [PATCH] 9p: freezing aborts when use wait_event_killable() - -Freezing of process abort when a client is waiting uninterruptibly -for a response. This happens when system is entering to suspend and -trying to freeze all the processes and at that moment freezing aborts -which leads to suspend failure. So instead of wait_event_killable() -use wait_event_freezable() - -Signed-off-by: Kaushlendra Kumar ---- - net/9p/client.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/9p/client.c b/net/9p/client.c -index 565aee6dfcc6..ad431910bb8a 100644 ---- a/net/9p/client.c -+++ b/net/9p/client.c -@@ -11,6 +11,7 @@ - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - - #include -+#include - #include - #include - #include -@@ -752,7 +753,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) - } - again: - /* Wait for the response */ -- err = wait_event_killable(req->wq, req->status >= REQ_STATUS_RCVD); -+ err = wait_event_freezable(req->wq, req->status >= REQ_STATUS_RCVD); - - /* Make sure our req is coherent with regard to updates in other - * threads - echoes to wmb() in the callback --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch b/bsp_diff/common/kernel/lts2021-chromium/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch deleted file mode 100644 index ece7fa3c94..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0008-iwlwifi-Vendor-command-support-in-iwlwifi-driver.patch +++ /dev/null @@ -1,338 +0,0 @@ -From 6820ee7377ad84f6e5ed4c9207c31dde29b3d0c7 Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Fri, 25 Sep 2020 09:30:40 +0530 -Subject: [PATCH] iwlwifi: Vendor command support in iwlwifi driver - -Adding vendor command support for querying driver & firmware -version. - -Tracked-On: OAM-94267 -Signed-off-by: Jeevaka Prabu Badrappan -Signed-off-by: Amrita Raju ---- - .../wireless/intel/iwlwifi/iwl-vendor-cmd.h | 96 +++++++++++ - .../net/wireless/intel/iwlwifi/mvm/Makefile | 1 + - .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 2 + - drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 2 + - .../wireless/intel/iwlwifi/mvm/vendor-cmd.c | 161 ++++++++++++++++++ - 5 files changed, 262 insertions(+) - create mode 100644 drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h - create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c - -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h b/drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h -new file mode 100644 -index 000000000000..554d706d9b26 ---- /dev/null -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-vendor-cmd.h -@@ -0,0 +1,96 @@ -+/****************************************************************************** -+ * -+ * This file is provided under a dual BSD/GPLv2 license. When using or -+ * redistributing this file, you may do so under either license. -+ * -+ * GPL LICENSE SUMMARY -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * The full GNU General Public License is included in this distribution -+ * in the file called COPYING. -+ * -+ * Contact Information: -+ * Intel Linux Wireless -+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 -+ * -+ * BSD LICENSE -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * -+ * * Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * * Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in -+ * the documentation and/or other materials provided with the -+ * distribution. -+ * * Neither the name Intel Corporation nor the names of its -+ * contributors may be used to endorse or promote products derived -+ * from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ *****************************************************************************/ -+#ifndef __VENDOR_CMD_H__ -+#define __VENDOR_CMD_H__ -+ -+#define INTEL_OUI 0x001735 -+ -+/** -+ * enum iwl_mvm_vendor_cmd - supported vendor commands -+ * @IWL_MVM_VENDOR_CMD_GET_FW_VERSION: -+ * @IWL_MVM_VENDOR_CMD_GET_DRV_VERSION: -+ */ -+ -+enum iwl_mvm_vendor_cmd { -+ IWL_MVM_VENDOR_CMD_GET_FW_VERSION = 0x00, -+ IWL_MVM_VENDOR_CMD_GET_DRV_VERSION = 0x01, -+}; -+ -+/** -+ * enum iwl_mvm_vendor_attr - attributes used in vendor commands -+ * @__IWL_MVM_VENDOR_ATTR_INVALID: attribute 0 is invalid -+ * @IWL_MVM_VENDOR_ATTR_DRV_VER: string attribute -+ * @IWL_MVM_VENDOR_ATTR_FW_VER: string attribute -+ * @NUM_IWL_MVM_VENDOR_ATTR: number of vendor attributes -+ * @MAX_IWL_MVM_VENDOR_ATTR: highest vendor attribute number -+ */ -+enum iwl_mvm_vendor_attr { -+ __IWL_MVM_VENDOR_ATTR_INVALID, -+ IWL_MVM_VENDOR_ATTR_FW_VER, -+ IWL_MVM_VENDOR_ATTR_DRV_VER, -+ -+ NUM_IWL_MVM_VENDOR_ATTR, -+ MAX_IWL_MVM_VENDOR_ATTR = NUM_IWL_MVM_VENDOR_ATTR - 1, -+}; -+#endif /* __VENDOR_CMD_H__ */ -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile -index 75fc2d935e5d..26cba9be28eb 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile -@@ -9,6 +9,7 @@ iwlmvm-y += ftm-responder.o ftm-initiator.o - iwlmvm-y += rfi.o - iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS) += debugfs.o debugfs-vif.o - iwlmvm-$(CONFIG_IWLWIFI_LEDS) += led.o -+iwlmvm-y += vendor-cmd.o - iwlmvm-$(CONFIG_PM) += d3.o - - ccflags-y += -I $(srctree)/$(src)/../ -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -index 56c7a68a6491..8bbb40132918 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -@@ -719,6 +719,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) - hw->wiphy->available_antennas_tx = iwl_mvm_get_valid_tx_ant(mvm); - hw->wiphy->available_antennas_rx = iwl_mvm_get_valid_rx_ant(mvm); - -+ iwl_mvm_set_wiphy_vendor_commands(hw->wiphy); -+ - ret = ieee80211_register_hw(mvm->hw); - if (ret) { - iwl_mvm_leds_exit(mvm); -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -index 46af8dd2dc93..033f0c0ac599 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -@@ -27,6 +27,7 @@ - #include "sta.h" - #include "fw-api.h" - #include "constants.h" -+#include "iwl-vendor-cmd.h" - #include "fw/runtime.h" - #include "fw/dbg.h" - #include "fw/acpi.h" -@@ -2021,6 +2022,7 @@ struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm); - struct ieee80211_vif *iwl_mvm_get_vif_by_macid(struct iwl_mvm *mvm, u32 macid); - bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm); - -+void iwl_mvm_set_wiphy_vendor_commands(struct wiphy *wiphy); - #define MVM_TCM_PERIOD_MSEC 500 - #define MVM_TCM_PERIOD (HZ * MVM_TCM_PERIOD_MSEC / 1000) - #define MVM_LL_PERIOD (10 * HZ) -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c b/drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c -new file mode 100644 -index 000000000000..8e884e5831a8 ---- /dev/null -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c -@@ -0,0 +1,161 @@ -+/****************************************************************************** -+ * -+ * This file is provided under a dual BSD/GPLv2 license. When using or -+ * redistributing this file, you may do so under either license. -+ * -+ * GPL LICENSE SUMMARY -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * Copyright (C) 2019 Intel Corporation -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * The full GNU General Public License is included in this distribution -+ * in the file called COPYING. -+ * -+ * Contact Information: -+ * Intel Linux Wireless -+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 -+ * -+ * BSD LICENSE -+ * -+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. -+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH -+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -+ * Copyright(c) 2018 Intel Corporation -+ * Copyright (C) 2019 Intel Corporation -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * -+ * * Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * * Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in -+ * the documentation and/or other materials provided with the -+ * distribution. -+ * * Neither the name Intel Corporation nor the names of its -+ * contributors may be used to endorse or promote products derived -+ * from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ *****************************************************************************/ -+#include -+#include -+#include -+#include -+#include -+#include "mvm.h" -+ -+#include "iwl-vendor-cmd.h" -+ -+#include "iwl-io.h" -+#include "iwl-prph.h" -+ -+static const struct nla_policy -+iwl_mvm_vendor_attr_policy[NUM_IWL_MVM_VENDOR_ATTR] = { -+ [IWL_MVM_VENDOR_ATTR_FW_VER] = { .type = NLA_STRING, .len = 50 }, -+ [IWL_MVM_VENDOR_ATTR_DRV_VER] = { .type = NLA_STRING, .len = 50 }, -+}; -+ -+static int iwl_mvm_vendor_get_fw_version(struct wiphy *wiphy, -+ struct wireless_dev *wdev, -+ const void *data, int data_len) -+{ -+ int err = 0; -+ struct sk_buff *skb; -+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); -+ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); -+ const struct iwl_fw *fw = mvm->fw; -+ -+ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(fw->fw_version)); -+ if (!skb) -+ return -ENOMEM; -+ if (nla_put_string(skb, IWL_MVM_VENDOR_ATTR_FW_VER, fw->fw_version)) { -+ kfree_skb(skb); -+ return -ENOBUFS; -+ } -+ -+ return cfg80211_vendor_cmd_reply(skb); -+} -+ -+static int iwl_mvm_vendor_get_drv_version(struct wiphy *wiphy, -+ struct wireless_dev *wdev, -+ const void *data, int data_len) -+{ -+ int err = 0; -+ struct sk_buff *skb; -+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); -+ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); -+ const struct iwl_fw *fw = mvm->fw; -+ -+ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(utsname()->release)); -+ if (!skb) -+ return -ENOMEM; -+ if (nla_put_string(skb, IWL_MVM_VENDOR_ATTR_DRV_VER, utsname()->release)) { -+ kfree_skb(skb); -+ return -ENOBUFS; -+ } -+ -+ return cfg80211_vendor_cmd_reply(skb); -+} -+ -+static const struct wiphy_vendor_command iwl_mvm_vendor_commands[] = { -+ { -+ .info = { -+ .vendor_id = INTEL_OUI, -+ .subcmd = IWL_MVM_VENDOR_CMD_GET_FW_VERSION, -+ }, -+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV | -+ WIPHY_VENDOR_CMD_NEED_RUNNING, -+ .doit = iwl_mvm_vendor_get_fw_version, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ .policy = iwl_mvm_vendor_attr_policy, -+ .maxattr = MAX_IWL_MVM_VENDOR_ATTR, -+#endif -+ }, -+ { -+ .info = { -+ .vendor_id = INTEL_OUI, -+ .subcmd = IWL_MVM_VENDOR_CMD_GET_DRV_VERSION, -+ }, -+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV | -+ WIPHY_VENDOR_CMD_NEED_RUNNING, -+ .doit = iwl_mvm_vendor_get_drv_version, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ .policy = iwl_mvm_vendor_attr_policy, -+ .maxattr = MAX_IWL_MVM_VENDOR_ATTR, -+#endif -+ }, -+}; -+ -+void iwl_mvm_set_wiphy_vendor_commands(struct wiphy *wiphy) -+{ -+ wiphy->vendor_commands = iwl_mvm_vendor_commands; -+ wiphy->n_vendor_commands = ARRAY_SIZE(iwl_mvm_vendor_commands); -+ wiphy->vendor_events = NULL;; -+ wiphy->n_vendor_events = 0; -+} --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch b/bsp_diff/common/kernel/lts2021-chromium/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch deleted file mode 100644 index 72a47ea56f..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0009-x86-relocs-Ignore-L4_PAGE_OFFSET-relocations.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ce5509c00b04353f8da7275f86c244d20eb39e3d Mon Sep 17 00:00:00 2001 -From: Sami Tolvanen -Date: Tue, 29 Dec 2020 12:48:52 +0530 -Subject: [PATCH] x86, relocs: Ignore L4_PAGE_OFFSET relocations - -L4_PAGE_OFFSET is a constant value, so don't warn about absolute -relocations. - -Tracked-On: OAM-95581 -Signed-off-by: Sami Tolvanen -Signed-off-by: Jeevaka Prabu Badrappan ---- - arch/x86/tools/relocs.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c -index 5304a6037924..88bb7c4e8ae4 100644 ---- a/arch/x86/tools/relocs.c -+++ b/arch/x86/tools/relocs.c -@@ -50,6 +50,7 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = { - [S_ABS] = - "^(xen_irq_disable_direct_reloc$|" - "xen_save_fl_direct_reloc$|" -+ "L4_PAGE_OFFSET|" - "VDSO|" - "__typeid__|" - "__crc_)", --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0010-drm-i915-replace-cond_resched-with-usleep_range-to-a.patch b/bsp_diff/common/kernel/lts2021-chromium/0010-drm-i915-replace-cond_resched-with-usleep_range-to-a.patch deleted file mode 100644 index 86101d1239..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0010-drm-i915-replace-cond_resched-with-usleep_range-to-a.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 06bae6fb02edcd6ecba247f71979370712045c33 Mon Sep 17 00:00:00 2001 -From: feijiang1 -Date: Thu, 25 Mar 2021 00:09:15 +0800 -Subject: [PATCH] drm/i915: replace cond_resched with usleep_range to avoid - dead lock - -Found the deadlock issue most likely caused by thread scheduling, the -problem is like: -1, thread a call i915_active_acquire_barrier function, and will call -take_preallocated_barriers which is used to delete all list nodes with -llist_del_all -2, hw irq is raised up, thread a is scheduled out -3, thread b seems has higher priority and is scheduled in, -i915_gem_do_execbuffer->i915_active_acquire_preallocate_barrier function -is called, there is following code: -while (!llist_empty(&ref->preallocated_barriers)) - cond_resched(); -ref->preallocated_barriers is not empty, then will call cond_resched. -While due to CONFIG_PREEMPT is defined, cond_resched is defined as -"return 0;" It means thread b will busy wait and will not relinquish -CPU. From log, we didn't see thread a get chance to be scheduled in. -The result is thread b is busy waiting on ref->preallocated_barriers, -dead-lock happened. At end, when rcu_cpu_stall_timeout is reached, rcu -stall is detected and pop up the kernel error. -Fix this issue by replacing cond_resched with usleep_range, to let -thread b relinquished CPU on its own. - -Signed-off-by: feijiang1 ---- - drivers/gpu/drm/i915/i915_active.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c -index ee2b3a375362..9f6fda6c7c71 100644 ---- a/drivers/gpu/drm/i915/i915_active.c -+++ b/drivers/gpu/drm/i915/i915_active.c -@@ -5,6 +5,7 @@ - */ - - #include -+#include - - #include "gt/intel_context.h" - #include "gt/intel_engine_heartbeat.h" -@@ -864,7 +865,8 @@ int i915_active_acquire_preallocate_barrier(struct i915_active *ref, - - /* Wait until the previous preallocation is completed */ - while (!llist_empty(&ref->preallocated_barriers)) -- cond_resched(); -+ //cond_resched(); -+ usleep_range(10, 50); - - /* - * Preallocate a node for each physical engine supporting the target --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0011-Prebuilts-tar-doesnot-support-I-option.-So-replaced-.patch b/bsp_diff/common/kernel/lts2021-chromium/0011-Prebuilts-tar-doesnot-support-I-option.-So-replaced-.patch deleted file mode 100644 index 9838a82db1..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0011-Prebuilts-tar-doesnot-support-I-option.-So-replaced-.patch +++ /dev/null @@ -1,30 +0,0 @@ -From cee6603c03d449c67936b1539172aa89de5963e1 Mon Sep 17 00:00:00 2001 -From: yaravapa -Date: Wed, 17 Feb 2021 12:38:36 +0530 -Subject: [PATCH] Prebuilts tar doesnot support -I option. So replaced with -J - option - -Tracked-On: OAM-95316 -Signed-off-by: yaravapa ---- - kernel/gen_kheaders.sh | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh -index e01531ed94a9..b90149ccc0b9 100755 ---- a/kernel/gen_kheaders.sh -+++ b/kernel/gen_kheaders.sh -@@ -82,8 +82,8 @@ find $cpio_dir -type f -print0 | - - # Create archive and try to normalize metadata for reproducibility. - tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \ -- --owner=0 --group=0 --sort=name --numeric-owner --mode=u=rw,go=r,a+X \ -- -I $XZ -cf $tarfile -C $cpio_dir/ . > /dev/null -+ --owner=0 --group=0 --numeric-owner --mode=u=rw,go=r,a+X \ -+ -J -cf $tarfile -C $cpio_dir/ . > /dev/null - - echo $headers_md5 > kernel/kheaders.md5 - echo "$this_file_md5" >> kernel/kheaders.md5 --- -2.34.1 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch b/bsp_diff/common/kernel/lts2021-chromium/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch deleted file mode 100644 index 4f5d7ab1f2..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0012-Fix-for-btusb_sco_snd_card-not-getting-probed.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 2c96c3d439ba57b42dff30e7bda6da9ad08b246b Mon Sep 17 00:00:00 2001 -From: Aiswarya Cyriac -Date: Wed, 22 Sep 2021 12:28:00 +0530 -Subject: [PATCH] Fix for btusb_sco_snd_card not getting probed - -Tracked-On: OAM-99194 -Signed-off-by: Aiswarya Cyriac -Signed-off-by: rajucm ---- - drivers/bluetooth/btusb.c | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index b8bce1e3b875..91f15183e35e 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -3821,16 +3821,15 @@ static int btusb_probe(struct usb_interface *intf, - if (id->driver_info & BTUSB_AMP) { - /* AMP controllers do not support SCO packets */ - data->isoc = NULL; -+#if (!IS_ENABLED(CONFIG_BT_SCOHCI)) - } else { - /* Interface orders are hardcoded in the specification */ - data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1); - data->isoc_ifnum = ifnum_base + 1; - hdev->wbs_pkt_len = - hci_packet_size_usb_alt[btusb_find_altsetting(data, 6) ? -- 6 : -- btusb_find_altsetting(data, 3) ? -- 3 : -- 1]; -+ 6 : btusb_find_altsetting(data, 3) ? 3 :1]; -+#endif - } - - if (IS_ENABLED(CONFIG_BT_HCIBTUSB_RTL) && --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0014-drm-i915-Sysfs-interface-to-get-GFX-shmem-usage.patch b/bsp_diff/common/kernel/lts2021-chromium/0014-drm-i915-Sysfs-interface-to-get-GFX-shmem-usage.patch deleted file mode 100644 index f49005e390..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0014-drm-i915-Sysfs-interface-to-get-GFX-shmem-usage.patch +++ /dev/null @@ -1,1800 +0,0 @@ -From 77c9dedf2d1c41adcc68158fb7610ba8fb4667d9 Mon Sep 17 00:00:00 2001 -From: HeYue -Date: Mon, 6 Sep 2021 13:42:44 +0800 -Subject: [PATCH] drm/i915: Sysfs interface to get GFX shmem usage - -There is a requirement of a new interface for achieving below -functionalities: - -Need to provide Client based detailed information about the -distribution of Graphics memory -Need to provide an interface which can provide info about the -sharing of Graphics buffers between the clients. -The client based interface would also aid in debugging of -memory usage/consumption by each client & debug memleak -related issues. - -With this new interface, - -In case of memleak scenarios, we can easily zero in on the -culprit client which is unexpectedly holding on the Graphics -buffers for an inordinate amount of time. -We can get an estimate of the instantaneous memory footprint -of every Graphics client. -We can now trace all the processes sharing a particular -Graphics buffer. -By means of this patch we try to provide a sysfs interface -to achieve the mentioned functionalities. - -There are two files created in sysfs: -'i915_gem_meminfo' will provide summary of the graphics -resources used by each graphics client. -'i915_gem_objinfo' will provide detailed view of each object -created by individual clients. - -Rebased for kernel v4.19 1A (Fan Yugang) - -Removes unuseful shmem_inode_info->info_lock per Jeremy's optimization. -Removes unuseful object info for each pid for performance optimization. -Adds CONFIG_DRM_I915_MEMTRACK which depends on -CONFIG_DRM_I915_CAPTURE_ERROR to pass kernel config test. - -Rebased for kernel v5.4 (He, Yue) (Wan, Shuang) - -Rebased for kernel v5.10 (He, Yue) - -Rebased for kernel v5.15.74 (rajucm) - -Tracked-On: OAM-99250 -Change-Id: Ib89cd2eaf6e1fc61311b43ebe54dbdc78554821b -Signed-off-by: Sourab Gupta sourab.gupta@intel.com -Sgined-off-by: Deepak S deepak.s@intel.com -Signed-off-by: Hu Beiyuan beiyuan.hu@intel.com -Signed-off-by: Mingwei Wang mingwei.wang@intel.com -Signed-off-by: Harish Krupo harish.krupo.kps@intel.com -Signed-off-by: Jeremy Compostella jeremy.compostella@intel.com -Signed-off-by: Yugang Fan yugang.fan@intel.com -Signed-off-by: Wan Shuang -Signed-off-by: HeYue -Signed-off-by: rajucm ---- - drivers/gpu/drm/drm_file.c | 4 + - drivers/gpu/drm/drm_internal.h | 8 + - drivers/gpu/drm/i915/Kconfig | 10 + - drivers/gpu/drm/i915/gem/i915_gem_mman.c | 15 + - drivers/gpu/drm/i915/gem/i915_gem_object.c | 32 + - drivers/gpu/drm/i915/gem/i915_gem_object.h | 1 + - .../gpu/drm/i915/gem/i915_gem_object_types.h | 6 + - drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 21 + - drivers/gpu/drm/i915/i915_driver.c | 13 + - drivers/gpu/drm/i915/i915_drv.h | 21 + - drivers/gpu/drm/i915/i915_file_private.h | 8 +- - drivers/gpu/drm/i915/i915_gem.c | 883 +++++++++++++++++- - drivers/gpu/drm/i915/i915_gpu_error.c | 37 +- - drivers/gpu/drm/i915/i915_gpu_error.h | 10 + - drivers/gpu/drm/i915/i915_sysfs.c | 325 ++++++- - drivers/gpu/drm/i915/i915_sysfs.h | 7 + - 16 files changed, 1392 insertions(+), 9 deletions(-) - -diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c -index b43e3074c8ed..11565560d4d3 100644 ---- a/drivers/gpu/drm/drm_file.c -+++ b/drivers/gpu/drm/drm_file.c -@@ -52,6 +52,10 @@ - /* from BKL pushdown */ - DEFINE_MUTEX(drm_global_mutex); - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+EXPORT_SYMBOL(drm_global_mutex); -+#endif -+ - bool drm_dev_needs_global_mutex(struct drm_device *dev) - { - /* -diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h -index 5ea5e260118c..ad3aef895f21 100644 ---- a/drivers/gpu/drm/drm_internal.h -+++ b/drivers/gpu/drm/drm_internal.h -@@ -76,8 +76,16 @@ void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv); - void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv); - void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, - uint32_t handle); -+void drm_prime_remove_buf_handle_locked( -+ struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf); - - /* drm_drv.c */ -+ -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+#define DRM_MAGIC_HASH_ORDER \ -+ 4 /**< Size of key hash table. Must be power of 2. */ -+#endif -+ - struct drm_minor *drm_minor_acquire(unsigned int minor_id); - void drm_minor_release(struct drm_minor *minor); - -diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig -index 1eeff82621d4..dd23b285dbf7 100644 ---- a/drivers/gpu/drm/i915/Kconfig -+++ b/drivers/gpu/drm/i915/Kconfig -@@ -96,6 +96,16 @@ config DRM_I915_COMPRESS_ERROR - - If in doubt, say "Y". - -+config DRM_I915_MEMTRACK -+ bool "Enable shmem usage status track" -+ depends on DRM_I915_CAPTURE_ERROR -+ default y -+ help -+ This option enables shmem usage status track of system summary and -+ each process. -+ -+ If in doubt, say "N". -+ - config DRM_I915_USERPTR - bool "Always enable userptr support" - depends on DRM_I915 -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c -index 6ac3e41bbbd9..3cf0fb07c45c 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c -+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c -@@ -65,6 +65,9 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, - struct drm_i915_gem_mmap *args = data; - struct drm_i915_gem_object *obj; - unsigned long addr; -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ int ret; -+#endif - - /* - * mmap ioctl is disallowed for all discrete platforms, -@@ -122,6 +125,12 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, - } - i915_gem_object_put(obj); - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ ret = i915_obj_insert_virt_addr(obj, addr, false, false); -+ if (ret) -+ return ret; -+#endif -+ - args->addr_ptr = (u64)addr; - return 0; - -@@ -440,6 +449,12 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf) - - /* Finally, remap it using the new GTT offset */ - ret = remap_io_mapping(area, start, pfn, end - start, &ggtt->iomap); -+ -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ ret = i915_obj_insert_virt_addr(obj, (unsigned long)area->vm_start, -+ true, true); -+#endif -+ - if (ret) - goto err_fence; - -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c -index a40bc17acead..c58d7359e81e 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_object.c -+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c -@@ -93,6 +93,14 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj, - obj->mm.madv = I915_MADV_WILLNEED; - INIT_RADIX_TREE(&obj->mm.get_page.radix, GFP_KERNEL | __GFP_NOWARN); - mutex_init(&obj->mm.get_page.lock); -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ /* -+ * Mark the object as not having backing pages, as no allocation -+ * for it yet -+ */ -+ obj->has_backing_pages = 0; -+ INIT_LIST_HEAD(&obj->pid_info); -+#endif - INIT_RADIX_TREE(&obj->mm.get_dma_page.radix, GFP_KERNEL | __GFP_NOWARN); - mutex_init(&obj->mm.get_dma_page.lock); - } -@@ -165,6 +173,16 @@ bool i915_gem_object_can_bypass_llc(struct drm_i915_gem_object *obj) - return IS_JSL_EHL(i915); - } - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+static int i915_gem_open_object(struct drm_gem_object *gem_obj, -+ struct drm_file *file_priv) -+{ -+ struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); -+ -+ return i915_gem_obj_insert_pid(obj); -+} -+#endif -+ - static void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file) - { - struct drm_i915_gem_object *obj = to_intel_bo(gem); -@@ -305,6 +323,17 @@ void __i915_gem_free_object(struct drm_i915_gem_object *obj) - if (obj->base.import_attach) - drm_prime_gem_destroy(&obj->base, NULL); - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ if (!obj->stolen && (obj->has_backing_pages == 1)) { -+ struct drm_i915_private *dev_priv = -+ to_i915(obj->base.dev); -+ -+ dev_priv->mm.phys_mem_total -= obj->base.size; -+ obj->has_backing_pages = 0; -+ } -+ i915_gem_obj_remove_all_pids(obj); -+#endif -+ - drm_gem_free_mmap_offset(&obj->base); - - if (obj->ops->release) -@@ -796,6 +825,9 @@ int __init i915_objects_module_init(void) - } - - static const struct drm_gem_object_funcs i915_gem_object_funcs = { -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ .open = i915_gem_open_object, -+#endif - .free = i915_gem_free_object, - .close = i915_gem_close_object, - .export = i915_gem_prime_export, -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h -index 2c2be479acc1..33d5db081a29 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_object.h -+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h -@@ -84,6 +84,7 @@ int i915_gem_object_pread_phys(struct drm_i915_gem_object *obj, - const struct drm_i915_gem_pread *args); - - int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align); -+ - void i915_gem_object_put_pages_shmem(struct drm_i915_gem_object *obj, - struct sg_table *pages); - void i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj, -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h -index 1d0d8ee9d707..1784d079627d 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h -+++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h -@@ -490,6 +490,9 @@ struct drm_i915_gem_object { - * critical, i.e userspace is free to race against itself. - */ - unsigned int cache_dirty:1; -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ unsigned int has_backing_pages : 1; -+#endif - - /* @is_dpt: Object houses a display page table (DPT) */ - unsigned int is_dpt:1; -@@ -664,6 +667,9 @@ struct drm_i915_gem_object { - - void *gvt_info; - }; -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ struct list_head pid_info; -+#endif - }; - - static inline struct drm_i915_gem_object * -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c -index d187331d287a..9cd4572e9dc9 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c -+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c -@@ -247,6 +247,15 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj) - if (i915_gem_object_can_bypass_llc(obj)) - obj->cache_dirty = true; - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ if (obj->has_backing_pages == 0) { -+ struct drm_i915_private *dev_priv = to_i915(obj->base.dev); -+ -+ dev_priv->mm.phys_mem_total += obj->base.size; -+ obj->has_backing_pages = 1; -+ } -+#endif -+ - __i915_gem_object_set_pages(obj, st, i915_sg_dma_sizes(st->sgl)); - - return 0; -@@ -283,6 +292,18 @@ shmem_truncate(struct drm_i915_gem_object *obj) - shmem_truncate_range(file_inode(obj->base.filp), 0, (loff_t)-1); - obj->mm.madv = __I915_MADV_PURGED; - obj->mm.pages = ERR_PTR(-EFAULT); -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ /* -+ * Mark the object as not having backing pages, as physical space -+ * returned back to kernel -+ */ -+ if (obj->has_backing_pages == 1) { -+ struct drm_i915_private *dev_priv = to_i915(obj->base.dev); -+ -+ dev_priv->mm.phys_mem_total -= obj->base.size; -+ obj->has_backing_pages = 0; -+ } -+#endif - - return 0; - } -diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c -index c5d9ddf3c512..6540fbe24ead 100644 ---- a/drivers/gpu/drm/i915/i915_driver.c -+++ b/drivers/gpu/drm/i915/i915_driver.c -@@ -39,6 +39,10 @@ - #include - #include - #include -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+#include -+#endif -+ - - #include - #include -@@ -1078,6 +1082,15 @@ static void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) - i915_gem_context_close(file); - i915_drm_client_put(file_priv->client); - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ i915_gem_remove_sysfs_file_entry(dev, file); -+ put_pid(file_priv->tgid); -+#endif -+ -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ kfree(file_priv->process_name); -+#endif -+ - kfree_rcu(file_priv, rcu); - - /* Catch up with all the deferred frees from "this" client */ -diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h -index c66d1d1acd60..c7a8ba58dc88 100644 ---- a/drivers/gpu/drm/i915/i915_drv.h -+++ b/drivers/gpu/drm/i915/i915_drv.h -@@ -161,6 +161,10 @@ struct i915_gem_mm { - /* shrinker accounting, also useful for userland debugging */ - u64 shrink_memory; - u32 shrink_count; -+ -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ size_t phys_mem_total; -+#endif - }; - - #define I915_IDLE_ENGINES_TIMEOUT (200) /* in ms */ -@@ -263,6 +267,10 @@ struct drm_i915_private { - - bool preserve_bios_swizzle; - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ struct kobject memtrack_kobj; -+ bool mmtkobj_initialized; -+#endif - unsigned int fsb_freq, mem_freq, is_ddr3; - unsigned int skl_preferred_vco_freq; - -@@ -986,6 +994,19 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915, - - #define HAS_ONE_EU_PER_FUSE_BIT(i915) (INTEL_INFO(i915)->has_one_eu_per_fuse_bit) - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+int i915_get_pid_cmdline(struct task_struct *task, char *buffer); -+int i915_gem_obj_insert_pid(struct drm_i915_gem_object *obj); -+void i915_gem_obj_remove_all_pids(struct drm_i915_gem_object *obj); -+int i915_obj_insert_virt_addr(struct drm_i915_gem_object *obj, -+ unsigned long addr, bool is_map_gtt, -+ bool is_mutex_locked); -+int i915_get_drm_clients_info(struct drm_i915_error_state_buf *m, -+ struct drm_device *dev); -+int i915_gem_get_obj_info(struct drm_i915_error_state_buf *m, -+ struct drm_device *dev, struct pid *tgid); -+#endif -+ - /* intel_device_info.c */ - static inline struct intel_device_info * - mkwrite_device_info(struct drm_i915_private *dev_priv) -diff --git a/drivers/gpu/drm/i915/i915_file_private.h b/drivers/gpu/drm/i915/i915_file_private.h -index f42877869692..2c5010c7ae26 100644 ---- a/drivers/gpu/drm/i915/i915_file_private.h -+++ b/drivers/gpu/drm/i915/i915_file_private.h -@@ -22,6 +22,10 @@ struct drm_i915_file_private { - struct rcu_head rcu; - }; - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ char *process_name; -+ struct pid *tgid; -+#endif - /** @proto_context_lock: Guards all struct i915_gem_proto_context - * operations - * -@@ -88,7 +92,9 @@ struct drm_i915_file_private { - struct xarray vm_xa; - - unsigned int bsd_engine; -- -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ struct bin_attribute *obj_attr; -+#endif - /* - * Every context ban increments per client ban score. Also - * hangs in short succession increments ban score. If ban threshold -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index 728d536062dc..58e00a3762f4 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -39,6 +39,13 @@ - #include - #include - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+#include -+#include -+#include -+#include "../drm_internal.h" -+#endif -+ - #include "display/intel_display.h" - #include "display/intel_frontbuffer.h" - -@@ -58,10 +65,830 @@ - #include "i915_file_private.h" - #include "i915_trace.h" - #include "i915_vgpu.h" -+#include "i915_sysfs.h" -+ - #include "intel_pm.h" - --static int --insert_mappable_node(struct i915_ggtt *ggtt, struct drm_mm_node *node, u32 size) -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+struct per_file_obj_mem_info { -+ int num_obj; -+ int num_obj_shared; -+ int num_obj_private; -+ int num_obj_gtt_bound; -+ int num_obj_purged; -+ int num_obj_purgeable; -+ int num_obj_allocated; -+ int num_obj_fault_mappable; -+ int num_obj_stolen; -+ size_t gtt_space_allocated_shared; -+ size_t gtt_space_allocated_priv; -+ size_t phys_space_allocated_shared; -+ size_t phys_space_allocated_priv; -+ size_t phys_space_purgeable; -+ size_t phys_space_shared_proportion; -+ size_t fault_mappable_size; -+ size_t stolen_space_allocated; -+ char *process_name; -+}; -+ -+struct name_entry { -+ struct list_head head; -+ struct drm_hash_item hash_item; -+}; -+ -+struct pid_stat_entry { -+ struct list_head head; -+ struct list_head namefree; -+ struct drm_open_hash namelist; -+ struct per_file_obj_mem_info stats; -+ struct pid *tgid; -+ int pid_num; -+}; -+ -+struct drm_i915_obj_virt_addr { -+ struct list_head head; -+ unsigned long user_virt_addr; -+}; -+ -+struct drm_i915_obj_pid_info { -+ struct list_head head; -+ pid_t tgid; -+ int open_handle_count; -+ struct list_head virt_addr_head; -+}; -+ -+struct get_obj_stats_buf { -+ struct pid_stat_entry *entry; -+ struct drm_i915_error_state_buf *m; -+}; -+ -+#define err_printf(e, ...) i915_error_printf(e, __VA_ARGS__) -+#define err_puts(e, s) i915_error_puts(e, s) -+ -+static const char *get_tiling_flag(struct drm_i915_gem_object *obj) -+{ -+ switch (i915_gem_object_get_tiling(obj)) { -+ default: -+ case I915_TILING_NONE: -+ return " "; -+ case I915_TILING_X: -+ return "X"; -+ case I915_TILING_Y: -+ return "Y"; -+ } -+} -+ -+/* -+ * If this mmput call is the last one, it will tear down the mmaps of the -+ * process and calls drm_gem_vm_close(), which leads deadlock on i915 mutex. -+ * Instead, asynchronously schedule mmput function here, to avoid recursive -+ * calls to acquire i915_mutex. -+ */ -+static void async_mmput_func(void *data, async_cookie_t cookie) -+{ -+ struct mm_struct *mm = data; -+ mmput(mm); -+} -+ -+static void async_mmput(struct mm_struct *mm) -+{ -+ async_schedule(async_mmput_func, mm); -+} -+ -+int i915_get_pid_cmdline(struct task_struct *task, char *buffer) -+{ -+ int res = 0; -+ unsigned int len; -+ struct mm_struct *mm = get_task_mm(task); -+ -+ if (!mm) -+ goto out; -+ if (!mm->arg_end) -+ goto out_mm; -+ -+ len = mm->arg_end - mm->arg_start; -+ -+ if (len > PAGE_SIZE) -+ len = PAGE_SIZE; -+ -+ res = access_process_vm(task, mm->arg_start, buffer, len, 0); -+ if (res < 0) { -+ async_mmput(mm); -+ return res; -+ } -+ -+ if (res > 0 && buffer[res - 1] != '\0' && len < PAGE_SIZE) -+ buffer[res - 1] = '\0'; -+out_mm: -+ async_mmput(mm); -+out: -+ return 0; -+} -+ -+static int i915_obj_get_shmem_pages_alloced(struct drm_i915_gem_object *obj) -+{ -+ if (obj->base.filp) { -+ struct inode *inode = file_inode(obj->base.filp); -+ -+ if (!inode) -+ return 0; -+ return inode->i_mapping->nrpages; -+ } -+ return 0; -+} -+ -+int i915_gem_obj_insert_pid(struct drm_i915_gem_object *obj) -+{ -+ int found = 0; -+ struct drm_i915_obj_pid_info *entry; -+ pid_t current_tgid = task_tgid_nr(current); -+ -+ mutex_lock(&obj->base.dev->struct_mutex); -+ -+ list_for_each_entry (entry, &obj->pid_info, head) { -+ if (entry->tgid == current_tgid) { -+ entry->open_handle_count++; -+ found = 1; -+ break; -+ } -+ } -+ if (found == 0) { -+ entry = kzalloc(sizeof(*entry), GFP_KERNEL); -+ if (entry == NULL) { -+ DRM_ERROR("alloc failed\n"); -+ mutex_unlock(&obj->base.dev->struct_mutex); -+ return -ENOMEM; -+ } -+ entry->tgid = current_tgid; -+ entry->open_handle_count = 1; -+ INIT_LIST_HEAD(&entry->virt_addr_head); -+ list_add_tail(&entry->head, &obj->pid_info); -+ } -+ -+ mutex_unlock(&obj->base.dev->struct_mutex); -+ return 0; -+} -+ -+void i915_gem_obj_remove_all_pids(struct drm_i915_gem_object *obj) -+{ -+ struct drm_i915_obj_pid_info *pid_entry, *pid_next; -+ struct drm_i915_obj_virt_addr *virt_entry, *virt_next; -+ -+ list_for_each_entry_safe (pid_entry, pid_next, &obj->pid_info, head) { -+ list_for_each_entry_safe (virt_entry, virt_next, -+ &pid_entry->virt_addr_head, head) { -+ list_del(&virt_entry->head); -+ kfree(virt_entry); -+ } -+ list_del(&pid_entry->head); -+ kfree(pid_entry); -+ } -+} -+ -+int i915_obj_insert_virt_addr(struct drm_i915_gem_object *obj, -+ unsigned long addr, bool is_map_gtt, -+ bool is_mutex_locked) -+{ -+ struct drm_i915_obj_pid_info *pid_entry; -+ pid_t current_tgid = task_tgid_nr(current); -+ int ret = 0, found = 0; -+ -+ if (is_map_gtt) -+ addr |= 1; -+ -+ if (!is_mutex_locked) { -+ ret = mutex_lock_interruptible(&obj->base.dev->struct_mutex); -+ if (ret) -+ return ret; -+ } -+ -+ list_for_each_entry (pid_entry, &obj->pid_info, head) { -+ if (pid_entry->tgid == current_tgid) { -+ struct drm_i915_obj_virt_addr *virt_entry, *new_entry; -+ -+ list_for_each_entry (virt_entry, -+ &pid_entry->virt_addr_head, head) { -+ if (virt_entry->user_virt_addr == addr) { -+ found = 1; -+ break; -+ } -+ } -+ if (found) -+ break; -+ new_entry = kzalloc(sizeof(*new_entry), GFP_KERNEL); -+ if (new_entry == NULL) { -+ DRM_ERROR("alloc failed\n"); -+ ret = -ENOMEM; -+ goto out; -+ } -+ new_entry->user_virt_addr = addr; -+ list_add_tail(&new_entry->head, -+ &pid_entry->virt_addr_head); -+ break; -+ } -+ } -+ -+out: -+ if (!is_mutex_locked) -+ mutex_unlock(&obj->base.dev->struct_mutex); -+ -+ return ret; -+} -+ -+static int i915_obj_virt_addr_is_invalid(struct drm_gem_object *obj, -+ struct pid *tgid, unsigned long addr) -+{ -+ struct task_struct *task; -+ struct mm_struct *mm; -+ struct vm_area_struct *vma; -+ int locked, ret = 0; -+ -+ task = get_pid_task(tgid, PIDTYPE_PID); -+ if (task == NULL) { -+ DRM_DEBUG("null task for tgid=%d\n", pid_nr(tgid)); -+ return -EINVAL; -+ } -+ -+ mm = get_task_mm(task); -+ if (mm == NULL) { -+ DRM_DEBUG("null mm for tgid=%d\n", pid_nr(tgid)); -+ ret = -EINVAL; -+ goto out_task; -+ } -+ -+ locked = down_read_trylock(&mm->mmap_lock); -+ if (!locked) -+ goto out_mm; -+ -+ vma = find_vma(mm, addr); -+ if (vma) { -+ if (addr & 1) { /* mmap_gtt case */ -+ if (vma->vm_pgoff * PAGE_SIZE == -+ (unsigned long)drm_vma_node_offset_addr( -+ &obj->vma_node)) -+ ret = 0; -+ else -+ ret = -EINVAL; -+ } else { /* mmap case */ -+ if (vma->vm_file == obj->filp) -+ ret = 0; -+ else -+ ret = -EINVAL; -+ } -+ } else -+ ret = -EINVAL; -+ -+ up_read(&mm->mmap_lock); -+ -+out_mm: -+ async_mmput(mm); -+out_task: -+ put_task_struct(task); -+ return ret; -+} -+ -+static void i915_obj_pidarray_validate(struct drm_gem_object *gem_obj) -+{ -+ struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); -+ struct drm_device *dev = gem_obj->dev; -+ struct drm_i915_obj_virt_addr *virt_entry, *virt_next; -+ struct drm_i915_obj_pid_info *pid_entry, *pid_next; -+ struct drm_file *file; -+ struct drm_i915_file_private *file_priv; -+ struct pid *tgid; -+ int pid_num, present; -+ -+ /* -+ * Run a sanity check on pid_array. All entries in pid_array should -+ * be subset of the the drm filelist pid entries. -+ */ -+ list_for_each_entry_safe (pid_entry, pid_next, &obj->pid_info, head) { -+ if (pid_next == NULL) { -+ DRM_ERROR( -+ "Invalid pid info. obj:%p, size:%zdK, tiling:%s, stolen:%s, name:%d, handle_count=%d\n", -+ &obj->base, obj->base.size / 1024, -+ get_tiling_flag(obj), obj->stolen ? "Y" : "N", -+ obj->base.name, obj->base.handle_count); -+ break; -+ } -+ -+ present = 0; -+ list_for_each_entry (file, &dev->filelist, lhead) { -+ file_priv = file->driver_priv; -+ tgid = file_priv->tgid; -+ pid_num = pid_nr(tgid); -+ -+ if (pid_num == pid_entry->tgid) { -+ present = 1; -+ break; -+ } -+ } -+ if (present == 0) { -+ DRM_DEBUG("stale_tgid=%d\n", pid_entry->tgid); -+ list_for_each_entry_safe (virt_entry, virt_next, -+ &pid_entry->virt_addr_head, -+ head) { -+ list_del(&virt_entry->head); -+ kfree(virt_entry); -+ } -+ list_del(&pid_entry->head); -+ kfree(pid_entry); -+ } else { -+ /* Validate the virtual address list */ -+ struct task_struct *task = -+ get_pid_task(tgid, PIDTYPE_PID); -+ if (task == NULL) -+ continue; -+ -+ list_for_each_entry_safe (virt_entry, virt_next, -+ &pid_entry->virt_addr_head, -+ head) { -+ if (i915_obj_virt_addr_is_invalid( -+ gem_obj, tgid, -+ virt_entry->user_virt_addr)) { -+ DRM_DEBUG("stale_addr=%ld\n", -+ virt_entry->user_virt_addr); -+ list_del(&virt_entry->head); -+ kfree(virt_entry); -+ } -+ } -+ put_task_struct(task); -+ } -+ } -+} -+ -+static int i915_obj_find_insert_in_hash(struct drm_i915_gem_object *obj, -+ struct pid_stat_entry *pid_entry, -+ bool *found) -+{ -+ struct drm_hash_item *hash_item; -+ int ret; -+ -+ ret = drm_ht_find_item(&pid_entry->namelist, (unsigned long)&obj->base, -+ &hash_item); -+ /* Not found, insert in hash */ -+ if (ret) { -+ struct name_entry *entry = kzalloc(sizeof(*entry), GFP_NOWAIT); -+ if (entry == NULL) { -+ DRM_ERROR("alloc failed\n"); -+ return -ENOMEM; -+ } -+ entry->hash_item.key = (unsigned long)&obj->base; -+ drm_ht_insert_item(&pid_entry->namelist, &entry->hash_item); -+ list_add_tail(&entry->head, &pid_entry->namefree); -+ *found = false; -+ } else -+ *found = true; -+ -+ return 0; -+} -+ -+static int i915_obj_shared_count(struct drm_i915_gem_object *obj, -+ struct pid_stat_entry *pid_entry, -+ bool *discard) -+{ -+ struct drm_i915_obj_pid_info *pid_info_entry; -+ int ret, obj_shared_count = 0; -+ -+ /* -+ * The object can be shared among different processes by either flink -+ * or dma-buf mechanism, leading to shared count more than 1. For the -+ * objects not shared , return the shared count as 1. -+ * In case of shared dma-buf objects, there's a possibility that these -+ * may be external to i915. Detect this condition through -+ * 'import_attach' field. -+ */ -+ if (!obj->base.name && !obj->base.dma_buf) -+ return 1; -+ else if (obj->base.import_attach) { -+ /* not our GEM obj */ -+ *discard = true; -+ return 0; -+ } -+ -+ ret = i915_obj_find_insert_in_hash(obj, pid_entry, discard); -+ if (ret) -+ return ret; -+ -+ list_for_each_entry (pid_info_entry, &obj->pid_info, head) -+ obj_shared_count++; -+ -+ if (WARN_ON(obj_shared_count == 0)) -+ return -EINVAL; -+ -+ return obj_shared_count; -+} -+ -+static int i915_describe_obj(struct get_obj_stats_buf *obj_stat_buf, -+ struct drm_i915_gem_object *obj) -+{ -+ struct pid_stat_entry *pid_entry = obj_stat_buf->entry; -+ struct per_file_obj_mem_info *stats = &pid_entry->stats; -+ int obj_shared_count = 0; -+ -+ bool discard = false; -+ -+ obj_shared_count = i915_obj_shared_count(obj, pid_entry, &discard); -+ if (obj_shared_count < 0) -+ return obj_shared_count; -+ -+ if (!discard && !obj->stolen && (obj->mm.madv != __I915_MADV_PURGED) && -+ (i915_obj_get_shmem_pages_alloced(obj) != 0)) { -+ if (obj_shared_count > 1) -+ stats->phys_space_shared_proportion += -+ obj->base.size / obj_shared_count; -+ else -+ stats->phys_space_allocated_priv += obj->base.size; -+ } -+ -+ return 0; -+} -+ -+static int i915_drm_gem_obj_info(int id, void *ptr, void *data) -+{ -+ struct drm_i915_gem_object *obj = ptr; -+ struct get_obj_stats_buf *obj_stat_buf = data; -+ -+ if (obj->pid_info.next == NULL) { -+ DRM_ERROR( -+ "Invalid pid info. obj:%p, size:%zdK, tiling:%s, stolen:%s, name:%d, handle_count=%d\n", -+ &obj->base, obj->base.size / 1024, get_tiling_flag(obj), -+ obj->stolen ? "Y" : "N", obj->base.name, -+ obj->base.handle_count); -+ return 0; -+ } -+ -+ return i915_describe_obj(obj_stat_buf, obj); -+} -+ -+bool i915_gem_obj_bound_any(struct drm_i915_gem_object *o) -+{ -+ struct i915_vma *vma; -+ -+ list_for_each_entry (vma, &o->vma.list, obj_link) -+ if (drm_mm_node_allocated(&vma->node)) -+ return true; -+ -+ return false; -+} -+ -+static int i915_drm_gem_object_per_file_summary(int id, void *ptr, void *data) -+{ -+ struct pid_stat_entry *pid_entry = data; -+ struct drm_i915_gem_object *obj = ptr; -+ struct per_file_obj_mem_info *stats = &pid_entry->stats; -+ int obj_shared_count = 0; -+ bool discard = false; -+ -+ if (obj->pid_info.next == NULL) { -+ DRM_ERROR( -+ "Invalid pid info. obj:%p, size:%zdK, tiling:%s, stolen:%s, name:%d, handle_count=%d\n", -+ &obj->base, obj->base.size / 1024, get_tiling_flag(obj), -+ obj->stolen ? "Y" : "N", obj->base.name, -+ obj->base.handle_count); -+ return 0; -+ } -+ -+ i915_obj_pidarray_validate(&obj->base); -+ -+ stats->num_obj++; -+ -+ obj_shared_count = i915_obj_shared_count(obj, pid_entry, &discard); -+ if (obj_shared_count < 0) -+ return obj_shared_count; -+ -+ if (discard) -+ return 0; -+ -+ if (obj_shared_count > 1) -+ stats->num_obj_shared++; -+ else -+ stats->num_obj_private++; -+ -+ if (i915_gem_obj_bound_any(obj)) { -+ stats->num_obj_gtt_bound++; -+ if (obj_shared_count > 1) -+ stats->gtt_space_allocated_shared += obj->base.size; -+ else -+ stats->gtt_space_allocated_priv += obj->base.size; -+ } -+ -+ if (obj->stolen) { -+ stats->num_obj_stolen++; -+ stats->stolen_space_allocated += obj->base.size; -+ } else if (obj->mm.madv == __I915_MADV_PURGED) { -+ stats->num_obj_purged++; -+ } else if (obj->mm.madv == I915_MADV_DONTNEED) { -+ stats->num_obj_purgeable++; -+ stats->num_obj_allocated++; -+ if (i915_obj_get_shmem_pages_alloced(obj) != 0) { -+ stats->phys_space_purgeable += obj->base.size; -+ if (obj_shared_count > 1) { -+ stats->phys_space_allocated_shared += -+ obj->base.size; -+ stats->phys_space_shared_proportion += -+ obj->base.size / obj_shared_count; -+ } else -+ stats->phys_space_allocated_priv += -+ obj->base.size; -+ } else -+ WARN_ON(1); -+ } else if (i915_obj_get_shmem_pages_alloced(obj) != 0) { -+ stats->num_obj_allocated++; -+ if (obj_shared_count > 1) { -+ stats->phys_space_allocated_shared += obj->base.size; -+ stats->phys_space_shared_proportion += -+ obj->base.size / obj_shared_count; -+ } else -+ stats->phys_space_allocated_priv += obj->base.size; -+ } -+ return 0; -+} -+static int __i915_get_drm_clients_info(struct drm_i915_error_state_buf *m, -+ struct drm_device *dev) -+{ -+ struct drm_file *file; -+ struct drm_i915_private *dev_priv = to_i915(dev); -+ -+ struct name_entry *entry, *next; -+ struct pid_stat_entry *pid_entry, *temp_entry; -+ struct pid_stat_entry *new_pid_entry, *new_temp_entry; -+ struct list_head per_pid_stats, sorted_pid_stats; -+ int ret = 0; -+ size_t total_shared_prop_space = 0, total_priv_space = 0; -+ -+ INIT_LIST_HEAD(&per_pid_stats); -+ INIT_LIST_HEAD(&sorted_pid_stats); -+ -+ err_puts( -+ m, -+ "\n\n pid Total Shared Priv Purgeable Alloced SharedPHYsize SharedPHYprop PrivPHYsize PurgeablePHYsize process\n"); -+ -+ list_for_each_entry (file, &dev->filelist, lhead) { -+ struct pid *tgid; -+ struct drm_i915_file_private *file_priv = file->driver_priv; -+ int pid_num, found = 0; -+ -+ tgid = file_priv->tgid; -+ pid_num = pid_nr(tgid); -+ -+ list_for_each_entry (pid_entry, &per_pid_stats, head) { -+ if (pid_entry->pid_num == pid_num) { -+ found = 1; -+ break; -+ } -+ } -+ -+ if (!found) { -+ struct pid_stat_entry *new_entry = -+ kzalloc(sizeof(*new_entry), GFP_KERNEL); -+ if (new_entry == NULL) { -+ DRM_ERROR("alloc failed\n"); -+ ret = -ENOMEM; -+ break; -+ } -+ new_entry->tgid = tgid; -+ new_entry->pid_num = pid_num; -+ ret = drm_ht_create(&new_entry->namelist, -+ DRM_MAGIC_HASH_ORDER); -+ if (ret) { -+ kfree(new_entry); -+ break; -+ } -+ -+ list_add_tail(&new_entry->head, &per_pid_stats); -+ INIT_LIST_HEAD(&new_entry->namefree); -+ new_entry->stats.process_name = file_priv->process_name; -+ pid_entry = new_entry; -+ } -+ -+ spin_lock(&file->table_lock); -+ ret = idr_for_each(&file->object_idr, -+ &i915_drm_gem_object_per_file_summary, -+ pid_entry); -+ spin_unlock(&file->table_lock); -+ if (ret) -+ break; -+ } -+ -+ list_for_each_entry_safe (pid_entry, temp_entry, &per_pid_stats, head) { -+ if (list_empty(&sorted_pid_stats)) { -+ list_del(&pid_entry->head); -+ list_add_tail(&pid_entry->head, &sorted_pid_stats); -+ continue; -+ } -+ -+ list_for_each_entry_safe (new_pid_entry, new_temp_entry, -+ &sorted_pid_stats, head) { -+ int prev_space = -+ pid_entry->stats.phys_space_shared_proportion + -+ pid_entry->stats.phys_space_allocated_priv; -+ int new_space = -+ new_pid_entry->stats -+ .phys_space_shared_proportion + -+ new_pid_entry->stats.phys_space_allocated_priv; -+ if (prev_space > new_space) { -+ list_del(&pid_entry->head); -+ list_add_tail(&pid_entry->head, -+ &new_pid_entry->head); -+ break; -+ } -+ if (list_is_last(&new_pid_entry->head, -+ &sorted_pid_stats)) { -+ list_del(&pid_entry->head); -+ list_add_tail(&pid_entry->head, -+ &sorted_pid_stats); -+ } -+ } -+ } -+ list_for_each_entry_safe (pid_entry, temp_entry, &sorted_pid_stats, -+ head) { -+ struct task_struct *task = -+ get_pid_task(pid_entry->tgid, PIDTYPE_PID); -+ err_printf( -+ m, -+ "%5d %6d %6d %6d %9d %8d %14zdK %14zdK %14zdK %14zdK %s", -+ pid_entry->pid_num, pid_entry->stats.num_obj, -+ pid_entry->stats.num_obj_shared, -+ pid_entry->stats.num_obj_private, -+ pid_entry->stats.num_obj_purgeable, -+ pid_entry->stats.num_obj_allocated, -+ pid_entry->stats.phys_space_allocated_shared / 1024, -+ pid_entry->stats.phys_space_shared_proportion / 1024, -+ pid_entry->stats.phys_space_allocated_priv / 1024, -+ pid_entry->stats.phys_space_purgeable / 1024, -+ pid_entry->stats.process_name); -+ -+ if (task == NULL) -+ err_puts(m, "*\n"); -+ else -+ err_puts(m, "\n"); -+ -+ total_shared_prop_space += -+ pid_entry->stats.phys_space_shared_proportion / 1024; -+ total_priv_space += -+ pid_entry->stats.phys_space_allocated_priv / 1024; -+ list_del(&pid_entry->head); -+ -+ list_for_each_entry_safe (entry, next, &pid_entry->namefree, -+ head) { -+ list_del(&entry->head); -+ drm_ht_remove_item(&pid_entry->namelist, -+ &entry->hash_item); -+ kfree(entry); -+ } -+ drm_ht_remove(&pid_entry->namelist); -+ kfree(pid_entry); -+ if (task) -+ put_task_struct(task); -+ } -+ err_puts(m, -+ "\t\t\t\t\t\t\t\t--------------\t-------------\t--------\n"); -+ err_printf(m, "\t\t\t\t\t\t\t\t%13zdK\t%12zdK\tTotal\n", -+ total_shared_prop_space, total_priv_space); -+ -+ err_printf(m, "\nTotal used GFX Shmem Physical space %8zdK\n", -+ dev_priv->mm.phys_mem_total / 1024); -+ -+ if (ret) -+ return ret; -+ if (m->bytes == 0 && m->err) -+ return m->err; -+ -+ return 0; -+} -+ -+#define NUM_SPACES 100 -+#define INITIAL_SPACES_STR(x) #x -+#define SPACES_STR(x) INITIAL_SPACES_STR(x) -+ -+static int __i915_gem_get_obj_info(struct drm_i915_error_state_buf *m, -+ struct drm_device *dev, struct pid *tgid) -+{ -+ struct drm_file *file; -+ struct drm_i915_file_private *file_priv_reqd = NULL; -+ int bytes_copy, ret = 0; -+ struct pid_stat_entry pid_entry; -+ struct name_entry *entry, *next; -+ -+ pid_entry.stats.phys_space_shared_proportion = 0; -+ pid_entry.stats.phys_space_allocated_priv = 0; -+ pid_entry.tgid = tgid; -+ pid_entry.pid_num = pid_nr(tgid); -+ ret = drm_ht_create(&pid_entry.namelist, DRM_MAGIC_HASH_ORDER); -+ if (ret) -+ return ret; -+ -+ INIT_LIST_HEAD(&pid_entry.namefree); -+ -+ /* -+ * Fill up initial few bytes with spaces, to insert summary data later -+ * on -+ */ -+ err_printf(m, "%" SPACES_STR(NUM_SPACES) "s\n", " "); -+ -+ list_for_each_entry (file, &dev->filelist, lhead) { -+ struct drm_i915_file_private *file_priv = file->driver_priv; -+ struct get_obj_stats_buf obj_stat_buf; -+ -+ obj_stat_buf.entry = &pid_entry; -+ obj_stat_buf.m = m; -+ -+ if (file_priv->tgid != tgid) -+ continue; -+ -+ file_priv_reqd = file_priv; -+ spin_lock(&file->table_lock); -+ ret = idr_for_each(&file->object_idr, &i915_drm_gem_obj_info, -+ &obj_stat_buf); -+ spin_unlock(&file->table_lock); -+ if (ret) -+ break; -+ } -+ -+ if (file_priv_reqd) { -+ int space_remaining; -+ -+ /* Reset the bytes counter to buffer beginning */ -+ bytes_copy = m->bytes; -+ m->bytes = 0; -+ -+ err_printf(m, "\n PID GfxMem Process\n"); -+ err_printf(m, "%5d %8zdK ", pid_nr(file_priv_reqd->tgid), -+ (pid_entry.stats.phys_space_shared_proportion + -+ pid_entry.stats.phys_space_allocated_priv) / -+ 1024); -+ -+ space_remaining = NUM_SPACES - m->bytes - 1; -+ if (strlen(file_priv_reqd->process_name) > space_remaining) -+ file_priv_reqd->process_name[space_remaining] = '\0'; -+ -+ err_printf(m, "%s\n", file_priv_reqd->process_name); -+ -+ /* Reinstate the previous saved value of bytes counter */ -+ m->bytes = bytes_copy; -+ } else -+ WARN(1, "drm file corresponding to tgid:%d not found\n", -+ pid_nr(tgid)); -+ -+ list_for_each_entry_safe (entry, next, &pid_entry.namefree, head) { -+ list_del(&entry->head); -+ drm_ht_remove_item(&pid_entry.namelist, &entry->hash_item); -+ kfree(entry); -+ } -+ drm_ht_remove(&pid_entry.namelist); -+ -+ if (ret) -+ return ret; -+ if (m->bytes == 0 && m->err) -+ return m->err; -+ return 0; -+} -+ -+int i915_get_drm_clients_info(struct drm_i915_error_state_buf *m, -+ struct drm_device *dev) -+{ -+ int ret = 0; -+ -+ /* -+ * Protect the access to global drm resources such as filelist. Protect -+ * against their removal under our noses, while in use. -+ */ -+ mutex_lock(&drm_global_mutex); -+ ret = mutex_lock_interruptible(&dev->struct_mutex); -+ if (ret) { -+ mutex_unlock(&drm_global_mutex); -+ return ret; -+ } -+ -+ ret = __i915_get_drm_clients_info(m, dev); -+ -+ mutex_unlock(&dev->struct_mutex); -+ mutex_unlock(&drm_global_mutex); -+ -+ return ret; -+} -+ -+int i915_gem_get_obj_info(struct drm_i915_error_state_buf *m, -+ struct drm_device *dev, struct pid *tgid) -+{ -+ int ret = 0; -+ -+ -+ ret = mutex_lock_interruptible(&dev->struct_mutex); -+ if (ret) -+ return ret; -+ -+ ret = __i915_gem_get_obj_info(m, dev, tgid); -+ -+ mutex_unlock(&dev->struct_mutex); -+ -+ return ret; -+} -+#endif -+ -+static int insert_mappable_node(struct i915_ggtt *ggtt, -+ struct drm_mm_node *node, u32 size) - { - int err; - -@@ -80,8 +907,8 @@ insert_mappable_node(struct i915_ggtt *ggtt, struct drm_mm_node *node, u32 size) - return err; - } - --static void --remove_mappable_node(struct i915_ggtt *ggtt, struct drm_mm_node *node) -+static void remove_mappable_node(struct i915_ggtt *ggtt, -+ struct drm_mm_node *node) - { - mutex_lock(&ggtt->vm.mutex); - drm_mm_remove_node(node); -@@ -1288,15 +2115,61 @@ int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file) - file_priv->file = file; - file_priv->client = client; - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ rcu_read_lock(); -+ file_priv->tgid = get_pid(find_vpid(task_tgid_nr(current))); -+ rcu_read_unlock(); -+ -+ file_priv->process_name = kzalloc(PAGE_SIZE, GFP_ATOMIC); -+ if (!file_priv->process_name) { -+ ret = -ENOMEM; -+ goto out_free_file; -+ } -+ -+ ret = i915_get_pid_cmdline(current, file_priv->process_name); -+ if (ret) -+ goto out_free_name; -+#endif -+ - file_priv->bsd_engine = -1; - file_priv->hang_timestamp = jiffies; - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ intel_runtime_pm_get(&i915->runtime_pm); -+#endif -+ - ret = i915_gem_context_open(i915, file); -- if (ret) -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ if (ret) { -+ //intel_runtime_pm_put(i915); -+ intel_runtime_pm_put_unchecked(&i915->runtime_pm); -+ goto out_free_name; -+ } -+ intel_runtime_pm_put_unchecked(&i915->runtime_pm); -+ -+ ret = i915_gem_create_sysfs_file_entry(&i915->drm, file); -+ if (ret) { -+ i915_gem_context_close(file); -+ goto out_free_name; -+ } -+ -+#else -+ if (ret) { - goto err_context; -+ } -+ -+#endif - - return 0; - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+out_free_name: -+ kfree(file_priv->process_name); -+out_free_file: -+ put_pid(file_priv->tgid); -+ kfree(file_priv); -+#endif -+ - err_context: - i915_drm_client_put(client); - err_client: -diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c -index f983b41620e5..84522bb14edd 100644 ---- a/drivers/gpu/drm/i915/i915_gpu_error.c -+++ b/drivers/gpu/drm/i915/i915_gpu_error.c -@@ -152,7 +152,7 @@ static void i915_error_vprintf(struct drm_i915_error_state_buf *e, - e->bytes += len; - } - --static void i915_error_puts(struct drm_i915_error_state_buf *e, const char *str) -+void i915_error_puts(struct drm_i915_error_state_buf *e, const char *str) - { - unsigned len; - -@@ -186,6 +186,26 @@ i915_error_printer(struct drm_i915_error_state_buf *e) - return p; - } - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+static bool __i915_error_ok(struct drm_i915_error_state_buf *e) -+{ -+ if (!e->err && WARN(e->bytes > (e->size - 1), "overflow")) { -+ e->err = -ENOSPC; -+ return false; -+ } -+ -+ if (e->bytes == e->size - 1 || e->err) -+ return false; -+ -+ return true; -+} -+ -+bool i915_error_ok(struct drm_i915_error_state_buf *e) -+{ -+ return __i915_error_ok(e); -+} -+#endif -+ - /* single threaded page allocator with a reserved stash for emergencies */ - static void pool_fini(struct pagevec *pv) - { -@@ -1016,6 +1036,21 @@ static void i915_vma_coredump_free(struct i915_vma_coredump *vma) - } - } - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+int i915_obj_state_buf_init(struct drm_i915_error_state_buf *ebuf, size_t count) -+{ -+ memset(ebuf, 0, sizeof(*ebuf)); -+ -+ ebuf->buf = kmalloc(count, GFP_KERNEL); -+ -+ if (ebuf->buf == NULL) -+ return -ENOMEM; -+ -+ ebuf->size = count; -+ return 0; -+} -+#endif -+ - static void cleanup_params(struct i915_gpu_coredump *error) - { - i915_params_free(&error->params); -diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h -index 56027ffbce51..d05a61e73bad 100644 ---- a/drivers/gpu/drm/i915/i915_gpu_error.h -+++ b/drivers/gpu/drm/i915/i915_gpu_error.h -@@ -258,6 +258,16 @@ static inline u32 i915_reset_engine_count(struct i915_gpu_error *error, - #define CORE_DUMP_FLAG_IS_GUC_CAPTURE BIT(0) - - #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR) -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+void i915_error_puts(struct drm_i915_error_state_buf *e, const char *str); -+bool i915_error_ok(struct drm_i915_error_state_buf *e); -+int i915_obj_state_buf_init(struct drm_i915_error_state_buf *eb, size_t count); -+static inline void -+i915_error_state_buf_release(struct drm_i915_error_state_buf *eb) -+{ -+ kfree(eb->buf); -+} -+#endif - - __printf(2, 3) - void i915_error_printf(struct drm_i915_error_state_buf *e, const char *f, ...); -diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c -index 595e8b574990..54446a4a7b47 100644 ---- a/drivers/gpu/drm/i915/i915_sysfs.c -+++ b/drivers/gpu/drm/i915/i915_sysfs.c -@@ -38,6 +38,10 @@ - #include "i915_drv.h" - #include "i915_sysfs.h" - #include "intel_pm.h" -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+#include "../drm_internal.h" -+#include "i915_file_private.h" -+#endif - - struct drm_i915_private *kdev_minor_to_i915(struct device *kdev) - { -@@ -226,9 +230,299 @@ static void i915_teardown_error_capture(struct device *kdev) - { - sysfs_remove_bin_file(&kdev->kobj, &error_state_attr); - } -+ -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+#define dev_to_drm_minor(d) dev_get_drvdata((d)) -+ -+static ssize_t i915_gem_clients_state_read(struct file *filp, -+ struct kobject *memtrack_kobj, -+ struct bin_attribute *attr, -+ char *buf, loff_t off, size_t count) -+{ -+ struct kobject *kobj = memtrack_kobj->parent; -+ struct device *kdev = container_of(kobj, struct device, kobj); -+ struct drm_minor *minor = dev_to_drm_minor(kdev); -+ struct drm_device *dev = minor->dev; -+ struct drm_i915_private *dev_priv = to_i915(dev); -+ struct drm_i915_error_state_buf error_str; -+ ssize_t ret_count = 0; -+ int ret; -+ -+ ret = i915_obj_state_buf_init(&error_str, count); -+ if (ret) -+ return ret; -+ -+ ret = i915_get_drm_clients_info(&error_str, dev); -+ if (ret) -+ goto out; -+ -+ if (off >= error_str.bytes) { -+ ret_count = 0; -+ } else { -+ ret_count = count < error_str.bytes ? count : error_str.bytes; -+ memcpy(buf, error_str.buf, ret_count); -+ } -+out: -+ i915_error_state_buf_release(&error_str); -+ -+ return ret ?: ret_count; -+} -+ -+#define GEM_OBJ_STAT_BUF_SIZE (4 * 1024) /* 4KB */ -+#define GEM_OBJ_STAT_BUF_SIZE_MAX (1024 * 1024) /* 1MB */ -+ -+struct i915_gem_file_attr_priv { -+ char tgid_str[16]; -+ struct pid *tgid; -+ struct drm_i915_error_state_buf buf; -+}; -+ -+static ssize_t i915_gem_read_objects(struct file *filp, -+ struct kobject *memtrack_kobj, -+ struct bin_attribute *attr, char *buf, -+ loff_t off, size_t count) -+{ -+ struct kobject *kobj = memtrack_kobj->parent; -+ struct device *kdev = container_of(kobj, struct device, kobj); -+ struct drm_minor *minor = dev_to_drm_minor(kdev); -+ struct drm_device *dev = minor->dev; -+ struct i915_gem_file_attr_priv *attr_priv; -+ struct pid *tgid; -+ ssize_t ret_count = 0; -+ long bytes_available; -+ int ret = 0, buf_size = GEM_OBJ_STAT_BUF_SIZE; -+ unsigned long timeout = msecs_to_jiffies(500) + 1; -+ -+ /* -+ * There may arise a scenario where syfs file entry is being removed, -+ * and may race against sysfs read. Sysfs file remove function would -+ * have taken the drm_global_mutex and would wait for read to finish, -+ * which is again waiting to acquire drm_global_mutex, leading to -+ * deadlock. To avoid this, use mutex_trylock here with a timeout. -+ */ -+ while (!mutex_trylock(&drm_global_mutex) && --timeout) -+ schedule_timeout_killable(1); -+ if (timeout == 0) { -+ DRM_DEBUG_DRIVER("Unable to acquire drm global mutex.\n"); -+ return -EBUSY; -+ } -+ -+ if (!attr || !attr->private) { -+ ret = -EINVAL; -+ DRM_ERROR("attr | attr->private pointer is NULL\n"); -+ goto out; -+ } -+ attr_priv = attr->private; -+ tgid = attr_priv->tgid; -+ -+ if (off && !attr_priv->buf.buf) { -+ ret = -EINVAL; -+ DRM_ERROR( -+ "Buf not allocated during read with non-zero offset\n"); -+ goto out; -+ } -+ -+ if (off == 0) { -+ retry: -+ if (!attr_priv->buf.buf) { -+ ret = i915_obj_state_buf_init(&attr_priv->buf, -+ buf_size); -+ if (ret) { -+ DRM_ERROR( -+ "obj state buf init failed. buf_size=%d\n", -+ buf_size); -+ goto out; -+ } -+ } else { -+ /* Reset the buf parameters before filling data */ -+ attr_priv->buf.bytes = 0; -+ } -+ -+ /* Read the gfx device stats */ -+ ret = i915_gem_get_obj_info(&attr_priv->buf, dev, tgid); -+ if (ret) -+ goto out; -+ -+ ret = i915_error_ok(&attr_priv->buf); -+ if (ret) { -+ ret = 0; -+ goto copy_data; -+ } -+ if (buf_size >= GEM_OBJ_STAT_BUF_SIZE_MAX) { -+ DRM_DEBUG_DRIVER("obj stat buf size limit reached\n"); -+ ret = -ENOMEM; -+ goto out; -+ } else { -+ /* Try to reallocate buf of larger size */ -+ i915_error_state_buf_release(&attr_priv->buf); -+ buf_size *= 2; -+ -+ ret = i915_obj_state_buf_init(&attr_priv->buf, -+ buf_size); -+ if (ret) { -+ DRM_ERROR( -+ "obj stat buf init failed. buf_size=%d\n", -+ buf_size); -+ goto out; -+ } -+ goto retry; -+ } -+ } -+copy_data: -+ -+ bytes_available = (long)attr_priv->buf.bytes - (long)off; -+ -+ if (bytes_available > 0) { -+ ret_count = count < bytes_available ? count : bytes_available; -+ memcpy(buf, attr_priv->buf.buf + off, ret_count); -+ } else -+ ret_count = 0; -+ -+out: -+ mutex_unlock(&drm_global_mutex); -+ -+ return ret ?: ret_count; -+} -+ -+int i915_gem_create_sysfs_file_entry(struct drm_device *dev, -+ struct drm_file *file) -+{ -+ struct drm_i915_file_private *file_priv = file->driver_priv; -+ struct drm_i915_private *dev_priv = to_i915(dev); -+ struct device *kdev = dev_priv->drm.primary->kdev; -+ -+ struct i915_gem_file_attr_priv *attr_priv; -+ struct bin_attribute *obj_attr; -+ struct drm_file *file_local; -+ int ret; -+ -+ /* -+ * Check for multiple drm files having same tgid. If found, copy the -+ * bin attribute into the new file priv. Otherwise allocate a new -+ * copy of bin attribute, and create its corresponding sysfs file. -+ */ -+ mutex_lock(&dev->struct_mutex); -+ list_for_each_entry (file_local, &dev->filelist, lhead) { -+ struct drm_i915_file_private *file_priv_local = -+ file_local->driver_priv; -+ -+ if (file_priv->tgid == file_priv_local->tgid) { -+ file_priv->obj_attr = file_priv_local->obj_attr; -+ mutex_unlock(&dev->struct_mutex); -+ return 0; -+ } -+ } -+ mutex_unlock(&dev->struct_mutex); -+ -+ if (!dev_priv->mmtkobj_initialized) { -+ DRM_ERROR("memtrack_kobj hasn't been initialized yet\n"); -+ return 0; -+ } -+ -+ obj_attr = kzalloc(sizeof(*obj_attr), GFP_KERNEL); -+ if (!obj_attr) { -+ DRM_ERROR("Alloc failed. Out of memory\n"); -+ ret = -ENOMEM; -+ goto out; -+ } -+ -+ attr_priv = kzalloc(sizeof(*attr_priv), GFP_KERNEL); -+ if (!attr_priv) { -+ DRM_ERROR("Alloc failed. Out of memory\n"); -+ ret = -ENOMEM; -+ goto out_obj_attr; -+ } -+ -+ snprintf(attr_priv->tgid_str, 16, "%d", task_tgid_nr(current)); -+ obj_attr->attr.name = attr_priv->tgid_str; -+ obj_attr->attr.mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; -+ obj_attr->size = 0; -+ obj_attr->read = i915_gem_read_objects; -+ -+ attr_priv->tgid = file_priv->tgid; -+ obj_attr->private = attr_priv; -+ -+ ret = sysfs_create_bin_file(&dev_priv->memtrack_kobj, obj_attr); -+ if (ret) { -+ DRM_ERROR( -+ "sysfs tgid file setup failed. tgid=%d, process:%s, ret:%d\n", -+ pid_nr(file_priv->tgid), file_priv->process_name, ret); -+ goto out_attr_priv; -+ } -+ -+ file_priv->obj_attr = obj_attr; -+ return 0; -+ -+out_attr_priv: -+ kfree(attr_priv); -+out_obj_attr: -+ kfree(obj_attr); -+out: -+ return ret; -+} -+ -+void i915_gem_remove_sysfs_file_entry(struct drm_device *dev, -+ struct drm_file *file) -+{ -+ struct drm_i915_private *dev_priv = to_i915(dev); -+ struct drm_i915_file_private *file_priv = file->driver_priv; -+ struct drm_file *file_local; -+ int open_count = 1; -+ -+ /* -+ * The current drm file instance is already removed from filelist at -+ * this point. -+ * Check if this particular drm file being removed is the last one for -+ * that particular tgid, and no other instances for this tgid exist in -+ * the filelist. If so, remove the corresponding sysfs file entry also. -+ */ -+ list_for_each_entry (file_local, &dev->filelist, lhead) { -+ struct drm_i915_file_private *file_priv_local = -+ file_local->driver_priv; -+ -+ if (pid_nr(file_priv->tgid) == pid_nr(file_priv_local->tgid)) -+ open_count++; -+ } -+ -+ if (open_count == 1) { -+ struct i915_gem_file_attr_priv *attr_priv; -+ -+ if (WARN_ON(file_priv->obj_attr == NULL)) -+ return; -+ attr_priv = file_priv->obj_attr->private; -+ -+ sysfs_remove_bin_file(&dev_priv->memtrack_kobj, -+ file_priv->obj_attr); -+ i915_error_state_buf_release(&attr_priv->buf); -+ kfree(file_priv->obj_attr->private); -+ kfree(file_priv->obj_attr); -+ } -+} -+ -+static struct bin_attribute i915_gem_client_state_attr = { -+ .attr.name = "i915_gem_meminfo", -+ .attr.mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, -+ .size = 0, -+ .read = i915_gem_clients_state_read, -+}; -+ -+static struct attribute *memtrack_kobj_attrs[] = { NULL }; -+ -+static struct kobj_type memtrack_kobj_type = { -+ .release = NULL, -+ .sysfs_ops = NULL, -+ .default_attrs = memtrack_kobj_attrs, -+}; -+ -+#endif -+ - #else --static void i915_setup_error_capture(struct device *kdev) {} --static void i915_teardown_error_capture(struct device *kdev) {} -+static void i915_setup_error_capture(struct device *kdev) -+{ -+} -+static void i915_teardown_error_capture(struct device *kdev) -+{ -+} - #endif - - void i915_setup_sysfs(struct drm_i915_private *dev_priv) -@@ -258,6 +552,26 @@ void i915_setup_sysfs(struct drm_i915_private *dev_priv) - - i915_setup_error_capture(kdev); - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ /* -+ * Create the gfx_memtrack directory for memtrack sysfs files -+ */ -+ ret = kobject_init_and_add(&dev_priv->memtrack_kobj, -+ &memtrack_kobj_type, &kdev->kobj, -+ "gfx_memtrack"); -+ -+ dev_priv->mmtkobj_initialized = true; -+ -+ if (unlikely(ret != 0)) { -+ DRM_ERROR("i915 sysfs setup memtrack directory failed\n"); -+ kobject_put(&dev_priv->memtrack_kobj); -+ } else { -+ ret = sysfs_create_bin_file(&dev_priv->memtrack_kobj, -+ &i915_gem_client_state_attr); -+ if (ret) -+ DRM_ERROR("i915_gem_client_state sysfs setup failed\n"); -+ } -+#endif - intel_engines_add_sysfs(dev_priv); - } - -@@ -271,4 +585,11 @@ void i915_teardown_sysfs(struct drm_i915_private *dev_priv) - device_remove_bin_file(kdev, &dpf_attrs); - - kobject_put(dev_priv->sysfs_gt); -+ -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+ sysfs_remove_bin_file(&dev_priv->memtrack_kobj, -+ &i915_gem_client_state_attr); -+ kobject_del(&dev_priv->memtrack_kobj); -+ kobject_put(&dev_priv->memtrack_kobj); -+#endif - } -diff --git a/drivers/gpu/drm/i915/i915_sysfs.h b/drivers/gpu/drm/i915/i915_sysfs.h -index 243a17741e3f..c6a3517f30bf 100644 ---- a/drivers/gpu/drm/i915/i915_sysfs.h -+++ b/drivers/gpu/drm/i915/i915_sysfs.h -@@ -14,4 +14,11 @@ struct drm_i915_private *kdev_minor_to_i915(struct device *kdev); - void i915_setup_sysfs(struct drm_i915_private *i915); - void i915_teardown_sysfs(struct drm_i915_private *i915); - -+#if IS_ENABLED(CONFIG_DRM_I915_MEMTRACK) -+int i915_gem_create_sysfs_file_entry(struct drm_device *dev, -+ struct drm_file *file); -+void i915_gem_remove_sysfs_file_entry(struct drm_device *dev, -+ struct drm_file *file); -+#endif -+ - #endif /* __I915_SYSFS_H__ */ --- -2.34.1 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0016-iwl7000-Add-driver-and-firmware-version-query-suppor.patch b/bsp_diff/common/kernel/lts2021-chromium/0016-iwl7000-Add-driver-and-firmware-version-query-suppor.patch deleted file mode 100644 index 80af4f07f1..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0016-iwl7000-Add-driver-and-firmware-version-query-suppor.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 2828a10cca8e629beb957e10f7013e4ddb655500 Mon Sep 17 00:00:00 2001 -From: Jeevaka Prabu Badrappan -Date: Fri, 8 Oct 2021 10:08:48 +0530 -Subject: [PATCH] iwl7000: Add driver and firmware version query support - -Adding vendor command support for querying driver & firmware -version. - -Tracked-On: OAM-94267 -Signed-off-by: Jeevaka Prabu Badrappan ---- - .../wireless/iwl7000/iwlwifi/iwl-vendor-cmd.h | 8 ++ - .../wireless/iwl7000/iwlwifi/mvm/vendor-cmd.c | 73 +++++++++++++++++++ - 2 files changed, 81 insertions(+) - -diff --git a/drivers/net/wireless/iwl7000/iwlwifi/iwl-vendor-cmd.h b/drivers/net/wireless/iwl7000/iwlwifi/iwl-vendor-cmd.h -index 54159505ecb1..b50481f6e80a 100644 ---- a/drivers/net/wireless/iwl7000/iwlwifi/iwl-vendor-cmd.h -+++ b/drivers/net/wireless/iwl7000/iwlwifi/iwl-vendor-cmd.h -@@ -112,6 +112,8 @@ - * @IWL_MVM_VENDOR_CMD_GET_LINK_INFO: Get link information. - * This is needed for RFIm user app - * @IWL_MVM_VENDOR_CMD_LINK_INFO_CHANGED_EVENT: Link information is changed -+ * @IWL_MVM_VENDOR_CMD_GET_DRV_VERSION: Driver version -+ * @IWL_MVM_VENDOR_CMD_GET_FW_VERSION: Firmware version - */ - - enum iwl_mvm_vendor_cmd { -@@ -170,6 +172,8 @@ enum iwl_mvm_vendor_cmd { - IWL_MVM_VENDOR_CMD_RFIM_SET_CNVI_MASTER = 0x37, - IWL_MVM_VENDOR_CMD_GET_LINK_INFO = 0x38, - IWL_MVM_VENDOR_CMD_LINK_INFO_CHANGED_EVENT = 0x39, -+ IWL_MVM_VENDOR_CMD_GET_FW_VERSION = 0x41, -+ IWL_MVM_VENDOR_CMD_GET_DRV_VERSION = 0x42, - }; - - /** -@@ -806,6 +810,8 @@ enum iwl_vendor_auth_akm_mode { - * @IWL_MVM_VENDOR_ATTR_RFIM_CHAIN_B_DESENSE: chain b desense values - * @IWL_MVM_VENDOR_ATTR_RFIM_DDR_SNR_THRESHOLD: SNR threshold for RSSI based - * DDR RFIM. -+ * @IWL_MVM_VENDOR_ATTR_DRV_VER: string attribute. Driver version -+ * @IWL_MVM_VENDOR_ATTR_FW_VER: string attribute. Firmware version - * - * @NUM_IWL_MVM_VENDOR_ATTR: number of vendor attributes - * @MAX_IWL_MVM_VENDOR_ATTR: highest vendor attribute number -@@ -929,6 +935,8 @@ enum iwl_mvm_vendor_attr { - IWL_MVM_VENDOR_ATTR_RFIM_CHAIN_A_DESENSE = 0x7e, - IWL_MVM_VENDOR_ATTR_RFIM_CHAIN_B_DESENSE = 0x7f, - IWL_MVM_VENDOR_ATTR_RFIM_DDR_SNR_THRESHOLD = 0x80, -+ IWL_MVM_VENDOR_ATTR_FW_VER = 0x81, -+ IWL_MVM_VENDOR_ATTR_DRV_VER = 0x82, - - NUM_IWL_MVM_VENDOR_ATTR, - MAX_IWL_MVM_VENDOR_ATTR = NUM_IWL_MVM_VENDOR_ATTR - 1, -diff --git a/drivers/net/wireless/iwl7000/iwlwifi/mvm/vendor-cmd.c b/drivers/net/wireless/iwl7000/iwlwifi/mvm/vendor-cmd.c -index de526a98b72a..4d8dc365162b 100644 ---- a/drivers/net/wireless/iwl7000/iwlwifi/mvm/vendor-cmd.c -+++ b/drivers/net/wireless/iwl7000/iwlwifi/mvm/vendor-cmd.c -@@ -6,6 +6,8 @@ - */ - #include - #include -+#include -+#include - #include - #include "mvm.h" - #include "iwl-vendor-cmd.h" -@@ -98,6 +100,8 @@ iwl_mvm_vendor_attr_policy[NUM_IWL_MVM_VENDOR_ATTR] = { - [IWL_MVM_VENDOR_ATTR_BAND] = { .type = NLA_U8 }, - [IWL_MVM_VENDOR_ATTR_COLLOC_CHANNEL] = { .type = NLA_U8 }, - [IWL_MVM_VENDOR_ATTR_COLLOC_ADDR] = { .type = NLA_BINARY, .len = ETH_ALEN }, -+ [IWL_MVM_VENDOR_ATTR_FW_VER] = { .type = NLA_STRING, .len = 50 }, -+ [IWL_MVM_VENDOR_ATTR_DRV_VER] = { .type = NLA_STRING, .len = 50 }, - }; - - static struct nlattr **iwl_mvm_parse_vendor_data(const void *data, int data_len) -@@ -1732,6 +1736,48 @@ static int iwl_mvm_vendor_host_get_ownership(struct wiphy *wiphy, - return ret; - } - -+static int iwl_mvm_vendor_get_fw_version(struct wiphy *wiphy, -+ struct wireless_dev *wdev, -+ const void *data, int data_len) -+{ -+ int err = 0; -+ struct sk_buff *skb; -+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); -+ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); -+ const struct iwl_fw *fw = mvm->fw; -+ -+ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(fw->fw_version)); -+ if (!skb) -+ return -ENOMEM; -+ if (nla_put_string(skb, IWL_MVM_VENDOR_ATTR_FW_VER, fw->fw_version)) { -+ kfree_skb(skb); -+ return -ENOBUFS; -+ } -+ -+ return cfg80211_vendor_cmd_reply(skb); -+} -+ -+static int iwl_mvm_vendor_get_drv_version(struct wiphy *wiphy, -+ struct wireless_dev *wdev, -+ const void *data, int data_len) -+{ -+ int err = 0; -+ struct sk_buff *skb; -+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); -+ struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); -+ const struct iwl_fw *fw = mvm->fw; -+ -+ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(utsname()->release)); -+ if (!skb) -+ return -ENOMEM; -+ if (nla_put_string(skb, IWL_MVM_VENDOR_ATTR_DRV_VER, utsname()->release)) { -+ kfree_skb(skb); -+ return -ENOBUFS; -+ } -+ -+ return cfg80211_vendor_cmd_reply(skb); -+} -+ - static const struct wiphy_vendor_command iwl_mvm_vendor_commands[] = { - { - .info = { -@@ -1996,6 +2042,33 @@ static const struct wiphy_vendor_command iwl_mvm_vendor_commands[] = { - .policy = iwl_mvm_vendor_attr_policy, - .maxattr = MAX_IWL_MVM_VENDOR_ATTR, - }, -+ { -+ .info = { -+ .vendor_id = INTEL_OUI, -+ .subcmd = IWL_MVM_VENDOR_CMD_GET_FW_VERSION, -+ }, -+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV | -+ WIPHY_VENDOR_CMD_NEED_RUNNING, -+ .doit = iwl_mvm_vendor_get_fw_version, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ .policy = iwl_mvm_vendor_attr_policy, -+ .maxattr = MAX_IWL_MVM_VENDOR_ATTR, -+#endif -+ }, -+ { -+ .info = { -+ .vendor_id = INTEL_OUI, -+ .subcmd = IWL_MVM_VENDOR_CMD_GET_DRV_VERSION, -+ }, -+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV | -+ WIPHY_VENDOR_CMD_NEED_RUNNING, -+ .doit = iwl_mvm_vendor_get_drv_version, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ .policy = iwl_mvm_vendor_attr_policy, -+ .maxattr = MAX_IWL_MVM_VENDOR_ATTR, -+#endif -+ }, -+ - }; - - enum iwl_mvm_vendor_events_idx { --- -2.34.1 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0017-Add-HFP-support-for-AX211-GarfieldPeak-Gfp.patch b/bsp_diff/common/kernel/lts2021-chromium/0017-Add-HFP-support-for-AX211-GarfieldPeak-Gfp.patch deleted file mode 100644 index 86d16043a4..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0017-Add-HFP-support-for-AX211-GarfieldPeak-Gfp.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 14d4cd2703e846809281eca8337695f726596414 Mon Sep 17 00:00:00 2001 -From: Aiswarya Cyriac -Date: Fri, 21 Jan 2022 10:41:16 +0530 -Subject: [PATCH] Add HFP support for AX211 GarfieldPeak (Gfp) - -Tracked-On: OAM-100635 -Signed-off-by: Aiswarya Cyriac ---- - sound/usb/btusb/btusb_sco_snd_card.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/sound/usb/btusb/btusb_sco_snd_card.c b/sound/usb/btusb/btusb_sco_snd_card.c -index 16a6dbb608e1..8e70f7d74422 100644 ---- a/sound/usb/btusb/btusb_sco_snd_card.c -+++ b/sound/usb/btusb/btusb_sco_snd_card.c -@@ -101,6 +101,7 @@ static const struct usb_device_id btusb_sco_table[] = { - { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW }, - { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW }, - { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL_NEW }, -+ { USB_DEVICE(0x8087, 0x0033), .driver_info = BTUSB_INTEL_NEW }, - { } /* Terminating entry */ - }; - --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0018-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch b/bsp_diff/common/kernel/lts2021-chromium/0018-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch deleted file mode 100644 index 865dc6dc3f..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0018-ACPI-PM-Propagate-power-button-event-to-user-space-w.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 29a5aafda3c2df2e5c35ca4293b3343117a84971 Mon Sep 17 00:00:00 2001 -From: Kaushlendra Kumar -Date: Fri, 22 Apr 2022 14:38:58 +0530 -Subject: [PATCH] ACPI/PM: Propagate power button event to user space when - device wakes up - -Sometimes power button does not wake up the systemm, we get suspends -event -right after that. here Android needs to see KEY_POWER at resume. -Otherwise, its -opportunistic suspend will kick in shortly. - -However, other OS such as Ubuntu doesn't like KEY_POWER at resume. So -add a knob "/sys/module/button/parameters/key_power_at_resume" for users -to select. - -Tracked-On: OAM-101964 -Signed-off-by: Kaushlendra Kumar ---- - drivers/acpi/button.c | 6 +++++- - drivers/acpi/sleep.c | 6 ++++++ - 2 files changed, 11 insertions(+), 1 deletion(-) - -diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c -index 1f9b9a4c38c7..812bd349bfc6 100644 ---- a/drivers/acpi/button.c -+++ b/drivers/acpi/button.c -@@ -38,6 +38,10 @@ - #define ACPI_BUTTON_DEVICE_NAME_LID "Lid Switch" - #define ACPI_BUTTON_TYPE_LID 0x05 - -+/* does userspace want to see KEY_POWER at resume? */ -+static bool __read_mostly key_power_at_resume = true; -+module_param(key_power_at_resume, bool, 0644); -+ - enum { - ACPI_BUTTON_LID_INIT_IGNORE, - ACPI_BUTTON_LID_INIT_OPEN, -@@ -418,7 +422,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) - int keycode; - - acpi_pm_wakeup_event(&device->dev); -- if (button->suspended) -+ if (button->suspended && !key_power_at_resume) - break; - - keycode = test_bit(KEY_SLEEP, input->keybit) ? -diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c -index 06d6da6101e5..8f9b0b49f0a1 100644 ---- a/drivers/acpi/sleep.c -+++ b/drivers/acpi/sleep.c -@@ -463,6 +463,11 @@ static int acpi_pm_prepare(void) - return error; - } - -+static void pwr_btn_notify(struct acpi_device *device) -+{ -+ device->driver->ops.notify(device, ACPI_FIXED_HARDWARE_EVENT); -+} -+ - /** - * acpi_pm_finish - Instruct the platform to leave a sleep state. - * -@@ -505,6 +510,7 @@ static void acpi_pm_finish(void) - NULL, -1); - if (pwr_btn_adev) { - pm_wakeup_event(&pwr_btn_adev->dev, 0); -+ pwr_btn_notify(pwr_btn_adev); - acpi_dev_put(pwr_btn_adev); - } - } --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0020-Skip-hw-pmu-for-VM-on-ADL.patch b/bsp_diff/common/kernel/lts2021-chromium/0020-Skip-hw-pmu-for-VM-on-ADL.patch deleted file mode 100644 index 583476053d..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0020-Skip-hw-pmu-for-VM-on-ADL.patch +++ /dev/null @@ -1,38 +0,0 @@ -From f1890e1c3da23832ca8ed68928ee581840f410c6 Mon Sep 17 00:00:00 2001 -From: Sun Jian -Date: Mon, 4 Oct 2021 06:41:16 +0800 -Subject: [PATCH] Skip hw pmu for VM on ADL - ---- - arch/x86/events/core.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c -index 81d5e0a1f48c..0594235a0cd0 100644 ---- a/arch/x86/events/core.c -+++ b/arch/x86/events/core.c -@@ -41,6 +41,7 @@ - #include - #include - #include -+#include - - #include "perf_event.h" - -@@ -252,6 +253,13 @@ bool check_hw_exists(struct pmu *pmu, int num_counters, int num_counters_fixed) - int bios_fail = 0; - int reg_safe = -1; - -+ if(boot_cpu_has(X86_FEATURE_HYPERVISOR) && -+ (boot_cpu_data.x86_model == INTEL_FAM6_ALDERLAKE || -+ boot_cpu_data.x86_model == INTEL_FAM6_ALDERLAKE_L)) { -+ pr_cont("Disabling PMU for VM on ADL.\n"); -+ goto msr_fail; -+ } -+ - /* - * Check to see if the BIOS enabled any of the counters, if so - * complain and bail. --- -2.37.0 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0021-fix-for-static-analysis-issues.patch b/bsp_diff/common/kernel/lts2021-chromium/0021-fix-for-static-analysis-issues.patch deleted file mode 100644 index 4a93d62e28..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0021-fix-for-static-analysis-issues.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 28078a1dc1a29210061460ea479ba5b31a23702a Mon Sep 17 00:00:00 2001 -From: rajucm -Date: Mon, 27 Mar 2023 17:50:31 +0000 -Subject: [PATCH] fix for static analysis issues - -i915 module: avoid double free -btintel module: fix kmalloc validation by using right variable - -Tracked-On: OAM-105549 -Signed-off-by: rajucm ---- - drivers/bluetooth/btintel.c | 2 +- - drivers/gpu/drm/i915/i915_gem.c | 2 -- - 2 files changed, 1 insertion(+), 3 deletions(-) - -diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c -index d2809e4fbe05..322468a2c98f 100644 ---- a/drivers/bluetooth/btintel.c -+++ b/drivers/bluetooth/btintel.c -@@ -2365,7 +2365,7 @@ static int btintel_get_codec_config_data(struct hci_dev *hdev, - } - - *ven_data = kmalloc(sizeof(__u8), GFP_KERNEL); -- if (!*ven_data) { -+ if (*ven_data == NULL) { - err = -ENOMEM; - goto error; - } -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index 58e00a3762f4..519ef337f1a6 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -2167,9 +2167,7 @@ int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file) - kfree(file_priv->process_name); - out_free_file: - put_pid(file_priv->tgid); -- kfree(file_priv); - #endif -- - err_context: - i915_drm_client_put(client); - err_client: --- -2.34.1 - diff --git a/bsp_diff/common/kernel/lts2021-chromium/0023-updating-dummy-cpufreq_frequency_table.patch b/bsp_diff/common/kernel/lts2021-chromium/0023-updating-dummy-cpufreq_frequency_table.patch deleted file mode 100644 index 727ea38d47..0000000000 --- a/bsp_diff/common/kernel/lts2021-chromium/0023-updating-dummy-cpufreq_frequency_table.patch +++ /dev/null @@ -1,40 +0,0 @@ -From f6738fa8d2e8fcbc814d58fc713a148f35995107 Mon Sep 17 00:00:00 2001 -From: raju -Date: Mon, 24 Jul 2023 06:49:43 +0000 -Subject: [PATCH] updating dummy cpufreq_frequency_table - -updating frequency tables that represent the available -CPU frequencies from ADL for scaling the CPU's clock -frequency dynamically. This structure allows the kernel -to manage the CPU's operating frequency based on the system's -workload and power-saving requirements. - -Reference platform (ADL-NUC): -Model name: 12th Gen Intel(R) Core(TM) i7-1260P -CPU min MHz: 400MHz -CPU max MHz: 4700MHz - -Tracked-On: OAM-111324 -Signed-off-by: raju ---- - drivers/cpufreq/dummy-cpufreq.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/cpufreq/dummy-cpufreq.c b/drivers/cpufreq/dummy-cpufreq.c -index e74ef6782e5a..9637280e5f8d 100644 ---- a/drivers/cpufreq/dummy-cpufreq.c -+++ b/drivers/cpufreq/dummy-cpufreq.c -@@ -6,8 +6,8 @@ - #include - - static struct cpufreq_frequency_table freq_table[] = { -- { .frequency = 1 }, -- { .frequency = 2 }, -+ { .frequency = 400000 }, -+ { .frequency = 4700000 }, - { .frequency = CPUFREQ_TABLE_END }, - }; - --- -2.39.2 - From 1ce9b9d612594c2dc00e846f282695a545b2bf08 Mon Sep 17 00:00:00 2001 From: "Wang, Kai Z" Date: Thu, 7 Aug 2025 09:05:52 +0800 Subject: [PATCH 2/2] [DO NOT MERGE] Enable docker Signed-off-by: Wang, Kai Z --- .../0001-Only-keep-docker-binaries.patch | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 bsp_diff/caas/device/intel/mixins/groups/docker/0001-Only-keep-docker-binaries.patch diff --git a/bsp_diff/caas/device/intel/mixins/groups/docker/0001-Only-keep-docker-binaries.patch b/bsp_diff/caas/device/intel/mixins/groups/docker/0001-Only-keep-docker-binaries.patch new file mode 100644 index 0000000000..08b063cb92 --- /dev/null +++ b/bsp_diff/caas/device/intel/mixins/groups/docker/0001-Only-keep-docker-binaries.patch @@ -0,0 +1,157 @@ +From 67bc476da3c4744fef13fc05609e6236de3b8a89 Mon Sep 17 00:00:00 2001 +From: "Wang, Kai Z" +Date: Wed, 2 Jul 2025 22:17:03 +0800 +Subject: [PATCH] Only keep docker binaries. + +Only keep docker binaries. + +Signed-off-by: Ziniu Lin +Signed-off-by: Deng, Bing +--- + true/AndroidBoard.mk | 104 ------------------------------------------- + true/product.mk | 17 ------- + 2 files changed, 121 deletions(-) + +diff --git a/true/AndroidBoard.mk b/true/AndroidBoard.mk +index 1a0cdf9..9ac4de5 100644 +--- a/true/AndroidBoard.mk ++++ b/true/AndroidBoard.mk +@@ -2,107 +2,3 @@ DOCKERD_ENV_RESOLV_CONF := $(PRODUCT_OUT)/system/etc/resolv.conf + $(DOCKERD_ENV_RESOLV_CONF): + @ln -sf /data/vendor/docker/etc/resolv.conf $(PRODUCT_OUT)/system/etc/resolv.conf + $(PRODUCT_OUT)/system.img: $(DOCKERD_ENV_RESOLV_CONF) +- +-LIC_COMMON_SOURCE := $(PRODUCT_OUT)/vendor/etc/docker/common.tar +-LIC_COMMON_SRC_FILES := $(shell find $(TOP)/vendor/intel/linux-in-container/common/ -type f) +-$(LIC_COMMON_SOURCE): $(LIC_COMMON_SRC_FILES) +- @mkdir -p $(PRODUCT_OUT)/vendor/etc/docker +-ifneq ($(wildcard $(TOP)/vendor/intel/linux-in-container/common),) +- @tar --exclude .git -cf $(PRODUCT_OUT)/vendor/etc/docker/common.tar -C $(TOP)/vendor/intel/linux-in-container/common . +-endif +- +-$(PRODUCT_OUT)/vendor.img: $(LIC_COMMON_SOURCE) +- +-LCS_IMAGE_SOURCE := $(PRODUCT_OUT)/vendor/etc/docker/lcs.tar +-$(LCS_IMAGE_SOURCE): +- @mkdir -p $(PRODUCT_OUT)/vendor/etc/docker +-ifneq ($(wildcard $(TOP)/vendor/intel/linux-in-container/linux-container-screencast),) +- @tar --exclude .git -cf $(PRODUCT_OUT)/vendor/etc/docker/lcs.tar -C $(TOP)/vendor/intel/linux-in-container/linux-container-screencast . +-endif +- +-$(PRODUCT_OUT)/vendor.img: $(LCS_IMAGE_SOURCE) +- +-BUILDIN_DOCKER_IMAGE ?= false +-USE_CUSTOM_SOURCES_LIST ?= false +-USE_CUSTOM_BASE_IMAGE ?= false +-CUSTOM_BASE_IMAGE ?= "cache-registry.caas.intel.com/cache/library/ubuntu:22.04" +-LIC_RESOURCES_FILES := $(shell find $(TOP)/vendor/intel/linux-in-container/gamecore -type f) +-LIC_AICORE_FILES := $(shell find $(TOP)/vendor/intel/linux-in-container/aicore -type f) +- +-.PHONY: lic_resources +-lic_resources: $(LIC_RESOURCES_FILES) $(LIC_AICORE_FILES) +- @mkdir -p $(PRODUCT_OUT)/vendor/etc/docker +-ifneq ($(wildcard $(TOP)/vendor/intel/linux-in-container/gamecore),) +- @tar --exclude .git -cf $(PRODUCT_OUT)/vendor/etc/docker/gamecore.tar -C $(TOP)/vendor/intel/linux-in-container/gamecore . +-endif +-ifneq ($(wildcard $(TOP)/vendor/intel/linux-in-container/aicore),) +- @tar --exclude .git -cf $(PRODUCT_OUT)/vendor/etc/docker/aicore.tar -C $(TOP)/vendor/intel/linux-in-container/aicore . +-endif +- +-define lic_base_build +- @docker rmi -f $(2):$(3) || true +- @DOCKER_BUILDKIT=0 docker build --no-cache --build-arg http_proxy=$(http_proxy) --build-arg https_proxy=$(https_proxy) --build-arg no_proxy=$(no_proxy) --build-arg USE_CUSTOM_SOURCES_LIST=$(USE_CUSTOM_SOURCES_LIST) $(if $(USE_CUSTOM_BASE_IMAGE),--build-arg BASE_IMAGE=$(CUSTOM_BASE_IMAGE)) -f $(1)/Dockerfile.base -t $(2):$(3) $(1) +-endef +- +-define lic_build +- @mkdir -p $(2) +- @cp $(1)/TAG $(2) +- @DOCKER_BUILDKIT=0 docker build --build-arg http_proxy=$(http_proxy) --build-arg https_proxy=$(https_proxy) --build-arg no_proxy=$(no_proxy) -t $(3):$(4) $(1) +- @docker save $(3):$(4) | gzip > $(2)/$(3).tar.gz +- @docker rmi $(3):$(4) +- @docker rmi $(5):$(6) +-endef +- +-GAMECORE_VERSION := $(shell cat $(TOP)/vendor/intel/linux-in-container/gamecore/TAG) +-GAMECORE_BASE_VERSION := $(shell cat $(TOP)/vendor/intel/linux-in-container/gamecore/BASE_TAG) +-AICORE_VERSION := $(shell cat $(TOP)/vendor/intel/linux-in-container/aicore/TAG) +-AICORE_BASE_VERSION := $(shell cat $(TOP)/vendor/intel/linux-in-container/aicore/BASE_TAG) +- +-.PHONY: lic +-lic: .KATI_NINJA_POOL := console +-lic: +- @rm -rf $(PRODUCT_OUT)/docker/lic/gamecore +- @mkdir -p $(PRODUCT_OUT)/docker/lic/gamecore +- @cp -r $(TOP)/vendor/intel/linux-in-container/gamecore/* $(TOP)/vendor/intel/linux-in-container/gamecore/.* $(TOP)/vendor/intel/linux-in-container/common/* $(PRODUCT_OUT)/docker/lic/gamecore +- @rm -rf $(PRODUCT_OUT)/docker/lic/aicore +- @mkdir -p $(PRODUCT_OUT)/docker/lic/aicore +- @cp -r $(TOP)/vendor/intel/linux-in-container/aicore/* $(TOP)/vendor/intel/linux-in-container/common/* $(PRODUCT_OUT)/docker/lic/aicore +- $(call lic_base_build,$(PRODUCT_OUT)/docker/lic/gamecore,gamecore-base,$(GAMECORE_BASE_VERSION)) +- $(call lic_build,$(PRODUCT_OUT)/docker/lic/gamecore,$(PRODUCT_OUT)/vendor/etc/docker/image/gamecore,gamecore,$(GAMECORE_VERSION),gamecore-base,$(GAMECORE_BASE_VERSION)) +- $(call lic_base_build,$(PRODUCT_OUT)/docker/lic/aicore,aicore-base,$(AICORE_BASE_VERSION)) +- $(call lic_build,$(PRODUCT_OUT)/docker/lic/aicore,$(PRODUCT_OUT)/vendor/etc/docker/image/aicore,aicore,$(AICORE_VERSION),aicore-base,$(AICORE_BASE_VERSION)) +- +-BUILDIN_DOCKER_LCS_IMAGE ?= false +- +-LCS_VERSION := $(shell cat $(TOP)/vendor/intel/linux-in-container/linux-container-screencast/TAG) +- +-.PHONY: lcs +-lcs: .KATI_NINJA_POOL := console +-lcs: +- @rm -rf $(PRODUCT_OUT)/docker/lic/linux-container-screencast +- @mkdir -p $(PRODUCT_OUT)/docker/lic/linux-container-screencast +- @cp -r $(TOP)/vendor/intel/linux-in-container/linux-container-screencast/* $(TOP)/vendor/intel/linux-in-container/linux-container-screencast/.* $(PRODUCT_OUT)/docker/lic/linux-container-screencast +- @cp -r $(TOP)/vendor/intel/linux-in-container/common/* $(TOP)/vendor/intel/linux-in-container/common/.* $(PRODUCT_OUT)/docker/lic/linux-container-screencast +- $(call lcs_build,$(PRODUCT_OUT)/docker/lic/linux-container-screencast,$(PRODUCT_OUT)/vendor/etc/docker/image/lcs,lcs,$(LCS_VERSION)) +- +-define lcs_build +- @mkdir -p $(2) +- @cp $(1)/TAG $(2) +- @DOCKER_BUILDKIT=0 docker build --network=host --build-arg http_proxy=$(http_proxy) --build-arg https_proxy=$(https_proxy) --build-arg no_proxy=$(no_proxy) -t $(3):$(4) $(1) +- @docker save $(3):$(4) | gzip > $(2)/$(3).tar.gz +- @docker rmi $(3):$(4) +-endef +- +-ifeq ($(BUILDIN_DOCKER_IMAGE),true) +-ifeq ($(BUILDIN_DOCKER_LCS_IMAGE),true) +-$(PRODUCT_OUT)/vendor.img: lic lcs lic_resources +-else +-$(PRODUCT_OUT)/vendor.img: lic lic_resources +-endif +-else +-ifeq ($(BUILDIN_DOCKER_LCS_IMAGE),true) +-$(PRODUCT_OUT)/vendor.img: lcs lic_resources +-else +-$(PRODUCT_OUT)/vendor.img: lic_resources +-endif +-endif +diff --git a/true/product.mk b/true/product.mk +index 3dc0107..8856a8d 100644 +--- a/true/product.mk ++++ b/true/product.mk +@@ -17,23 +17,6 @@ PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/{{_extra_dir}}/ota.ini:/vendor/etc/docker/config/ota.ini \ + $(LOCAL_PATH)/{{_extra_dir}}/ntfs-3g:/vendor/bin/ntfs-3g + +- +-PRODUCT_PACKAGES += sumClientInAndroid \ +- multiplyServiceInAndroid \ +- multiplyClientInAndroid \ +- subtractServiceApplicationInAndroid \ +- SharedBufferServiceInAndroid \ +- SharedBufferClientInAndroid \ +- sumRpcClientInAndroid \ +- subtractRpcServiceInAndroid \ +- LIC \ +- liblic \ +- libremoteio \ +- ContainerManager \ +- libstreamingbindersdk \ +- libaaudiosdk \ +- acrn-virtio-gpu-lcs +- + PRODUCT_PROPERTY_OVERRIDES += \ + vendor.nn.hal.grpc_socket_path=/data/vendor/neuralnetworks/ai.socket \ + persist.vendor.lic.device=/dev/dri/renderD129 \ +-- +2.34.1 +