blob: 3980111d5f8c6e86c845a342cb35df140cbf0743 [file] [log] [blame]
// Copyright 2016 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.
#pragma once
#include <hw/pci.h>
#include <zircon/compiler.h>
#include <zircon/syscalls/pci.h>
#include <zircon/types.h>
__BEGIN_CDECLS;
/**
* protocols/pci.h - PCI protocol definitions
*
* The PCI host driver publishes zx_device_t's with its config set to a pci_device_config_t.
*/
enum pci_resource_ids {
PCI_RESOURCE_BAR_0 = 0,
PCI_RESOURCE_BAR_1,
PCI_RESOURCE_BAR_2,
PCI_RESOURCE_BAR_3,
PCI_RESOURCE_BAR_4,
PCI_RESOURCE_BAR_5,
PCI_RESOURCE_CONFIG,
PCI_RESOURCE_COUNT,
};
typedef struct pci_protocol_ops {
zx_status_t (*map_resource)(void* ctx, uint32_t res_id, uint32_t cache_policy,
void** vaddr, size_t* size, zx_handle_t* out_handle);
zx_status_t (*enable_bus_master)(void* ctx, bool enable);
zx_status_t (*enable_pio)(void* ctx, bool enable);
zx_status_t (*reset_device)(void* ctx);
zx_status_t (*map_interrupt)(void* ctx, int which_irq, zx_handle_t* out_handle);
zx_status_t (*query_irq_mode_caps)(void* ctx, zx_pci_irq_mode_t mode,
uint32_t* out_max_irqs);
zx_status_t (*set_irq_mode)(void* ctx, zx_pci_irq_mode_t mode,
uint32_t requested_irq_count);
zx_status_t (*get_device_info)(void* ctx, zx_pcie_device_info_t* out_info);
} pci_protocol_ops_t;
typedef struct pci_protocol {
pci_protocol_ops_t* ops;
void* ctx;
} pci_protocol_t;
static inline zx_status_t pci_map_resource(pci_protocol_t* pci, uint32_t res_id,
uint32_t cache_policy, void** vaddr, size_t* size,
zx_handle_t* out_handle) {
return pci->ops->map_resource(pci->ctx, res_id, cache_policy, vaddr, size, out_handle);
}
static inline zx_status_t pci_enable_bus_master(pci_protocol_t* pci, bool enable) {
return pci->ops->enable_bus_master(pci->ctx, enable);
}
static inline zx_status_t pci_enable_pio(pci_protocol_t* pci, bool enable) {
return pci->ops->enable_pio(pci->ctx, enable);
}
static inline zx_status_t pci_reset_device(pci_protocol_t* pci) {
return pci->ops->reset_device(pci->ctx);
}
static inline zx_status_t pci_map_interrupt(pci_protocol_t* pci, int which_irq,
zx_handle_t* out_handle) {
return pci->ops->map_interrupt(pci->ctx, which_irq, out_handle);
}
static inline zx_status_t pci_query_irq_mode_caps(pci_protocol_t* pci, zx_pci_irq_mode_t mode,
uint32_t* out_max_irqs) {
return pci->ops->query_irq_mode_caps(pci->ctx, mode, out_max_irqs);
}
static inline zx_status_t pci_set_irq_mode(pci_protocol_t* pci, zx_pci_irq_mode_t mode,
uint32_t requested_irq_count) {
return pci->ops->set_irq_mode(pci->ctx, mode, requested_irq_count);
}
static inline zx_status_t pci_get_device_info(pci_protocol_t* pci,
zx_pcie_device_info_t* out_info) {
return pci->ops->get_device_info(pci->ctx, out_info);
}
__END_CDECLS;