⛏️ index : haiku.git

/*
 * Copyright 2008, Haiku Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _PCI2_H
#define _PCI2_H


#include <device_manager.h>
#include <PCI.h>


typedef struct pci_device pci_device;

typedef struct pci_device_module_info {
	driver_module_info info;

	uint8	(*read_io_8)(pci_device *device, addr_t mappedIOAddress);
	void	(*write_io_8)(pci_device *device, addr_t mappedIOAddress,
				uint8 value);
	uint16	(*read_io_16)(pci_device *device, addr_t mappedIOAddress);
	void	(*write_io_16)(pci_device *device, addr_t mappedIOAddress,
				uint16 value);
	uint32	(*read_io_32)(pci_device *device, addr_t mappedIOAddress);
	void	(*write_io_32)(pci_device *device, addr_t mappedIOAddress,
				uint32 value);

	phys_addr_t	(*ram_address)(pci_device *device, phys_addr_t physicalAddress);

	uint32	(*read_pci_config)(pci_device *device, uint16 offset,
				uint8 size);
	void	(*write_pci_config)(pci_device *device, uint16 offset,
				uint8 size, uint32 value);
	status_t (*find_pci_capability)(pci_device *device, uint8 capID,
				uint8 *offset);
	void 	(*get_pci_info)(pci_device *device, struct pci_info *info);
	status_t (*find_pci_extended_capability)(pci_device *device, uint16 capID,
				uint16 *offset);
	uint8	(*get_powerstate)(pci_device *device);
	void	(*set_powerstate)(pci_device *device, uint8 state);

	// MSI/MSI-X
	uint32	(*get_msi_count)(pci_device *device);
	status_t (*configure_msi)(pci_device *device,
				uint32 count,
				uint32 *startVector);
	status_t (*unconfigure_msi)(pci_device *device);

	status_t (*enable_msi)(pci_device *device);
	status_t (*disable_msi)(pci_device *device);

	uint32	(*get_msix_count)(pci_device *device);
	status_t (*configure_msix)(pci_device *device,
				uint32 count,
				uint32 *startVector);
	status_t (*enable_msix)(pci_device *device);

} pci_device_module_info;


typedef struct pci_resource_range {
	uint32 type;
	uint8 address_type;
	phys_addr_t host_address;
	phys_addr_t pci_address;
	uint64 size;
} pci_resource_range;


typedef struct pci_controller_module_info {
	driver_module_info info;

	// read PCI config space
	status_t	(*read_pci_config)(void *cookie,
				uint8 bus, uint8 device, uint8 function,
				uint16 offset, uint8 size, uint32 *value);

	// write PCI config space
	status_t	(*write_pci_config)(void *cookie,
				uint8 bus, uint8 device, uint8 function,
				uint16 offset, uint8 size, uint32 value);

	status_t	(*get_max_bus_devices)(void *cookie, int32 *count);

	status_t	(*read_pci_irq)(void *cookie,
				uint8 bus, uint8 device, uint8 function,
				uint8 pin, uint8 *irq);

	status_t	(*write_pci_irq)(void *cookie,
				uint8 bus, uint8 device, uint8 function,
				uint8 pin, uint8 irq);

	status_t	(*get_range)(void *cookie, uint32 index, pci_resource_range *range);

	status_t	(*finalize)(void *cookie);

} pci_controller_module_info;


/* Attributes of PCI device nodes */
#define B_PCI_DEVICE_DOMAIN		"pci/domain"		/* uint32 */
#define B_PCI_DEVICE_BUS		"pci/bus"			/* uint8 */
#define B_PCI_DEVICE_DEVICE		"pci/device"		/* uint8 */
#define B_PCI_DEVICE_FUNCTION	"pci/function"		/* uint8 */

#endif	/* _PCI2_H */