/*
 * Copyright 2020 Google Inc.
 *
 * 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.
 */

#pragma once

extern "C"
{
#include <pciaccess.h>
} // extern "C"

#include <cstdint>

namespace host_tool
{

/**
 * @class PciAccess
 * @brief Overridable interface to libpciacess for unit testing
 */
class PciAccess
{
  public:
    virtual struct pci_device_iterator* pci_id_match_iterator_create(
        const struct pci_id_match* match) const = 0;
    virtual void pci_iterator_destroy(
        struct pci_device_iterator* iter) const = 0;
    virtual void pci_device_enable(struct pci_device* dev) const = 0;
    virtual struct pci_device* pci_device_next(
        struct pci_device_iterator* iter) const = 0;
    virtual int pci_device_probe(struct pci_device* dev) const = 0;
    virtual int pci_device_cfg_read_u8(
        struct pci_device* dev, std::uint8_t* data, pciaddr_t offset) const = 0;
    virtual int pci_device_cfg_write_u8(
        struct pci_device* dev, std::uint8_t data, pciaddr_t offset) const = 0;
    virtual int pci_device_map_range(struct pci_device* dev, pciaddr_t base,
                                     pciaddr_t size, unsigned map_flags,
                                     void** addr) const = 0;
    virtual int pci_device_unmap_range(struct pci_device* dev, void* memory,
                                       pciaddr_t size) const = 0;

    virtual ~PciAccess() = default;
};

/**
 * @class PciAccessImpl
 * @brief libpciaccess concrete implementation
 * @details Passes through all calls to the underlying library.
 */
class PciAccessImpl : public PciAccess
{
  public:
    struct pci_device_iterator* pci_id_match_iterator_create(
        const struct pci_id_match* match) const override;
    void pci_iterator_destroy(struct pci_device_iterator* iter) const override;
    void pci_device_enable(struct pci_device* dev) const override;
    struct pci_device* pci_device_next(
        struct pci_device_iterator* iter) const override;
    int pci_device_probe(struct pci_device* dev) const override;
    int pci_device_cfg_read_u8(struct pci_device* dev, std::uint8_t* data,
                               pciaddr_t offset) const override;
    int pci_device_cfg_write_u8(struct pci_device* dev, std::uint8_t data,
                                pciaddr_t offset) const override;
    int pci_device_map_range(struct pci_device* dev, pciaddr_t base,
                             pciaddr_t size, unsigned map_flags,
                             void** addr) const override;
    int pci_device_unmap_range(struct pci_device* dev, void* memory,
                               pciaddr_t size) const override;

    static PciAccessImpl& getInstance()
    {
        static PciAccessImpl instance;
        return instance;
    }

  private:
    PciAccessImpl();
    virtual ~PciAccessImpl();
};

} // namespace host_tool
