1*3e777be0SXin Li //
2*3e777be0SXin Li // Copyright © 2017 Arm Ltd. All rights reserved.
3*3e777be0SXin Li // SPDX-License-Identifier: MIT
4*3e777be0SXin Li //
5*3e777be0SXin Li
6*3e777be0SXin Li #pragma once
7*3e777be0SXin Li
8*3e777be0SXin Li #include <stdio.h>
9*3e777be0SXin Li #include <string>
10*3e777be0SXin Li #include <iostream>
11*3e777be0SXin Li #include <sys/system_properties.h>
12*3e777be0SXin Li #include <log/log.h>
13*3e777be0SXin Li
14*3e777be0SXin Li namespace {
15*3e777be0SXin Li template<typename T>
16*3e777be0SXin Li struct ConvStringTo;
17*3e777be0SXin Li
18*3e777be0SXin Li template<>
19*3e777be0SXin Li struct ConvStringTo<float>
20*3e777be0SXin Li {
Func__anon4a2e62d20111::ConvStringTo21*3e777be0SXin Li static float Func(std::string s) { return std::stof(s); }
22*3e777be0SXin Li };
23*3e777be0SXin Li
24*3e777be0SXin Li template<>
25*3e777be0SXin Li struct ConvStringTo<int>
26*3e777be0SXin Li {
Func__anon4a2e62d20111::ConvStringTo27*3e777be0SXin Li static int Func(std::string s) { return std::stoi(s); }
28*3e777be0SXin Li };
29*3e777be0SXin Li
30*3e777be0SXin Li template<>
31*3e777be0SXin Li struct ConvStringTo<bool>
32*3e777be0SXin Li {
Func__anon4a2e62d20111::ConvStringTo33*3e777be0SXin Li static bool Func(std::string s) { return !!std::stoi(s); }
34*3e777be0SXin Li };
35*3e777be0SXin Li
36*3e777be0SXin Li template<typename T>
GetCapabilitiesProperties(void * cookie,const char * name,const char * value,uint32_t serial)37*3e777be0SXin Li void GetCapabilitiesProperties([[maybe_unused]]void* cookie,
38*3e777be0SXin Li [[maybe_unused]]const char *name,
39*3e777be0SXin Li [[maybe_unused]]const char *value,
40*3e777be0SXin Li [[maybe_unused]]uint32_t serial)
41*3e777be0SXin Li {
42*3e777be0SXin Li T &prop = *reinterpret_cast<T*>(cookie);
43*3e777be0SXin Li prop = ConvStringTo<T>::Func(std::string(value));
44*3e777be0SXin Li }
45*3e777be0SXin Li
46*3e777be0SXin Li template<typename T>
ParseSystemProperty(const char * name,T defaultValue)47*3e777be0SXin Li T ParseSystemProperty(const char* name, T defaultValue)
48*3e777be0SXin Li {
49*3e777be0SXin Li try
50*3e777be0SXin Li {
51*3e777be0SXin Li auto const prefixedName = std::string("ro.vendor.") + name;
52*3e777be0SXin Li const prop_info *pInfo = __system_property_find(prefixedName.c_str());
53*3e777be0SXin Li if (!pInfo)
54*3e777be0SXin Li {
55*3e777be0SXin Li ALOGW("ArmnnDriver::ParseSystemProperty(): Could not find property [%s].", name);
56*3e777be0SXin Li } else
57*3e777be0SXin Li {
58*3e777be0SXin Li T property;
59*3e777be0SXin Li __system_property_read_callback(pInfo, &GetCapabilitiesProperties<T>, &property);
60*3e777be0SXin Li std::stringstream messageBuilder;
61*3e777be0SXin Li messageBuilder << "ArmnnDriver::ParseSystemProperty(): Setting [" << name << "]=[" << property << "].";
62*3e777be0SXin Li ALOGD("%s", messageBuilder.str().c_str());
63*3e777be0SXin Li return property;
64*3e777be0SXin Li }
65*3e777be0SXin Li }
66*3e777be0SXin Li catch(const std::invalid_argument& e)
67*3e777be0SXin Li {
68*3e777be0SXin Li ALOGD("ArmnnDriver::ParseSystemProperty(): Property [%s] has invalid data type.", name);
69*3e777be0SXin Li }
70*3e777be0SXin Li catch(const std::out_of_range& e)
71*3e777be0SXin Li {
72*3e777be0SXin Li ALOGD("ArmnnDriver::ParseSystemProperty(): Property [%s] out of range for the data type.", name);
73*3e777be0SXin Li }
74*3e777be0SXin Li catch (...)
75*3e777be0SXin Li {
76*3e777be0SXin Li ALOGD("ArmnnDriver::ParseSystemProperty(): Unexpected exception reading system "
77*3e777be0SXin Li "property [%s].", name);
78*3e777be0SXin Li }
79*3e777be0SXin Li
80*3e777be0SXin Li std::stringstream messageBuilder;
81*3e777be0SXin Li messageBuilder << "ArmnnDriver::ParseSystemProperty(): Falling back to default value [" << defaultValue << "]";
82*3e777be0SXin Li ALOGD("%s", messageBuilder.str().c_str());
83*3e777be0SXin Li return defaultValue;
84*3e777be0SXin Li }
85*3e777be0SXin Li } //namespace
86