summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/boot/dts/qcom/sdm660.dtsi17
-rw-r--r--arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts15
-rw-r--r--arch/arm/configs/sdm660-perf_defconfig4
-rw-r--r--arch/arm/configs/sdm660_defconfig4
-rw-r--r--arch/arm64/configs/msm-auto-gvm-perf_defconfig14
-rw-r--r--arch/arm64/configs/msm-auto-gvm_defconfig1
-rw-r--r--arch/arm64/configs/msmcortex-perf_defconfig1
-rw-r--r--arch/arm64/configs/sdm660-perf_defconfig4
-rw-r--r--arch/arm64/configs/sdm660_defconfig4
-rw-r--r--drivers/clk/qcom/gpucc-sdm660.c3
-rw-r--r--drivers/gpu/drm/msm/sde/sde_connector.c15
-rw-r--r--drivers/gpu/drm/msm/sde/sde_kms.c8
-rw-r--r--drivers/gpu/drm/msm/sde/sde_splash.c134
-rw-r--r--drivers/gpu/drm/msm/sde/sde_splash.h24
-rw-r--r--drivers/gpu/msm/adreno_a5xx_snapshot.c119
-rw-r--r--drivers/media/i2c/adv7481.c114
-rw-r--r--drivers/media/i2c/adv7481_reg.h6
-rw-r--r--drivers/mmc/card/block.c17
-rw-r--r--drivers/soc/qcom/scm_qcpe.c26
-rw-r--r--drivers/spi/spi_qsd.c10
-rw-r--r--drivers/tty/serial/msm_serial_hs.c9
-rw-r--r--drivers/video/msm/ba/msm_ba.c18
-rw-r--r--include/soc/qcom/boot_stats.h5
-rw-r--r--include/uapi/media/msm_ba.h32
-rw-r--r--kernel/auditsc.c5
-rw-r--r--security/selinux/ss/services.c2
-rw-r--r--sound/soc/msm/apq8096-auto.c8
-rw-r--r--sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c11
28 files changed, 490 insertions, 140 deletions
diff --git a/arch/arm/boot/dts/qcom/sdm660.dtsi b/arch/arm/boot/dts/qcom/sdm660.dtsi
index 593934328ac5..30d23cb160f5 100644
--- a/arch/arm/boot/dts/qcom/sdm660.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660.dtsi
@@ -1295,6 +1295,16 @@
< 1536000000 0x04040050 0x08400040 0x2 6 >,
< 1612800000 0x04040054 0x09430043 0x2 7 >;
+ qcom,pwrcl-speedbin4-v0 =
+ < 300000000 0x0004000f 0x01200020 0x1 1 >,
+ < 633600000 0x05040021 0x03200020 0x1 2 >,
+ < 902400000 0x0404002f 0x04260026 0x1 3 >,
+ < 1113600000 0x0404003a 0x052e002e 0x2 4 >,
+ < 1401600000 0x04040049 0x073a003a 0x2 5 >,
+ < 1536000000 0x04040050 0x08400040 0x2 6 >,
+ < 1747200000 0x0404005b 0x09480048 0x2 7 >,
+ < 1843200000 0x04040060 0x094c004c 0x3 8 >;
+
qcom,perfcl-speedbin0-v0 =
< 300000000 0x0004000f 0x01200020 0x1 1 >,
< 1113600000 0x0404003a 0x052e002e 0x1 2 >,
@@ -1320,6 +1330,13 @@
< 1747200000 0x0404005b 0x09480048 0x2 4 >,
< 1804800000 0x0404005e 0x094b004b 0x2 5 >;
+ qcom,perfcl-speedbin4-v0 =
+ < 300000000 0x0004000f 0x01200020 0x1 1 >,
+ < 1113600000 0x0404003a 0x052e002e 0x1 2 >,
+ < 1401600000 0x04040049 0x073a003a 0x2 3 >,
+ < 1747200000 0x0404005b 0x09480048 0x2 4 >,
+ < 1958400000 0x04040066 0x0a510051 0x2 5 >;
+
qcom,up-timer = <1000 1000>;
qcom,down-timer = <1000 1000>;
qcom,set-ret-inactive;
diff --git a/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts b/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts
index 30a45a5899b0..08407f574231 100644
--- a/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts
+++ b/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts
@@ -98,18 +98,3 @@
label = "ion_system_mem";
};
};
-
-#include "vplatform-lfv-msm8996-usb.dtsi"
-
-&usb3 {
- status = "okay";
- qcom,no-wakeup-src-in-hostmode;
-};
-
-&qusb_phy0 {
- status = "okay";
-};
-
-&ssphy {
- status = "okay";
-};
diff --git a/arch/arm/configs/sdm660-perf_defconfig b/arch/arm/configs/sdm660-perf_defconfig
index b5538fe583be..ed826ca3ca3d 100644
--- a/arch/arm/configs/sdm660-perf_defconfig
+++ b/arch/arm/configs/sdm660-perf_defconfig
@@ -607,9 +607,7 @@ CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_SENSORS_SSC=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT3_FS=y
+CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ENCRYPTION=y
CONFIG_EXT4_FS_ENCRYPTION=y
diff --git a/arch/arm/configs/sdm660_defconfig b/arch/arm/configs/sdm660_defconfig
index 65161777d5ae..2ff1a67b8cdc 100644
--- a/arch/arm/configs/sdm660_defconfig
+++ b/arch/arm/configs/sdm660_defconfig
@@ -609,9 +609,7 @@ CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_SENSORS_SSC=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT3_FS=y
+CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ENCRYPTION=y
CONFIG_EXT4_FS_ENCRYPTION=y
diff --git a/arch/arm64/configs/msm-auto-gvm-perf_defconfig b/arch/arm64/configs/msm-auto-gvm-perf_defconfig
index 55655ac06803..63f492ee9786 100644
--- a/arch/arm64/configs/msm-auto-gvm-perf_defconfig
+++ b/arch/arm64/configs/msm-auto-gvm-perf_defconfig
@@ -5,6 +5,10 @@ CONFIG_AUDIT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_RCU_EXPERT=y
+CONFIG_RCU_FAST_NO_HZ=y
+CONFIG_RCU_NOCB_CPU=y
+CONFIG_RCU_NOCB_CPU_ALL=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=15
@@ -15,10 +19,15 @@ CONFIG_CGROUP_SCHED=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_SCHED_HMP=y
CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_PID_NS is not set
CONFIG_BLK_DEV_INITRD=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_KALLSYMS_ALL=y
+# CONFIG_MEMBARRIER is not set
CONFIG_EMBEDDED=y
+# CONFIG_SLUB_DEBUG is not set
+# CONFIG_COMPAT_BRK is not set
CONFIG_PROFILING=y
CONFIG_CC_STACKPROTECTOR_REGULAR=y
CONFIG_MODULES=y
@@ -35,6 +44,7 @@ CONFIG_PCI_HOST_GENERIC=y
CONFIG_SCHED_MC=y
CONFIG_NR_CPUS=8
CONFIG_PREEMPT=y
+CONFIG_HZ_100=y
CONFIG_ARM64_REG_REBALANCE_ON_CTX_SW=y
CONFIG_ZSMALLOC=y
CONFIG_BALANCE_ANON_FILE_RECLAIM=y
@@ -42,11 +52,13 @@ CONFIG_FORCE_ALLOC_FROM_DMA_ZONE=y
CONFIG_SECCOMP=y
CONFIG_ARMV8_DEPRECATED=y
CONFIG_SWP_EMULATION=y
+# CONFIG_EFI is not set
CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y
CONFIG_COMPAT=y
CONFIG_PM_AUTOSLEEP=y
CONFIG_PM_WAKELOCKS=y
CONFIG_PM_WAKELOCKS_LIMIT=0
+# CONFIG_PM_WAKELOCKS_GC is not set
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
@@ -369,6 +381,8 @@ CONFIG_DEBUG_INFO=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_PANIC_TIMEOUT=5
CONFIG_SCHEDSTATS=y
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_IPC_LOGGING=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
diff --git a/arch/arm64/configs/msm-auto-gvm_defconfig b/arch/arm64/configs/msm-auto-gvm_defconfig
index 177ccef17f77..7e6d0f152306 100644
--- a/arch/arm64/configs/msm-auto-gvm_defconfig
+++ b/arch/arm64/configs/msm-auto-gvm_defconfig
@@ -33,6 +33,7 @@ CONFIG_PCI_HOST_GENERIC=y
CONFIG_SCHED_MC=y
CONFIG_NR_CPUS=8
CONFIG_PREEMPT=y
+CONFIG_HZ_100=y
CONFIG_ARM64_REG_REBALANCE_ON_CTX_SW=y
CONFIG_ZSMALLOC=y
CONFIG_BALANCE_ANON_FILE_RECLAIM=y
diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig
index 45841cdafc3e..031869a26722 100644
--- a/arch/arm64/configs/msmcortex-perf_defconfig
+++ b/arch/arm64/configs/msmcortex-perf_defconfig
@@ -16,6 +16,7 @@ CONFIG_RCU_NOCB_CPU_ALL=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
+CONFIG_CGROUP_DEBUG=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y
CONFIG_CGROUP_CPUACCT=y
diff --git a/arch/arm64/configs/sdm660-perf_defconfig b/arch/arm64/configs/sdm660-perf_defconfig
index 0489f0582a2e..f94cbcdadc7c 100644
--- a/arch/arm64/configs/sdm660-perf_defconfig
+++ b/arch/arm64/configs/sdm660-perf_defconfig
@@ -614,9 +614,7 @@ CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_SENSORS_SSC=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT3_FS=y
+CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ENCRYPTION=y
CONFIG_EXT4_FS_ENCRYPTION=y
diff --git a/arch/arm64/configs/sdm660_defconfig b/arch/arm64/configs/sdm660_defconfig
index 9833077fd062..a8c91604e2d7 100644
--- a/arch/arm64/configs/sdm660_defconfig
+++ b/arch/arm64/configs/sdm660_defconfig
@@ -634,9 +634,7 @@ CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_MSM_TZ_LOG=y
CONFIG_SENSORS_SSC=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT3_FS=y
+CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ENCRYPTION=y
CONFIG_EXT4_FS_ENCRYPTION=y
diff --git a/drivers/clk/qcom/gpucc-sdm660.c b/drivers/clk/qcom/gpucc-sdm660.c
index 8b2e6fd601c0..ff837aad0c9a 100644
--- a/drivers/clk/qcom/gpucc-sdm660.c
+++ b/drivers/clk/qcom/gpucc-sdm660.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2018, 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
@@ -181,6 +181,7 @@ static const struct freq_tbl ftbl_gfx3d_clk_src[] = {
F_GFX(370000000, 0, 2, 0, 0, 740000000),
F_GFX(430000000, 0, 2, 0, 0, 860000000),
F_GFX(465000000, 0, 2, 0, 0, 930000000),
+ F_GFX(585000000, 0, 2, 0, 0, 1170000000),
F_GFX(588000000, 0, 2, 0, 0, 1176000000),
F_GFX(647000000, 0, 2, 0, 0, 1294000000),
F_GFX(700000000, 0, 2, 0, 0, 1400000000),
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.c b/drivers/gpu/drm/msm/sde/sde_connector.c
index f74a682c5f04..1bc3d0a926eb 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.c
+++ b/drivers/gpu/drm/msm/sde/sde_connector.c
@@ -572,6 +572,7 @@ void sde_connector_complete_commit(struct drm_connector *connector)
{
struct drm_device *dev;
struct msm_drm_private *priv;
+ struct sde_connector *c_conn;
if (!connector) {
SDE_ERROR("invalid connector\n");
@@ -584,11 +585,17 @@ void sde_connector_complete_commit(struct drm_connector *connector)
/* signal connector's retire fence */
sde_fence_signal(&to_sde_connector(connector)->retire_fence, 0);
- /* after first vsync comes,
- * early splash resource should start to be released.
+ /*
+ * After LK totally exits, LK's early splash resource
+ * should be released.
*/
- if (sde_splash_get_lk_complete_status(priv->kms))
- sde_splash_free_resource(priv->kms, &priv->phandle);
+ if (sde_splash_get_lk_complete_status(priv->kms)) {
+ c_conn = to_sde_connector(connector);
+
+ sde_splash_free_resource(priv->kms, &priv->phandle,
+ c_conn->connector_type,
+ c_conn->display);
+ }
}
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.c b/drivers/gpu/drm/msm/sde/sde_kms.c
index 1da8b5b4ff10..86a5c23b5258 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.c
+++ b/drivers/gpu/drm/msm/sde/sde_kms.c
@@ -345,10 +345,10 @@ static void sde_kms_prepare_commit(struct msm_kms *kms,
if (sde_kms->splash_info.handoff &&
sde_kms->splash_info.display_splash_enabled)
- sde_splash_lk_stop_splash(kms);
- else
- sde_power_resource_enable(&priv->phandle,
- sde_kms->core_client, true);
+ sde_splash_lk_stop_splash(kms, state);
+
+ sde_power_resource_enable(&priv->phandle,
+ sde_kms->core_client, true);
}
static void sde_kms_commit(struct msm_kms *kms,
diff --git a/drivers/gpu/drm/msm/sde/sde_splash.c b/drivers/gpu/drm/msm/sde/sde_splash.c
index f124bd7d5904..9c3964e99c1f 100644
--- a/drivers/gpu/drm/msm/sde/sde_splash.c
+++ b/drivers/gpu/drm/msm/sde/sde_splash.c
@@ -313,6 +313,15 @@ static void _sde_splash_sent_pipe_update_uevent(struct sde_kms *sde_kms)
kfree(event_string);
}
+static void _sde_splash_get_connector_ref_cnt(struct sde_splash_info *sinfo,
+ u32 *hdmi_cnt, u32 *dsi_cnt)
+{
+ mutex_lock(&sde_splash_lock);
+ *hdmi_cnt = sinfo->hdmi_connector_cnt;
+ *dsi_cnt = sinfo->dsi_connector_cnt;
+ mutex_unlock(&sde_splash_lock);
+}
+
static int _sde_splash_free_module_resource(struct msm_mmu *mmu,
struct sde_splash_info *sinfo)
{
@@ -339,6 +348,29 @@ static int _sde_splash_free_module_resource(struct msm_mmu *mmu,
return 0;
}
+static bool _sde_splash_validate_commit(struct sde_kms *sde_kms,
+ struct drm_atomic_state *state)
+{
+ int i, nplanes;
+ struct drm_plane *plane;
+ struct drm_device *dev = sde_kms->dev;
+
+ nplanes = dev->mode_config.num_total_plane;
+
+ for (i = 0; i < nplanes; i++) {
+ plane = state->planes[i];
+
+ /*
+ * As plane state has been swapped, we need to check
+ * fb in state->planes, not fb in state->plane_state.
+ */
+ if (plane && plane->fb)
+ return true;
+ }
+
+ return false;
+}
+
__ref int sde_splash_init(struct sde_power_handle *phandle, struct msm_kms *kms)
{
struct sde_kms *sde_kms;
@@ -369,8 +401,7 @@ __ref int sde_splash_init(struct sde_power_handle *phandle, struct msm_kms *kms)
sde_power_data_bus_bandwidth_ctrl(phandle,
sde_kms->core_client, false);
- ret = -EINVAL;
- break;
+ return -EINVAL;
}
}
@@ -716,11 +747,17 @@ bool sde_splash_get_lk_complete_status(struct msm_kms *kms)
}
int sde_splash_free_resource(struct msm_kms *kms,
- struct sde_power_handle *phandle)
+ struct sde_power_handle *phandle,
+ int connector_type, void *display)
{
struct sde_kms *sde_kms;
struct sde_splash_info *sinfo;
struct msm_mmu *mmu;
+ struct dsi_display *dsi_display = display;
+ int ret = 0;
+ int hdmi_conn_count = 0;
+ int dsi_conn_count = 0;
+ static const char *last_commit_display_type = "unknown";
if (!phandle || !kms) {
SDE_ERROR("invalid phandle/kms.\n");
@@ -734,41 +771,88 @@ int sde_splash_free_resource(struct msm_kms *kms,
return -EINVAL;
}
+ /* Get connector number where the early splash in on. */
+ _sde_splash_get_connector_ref_cnt(sinfo, &hdmi_conn_count,
+ &dsi_conn_count);
+
mutex_lock(&sde_splash_lock);
if (!sinfo->handoff) {
mutex_unlock(&sde_splash_lock);
return 0;
}
- mmu = sde_kms->aspace[0]->mmu;
- if (!mmu) {
- mutex_unlock(&sde_splash_lock);
- return -EINVAL;
- }
+ /*
+ * Start to free all LK's resource till user commit happens
+ * on each display which early splash is enabled on.
+ */
+ if (hdmi_conn_count == 0 && dsi_conn_count == 0) {
+ mmu = sde_kms->aspace[0]->mmu;
+ if (!mmu) {
+ mutex_unlock(&sde_splash_lock);
+ return -EINVAL;
+ }
- /* free HDMI's, DSI's and early camera's reserved memory */
- _sde_splash_free_module_resource(mmu, sinfo);
+ /* free HDMI's, DSI's and early camera's reserved memory */
+ _sde_splash_free_module_resource(mmu, sinfo);
- _sde_splash_destroy_splash_node(sinfo);
+ _sde_splash_destroy_splash_node(sinfo);
- /* free lk_pool heap memory */
- _sde_splash_free_bootup_memory_to_system(sinfo->lk_pool_paddr,
+ /* free lk_pool heap memory */
+ _sde_splash_free_bootup_memory_to_system(sinfo->lk_pool_paddr,
sinfo->lk_pool_size);
- /* withdraw data bus vote */
- sde_power_data_bus_bandwidth_ctrl(phandle,
- sde_kms->core_client, false);
+ /* withdraw data bus vote */
+ sde_power_data_bus_bandwidth_ctrl(phandle,
+ sde_kms->core_client, false);
- /* send uevent to notify user to recycle resource */
- _sde_splash_sent_pipe_update_uevent(sde_kms);
+ /*
+ * Turn off MDP core power to keep power on/off operations
+ * be matched, as MDP core power is enabled already when
+ * early splash is enabled.
+ */
+ sde_power_resource_enable(phandle,
+ sde_kms->core_client, false);
+
+ /* send uevent to notify user to recycle resource */
+ _sde_splash_sent_pipe_update_uevent(sde_kms);
+
+ /* Finally mark handoff flag to false to say
+ * handoff is complete.
+ */
+ sinfo->handoff = false;
+
+ DRM_INFO("HDMI and DSI resource handoff is completed\n");
+ mutex_unlock(&sde_splash_lock);
+ return 0;
+ }
- /* Finally mark handoff flag to false to say handoff is complete */
- sinfo->handoff = false;
+ /*
+ * Ensure user commit happens on different connectors
+ * who has splash.
+ */
+ switch (connector_type) {
+ case DRM_MODE_CONNECTOR_HDMIA:
+ if (sinfo->hdmi_connector_cnt == 1)
+ sinfo->hdmi_connector_cnt--;
+ break;
+ case DRM_MODE_CONNECTOR_DSI:
+ if (strcmp(dsi_display->display_type, "unknown") &&
+ strcmp(last_commit_display_type,
+ dsi_display->display_type)) {
+ if (sinfo->dsi_connector_cnt >= 1)
+ sinfo->dsi_connector_cnt--;
- DRM_INFO("HDMI and DSI resource handoff is completed\n");
+ last_commit_display_type = dsi_display->display_type;
+ }
+ break;
+ default:
+ ret = -EINVAL;
+ SDE_ERROR("%s: invalid connector_type %d\n",
+ __func__, connector_type);
+ }
mutex_unlock(&sde_splash_lock);
- return 0;
+ return ret;
}
/*
@@ -776,7 +860,8 @@ int sde_splash_free_resource(struct msm_kms *kms,
* 1. Notify LK to stop display splash.
* 2. Set DOMAIN_ATTR_EARLY_MAP to 1 to enable stage 1 translation in iommu.
*/
-int sde_splash_lk_stop_splash(struct msm_kms *kms)
+int sde_splash_lk_stop_splash(struct msm_kms *kms,
+ struct drm_atomic_state *state)
{
struct sde_splash_info *sinfo;
struct msm_mmu *mmu;
@@ -792,7 +877,8 @@ int sde_splash_lk_stop_splash(struct msm_kms *kms)
/* Monitor LK's status and tell it to exit. */
mutex_lock(&sde_splash_lock);
- if (sinfo->display_splash_enabled) {
+ if (_sde_splash_validate_commit(sde_kms, state) &&
+ sinfo->display_splash_enabled) {
if (_sde_splash_lk_check(sde_kms->hw_intr))
_sde_splash_notify_lk_stop_splash(sde_kms->hw_intr);
diff --git a/drivers/gpu/drm/msm/sde/sde_splash.h b/drivers/gpu/drm/msm/sde/sde_splash.h
index 2fd8ba03112f..c4bb7b08f817 100644
--- a/drivers/gpu/drm/msm/sde/sde_splash.h
+++ b/drivers/gpu/drm/msm/sde/sde_splash.h
@@ -17,9 +17,6 @@
#include "msm_mmu.h"
#include "sde_hw_mdss.h"
-#define SPLASH_CTL_MAX 5
-#define SPLASH_LM_MAX 7
-
enum splash_connector_type {
SPLASH_DSI = 0,
SPLASH_HDMI,
@@ -35,13 +32,13 @@ struct splash_ctl_top {
u32 value;
u8 intf_sel;
u8 ctl_lm_cnt;
- struct splash_lm_hw lm[SPLASH_LM_MAX];
+ struct splash_lm_hw lm[LM_MAX - LM_0];
};
struct sde_res_data {
- struct splash_ctl_top top[SPLASH_CTL_MAX];
- u8 ctl_ids[SPLASH_CTL_MAX];
- u8 lm_ids[SPLASH_LM_MAX];
+ struct splash_ctl_top top[CTL_MAX - CTL_0];
+ u8 ctl_ids[CTL_MAX - CTL_0];
+ u8 lm_ids[LM_MAX - LM_0];
u8 ctl_top_cnt;
u8 lm_cnt;
};
@@ -121,18 +118,21 @@ void sde_splash_setup_connector_count(struct sde_splash_info *sinfo,
/**
* sde_splash_lk_stop_splash.
*
- * Tell LK to stop display splash.
+ * Tell LK to stop display splash once one valid user commit arrives.
*/
-int sde_splash_lk_stop_splash(struct msm_kms *kms);
+int sde_splash_lk_stop_splash(struct msm_kms *kms,
+ struct drm_atomic_state *state);
/**
* sde_splash_free_resource.
*
- * According to input connector_type, free
- * HDMI's and DSI's resource respectively.
+ * To free all LK's resource, including free reserved memory to system,
+ * withdraw data bus vote, disable MDP core power, send uevent to user
+ * to recycle pipe etc.
*/
int sde_splash_free_resource(struct msm_kms *kms,
- struct sde_power_handle *phandle);
+ struct sde_power_handle *phandle,
+ int connector_type, void *display);
/**
* sde_splash_parse_memory_dt.
diff --git a/drivers/gpu/msm/adreno_a5xx_snapshot.c b/drivers/gpu/msm/adreno_a5xx_snapshot.c
index 49560d704537..fb4cebe2cf40 100644
--- a/drivers/gpu/msm/adreno_a5xx_snapshot.c
+++ b/drivers/gpu/msm/adreno_a5xx_snapshot.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, 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
@@ -410,6 +410,15 @@ static const unsigned int a5xx_registers[] = {
0xEC00, 0xEC05, 0xEC08, 0xECE9, 0xECF0, 0xECF0,
/* VPC CTX 1 */
0xEA80, 0xEA80, 0xEA82, 0xEAA3, 0xEAA5, 0xEAC2,
+};
+
+/*
+ * GPMU registers to dump for A5XX on snapshot.
+ * Registers in pairs - first value is the start offset, second
+ * is the stop offset (inclusive)
+ */
+
+static const unsigned int a5xx_gpmu_registers[] = {
/* GPMU */
0xA800, 0xA8FF, 0xAC60, 0xAC60,
};
@@ -662,24 +671,23 @@ static size_t a5xx_snapshot_pre_crashdump_regs(struct kgsl_device *device,
return kgsl_snapshot_dump_registers(device, buf, remain, &pre_cdregs);
}
+struct registers {
+ const unsigned int *regs;
+ size_t size;
+};
+
static size_t a5xx_legacy_snapshot_registers(struct kgsl_device *device,
- u8 *buf, size_t remain)
+ u8 *buf, size_t remain, const unsigned int *regs, size_t size)
{
- struct kgsl_snapshot_registers regs = {
- .regs = a5xx_registers,
- .count = ARRAY_SIZE(a5xx_registers) / 2,
+ struct kgsl_snapshot_registers snapshot_regs = {
+ .regs = regs,
+ .count = size / 2,
};
- return kgsl_snapshot_dump_registers(device, buf, remain, &regs);
+ return kgsl_snapshot_dump_registers(device, buf, remain,
+ &snapshot_regs);
}
-static struct cdregs {
- const unsigned int *regs;
- unsigned int size;
-} _a5xx_cd_registers[] = {
- { a5xx_registers, ARRAY_SIZE(a5xx_registers) },
-};
-
#define REG_PAIR_COUNT(_a, _i) \
(((_a)[(2 * (_i)) + 1] - (_a)[2 * (_i)]) + 1)
@@ -689,11 +697,13 @@ static size_t a5xx_snapshot_registers(struct kgsl_device *device, u8 *buf,
struct kgsl_snapshot_regs *header = (struct kgsl_snapshot_regs *)buf;
unsigned int *data = (unsigned int *)(buf + sizeof(*header));
unsigned int *src = (unsigned int *) registers.hostptr;
- unsigned int i, j, k;
+ struct registers *regs = (struct registers *)priv;
+ unsigned int j, k;
unsigned int count = 0;
if (crash_dump_valid == false)
- return a5xx_legacy_snapshot_registers(device, buf, remain);
+ return a5xx_legacy_snapshot_registers(device, buf, remain,
+ regs->regs, regs->size);
if (remain < sizeof(*header)) {
SNAPSHOT_ERR_NOMEM(device, "REGISTERS");
@@ -702,24 +712,20 @@ static size_t a5xx_snapshot_registers(struct kgsl_device *device, u8 *buf,
remain -= sizeof(*header);
- for (i = 0; i < ARRAY_SIZE(_a5xx_cd_registers); i++) {
- struct cdregs *regs = &_a5xx_cd_registers[i];
+ for (j = 0; j < regs->size / 2; j++) {
+ unsigned int start = regs->regs[2 * j];
+ unsigned int end = regs->regs[(2 * j) + 1];
- for (j = 0; j < regs->size / 2; j++) {
- unsigned int start = regs->regs[2 * j];
- unsigned int end = regs->regs[(2 * j) + 1];
-
- if (remain < ((end - start) + 1) * 8) {
- SNAPSHOT_ERR_NOMEM(device, "REGISTERS");
- goto out;
- }
+ if (remain < ((end - start) + 1) * 8) {
+ SNAPSHOT_ERR_NOMEM(device, "REGISTERS");
+ goto out;
+ }
- remain -= ((end - start) + 1) * 8;
+ remain -= ((end - start) + 1) * 8;
- for (k = start; k <= end; k++, count++) {
- *data++ = k;
- *data++ = *src++;
- }
+ for (k = start; k <= end; k++, count++) {
+ *data++ = k;
+ *data++ = *src++;
}
}
@@ -859,6 +865,7 @@ void a5xx_snapshot(struct adreno_device *adreno_dev,
struct adreno_snapshot_data *snap_data = gpudev->snapshot_data;
unsigned int reg, i;
struct adreno_ringbuffer *rb;
+ struct registers regs;
/* Disable Clock gating temporarily for the debug bus to work */
a5xx_hwcg_set(adreno_dev, false);
@@ -875,8 +882,20 @@ void a5xx_snapshot(struct adreno_device *adreno_dev,
/* Try to run the crash dumper */
_a5xx_do_crashdump(device);
- kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS,
- snapshot, a5xx_snapshot_registers, NULL);
+ regs.regs = a5xx_registers;
+ regs.size = ARRAY_SIZE(a5xx_registers);
+
+ kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS, snapshot,
+ a5xx_snapshot_registers, &regs);
+
+ if (ADRENO_FEATURE(adreno_dev, ADRENO_GPMU)) {
+ regs.regs = a5xx_gpmu_registers;
+ regs.size = ARRAY_SIZE(a5xx_gpmu_registers);
+
+ kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS,
+ snapshot, a5xx_snapshot_registers, &regs);
+ }
+
/* Dump SP TP HLSQ registers */
kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS, snapshot,
@@ -1033,17 +1052,23 @@ void a5xx_crashdump_init(struct adreno_device *adreno_dev)
* To save the registers, we need 16 bytes per register pair for the
* script and a dword for each register int the data
*/
- for (i = 0; i < ARRAY_SIZE(_a5xx_cd_registers); i++) {
- struct cdregs *regs = &_a5xx_cd_registers[i];
+ /* Each pair needs 16 bytes (2 qwords) */
+ script_size += (ARRAY_SIZE(a5xx_registers) / 2) * 16;
+
+ /* Each register needs a dword in the data */
+ for (j = 0; j < ARRAY_SIZE(a5xx_registers) / 2; j++)
+ data_size += REG_PAIR_COUNT(a5xx_registers, j) *
+ sizeof(unsigned int);
+
+ if (ADRENO_FEATURE(adreno_dev, ADRENO_GPMU)) {
/* Each pair needs 16 bytes (2 qwords) */
- script_size += (regs->size / 2) * 16;
+ script_size += (ARRAY_SIZE(a5xx_gpmu_registers) / 2) * 16;
/* Each register needs a dword in the data */
- for (j = 0; j < regs->size / 2; j++)
- data_size += REG_PAIR_COUNT(regs->regs, j) *
+ for (j = 0; j < ARRAY_SIZE(a5xx_gpmu_registers) / 2; j++)
+ data_size += REG_PAIR_COUNT(a5xx_gpmu_registers, j) *
sizeof(unsigned int);
-
}
/*
@@ -1081,13 +1106,21 @@ void a5xx_crashdump_init(struct adreno_device *adreno_dev)
ptr = (uint64_t *) capturescript.hostptr;
/* For the registers, program a read command for each pair */
- for (i = 0; i < ARRAY_SIZE(_a5xx_cd_registers); i++) {
- struct cdregs *regs = &_a5xx_cd_registers[i];
- for (j = 0; j < regs->size / 2; j++) {
- unsigned int r = REG_PAIR_COUNT(regs->regs, j);
+ for (j = 0; j < ARRAY_SIZE(a5xx_registers) / 2; j++) {
+ unsigned int r = REG_PAIR_COUNT(a5xx_registers, j);
+ *ptr++ = registers.gpuaddr + offset;
+ *ptr++ = (((uint64_t) a5xx_registers[2 * j]) << 44)
+ | r;
+ offset += r * sizeof(unsigned int);
+ }
+
+ if (ADRENO_FEATURE(adreno_dev, ADRENO_GPMU)) {
+ for (j = 0; j < ARRAY_SIZE(a5xx_gpmu_registers) / 2; j++) {
+ unsigned int r = REG_PAIR_COUNT(a5xx_gpmu_registers, j);
*ptr++ = registers.gpuaddr + offset;
- *ptr++ = (((uint64_t) regs->regs[2 * j]) << 44) | r;
+ *ptr++ = (((uint64_t) a5xx_gpmu_registers[2 * j]) << 44)
+ | r;
offset += r * sizeof(unsigned int);
}
}
diff --git a/drivers/media/i2c/adv7481.c b/drivers/media/i2c/adv7481.c
index 43a5f3da5ac4..19ec11174632 100644
--- a/drivers/media/i2c/adv7481.c
+++ b/drivers/media/i2c/adv7481.c
@@ -41,28 +41,32 @@
#include "msm_camera_i2c.h"
#include "msm_camera_io_util.h"
#include "msm_camera_dt_util.h"
+#include "linux/hdmi.h"
#define DRIVER_NAME "adv7481"
-#define I2C_RW_DELAY 1
-#define I2C_SW_RST_DELAY 5000
+#define I2C_RW_DELAY 1
+#define I2C_SW_RST_DELAY 5000
#define GPIO_HW_RST_DELAY_HI 10000
#define GPIO_HW_RST_DELAY_LOW 10000
-#define SDP_MIN_SLEEP 5000
-#define SDP_MAX_SLEEP 6000
-#define SDP_NUM_TRIES 30
-#define LOCK_MIN_SLEEP 5000
-#define LOCK_MAX_SLEEP 6000
-#define LOCK_NUM_TRIES 200
+#define SDP_MIN_SLEEP 5000
+#define SDP_MAX_SLEEP 6000
+#define SDP_NUM_TRIES 30
+#define LOCK_MIN_SLEEP 5000
+#define LOCK_MAX_SLEEP 6000
+#define LOCK_NUM_TRIES 200
#define MAX_DEFAULT_WIDTH 1280
#define MAX_DEFAULT_HEIGHT 720
#define MAX_DEFAULT_FRAME_RATE 60
#define MAX_DEFAULT_PIX_CLK_HZ 74240000
-#define ONE_MHZ_TO_HZ 1000000
-#define I2C_BLOCK_WRITE_SIZE 1024
-#define ADV_REG_STABLE_DELAY 70 /* ms*/
+#define ONE_MHZ_TO_HZ 1000000
+#define I2C_BLOCK_WRITE_SIZE 1024
+#define ADV_REG_STABLE_DELAY 70 /* ms*/
+
+#define AVI_INFOFRAME_SIZE 31
+#define INFOFRAME_DATA_SIZE 28
enum adv7481_gpio_t {
@@ -120,6 +124,7 @@ struct adv7481_state {
uint8_t i2c_csi_txa_addr;
uint8_t i2c_csi_txb_addr;
uint8_t i2c_hdmi_addr;
+ uint8_t i2c_hdmi_inf_addr;
uint8_t i2c_edid_addr;
uint8_t i2c_cp_addr;
uint8_t i2c_sdp_addr;
@@ -141,6 +146,9 @@ struct adv7481_state {
int csib_src;
int mode;
+ /* AVI Infoframe Params */
+ struct avi_infoframe_params hdmi_avi_infoframe;
+
/* resolution configuration */
struct resolution_config res_configs[RES_MAX];
@@ -304,6 +312,14 @@ static int32_t adv7481_cci_i2c_read(struct msm_camera_i2c_client *i2c_client,
data, data_type);
}
+static int32_t adv7481_cci_i2c_read_seq(
+ struct msm_camera_i2c_client *i2c_client,
+ uint8_t reg, uint8_t *data, uint32_t size)
+{
+ return i2c_client->i2c_func_tbl->i2c_read_seq(i2c_client, reg,
+ data, size);
+}
+
static int32_t adv7481_wr_byte(struct msm_camera_i2c_client *c_i2c_client,
uint8_t sid, uint8_t reg, uint8_t data)
{
@@ -334,6 +350,20 @@ static int32_t adv7481_wr_block(struct msm_camera_i2c_client *c_i2c_client,
return ret;
}
+static int32_t adv7481_rd_block(struct msm_camera_i2c_client *c_i2c_client,
+ uint8_t sid, uint8_t reg, uint8_t *data, uint32_t size)
+{
+ int ret = 0;
+
+ c_i2c_client->cci_client->sid = sid;
+
+ ret = adv7481_cci_i2c_read_seq(c_i2c_client, reg, data, size);
+ if (ret < 0)
+ pr_err("Error %d reading cci i2c block data\n", ret);
+
+ return ret;
+}
+
static uint8_t adv7481_rd_byte(struct msm_camera_i2c_client *c_i2c_client,
uint8_t sid, uint8_t reg)
{
@@ -392,6 +422,7 @@ static int adv7481_set_irq(struct adv7481_state *state)
ADV_REG_SETFIELD(1, IO_CP_UNLOCK_CP_MB1) |
ADV_REG_SETFIELD(1, IO_VMUTE_REQUEST_HDMI_MB1) |
ADV_REG_SETFIELD(1, IO_INT_SD_MB1));
+
/* Set cable detect */
ret |= adv7481_wr_byte(&state->i2c_client, state->i2c_io_addr,
IO_HDMI_LVL_INT_MASKB_3_ADDR,
@@ -801,6 +832,7 @@ static int adv7481_dev_init(struct adv7481_state *state)
state->i2c_csi_txb_addr = IO_REG_CSI_TXB_SADDR >> 1;
state->i2c_cp_addr = IO_REG_CP_SADDR >> 1;
state->i2c_hdmi_addr = IO_REG_HDMI_SADDR >> 1;
+ state->i2c_hdmi_inf_addr = IO_REG_HDMI_INF_SADDR >> 1;
state->i2c_edid_addr = IO_REG_EDID_SADDR >> 1;
state->i2c_sdp_addr = IO_REG_SDP_SADDR >> 1;
state->i2c_rep_addr = IO_REG_HDMI_REP_SADDR >> 1;
@@ -1035,10 +1067,16 @@ static long adv7481_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
struct adv7481_vid_params vid_params;
struct adv7481_hdmi_params hdmi_params;
+ struct device *dev = state->dev;
+ union hdmi_infoframe hdmi_info_frame;
+ uint8_t inf_buffer[AVI_INFOFRAME_SIZE];
+
pr_debug("Enter %s with command: 0x%x", __func__, cmd);
memset(&vid_params, 0, sizeof(struct adv7481_vid_params));
memset(&hdmi_params, 0, sizeof(struct adv7481_hdmi_params));
+ memset(&hdmi_info_frame, 0, sizeof(union hdmi_infoframe));
+ memset(inf_buffer, 0, AVI_INFOFRAME_SIZE);
if (!sd)
return -EINVAL;
@@ -1091,6 +1129,58 @@ static long adv7481_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
}
break;
}
+ case VIDIOC_G_AVI_INFOFRAME: {
+ int int_raw = adv7481_rd_byte(&state->i2c_client,
+ state->i2c_io_addr,
+ IO_HDMI_EDG_RAW_STATUS_1_ADDR);
+ adv7481_wr_byte(&state->i2c_client,
+ state->i2c_io_addr,
+ IO_HDMI_EDG_INT_CLEAR_1_ADDR, int_raw);
+ if (ADV_REG_GETFIELD(int_raw, IO_NEW_AVI_INFO_RAW)) {
+ inf_buffer[0] = adv7481_rd_byte(&state->i2c_client,
+ state->i2c_hdmi_inf_addr,
+ HDMI_REG_AVI_PACKET_ID_ADDR);
+ inf_buffer[1] = adv7481_rd_byte(&state->i2c_client,
+ state->i2c_hdmi_inf_addr,
+ HDMI_REG_AVI_INF_VERS_ADDR);
+ inf_buffer[2] = adv7481_rd_byte(&state->i2c_client,
+ state->i2c_hdmi_inf_addr,
+ HDMI_REG_AVI_INF_LEN_ADDR);
+ ret = adv7481_rd_block(&state->i2c_client,
+ state->i2c_hdmi_inf_addr,
+ HDMI_REG_AVI_INF_PB_ADDR,
+ &inf_buffer[3],
+ INFOFRAME_DATA_SIZE);
+ if (ret) {
+ pr_err("%s:Error in VIDIOC_G_AVI_INFOFRAME\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (hdmi_infoframe_unpack(&hdmi_info_frame,
+ (void *)inf_buffer) < 0) {
+ pr_err("%s: infoframe unpack fail\n", __func__);
+ return -EINVAL;
+ }
+ hdmi_infoframe_log(KERN_ERR, dev, &hdmi_info_frame);
+ state->hdmi_avi_infoframe.picture_aspect =
+ (enum picture_aspect_ratio)
+ hdmi_info_frame.avi.picture_aspect;
+ state->hdmi_avi_infoframe.active_aspect =
+ (enum active_format_aspect_ratio)
+ hdmi_info_frame.avi.active_aspect;
+ state->hdmi_avi_infoframe.video_code =
+ hdmi_info_frame.avi.video_code;
+ } else {
+ pr_err("%s: No new AVI Infoframe\n", __func__);
+ }
+ if (copy_to_user((void __user *)adv_arg.ptr,
+ (void *)&state->hdmi_avi_infoframe,
+ sizeof(struct avi_infoframe_params))) {
+ pr_err("%s: Failed to copy Infoframe\n", __func__);
+ return -EINVAL;
+ }
+ break;
+ }
case VIDIOC_G_FIELD_INFO:
/* Select SDP read-only Map 1 */
adv7481_wr_byte(&state->i2c_client, state->i2c_sdp_addr,
@@ -2628,7 +2718,7 @@ static int adv7481_probe(struct platform_device *pdev)
goto err_media_entity;
}
enable_irq(state->irq);
- pr_debug("Probe successful!\n");
+ pr_info("ADV7481 Probe successful!\n");
return ret;
diff --git a/drivers/media/i2c/adv7481_reg.h b/drivers/media/i2c/adv7481_reg.h
index 76c992cf4394..3d484c6d335a 100644
--- a/drivers/media/i2c/adv7481_reg.h
+++ b/drivers/media/i2c/adv7481_reg.h
@@ -342,6 +342,12 @@
#define HDMI_EDID_A_ENABLE_BMSK 0x0001
#define HDMI_EDID_A_ENABLE_SHFT 0
+/* HDMI RX INFOFRAME Map Registers (Read Only) */
+#define HDMI_REG_AVI_INF_PB_ADDR 0x00
+#define HDMI_REG_AVI_PACKET_ID_ADDR 0xE0
+#define HDMI_REG_AVI_INF_VERS_ADDR 0xE1
+#define HDMI_REG_AVI_INF_LEN_ADDR 0xE2
+
/* CEC Map Registers */
#define CEC_REG_LOG_ADDR_MASK_ADDR 0x27
#define CEC_REG_LOG_ADDR_MASK2_BMSK 0x0040
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 35be47dafda2..13e0df67d3b7 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -1301,9 +1301,26 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev,
mmc_get_card(card);
+ if (mmc_card_cmdq(card)) {
+ err = mmc_cmdq_halt(card->host, true);
+ if (err) {
+ pr_err("%s: halt failed while doing %s err (%d)\n",
+ mmc_hostname(card->host),
+ __func__, err);
+ mmc_put_card(card);
+ goto cmd_done;
+ }
+ }
+
for (i = 0; i < num_of_cmds && !ioc_err; i++)
ioc_err = __mmc_blk_ioctl_cmd(card, md, idata[i]);
+ if (mmc_card_cmdq(card)) {
+ if (mmc_cmdq_halt(card->host, false))
+ pr_err("%s: %s: cmdq unhalt failed\n",
+ mmc_hostname(card->host), __func__);
+ }
+
mmc_put_card(card);
/* copy to user if data and response */
diff --git a/drivers/soc/qcom/scm_qcpe.c b/drivers/soc/qcom/scm_qcpe.c
index 4b44d9694092..f50527e50a25 100644
--- a/drivers/soc/qcom/scm_qcpe.c
+++ b/drivers/soc/qcom/scm_qcpe.c
@@ -424,16 +424,14 @@ static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc)
struct ion_handle *ihandle = NULL;
#endif
- pr_info("\nscm_call_qcpe: IN: 0x%x, 0x%x, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx\n",
+ pr_info("IN: 0x%x, 0x%x, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx\n",
fn_id, desc->arginfo, desc->args[0], desc->args[1],
desc->args[2], desc->args[3], desc->x5);
if (!opened) {
ret = habmm_socket_open(&handle, MM_QCPE_VM1, 0, 0);
if (ret) {
- pr_err(
- "scm_call_qcpe: habmm_socket_open failed with ret = %d",
- ret);
+ pr_err("habmm_socket_open failed with ret = %d\n", ret);
return ret;
}
opened = true;
@@ -470,19 +468,24 @@ static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc)
#endif
ret = habmm_socket_send(handle, &smc_params, sizeof(smc_params), 0);
- if (ret)
+ if (ret) {
+ pr_err("habmm_socket_send failed, ret= 0x%x\n", ret);
goto err_ret;
+ }
size_bytes = sizeof(smc_params);
memset(&smc_params, 0x0, sizeof(smc_params));
ret = habmm_socket_recv(handle, &smc_params, &size_bytes, 0, 0);
- if (ret)
+ if (ret) {
+ pr_err("habmm_socket_recv failed, ret= 0x%x\n", ret);
goto err_ret;
+ }
if (size_bytes != sizeof(smc_params)) {
- pr_err("scm_call_qcpe: expected size: %lu, actual=%u\n",
- sizeof(smc_params), size_bytes);
+ pr_err("habmm_socket_recv expected size: %lu, actual=%u\n",
+ sizeof(smc_params),
+ size_bytes);
ret = SCM_ERROR;
goto err_ret;
}
@@ -491,10 +494,15 @@ static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc)
desc->ret[1] = smc_params.args[2];
desc->ret[2] = smc_params.args[3];
ret = smc_params.args[0];
- pr_info("\nscm_call_qcpe: OUT: 0x%llx, 0x%llx, 0x%llx, 0x%llx",
+ pr_info("OUT: 0x%llx, 0x%llx, 0x%llx, 0x%llx",
smc_params.args[0], desc->ret[0], desc->ret[1], desc->ret[2]);
+ goto no_err;
err_ret:
+ habmm_socket_close(handle);
+ opened = false;
+
+no_err:
#ifdef CONFIG_GHS_VMM
if (ihandle)
free_ion_buffers(ihandle);
diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c
index aa7386325893..799bf2988b30 100644
--- a/drivers/spi/spi_qsd.c
+++ b/drivers/spi/spi_qsd.c
@@ -44,6 +44,7 @@
#include <linux/msm-sps.h>
#include <linux/msm-bus.h>
#include <linux/msm-bus-board.h>
+#include <soc/qcom/boot_stats.h>
#include "spi_qsd.h"
#define SPI_MAX_BYTES_PER_WORD (4)
@@ -2581,6 +2582,7 @@ static int msm_spi_probe(struct platform_device *pdev)
int i = 0;
int rc = -ENXIO;
struct msm_spi_platform_data *pdata;
+ char boot_marker[40];
master = spi_alloc_master(&pdev->dev, sizeof(struct msm_spi));
if (!master) {
@@ -2649,6 +2651,10 @@ static int msm_spi_probe(struct platform_device *pdev)
}
}
+ snprintf(boot_marker, sizeof(boot_marker),
+ "M - DRIVER MSM SPI_%d Init", pdev->id);
+ place_marker(boot_marker);
+
for (i = 0; i < ARRAY_SIZE(spi_cs_rsrcs); ++i)
dd->cs_gpios[i].valid = 0;
@@ -2740,6 +2746,10 @@ skip_dma_resources:
rc = sysfs_create_file(&(dd->dev->kobj), &dev_attr_spi_qup_state.attr);
spi_debugfs_init(dd);
+ snprintf(boot_marker, sizeof(boot_marker),
+ "M - DRIVER MSM SPI_%d Ready", pdev->id);
+ place_marker(boot_marker);
+
return 0;
err_attrs:
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c
index 4d02ff24cffe..064494366f01 100644
--- a/drivers/tty/serial/msm_serial_hs.c
+++ b/drivers/tty/serial/msm_serial_hs.c
@@ -66,6 +66,7 @@
#include <linux/msm-sps.h>
#include <linux/platform_data/msm_serial_hs.h>
#include <linux/msm-bus.h>
+#include <soc/qcom/boot_stats.h>
#include "msm_serial_hs_hwreg.h"
#define UART_SPS_CONS_PERIPHERAL 0
@@ -3417,6 +3418,7 @@ static int msm_hs_probe(struct platform_device *pdev)
struct msm_serial_hs_platform_data *pdata = pdev->dev.platform_data;
unsigned long data;
char name[30];
+ char boot_marker[40];
if (pdev->dev.of_node) {
dev_dbg(&pdev->dev, "device tree enabled\n");
@@ -3442,6 +3444,10 @@ static int msm_hs_probe(struct platform_device *pdev)
pdev->dev.platform_data = pdata;
}
+ snprintf(boot_marker, sizeof(boot_marker),
+ "M - DRIVER MSM HS-UART_%d Init", pdev->id);
+ place_marker(boot_marker);
+
if (pdev->id < 0 || pdev->id >= UARTDM_NR) {
dev_err(&pdev->dev, "Invalid plaform device ID = %d\n",
pdev->id);
@@ -3675,6 +3681,9 @@ static int msm_hs_probe(struct platform_device *pdev)
if (!ret) {
msm_hs_clk_bus_unvote(msm_uport);
msm_serial_hs_rt_init(uport);
+ snprintf(boot_marker, sizeof(boot_marker),
+ "M - DRIVER MSM HS-UART_%d Ready", pdev->id);
+ place_marker(boot_marker);
return ret;
}
diff --git a/drivers/video/msm/ba/msm_ba.c b/drivers/video/msm/ba/msm_ba.c
index 95edb5bd48a9..42a737713465 100644
--- a/drivers/video/msm/ba/msm_ba.c
+++ b/drivers/video/msm/ba/msm_ba.c
@@ -574,6 +574,24 @@ long msm_ba_private_ioctl(void *instance, int cmd, void *arg)
}
}
break;
+ case VIDIOC_G_AVI_INFOFRAME: {
+ dprintk(BA_DBG, "VIDIOC_G_AVI_INFOFRAME\n");
+ sd = inst->sd;
+ if (!sd) {
+ dprintk(BA_ERR, "No sd registered");
+ return -EINVAL;
+ }
+ if (arg) {
+ rc = v4l2_subdev_call(sd, core, ioctl, cmd, arg);
+ if (rc)
+ dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x",
+ __func__, rc, cmd);
+ } else {
+ dprintk(BA_ERR, "%s: NULL argument provided", __func__);
+ rc = -EINVAL;
+ }
+ }
+ break;
case VIDIOC_G_FIELD_INFO: {
dprintk(BA_DBG, "VIDIOC_G_FIELD_INFO");
sd = inst->sd;
diff --git a/include/soc/qcom/boot_stats.h b/include/soc/qcom/boot_stats.h
index 5b82aa0bedc3..cebf4be1ebf6 100644
--- a/include/soc/qcom/boot_stats.h
+++ b/include/soc/qcom/boot_stats.h
@@ -33,7 +33,10 @@ int boot_stats_exit(void);
unsigned long long int msm_timer_get_sclk_ticks(void);
#else
static inline int boot_stats_init(void) { return 0; }
-unsigned long long int msm_timer_get_sclk_ticks(void) { return 0; }
+static inline unsigned long long int msm_timer_get_sclk_ticks(void)
+{
+ return 0;
+}
#endif
#ifdef CONFIG_MSM_BOOT_TIME_MARKER
diff --git a/include/uapi/media/msm_ba.h b/include/uapi/media/msm_ba.h
index 933dd85bb48b..45ddfb4c8cb9 100644
--- a/include/uapi/media/msm_ba.h
+++ b/include/uapi/media/msm_ba.h
@@ -23,6 +23,35 @@ struct csi_ctrl_params {
uint32_t lane_count;
};
+/* AVI Infoframe params */
+enum picture_aspect_ratio {
+ PICTURE_ASPECT_RATIO_NONE,
+ PICTURE_ASPECT_RATIO_4_3,
+ PICTURE_ASPECT_RATIO_16_9,
+ PICTURE_ASPECT_RATIO_64_27,
+ PICTURE_ASPECT_RATIO_256_135,
+ PICTURE_ASPECT_RATIO_RESERVED,
+};
+
+enum active_format_aspect_ratio {
+ ACTIVE_ASPECT_RATIO_16_9_TOP = 2,
+ ACTIVE_ASPECT_RATIO_14_9_TOP = 3,
+ ACTIVE_ASPECT_RATIO_16_9_CENTER = 4,
+ ACTIVE_ASPECT_RATIO_PICTURE = 8,
+ ACTIVE_ASPECT_RATIO_4_3 = 9,
+ ACTIVE_ASPECT_RATIO_16_9 = 10,
+ ACTIVE_ASPECT_RATIO_14_9 = 11,
+ ACTIVE_ASPECT_RATIO_4_3_SP_14_9 = 13,
+ ACTIVE_ASPECT_RATIO_16_9_SP_14_9 = 14,
+ ACTIVE_ASPECT_RATIO_16_9_SP_4_3 = 15,
+};
+
+struct avi_infoframe_params {
+ enum picture_aspect_ratio picture_aspect;
+ enum active_format_aspect_ratio active_aspect;
+ unsigned char video_code;
+};
+
/* Field info params */
struct field_info_params {
bool even_field;
@@ -41,5 +70,8 @@ struct msm_ba_v4l2_ioctl_t {
/* ADV7481 private ioctls for field info query */
#define VIDIOC_G_FIELD_INFO \
_IOWR('V', BASE_VIDIOC_PRIVATE + 40, struct msm_ba_v4l2_ioctl_t)
+/* ADV7481 private ioctl for AVI Infoframe query */
+#define VIDIOC_G_AVI_INFOFRAME \
+ _IOWR('V', BASE_VIDIOC_PRIVATE + 41, struct msm_ba_v4l2_ioctl_t)
#endif
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index 76f41594ddca..34a57d57bcb1 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -2249,10 +2249,11 @@ int __audit_signal_info(int sig, struct task_struct *t)
audit_sig_uid = uid;
security_task_getsecid(tsk, &audit_sig_sid);
}
- if (!audit_signals || audit_dummy_context())
- return 0;
}
+ if (!audit_signals || audit_dummy_context())
+ return 0;
+
/* optimize the common case by putting first signal recipient directly
* in audit_context */
if (!ctx->target_pid) {
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 23dca68ffe25..0a258c0602d1 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -1441,7 +1441,7 @@ static int security_context_to_sid_core(const char *scontext, u32 scontext_len,
scontext_len, &context, def_sid);
if (rc == -EINVAL && force) {
context.str = str;
- context.len = scontext_len;
+ context.len = strlen(str) + 1;
str = NULL;
} else if (rc)
goto out_unlock;
diff --git a/sound/soc/msm/apq8096-auto.c b/sound/soc/msm/apq8096-auto.c
index a0c5ef0dce6d..9874e3aa0589 100644
--- a/sound/soc/msm/apq8096-auto.c
+++ b/sound/soc/msm/apq8096-auto.c
@@ -34,6 +34,7 @@
#include <sound/pcm_params.h>
#include <sound/info.h>
#include <device_event.h>
+#include <soc/qcom/boot_stats.h>
#include "qdsp6v2/msm-pcm-routing-v2.h"
#define DRV_NAME "apq8096-auto-asoc-snd"
@@ -6831,6 +6832,12 @@ static int apq8096_asoc_machine_probe(struct platform_device *pdev)
const struct of_device_id *match;
int ret;
enum apr_subsys_state q6_state;
+ static int first_probe = 1;
+
+ if (first_probe) {
+ place_marker("M - DRIVER Audio Init");
+ first_probe = 0;
+ }
if (!pdev->dev.of_node) {
dev_err(&pdev->dev, "No platform supplied from device tree\n");
@@ -6894,6 +6901,7 @@ static int apq8096_asoc_machine_probe(struct platform_device *pdev)
goto err;
}
dev_info(&pdev->dev, "Sound card %s registered\n", card->name);
+ place_marker("M - DRIVER Audio Ready");
return 0;
err:
diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
index 8098db80194d..9ad232293361 100644
--- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
@@ -28,6 +28,7 @@
#include <sound/msm-dai-q6-v2.h>
#include <sound/pcm_params.h>
#include <sound/q6core.h>
+#include <soc/qcom/boot_stats.h>
#define MSM_DAI_PRI_AUXPCM_DT_DEV_ID 1
#define MSM_DAI_SEC_AUXPCM_DT_DEV_ID 2
@@ -4477,6 +4478,7 @@ static int msm_dai_q6_mi2s_dev_probe(struct platform_device *pdev)
u32 mi2s_intf = 0;
struct msm_mi2s_pdata *mi2s_pdata;
int rc;
+ char boot_marker[40];
rc = of_property_read_u32(pdev->dev.of_node, q6_mi2s_dev_id,
&mi2s_intf);
@@ -4486,6 +4488,10 @@ static int msm_dai_q6_mi2s_dev_probe(struct platform_device *pdev)
goto rtn;
}
+ snprintf(boot_marker, sizeof(boot_marker),
+ "M - DRIVER MSM I2S_%d Init", mi2s_intf);
+ place_marker(boot_marker);
+
dev_dbg(&pdev->dev, "dev name %s dev id 0x%x\n", dev_name(&pdev->dev),
mi2s_intf);
@@ -4549,6 +4555,11 @@ static int msm_dai_q6_mi2s_dev_probe(struct platform_device *pdev)
if (IS_ERR_VALUE(rc))
goto err_register;
+
+ snprintf(boot_marker, sizeof(boot_marker),
+ "M - DRIVER MSM I2S_%d Ready", mi2s_intf);
+ place_marker(boot_marker);
+
return 0;
err_register: