* Adding a driver for the not quite standard IT8211 single channel IDE

controller. The device doesn't use the PCI_ide subclass (but
  PCI_mass_storage_other) and requires not using compatibility mode. Otherwise
  it's pretty much the generic_ide_pci driver.
* Directly adding the driver to the image.

This driver could either be merged into the generic ide driver so it supports
not quite standard devices, or this could be made into a driver that collects
all those non standard devices. Either way, this works for now and lets my
machine boot off the IDE drive :-)

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25868 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz
2008-06-08 20:09:12 +00:00
parent 9079144ace
commit ea963c10d1
4 changed files with 253 additions and 2 deletions
+2 -2
View File
@@ -145,7 +145,7 @@ AddFilesToHaikuImage beos system add-ons kernel bus_managers
AddFilesToHaikuImage beos system add-ons kernel busses agp_gart
: $(X86_ONLY)<agp_gart>intel ;
AddFilesToHaikuImage beos system add-ons kernel busses ide
: generic_ide_pci silicon_image_3112 legacy_sata $(X86_ONLY)ide_isa ;
: generic_ide_pci it8211 legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa ;
AddFilesToHaikuImage beos system add-ons kernel busses scsi
: ahci ;
AddFilesToHaikuImage beos system add-ons kernel busses usb
@@ -359,7 +359,7 @@ AddBootModuleSymlinksToHaikuImage
pci $(X86_ONLY)isa config_manager ide scsi usb
$(PPC_ONLY)openpic
block_io ide_adapter locked_pool scsi_periph
generic_ide_pci ahci legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa
ahci generic_ide_pci it8211 legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa
<usb>uhci <usb>ohci <usb>ehci
scsi_cd scsi_disk usb_disk
intel
+1
View File
@@ -2,6 +2,7 @@ SubDir HAIKU_TOP src add-ons kernel busses ide ;
SubInclude HAIKU_TOP src add-ons kernel busses ide generic_ide_pci ;
SubInclude HAIKU_TOP src add-ons kernel busses ide ide_isa ;
SubInclude HAIKU_TOP src add-ons kernel busses ide it8211 ;
SubInclude HAIKU_TOP src add-ons kernel busses ide promise_tx2 ;
SubInclude HAIKU_TOP src add-ons kernel busses ide silicon_image_3112 ;
SubInclude HAIKU_TOP src add-ons kernel busses ide legacy_sata ;
@@ -0,0 +1,8 @@
SubDir HAIKU_TOP src add-ons kernel busses ide it8211 ;
UsePrivateHeaders kernel ;
UsePrivateHeaders drivers ;
KernelAddon it8211 :
it8211.c
;
@@ -0,0 +1,242 @@
/*
* Copyright 2008, Michael Lotz. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <KernelExport.h>
#include <stdlib.h>
#include <string.h>
#include <ide_adapter.h>
#define IT8211_CONTROLLER_MODULE_NAME "busses/ide/it8211/driver_v1"
#define IT8211_CHANNEL_MODULE_NAME "busses/ide/it8211/channel/v1"
#define PCI_VENDOR_ITE 0x1283
#define PCI_DEVICE_ITE_IT8211 0x8211
static ide_adapter_interface *sIDEAdapter;
static device_manager_info *sDeviceManager;
static void
it8211_set_channel(void *channelCookie, ide_channel channel)
{
sIDEAdapter->set_channel((ide_adapter_channel_info *)channelCookie,
channel);
}
static status_t
it8211_write_command_block_regs(void *channelCookie, ide_task_file *taskFile,
ide_reg_mask registerMask)
{
return sIDEAdapter->write_command_block_regs(
(ide_adapter_channel_info *)channelCookie, taskFile, registerMask);
}
static status_t
it8211_read_command_block_regs(void *channelCookie, ide_task_file *taskFile,
ide_reg_mask registerMask)
{
return sIDEAdapter->read_command_block_regs(
(ide_adapter_channel_info *)channelCookie, taskFile, registerMask);
}
static uint8
it8211_get_altstatus(void *channelCookie)
{
return sIDEAdapter->get_altstatus((ide_adapter_channel_info *)channelCookie);
}
static status_t
it8211_write_device_control(void *channelCookie, uint8 value)
{
return sIDEAdapter->write_device_control(
(ide_adapter_channel_info *)channelCookie, value);
}
static status_t
it8211_write_pio(void *channelCookie, uint16 *data, int count, bool force16bit)
{
return sIDEAdapter->write_pio(
(ide_adapter_channel_info *)channelCookie, data, count, force16bit);
}
static status_t
it8211_read_pio(void *channelCookie, uint16 *data, int count, bool force16bit)
{
return sIDEAdapter->read_pio(
(ide_adapter_channel_info *)channelCookie, data, count, force16bit);
}
static status_t
it8211_prepare_dma(void *channelCookie, const physical_entry *sgList,
size_t sgListCount, bool toDevice)
{
return sIDEAdapter->prepare_dma((ide_adapter_channel_info *)channelCookie,
sgList, sgListCount, toDevice);
}
static status_t
it8211_start_dma(void *channelCookie)
{
return sIDEAdapter->start_dma((ide_adapter_channel_info *)channelCookie);
}
static status_t
it8211_finish_dma(void *channelCookie)
{
return sIDEAdapter->finish_dma((ide_adapter_channel_info *)channelCookie);
}
static status_t
init_channel(device_node *node, void **channelCookie)
{
return sIDEAdapter->init_channel(node,
(ide_adapter_channel_info **)channelCookie,
sizeof(ide_adapter_channel_info), sIDEAdapter->inthand);
}
static void
uninit_channel(void *channelCookie)
{
sIDEAdapter->uninit_channel((ide_adapter_channel_info *)channelCookie);
}
static void
channel_removed(void *channelCookie)
{
sIDEAdapter->channel_removed((ide_adapter_channel_info *)channelCookie);
}
static status_t
init_controller(device_node *node, void **cookie)
{
return sIDEAdapter->init_controller(node,
(ide_adapter_controller_info **)cookie,
sizeof(ide_adapter_controller_info));
}
static void
uninit_controller(void *cookie)
{
sIDEAdapter->uninit_controller((ide_adapter_controller_info *)cookie);
}
static void
controller_removed(void *cookie)
{
sIDEAdapter->controller_removed((ide_adapter_controller_info *)cookie);
}
static status_t
probe_controller(device_node *parent)
{
return sIDEAdapter->probe_controller(parent,
IT8211_CONTROLLER_MODULE_NAME, "it8211",
"ITE IT8211", IT8211_CHANNEL_MODULE_NAME,
true, /* DMA */
true, /* command queuing */
1, /* 16 bit alignment */
0xffff, /* 64k boundary */
0x10000, /* up to 64k per scatter/gather block */
false); /* no compatibility mode */
}
static float
supports_device(device_node *parent)
{
const char *bus;
uint16 vendorID;
uint16 deviceID;
if (sDeviceManager->get_attr_string(parent, B_DEVICE_BUS, &bus, false) != B_OK
|| sDeviceManager->get_attr_uint16(parent, B_DEVICE_VENDOR_ID, &vendorID, false) != B_OK
|| sDeviceManager->get_attr_uint16(parent, B_DEVICE_ID, &deviceID, false) != B_OK) {
return -1.0f;
}
if (strcmp(bus, "pci") != 0 || vendorID != PCI_VENDOR_ITE
|| deviceID != PCI_DEVICE_ITE_IT8211)
return 0.0f;
return 1.0f;
}
module_dependency module_dependencies[] = {
{ B_DEVICE_MANAGER_MODULE_NAME, (module_info **)&sDeviceManager },
{ IDE_ADAPTER_MODULE_NAME, (module_info **)&sIDEAdapter },
{}
};
// exported interface
static ide_controller_interface sChannelInterface = {
{
{
IT8211_CHANNEL_MODULE_NAME,
0,
NULL
},
NULL, // supports device
NULL, // register device
&init_channel,
&uninit_channel,
NULL, // register child devices
NULL, // rescan
&channel_removed
},
&it8211_set_channel,
&it8211_write_command_block_regs,
&it8211_read_command_block_regs,
&it8211_get_altstatus,
&it8211_write_device_control,
&it8211_write_pio,
&it8211_read_pio,
&it8211_prepare_dma,
&it8211_start_dma,
&it8211_finish_dma
};
static driver_module_info sControllerInterface = {
{
IT8211_CONTROLLER_MODULE_NAME,
0,
NULL
},
&supports_device,
&probe_controller,
&init_controller,
&uninit_controller,
NULL, // register child devices
NULL, // rescan
&controller_removed
};
module_info *modules[] = {
(module_info *)&sControllerInterface,
(module_info *)&sChannelInterface,
NULL
};