blob: 287fed87ec8e7b0bde0766627f2255010c78ecd5 [file]
#include "pci-fidl.h"
#include <lib/device-protocol/pci.h>
struct iwl_pci_fidl {
std::unique_ptr<ddk::Pci> pci;
};
void iwl_pci_ack_interrupt(const struct iwl_pci_fidl* fidl) { fidl->pci->AckInterrupt(); }
zx_status_t iwl_pci_read_config16(const struct iwl_pci_fidl* fidl, uint16_t offset,
uint16_t* out_value) {
return fidl->pci->ReadConfig16(offset, out_value);
}
zx_status_t iwl_pci_get_device_info(const struct iwl_pci_fidl* fidl, pci_device_info_t* out_info) {
fuchsia_hardware_pci::wire::DeviceInfo info;
zx_status_t status = fidl->pci->GetDeviceInfo(&info);
if (status == ZX_OK) {
*out_info = ddk::convert_device_info_to_banjo(info);
}
return status;
}
zx_status_t iwl_pci_get_bti(const struct iwl_pci_fidl* fidl, uint32_t index, zx_handle_t* out_bti) {
zx::bti bti;
zx_status_t status = fidl->pci->GetBti(index, &bti);
if (status == ZX_OK) {
*out_bti = bti.release();
}
return status;
}
void iwl_pci_get_interrupt_modes(const struct iwl_pci_fidl* fidl,
pci_interrupt_modes_t* out_modes) {
fuchsia_hardware_pci::wire::InterruptModes modes;
fidl->pci->GetInterruptModes(&modes);
*out_modes = ddk::convert_interrupt_modes_to_banjo(modes);
}
zx_status_t iwl_pci_set_interrupt_mode(const struct iwl_pci_fidl* fidl, pci_interrupt_mode_t mode,
uint32_t requested_irq_count) {
return fidl->pci->SetInterruptMode(fuchsia_hardware_pci::InterruptMode{mode},
requested_irq_count);
}
zx_status_t iwl_pci_set_bus_mastering(const struct iwl_pci_fidl* fidl, bool enabled) {
return fidl->pci->SetBusMastering(enabled);
}
zx_status_t iwl_pci_map_interrupt(const struct iwl_pci_fidl* fidl, uint32_t which_irq,
zx_handle_t* out_interrupt) {
zx::interrupt interrupt;
zx_status_t status = fidl->pci->MapInterrupt(which_irq, &interrupt);
if (status == ZX_OK) {
*out_interrupt = interrupt.release();
}
return status;
}
zx_status_t iwl_pci_write_config8(const struct iwl_pci_fidl* fidl, uint16_t offset, uint8_t value) {
return fidl->pci->WriteConfig8(offset, value);
}
zx_status_t iwl_pci_map_bar_buffer(const struct iwl_pci_fidl* fidl, uint32_t bar_id,
uint32_t cache_policy, mmio_buffer_t* buffer) {
return fidl->pci->MapMmio(bar_id, cache_policy, buffer);
}
zx_status_t iwl_pci_connect_fragment_protocol(struct zx_device* parent, const char* fragment_name,
struct iwl_pci_fidl** fidl) {
(*fidl) = new struct iwl_pci_fidl;
(*fidl)->pci = std::make_unique<ddk::Pci>(parent, fragment_name);
if (!(*fidl)->pci->is_valid()) {
return ZX_ERR_INTERNAL;
}
return ZX_OK;
}
void iwl_pci_free(struct iwl_pci_fidl* fidl) {
fidl->pci.reset();
delete fidl;
}