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