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:
Michael Bestas 2023-11-09 14:42:07 +02:00
commit 51fc2f7bdb
No known key found for this signature in database
GPG key ID: CC95044519BE6669
11 changed files with 90 additions and 33 deletions

View file

@ -462,8 +462,6 @@ CONFIG_HID_MICROSOFT=y
CONFIG_HID_MULTITOUCH=y
CONFIG_HID_NINTENDO=y
CONFIG_HID_PLANTRONICS=y
CONFIG_HID_PLAYSTATION=y
CONFIG_PLAYSTATION_FF=y
CONFIG_HID_SONY=y
CONFIG_SONY_FF=y
CONFIG_HID_QVR=y

View file

@ -478,8 +478,6 @@ CONFIG_HID_MICROSOFT=y
CONFIG_HID_MULTITOUCH=y
CONFIG_HID_NINTENDO=y
CONFIG_HID_PLANTRONICS=y
CONFIG_HID_PLAYSTATION=y
CONFIG_PLAYSTATION_FF=y
CONFIG_HID_SONY=y
CONFIG_SONY_FF=y
CONFIG_HID_QVR=y

View file

@ -2133,11 +2133,11 @@ static void handle_bad_sector(struct bio *bio, sector_t maxsector)
{
char b[BDEVNAME_SIZE];
printk(KERN_INFO "attempt to access beyond end of device\n");
printk(KERN_INFO "%s: rw=%d, want=%Lu, limit=%Lu\n",
bio_devname(bio, b), bio->bi_opf,
(unsigned long long)bio_end_sector(bio),
(long long)maxsector);
pr_info_ratelimited("attempt to access beyond end of device\n"
"%s: rw=%d, want=%Lu, limit=%Lu\n",
bio_devname(bio, b), bio->bi_opf,
(unsigned long long)bio_end_sector(bio),
(long long)maxsector);
}
#ifdef CONFIG_FAIL_MAKE_REQUEST

View file

@ -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 rxport_num = 0;
uint16_t reg;
uint8_t prev_reg_val = 0;
BTFMSLIM_DBG("port(%d) enable(%d)", port_num, enable);
if (rxport) {
BTFMSLIM_DBG("sample rate is %d", btfmslim->sample_rate);
if (enable &&
btfmslim->sample_rate != 44100 &&
btfmslim->sample_rate != 88200) {
BTFMSLIM_DBG("setting multichannel bit");
if (enable) {
/* For SCO Rx, A2DP Rx other than 44.1 and 88.2Khz */
if (port_num < 24) {
rxport_num = port_num - 16;
@ -102,6 +100,21 @@ int btfm_slim_slave_enable_port(struct btfmslim *btfmslim, uint8_t port_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)",
reg_val, reg);
ret = btfm_slim_write(btfmslim, reg, 1, &reg_val, IFD);

View file

@ -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)
{
/* 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;
/* validate SAT IPC version */

View file

@ -2129,6 +2129,10 @@ long kgsl_ioctl_gpu_aux_command(struct kgsl_device_private *dev_priv,
if (!(param->flags & KGSL_GPU_AUX_COMMAND_TIMELINE))
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);
if (!context)
return -EINVAL;

View file

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* 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>
@ -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,
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) &&
((gpuaddr + size) > pt->compat_va_start &&
(gpuaddr + size) <= pt->compat_va_end))
(end > pt->compat_va_start && end <= pt->compat_va_end))
return true;
if ((gpuaddr >= pt->svm_start && gpuaddr < pt->svm_end) &&
((gpuaddr + size) > pt->svm_start &&
(gpuaddr + size) <= pt->svm_end))
(end > pt->svm_start && end <= pt->svm_end))
return true;
return false;

View file

@ -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_LVL_IDX(iova, MAP_STATE_LVL,
data);
arm_lpae_init_pte(
ret = arm_lpae_init_pte(
data, iova, phys, prot, MAP_STATE_LVL,
ptep, ms.prev_pgtable, false);
if (ret)
goto out_err;
ms.num_pte++;
} else {
ret = __arm_lpae_map(data, iova, phys, pgsize,

View file

@ -3,7 +3,7 @@
* QTI Secure Execution Environment Communicator (QSEECOM) driver
*
* 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__
@ -375,7 +375,7 @@ struct qseecom_client_handle {
struct qseecom_listener_handle {
u32 id;
bool unregister_pending;
bool register_pending;
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 *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));
if (ret) {
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))
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);
if (ptr_svc) {
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->sb_length = rcvd_lstnr.sb_size;
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)) {
pr_err("qseecom_set_sb_memory failed for listener %d, size %d\n",
rcvd_lstnr.listener_id, rcvd_lstnr.sb_size);
__qseecom_free_tzbuf(&new_entry->sglistinfo_shm);
kzfree(new_entry);
data->listener.register_pending = false;
return -ENOMEM;
}
data->listener.register_pending = false;
init_waitqueue_head(&new_entry->rcv_req_wq);
init_waitqueue_head(&new_entry->listener_block_app_wq);

View file

@ -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,
unsigned int value)
{
@ -2071,6 +2089,9 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned int event,
break;
case DWC3_CONTROLLER_CONNDONE_EVENT:
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
* interrupt
@ -2195,6 +2216,13 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned int event,
break;
case DWC3_CONTROLLER_NOTIFY_CLEAR_DB:
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)
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",
__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,
PWR_EVNT_POWERDOWN_IN_P3_MASK, 1);

View file

@ -2499,8 +2499,11 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
/* prevent pending bh to run later */
flush_work(&dwc->bh_work);
if (is_on)
dwc3_device_core_soft_reset(dwc);
if (is_on) {
ret = dwc3_device_core_soft_reset(dwc);
if (ret != 0)
goto done;
}
spin_lock_irqsave(&dwc->lock, flags);
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);
done:
pm_runtime_mark_last_busy(dwc->dev);
pm_runtime_put_autosuspend(dwc->dev);
dbg_event(0xFF, "Pullup put",