diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk index 998bd5c..dfecf05 100644 --- a/BoardConfig-common.mk +++ b/BoardConfig-common.mk @@ -41,9 +41,15 @@ BOARD_KERNEL_CMDLINE += swiotlb=noforce BOARD_KERNEL_CMDLINE += disable_dma32=on BOARD_KERNEL_CMDLINE += sysctl.kernel.sched_pelt_multiplier=4 +# Normal (non-_fullmte) builds should disable kasan ifeq (,$(filter %_fullmte,$(TARGET_PRODUCT))) -ifneq (,$(filter eng,$(TARGET_BUILD_VARIANT))) BOARD_KERNEL_CMDLINE += kasan=off +endif + +# Enable a limited subset of MTE for "normal" (non-_fullmte) eng builds. +# Don't touch any settings for _fullmte builds. They are set somewhere else. +ifeq (,$(filter %_fullmte,$(TARGET_PRODUCT))) +ifeq ($(TARGET_BUILD_VARIANT),eng) BOARD_KERNEL_CMDLINE += bootloader.pixel.MTE_FORCE_ON ifeq ($(filter memtag_heap,$(SANITIZE_TARGET)),) SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) memtag_heap) diff --git a/device_framework_matrix_product_202404.xml b/device_framework_matrix_product_202404.xml index ce5db47..6d16f9e 100644 --- a/device_framework_matrix_product_202404.xml +++ b/device_framework_matrix_product_202404.xml @@ -21,7 +21,7 @@ android.hardware.vibrator - 2 + 2-3 IVibrator dual diff --git a/device_framework_matrix_product_8.xml b/device_framework_matrix_product_8.xml index 1103919..1294b8c 100644 --- a/device_framework_matrix_product_8.xml +++ b/device_framework_matrix_product_8.xml @@ -21,7 +21,7 @@ android.hardware.vibrator - 2 + 2-3 IVibrator dual diff --git a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml deleted file mode 100644 index f8ed0c0..0000000 --- a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 5G UW - diff --git a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml deleted file mode 100644 index f8ed0c0..0000000 --- a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 5G UW - diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index ea8b830..a879c67 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -117,6 +117,12 @@ constexpr char kHost1StatePath[] = "/sys/bus/usb/devices/usb1/1-0:1.0/usb1-port1 constexpr char kHost2UeventRegex[] = "/devices/platform/11210000.usb/11210000.dwc3/xhci-hcd-exynos.[0-9].auto/usb2/2-0:1.0"; constexpr char kHost2StatePath[] = "/sys/bus/usb/devices/usb2/2-0:1.0/usb2-port1/state"; +constexpr char kHubHost1UeventRegex[] = + "/devices/platform/11210000.usb/11210000.dwc3/xhci-hcd-exynos.[0-9].auto/usb1/1-1/1-1:1.0"; +constexpr char kHubHost1StatePath[] = "/sys/bus/usb/devices/usb1/1-1/1-1:1.0/1-1-port1/state"; +constexpr char kHubHost2UeventRegex[] = + "/devices/platform/11210000.usb/11210000.dwc3/xhci-hcd-exynos.[0-9].auto/usb1/1-1/1-1:1.0"; +constexpr char kHubHost2StatePath[] = "/sys/bus/usb/devices/usb1/1-1/1-1:1.0/1-1-port2/state"; constexpr char kDataRolePath[] = "/sys/devices/platform/11210000.usb/new_data_role"; constexpr int kSamplingIntervalSec = 5; void queryVersionHelper(android::hardware::usb::Usb *usb, @@ -536,10 +542,9 @@ static int getInternalHubUniqueId() { return internalHubUniqueId; } -static Status tuneInternalHub(const char *devname, void* client_data) { +static Status tuneInternalHub(const char *devname, android::hardware::usb::Usb *usb) { uint16_t vendorId, productId; struct usb_device *device; - ::aidl::android::hardware::usb::Usb *usb; int value, index; device = usb_device_open(devname); @@ -548,7 +553,6 @@ static Status tuneInternalHub(const char *devname, void* client_data) { return Status::ERROR; } - usb = (::aidl::android::hardware::usb::Usb *)client_data; value = usb->mUsbHubVendorCmdValue; index = usb->mUsbHubVendorCmdIndex; @@ -571,20 +575,46 @@ static Status tuneInternalHub(const char *devname, void* client_data) { } static int usbDeviceRemoved(const char *devname, void* client_data) { + string pogoEnableHub; + ::aidl::android::hardware::usb::Usb *usb; + + usb = (::aidl::android::hardware::usb::Usb *)client_data; + + if (usb->mIntHubEnabled == true && ReadFileToString(kPogoEnableHub, &pogoEnableHub) + && Trim(pogoEnableHub) == "0") { + ALOGI("Internal hub disabled"); + usb->mIntHubEnabled = false; + usb->mUsbDataSessionMonitor.reset(new UsbDataSessionMonitor(kUdcUeventRegex, kUdcStatePath, + kHost1UeventRegex, kHost1StatePath, kHost2UeventRegex, + kHost2StatePath, kDataRolePath, + std::bind(&updatePortStatus, usb))); + } + return 0; } static int usbDeviceAdded(const char *devname, void* client_data) { string pogoEnableHub; int uniqueId = 0; + ::aidl::android::hardware::usb::Usb *usb; + + usb = (::aidl::android::hardware::usb::Usb *)client_data; // Enable hub tuning when the pogo dock is connected. if (ReadFileToString(kPogoEnableHub, &pogoEnableHub) && Trim(pogoEnableHub) == "1") { // If enable_hub is set to 1, the internal hub is the first enumearted device on bus 1 and // port 1. uniqueId = usb_device_get_unique_id_from_name(devname); - if (uniqueId == getInternalHubUniqueId()) - tuneInternalHub(devname, client_data); + if (uniqueId == getInternalHubUniqueId()) { + ALOGI("Internal hub enabled"); + usb->mIntHubEnabled = true; + tuneInternalHub(devname, usb); + usb->mUsbDataSessionMonitor.reset(new UsbDataSessionMonitor(kUdcUeventRegex, + kUdcStatePath, kHubHost1UeventRegex, + kHubHost1StatePath, kHubHost2UeventRegex, + kHubHost2StatePath, kDataRolePath, + std::bind(&updatePortStatus, usb))); + } } return 0; @@ -612,9 +642,9 @@ Usb::Usb() mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER), mPartnerLock(PTHREAD_MUTEX_INITIALIZER), mPartnerUp(false), - mUsbDataSessionMonitor(kUdcUeventRegex, kUdcStatePath, kHost1UeventRegex, kHost1StatePath, - kHost2UeventRegex, kHost2StatePath, kDataRolePath, - std::bind(&updatePortStatus, this)), + mUsbDataSessionMonitor(new UsbDataSessionMonitor(kUdcUeventRegex, kUdcStatePath, + kHost1UeventRegex, kHost1StatePath, kHost2UeventRegex, + kHost2StatePath, kDataRolePath, std::bind(&updatePortStatus, this))), mOverheat(ZoneInfo(TemperatureType::USB_PORT, kThermalZoneForTrip, ThrottlingSeverity::CRITICAL), {ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadPrimary, @@ -1200,7 +1230,7 @@ void queryUsbDataSession(android::hardware::usb::Usb *usb, std::vector *currentPortStatus) { std::vector warnings; - usb->mUsbDataSessionMonitor.getComplianceWarnings( + usb->mUsbDataSessionMonitor->getComplianceWarnings( (*currentPortStatus)[0].currentDataRole, &warnings); (*currentPortStatus)[0].complianceWarnings.insert( (*currentPortStatus)[0].complianceWarnings.end(), diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h index 8f0c3a0..eb37d38 100644 --- a/usb/usb/Usb.h +++ b/usb/usb/Usb.h @@ -126,7 +126,8 @@ struct Usb : public BnUsb { bool mPartnerUp; // Report usb data session event and data incompliance warnings - UsbDataSessionMonitor mUsbDataSessionMonitor; + std::unique_ptr mUsbDataSessionMonitor; + bool mIntHubEnabled; // Usb Overheat object for push suez event UsbOverheatEvent mOverheat; // Temperature when connected diff --git a/usb/usb/UsbDataSessionMonitor.cpp b/usb/usb/UsbDataSessionMonitor.cpp index bff52f0..197b368 100644 --- a/usb/usb/UsbDataSessionMonitor.cpp +++ b/usb/usb/UsbDataSessionMonitor.cpp @@ -102,6 +102,7 @@ UsbDataSessionMonitor::UsbDataSessionMonitor( const std::string &dataRolePath, std::function updatePortStatusCb) { struct epoll_event ev; std::string udc; + int pipefds[2]; unique_fd epollFd(epoll_create(8)); if (epollFd.get() == -1) { @@ -133,19 +134,28 @@ UsbDataSessionMonitor::UsbDataSessionMonitor( abort(); } + pipe(pipefds); + mPipefd0.reset(pipefds[0]); + mPipefd1.reset(pipefds[1]); + if (addEpollFd(epollFd, mPipefd0)) + abort(); + /* * The device state file could be absent depending on the current data role * and driver architecture. It's ok for addEpollFile to fail here, the file * will be monitored later when its presence is detected by uevent. */ + mDeviceState.name = "udc"; mDeviceState.filePath = deviceStatePath; mDeviceState.ueventRegex = deviceUeventRegex; addEpollFile(epollFd.get(), mDeviceState.filePath, mDeviceState.fd); + mHost1State.name = "host1"; mHost1State.filePath = host1StatePath; mHost1State.ueventRegex = host1UeventRegex; addEpollFile(epollFd.get(), mHost1State.filePath, mHost1State.fd); + mHost2State.name = "host2"; mHost2State.filePath = host2StatePath; mHost2State.ueventRegex = host2UeventRegex; addEpollFile(epollFd.get(), mHost2State.filePath, mHost2State.fd); @@ -169,7 +179,15 @@ UsbDataSessionMonitor::UsbDataSessionMonitor( usb_flags::enable_report_usb_data_compliance_warning()); } -UsbDataSessionMonitor::~UsbDataSessionMonitor() {} +UsbDataSessionMonitor::~UsbDataSessionMonitor() { + /* + * Write a character to the pipe to signal the monitor thread to exit. + * The character is not important, it can be any value. + */ + int c = 'q'; + write(mPipefd1, &c, 1); + pthread_join(mMonitor, NULL); +} void UsbDataSessionMonitor::reportUsbDataSessionMetrics() { std::vector events; @@ -307,11 +325,11 @@ void UsbDataSessionMonitor::handleDeviceStateEvent(struct usbDeviceState *device n = read(deviceState->fd.get(), &state, USB_STATE_MAX_LEN); if (kValidStates.find(state) == kValidStates.end()) { - ALOGE("Invalid state %s", state); + ALOGE("Invalid state %s: %s", deviceState->name.c_str(), state); return; } - ALOGI("Update USB device state: %s", state); + ALOGI("Update device state %s: %s", deviceState->name.c_str(), state); deviceState->states.push_back(state); deviceState->timestamps.push_back(boot_clock::now()); @@ -484,7 +502,9 @@ void *UsbDataSessionMonitor::monitorThread(void *param) { } for (int n = 0; n < nevents; ++n) { - if (events[n].data.fd == monitor->mUeventFd.get()) { + if (events[n].data.fd == monitor->mPipefd0.get()) { + return NULL; + } else if (events[n].data.fd == monitor->mUeventFd.get()) { monitor->handleUevent(); } else if (events[n].data.fd == monitor->mTimerFd.get()) { monitor->handleTimerEvent(); diff --git a/usb/usb/UsbDataSessionMonitor.h b/usb/usb/UsbDataSessionMonitor.h index aced8a4..e1cfd10 100644 --- a/usb/usb/UsbDataSessionMonitor.h +++ b/usb/usb/UsbDataSessionMonitor.h @@ -64,6 +64,8 @@ class UsbDataSessionMonitor { private: struct usbDeviceState { + // The name of the usb device, e.g. udc, host1, host2. + std::string name; unique_fd fd; std::string filePath; std::string ueventRegex; @@ -86,6 +88,8 @@ class UsbDataSessionMonitor { void updateUdcBindStatus(const std::string &devname); pthread_t mMonitor; + unique_fd mPipefd0; + unique_fd mPipefd1; unique_fd mEpollFd; unique_fd mUeventFd; unique_fd mTimerFd;