genode/repos/os/src/drivers/atapi/ata_bus_master.h

76 lines
1.7 KiB
C++

/*
* \brief I/O interface to the IDE bus master
* \author Sebastian Sumpf <Sebastian.Sumpf@genode-labs.com>
* \date 2010-07-15
*/
/*
* Copyright (C) 2010-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _ATA_PCI_H_
#define _ATA_PCI_H_
namespace Genode {
class Io_port_connection;
}
namespace Ata {
class Bus_master {
enum {
PCI_CFG_BMIBA_OFF = 0x20, /* offset in PCI config space */
CLASS_MASS_STORAGE = 0x10000,
SUBCLASS_IDE = 0x0100,
CLASS_MASK = 0xffff00,
/* These bits of the programming interface part within the class code
* define if the corresponding channel operates on standard legacy ports
* (bits are cleared) or if the corresponding ports in base register 0-1
* and 2-3 for channel 2 must be used as I/O bases (bits are set) */
PI_CH1_LEGACY = 0x1,
PI_CH2_LEGACY = 0x4,
};
/**
* Bus master interface base address
*/
unsigned _bmiba;
bool _port_io;
bool _secondary;
unsigned long _prd_virt;
unsigned long _prd_phys;
Genode::Io_port_connection *_pio;
public:
Bus_master(bool secondary);
~Bus_master();
unsigned char read_cmd();
unsigned char read_status();
void write_cmd(unsigned char val);
void write_status(unsigned char val);
void write_prd(unsigned long val);
void set_prd(unsigned long virt, unsigned long phys)
{
_prd_virt = virt;
_prd_phys = phys;
}
/**
* Scan PCI Bus for IDE devices and set BMBIA
*/
bool scan_pci();
};
}
#endif /* _ATA_PCI_H_ */