Merge tag 'LA.UM.9.12.r1-17400-SMxx50.QSSI13.0' of https://git.codelinaro.org/clo/la/kernel/msm-4.19 into android13-4.19-kona
"LA.UM.9.12.r1-17400-SMxx50.QSSI13.0" * tag 'LA.UM.9.12.r1-17400-SMxx50.QSSI13.0' of https://git.codelinaro.org/clo/la/kernel/msm-4.19: dwc3-msm-core: Remove usage of DWC31_LINK_GDBGLTSSM with POR defconfig: kona: Fix for SonyDualSenseEdge cts failures defconfig: kona: Fix for SonyDualSenseEdge cts failures usb: dwc3-msm-core: Set pipectl susphy in conndone interrupt BACKPORT: bpf: add bpf_ktime_get_boot_ns() bus: mhi: fix potential out-of-bound access usb: dwc3: gadget: Bail out in pullup if soft reset timeout happens msm: kgsl: Limit the syncpoint count for AUX commands msm: kgsl: Prevent wrap around during user address mapping bt: Unset multi channel bit for 44.1/88.2Khz A2DP Rx BACKPORT: bpf: add bpf_ktime_get_boot_ns() iommu: Fix missing return check of arm_lpae_init_pte block: ratelimit handle_bad_sector() message securemsm-kernel: Fix multiple listener registration on same fd Change-Id: I37201afb12aba0a082bdce6acb461839ed3a77b8
This commit is contained in:
@@ -462,8 +462,6 @@ CONFIG_HID_MICROSOFT=y
|
|||||||
CONFIG_HID_MULTITOUCH=y
|
CONFIG_HID_MULTITOUCH=y
|
||||||
CONFIG_HID_NINTENDO=y
|
CONFIG_HID_NINTENDO=y
|
||||||
CONFIG_HID_PLANTRONICS=y
|
CONFIG_HID_PLANTRONICS=y
|
||||||
CONFIG_HID_PLAYSTATION=y
|
|
||||||
CONFIG_PLAYSTATION_FF=y
|
|
||||||
CONFIG_HID_SONY=y
|
CONFIG_HID_SONY=y
|
||||||
CONFIG_SONY_FF=y
|
CONFIG_SONY_FF=y
|
||||||
CONFIG_HID_QVR=y
|
CONFIG_HID_QVR=y
|
||||||
|
|||||||
2
arch/arm64/configs/vendor/kona_defconfig
vendored
2
arch/arm64/configs/vendor/kona_defconfig
vendored
@@ -478,8 +478,6 @@ CONFIG_HID_MICROSOFT=y
|
|||||||
CONFIG_HID_MULTITOUCH=y
|
CONFIG_HID_MULTITOUCH=y
|
||||||
CONFIG_HID_NINTENDO=y
|
CONFIG_HID_NINTENDO=y
|
||||||
CONFIG_HID_PLANTRONICS=y
|
CONFIG_HID_PLANTRONICS=y
|
||||||
CONFIG_HID_PLAYSTATION=y
|
|
||||||
CONFIG_PLAYSTATION_FF=y
|
|
||||||
CONFIG_HID_SONY=y
|
CONFIG_HID_SONY=y
|
||||||
CONFIG_SONY_FF=y
|
CONFIG_SONY_FF=y
|
||||||
CONFIG_HID_QVR=y
|
CONFIG_HID_QVR=y
|
||||||
|
|||||||
@@ -2133,8 +2133,8 @@ static void handle_bad_sector(struct bio *bio, sector_t maxsector)
|
|||||||
{
|
{
|
||||||
char b[BDEVNAME_SIZE];
|
char b[BDEVNAME_SIZE];
|
||||||
|
|
||||||
printk(KERN_INFO "attempt to access beyond end of device\n");
|
pr_info_ratelimited("attempt to access beyond end of device\n"
|
||||||
printk(KERN_INFO "%s: rw=%d, want=%Lu, limit=%Lu\n",
|
"%s: rw=%d, want=%Lu, limit=%Lu\n",
|
||||||
bio_devname(bio, b), bio->bi_opf,
|
bio_devname(bio, b), bio->bi_opf,
|
||||||
(unsigned long long)bio_end_sector(bio),
|
(unsigned long long)bio_end_sector(bio),
|
||||||
(long long)maxsector);
|
(long long)maxsector);
|
||||||
|
|||||||
@@ -81,14 +81,12 @@ int btfm_slim_slave_enable_port(struct btfmslim *btfmslim, uint8_t port_num,
|
|||||||
uint8_t reg_val = 0, en;
|
uint8_t reg_val = 0, en;
|
||||||
uint8_t rxport_num = 0;
|
uint8_t rxport_num = 0;
|
||||||
uint16_t reg;
|
uint16_t reg;
|
||||||
|
uint8_t prev_reg_val = 0;
|
||||||
|
|
||||||
BTFMSLIM_DBG("port(%d) enable(%d)", port_num, enable);
|
BTFMSLIM_DBG("port(%d) enable(%d)", port_num, enable);
|
||||||
if (rxport) {
|
if (rxport) {
|
||||||
BTFMSLIM_DBG("sample rate is %d", btfmslim->sample_rate);
|
BTFMSLIM_DBG("sample rate is %d", btfmslim->sample_rate);
|
||||||
if (enable &&
|
if (enable) {
|
||||||
btfmslim->sample_rate != 44100 &&
|
|
||||||
btfmslim->sample_rate != 88200) {
|
|
||||||
BTFMSLIM_DBG("setting multichannel bit");
|
|
||||||
/* For SCO Rx, A2DP Rx other than 44.1 and 88.2Khz */
|
/* For SCO Rx, A2DP Rx other than 44.1 and 88.2Khz */
|
||||||
if (port_num < 24) {
|
if (port_num < 24) {
|
||||||
rxport_num = port_num - 16;
|
rxport_num = port_num - 16;
|
||||||
@@ -102,6 +100,21 @@ int btfm_slim_slave_enable_port(struct btfmslim *btfmslim, uint8_t port_num,
|
|||||||
rxport_num);
|
rxport_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (btfmslim->sample_rate == 44100 ||
|
||||||
|
btfmslim->sample_rate == 88200) {
|
||||||
|
BTFMSLIM_DBG("unsetting multichannel bit");
|
||||||
|
ret = btfm_slim_read(btfmslim, reg, 1,
|
||||||
|
&prev_reg_val, IFD);
|
||||||
|
if (ret < 0) {
|
||||||
|
BTFMSLIM_ERR("error %d reading", ret);
|
||||||
|
prev_reg_val = 0;
|
||||||
|
}
|
||||||
|
BTFMSLIM_DBG("prev_reg_val (%d) from reg(%x)",
|
||||||
|
prev_reg_val, reg);
|
||||||
|
reg_val = prev_reg_val & ~reg_val;
|
||||||
|
} else
|
||||||
|
BTFMSLIM_DBG("setting multichannel bit");
|
||||||
|
|
||||||
BTFMSLIM_DBG("writing reg_val (%d) to reg(%x)",
|
BTFMSLIM_DBG("writing reg_val (%d) to reg(%x)",
|
||||||
reg_val, reg);
|
reg_val, reg);
|
||||||
ret = btfm_slim_write(btfmslim, reg, 1, ®_val, IFD);
|
ret = btfm_slim_write(btfmslim, reg, 1, ®_val, IFD);
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ static struct mhi_sat_device *find_sat_dev_by_id(
|
|||||||
static bool mhi_sat_isvalid_header(struct sat_header *hdr, int len)
|
static bool mhi_sat_isvalid_header(struct sat_header *hdr, int len)
|
||||||
{
|
{
|
||||||
/* validate payload size */
|
/* validate payload size */
|
||||||
if (len >= sizeof(*hdr) && (len != hdr->payload_size + sizeof(*hdr)))
|
if (len < sizeof(*hdr) || len != hdr->payload_size + sizeof(*hdr))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* validate SAT IPC version */
|
/* validate SAT IPC version */
|
||||||
|
|||||||
@@ -2129,6 +2129,10 @@ long kgsl_ioctl_gpu_aux_command(struct kgsl_device_private *dev_priv,
|
|||||||
if (!(param->flags & KGSL_GPU_AUX_COMMAND_TIMELINE))
|
if (!(param->flags & KGSL_GPU_AUX_COMMAND_TIMELINE))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if ((param->flags & KGSL_GPU_AUX_COMMAND_SYNC) &&
|
||||||
|
(param->numsyncs > KGSL_MAX_SYNCPOINTS))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
context = kgsl_context_get_owner(dev_priv, param->context_id);
|
context = kgsl_context_get_owner(dev_priv, param->context_id);
|
||||||
if (!context)
|
if (!context)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2011-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2011-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
@@ -2428,14 +2428,18 @@ static uint64_t kgsl_iommu_find_svm_region(struct kgsl_pagetable *pagetable,
|
|||||||
static bool iommu_addr_in_svm_ranges(struct kgsl_iommu_pt *pt,
|
static bool iommu_addr_in_svm_ranges(struct kgsl_iommu_pt *pt,
|
||||||
u64 gpuaddr, u64 size)
|
u64 gpuaddr, u64 size)
|
||||||
{
|
{
|
||||||
|
u64 end = gpuaddr + size;
|
||||||
|
|
||||||
|
/* Make sure size is not zero and we don't wrap around */
|
||||||
|
if (end <= gpuaddr)
|
||||||
|
return false;
|
||||||
|
|
||||||
if ((gpuaddr >= pt->compat_va_start && gpuaddr < pt->compat_va_end) &&
|
if ((gpuaddr >= pt->compat_va_start && gpuaddr < pt->compat_va_end) &&
|
||||||
((gpuaddr + size) > pt->compat_va_start &&
|
(end > pt->compat_va_start && end <= pt->compat_va_end))
|
||||||
(gpuaddr + size) <= pt->compat_va_end))
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ((gpuaddr >= pt->svm_start && gpuaddr < pt->svm_end) &&
|
if ((gpuaddr >= pt->svm_start && gpuaddr < pt->svm_end) &&
|
||||||
((gpuaddr + size) > pt->svm_start &&
|
(end > pt->svm_start && end <= pt->svm_end))
|
||||||
(gpuaddr + size) <= pt->svm_end))
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -670,9 +670,11 @@ static int arm_lpae_map_sg(struct io_pgtable_ops *ops, unsigned long iova,
|
|||||||
arm_lpae_iopte *ptep = ms.pgtable +
|
arm_lpae_iopte *ptep = ms.pgtable +
|
||||||
ARM_LPAE_LVL_IDX(iova, MAP_STATE_LVL,
|
ARM_LPAE_LVL_IDX(iova, MAP_STATE_LVL,
|
||||||
data);
|
data);
|
||||||
arm_lpae_init_pte(
|
ret = arm_lpae_init_pte(
|
||||||
data, iova, phys, prot, MAP_STATE_LVL,
|
data, iova, phys, prot, MAP_STATE_LVL,
|
||||||
ptep, ms.prev_pgtable, false);
|
ptep, ms.prev_pgtable, false);
|
||||||
|
if (ret)
|
||||||
|
goto out_err;
|
||||||
ms.num_pte++;
|
ms.num_pte++;
|
||||||
} else {
|
} else {
|
||||||
ret = __arm_lpae_map(data, iova, phys, pgsize,
|
ret = __arm_lpae_map(data, iova, phys, pgsize,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* QTI Secure Execution Environment Communicator (QSEECOM) driver
|
* QTI Secure Execution Environment Communicator (QSEECOM) driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) "QSEECOM: %s: " fmt, __func__
|
#define pr_fmt(fmt) "QSEECOM: %s: " fmt, __func__
|
||||||
@@ -375,7 +375,7 @@ struct qseecom_client_handle {
|
|||||||
|
|
||||||
struct qseecom_listener_handle {
|
struct qseecom_listener_handle {
|
||||||
u32 id;
|
u32 id;
|
||||||
bool unregister_pending;
|
bool register_pending;
|
||||||
bool release_called;
|
bool release_called;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1525,6 +1525,11 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data,
|
|||||||
struct qseecom_registered_listener_list *new_entry;
|
struct qseecom_registered_listener_list *new_entry;
|
||||||
struct qseecom_registered_listener_list *ptr_svc;
|
struct qseecom_registered_listener_list *ptr_svc;
|
||||||
|
|
||||||
|
if (data->listener.register_pending) {
|
||||||
|
pr_err("Already a listner registration is in process on this FD\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = copy_from_user(&rcvd_lstnr, argp, sizeof(rcvd_lstnr));
|
ret = copy_from_user(&rcvd_lstnr, argp, sizeof(rcvd_lstnr));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("copy_from_user failed\n");
|
pr_err("copy_from_user failed\n");
|
||||||
@@ -1534,6 +1539,13 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data,
|
|||||||
rcvd_lstnr.sb_size))
|
rcvd_lstnr.sb_size))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
ptr_svc = __qseecom_find_svc(data->listener.id);
|
||||||
|
if (ptr_svc) {
|
||||||
|
pr_err("Already a listener registered on this data: lid=%d\n",
|
||||||
|
data->listener.id);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ptr_svc = __qseecom_find_svc(rcvd_lstnr.listener_id);
|
ptr_svc = __qseecom_find_svc(rcvd_lstnr.listener_id);
|
||||||
if (ptr_svc) {
|
if (ptr_svc) {
|
||||||
if (!ptr_svc->unregister_pending) {
|
if (!ptr_svc->unregister_pending) {
|
||||||
@@ -1577,13 +1589,16 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data,
|
|||||||
new_entry->svc.listener_id = rcvd_lstnr.listener_id;
|
new_entry->svc.listener_id = rcvd_lstnr.listener_id;
|
||||||
new_entry->sb_length = rcvd_lstnr.sb_size;
|
new_entry->sb_length = rcvd_lstnr.sb_size;
|
||||||
new_entry->user_virt_sb_base = rcvd_lstnr.virt_sb_base;
|
new_entry->user_virt_sb_base = rcvd_lstnr.virt_sb_base;
|
||||||
|
data->listener.register_pending = true;
|
||||||
if (__qseecom_set_sb_memory(new_entry, data, &rcvd_lstnr)) {
|
if (__qseecom_set_sb_memory(new_entry, data, &rcvd_lstnr)) {
|
||||||
pr_err("qseecom_set_sb_memory failed for listener %d, size %d\n",
|
pr_err("qseecom_set_sb_memory failed for listener %d, size %d\n",
|
||||||
rcvd_lstnr.listener_id, rcvd_lstnr.sb_size);
|
rcvd_lstnr.listener_id, rcvd_lstnr.sb_size);
|
||||||
__qseecom_free_tzbuf(&new_entry->sglistinfo_shm);
|
__qseecom_free_tzbuf(&new_entry->sglistinfo_shm);
|
||||||
kzfree(new_entry);
|
kzfree(new_entry);
|
||||||
|
data->listener.register_pending = false;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
data->listener.register_pending = false;
|
||||||
|
|
||||||
init_waitqueue_head(&new_entry->rcv_req_wq);
|
init_waitqueue_head(&new_entry->rcv_req_wq);
|
||||||
init_waitqueue_head(&new_entry->listener_block_app_wq);
|
init_waitqueue_head(&new_entry->listener_block_app_wq);
|
||||||
|
|||||||
@@ -2006,6 +2006,24 @@ static void dwc3_gsi_event_buf_alloc(struct dwc3 *dwc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dwc3_msm_modify_pipectl(struct dwc3 *dwc, bool set)
|
||||||
|
{
|
||||||
|
struct dwc3_msm *mdwc = dev_get_drvdata(dwc->dev->parent);
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
reg = dwc3_msm_read_reg(mdwc->base, DWC3_GUSB3PIPECTL(0));
|
||||||
|
|
||||||
|
if (set) {
|
||||||
|
if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
|
||||||
|
(dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
|
||||||
|
reg |= DWC3_GUSB3PIPECTL_SUSPHY;
|
||||||
|
} else {
|
||||||
|
reg &= ~(DWC3_GUSB3PIPECTL_SUSPHY);
|
||||||
|
}
|
||||||
|
|
||||||
|
dwc3_msm_write_reg(mdwc->base, DWC3_GUSB3PIPECTL(0), reg);
|
||||||
|
}
|
||||||
|
|
||||||
static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned int event,
|
static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned int event,
|
||||||
unsigned int value)
|
unsigned int value)
|
||||||
{
|
{
|
||||||
@@ -2071,6 +2089,9 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned int event,
|
|||||||
break;
|
break;
|
||||||
case DWC3_CONTROLLER_CONNDONE_EVENT:
|
case DWC3_CONTROLLER_CONNDONE_EVENT:
|
||||||
dev_dbg(mdwc->dev, "DWC3_CONTROLLER_CONNDONE_EVENT received\n");
|
dev_dbg(mdwc->dev, "DWC3_CONTROLLER_CONNDONE_EVENT received\n");
|
||||||
|
|
||||||
|
dwc3_msm_modify_pipectl(dwc, true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add power event if the dbm indicates coming out of L1 by
|
* Add power event if the dbm indicates coming out of L1 by
|
||||||
* interrupt
|
* interrupt
|
||||||
@@ -2195,6 +2216,13 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned int event,
|
|||||||
break;
|
break;
|
||||||
case DWC3_CONTROLLER_NOTIFY_CLEAR_DB:
|
case DWC3_CONTROLLER_NOTIFY_CLEAR_DB:
|
||||||
dev_dbg(mdwc->dev, "DWC3_CONTROLLER_NOTIFY_CLEAR_DB\n");
|
dev_dbg(mdwc->dev, "DWC3_CONTROLLER_NOTIFY_CLEAR_DB\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear the susphy bit here to ensure it is not set during
|
||||||
|
* the course of controller initialisation process.
|
||||||
|
*/
|
||||||
|
dwc3_msm_modify_pipectl(dwc, false);
|
||||||
|
|
||||||
if (!mdwc->gsi_ev_buff)
|
if (!mdwc->gsi_ev_buff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2267,15 +2295,6 @@ static void dwc3_msm_power_collapse_por(struct dwc3_msm *mdwc)
|
|||||||
dev_err(mdwc->dev, "%s: dwc3_core init failed (%d)\n",
|
dev_err(mdwc->dev, "%s: dwc3_core init failed (%d)\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
|
|
||||||
/* Get initial P3 status and enable IN_P3 event */
|
|
||||||
if (dwc3_is_usb31(dwc))
|
|
||||||
val = dwc3_msm_read_reg_field(mdwc->base,
|
|
||||||
DWC31_LINK_GDBGLTSSM,
|
|
||||||
DWC3_GDBGLTSSM_LINKSTATE_MASK);
|
|
||||||
else
|
|
||||||
val = dwc3_msm_read_reg_field(mdwc->base,
|
|
||||||
DWC3_GDBGLTSSM, DWC3_GDBGLTSSM_LINKSTATE_MASK);
|
|
||||||
atomic_set(&mdwc->in_p3, val == DWC3_LINK_STATE_U3);
|
|
||||||
dwc3_msm_write_reg_field(mdwc->base, PWR_EVNT_IRQ_MASK_REG,
|
dwc3_msm_write_reg_field(mdwc->base, PWR_EVNT_IRQ_MASK_REG,
|
||||||
PWR_EVNT_POWERDOWN_IN_P3_MASK, 1);
|
PWR_EVNT_POWERDOWN_IN_P3_MASK, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -2499,8 +2499,11 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
|
|||||||
/* prevent pending bh to run later */
|
/* prevent pending bh to run later */
|
||||||
flush_work(&dwc->bh_work);
|
flush_work(&dwc->bh_work);
|
||||||
|
|
||||||
if (is_on)
|
if (is_on) {
|
||||||
dwc3_device_core_soft_reset(dwc);
|
ret = dwc3_device_core_soft_reset(dwc);
|
||||||
|
if (ret != 0)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&dwc->lock, flags);
|
spin_lock_irqsave(&dwc->lock, flags);
|
||||||
if (dwc->ep0state != EP0_SETUP_PHASE)
|
if (dwc->ep0state != EP0_SETUP_PHASE)
|
||||||
@@ -2529,6 +2532,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
|
|||||||
}
|
}
|
||||||
enable_irq(dwc->irq);
|
enable_irq(dwc->irq);
|
||||||
|
|
||||||
|
done:
|
||||||
pm_runtime_mark_last_busy(dwc->dev);
|
pm_runtime_mark_last_busy(dwc->dev);
|
||||||
pm_runtime_put_autosuspend(dwc->dev);
|
pm_runtime_put_autosuspend(dwc->dev);
|
||||||
dbg_event(0xFF, "Pullup put",
|
dbg_event(0xFF, "Pullup put",
|
||||||
|
|||||||
Reference in New Issue
Block a user