/*
 * Copyright 2014, NICTA
 *
 * This software may be distributed and modified according to the terms of
 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
 * See "LICENSE_GPLv2.txt" for details.
 *
 * @TAG(NICTA_GPL)
 */
/* x86 VMM PCI Driver, which manages the host's PCI devices, and handles guest OS PCI config space
 * read & writes.
*/

#ifndef __LIB_VMM_DRIVER_PCI_H__
#define __LIB_VMM_DRIVER_PCI_H__

#include <stdint.h>

typedef struct vmm_pci_address {
    uint8_t bus;
    uint8_t dev;
    uint8_t fun;
} vmm_pci_address_t;

/* Functions for accessing the pci config space */
typedef struct vmm_pci_config {
    void *cookie;
    uint8_t (*ioread8)(void *cookie, vmm_pci_address_t addr, unsigned int offset);
    uint16_t (*ioread16)(void *cookie, vmm_pci_address_t addr, unsigned int offset);
    uint32_t (*ioread32)(void *cookie, vmm_pci_address_t addr, unsigned int offset);
    void (*iowrite8)(void *cookie, vmm_pci_address_t addr, unsigned int offset, uint8_t val);
    void (*iowrite16)(void *cookie, vmm_pci_address_t addr, unsigned int offset, uint16_t val);
    void (*iowrite32)(void *cookie, vmm_pci_address_t addr, unsigned int offset, uint32_t val);
} vmm_pci_config_t;

/* Abstract virtual PCI thing. Could be a device or anything. This
 * can be inserted into the virtual PCI configuration space */
typedef struct vmm_pci_entry {
    /* Callback functions for reading or writing its configuration space.
     * Returns 0 on success, nonzero if an error occured */
    void *cookie;
    int (*ioread)(void *cookie, int offset, int size, uint32_t *result);
    int (*iowrite)(void *cookie, int offset, int size, uint32_t value);
} vmm_pci_entry_t;

typedef struct vmm_pci_space {
    /* Only support one bus at the moment. */
    vmm_pci_entry_t *bus0[32][8];
    /* For IO port emulation this is the current config address */
    uint32_t conf_port_addr;
} vmm_pci_space_t;

/* Initialize PCI space */
int vmm_pci_init(vmm_pci_space_t *space);

/* Add a PCI entry. Optionally reports where it is located */
int vmm_pci_add_entry(vmm_pci_space_t *space, vmm_pci_entry_t entry, vmm_pci_address_t *addr);

/* Functions for emulating PCI config spaces over IO ports */
int vmm_pci_io_port_in(void *cookie, unsigned int port_no, unsigned int size, unsigned int *result);
int vmm_pci_io_port_out(void *cookie, unsigned int port_no, unsigned int size, unsigned int value);

#endif /* __LIB_VMM_DRIVER_PCI_H__ */
