#ifndef _ATA_PCI_H
#define _ATA_PCI_H
#include <bus/ATA.h>
#include <bus/PCI.h>
#include <ata_types.h>
typedef struct prd_entry {
uint32 address;
uint16 count;
uint8 res6;
B_LBITFIELD8_2(
res7_0 : 7,
EOT : 1
);
} prd_entry;
#define ATA_BM_COMMAND_START_STOP 0x01
#define ATA_BM_COMMAND_READ_FROM_DEVICE 0x08
#define ATA_BM_STATUS_ACTIVE 0x01
#define ATA_BM_STATUS_ERROR 0x02
#define ATA_BM_STATUS_INTERRUPT 0x04
#define ATA_BM_STATUS_MASTER_DMA 0x20
#define ATA_BM_STATUS_SLAVE_DMA 0x40
#define ATA_BM_STATUS_SIMPLEX_DMA 0x80
enum {
ATA_BM_COMMAND_REG = 0,
ATA_BM_STATUS_REG = 2,
ATA_BM_PRDT_ADDRESS = 4
};
#define ATA_ADAPTER_MAX_SG_COUNT (B_PAGE_SIZE / sizeof( prd_entry ))
#define ATA_ADAPTER_COMMAND_BLOCK_BASE "ata_adapter/command_block_base"
#define ATA_ADAPTER_CONTROL_BLOCK_BASE "ata_adapter/control_block_base"
#define ATA_ADAPTER_INTNUM "ata_adapter/irq"
#define ATA_ADAPTER_CHANNEL_INDEX "ata_adapter/channel_index"
#define ATA_ADAPTER_BUS_MASTER_BASE "ata_adapter/bus_master_base"
typedef struct ata_adapter_channel_info {
pci_device_module_info *pci;
pci_device *device;
uint16 command_block_base;
uint16 control_block_base;
uint16 bus_master_base;
int intnum;
uint32 lost;
ata_channel ataChannel;
device_node *node;
int32 (*inthand)( void *arg );
area_id prd_area;
prd_entry *prdt;
uint32 prdt_phys;
uint32 dmaing;
} ata_adapter_channel_info;
typedef struct ata_adapter_controller_info {
pci_device_module_info *pci;
pci_device *device;
uint16 bus_master_base;
uint32 lost;
device_node *node;
} ata_adapter_controller_info;
typedef struct {
module_info info;
void (*set_channel)(ata_adapter_channel_info *channel,
ata_channel ataChannel);
status_t (*write_command_block_regs)(ata_adapter_channel_info *channel,
ata_task_file *tf, ata_reg_mask mask);
status_t (*read_command_block_regs)(ata_adapter_channel_info *channel,
ata_task_file *tf, ata_reg_mask mask);
uint8 (*get_altstatus) (ata_adapter_channel_info *channel);
status_t (*write_device_control) (ata_adapter_channel_info *channel, uint8 val);
status_t (*write_pio)(ata_adapter_channel_info *channel, uint16 *data, int count, bool force_16bit);
status_t (*read_pio)(ata_adapter_channel_info *channel, uint16 *data, int count, bool force_16bit);
status_t (*prepare_dma)(ata_adapter_channel_info *channel, const physical_entry *sg_list,
size_t sg_list_count, bool to_device);
status_t (*start_dma)(ata_adapter_channel_info *channel);
status_t (*finish_dma)(ata_adapter_channel_info *channel);
int32 (*inthand)(void *arg);
status_t (*init_channel)(device_node *node,
ata_adapter_channel_info **cookie, size_t total_data_size,
int32 (*inthand)(void *arg));
void (*uninit_channel)(ata_adapter_channel_info *channel);
void (*channel_removed)(ata_adapter_channel_info *channel);
status_t (*publish_channel)(device_node *controller_node,
const char *channel_module_name, uint16 command_block_base,
uint16 control_block_base, uint8 intnum, bool can_dma,
uint8 channel_index, const char *name,
const io_resource *resources, device_node **node);
status_t (*detect_channel)(pci_device_module_info *pci, pci_device *pciDevice,
device_node *controller_node, const char *channel_module_name,
bool controller_can_dma, uint16 command_block_base,
uint16 control_block_base, uint16 bus_master_base,
uint8 intnum, uint8 channel_index, const char *name,
device_node **node, bool supports_compatibility_mode);
status_t (*init_controller)(device_node *node,
ata_adapter_controller_info **cookie, size_t total_data_size);
void (*uninit_controller)(ata_adapter_controller_info *controller);
void (*controller_removed)(ata_adapter_controller_info *controller);
status_t (*publish_controller)(device_node *parent, uint16 bus_master_base,
io_resource *resources, const char *controller_driver,
const char *controller_driver_type, const char *controller_name,
bool can_dma, bool can_cq, uint32 dma_alignment, uint32 dma_boundary,
uint32 max_sg_block_size, device_node **node);
status_t (*detect_controller)(pci_device_module_info *pci, pci_device *pciDevice,
device_node *parent, uint16 bus_master_base,
const char *controller_driver, const char *controller_driver_type,
const char *controller_name, bool can_dma, bool can_cq,
uint32 dma_alignment, uint32 dma_boundary, uint32 max_sg_block_size,
device_node **node);
status_t (*probe_controller)(device_node *parent, const char *controller_driver,
const char *controller_driver_type, const char *controller_name,
const char *channel_module_name, bool can_dma, bool can_cq,
uint32 dma_alignment, uint32 dma_boundary, uint32 max_sg_block_size,
bool supports_compatibility_mode);
} ata_adapter_interface;
#define ATA_ADAPTER_MODULE_NAME "generic/ata_adapter/v1"
#endif