Moved masking of PCI ressource bits into a single place.

Improved debug output and error reporting for I/O and interrupts resources.
Init of ISA IDE or PCI IDE driver can now be seen in debug output, too.
Verified that both still work with Vmware


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23142 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen
2007-12-19 21:33:30 +00:00
parent b938008fe1
commit 5aa9034e50
2 changed files with 50 additions and 17 deletions
@@ -27,6 +27,7 @@
#define debug_level_info 2 #define debug_level_info 2
#define DEBUG_MSG_PREFIX "IDE ISA -- " #define DEBUG_MSG_PREFIX "IDE ISA -- "
#define TRACE dprintf
#include "wrapper.h" #include "wrapper.h"
@@ -262,6 +263,8 @@ init_channel(device_node_handle node, ide_channel ide_channel, channel_info **co
uint8 irq; uint8 irq;
status_t res; status_t res;
TRACE("ISA-IDE: channel init\n");
// get device data // get device data
if (pnp->get_attr_uint16(node, IDE_ISA_COMMAND_BLOCK_BASE, &command_block_base, false) != B_OK if (pnp->get_attr_uint16(node, IDE_ISA_COMMAND_BLOCK_BASE, &command_block_base, false) != B_OK
|| pnp->get_attr_uint16(node, IDE_ISA_CONTROL_BLOCK_BASE, &control_block_base, false) != B_OK || pnp->get_attr_uint16(node, IDE_ISA_CONTROL_BLOCK_BASE, &control_block_base, false) != B_OK
@@ -277,6 +280,9 @@ init_channel(device_node_handle node, ide_channel ide_channel, channel_info **co
goto err0; goto err0;
} }
TRACE("ISA-IDE: channel init, resources %#x %#x %d\n",
command_block_base, control_block_base, irq);
channel->isa = isa; channel->isa = isa;
channel->node = node; channel->node = node;
channel->lost = false; channel->lost = false;
@@ -289,7 +295,7 @@ init_channel(device_node_handle node, ide_channel ide_channel, channel_info **co
inthand, channel, 0); inthand, channel, 0);
if (res < 0) { if (res < 0) {
SHOW_ERROR( 0, "couldn't install irq handler @%d", irq); TRACE("ISA-IDE: couldn't install irq handler for int %d\n", irq);
goto err; goto err;
} }
@@ -313,6 +319,9 @@ static status_t
uninit_channel(void *channel_cookie) uninit_channel(void *channel_cookie)
{ {
channel_info *channel = channel_cookie; channel_info *channel = channel_cookie;
TRACE("ISA-IDE: channel uninit\n");
// disable IRQs // disable IRQs
write_device_control(channel, ide_devctrl_bit3 | ide_devctrl_nien); write_device_control(channel, ide_devctrl_bit3 | ide_devctrl_nien);
@@ -365,6 +374,9 @@ publish_channel(device_node_handle parent, io_resource_handle *resources,
SHOW_FLOW0(2, ""); SHOW_FLOW0(2, "");
TRACE("ISA-IDE: publishing %s, resources %#x %#x %d\n",
name, command_block_base, control_block_base, intnum);
return pnp->register_device(parent, attrs, resources, &node); return pnp->register_device(parent, attrs, resources, &node);
} }
@@ -386,8 +398,11 @@ probe_channel(device_node_handle parent,
// we aren't upset if io-ports are in use already - only // we aren't upset if io-ports are in use already - only
// the PCI IDE driver can own them, and if it does, we exit silently // the PCI IDE driver can own them, and if it does, we exit silently
if (pnp->acquire_io_resources(resources, resource_handles) != B_OK) if (pnp->acquire_io_resources(resources, resource_handles) != B_OK) {
TRACE("ISA-IDE: can't acquire resources %#x and %#x\n",
command_block_base, control_block_base);
return B_OK; return B_OK;
}
// we assume that every modern PC has an IDE controller, so no // we assume that every modern PC has an IDE controller, so no
// further testing is done (well - I don't really know how to detect the // further testing is done (well - I don't really know how to detect the
@@ -30,6 +30,8 @@
#include "wrapper.h" #include "wrapper.h"
#define TRACE dprintf
static ide_for_controller_interface *ide; static ide_for_controller_interface *ide;
static device_manager_info *pnp; static device_manager_info *pnp;
@@ -330,6 +332,8 @@ ide_adapter_init_channel(device_node_handle node, ide_channel ide_channel,
uint8 is_primary; uint8 is_primary;
status_t res; status_t res;
TRACE("PCI-IDE: init channel...\n");
// get device data // get device data
if (pnp->get_attr_uint16(node, IDE_ADAPTER_COMMAND_BLOCK_BASE, &command_block_base, false) != B_OK if (pnp->get_attr_uint16(node, IDE_ADAPTER_COMMAND_BLOCK_BASE, &command_block_base, false) != B_OK
|| pnp->get_attr_uint16(node, IDE_ADAPTER_CONTROL_BLOCK_BASE, &control_block_base, false) != B_OK || pnp->get_attr_uint16(node, IDE_ADAPTER_CONTROL_BLOCK_BASE, &control_block_base, false) != B_OK
@@ -380,6 +384,7 @@ ide_adapter_init_channel(device_node_handle node, ide_channel ide_channel,
goto err3; goto err3;
} }
TRACE("PCI-IDE: init channel done\n");
// enable interrupts so the channel is ready to run // enable interrupts so the channel is ready to run
ide_adapter_write_device_control(channel, ide_devctrl_bit3); ide_adapter_write_device_control(channel, ide_devctrl_bit3);
@@ -484,25 +489,31 @@ ide_adapter_detect_channel(pci_device_module_info *pci, pci_device pci_device,
command_block_base = 0x1f0; command_block_base = 0x1f0;
control_block_base = 0x3f6; control_block_base = 0x3f6;
intnum = 14; intnum = 14;
TRACE("PCI-IDE: Controller in legacy mode: cmd %#x, ctrl %#x, irq %d\n",
command_block_base, control_block_base, intnum);
} else if (supports_compatibility_mode } else if (supports_compatibility_mode
&& !is_primary && (api & IDE_API_PRIMARY_NATIVE) == 0) { && !is_primary && (api & IDE_API_PRIMARY_NATIVE) == 0) {
command_block_base = 0x170; command_block_base = 0x170;
control_block_base = 0x376; control_block_base = 0x376;
intnum = 15; intnum = 15;
TRACE("PCI-IDE: Controller in legacy mode: cmd %#x, ctrl %#x, irq %d\n",
command_block_base, control_block_base, intnum);
} else { } else {
if ((command_block_base & PCI_address_space) != PCI_address_space if (command_block_base == 0 || control_block_base == 0) {
|| (control_block_base & PCI_address_space) != PCI_address_space) { TRACE("PCI-IDE: Command/Control Block base is not configured\n");
SHOW_ERROR0( 2, "Command/Control Block base is not configured" ); return B_ERROR;
}
if (intnum == 0 || intnum == 0xff) {
TRACE("PCI-IDE: Interrupt is not configured\n");
return B_ERROR; return B_ERROR;
} }
command_block_base &= ~PCI_address_space;
control_block_base &= ~PCI_address_space;
// historically, they start at 3f6h/376h, but PCI spec requires registers // historically, they start at 3f6h/376h, but PCI spec requires registers
// to be aligned at 4 bytes, so only 3f4h/374h can be specified; thus // to be aligned at 4 bytes, so only 3f4h/374h can be specified; thus
// PCI IDE defines that control block starts at offset 2 // PCI IDE defines that control block starts at offset 2
control_block_base += 2; control_block_base += 2;
TRACE("PCI-IDE: Controller in native mode: cmd %#x, ctrl %#x, irq %d\n",
command_block_base, control_block_base, intnum);
} }
if (supports_compatibility_mode) { if (supports_compatibility_mode) {
@@ -516,13 +527,15 @@ ide_adapter_detect_channel(pci_device_module_info *pci, pci_device pci_device,
// better were to use a controller lock, but this had to be done in the IDE // better were to use a controller lock, but this had to be done in the IDE
// bus manager, and I don't see any reason to add extra code for old // bus manager, and I don't see any reason to add extra code for old
// simplex controllers // simplex controllers
SHOW_INFO0( 2, "Simplex controller - disabling DMA of secondary channel" ); TRACE("PCI-IDE: Simplex controller - disabling DMA of secondary channel\n");
controller_can_dma = false; controller_can_dma = false;
} }
} }
bus_master_base += is_primary ? 0 : 8; bus_master_base += is_primary ? 0 : 8;
TRACE("PCI-IDE: bus master base %#x\n", bus_master_base);
{ {
// allocate channel's I/O resources // allocate channel's I/O resources
io_resource resources[3] = { io_resource resources[3] = {
@@ -532,7 +545,8 @@ ide_adapter_detect_channel(pci_device_module_info *pci, pci_device pci_device,
}; };
if (pnp->acquire_io_resources(resources, resource_handles) != B_OK) { if (pnp->acquire_io_resources(resources, resource_handles) != B_OK) {
SHOW_ERROR( 2, "Couldn't acquire channel resources %d and %d\n", command_block_base, control_block_base); TRACE("PCI-IDE: Couldn't acquire channel resources %#x and %#x\n",
command_block_base, control_block_base);
return B_ERROR; return B_ERROR;
} }
} }
@@ -658,10 +672,10 @@ ide_adapter_detect_controller(pci_device_module_info *pci, pci_device pci_device
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
if ((bus_master_base & PCI_address_space) != 1) if (bus_master_base == 0) {
return B_OK; TRACE("PCI-IDE: Controller detection failed! bus master base not configured\n");
return B_ERROR;
bus_master_base &= ~PCI_address_space; }
{ {
io_resource resources[2] = { io_resource resources[2] = {
@@ -670,7 +684,7 @@ ide_adapter_detect_controller(pci_device_module_info *pci, pci_device pci_device
}; };
if (pnp->acquire_io_resources(resources, resource_handles) != B_OK) { if (pnp->acquire_io_resources(resources, resource_handles) != B_OK) {
SHOW_ERROR( 2, "Couldn't acquire controller resource %d\n", bus_master_base); TRACE("PCI-IDE: Couldn't acquire controller resource %#x\n", bus_master_base);
return B_ERROR; return B_ERROR;
} }
} }
@@ -708,6 +722,12 @@ ide_adapter_probe_controller(device_node_handle parent, const char *controller_d
bus_master_base = pci->read_pci_config(device, PCI_base_registers + 16, 4); bus_master_base = pci->read_pci_config(device, PCI_base_registers + 16, 4);
intnum = pci->read_pci_config(device, PCI_interrupt_line, 1); intnum = pci->read_pci_config(device, PCI_interrupt_line, 1);
command_block_base[0] &= ~PCI_address_space;
control_block_base[0] &= ~PCI_address_space;
command_block_base[1] &= ~PCI_address_space;
control_block_base[1] &= ~PCI_address_space;
bus_master_base &= ~PCI_address_space;
res = ide_adapter_detect_controller(pci, device, parent, bus_master_base, res = ide_adapter_detect_controller(pci, device, parent, bus_master_base,
controller_driver, controller_driver_type, controller_name, can_dma, controller_driver, controller_driver_type, controller_name, can_dma,
can_cq, dma_alignment, dma_boundary, max_sg_block_size, &controller_node); can_cq, dma_alignment, dma_boundary, max_sg_block_size, &controller_node);
@@ -716,8 +736,6 @@ ide_adapter_probe_controller(device_node_handle parent, const char *controller_d
if (res != B_OK || controller_node == NULL) if (res != B_OK || controller_node == NULL)
goto err; goto err;
bus_master_base &= ~PCI_address_space;
// ignore errors during registration of channels - could be a simple rescan collision // ignore errors during registration of channels - could be a simple rescan collision
ide_adapter_detect_channel(pci, device, controller_node, channel_module_name, ide_adapter_detect_channel(pci, device, controller_node, channel_module_name,
can_dma, command_block_base[0], control_block_base[0], bus_master_base, can_dma, command_block_base[0], control_block_base[0], bus_master_base,