Adding DMA detection and generally allow DMA. Not used yet though.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30054 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -17,7 +17,7 @@
|
|||||||
// maximum number of devices connected to controller (uint8, optional, default:2)
|
// maximum number of devices connected to controller (uint8, optional, default:2)
|
||||||
#define ATA_CONTROLLER_MAX_DEVICES_ITEM "ide/max_devices"
|
#define ATA_CONTROLLER_MAX_DEVICES_ITEM "ide/max_devices"
|
||||||
// set to not-0 if DMA is supported (uint8, optional, default:0)
|
// set to not-0 if DMA is supported (uint8, optional, default:0)
|
||||||
#define ATA_CONTROLLER_CAN_DMA_ITEM "ide/can_dma"
|
#define ATA_CONTROLLER_CAN_DMA_ITEM "ide/can_DMA"
|
||||||
// name of controller (string, required)
|
// name of controller (string, required)
|
||||||
#define ATA_CONTROLLER_CONTROLLER_NAME_ITEM "ide/controller_name"
|
#define ATA_CONTROLLER_CONTROLLER_NAME_ITEM "ide/controller_name"
|
||||||
|
|
||||||
|
|||||||
@@ -18,17 +18,21 @@ ATAChannel::ATAChannel(device_node *node)
|
|||||||
fSCSIBus(NULL),
|
fSCSIBus(NULL),
|
||||||
fDeviceCount(0),
|
fDeviceCount(0),
|
||||||
fDevices(NULL),
|
fDevices(NULL),
|
||||||
fUseDMA(false),
|
fUseDMA(true),
|
||||||
fRequest(NULL)
|
fRequest(NULL)
|
||||||
{
|
{
|
||||||
mutex_init(&fLock, "ata channel");
|
mutex_init(&fLock, "ata channel");
|
||||||
|
|
||||||
|
gDeviceManager->get_attr_uint32(node, ATA_CHANNEL_ID_ITEM, &fChannelID,
|
||||||
|
true);
|
||||||
|
snprintf(fDebugContext, sizeof(fDebugContext), " %lu", fChannelID);
|
||||||
|
|
||||||
if (fUseDMA) {
|
if (fUseDMA) {
|
||||||
void *settings = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS);
|
void *settings = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS);
|
||||||
if (settings != NULL) {
|
if (settings != NULL) {
|
||||||
if (get_driver_boolean_parameter(settings,
|
if (get_driver_boolean_parameter(settings,
|
||||||
B_SAFEMODE_DISABLE_IDE_DMA, false, false)) {
|
B_SAFEMODE_DISABLE_IDE_DMA, false, false)) {
|
||||||
TRACE("disabling dma because of safemode setting\n");
|
TRACE_ALWAYS("disabling DMA because of safemode setting\n");
|
||||||
fUseDMA = false;
|
fUseDMA = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +43,13 @@ ATAChannel::ATAChannel(device_node *node)
|
|||||||
if (fUseDMA) {
|
if (fUseDMA) {
|
||||||
uint8 canDMA;
|
uint8 canDMA;
|
||||||
if (gDeviceManager->get_attr_uint8(node, ATA_CONTROLLER_CAN_DMA_ITEM,
|
if (gDeviceManager->get_attr_uint8(node, ATA_CONTROLLER_CAN_DMA_ITEM,
|
||||||
&canDMA, true) != B_OK || canDMA == 0) {
|
&canDMA, true) != B_OK) {
|
||||||
|
TRACE_ERROR("unknown if controller supports DMA, not using it\n");
|
||||||
|
fUseDMA = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canDMA == 0) {
|
||||||
|
TRACE_ALWAYS("controller doesn't support DMA, disabling\n");
|
||||||
fUseDMA = false;
|
fUseDMA = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,11 +76,6 @@ ATAChannel::ATAChannel(device_node *node)
|
|||||||
for (uint8 i = 0; i < fDeviceCount; i++)
|
for (uint8 i = 0; i < fDeviceCount; i++)
|
||||||
fDevices[i] = NULL;
|
fDevices[i] = NULL;
|
||||||
|
|
||||||
|
|
||||||
gDeviceManager->get_attr_uint32(node, ATA_CHANNEL_ID_ITEM, &fChannelID,
|
|
||||||
true);
|
|
||||||
snprintf(fDebugContext, sizeof(fDebugContext), " %lu", fChannelID);
|
|
||||||
|
|
||||||
device_node *parent = gDeviceManager->get_parent_node(node);
|
device_node *parent = gDeviceManager->get_parent_node(node);
|
||||||
fStatus = gDeviceManager->get_driver(parent,
|
fStatus = gDeviceManager->get_driver(parent,
|
||||||
(driver_module_info **)&fController, &fCookie);
|
(driver_module_info **)&fController, &fCookie);
|
||||||
@@ -149,15 +154,15 @@ ATAChannel::ScanBus()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_ALWAYS("identified ATA%s device %u\n", device->IsATAPI()
|
|
||||||
? "PI" : "", i);
|
|
||||||
|
|
||||||
if (device->Configure() != B_OK) {
|
if (device->Configure() != B_OK) {
|
||||||
TRACE_ERROR("failed to configure device\n");
|
TRACE_ERROR("failed to configure device\n");
|
||||||
delete device;
|
delete device;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE_ALWAYS("identified ATA%s device %u\n", device->IsATAPI()
|
||||||
|
? "PI" : "", i);
|
||||||
|
|
||||||
fDevices[i] = device;
|
fDevices[i] = device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ ATADevice::ATADevice(ATAChannel *channel, uint8 index)
|
|||||||
fUseLBA(false),
|
fUseLBA(false),
|
||||||
fUse48Bits(false),
|
fUse48Bits(false),
|
||||||
fUseDMA(channel->UseDMA()),
|
fUseDMA(channel->UseDMA()),
|
||||||
|
fDMAMode(0),
|
||||||
fTotalSectors(0),
|
fTotalSectors(0),
|
||||||
fRegisterMask(0)
|
fRegisterMask(0)
|
||||||
{
|
{
|
||||||
@@ -361,7 +362,43 @@ ATADevice::ConfigureDMA()
|
|||||||
if (!fUseDMA)
|
if (!fUseDMA)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
fUseDMA = false;
|
if (!fInfoBlock.DMA_supported) {
|
||||||
|
TRACE_ALWAYS("DMA not supported by device\n");
|
||||||
|
fUseDMA = false;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CHECK_DMA_MODE(element, mode) \
|
||||||
|
if (fInfoBlock.element) { \
|
||||||
|
fDMAMode = mode; \
|
||||||
|
modeCount++; \
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 modeCount = 0;
|
||||||
|
|
||||||
|
CHECK_DMA_MODE(MDMA0_selected, 0x00);
|
||||||
|
CHECK_DMA_MODE(MDMA1_selected, 0x01);
|
||||||
|
CHECK_DMA_MODE(MDMA2_selected, 0x02);
|
||||||
|
|
||||||
|
if (fInfoBlock._88_valid) {
|
||||||
|
CHECK_DMA_MODE(UDMA0_selected, 0x10);
|
||||||
|
CHECK_DMA_MODE(UDMA1_selected, 0x11);
|
||||||
|
CHECK_DMA_MODE(UDMA2_selected, 0x12);
|
||||||
|
CHECK_DMA_MODE(UDMA3_selected, 0x13);
|
||||||
|
CHECK_DMA_MODE(UDMA4_selected, 0x14);
|
||||||
|
CHECK_DMA_MODE(UDMA5_selected, 0x15);
|
||||||
|
CHECK_DMA_MODE(UDMA6_selected, 0x16);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef CHECK_DMA_MODE
|
||||||
|
|
||||||
|
if (modeCount != 1) {
|
||||||
|
TRACE_ERROR("more than on DMA mode selected, not using DMA\n");
|
||||||
|
fUseDMA = false;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE_ALWAYS("using DMA mode 0x%02x\n", fDMAMode);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -188,6 +188,7 @@ private:
|
|||||||
bool fUseLBA;
|
bool fUseLBA;
|
||||||
bool fUse48Bits;
|
bool fUse48Bits;
|
||||||
bool fUseDMA;
|
bool fUseDMA;
|
||||||
|
uint8 fDMAMode;
|
||||||
uint64 fTotalSectors;
|
uint64 fTotalSectors;
|
||||||
ata_device_infoblock fInfoBlock;
|
ata_device_infoblock fInfoBlock;
|
||||||
ata_task_file fTaskFile;
|
ata_task_file fTaskFile;
|
||||||
|
|||||||
Reference in New Issue
Block a user