diff --git a/trusty/storage/proxy/Android.bp b/trusty/storage/proxy/Android.bp index a47143538..d67089fb2 100644 --- a/trusty/storage/proxy/Android.bp +++ b/trusty/storage/proxy/Android.bp @@ -29,7 +29,10 @@ cc_binary { "proxy.c", ], - shared_libs: ["liblog"], + shared_libs: [ + "liblog", + "libhardware_legacy", + ], header_libs: ["libcutils_headers"], static_libs: [ diff --git a/trusty/storage/proxy/rpmb.c b/trusty/storage/proxy/rpmb.c index abeacdfed..b59fb67f6 100644 --- a/trusty/storage/proxy/rpmb.c +++ b/trusty/storage/proxy/rpmb.c @@ -29,6 +29,8 @@ #include #include +#include + #include "ipc.h" #include "log.h" #include "rpmb.h" @@ -100,6 +102,8 @@ static int rpmb_fd = -1; static uint8_t read_buf[4096]; static enum dev_type dev_type = UNKNOWN_RPMB; +static const char* UFS_WAKE_LOCK_NAME = "ufs_seq_wakelock"; + #ifdef RPMB_DEBUG static void print_buf(const char* prefix, const uint8_t* buf, size_t size) { @@ -194,6 +198,7 @@ static int send_mmc_rpmb_req(int mmc_fd, const struct storage_rpmb_send_req* req static int send_ufs_rpmb_req(int sg_fd, const struct storage_rpmb_send_req* req) { int rc; + int wl_rc; const uint8_t* write_buf = req->payload; /* * Meaning of member values are stated on the definition of struct sec_proto_cdb. @@ -202,6 +207,12 @@ static int send_ufs_rpmb_req(int sg_fd, const struct storage_rpmb_send_req* req) struct sec_proto_cdb out_cdb = {0xB5, 0xEC, 0x00, 0x01, 0x00, 0x00, 0, 0x00, 0x00}; unsigned char sense_buffer[32]; + wl_rc = acquire_wake_lock(PARTIAL_WAKE_LOCK, UFS_WAKE_LOCK_NAME); + if (wl_rc < 0) { + ALOGE("%s: failed to acquire wakelock: %d, %s\n", __func__, wl_rc, strerror(errno)); + return wl_rc; + } + if (req->reliable_write_size) { /* Prepare SECURITY PROTOCOL OUT command. */ out_cdb.length = __builtin_bswap32(req->reliable_write_size); @@ -244,6 +255,11 @@ static int send_ufs_rpmb_req(int sg_fd, const struct storage_rpmb_send_req* req) } err_op: + wl_rc = release_wake_lock(UFS_WAKE_LOCK_NAME); + if (wl_rc < 0) { + ALOGE("%s: failed to release wakelock: %d, %s\n", __func__, wl_rc, strerror(errno)); + } + return rc; }