# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

LOCAL_DIR := $(GET_LOCAL_DIR)

MODULE := $(LOCAL_DIR)

STORAGE_RPMB_PROTOCOL ?= MMC

MODULE_CONSTANTS := $(LOCAL_DIR)/storage_consts.json

MANIFEST := $(LOCAL_DIR)/manifest.json

MODULE_DEFINES := \
	RPMB_PROTOCOL=RPMB_PROTOCOL_$(STORAGE_RPMB_PROTOCOL) \

# WITH_HKDF_RPMB_KEY indicates that storage server derives rpmb key
# from a random sequence stored in the rpmb partition itself,
# and that the storage server supports auto provisioning.
# Otherwise, keyslot will provide the rpmb key.
# By default we obtain rpmb key from keyslot.
WITH_HKDF_RPMB_KEY ?= false

ifeq (true,$(call TOBOOL,$(WITH_HKDF_RPMB_KEY)))
    MODULE_DEFINES += WITH_HKDF_RPMB_KEY=1
endif

STORAGE_HAS_RPMB ?= true
ifeq (true,$(call TOBOOL,$(STORAGE_HAS_RPMB)))
    MODULE_DEFINES += HAS_RPMB=1
endif

STORAGE_HAS_FS_TDP ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_HAS_FS_TDP)))
    MODULE_DEFINES += HAS_FS_TDP=1
endif

STORAGE_USE_EARLY_TDP ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_USE_EARLY_TDP)))
    MODULE_DEFINES += USE_EARLY_TDP=1
    MODULE_DEFINES += HAS_FS_TDP=1
endif

STORAGE_HAS_FS_NONSECURE_PERSIST ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_HAS_FS_NONSECURE_PERSIST)))
    MODULE_DEFINES += HAS_FS_NSP=1
endif

SS_DATA_DEBUG_IO ?= false
ifeq (true,$(call TOBOOL,$(SS_DATA_DEBUG_IO)))
    MODULE_DEFINES += SS_DATA_DEBUG_IO=1
endif

STORAGE_NS_RECOVERY_CLEAR_ALLOWED ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_NS_RECOVERY_CLEAR_ALLOWED)))
    MODULE_DEFINES += STORAGE_NS_RECOVERY_CLEAR_ALLOWED=1
endif

STORAGE_NS_ALTERNATE_SUPERBLOCK_ALLOWED ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_NS_ALTERNATE_SUPERBLOCK_ALLOWED)))
    MODULE_DEFINES += STORAGE_NS_ALTERNATE_SUPERBLOCK_ALLOWED=1
endif

STORAGE_ENABLE_ERROR_REPORTING ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_ENABLE_ERROR_REPORTING)))
    MODULE_DEFINES += STORAGE_ENABLE_ERROR_REPORTING=1
endif

STORAGE_TDP_RECOVERY_CHECKPOINT_RESTORE_ALLOWED ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_TDP_RECOVERY_CHECKPOINT_RESTORE_ALLOWED)))
    MODULE_DEFINES += STORAGE_TDP_RECOVERY_CHECKPOINT_RESTORE_ALLOWED=1
endif

STORAGE_TDP_AUTO_CHECKPOINT_ENABLED ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_TDP_AUTO_CHECKPOINT_ENABLED)))
    MODULE_DEFINES += STORAGE_TDP_AUTO_CHECKPOINT_ENABLED=1
endif

ifneq ($(STORAGE_EXTERNAL_SUPER_BLOCK_MAC),)
    MODULE_DEFINES += STORAGE_EXTERNAL_SUPER_BLOCK_MAC=1
endif

include $(LOCAL_DIR)/common.mk

MODULE_SRCS := \
	$(STORAGE_COMMON_SRCS) \
	$(STORAGE_COMMON_TIPC_SRCS) \
	$(LOCAL_DIR)/client.c \
	$(LOCAL_DIR)/client_tipc.c \
	$(LOCAL_DIR)/error_reporting.c \
	$(LOCAL_DIR)/ipc.c \
	$(LOCAL_DIR)/main.c \
	$(LOCAL_DIR)/proxy.c \
	$(LOCAL_DIR)/rpmb.c \
	$(LOCAL_DIR)/tipc_ns.c \
	$(LOCAL_DIR)/tipc_service.c \

MODULE_LIBRARY_DEPS := \
	trusty/user/app/storage/lib_internal \
	trusty/user/base/interface/metrics \
	trusty/user/base/interface/storage \
	trusty/user/base/lib/hwkey \
	trusty/user/base/lib/libc-trusty \
	trusty/user/base/lib/system_state \
	trusty/user/base/lib/tipc \
	external/boringssl \

ifneq ($(STORAGE_EXTERNAL_SUPER_BLOCK_MAC),)
MODULE_LIBRARY_DEPS += $(STORAGE_EXTERNAL_SUPER_BLOCK_MAC)
endif

ifeq (true,$(call TOBOOL,$(STORAGE_ENABLE_ERROR_REPORTING)))
MODULE_LIBRARY_DEPS += \
	trusty/user/base/interface/stats/nw \
	trusty/user/base/interface/stats_setter \
	trusty/user/base/interface/stats/tz \
	trusty/user/base/lib/metrics_atoms \
	trusty/user/base/lib/stats
endif

STORAGE_AIDL_ENABLED ?= false
ifeq (true,$(call TOBOOL,$(STORAGE_AIDL_ENABLED)))
MODULE_DEFINES += STORAGE_AIDL_ENABLED=1
MODULE_SRCS += $(LOCAL_DIR)/aidl_service.cpp
MODULE_LIBRARY_DEPS += \
	frameworks/native/libs/binder/trusty \
	trusty/user/base/interface/authmgr-handover/cpp \
	trusty/user/base/interface/secure_storage/cpp \
	trusty/user/base/lib/libstdc++-trusty \

endif

MODULE_DEPS += \
	trusty/user/app/storage/test/block_host_test \
	trusty/user/app/storage/test/storage_host_test \

undefine STORAGE_COMMON_SRCS
undefine STORAGE_COMMON_TIPC_SRCS

include make/trusted_app.mk

# Build host side unit tests for mock storage implementation.
include trusty/user/app/storage/storage_mock/test_mock_storage_rules.mk
