Merge tag 'LA.UM.10.3.r1-01000-sdm845.0' of https://source.codeaurora.org/quic/la/kernel/msm-4.9 into android12-4.9-sdm845

"LA.UM.10.3.r1-01000-sdm845.0"

* tag 'LA.UM.10.3.r1-01000-sdm845.0' of https://source.codeaurora.org/quic/la/kernel/msm-4.9:
  msm: camera: sensor: Add copyright details
  msm: adsprpc: Handle UAF in fastrpc debugfs read
  Input: uinput - avoid FF flush when destroying device
  drm/dp: via debugfs entry node perform power transition
  msm: kgsl: Perform cache flush on the pages obtained using get_user_pages()
  drm/atomic: Remove WARN_ON for invalid plane configuration.
  msm: camera: sensor: Add support for sensor read
  drm/dp: handle power state transitions
  scripts: checkpatch: Allow quicinc.com identity
  arm: dts: msm: regulator change to power up imx334 lc sensor on hp device
  msm: camera: isp: Fix race condition b/w add and apply req
  ion: Fix integer overflow in msm_ion_custom_ioctl
  ipa: Null persistent pointers after free
  drm/msm/dp: read extended dpcd if present
  Makefile: Fix GCC_TOOLCHAIN_DIR prefix for Clang cross compilation
  msm: camera: jpeg: Ensure in/out map entries are within allowed range
  msm-ipa: fix use-after-free of rt_tbl
  diag: Prevent out of bound write while sending dci pkt to remote

Change-Id: I12e95a812e3aca20abaa10ab2c89e453eadb1769
This commit is contained in:
Michael Bestas 2022-03-31 20:16:10 +03:00
commit f5077be5d7
No known key found for this signature in database
GPG key ID: CC95044519BE6669
32 changed files with 728 additions and 73 deletions

View file

@ -294,7 +294,7 @@
eeprom-src = <&eeprom_rear>;
cam_vio-supply = <&camera_vio_ldo>;
cam_vana-supply = <&camera_vana_ldo>;
cam_vdig-supply = <&camera_rear_ldo>;
cam_vdig-supply = <&camera_ldo>;
cam_clk-supply = <&titan_top_gdsc>;
regulator-names = "cam_vio", "cam_vana", "cam_vdig",
"cam_clk";

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -3476,6 +3477,7 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer,
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%s%s%s%s%s\n", single_line, single_line,
single_line, single_line, single_line);
spin_lock(&me->hlock);
hlist_for_each_entry_safe(gmaps, n, &me->maps, hn) {
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%-20d|0x%-18llX|0x%-18X|0x%-20lX\n\n",
@ -3483,18 +3485,21 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer,
(uint32_t)gmaps->size,
gmaps->va);
}
spin_unlock(&me->hlock);
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%-20s|%-20s|%-20s|%-20s\n",
"len", "refs", "raddr", "flags");
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%s%s%s%s%s\n", single_line, single_line,
single_line, single_line, single_line);
spin_lock(&me->hlock);
hlist_for_each_entry_safe(gmaps, n, &me->maps, hn) {
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"0x%-18X|%-20d|%-20lu|%-20u\n",
(uint32_t)gmaps->len, gmaps->refs,
gmaps->raddr, gmaps->flags);
}
spin_unlock(&me->hlock);
} else {
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"\n%s %13s %d\n", "cid", ":", fl->cid);
@ -3544,12 +3549,14 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer,
"%s%s%s%s%s\n",
single_line, single_line, single_line,
single_line, single_line);
mutex_lock(&fl->map_mutex);
hlist_for_each_entry_safe(map, n, &fl->maps, hn) {
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"0x%-20lX|0x%-20llX|0x%-20zu\n\n",
map->va, map->phys,
map->size);
}
mutex_unlock(&fl->map_mutex);
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%-20s|%-20s|%-20s|%-20s\n",
"len", "refs",
@ -3558,23 +3565,27 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer,
"%s%s%s%s%s\n",
single_line, single_line, single_line,
single_line, single_line);
mutex_lock(&fl->map_mutex);
hlist_for_each_entry_safe(map, n, &fl->maps, hn) {
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%-20zu|%-20d|0x%-20lX|%-20d\n\n",
map->len, map->refs, map->raddr,
map->uncached);
}
mutex_unlock(&fl->map_mutex);
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%-20s|%-20s\n", "secure", "attr");
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%s%s%s%s%s\n",
single_line, single_line, single_line,
single_line, single_line);
mutex_lock(&fl->map_mutex);
hlist_for_each_entry_safe(map, n, &fl->maps, hn) {
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%-20d|0x%-20lX\n\n",
map->secure, map->attr);
}
mutex_unlock(&fl->map_mutex);
len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
"%s %d\n\n",
"KERNEL MEMORY ALLOCATION:", 1);

View file

@ -1739,7 +1739,16 @@ static int diag_send_dci_pkt_remote(unsigned char *data, int len, int tag,
write_len += dci_header_size;
*(int *)(buf + write_len) = tag;
write_len += sizeof(int);
memcpy(buf + write_len, data, len);
if ((write_len + len) < DIAG_MDM_BUF_SIZE) {
memcpy(buf + write_len, data, len);
} else {
pr_err("diag: skip writing invalid length packet, token: %d, pkt_len: %d\n",
token, (write_len + len));
spin_lock_irqsave(&driver->dci_mempool_lock, flags);
diagmem_free(driver, buf, dci_ops_tbl[token].mempool);
spin_unlock_irqrestore(&driver->dci_mempool_lock, flags);
return -EAGAIN;
}
write_len += len;
*(buf + write_len) = CONTROL_CHAR; /* End Terminator */
write_len += sizeof(uint8_t);

View file

@ -862,10 +862,10 @@ static int drm_atomic_plane_check(struct drm_plane *plane,
int ret;
/* either *both* CRTC and FB must be set, or neither */
if (WARN_ON(state->crtc && !state->fb)) {
if (state->crtc && !state->fb) {
DRM_DEBUG_ATOMIC("CRTC set but no FB\n");
return -EINVAL;
} else if (WARN_ON(state->fb && !state->crtc)) {
} else if (state->fb && !state->crtc) {
DRM_DEBUG_ATOMIC("FB set but no CRTC\n");
return -EINVAL;
}

View file

@ -411,6 +411,30 @@ int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link)
}
EXPORT_SYMBOL(drm_dp_link_power_down);
int drm_dp_link_power_down_aux_up(struct drm_dp_aux *aux,
struct drm_dp_link *link)
{
u8 value;
int err;
if (link->revision < 0x11)
return 0;
err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
if (err < 0)
return err;
value &= ~DP_SET_POWER_MASK;
value |= DP_SET_POWER_D5;
err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
if (err < 0)
return err;
return 0;
}
EXPORT_SYMBOL(drm_dp_link_power_down_aux_up);
/**
* drm_dp_link_configure() - configure a DisplayPort link
* @aux: DisplayPort AUX channel

View file

@ -25,6 +25,8 @@
#include "sde_connector.h"
#include "dp_display.h"
#include <drm/drm_dp_helper.h>
#define DEBUG_NAME "drm_dp"
struct dp_debug_private {
@ -50,6 +52,13 @@ struct dp_debug_private {
struct work_struct sim_work;
struct dp_debug dp_debug;
struct mutex lock;
struct dp_ctrl *ctrl;
};
enum dpms_mode_status {
DRM_DPMS_ON = 1,
DRM_DPMS_OFF = 2,
DRM_DPMS_SUSPEND = 5,
};
static int dp_debug_get_edid_buf(struct dp_debug_private *debug)
@ -985,6 +994,77 @@ end:
return len;
}
static ssize_t dp_debug_write_dpms(struct file *file,
const char __user *user_buff, size_t count, loff_t *ppos)
{
int dpms_mode;
struct dp_debug_private *debug = file->private_data;
char buf[SZ_8];
size_t len = 0;
enum dpms_mode_status mode_status;
len = min_t(size_t, count, SZ_8-1);
if (copy_from_user(buf, user_buff, len))
goto end;
buf[len] = '\0';
if (kstrtoint(buf, 8, &dpms_mode)) {
pr_err("offset kstrtoint error\n");
return 0;
}
if (!debug->aux || !debug->aux->drm_aux || !debug->panel)
return 0;
pr_info("dpms_mode = %d", dpms_mode);
mode_status = dpms_mode;
switch (mode_status) {
case DRM_DPMS_ON:
drm_dp_link_power_up(debug->aux->drm_aux,
&debug->panel->link_info);
debug->ctrl->link_maintenance(debug->ctrl);
break;
case DRM_DPMS_OFF:
drm_dp_link_power_down(debug->aux->drm_aux,
&debug->panel->link_info);
break;
case DRM_DPMS_SUSPEND:
drm_dp_link_power_down_aux_up(debug->aux->drm_aux,
&debug->panel->link_info);
break;
default:
pr_err("Invalid values\n");
}
end:
return count;
}
static ssize_t dp_debug_read_dpms(struct file *file,
char __user *user_buff, size_t count, loff_t *ppos)
{
u8 value;
int err, len;
char buf[SZ_8];
struct dp_debug_private *debug = file->private_data;
err = drm_dp_dpcd_readb(debug->aux->drm_aux, DP_SET_POWER, &value);
if (err < 0)
return err;
if (*ppos)
return 0;
len += snprintf(buf, SZ_8, "%d\n", value);
len = min_t(size_t, count, len);
if (copy_to_user(user_buff, buf, len))
return -EFAULT;
*ppos += len;
return len;
}
static ssize_t dp_debug_write_dump(struct file *file,
const char __user *user_buff, size_t count, loff_t *ppos)
{
@ -1121,6 +1201,12 @@ static const struct file_operations dump_fops = {
.read = dp_debug_read_dump,
};
static const struct file_operations dpms_mode_fops = {
.open = simple_open,
.write = dp_debug_write_dpms,
.read = dp_debug_read_dpms,
};
static int dp_debug_init(struct dp_debug *dp_debug)
{
int rc = 0;
@ -1260,6 +1346,16 @@ static int dp_debug_init(struct dp_debug *dp_debug)
goto error_remove_dir;
}
file = debugfs_create_file("dpms_mode", 0644, dir,
debug, &dpms_mode_fops);
if (IS_ERR_OR_NULL(file)) {
rc = PTR_ERR(file);
pr_err("[%s] debugfs dpms failed, rc=%d\n",
DEBUG_NAME, rc);
goto error_remove_dir;
}
return 0;
error_remove_dir:
@ -1281,13 +1377,13 @@ static void dp_debug_sim_work(struct work_struct *work)
struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
struct dp_usbpd *usbpd, struct dp_link *link,
struct dp_aux *aux, struct drm_connector **connector,
struct dp_catalog *catalog)
struct dp_catalog *catalog, struct dp_ctrl *ctrl)
{
int rc = 0;
struct dp_debug_private *debug;
struct dp_debug *dp_debug;
if (!dev || !panel || !usbpd || !link || !catalog) {
if (!dev || !panel || !usbpd || !link || !catalog || !ctrl) {
pr_err("invalid input\n");
rc = -EINVAL;
goto error;
@ -1309,6 +1405,7 @@ struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
debug->dev = dev;
debug->connector = connector;
debug->catalog = catalog;
debug->ctrl = ctrl;
dp_debug = &debug->dp_debug;
dp_debug->vdisplay = 0;

View file

@ -19,6 +19,7 @@
#include "dp_link.h"
#include "dp_usbpd.h"
#include "dp_aux.h"
#include "dp_ctrl.h"
/**
* struct dp_debug
@ -56,7 +57,7 @@ struct dp_debug {
struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
struct dp_usbpd *usbpd, struct dp_link *link,
struct dp_aux *aux, struct drm_connector **connector,
struct dp_catalog *catalog);
struct dp_catalog *catalog, struct dp_ctrl *ctrl);
/**
* dp_debug_put()
*

View file

@ -977,7 +977,7 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd,
dp->link, dp->aux, &dp->dp_display.connector,
dp->catalog);
dp->catalog, dp->ctrl);
if (IS_ERR(dp->debug)) {
rc = PTR_ERR(dp->debug);
pr_err("failed to initialize debug, rc = %d\n", rc);
@ -1414,6 +1414,60 @@ static int dp_display_get_modes(struct dp_display *dp,
return ret;
}
int dp_display_set_power(struct drm_connector *connector,
int power_mode, void *disp)
{
struct dp_display *dp = disp;
struct dp_display_private *dp_priv =
container_of(dp, struct dp_display_private, dp_display);
int rc = 0;
if (!dp) {
pr_err("invalid display\n");
return -EINVAL;
}
if (!dp_priv) {
pr_err("invalid display private\n");
return -EINVAL;
}
if (!dp_priv->panel) {
pr_err("invalid link_info\n");
return -EINVAL;
}
if (!dp_priv->aux->drm_aux) {
pr_err("Invalid drm_aux");
return -EINVAL;
}
if (!dp_priv->link) {
pr_err("invalid dp_link\n");
return -EINVAL;
}
switch (power_mode) {
case SDE_MODE_DPMS_STANDBY:
dp_priv->link->power_mode = DRM_MODE_DPMS_STANDBY;
rc = dp_priv->link->psm_config(dp_priv->link,
&dp_priv->panel->link_info, true);
dp_priv->ctrl->push_idle(dp_priv->ctrl);
break;
case SDE_MODE_DPMS_SUSPEND:
dp_priv->link->power_mode = DRM_MODE_DPMS_SUSPEND;
rc = dp_priv->link->psm_config(dp_priv->link,
&dp_priv->panel->link_info, true);
dp_priv->ctrl->push_idle(dp_priv->ctrl);
break;
default:
pr_err("conn %d dpms set to unrecognized mode %d\n",
connector->base.id, power_mode);
break;
}
return rc;
}
static int dp_display_config_hdr(struct dp_display *dp_display,
struct drm_msm_ext_hdr_metadata *hdr)
{

View file

@ -63,4 +63,6 @@ bool dp_connector_mode_needs_full_range(void *display);
bool dp_connector_mode_is_cea_mode(void *display);
enum sde_csc_type dp_connector_get_csc_type(struct drm_connector *conn,
void *data);
int dp_display_set_power(struct drm_connector *connector,
int power_mode, void *display);
#endif /* _DP_DISPLAY_H_ */

View file

@ -17,6 +17,8 @@
#include "dp_link.h"
#include "dp_panel.h"
#include <uapi/drm/drm_mode.h>
enum dynamic_range {
DP_DYNAMIC_RANGE_RGB_VESA = 0x00,
DP_DYNAMIC_RANGE_RGB_CEA = 0x01,
@ -961,9 +963,15 @@ static int dp_link_psm_config(struct dp_link *dp_link,
link = container_of(dp_link, struct dp_link_private, dp_link);
if (enable)
ret = drm_dp_link_power_down(link->aux->drm_aux, link_info);
else
if (enable) {
if (dp_link->power_mode != DRM_MODE_DPMS_STANDBY
&& dp_link->power_mode != DRM_MODE_DPMS_SUSPEND)
ret = drm_dp_link_power_down(link->aux->drm_aux,
link_info);
else
ret = drm_dp_link_power_down_aux_up(link->aux->drm_aux,
link_info);
} else
ret = drm_dp_link_power_up(link->aux->drm_aux, link_info);
if (ret)

View file

@ -109,6 +109,7 @@ static inline char *dp_link_get_test_name(u32 test_requested)
struct dp_link {
u32 sink_request;
u32 test_response;
int power_mode;
struct dp_link_sink_count sink_count;
struct dp_link_test_video test_video;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -22,6 +22,7 @@
#define DP_MAX_DS_PORT_COUNT 1
#define DPRX_FEATURE_ENUMERATION_LIST 0x2210
#define DPRX_EXTENDED_DPCD_FIELD 0x2200
#define VSC_SDP_EXTENSION_FOR_COLORIMETRY_SUPPORTED BIT(3)
#define VSC_EXT_VESA_SDP_SUPPORTED BIT(4)
#define VSC_EXT_VESA_SDP_CHAINING_SUPPORTED BIT(5)
@ -122,8 +123,9 @@ static int dp_panel_read_dpcd(struct dp_panel *dp_panel, bool multi_func)
int rlen, rc = 0;
struct dp_panel_private *panel;
struct drm_dp_link *link_info;
u8 *dpcd, rx_feature;
u32 dfp_count = 0;
struct drm_dp_aux *drm_aux;
u8 *dpcd, rx_feature, temp;
u32 dfp_count = 0, offset = DP_DPCD_REV;
unsigned long caps = DP_LINK_CAP_ENHANCED_FRAMING;
if (!dp_panel) {
@ -135,44 +137,64 @@ static int dp_panel_read_dpcd(struct dp_panel *dp_panel, bool multi_func)
dpcd = dp_panel->dpcd;
panel = container_of(dp_panel, struct dp_panel_private, dp_panel);
drm_aux = panel->aux->drm_aux;
link_info = &dp_panel->link_info;
if (!panel->custom_dpcd) {
rlen = drm_dp_dpcd_read(panel->aux->drm_aux, DP_DPCD_REV,
dp_panel->dpcd, (DP_RECEIVER_CAP_SIZE + 1));
if (rlen < (DP_RECEIVER_CAP_SIZE + 1)) {
pr_err("dpcd read failed, rlen=%d\n", rlen);
if (rlen == -ETIMEDOUT)
rc = rlen;
else
rc = -EINVAL;
/* reset vsc data */
panel->vsc_supported = false;
panel->vscext_supported = false;
panel->vscext_chaining_supported = false;
goto end;
}
if (panel->custom_dpcd) {
pr_debug("skip dpcd read in debug mode\n");
goto skip_dpcd_read;
}
rlen = drm_dp_dpcd_read(drm_aux, DP_TRAINING_AUX_RD_INTERVAL, &temp, 1);
if (rlen != 1) {
pr_err("error reading DP_TRAINING_AUX_RD_INTERVAL\n");
rc = -EINVAL;
goto end;
}
/* check for EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT */
if (temp & BIT(7)) {
pr_debug("using EXTENDED_RECEIVER_CAPABILITY_FIELD\n");
offset = DPRX_EXTENDED_DPCD_FIELD;
}
rlen = drm_dp_dpcd_read(drm_aux, offset,
dp_panel->dpcd, (DP_RECEIVER_CAP_SIZE + 1));
if (rlen < (DP_RECEIVER_CAP_SIZE + 1)) {
pr_err("dpcd read failed, rlen=%d\n", rlen);
if (rlen == -ETIMEDOUT)
rc = rlen;
else
rc = -EINVAL;
goto end;
}
print_hex_dump(KERN_DEBUG, "[drm-dp] SINK DPCD: ",
DUMP_PREFIX_NONE, 8, 1, dp_panel->dpcd, rlen, false);
rlen = drm_dp_dpcd_read(panel->aux->drm_aux,
DPRX_FEATURE_ENUMERATION_LIST, &rx_feature, 1);
if (rlen != 1) {
pr_debug("failed to read DPRX_FEATURE_ENUMERATION_LIST\n");
panel->vsc_supported = false;
panel->vscext_supported = false;
panel->vscext_chaining_supported = false;
} else {
panel->vsc_supported = !!(rx_feature &
VSC_SDP_EXTENSION_FOR_COLORIMETRY_SUPPORTED);
panel->vscext_supported = !!(rx_feature &
VSC_EXT_VESA_SDP_SUPPORTED);
panel->vscext_chaining_supported = !!(rx_feature &
VSC_EXT_VESA_SDP_CHAINING_SUPPORTED);
goto skip_dpcd_read;
}
panel->vsc_supported = !!(rx_feature &
VSC_SDP_EXTENSION_FOR_COLORIMETRY_SUPPORTED);
panel->vscext_supported = !!(rx_feature & VSC_EXT_VESA_SDP_SUPPORTED);
panel->vscext_chaining_supported = !!(rx_feature &
VSC_EXT_VESA_SDP_CHAINING_SUPPORTED);
pr_debug("vsc=%d, vscext=%d, vscext_chaining=%d\n",
panel->vsc_supported, panel->vscext_supported,
panel->vscext_chaining_supported);
skip_dpcd_read:
link_info->revision = dp_panel->dpcd[DP_DPCD_REV];
panel->major = (link_info->revision >> 4) & 0x0f;
@ -271,6 +293,7 @@ static int dp_panel_set_edid(struct dp_panel *dp_panel, u8 *edid,
panel->custom_edid = false;
}
pr_debug("%d\n", panel->custom_edid);
return 0;
}
@ -295,6 +318,8 @@ static int dp_panel_set_dpcd(struct dp_panel *dp_panel, u8 *dpcd)
panel->custom_dpcd = false;
}
pr_debug("%d\n", panel->custom_dpcd);
return 0;
}

View file

@ -1314,6 +1314,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
.get_info = dp_connector_get_info,
.get_mode_info = dp_connector_get_mode_info,
.post_open = dp_connector_post_open,
.set_power = dp_display_set_power,
.check_status = NULL,
.config_hdr = dp_connector_config_hdr,
.cmd_transfer = NULL,

View file

@ -1,4 +1,5 @@
/* Copyright (c) 2008-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -2179,6 +2180,15 @@ static int memdesc_sg_virt(struct kgsl_memdesc *memdesc, unsigned long useraddr)
ret = sg_alloc_table_from_pages(memdesc->sgt, pages, npages,
0, memdesc->size, GFP_KERNEL);
if (ret)
goto out;
ret = kgsl_cache_range_op(memdesc, 0, memdesc->size,
KGSL_CACHE_OP_FLUSH);
if (ret)
sg_free_table(memdesc->sgt);
out:
if (ret) {
for (i = 0; i < npages; i++)

View file

@ -124,6 +124,24 @@ static void __cam_isp_ctx_dump_state_monitor_array(
}
}
static int __cam_isp_ctx_dequeue_request(struct cam_context *ctx,
struct cam_ctx_request *req)
{
struct cam_ctx_request *req_current;
struct cam_ctx_request *req_prev;
spin_lock_bh(&ctx->lock);
list_for_each_entry_safe_reverse(req_current, req_prev,
&ctx->pending_req_list, list) {
if (req->request_id == req_current->request_id) {
list_del_init(&req_current->list);
break;
}
}
spin_unlock_bh(&ctx->lock);
return 0;
}
static int __cam_isp_ctx_enqueue_request_in_order(
struct cam_context *ctx, struct cam_ctx_request *req)
{
@ -2193,13 +2211,12 @@ static int __cam_isp_ctx_config_dev_in_top_state(
add_req.dev_hdl = ctx->dev_hdl;
add_req.req_id = req->request_id;
add_req.skip_before_applying = 0;
__cam_isp_ctx_enqueue_request_in_order(ctx, req);
rc = ctx->ctx_crm_intf->add_req(&add_req);
if (rc) {
CAM_ERR(CAM_ISP, "Add req failed: req id=%llu",
req->request_id);
} else {
__cam_isp_ctx_enqueue_request_in_order(
ctx, req);
__cam_isp_ctx_dequeue_request(ctx, req);
}
} else {
rc = -EINVAL;

View file

@ -721,10 +721,11 @@ static int cam_jpeg_mgr_prepare_hw_update(void *hw_mgr_priv,
}
if ((packet->num_cmd_buf > 5) || !packet->num_patches ||
!packet->num_io_configs) {
CAM_ERR(CAM_JPEG, "wrong number of cmd/patch info: %u %u",
packet->num_cmd_buf,
packet->num_patches);
!packet->num_io_configs ||
(packet->num_io_configs > CAM_JPEG_IMAGE_MAX)) {
CAM_ERR(CAM_JPEG, "wrong number of cmd/patch info: %u %u %u",
packet->num_cmd_buf, packet->num_patches,
packet->num_io_configs);
return -EINVAL;
}

View file

@ -1,4 +1,5 @@
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -563,7 +564,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
rc = cam_sensor_i2c_command_parser(
&a_ctrl->io_master_info,
i2c_reg_settings,
&cmd_desc[i], 1);
&cmd_desc[i], 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_ACTUATOR,
"Failed:parse init settings: %d",
@ -625,7 +626,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
rc = cam_sensor_i2c_command_parser(
&a_ctrl->io_master_info,
i2c_reg_settings,
cmd_desc, 1);
cmd_desc, 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_ACTUATOR,
"Auto move lens parsing failed: %d", rc);
@ -656,7 +657,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
rc = cam_sensor_i2c_command_parser(
&a_ctrl->io_master_info,
i2c_reg_settings,
cmd_desc, 1);
cmd_desc, 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_ACTUATOR,
"Manual move lens parsing failed: %d", rc);

View file

@ -1,4 +1,5 @@
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -1079,7 +1080,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
rc = cam_sensor_i2c_command_parser(
&fctrl->io_master_info,
i2c_reg_settings,
&cmd_desc[i], 1);
&cmd_desc[i], 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_FLASH,
"pkt parsing failed: %d", rc);
@ -1159,7 +1160,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
cmd_desc = (struct cam_cmd_buf_desc *)(offset);
rc = cam_sensor_i2c_command_parser(
&fctrl->io_master_info,
i2c_reg_settings, cmd_desc, 1);
i2c_reg_settings, cmd_desc, 1, NULL);
if (rc) {
CAM_ERR(CAM_FLASH,
"Failed in parsing i2c packets");
@ -1190,7 +1191,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
cmd_desc = (struct cam_cmd_buf_desc *)(offset);
rc = cam_sensor_i2c_command_parser(
&fctrl->io_master_info,
i2c_reg_settings, cmd_desc, 1);
i2c_reg_settings, cmd_desc, 1, NULL);
if (rc) {
CAM_ERR(CAM_FLASH,
"Failed in parsing i2c NRT packets");

View file

@ -1,4 +1,5 @@
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -552,7 +553,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
rc = cam_sensor_i2c_command_parser(
&o_ctrl->io_master_info,
i2c_reg_settings,
&cmd_desc[i], 1);
&cmd_desc[i], 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_OIS,
"init parsing failed: %d", rc);
@ -569,7 +570,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
rc = cam_sensor_i2c_command_parser(
&o_ctrl->io_master_info,
i2c_reg_settings,
&cmd_desc[i], 1);
&cmd_desc[i], 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_OIS,
"Calib parsing failed: %d", rc);
@ -644,7 +645,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
i2c_reg_settings->request_id = 0;
rc = cam_sensor_i2c_command_parser(&o_ctrl->io_master_info,
i2c_reg_settings,
cmd_desc, 1);
cmd_desc, 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc);
goto rel_pkt;

View file

@ -1,4 +1,5 @@
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -94,6 +95,7 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
struct cam_control *ioctl_ctrl = NULL;
struct cam_packet *csl_packet = NULL;
struct cam_cmd_buf_desc *cmd_desc = NULL;
struct cam_buf_io_cfg *io_cfg = NULL;
struct i2c_settings_array *i2c_reg_settings = NULL;
size_t len_of_buff = 0;
size_t remain_len = 0;
@ -194,7 +196,27 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
i2c_reg_settings->is_settings_valid = 1;
break;
}
case CAM_SENSOR_PACKET_OPCODE_SENSOR_READ: {
i2c_reg_settings = &(i2c_data->read_settings);
i2c_reg_settings->request_id = 0;
i2c_reg_settings->is_settings_valid = 1;
CAM_DBG(CAM_SENSOR, "number of IO configs: %d:",
csl_packet->num_io_configs);
if (csl_packet->num_io_configs == 0) {
CAM_ERR(CAM_SENSOR, "No I/O configs to process");
goto rel_pkt_buf;
}
io_cfg = (struct cam_buf_io_cfg *) ((uint8_t *)
&csl_packet->payload +
csl_packet->io_configs_offset);
if (io_cfg == NULL) {
CAM_ERR(CAM_SENSOR, "I/O config is invalid(NULL)");
goto rel_pkt_buf;
}
break;
}
case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: {
if ((s_ctrl->sensor_state == CAM_SENSOR_INIT) ||
(s_ctrl->sensor_state == CAM_SENSOR_ACQUIRE)) {
@ -246,7 +268,7 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
cmd_desc = (struct cam_cmd_buf_desc *)(offset);
rc = cam_sensor_i2c_command_parser(&s_ctrl->io_master_info,
i2c_reg_settings, cmd_desc, 1);
i2c_reg_settings, cmd_desc, 1, io_cfg);
if (rc < 0) {
CAM_ERR(CAM_SENSOR, "Fail parsing I2C Pkt: %d", rc);
goto rel_pkt_buf;
@ -323,7 +345,6 @@ static int32_t cam_sensor_i2c_modes_util(
}
}
}
return rc;
}
@ -986,6 +1007,25 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
}
s_ctrl->sensor_state = CAM_SENSOR_CONFIG;
}
if (s_ctrl->i2c_data.read_settings.is_settings_valid) {
rc = cam_sensor_i2c_read_data(
&s_ctrl->i2c_data.read_settings,
&s_ctrl->io_master_info);
if (rc < 0) {
CAM_ERR(CAM_SENSOR, "cannot read data: %d", rc);
delete_request(&s_ctrl->i2c_data.read_settings);
goto release_mutex;
}
rc = delete_request(
&s_ctrl->i2c_data.read_settings);
if (rc < 0) {
CAM_ERR(CAM_SENSOR,
"Fail in deleting the read settings");
goto release_mutex;
}
}
}
break;
default:

Some files were not shown because too many files have changed in this diff Show more