Merge 6ea403acf3 on remote branch

Change-Id: I3260ca7f1fde5aa917062aedb6a80e4b2607c92e
This commit is contained in:
Linux Build Service Account 2025-01-12 10:19:49 -08:00
commit 0072909788
7 changed files with 103 additions and 13 deletions

View file

@ -216,7 +216,14 @@ CONFIG_HID_WIIMOTE=y
CONFIG_USB_DUMMY_HCD=y
CONFIG_USB_CONFIGFS_ACM=y
# CONFIG_USB_CONFIGFS_RNDIS is not set
CONFIG_USB_CONFIGFS_F_UVC=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_VIDEOBUF2_VMALLOC=y
CONFIG_USB_F_UVC=y
CONFIG_USB_G_WEBCAM=m
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_F_UVC=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EROFS_FS=y
# CONFIG_SERIAL_MSM_GENI_EARLY_CONSOLE is not set

View file

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@ -1552,7 +1553,6 @@ static int npu_set_fw_state(struct npu_client *client, uint32_t enable)
if (host_ctx->network_num > 0) {
pr_err("Need to unload network first\n");
mutex_unlock(&npu_dev->dev_lock);
return -EINVAL;
}

View file

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@ -1593,6 +1594,13 @@ int32_t npu_host_unload_network(struct npu_client *client,
return -EINVAL;
}
if (network->is_unloading) {
pr_err("network is unloading\n");
network_put(network);
mutex_unlock(&host_ctx->lock);
return -EINVAL;
}
if (!network->is_active) {
pr_err("network is not active\n");
network_put(network);
@ -1600,10 +1608,18 @@ int32_t npu_host_unload_network(struct npu_client *client,
return -EINVAL;
}
if (network->is_executing) {
pr_err("network is in execution\n");
network_put(network);
mutex_unlock(&host_ctx->lock);
return -EINVAL;
}
if (network->fw_error) {
pr_err("fw in error state, skip unload network in fw\n");
goto free_network;
}
network->is_unloading = true;
pr_debug("Unload network %lld\n", network->id);
/* prepare IPC packet for UNLOAD */
@ -1832,12 +1848,24 @@ int32_t npu_host_exec_network_v2(struct npu_client *client,
if (atomic_inc_return(&host_ctx->network_execute_cnt) == 1)
npu_notify_cdsprm_cxlimit_activity(npu_dev, true);
if (network->is_unloading) {
pr_err("network is unloading\n");
ret = -EINVAL;
goto exec_v2_done;
}
if (!network->is_active) {
pr_err("network is not active\n");
ret = -EINVAL;
goto exec_v2_done;
}
if (network->is_executing) {
pr_err("network is already in execution\n");
ret = -EINVAL;
goto exec_v2_done;
}
if (network->fw_error) {
pr_err("fw is in error state\n");
ret = -EIO;
@ -1855,6 +1883,7 @@ int32_t npu_host_exec_network_v2(struct npu_client *client,
goto exec_v2_done;
}
network->is_executing = true;
for (i = 0; i < num_patch_params; i++) {
exec_packet->patch_params[i].id = patch_buf_info[i].buf_id;
pr_debug("%d: patch_id: %x\n", i,
@ -1936,6 +1965,7 @@ int32_t npu_host_exec_network_v2(struct npu_client *client,
free_exec_packet:
kfree(exec_packet);
network->is_executing = false;
exec_v2_done:
network_put(network);
mutex_unlock(&host_ctx->lock);

View file

@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef _NPU_MGR_H
@ -52,6 +53,8 @@ struct npu_network {
atomic_t ref_cnt;
bool is_valid;
bool is_active;
bool is_unloading;
bool is_executing;
bool fw_error;
bool cmd_pending;
bool cmd_async;

View file

@ -735,6 +735,7 @@ struct dwc3_ep_events {
* @desc: usb_endpoint_descriptor pointer
* @dwc: pointer to DWC controller
* @saved_state: ep state saved during hibernation
* @missed_isoc_packets: counter for missed packets sent
* @flags: endpoint flags (wedged, stalled, ...)
* @number: endpoint number (1 - 15)
* @type: set to bmAttributes & USB_ENDPOINT_XFERTYPE_MASK
@ -768,6 +769,7 @@ struct dwc3_ep {
struct dwc3 *dwc;
u32 saved_state;
u32 missed_isoc_packets;
unsigned flags;
#define DWC3_EP_ENABLED BIT(0)
#define DWC3_EP_STALL BIT(1)

View file

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include "debug.h"
@ -150,10 +151,11 @@ void dwc3_dbg_dma_unmap(struct dwc3 *dwc, u8 ep_num, struct dwc3_request *req)
req->trb->ctrl & DWC3_TRB_CTRL_HWO);
} else {
ipc_log_string(dwc->dwc_dma_ipc_log_ctxt,
"%02X-%-3.3s %-25.25s 0x%pK 0x%lx %u 0x%lx %d",
"%02X-%-3.3s %-25.25s 0x%pK 0x%lx %u 0x%lx %d %u",
ep_num >> 1, ep_num & 1 ? "IN":"OUT", "UNMAP",
&req->request, req->request.dma, req->request.length,
req->trb_dma, req->trb->ctrl & DWC3_TRB_CTRL_HWO);
req->trb_dma, req->trb->ctrl & DWC3_TRB_CTRL_HWO,
req->request.actual);
}
}

View file

@ -30,6 +30,8 @@
#define DWC3_ALIGN_FRAME(d, n) (((d)->frame_number + ((d)->interval * (n))) \
& ~((d)->interval - 1))
#define DWC3_FRAME_WRAP_AROUND_MASK (BIT(14) | BIT(15))
static int __dwc3_gadget_start(struct dwc3 *dwc);
static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc);
static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc, bool remote_wakeup);
@ -228,6 +230,11 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc, struct dwc3_ep *dep)
&& dwc3_is_usb31(dwc))
mult = 6;
if ((dep->endpoint.maxburst > 6) &&
usb_endpoint_xfer_isoc(dep->endpoint.desc))
mult = 6;
tmp = ((max_packet + mdwidth) * mult) + mdwidth;
fifo_size = DIV_ROUND_UP(tmp, mdwidth);
dep->fifo_depth = fifo_size;
@ -309,6 +316,12 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
dwc3_gadget_del_and_unmap_request(dep, req, status);
req->status = DWC3_REQUEST_STATUS_COMPLETED;
if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
(list_empty(&dep->started_list))) {
dep->flags |= DWC3_EP_PENDING_REQUEST;
dbg_event(dep->number, "STARTEDLISTEMPTY", 0);
}
spin_unlock(&dwc->lock);
usb_gadget_giveback_request(&dep->endpoint, &req->request);
spin_lock(&dwc->lock);
@ -984,6 +997,8 @@ static int dwc3_gadget_ep_disable(struct usb_ep *ep)
spin_lock_irqsave(&dwc->lock, flags);
ret = __dwc3_gadget_ep_disable(dep);
dbg_event(dep->number, "DISABLE", ret);
dbg_event(dep->number, "MISSEDISOCPKTS", dep->missed_isoc_packets);
dep->missed_isoc_packets = 0;
spin_unlock_irqrestore(&dwc->lock, flags);
return ret;
@ -1644,7 +1659,7 @@ static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
{
struct dwc3 *dwc = dep->dwc;
int ret;
int i;
u16 wraparound_bits, uf;
if (list_empty(&dep->pending_list)) {
dep->flags |= DWC3_EP_PENDING_REQUEST;
@ -1661,12 +1676,36 @@ static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
return dwc3_gadget_start_isoc_quirk(dep);
}
for (i = 0; i < DWC3_ISOC_MAX_RETRIES; i++) {
dep->frame_number = DWC3_ALIGN_FRAME(dep, i + 1);
wraparound_bits = dep->frame_number & DWC3_FRAME_WRAP_AROUND_MASK;
uf = dep->frame_number & ~DWC3_FRAME_WRAP_AROUND_MASK;
ret = __dwc3_gadget_kick_transfer(dep);
if (ret != -EAGAIN)
break;
/* if frame wrapped-around update wrap-around bits to reflect that */
if (__dwc3_gadget_get_frame(dep->dwc) < uf)
wraparound_bits += BIT(14);
uf = __dwc3_gadget_get_frame(dep->dwc) + max_t(u32, 16, 2 * dep->interval);
/* align frame number to ep interval */
dep->frame_number = (wraparound_bits + uf) & ~(dep->interval - 1);
ret = __dwc3_gadget_kick_transfer(dep);
if (ret == -EAGAIN) {
struct dwc3_gadget_ep_cmd_params params;
u32 cmd;
dwc3_gadget_ep_get_transfer_index(dep);
dep->flags |= DWC3_EP_PENDING_REQUEST;
cmd = DWC3_DEPCMD_ENDTRANSFER |
DWC3_DEPCMD_CMDIOC |
DWC3_DEPCMD_PARAM(dep->resource_index);
dep->resource_index = 0;
memset(&params, 0, sizeof(params));
ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
if (!ret)
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
}
return ret;
@ -1728,8 +1767,10 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
if ((dep->flags & DWC3_EP_PENDING_REQUEST)) {
if (!(dep->flags & DWC3_EP_TRANSFER_STARTED)) {
dep->flags &= ~DWC3_EP_PENDING_REQUEST;
return __dwc3_gadget_start_isoc(dep);
}
return 0;
}
}
@ -3399,14 +3440,19 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
if (event->status & DEPEVT_STATUS_BUSERR)
status = -ECONNRESET;
dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
if (event->status & DEPEVT_STATUS_MISSED_ISOC) {
status = -EXDEV;
if (list_empty(&dep->started_list))
stop = true;
dep->missed_isoc_packets++;
dbg_event(dep->number, "MISSEDISOC", dep->missed_isoc_packets);
}
dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
(list_empty(&dep->started_list))) {
stop = true;
dbg_event(dep->number, "STOPXFER", dep->frame_number);
}
if (dep->flags & DWC3_EP_END_TRANSFER_PENDING)
goto out;