blob: c4e24067505464bc9530b49f55b09ddf2fb7729a [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_SECMEM_SESSION_H_
#define SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_SECMEM_SESSION_H_
#include <fuchsia/tee/cpp/fidl.h>
#include <lib/fpromise/result.h>
#include <lib/zx/vmo.h>
#include <zircon/limits.h>
#include <cinttypes>
#include <vector>
#include <tee-client-api/tee-client-types.h>
namespace amlogic_decoder {
class SecmemSession {
public:
static fpromise::result<SecmemSession, fuchsia::tee::ApplicationSyncPtr> TryOpen(
fuchsia::tee::ApplicationSyncPtr tee_connection);
SecmemSession(SecmemSession&&) = default;
SecmemSession& operator=(SecmemSession&&) = default;
~SecmemSession();
// The naming is for consistency with the TA command name, but this actually adds AMLV headers
// to each VP9 frame (adds header to the one frame, or to all frames within a superframe).
//
// For now, any TEEC_Result != TEEC_SUCCESS returns ZX_ERR_INTERNAL.
[[nodiscard]] zx_status_t GetVp9HeaderSize(zx_paddr_t vp9_paddr, uint32_t before_size,
uint32_t max_after_size, uint32_t* after_size);
private:
static constexpr uint64_t kParameterAlignment = 32u;
static constexpr uint64_t kParameterBufferSize = ZX_PAGE_SIZE;
static void PackUint32Parameter(uint32_t value, std::vector<uint8_t>* buffer);
static fpromise::result<uint32_t> UnpackUint32Parameter(const std::vector<uint8_t>& buffer,
size_t* offset_in_out);
explicit SecmemSession(uint32_t session_id, fuchsia::tee::ApplicationSyncPtr tee_connection)
: session_id_(session_id), tee_connection_(std::move(tee_connection)) {}
void OpenSession();
[[nodiscard]] TEEC_Result InvokeSecmemCommand(uint32_t command,
std::vector<uint8_t>* cmd_buffer_vec);
uint32_t session_id_;
fuchsia::tee::ApplicationSyncPtr tee_connection_;
};
} // namespace amlogic_decoder
#endif // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_SECMEM_SESSION_H_