Merge "sdm: Fix hw layer stack corruption"
diff --git a/common.mk b/common.mk
index 2318165..83d06c6 100644
--- a/common.mk
+++ b/common.mk
@@ -36,6 +36,10 @@
common_flags += -DUSER_DEBUG
endif
+ifeq ($(LLVM_SA), true)
+ common_flags += --compile-and-analyze --analyzer-perf --analyzer-Werror
+endif
+
common_includes := system/core/base/include
CHECK_VERSION_LE = $(shell if [ $(1) -le $(2) ] ; then echo true ; else echo false ; fi)
PLATFORM_SDK_NOUGAT = 25
diff --git a/libdisplayconfig/Android.mk b/libdisplayconfig/Android.mk
index fae7f85..a107ea6 100644
--- a/libdisplayconfig/Android.mk
+++ b/libdisplayconfig/Android.mk
@@ -9,4 +9,8 @@
LOCAL_SHARED_LIBRARIES := libhidlbase libhidltransport libutils \
vendor.display.config@1.0 android.hidl.base@1.0
+ifeq ($(LLVM_SA), true)
+ LOCAL_CFLAGS += --compile-and-analyze --analyzer-perf --analyzer-Werror
+endif
+
include $(BUILD_SHARED_LIBRARY)
diff --git a/liblight/Android.mk b/liblight/Android.mk
index 2f2e1ca..197a1a4 100644
--- a/liblight/Android.mk
+++ b/liblight/Android.mk
@@ -24,6 +24,9 @@
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SHARED_LIBRARIES := liblog libcutils libsdm-disp-vndapis
LOCAL_CFLAGS := -DLOG_TAG=\"qdlights\"
+ifeq ($(LLVM_SA), true)
+ LOCAL_CFLAGS += --compile-and-analyze --analyzer-perf --analyzer-Werror
+endif
LOCAL_CLANG := true
LOCAL_MODULE := lights.$(TARGET_BOARD_PLATFORM)
LOCAL_MODULE_TAGS := optional
diff --git a/libqdutils/qd_utils.cpp b/libqdutils/qd_utils.cpp
index 2cce39c..c55354d 100644
--- a/libqdutils/qd_utils.cpp
+++ b/libqdutils/qd_utils.cpp
@@ -264,10 +264,12 @@
while (getline(&line, &len, configFile) != -1) {
if (!parseLine(line, tokens, maxCount, &tokenCount)) {
- if (!strncmp(tokens[0], "bpp", strlen("bpp"))) {
+ if (tokens[0] != NULL) {
+ if (!strncmp(tokens[0], "bpp", strlen("bpp"))) {
*panelBpp = static_cast<uint32_t>(atoi(tokens[1]));
- } else if (!strncmp(tokens[0], "pattern", strlen("pattern"))) {
+ } else if (!strncmp(tokens[0], "pattern", strlen("pattern"))) {
*patternType = static_cast<uint32_t>(atoi(tokens[1]));
+ }
}
}
}
diff --git a/sdm/include/core/sdm_types.h b/sdm/include/core/sdm_types.h
index 72ad6b2..0d3bf33 100644
--- a/sdm/include/core/sdm_types.h
+++ b/sdm/include/core/sdm_types.h
@@ -57,6 +57,7 @@
kErrorNoAppLayers, //!< No App layer(s) in the draw cycle.
kErrorRotatorValidation, //!< Rotator configuration validation failure.
kErrorNotValidated, //!< Draw cycle has not been validated.
+ kErrorCriticalResource, //!< Critical resource allocation has failed.
};
/*! @brief This structure is defined for client and library compatibility check purpose only. This
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 043f304..51aa012 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -619,14 +619,15 @@
HWRotateInfo &rotate = hw_rotator_session.hw_rotate_info[count];
LayerRect &src_roi = rotate.src_roi;
LayerRect &dst_roi = rotate.dst_roi;
- const char *rotate_split[2] = { "Rot-1", "Rot-2" };
+ char rot[8] = { 0 };
int pipe_id = 0;
if (hw_rotator_session.mode == kRotatorOffline) {
snprintf(writeback_id, sizeof(writeback_id), "%d", rotate.writeback_id);
pipe_id = rotate.pipe_id;
}
- DumpImpl::AppendString(buffer, length, format, idx, comp_type, rotate_split[count],
+ snprintf(rot, sizeof(rot), "Rot-%d", count + 1);
+ DumpImpl::AppendString(buffer, length, format, idx, comp_type, rot,
writeback_id, pipe_id, input_buffer->width,
input_buffer->height, buffer_format, INT(src_roi.left),
INT(src_roi.top), INT(src_roi.right), INT(src_roi.bottom),
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
index bbc4a78..8466f8b 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -68,6 +68,24 @@
}
}
+ if (hw_panel_info_.mode == kModeCommand) {
+ event_list_ = { HWEvent::VSYNC,
+ HWEvent::EXIT,
+ HWEvent::SHOW_BLANK_EVENT,
+ HWEvent::THERMAL_LEVEL,
+ HWEvent::IDLE_POWER_COLLAPSE,
+ HWEvent::PINGPONG_TIMEOUT,
+ HWEvent::PANEL_DEAD };
+ } else {
+ event_list_ = { HWEvent::VSYNC,
+ HWEvent::EXIT,
+ HWEvent::IDLE_NOTIFY,
+ HWEvent::SHOW_BLANK_EVENT,
+ HWEvent::THERMAL_LEVEL,
+ HWEvent::PINGPONG_TIMEOUT,
+ HWEvent::PANEL_DEAD };
+ }
+
avr_prop_disabled_ = Debug::IsAVRDisabled();
error = HWEventsInterface::Create(INT(display_type_), this, event_list_, hw_intf_,
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index ac4160e..44ae2b4 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -68,13 +68,7 @@
bool NeedsAVREnable();
void ResetPanel();
- std::vector<HWEvent> event_list_ = { HWEvent::VSYNC, HWEvent::EXIT,
- HWEvent::IDLE_NOTIFY,
- HWEvent::SHOW_BLANK_EVENT,
- HWEvent::THERMAL_LEVEL,
- HWEvent::IDLE_POWER_COLLAPSE,
- HWEvent::PINGPONG_TIMEOUT,
- HWEvent::PANEL_DEAD };
+ std::vector<HWEvent> event_list_;
bool avr_prop_disabled_ = false;
bool switch_to_cmd_ = false;
bool handle_idle_timeout_ = false;
diff --git a/sdm/libs/core/drm/hw_color_manager_drm.cpp b/sdm/libs/core/drm/hw_color_manager_drm.cpp
index 95c25cd..7563647 100644
--- a/sdm/libs/core/drm/hw_color_manager_drm.cpp
+++ b/sdm/libs/core/drm/hw_color_manager_drm.cpp
@@ -861,7 +861,7 @@
break;
default:
DLOGE("Invalid gamut mode %d", sde_gamut->mode);
- free(mdp_gamut);
+ delete mdp_gamut;
return kErrorParameters;
}
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 96ad8a3..c1e14ee 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -863,7 +863,7 @@
}
uint32_t config = 0;
- SetSrcConfig(layer.input_buffer, &config);
+ SetSrcConfig(layer.input_buffer, hw_rotator_session->mode, &config);
drm_atomic_intf_->Perform(DRMOps::PLANE_SET_SRC_CONFIG, pipe_id, config);;
drm_atomic_intf_->Perform(DRMOps::PLANE_SET_FB_ID, pipe_id, fb_id);
drm_atomic_intf_->Perform(DRMOps::PLANE_SET_CRTC, pipe_id, token_.crtc_id);
@@ -1132,9 +1132,13 @@
}
-void HWDeviceDRM::SetSrcConfig(const LayerBuffer &input_buffer, uint32_t *config) {
- if (input_buffer.flags.interlace) {
- *config |= (0x01 << UINT32(DRMSrcConfig::DEINTERLACE));
+void HWDeviceDRM::SetSrcConfig(const LayerBuffer &input_buffer, const HWRotatorMode &mode,
+ uint32_t *config) {
+ // In offline rotation case, rotator will handle deinterlacing.
+ if (mode != kRotatorOffline) {
+ if (input_buffer.flags.interlace) {
+ *config |= (0x01 << UINT32(DRMSrcConfig::DEINTERLACE));
+ }
}
}
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index e0b7fc1..e02d936 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -121,7 +121,7 @@
void SetSolidfillStages();
void AddSolidfillStage(const HWSolidfillStage &sf, uint32_t plane_alpha);
void SetBlending(const LayerBlending &source, sde_drm::DRMBlendType *target);
- void SetSrcConfig(const LayerBuffer &input_buffer, uint32_t *config);
+ void SetSrcConfig(const LayerBuffer &input_buffer, const HWRotatorMode &mode, uint32_t *config);
void SelectCscType(const LayerBuffer &input_buffer, sde_drm::DRMCscType *type);
void SetRect(const LayerRect &source, sde_drm::DRMRect *target);
void SetRotation(LayerTransform transform, const HWRotatorMode &mode, uint32_t* rot_bit_mask);
diff --git a/sdm/libs/core/drm/hw_events_drm.cpp b/sdm/libs/core/drm/hw_events_drm.cpp
index 7d71f29..7a3d385 100644
--- a/sdm/libs/core/drm/hw_events_drm.cpp
+++ b/sdm/libs/core/drm/hw_events_drm.cpp
@@ -96,9 +96,6 @@
poll_fds_[i].events = POLLIN | POLLPRI | POLLERR;
idle_notify_index_ = i;
} break;
- case HWEvent::CEC_READ_MESSAGE:
- case HWEvent::SHOW_BLANK_EVENT:
- case HWEvent::THERMAL_LEVEL:
case HWEvent::IDLE_POWER_COLLAPSE: {
poll_fds_[i].fd = drmOpen("msm_drm", nullptr);
if (poll_fds_[i].fd < 0) {
@@ -108,8 +105,6 @@
poll_fds_[i].events = POLLIN | POLLPRI | POLLERR;
idle_pc_index_ = i;
} break;
- case HWEvent::PINGPONG_TIMEOUT:
- break;
case HWEvent::PANEL_DEAD: {
poll_fds_[i].fd = drmOpen("msm_drm", nullptr);
if (poll_fds_[i].fd < 0) {
@@ -119,6 +114,11 @@
poll_fds_[i].events = POLLIN | POLLPRI | POLLERR;
panel_dead_index_ = i;
} break;
+ case HWEvent::CEC_READ_MESSAGE:
+ case HWEvent::SHOW_BLANK_EVENT:
+ case HWEvent::THERMAL_LEVEL:
+ case HWEvent::PINGPONG_TIMEOUT:
+ break;
}
}
@@ -263,15 +263,15 @@
poll_fds_[i].fd = -1;
break;
case HWEvent::IDLE_NOTIFY:
- case HWEvent::CEC_READ_MESSAGE:
- case HWEvent::SHOW_BLANK_EVENT:
- case HWEvent::THERMAL_LEVEL:
case HWEvent::IDLE_POWER_COLLAPSE:
- break;
case HWEvent::PANEL_DEAD:
drmClose(poll_fds_[i].fd);
poll_fds_[i].fd = -1;
break;
+ case HWEvent::CEC_READ_MESSAGE:
+ case HWEvent::SHOW_BLANK_EVENT:
+ case HWEvent::THERMAL_LEVEL:
+ break;
default:
return kErrorNotSupported;
}
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 88e4efa..55bc003 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -194,7 +194,11 @@
hw_resource->has_hdr = true;
hw_resource->hw_version = SDEVERSION(4, 0, 1);
- hw_resource->hw_revision = 0;
+ // TODO(user): On FB driver hw_revision comprises of major version, minor version and hw_revision.
+ // On DRM driver, hw_revision is deprecated and hw_version comprises major version, minor version
+ // and hw_revision information. Since QDCM uses hw_revision variable populate hw_revision with
+ // hw_version. Remove hw_revision variable when FB code is deperecated.
+ hw_resource->hw_revision = SDEVERSION(4, 0, 1);
// TODO(user): Deprecate
hw_resource->max_mixer_width = 2560;
@@ -293,6 +297,11 @@
hw_resource->max_bandwidth_high = info.max_bandwidth_high / kKiloUnit;
hw_resource->max_sde_clk = info.max_sde_clk;
hw_resource->hw_version = info.hw_version;
+ // TODO(user): On FB driver hw_revision comprises of major version, minor version and hw_revision.
+ // On DRM driver, hw_revision is deprecated and hw_version comprises major version, minor version
+ // and hw_revision information. Since QDCM uses hw_revision variable populate hw_revision with
+ // hw_version. Remove hw_revision variable when FB code is deperecated.
+ hw_resource->hw_revision = info.hw_version;
std::vector<LayerBufferFormat> sdm_format;
for (auto &it : info.comp_ratio_rt_map) {
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index 667cd88..e78c862 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -60,6 +60,9 @@
drm_mgr_intf_->GetConnectorInfo(token_.conn_id, &connector_info_);
if (connector_info_.topology == DRMTopology::UNKNOWN) {
connector_info_.topology = DRMTopology::DUAL_LM;
+ if (connector_info_.modes[current_mode_index_].hdisplay <= 1080) {
+ connector_info_.topology = DRMTopology::SINGLE_LM;
+ }
}
InitializeConfigs();
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index eb0d17b..cac1454 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -813,9 +813,11 @@
const uint32_t max_count = 10;
char *tokens[max_count] = { NULL };
if (!ParseLine(line.c_str(), "=\n", tokens, max_count, &token_count)) {
- if (!strncmp(tokens[0], "panel_name", strlen("panel_name"))) {
- snprintf(panel_info->panel_name, sizeof(panel_info->panel_name), "%s", tokens[1]);
- break;
+ if (tokens[0] != NULL) {
+ if (!strncmp(tokens[0], "panel_name", strlen("panel_name"))) {
+ snprintf(panel_info->panel_name, sizeof(panel_info->panel_name), "%s", tokens[1]);
+ break;
+ }
}
}
}
diff --git a/sdm/libs/core/fb/hw_info.cpp b/sdm/libs/core/fb/hw_info.cpp
index f2a13e3..2cdae06 100644
--- a/sdm/libs/core/fb/hw_info.cpp
+++ b/sdm/libs/core/fb/hw_info.cpp
@@ -411,10 +411,12 @@
string caps;
while (Sys::getline_(caps_fs, caps)) {
if (!ParseString(caps.c_str(), tokens, max_count, ":, =\n", &token_count)) {
- if (!strncmp(tokens[0], "downscale_compression", strlen("downscale_compression"))) {
- hw_resource->hw_rot_info.downscale_compression = UINT8(atoi(tokens[1]));
- } else if (!strncmp(tokens[0], "min_downscale", strlen("min_downscale"))) {
- hw_resource->hw_rot_info.min_downscale = FLOAT(atof(tokens[1]));
+ if (tokens[0] != NULL) {
+ if (!strncmp(tokens[0], "downscale_compression", strlen("downscale_compression"))) {
+ hw_resource->hw_rot_info.downscale_compression = UINT8(atoi(tokens[1]));
+ } else if (!strncmp(tokens[0], "min_downscale", strlen("min_downscale"))) {
+ hw_resource->hw_rot_info.min_downscale = FLOAT(atof(tokens[1]));
+ }
}
}
}
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 624105b..e0ac992 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -271,6 +271,8 @@
int status = hwc_session->Init();
if (status != 0) {
+ delete hwc_session;
+ hwc_session = NULL;
return status;
}