summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot2018-04-10 02:25:32 -0500
committerandroid-build-team Robot2018-04-10 02:25:32 -0500
commit862b4d93fb2009a6e81a5cfd5e1041eae2510fc4 (patch)
treeb343f4b66d3f2efdc3d3b3773e4b1c74389d7ee8
parentebb05da501b44f78c2a19f44db242ee853f13525 (diff)
parent78677442cb54ccd1fd15564c2ce16e57d7286a1d (diff)
downloadplatform-hardware-interfaces-862b4d93fb2009a6e81a5cfd5e1041eae2510fc4.tar.gz
platform-hardware-interfaces-862b4d93fb2009a6e81a5cfd5e1041eae2510fc4.tar.xz
platform-hardware-interfaces-862b4d93fb2009a6e81a5cfd5e1041eae2510fc4.zip
Snap for 4710485 from 78677442cb54ccd1fd15564c2ce16e57d7286a1d to pi-release
Change-Id: Ia874166e3286c4bf81bc01fb3ac431816d4ecd35
-rw-r--r--camera/device/3.2/default/CameraDeviceSession.cpp5
-rw-r--r--cas/1.0/default/CasImpl.cpp82
-rw-r--r--cas/1.0/default/CasImpl.h2
-rw-r--r--cas/1.0/default/DescramblerImpl.cpp46
-rw-r--r--cas/1.0/default/DescramblerImpl.h2
-rw-r--r--configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy1
-rw-r--r--current.txt2
-rw-r--r--neuralnetworks/1.0/types.hal2
8 files changed, 80 insertions, 62 deletions
diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp
index 5f89cde9..60a57cde 100644
--- a/camera/device/3.2/default/CameraDeviceSession.cpp
+++ b/camera/device/3.2/default/CameraDeviceSession.cpp
@@ -645,7 +645,10 @@ void CameraDeviceSession::ResultBatcher::invokeProcessCaptureResultCallback(
645 result.fmqResultSize = result.result.size(); 645 result.fmqResultSize = result.result.size();
646 result.result.resize(0); 646 result.result.resize(0);
647 } else { 647 } else {
648 ALOGW("%s: couldn't utilize fmq, fall back to hwbinder", __FUNCTION__); 648 ALOGW("%s: couldn't utilize fmq, fall back to hwbinder, result size: %zu,"
649 "shared message queue available size: %zu",
650 __FUNCTION__, result.result.size(),
651 mResultMetadataQueue->availableToWrite());
649 result.fmqResultSize = 0; 652 result.fmqResultSize = 0;
650 } 653 }
651 } 654 }
diff --git a/cas/1.0/default/CasImpl.cpp b/cas/1.0/default/CasImpl.cpp
index 2ac1c4f6..178020e4 100644
--- a/cas/1.0/default/CasImpl.cpp
+++ b/cas/1.0/default/CasImpl.cpp
@@ -31,19 +31,8 @@ namespace cas {
31namespace V1_0 { 31namespace V1_0 {
32namespace implementation { 32namespace implementation {
33 33
34struct CasImpl::PluginHolder : public RefBase {
35public:
36 explicit PluginHolder(CasPlugin *plugin) : mPlugin(plugin) {}
37 ~PluginHolder() { if (mPlugin != NULL) delete mPlugin; }
38 CasPlugin* get() { return mPlugin; }
39
40private:
41 CasPlugin *mPlugin;
42 DISALLOW_EVIL_CONSTRUCTORS(PluginHolder);
43};
44
45CasImpl::CasImpl(const sp<ICasListener> &listener) 34CasImpl::CasImpl(const sp<ICasListener> &listener)
46 : mPluginHolder(NULL), mListener(listener) { 35 : mListener(listener) {
47 ALOGV("CTOR"); 36 ALOGV("CTOR");
48} 37}
49 38
@@ -69,7 +58,8 @@ void CasImpl::OnEvent(
69 58
70void CasImpl::init(const sp<SharedLibrary>& library, CasPlugin *plugin) { 59void CasImpl::init(const sp<SharedLibrary>& library, CasPlugin *plugin) {
71 mLibrary = library; 60 mLibrary = library;
72 mPluginHolder = new PluginHolder(plugin); 61 std::shared_ptr<CasPlugin> holder(plugin);
62 std::atomic_store(&mPluginHolder, holder);
73} 63}
74 64
75void CasImpl::onEvent( 65void CasImpl::onEvent(
@@ -88,22 +78,22 @@ void CasImpl::onEvent(
88 78
89Return<Status> CasImpl::setPrivateData(const HidlCasData& pvtData) { 79Return<Status> CasImpl::setPrivateData(const HidlCasData& pvtData) {
90 ALOGV("%s", __FUNCTION__); 80 ALOGV("%s", __FUNCTION__);
91 sp<PluginHolder> holder = mPluginHolder; 81 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
92 if (holder == NULL) { 82 if (holder.get() == nullptr) {
93 return toStatus(INVALID_OPERATION); 83 return toStatus(INVALID_OPERATION);
94 } 84 }
95 return toStatus(holder->get()->setPrivateData(pvtData)); 85 return toStatus(holder->setPrivateData(pvtData));
96} 86}
97 87
98Return<void> CasImpl::openSession(openSession_cb _hidl_cb) { 88Return<void> CasImpl::openSession(openSession_cb _hidl_cb) {
99 ALOGV("%s", __FUNCTION__); 89 ALOGV("%s", __FUNCTION__);
100 CasSessionId sessionId; 90 CasSessionId sessionId;
101 91
102 sp<PluginHolder> holder = mPluginHolder; 92 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
103 status_t err = INVALID_OPERATION; 93 status_t err = INVALID_OPERATION;
104 if (holder != NULL) { 94 if (holder.get() != nullptr) {
105 err = holder->get()->openSession(&sessionId); 95 err = holder->openSession(&sessionId);
106 holder.clear(); 96 holder.reset();
107 } 97 }
108 98
109 _hidl_cb(toStatus(err), sessionId); 99 _hidl_cb(toStatus(err), sessionId);
@@ -115,87 +105,87 @@ Return<Status> CasImpl::setSessionPrivateData(
115 const HidlCasSessionId &sessionId, const HidlCasData& pvtData) { 105 const HidlCasSessionId &sessionId, const HidlCasData& pvtData) {
116 ALOGV("%s: sessionId=%s", __FUNCTION__, 106 ALOGV("%s: sessionId=%s", __FUNCTION__,
117 sessionIdToString(sessionId).string()); 107 sessionIdToString(sessionId).string());
118 sp<PluginHolder> holder = mPluginHolder; 108 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
119 if (holder == NULL) { 109 if (holder.get() == nullptr) {
120 return toStatus(INVALID_OPERATION); 110 return toStatus(INVALID_OPERATION);
121 } 111 }
122 return toStatus( 112 return toStatus(holder->setSessionPrivateData(sessionId, pvtData));
123 holder->get()->setSessionPrivateData(
124 sessionId, pvtData));
125} 113}
126 114
127Return<Status> CasImpl::closeSession(const HidlCasSessionId &sessionId) { 115Return<Status> CasImpl::closeSession(const HidlCasSessionId &sessionId) {
128 ALOGV("%s: sessionId=%s", __FUNCTION__, 116 ALOGV("%s: sessionId=%s", __FUNCTION__,
129 sessionIdToString(sessionId).string()); 117 sessionIdToString(sessionId).string());
130 sp<PluginHolder> holder = mPluginHolder; 118 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
131 if (holder == NULL) { 119 if (holder.get() == nullptr) {
132 return toStatus(INVALID_OPERATION); 120 return toStatus(INVALID_OPERATION);
133 } 121 }
134 return toStatus(holder->get()->closeSession(sessionId)); 122 return toStatus(holder->closeSession(sessionId));
135} 123}
136 124
137Return<Status> CasImpl::processEcm( 125Return<Status> CasImpl::processEcm(
138 const HidlCasSessionId &sessionId, const HidlCasData& ecm) { 126 const HidlCasSessionId &sessionId, const HidlCasData& ecm) {
139 ALOGV("%s: sessionId=%s", __FUNCTION__, 127 ALOGV("%s: sessionId=%s", __FUNCTION__,
140 sessionIdToString(sessionId).string()); 128 sessionIdToString(sessionId).string());
141 sp<PluginHolder> holder = mPluginHolder; 129 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
142 if (holder == NULL) { 130 if (holder.get() == nullptr) {
143 return toStatus(INVALID_OPERATION); 131 return toStatus(INVALID_OPERATION);
144 } 132 }
145 133
146 return toStatus(holder->get()->processEcm(sessionId, ecm)); 134 return toStatus(holder->processEcm(sessionId, ecm));
147} 135}
148 136
149Return<Status> CasImpl::processEmm(const HidlCasData& emm) { 137Return<Status> CasImpl::processEmm(const HidlCasData& emm) {
150 ALOGV("%s", __FUNCTION__); 138 ALOGV("%s", __FUNCTION__);
151 sp<PluginHolder> holder = mPluginHolder; 139 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
152 if (holder == NULL) { 140 if (holder.get() == nullptr) {
153 return toStatus(INVALID_OPERATION); 141 return toStatus(INVALID_OPERATION);
154 } 142 }
155 143
156 return toStatus(holder->get()->processEmm(emm)); 144 return toStatus(holder->processEmm(emm));
157} 145}
158 146
159Return<Status> CasImpl::sendEvent( 147Return<Status> CasImpl::sendEvent(
160 int32_t event, int32_t arg, 148 int32_t event, int32_t arg,
161 const HidlCasData& eventData) { 149 const HidlCasData& eventData) {
162 ALOGV("%s", __FUNCTION__); 150 ALOGV("%s", __FUNCTION__);
163 sp<PluginHolder> holder = mPluginHolder; 151 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
164 if (holder == NULL) { 152 if (holder.get() == nullptr) {
165 return toStatus(INVALID_OPERATION); 153 return toStatus(INVALID_OPERATION);
166 } 154 }
167 155
168 status_t err = holder->get()->sendEvent(event, arg, eventData); 156 status_t err = holder->sendEvent(event, arg, eventData);
169 return toStatus(err); 157 return toStatus(err);
170} 158}
171 159
172Return<Status> CasImpl::provision(const hidl_string& provisionString) { 160Return<Status> CasImpl::provision(const hidl_string& provisionString) {
173 ALOGV("%s: provisionString=%s", __FUNCTION__, provisionString.c_str()); 161 ALOGV("%s: provisionString=%s", __FUNCTION__, provisionString.c_str());
174 sp<PluginHolder> holder = mPluginHolder; 162 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
175 if (holder == NULL) { 163 if (holder.get() == nullptr) {
176 return toStatus(INVALID_OPERATION); 164 return toStatus(INVALID_OPERATION);
177 } 165 }
178 166
179 return toStatus(holder->get()->provision(String8(provisionString.c_str()))); 167 return toStatus(holder->provision(String8(provisionString.c_str())));
180} 168}
181 169
182Return<Status> CasImpl::refreshEntitlements( 170Return<Status> CasImpl::refreshEntitlements(
183 int32_t refreshType, 171 int32_t refreshType,
184 const HidlCasData& refreshData) { 172 const HidlCasData& refreshData) {
185 ALOGV("%s", __FUNCTION__); 173 ALOGV("%s", __FUNCTION__);
186 sp<PluginHolder> holder = mPluginHolder; 174 std::shared_ptr<CasPlugin> holder = std::atomic_load(&mPluginHolder);
187 if (holder == NULL) { 175 if (holder.get() == nullptr) {
188 return toStatus(INVALID_OPERATION); 176 return toStatus(INVALID_OPERATION);
189 } 177 }
190 178
191 status_t err = holder->get()->refreshEntitlements(refreshType, refreshData); 179 status_t err = holder->refreshEntitlements(refreshType, refreshData);
192 return toStatus(err); 180 return toStatus(err);
193} 181}
194 182
195Return<Status> CasImpl::release() { 183Return<Status> CasImpl::release() {
196 ALOGV("%s: plugin=%p", __FUNCTION__, 184 ALOGV("%s: plugin=%p", __FUNCTION__, mPluginHolder.get());
197 mPluginHolder != NULL ? mPluginHolder->get() : NULL); 185
198 mPluginHolder.clear(); 186 std::shared_ptr<CasPlugin> holder(nullptr);
187 std::atomic_store(&mPluginHolder, holder);
188
199 return Status::OK; 189 return Status::OK;
200} 190}
201 191
diff --git a/cas/1.0/default/CasImpl.h b/cas/1.0/default/CasImpl.h
index 841d64e0..d7928381 100644
--- a/cas/1.0/default/CasImpl.h
+++ b/cas/1.0/default/CasImpl.h
@@ -88,7 +88,7 @@ public:
88private: 88private:
89 struct PluginHolder; 89 struct PluginHolder;
90 sp<SharedLibrary> mLibrary; 90 sp<SharedLibrary> mLibrary;
91 sp<PluginHolder> mPluginHolder; 91 std::shared_ptr<CasPlugin> mPluginHolder;
92 sp<ICasListener> mListener; 92 sp<ICasListener> mListener;
93 93
94 DISALLOW_EVIL_CONSTRUCTORS(CasImpl); 94 DISALLOW_EVIL_CONSTRUCTORS(CasImpl);
diff --git a/cas/1.0/default/DescramblerImpl.cpp b/cas/1.0/default/DescramblerImpl.cpp
index 36699baf..1f899337 100644
--- a/cas/1.0/default/DescramblerImpl.cpp
+++ b/cas/1.0/default/DescramblerImpl.cpp
@@ -50,12 +50,12 @@ CHECK_SUBSAMPLE_DEF(CryptoPlugin);
50 50
51DescramblerImpl::DescramblerImpl( 51DescramblerImpl::DescramblerImpl(
52 const sp<SharedLibrary>& library, DescramblerPlugin *plugin) : 52 const sp<SharedLibrary>& library, DescramblerPlugin *plugin) :
53 mLibrary(library), mPlugin(plugin) { 53 mLibrary(library), mPluginHolder(plugin) {
54 ALOGV("CTOR: mPlugin=%p", mPlugin); 54 ALOGV("CTOR: plugin=%p", mPluginHolder.get());
55} 55}
56 56
57DescramblerImpl::~DescramblerImpl() { 57DescramblerImpl::~DescramblerImpl() {
58 ALOGV("DTOR: mPlugin=%p", mPlugin); 58 ALOGV("DTOR: plugin=%p", mPluginHolder.get());
59 release(); 59 release();
60} 60}
61 61
@@ -63,12 +63,22 @@ Return<Status> DescramblerImpl::setMediaCasSession(const HidlCasSessionId& sessi
63 ALOGV("%s: sessionId=%s", __FUNCTION__, 63 ALOGV("%s: sessionId=%s", __FUNCTION__,
64 sessionIdToString(sessionId).string()); 64 sessionIdToString(sessionId).string());
65 65
66 return toStatus(mPlugin->setMediaCasSession(sessionId)); 66 std::shared_ptr<DescramblerPlugin> holder = std::atomic_load(&mPluginHolder);
67 if (holder.get() == nullptr) {
68 return toStatus(INVALID_OPERATION);
69 }
70
71 return toStatus(holder->setMediaCasSession(sessionId));
67} 72}
68 73
69Return<bool> DescramblerImpl::requiresSecureDecoderComponent( 74Return<bool> DescramblerImpl::requiresSecureDecoderComponent(
70 const hidl_string& mime) { 75 const hidl_string& mime) {
71 return mPlugin->requiresSecureDecoderComponent(String8(mime.c_str())); 76 std::shared_ptr<DescramblerPlugin> holder = std::atomic_load(&mPluginHolder);
77 if (holder.get() == nullptr) {
78 return false;
79 }
80
81 return holder->requiresSecureDecoderComponent(String8(mime.c_str()));
72} 82}
73 83
74static inline bool validateRangeForSize( 84static inline bool validateRangeForSize(
@@ -86,12 +96,23 @@ Return<void> DescramblerImpl::descramble(
86 descramble_cb _hidl_cb) { 96 descramble_cb _hidl_cb) {
87 ALOGV("%s", __FUNCTION__); 97 ALOGV("%s", __FUNCTION__);
88 98
99 // Get a local copy of the shared_ptr for the plugin. Note that before
100 // calling the HIDL callback, this shared_ptr must be manually reset,
101 // since the client side could proceed as soon as the callback is called
102 // without waiting for this method to go out of scope.
103 std::shared_ptr<DescramblerPlugin> holder = std::atomic_load(&mPluginHolder);
104 if (holder.get() == nullptr) {
105 _hidl_cb(toStatus(INVALID_OPERATION), 0, NULL);
106 return Void();
107 }
108
89 sp<IMemory> srcMem = mapMemory(srcBuffer.heapBase); 109 sp<IMemory> srcMem = mapMemory(srcBuffer.heapBase);
90 110
91 // Validate if the offset and size in the SharedBuffer is consistent with the 111 // Validate if the offset and size in the SharedBuffer is consistent with the
92 // mapped ashmem, since the offset and size is controlled by client. 112 // mapped ashmem, since the offset and size is controlled by client.
93 if (srcMem == NULL) { 113 if (srcMem == NULL) {
94 ALOGE("Failed to map src buffer."); 114 ALOGE("Failed to map src buffer.");
115 holder.reset();
95 _hidl_cb(toStatus(BAD_VALUE), 0, NULL); 116 _hidl_cb(toStatus(BAD_VALUE), 0, NULL);
96 return Void(); 117 return Void();
97 } 118 }
@@ -100,6 +121,7 @@ Return<void> DescramblerImpl::descramble(
100 ALOGE("Invalid src buffer range: offset %llu, size %llu, srcMem size %llu", 121 ALOGE("Invalid src buffer range: offset %llu, size %llu, srcMem size %llu",
101 srcBuffer.offset, srcBuffer.size, (uint64_t)srcMem->getSize()); 122 srcBuffer.offset, srcBuffer.size, (uint64_t)srcMem->getSize());
102 android_errorWriteLog(0x534e4554, "67962232"); 123 android_errorWriteLog(0x534e4554, "67962232");
124 holder.reset();
103 _hidl_cb(toStatus(BAD_VALUE), 0, NULL); 125 _hidl_cb(toStatus(BAD_VALUE), 0, NULL);
104 return Void(); 126 return Void();
105 } 127 }
@@ -117,6 +139,7 @@ Return<void> DescramblerImpl::descramble(
117 "srcOffset %llu, totalBytesInSubSamples %llu, srcBuffer size %llu", 139 "srcOffset %llu, totalBytesInSubSamples %llu, srcBuffer size %llu",
118 srcOffset, totalBytesInSubSamples, srcBuffer.size); 140 srcOffset, totalBytesInSubSamples, srcBuffer.size);
119 android_errorWriteLog(0x534e4554, "67962232"); 141 android_errorWriteLog(0x534e4554, "67962232");
142 holder.reset();
120 _hidl_cb(toStatus(BAD_VALUE), 0, NULL); 143 _hidl_cb(toStatus(BAD_VALUE), 0, NULL);
121 return Void(); 144 return Void();
122 } 145 }
@@ -135,6 +158,7 @@ Return<void> DescramblerImpl::descramble(
135 "dstOffset %llu, totalBytesInSubSamples %llu, srcBuffer size %llu", 158 "dstOffset %llu, totalBytesInSubSamples %llu, srcBuffer size %llu",
136 dstOffset, totalBytesInSubSamples, srcBuffer.size); 159 dstOffset, totalBytesInSubSamples, srcBuffer.size);
137 android_errorWriteLog(0x534e4554, "67962232"); 160 android_errorWriteLog(0x534e4554, "67962232");
161 holder.reset();
138 _hidl_cb(toStatus(BAD_VALUE), 0, NULL); 162 _hidl_cb(toStatus(BAD_VALUE), 0, NULL);
139 return Void(); 163 return Void();
140 } 164 }
@@ -146,7 +170,7 @@ Return<void> DescramblerImpl::descramble(
146 // Casting hidl SubSample to DescramblerPlugin::SubSample, but need 170 // Casting hidl SubSample to DescramblerPlugin::SubSample, but need
147 // to ensure structs are actually idential 171 // to ensure structs are actually idential
148 172
149 int32_t result = mPlugin->descramble( 173 int32_t result = holder->descramble(
150 dstBuffer.type != BufferType::SHARED_MEMORY, 174 dstBuffer.type != BufferType::SHARED_MEMORY,
151 (DescramblerPlugin::ScramblingControl)scramblingControl, 175 (DescramblerPlugin::ScramblingControl)scramblingControl,
152 subSamples.size(), 176 subSamples.size(),
@@ -157,17 +181,17 @@ Return<void> DescramblerImpl::descramble(
157 dstOffset, 181 dstOffset,
158 NULL); 182 NULL);
159 183
184 holder.reset();
160 _hidl_cb(toStatus(result >= 0 ? OK : result), result, NULL); 185 _hidl_cb(toStatus(result >= 0 ? OK : result), result, NULL);
161 return Void(); 186 return Void();
162} 187}
163 188
164Return<Status> DescramblerImpl::release() { 189Return<Status> DescramblerImpl::release() {
165 ALOGV("%s: mPlugin=%p", __FUNCTION__, mPlugin); 190 ALOGV("%s: plugin=%p", __FUNCTION__, mPluginHolder.get());
191
192 std::shared_ptr<DescramblerPlugin> holder(nullptr);
193 std::atomic_store(&mPluginHolder, holder);
166 194
167 if (mPlugin != NULL) {
168 delete mPlugin;
169 mPlugin = NULL;
170 }
171 return Status::OK; 195 return Status::OK;
172} 196}
173 197
diff --git a/cas/1.0/default/DescramblerImpl.h b/cas/1.0/default/DescramblerImpl.h
index d3b146ec..305f1154 100644
--- a/cas/1.0/default/DescramblerImpl.h
+++ b/cas/1.0/default/DescramblerImpl.h
@@ -55,7 +55,7 @@ public:
55 55
56private: 56private:
57 sp<SharedLibrary> mLibrary; 57 sp<SharedLibrary> mLibrary;
58 DescramblerPlugin *mPlugin; 58 std::shared_ptr<DescramblerPlugin> mPluginHolder;
59 59
60 DISALLOW_EVIL_CONSTRUCTORS(DescramblerImpl); 60 DISALLOW_EVIL_CONSTRUCTORS(DescramblerImpl);
61}; 61};
diff --git a/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy b/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy
index f2dd8922..d523a1a7 100644
--- a/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy
+++ b/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy
@@ -42,6 +42,7 @@ exit_group: 1
42rt_sigreturn: 1 42rt_sigreturn: 1
43getrlimit: 1 43getrlimit: 1
44madvise: 1 44madvise: 1
45getdents64: 1
45clock_gettime: 1 46clock_gettime: 1
46 47
47# used during process crash by crash_dump to dump process info 48# used during process crash by crash_dump to dump process info
diff --git a/current.txt b/current.txt
index 5aa62591..0d792720 100644
--- a/current.txt
+++ b/current.txt
@@ -258,7 +258,7 @@ cf72ff5a52bfa4d08e9e1000cf3ab5952a2d280c7f13cdad5ab7905c08050766 android.hardwar
258fb92e2b40f8e9d494e8fd3b4ac18499a3216342e7cff160714c3bbf3660b6e79 android.hardware.gnss@1.0::IGnssConfiguration 258fb92e2b40f8e9d494e8fd3b4ac18499a3216342e7cff160714c3bbf3660b6e79 android.hardware.gnss@1.0::IGnssConfiguration
259251594ea9b27447bfa005ebd806e58fb0ae4aad84a69938129c9800ec0c64eda android.hardware.gnss@1.0::IGnssMeasurementCallback 259251594ea9b27447bfa005ebd806e58fb0ae4aad84a69938129c9800ec0c64eda android.hardware.gnss@1.0::IGnssMeasurementCallback
2604e7169919d24fbe5573e5bcd683d0bd7abf553a4e6c34c41f9dfc1e12050db07 android.hardware.gnss@1.0::IGnssNavigationMessageCallback 2604e7169919d24fbe5573e5bcd683d0bd7abf553a4e6c34c41f9dfc1e12050db07 android.hardware.gnss@1.0::IGnssNavigationMessageCallback
26108ae9fc24f21f809e9b8501dfbc803662fcd6a8d8e1fb71d9dd7c0c4c6f5d556 android.hardware.neuralnetworks@1.0::types 2611488db5ffb8a7979488d1084761aab8bca2f59bc9a02d75cdefc296afeaf591b android.hardware.neuralnetworks@1.0::types
262d4840db8efabdf1e4b344fc981cd36e5fe81a39aff6e199f6d06c1c8da413efd android.hardware.radio@1.0::types 262d4840db8efabdf1e4b344fc981cd36e5fe81a39aff6e199f6d06c1c8da413efd android.hardware.radio@1.0::types
263b280c4704dfcc548a9bf127b59b7c3578f460c50cce70a06b66fe0df8b27cff0 android.hardware.wifi@1.0::types 263b280c4704dfcc548a9bf127b59b7c3578f460c50cce70a06b66fe0df8b27cff0 android.hardware.wifi@1.0::types
264 264
diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal
index c97a00be..a9c91cd4 100644
--- a/neuralnetworks/1.0/types.hal
+++ b/neuralnetworks/1.0/types.hal
@@ -44,7 +44,7 @@ enum OperandType : int32_t {
44 * 44 *
45 * Attached to this tensor are two numbers that can be used to convert the 45 * Attached to this tensor are two numbers that can be used to convert the
46 * 8 bit integer to the real value and vice versa. These two numbers are: 46 * 8 bit integer to the real value and vice versa. These two numbers are:
47 * - scale: a 32 bit floating point value 47 * - scale: a 32 bit floating point value greater than zero
48 * - zero_value: a 32 bit integer 48 * - zero_value: a 32 bit integer
49 * 49 *
50 * The formula is: 50 * The formula is: