1b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor/* 2b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * Copyright (C) 2017 The Android Open Source Project 3b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * 4b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * Licensed under the Apache License, Version 2.0 (the "License"); 5b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * you may not use this file except in compliance with the License. 6b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * You may obtain a copy of the License at 7b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * 8b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * http://www.apache.org/licenses/LICENSE-2.0 9b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * 10b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * Unless required by applicable law or agreed to in writing, software 11b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * distributed under the License is distributed on an "AS IS" BASIS, 12b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * See the License for the specific language governing permissions and 14b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor * limitations under the License. 15b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor */ 16b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 17b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor#define LOG_TAG "thermalserviced" 18b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor#include <log/log.h> 19b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 20b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor#include "thermalserviced.h" 21b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor#include "ThermalService.h" 22c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor#include "libthermalcallback/ThermalCallback.h" 23b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 24c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor#include <android/hardware/thermal/1.1/IThermal.h> 25b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor#include <binder/IPCThreadState.h> 26b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor#include <binder/IServiceManager.h> 27c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor#include <hidl/HidlTransportSupport.h> 28b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 29b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynorusing namespace android; 30c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hardware::thermal::V1_1::IThermal; 31c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hardware::thermal::V1_0::Temperature; 32c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hardware::thermal::V1_1::IThermalCallback; 33c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hardware::thermal::V1_1::implementation::ThermalCallback; 34c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hardware::configureRpcThreadpool; 35c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hardware::hidl_death_recipient; 36c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::hidl::base::V1_0::IBase; 37c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing ::android::os::ThermalService; 38c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 39c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynortemplate<typename T> 40c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorusing Return = hardware::Return<T>; 41c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 42c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynornamespace { 43c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 44c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor// Our thermalserviced main object 45c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd PoynorThermalServiceDaemon* gThermalServiceDaemon; 46c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 47c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor// Thermal HAL client 48c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorsp<IThermal> gThermalHal = nullptr; 49c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 50c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor// Binder death notifier informing of Thermal HAL death. 51c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorstruct ThermalServiceDeathRecipient : hidl_death_recipient { 52c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor virtual void serviceDied( 53c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor uint64_t cookie __unused, const wp<IBase>& who __unused) { 54c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalHal = nullptr; 55c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor ALOGE("IThermal HAL died"); 56c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalServiceDaemon->getThermalHal(); 57c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor } 58c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor}; 59c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 60c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorsp<ThermalServiceDeathRecipient> gThermalHalDied = nullptr; 61c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 62c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor} // anonymous namespace 63b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 64b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynorvoid ThermalServiceDaemon::thermalServiceStartup() { 65b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor // Binder IThermalService startup 66b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor mThermalService = new android::os::ThermalService; 67b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor mThermalService->publish(mThermalService); 68c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // Register IThermalService object with IThermalCallback 69c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor if (mThermalCallback != nullptr) 70c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor mThermalCallback->registerThermalService(mThermalService); 71b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor IPCThreadState::self()->joinThreadPool(); 72b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor} 73b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 74c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor// Lookup Thermal HAL, register death notifier, register our 75c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor// ThermalCallback with the Thermal HAL. 76c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorvoid ThermalServiceDaemon::getThermalHal() { 77c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalHal = IThermal::getService(); 78c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor if (gThermalHal == nullptr) { 79c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor ALOGW("Unable to get Thermal HAL V1.1, vendor thermal event notification not available"); 80c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor return; 81c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor } 82c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 83c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // Binder death notifier for Thermal HAL 84c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor if (gThermalHalDied == nullptr) 85c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalHalDied = new ThermalServiceDeathRecipient(); 86c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 87c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor if (gThermalHalDied != nullptr) 88c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalHal->linkToDeath(gThermalHalDied, 0x451F /* cookie */); 89c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 90c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor if (mThermalCallback != nullptr) { 91c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor Return<void> ret = gThermalHal->registerThermalCallback( 92c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor mThermalCallback); 93c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor if (!ret.isOk()) 94c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor ALOGE("registerThermalCallback failed, status: %s", 95c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor ret.description().c_str()); 96c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor } 97c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor} 98c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor 99c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynorvoid ThermalServiceDaemon::thermalCallbackStartup() { 100c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // HIDL IThermalCallback startup 101c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // Need at least 2 threads in thread pool since we wait for dead HAL 102c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // to come back on the binder death notification thread and we need 103c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // another thread for the incoming service now available call. 104c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor configureRpcThreadpool(2, false /* callerWillJoin */); 105c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor mThermalCallback = new ThermalCallback(); 106c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor // Lookup Thermal HAL and register our ThermalCallback. 107c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor getThermalHal(); 108c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor} 109b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor 110b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynorint main(int /*argc*/, char** /*argv*/) { 111c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalServiceDaemon = new ThermalServiceDaemon(); 112c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalServiceDaemon->thermalCallbackStartup(); 113c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor gThermalServiceDaemon->thermalServiceStartup(); 114c7d606d4cdc628a3fbc8ca082f872c7098ffba89Todd Poynor /* NOTREACHED */ 115b280352bb61d4b832d9d40b1048c1ebefc790154Todd Poynor} 116