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:
commit
f5077be5d7
32 changed files with 728 additions and 73 deletions
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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_ */
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue