// Copyright 2018 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 GPU_MAPPING_H
#define GPU_MAPPING_H

#include "msd_vsl_buffer.h"
#include "platform_bus_mapper.h"
#include <memory>

class AddressSpaceBase;

class GpuMapping {
public:
    using gpu_addr_t = uint32_t;

    GpuMapping(std::weak_ptr<AddressSpaceBase> address_space, std::shared_ptr<MsdVslBuffer> buffer,
               std::unique_ptr<magma::PlatformBusMapper::BusMapping> bus_mapping,
               gpu_addr_t gpu_addr)
        : address_space_(address_space), buffer_(std::move(buffer)),
          bus_mapping_(std::move(bus_mapping)), gpu_addr_(gpu_addr)
    {
    }

    ~GpuMapping();

    std::weak_ptr<AddressSpaceBase> address_space() { return address_space_; }

    MsdVslBuffer* buffer() { return buffer_.get(); }

    magma::PlatformBusMapper::BusMapping* bus_mapping() { return bus_mapping_.get(); }

    uint64_t page_offset() { return bus_mapping_->page_offset(); }

    uint64_t page_count() { return bus_mapping_->page_count(); }

    gpu_addr_t gpu_addr() { return gpu_addr_; }

private:
    std::weak_ptr<AddressSpaceBase> address_space_;
    std::shared_ptr<MsdVslBuffer> buffer_;
    std::unique_ptr<magma::PlatformBusMapper::BusMapping> bus_mapping_;
    gpu_addr_t gpu_addr_{};
};

#endif // GPU_MAPPING_H
