Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <plat/inc/taggedPtr.h>
     18 #include <cpu/inc/barrier.h>
     19 #include <atomicBitset.h>
     20 #include <inttypes.h>
     21 #include <sensors.h>
     22 #include <atomic.h>
     23 #include <stdio.h>
     24 #include <slab.h>
     25 #include <seos.h>
     26 #include <util.h>
     27 
     28 #define MAX_INTERNAL_EVENTS       32 //also used for external app sensors' setRate() calls
     29 #define MAX_CLI_SENS_MATRIX_SZ    64 /* MAX(numClients * numSensors) */
     30 
     31 #define SENSOR_RATE_OFF           0x00000000UL /* used in sensor state machine */
     32 #define SENSOR_RATE_POWERING_ON   0xFFFFFFF0UL /* used in sensor state machine */
     33 #define SENSOR_RATE_POWERING_OFF  0xFFFFFFF1UL /* used in sensor state machine */
     34 #define SENSOR_RATE_FW_UPLOADING  0xFFFFFFF2UL /* used in sensor state machine */
     35 #define SENSOR_RATE_IMPOSSIBLE    0xFFFFFFF3UL /* used in rate calc to indicate impossible combinations */
     36 #define SENSOR_LATENCY_INVALID    0xFFFFFFFFFFFFFFFFULL
     37 
     38 #define HANDLE_TO_TID(handle) (((handle) >> (32 - TASK_TID_BITS)) & TASK_TID_MASK)
     39 #define EXT_APP_TID(s) HANDLE_TO_TID(s->handle)
     40 #define LOCAL_APP_OPS(s) ((const struct SensorOps*)taggedPtrToPtr(s->callInfo))
     41 #define IS_LOCAL_APP(s) (taggedPtrIsPtr(s->callInfo))
     42 
     43 struct Sensor {
     44     const struct SensorInfo *si;
     45     uint32_t handle;         /* here 0 means invalid */
     46     uint64_t currentLatency; /* here 0 means no batching */
     47     uint32_t currentRate;    /* here 0 means off */
     48     TaggedPtr callInfo;      /* pointer to ops struct or app tid */
     49     void *callData;
     50     uint32_t initComplete:1; /* sensor finished initializing */
     51     uint32_t hasOnchange :1; /* sensor supports onchange and wants to be notified to send new clients current state */
     52     uint32_t hasOndemand :1; /* sensor supports ondemand and wants to get triggers */
     53 };
     54 
     55 struct SensorsInternalEvent {
     56     union {
     57         struct {
     58             uint32_t handle;
     59             uint32_t value1;
     60             uint64_t value2;
     61         };
     62         struct SensorPowerEvent externalPowerEvt;
     63         struct SensorSetRateEvent externalSetRateEvt;
     64         struct SensorCfgDataEvent externalCfgDataEvt;
     65         struct SensorSendDirectEventEvent externalSendDirectEvt;
     66         struct SensorMarshallUserEventEvent externalMarshallEvt;
     67     };
     68 };
     69 
     70 struct SensorsClientRequest {
     71     uint32_t handle;
     72     uint32_t clientTid;
     73     uint64_t latency;
     74     uint32_t rate;
     75 };
     76 
     77 static struct Sensor mSensors[MAX_REGISTERED_SENSORS];
     78 ATOMIC_BITSET_DECL(mSensorsUsed, MAX_REGISTERED_SENSORS, static);
     79 static struct SlabAllocator *mInternalEvents;
     80 static struct SlabAllocator *mCliSensMatrix;
     81 static uint32_t mNextSensorHandle;
     82 struct SingleAxisDataEvent singleAxisFlush = { .referenceTime = 0 };
     83 struct TripleAxisDataEvent tripleAxisFlush = { .referenceTime = 0 };
     84 
     85 static inline uint32_t newSensorHandle()
     86 {
     87     // FIXME: only let lower 8 bits of counter to the id; should use all 16 bits, but this
     88     // somehow confuses upper layers; pending investigation
     89     return (osGetCurrentTid() << 16) | (atomicAdd32bits(&mNextSensorHandle, 1) & 0xFF);
     90 }
     91 
     92 bool sensorsInit(void)
     93 {
     94     atomicBitsetInit(mSensorsUsed, MAX_REGISTERED_SENSORS);
     95 
     96     mInternalEvents = slabAllocatorNew(sizeof(struct SensorsInternalEvent), alignof(struct SensorsInternalEvent), MAX_INTERNAL_EVENTS);
     97     if (!mInternalEvents)
     98         return false;
     99 
    100     mCliSensMatrix = slabAllocatorNew(sizeof(struct SensorsClientRequest), alignof(struct SensorsClientRequest), MAX_CLI_SENS_MATRIX_SZ);
    101     if (mCliSensMatrix)
    102         return true;
    103 
    104     slabAllocatorDestroy(mInternalEvents);
    105 
    106     return false;
    107 }
    108 
    109 static struct Sensor* sensorFindByHandle(uint32_t handle)
    110 {
    111     uint32_t i;
    112 
    113     for (i = 0; i < MAX_REGISTERED_SENSORS; i++)
    114         if (mSensors[i].handle == handle)
    115             return mSensors + i;
    116 
    117     return NULL;
    118 }
    119 
    120 static uint32_t sensorRegisterEx(const struct SensorInfo *si, TaggedPtr callInfo, void *callData, bool initComplete)
    121 {
    122     int32_t idx = atomicBitsetFindClearAndSet(mSensorsUsed);
    123     uint32_t handle, i;
    124     struct Sensor *s;
    125 
    126     /* grab a slot */
    127     if (idx < 0)
    128         return 0;
    129 
    130     /* grab a handle:
    131      * this is safe since nobody else could have "JUST" taken this handle,
    132      * we'll need to circle around 16 bits before that happens, and have the same TID
    133      */
    134     do {
    135         handle = newSensorHandle();
    136     } while (!handle || sensorFindByHandle(handle));
    137 
    138     /* fill the struct in and mark it valid (by setting handle) */
    139     s = mSensors + idx;
    140     s->si = si;
    141     s->currentRate = SENSOR_RATE_OFF;
    142     s->currentLatency = SENSOR_LATENCY_INVALID;
    143     s->callInfo = callInfo;
    144     // TODO: is internal app, callinfo is OPS struct; shall we validate it here?
    145     s->callData = callData;
    146     s->initComplete = initComplete ? 1 : 0;
    147     mem_reorder_barrier();
    148     s->handle = handle;
    149     s->hasOnchange = 0;
    150     s->hasOndemand = 0;
    151 
    152     if (si->supportedRates) {
    153         for (i = 0; si->supportedRates[i]; i++) {
    154             if (si->supportedRates[i] == SENSOR_RATE_ONCHANGE)
    155                 s->hasOnchange = 1;
    156             if (si->supportedRates[i] == SENSOR_RATE_ONDEMAND)
    157                 s->hasOndemand = 1;
    158         }
    159     }
    160 
    161     return handle;
    162 }
    163 
    164 uint32_t sensorRegister(const struct SensorInfo *si, const struct SensorOps *ops, void *callData, bool initComplete)
    165 {
    166     return sensorRegisterEx(si, taggedPtrMakeFromPtr(ops), callData, initComplete);
    167 }
    168 
    169 uint32_t sensorRegisterAsApp(const struct SensorInfo *si, uint32_t unusedTid, void *callData, bool initComplete)
    170 {
    171     (void)unusedTid;
    172     return sensorRegisterEx(si, taggedPtrMakeFromUint(0), callData, initComplete);
    173 }
    174 
    175 bool sensorRegisterInitComplete(uint32_t handle)
    176 {
    177     struct Sensor *s = sensorFindByHandle(handle);
    178 
    179     if (!s)
    180         return false;
    181 
    182     s->initComplete = true;
    183     mem_reorder_barrier();
    184 
    185     return true;
    186 }
    187 
    188 bool sensorUnregister(uint32_t handle)
    189 {
    190     struct Sensor *s = sensorFindByHandle(handle);
    191 
    192     if (!s)
    193         return false;
    194 
    195     /* mark as invalid */
    196     s->handle = 0;
    197     mem_reorder_barrier();
    198 
    199     /* free struct */
    200     atomicBitsetClearBit(mSensorsUsed, s - mSensors);
    201 
    202     return true;
    203 }
    204 
    205 static void sensorCallFuncPowerEvtFreeF(void* event)
    206 {
    207     slabAllocatorFree(mInternalEvents, event);
    208 }
    209 
    210 #define INVOKE_AS_OWNER_AND_RETURN(func, ...)                       \
    211 {                                                                   \
    212     if (!func)                                                      \
    213         return false;                                               \
    214     uint16_t oldTid = osSetCurrentTid(HANDLE_TO_TID(s->handle));    \
    215     bool done = func(__VA_ARGS__);                                  \
    216     osSetCurrentTid(oldTid);                                        \
    217     return done;                                                    \
    218 }
    219 
    220 static bool sensorCallFuncPower(struct Sensor* s, bool on)
    221 {
    222     if (IS_LOCAL_APP(s)) {
    223         INVOKE_AS_OWNER_AND_RETURN(LOCAL_APP_OPS(s)->sensorPower, on, s->callData);
    224     } else {
    225         struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)slabAllocatorAlloc(mInternalEvents);
    226 
    227         if (!evt)
    228             return false;
    229 
    230         evt->externalPowerEvt.on = on;
    231         evt->externalPowerEvt.callData = s->callData;
    232 
    233         if (osEnqueuePrivateEvt(EVT_APP_SENSOR_POWER, &evt->externalPowerEvt,
    234             sensorCallFuncPowerEvtFreeF, EXT_APP_TID(s)))
    235             return true;
    236 
    237         slabAllocatorFree(mInternalEvents, evt);
    238         return false;
    239     }
    240 }
    241 
    242 // the most common callback goes as a helper function
    243 static bool sensorCallAsOwner(struct Sensor* s, bool (*callback)(void*))
    244 {
    245     INVOKE_AS_OWNER_AND_RETURN(callback, s->callData);
    246 }
    247 
    248 static bool sensorCallFuncFwUpld(struct Sensor* s)
    249 {
    250     if (IS_LOCAL_APP(s))
    251         return sensorCallAsOwner(s, LOCAL_APP_OPS(s)->sensorFirmwareUpload);
    252     else
    253         return osEnqueuePrivateEvt(EVT_APP_SENSOR_FW_UPLD, s->callData, NULL, EXT_APP_TID(s));
    254 }
    255 
    256 static void sensorCallFuncExternalEvtFreeF(void* event)
    257 {
    258     slabAllocatorFree(mInternalEvents, event);
    259 }
    260 
    261 static bool sensorCallFuncSetRate(struct Sensor* s, uint32_t rate, uint64_t latency)
    262 {
    263     if (IS_LOCAL_APP(s)) {
    264         INVOKE_AS_OWNER_AND_RETURN(LOCAL_APP_OPS(s)->sensorSetRate, rate, latency, s->callData);
    265     } else {
    266         struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)slabAllocatorAlloc(mInternalEvents);
    267 
    268         if (!evt)
    269             return false;
    270 
    271         evt->externalSetRateEvt.latency = latency;
    272         evt->externalSetRateEvt.rate = rate;
    273         evt->externalSetRateEvt.callData = s->callData;
    274         if (osEnqueuePrivateEvt(EVT_APP_SENSOR_SET_RATE, &evt->externalSetRateEvt,
    275             sensorCallFuncExternalEvtFreeF, EXT_APP_TID(s)))
    276             return true;
    277 
    278         slabAllocatorFree(mInternalEvents, evt);
    279         return false;
    280     }
    281 }
    282 
    283 static bool sensorCallFuncCalibrate(struct Sensor* s)
    284 {
    285     if (IS_LOCAL_APP(s))
    286         return sensorCallAsOwner(s, LOCAL_APP_OPS(s)->sensorCalibrate);
    287     else
    288         return osEnqueuePrivateEvt(EVT_APP_SENSOR_CALIBRATE, s->callData, NULL, EXT_APP_TID(s));
    289 }
    290 
    291 static bool sensorCallFuncFlush(struct Sensor* s)
    292 {
    293     if (IS_LOCAL_APP(s))
    294         return sensorCallAsOwner(s, LOCAL_APP_OPS(s)->sensorFlush);
    295     else
    296         return osEnqueuePrivateEvt(EVT_APP_SENSOR_FLUSH, s->callData, NULL, EXT_APP_TID(s));
    297 }
    298 
    299 static bool sensorCallFuncCfgData(struct Sensor* s, void* cfgData)
    300 {
    301     if (IS_LOCAL_APP(s)) {
    302         INVOKE_AS_OWNER_AND_RETURN(LOCAL_APP_OPS(s)->sensorCfgData, cfgData, s->callData);
    303     } else {
    304         struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)slabAllocatorAlloc(mInternalEvents);
    305 
    306         if (!evt)
    307             return false;
    308 
    309         evt->externalCfgDataEvt.data = cfgData;
    310         evt->externalCfgDataEvt.callData = s->callData;
    311         if (osEnqueuePrivateEvt(EVT_APP_SENSOR_CFG_DATA, &evt->externalCfgDataEvt,
    312             sensorCallFuncExternalEvtFreeF, EXT_APP_TID(s)))
    313             return true;
    314 
    315         slabAllocatorFree(mInternalEvents, evt);
    316         return false;
    317     }
    318 }
    319 
    320 static bool sensorCallFuncMarshall(struct Sensor* s, uint32_t evtType, void *evtData, TaggedPtr *evtFreeingInfoP)
    321 {
    322     if (IS_LOCAL_APP(s)) {
    323         INVOKE_AS_OWNER_AND_RETURN(LOCAL_APP_OPS(s)->sensorMarshallData, evtType, evtData, evtFreeingInfoP, s->callData);
    324     } else {
    325         struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)slabAllocatorAlloc(mInternalEvents);
    326 
    327         if (!evt)
    328             return false;
    329 
    330         evt->externalMarshallEvt.origEvtType = evtType;
    331         evt->externalMarshallEvt.origEvtData = evtData;
    332         evt->externalMarshallEvt.evtFreeingInfo = *evtFreeingInfoP;
    333         evt->externalMarshallEvt.callData = s->callData;
    334         if (osEnqueuePrivateEvt(EVT_APP_SENSOR_MARSHALL, &evt->externalMarshallEvt,
    335             sensorCallFuncExternalEvtFreeF, EXT_APP_TID(s)))
    336             return true;
    337 
    338         slabAllocatorFree(mInternalEvents, evt);
    339         return false;
    340     }
    341 }
    342 
    343 static bool sensorCallFuncTrigger(struct Sensor* s)
    344 {
    345     if (IS_LOCAL_APP(s))
    346         return sensorCallAsOwner(s, LOCAL_APP_OPS(s)->sensorTriggerOndemand);
    347     else
    348         return osEnqueuePrivateEvt(EVT_APP_SENSOR_TRIGGER, s->callData, NULL, EXT_APP_TID(s));
    349 }
    350 
    351 static bool sensorCallFuncSendOneDirectEvt(struct Sensor* s, uint32_t tid)
    352 {
    353     if (IS_LOCAL_APP(s)) {
    354         INVOKE_AS_OWNER_AND_RETURN(LOCAL_APP_OPS(s)->sensorSendOneDirectEvt, s->callData, tid);
    355     } else {
    356         struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)slabAllocatorAlloc(mInternalEvents);
    357 
    358         if (!evt)
    359             return false;
    360 
    361         evt->externalSendDirectEvt.tid = tid;
    362         evt->externalSendDirectEvt.callData = s->callData;
    363         if (osEnqueuePrivateEvt(EVT_APP_SENSOR_SEND_ONE_DIR_EVT, &evt->externalSendDirectEvt,
    364             sensorCallFuncExternalEvtFreeF, EXT_APP_TID(s)))
    365             return true;
    366 
    367         slabAllocatorFree(mInternalEvents, evt);
    368     }
    369 
    370     return false;
    371 }
    372 
    373 static void sensorReconfig(struct Sensor* s, uint32_t newHwRate, uint64_t newHwLatency)
    374 {
    375     if (s->currentRate == newHwRate && s->currentLatency == newHwLatency) {
    376         /* do nothing */
    377     }
    378     else if (s->currentRate == SENSOR_RATE_OFF) {
    379         /* if it was off or is off, tell it to come on */
    380         if (sensorCallFuncPower(s, true)) {
    381             s->currentRate = SENSOR_RATE_POWERING_ON;
    382             s->currentLatency = SENSOR_LATENCY_INVALID;
    383         }
    384     }
    385     else if (s->currentRate == SENSOR_RATE_POWERING_OFF) {
    386         /* if it was going to be off or is off, tell it to come back on */
    387         s->currentRate = SENSOR_RATE_POWERING_ON;
    388         s->currentLatency = SENSOR_LATENCY_INVALID;
    389     }
    390     else if (s->currentRate == SENSOR_RATE_POWERING_ON || s->currentRate == SENSOR_RATE_FW_UPLOADING) {
    391         /* if it is powering on - do nothing - all will be done for us */
    392     }
    393     else if (newHwRate > SENSOR_RATE_OFF || newHwLatency < SENSOR_LATENCY_INVALID) {
    394         /* simple rate change - > do it, there is nothing we can do if this fails, so we ignore the immediate errors :( */
    395         (void)sensorCallFuncSetRate(s, newHwRate, newHwLatency);
    396     }
    397     else {
    398         /* powering off */
    399         if (sensorCallFuncPower(s, false)) {
    400             s->currentRate = SENSOR_RATE_POWERING_OFF;
    401             s->currentLatency = SENSOR_LATENCY_INVALID;
    402         }
    403     }
    404 }
    405 
    406 static uint64_t sensorCalcHwLatency(struct Sensor* s)
    407 {
    408     uint64_t smallestLatency = SENSOR_LATENCY_INVALID;
    409     uint32_t i;
    410 
    411     for (i = 0; i < MAX_CLI_SENS_MATRIX_SZ; i++) {
    412         struct SensorsClientRequest *req = slabAllocatorGetNth(mCliSensMatrix, i);
    413 
    414         /* we only care about this sensor's stuff */
    415         if (!req || req->handle != s->handle)
    416             continue;
    417 
    418         if (smallestLatency > req->latency)
    419             smallestLatency = req->latency;
    420     }
    421 
    422     return smallestLatency;
    423 }
    424 
    425 static uint32_t sensorCalcHwRate(struct Sensor* s, uint32_t extraReqedRate, uint32_t removedRate)
    426 {
    427     bool haveUsers = false, haveOnChange = extraReqedRate == SENSOR_RATE_ONCHANGE;
    428     uint32_t highestReq = 0;
    429     uint32_t i;
    430 
    431     if (s->si->supportedRates &&
    432         ((extraReqedRate == SENSOR_RATE_ONCHANGE && !s->hasOnchange) ||
    433          (extraReqedRate == SENSOR_RATE_ONDEMAND && !s->hasOndemand))) {
    434         osLog(LOG_WARN, "Bad rate 0x%08" PRIX32 " for sensor %u", extraReqedRate, s->si->sensorType);
    435         return SENSOR_RATE_IMPOSSIBLE;
    436     }
    437 
    438     if (extraReqedRate) {
    439         haveUsers = true;
    440         highestReq = (extraReqedRate == SENSOR_RATE_ONDEMAND || extraReqedRate == SENSOR_RATE_ONCHANGE) ? 0 : extraReqedRate;
    441     }
    442 
    443     for (i = 0; i < MAX_CLI_SENS_MATRIX_SZ; i++) {
    444         struct SensorsClientRequest *req = slabAllocatorGetNth(mCliSensMatrix, i);
    445 
    446         /* we only care about this sensor's stuff */
    447         if (!req || req->handle != s->handle)
    448             continue;
    449 
    450         /* skip an instance of a removed rate if one was given */
    451         if (req->rate == removedRate) {
    452             removedRate = SENSOR_RATE_OFF;
    453             continue;
    454         }
    455 
    456         haveUsers = true;
    457 
    458         /* we can always do ondemand and if we see an on-change then we already checked and do allow it */
    459         if (req->rate == SENSOR_RATE_ONDEMAND)
    460             continue;
    461         if (req->rate == SENSOR_RATE_ONCHANGE) {
    462             haveOnChange = true;
    463             continue;
    464         }
    465 
    466         if (highestReq < req->rate)
    467             highestReq = req->rate;
    468     }
    469 
    470     if (!highestReq) {   /* no requests -> we can definitely do that */
    471         if (!haveUsers)
    472             return SENSOR_RATE_OFF;
    473         else if (haveOnChange)
    474             return SENSOR_RATE_ONCHANGE;
    475         else
    476             return SENSOR_RATE_ONDEMAND;
    477     }
    478 
    479     for (i = 0; s->si->supportedRates && s->si->supportedRates[i]; i++)
    480         if (s->si->supportedRates[i] >= highestReq)
    481             return s->si->supportedRates[i];
    482 
    483     return SENSOR_RATE_IMPOSSIBLE;
    484 }
    485 
    486 static void sensorInternalFwStateChanged(void *evtP)
    487 {
    488     struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)evtP;
    489     struct Sensor* s = sensorFindByHandle(evt->handle);
    490 
    491     if (s) {
    492 
    493         if (!evt->value1) {                                       //we failed -> give up
    494             s->currentRate = SENSOR_RATE_POWERING_OFF;
    495             s->currentLatency = SENSOR_LATENCY_INVALID;
    496             sensorCallFuncPower(s, false);
    497         }
    498         else if (s->currentRate == SENSOR_RATE_FW_UPLOADING) {    //we're up
    499             s->currentRate = evt->value1;
    500             s->currentLatency = evt->value2;
    501             sensorReconfig(s, sensorCalcHwRate(s, 0, 0), sensorCalcHwLatency(s));
    502         }
    503         else if (s->currentRate == SENSOR_RATE_POWERING_OFF) {    //we need to power off
    504             sensorCallFuncPower(s, false);
    505         }
    506     }
    507     slabAllocatorFree(mInternalEvents, evt);
    508 }
    509 
    510 static void sensorInternalPowerStateChanged(void *evtP)
    511 {
    512     struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)evtP;
    513     struct Sensor* s = sensorFindByHandle(evt->handle);
    514 
    515     if (s) {
    516 
    517         if (s->currentRate == SENSOR_RATE_POWERING_ON && evt->value1) {          //we're now on - upload firmware
    518             s->currentRate = SENSOR_RATE_FW_UPLOADING;
    519             s->currentLatency = SENSOR_LATENCY_INVALID;
    520             sensorCallFuncFwUpld(s);
    521         }
    522         else if (s->currentRate == SENSOR_RATE_POWERING_OFF && !evt->value1) {   //we're now off
    523             s->currentRate = SENSOR_RATE_OFF;
    524             s->currentLatency = SENSOR_LATENCY_INVALID;
    525         }
    526         else if (s->currentRate == SENSOR_RATE_POWERING_ON && !evt->value1) {    //we need to power back on
    527             sensorCallFuncPower(s, true);
    528         }
    529         else if (s->currentRate == SENSOR_RATE_POWERING_OFF && evt->value1) {    //we need to power back off
    530             sensorCallFuncPower(s, false);
    531         }
    532     }
    533     slabAllocatorFree(mInternalEvents, evt);
    534 }
    535 
    536 static void sensorInternalRateChanged(void *evtP)
    537 {
    538     struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)evtP;
    539     struct Sensor* s = sensorFindByHandle(evt->handle);
    540 
    541     /* If the current rate is a state, do not change the rate */
    542     if (s && s->currentRate != SENSOR_RATE_OFF && s->currentRate < SENSOR_RATE_POWERING_ON) {
    543         s->currentRate = evt->value1;
    544         s->currentLatency = evt->value2;
    545     }
    546     slabAllocatorFree(mInternalEvents, evt);
    547 }
    548 
    549 bool sensorSignalInternalEvt(uint32_t handle, uint32_t intEvtNum, uint32_t value1, uint64_t value2)
    550 {
    551     static const OsDeferCbkF internalEventCallbacks[] = {
    552         [SENSOR_INTERNAL_EVT_POWER_STATE_CHG] = sensorInternalPowerStateChanged,
    553         [SENSOR_INTERNAL_EVT_FW_STATE_CHG] = sensorInternalFwStateChanged,
    554         [SENSOR_INTERNAL_EVT_RATE_CHG] = sensorInternalRateChanged,
    555     };
    556     struct SensorsInternalEvent *evt = (struct SensorsInternalEvent*)slabAllocatorAlloc(mInternalEvents);
    557 
    558     if (!evt)
    559         return false;
    560 
    561     evt->handle = handle;
    562     evt->value1 = value1;
    563     evt->value2 = value2;
    564 
    565     if (osDefer(internalEventCallbacks[intEvtNum], evt, false))
    566         return true;
    567 
    568     slabAllocatorFree(mInternalEvents, evt);
    569     return false;
    570 }
    571 
    572 const struct SensorInfo* sensorFind(uint32_t sensorType, uint32_t idx, uint32_t *handleP)
    573 {
    574     uint32_t i;
    575 
    576     for (i = 0; i < MAX_REGISTERED_SENSORS; i++) {
    577         if (mSensors[i].handle && mSensors[i].si->sensorType == sensorType && !idx--) {
    578             if (handleP)
    579                 *handleP = mSensors[i].handle;
    580             return mSensors[i].si;
    581         }
    582     }
    583 
    584     return NULL;
    585 }
    586 
    587 static bool sensorAddRequestor(uint32_t sensorHandle, uint32_t clientTid, uint32_t rate, uint64_t latency)
    588 {
    589     struct SensorsClientRequest *req = slabAllocatorAlloc(mCliSensMatrix);
    590 
    591     if (!req)
    592         return false;
    593 
    594     req->handle = sensorHandle;
    595     req->clientTid = clientTid;
    596     mem_reorder_barrier();
    597     req->rate = rate;
    598     req->latency = latency;
    599 
    600     return true;
    601 }
    602 
    603 static bool sensorGetCurRequestorRate(uint32_t sensorHandle, uint32_t clientTid, uint32_t *rateP, uint64_t *latencyP)
    604 {
    605     uint32_t i;
    606 
    607     for (i = 0; i < MAX_CLI_SENS_MATRIX_SZ; i++) {
    608         struct SensorsClientRequest *req = slabAllocatorGetNth(mCliSensMatrix, i);
    609 
    610         if (req && req->handle == sensorHandle && req->clientTid == clientTid) {
    611             if (rateP) {
    612                 *rateP = req->rate;
    613                 *latencyP = req->latency;
    614             }
    615             return true;
    616         }
    617     }
    618 
    619     return false;
    620 }
    621 
    622 static bool sensorAmendRequestor(uint32_t sensorHandle, uint32_t clientTid, uint32_t newRate, uint64_t newLatency)
    623 {
    624     uint32_t i;
    625 
    626     for (i = 0; i < MAX_CLI_SENS_MATRIX_SZ; i++) {
    627         struct SensorsClientRequest *req = slabAllocatorGetNth(mCliSensMatrix, i);
    628 
    629         if (req && req->handle == sensorHandle && req->clientTid == clientTid) {
    630             req->rate = newRate;
    631             req->latency = newLatency;
    632             return true;
    633         }
    634     }
    635 
    636     return false;
    637 }
    638 
    639 static bool sensorDeleteRequestor(uint32_t sensorHandle, uint32_t clientTid)
    640 {
    641     uint32_t i;
    642 
    643     for (i = 0; i < MAX_CLI_SENS_MATRIX_SZ; i++) {
    644         struct SensorsClientRequest *req = slabAllocatorGetNth(mCliSensMatrix, i);
    645 
    646         if (req && req->handle == sensorHandle && req->clientTid == clientTid) {
    647             req->rate = SENSOR_RATE_OFF;
    648             req->latency = SENSOR_LATENCY_INVALID;
    649             req->clientTid = 0;
    650             req->handle = 0;
    651             mem_reorder_barrier();
    652             slabAllocatorFree(mCliSensMatrix, req);
    653             return true;
    654         }
    655     }
    656 
    657     return false;
    658 }
    659 
    660 bool sensorRequest(uint32_t unusedTid, uint32_t sensorHandle, uint32_t rate, uint64_t latency)
    661 {
    662     struct Sensor* s = sensorFindByHandle(sensorHandle);
    663     uint32_t newSensorRate;
    664     uint64_t samplingPeriod;
    665     uint32_t clientTid;
    666 
    667     (void)unusedTid;
    668 
    669     if (!s)
    670         return false;
    671 
    672     clientTid = osGetCurrentTid();
    673 
    674     /* verify the rate is possible */
    675     newSensorRate = sensorCalcHwRate(s, rate, 0);
    676     if (newSensorRate == SENSOR_RATE_IMPOSSIBLE)
    677         return false;
    678 
    679     /* the latency should be lower bounded by sampling period */
    680     samplingPeriod = ((uint64_t)(1000000000 / rate)) << 10;
    681     latency = latency > samplingPeriod ? latency : samplingPeriod;
    682 
    683     /* record the request */
    684     if (!sensorAddRequestor(sensorHandle, clientTid, rate, latency))
    685         return false;
    686 
    687     /* update actual sensor if needed */
    688     sensorReconfig(s, newSensorRate, sensorCalcHwLatency(s));
    689 
    690     /* if onchange request, ask sensor to send last state */
    691     if (s->hasOnchange && !sensorCallFuncSendOneDirectEvt(s, clientTid))
    692         osLog(LOG_WARN, "Cannot send last state for onchange sensor: enqueue fail");
    693 
    694     return true;
    695 }
    696 
    697 bool sensorRequestRateChange(uint32_t unusedTid, uint32_t sensorHandle, uint32_t newRate, uint64_t newLatency)
    698 {
    699     struct Sensor* s = sensorFindByHandle(sensorHandle);
    700     uint32_t oldRate, newSensorRate;
    701     uint64_t oldLatency, samplingPeriod;
    702     uint32_t clientTid;
    703 
    704     (void)unusedTid;
    705 
    706     if (!s)
    707         return false;
    708 
    709     clientTid = osGetCurrentTid();
    710     /* get current rate */
    711     if (!sensorGetCurRequestorRate(sensorHandle, clientTid, &oldRate, &oldLatency))
    712         return false;
    713 
    714     /* verify the new rate is possible given all other ongoing requests */
    715     newSensorRate = sensorCalcHwRate(s, newRate, oldRate);
    716     if (newSensorRate == SENSOR_RATE_IMPOSSIBLE)
    717         return false;
    718 
    719     /* the latency should be lower bounded by sampling period */
    720     samplingPeriod = ((uint64_t)(1000000000 / newRate)) << 10;
    721     newLatency = newLatency > samplingPeriod ? newLatency : samplingPeriod;
    722 
    723     /* record the request */
    724     if (!sensorAmendRequestor(sensorHandle, clientTid, newRate, newLatency))
    725         return false;
    726 
    727     /* update actual sensor if needed */
    728     sensorReconfig(s, newSensorRate, sensorCalcHwLatency(s));
    729     return true;
    730 }
    731 
    732 bool sensorRelease(uint32_t unusedTid, uint32_t sensorHandle)
    733 {
    734     struct Sensor* s = sensorFindByHandle(sensorHandle);
    735 
    736     (void) unusedTid;
    737 
    738     if (!s)
    739         return false;
    740 
    741     /* record the request */
    742     if (!sensorDeleteRequestor(sensorHandle, osGetCurrentTid()))
    743         return false;
    744 
    745     /* update actual sensor if needed */
    746     sensorReconfig(s, sensorCalcHwRate(s, 0, 0), sensorCalcHwLatency(s));
    747     return true;
    748 }
    749 
    750 bool sensorTriggerOndemand(uint32_t unusedTid, uint32_t sensorHandle)
    751 {
    752     struct Sensor* s = sensorFindByHandle(sensorHandle);
    753     uint32_t i;
    754     uint32_t clientTid;
    755 
    756     (void)unusedTid;
    757 
    758     if (!s || !s->hasOndemand)
    759         return false;
    760 
    761     clientTid = osGetCurrentTid();
    762 
    763     for (i = 0; i < MAX_CLI_SENS_MATRIX_SZ; i++) {
    764         struct SensorsClientRequest *req = slabAllocatorGetNth(mCliSensMatrix, i);
    765 
    766         if (req && req->handle == sensorHandle && req->clientTid == clientTid)
    767             return sensorCallFuncTrigger(s);
    768     }
    769 
    770     // not found -> do not report
    771     return false;
    772 }
    773 
    774 bool sensorFlush(uint32_t sensorHandle)
    775 {
    776     struct Sensor* s = sensorFindByHandle(sensorHandle);
    777 
    778     if (!s)
    779         return false;
    780 
    781     return sensorCallFuncFlush(s);
    782 }
    783 
    784 bool sensorCalibrate(uint32_t sensorHandle)
    785 {
    786     struct Sensor* s = sensorFindByHandle(sensorHandle);
    787 
    788     if (!s)
    789         return false;
    790 
    791     return sensorCallFuncCalibrate(s);
    792 }
    793 
    794 bool sensorCfgData(uint32_t sensorHandle, void* cfgData)
    795 {
    796     struct Sensor* s = sensorFindByHandle(sensorHandle);
    797 
    798     if (!s)
    799         return false;
    800 
    801     return sensorCallFuncCfgData(s, cfgData);
    802 }
    803 
    804 uint32_t sensorGetCurRate(uint32_t sensorHandle)
    805 {
    806     struct Sensor* s = sensorFindByHandle(sensorHandle);
    807 
    808     return s ? s->currentRate : SENSOR_RATE_OFF;
    809 }
    810 
    811 uint64_t sensorGetCurLatency(uint32_t sensorHandle)
    812 {
    813     struct Sensor* s = sensorFindByHandle(sensorHandle);
    814 
    815     return s ? s->currentLatency : SENSOR_LATENCY_INVALID;
    816 }
    817 
    818 bool sensorGetInitComplete(uint32_t sensorHandle)
    819 {
    820     struct Sensor* s = sensorFindByHandle(sensorHandle);
    821 
    822     return s ? s->initComplete : false;
    823 }
    824 
    825 bool sensorMarshallEvent(uint32_t sensorHandle, uint32_t evtType, void *evtData, TaggedPtr *evtFreeingInfoP)
    826 {
    827     struct Sensor* s = sensorFindByHandle(sensorHandle);
    828 
    829     if (!s)
    830         return false;
    831 
    832     return sensorCallFuncMarshall(s, evtType, evtData, evtFreeingInfoP);
    833 }
    834 
    835 int sensorUnregisterAll(uint32_t tid)
    836 {
    837     int i, count = 0;
    838 
    839     for (i = 0; i < MAX_REGISTERED_SENSORS; i++)
    840         if (HANDLE_TO_TID(mSensors[i].handle) == tid) {
    841             sensorUnregister(mSensors[i].handle);
    842             count++;
    843         }
    844 
    845     return count;
    846 }
    847