diff options
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, ®s); + 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, ®s); + + 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, ®s); + } + /* 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: |