Index: uspace/drv/block/ata_bd/ata_bd.c
===================================================================
--- uspace/drv/block/ata_bd/ata_bd.c	(revision 9f391e917010f96de63dc01c3a587d808ded8a0d)
+++ uspace/drv/block/ata_bd/ata_bd.c	(revision 3de67b4cff4994af4a74b190c5b094f45c15b561)
@@ -81,12 +81,4 @@
  */
 static const size_t identify_data_size = 512;
-
-/** I/O base addresses for legacy (ISA-compatible) controllers. */
-static ata_base_t legacy_base[LEGACY_CTLS] = {
-	{ 0x1f0, 0x3f0 },
-	{ 0x170, 0x370 },
-	{ 0x1e8, 0x3e8 },
-	{ 0x168, 0x368 }
-};
 
 static int ata_bd_init_io(ata_ctrl_t *ctrl);
@@ -145,17 +137,14 @@
 
 /** Initialize ATA controller. */
-int ata_ctrl_init(ata_ctrl_t *ctrl)
+int ata_ctrl_init(ata_ctrl_t *ctrl, ata_base_t *res)
 {
 	int i, rc;
 	int n_disks;
-	unsigned ctl_num;
 
 	ddf_msg(LVL_DEBUG, "ata_ctrl_init()");
 
-	ctl_num = 1;
-
 	fibril_mutex_initialize(&ctrl->lock);
-	ctrl->cmd_physical = legacy_base[ctl_num - 1].cmd;
-	ctrl->ctl_physical = legacy_base[ctl_num - 1].ctl;
+	ctrl->cmd_physical = res->cmd;
+	ctrl->ctl_physical = res->ctl;
 
 	ddf_msg(LVL_NOTE, "I/O address %p/%p", (void *) ctrl->cmd_physical,
Index: uspace/drv/block/ata_bd/ata_bd.h
===================================================================
--- uspace/drv/block/ata_bd/ata_bd.h	(revision 9f391e917010f96de63dc01c3a587d808ded8a0d)
+++ uspace/drv/block/ata_bd/ata_bd.h	(revision 3de67b4cff4994af4a74b190c5b094f45c15b561)
@@ -152,5 +152,5 @@
 } ata_fun_t;
 
-extern int ata_ctrl_init(ata_ctrl_t *);
+extern int ata_ctrl_init(ata_ctrl_t *, ata_base_t *);
 extern int ata_ctrl_remove(ata_ctrl_t *);
 extern int ata_ctrl_gone(ata_ctrl_t *);
Index: uspace/drv/block/ata_bd/main.c
===================================================================
--- uspace/drv/block/ata_bd/main.c	(revision 9f391e917010f96de63dc01c3a587d808ded8a0d)
+++ uspace/drv/block/ata_bd/main.c	(revision 3de67b4cff4994af4a74b190c5b094f45c15b561)
@@ -36,4 +36,5 @@
 #include <ddf/driver.h>
 #include <ddf/log.h>
+#include <device/hw_res_parsed.h>
 
 #include "ata_bd.h"
@@ -61,4 +62,44 @@
 };
 
+static int ata_get_res(ddf_dev_t *dev, ata_base_t *ata_res)
+{
+	async_sess_t *parent_sess;
+	hw_res_list_parsed_t hw_res;
+	int rc;
+
+	parent_sess = ddf_dev_parent_sess_create(dev,
+	    EXCHANGE_SERIALIZE);
+	if (parent_sess == NULL)
+		return ENOMEM;
+
+	hw_res_list_parsed_init(&hw_res);
+	rc = hw_res_get_list_parsed(parent_sess, &hw_res, 0);
+	if (rc != EOK)
+		return rc;
+
+	if (hw_res.io_ranges.count != 2) {
+		rc = EINVAL;
+		goto error;
+		return EINVAL;
+	}
+
+	ata_res->cmd = hw_res.io_ranges.ranges[0].address;
+	ata_res->ctl = hw_res.io_ranges.ranges[1].address;
+
+	if (hw_res.io_ranges.ranges[0].size < sizeof(ata_ctl_t)) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	if (hw_res.io_ranges.ranges[1].size < sizeof(ata_cmd_t)) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	return EOK;
+error:
+	hw_res_list_parsed_clean(&hw_res);
+	return rc;
+}
 
 /** Add new device
@@ -70,5 +111,12 @@
 {
 	ata_ctrl_t *ctrl;
-	int rc;
+	ata_base_t res;
+	int rc;
+
+	rc = ata_get_res(dev, &res);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Invalid HW resource configuration.");
+		return EINVAL;
+	}
 
 	ctrl = ddf_dev_data_alloc(dev, sizeof(ata_ctrl_t));
@@ -81,5 +129,5 @@
 	ctrl->dev = dev;
 
-	rc = ata_ctrl_init(ctrl);
+	rc = ata_ctrl_init(ctrl, &res);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "Failed initializing ATA controller.");
Index: uspace/drv/bus/isa/isa.dev
===================================================================
--- uspace/drv/bus/isa/isa.dev	(revision 9f391e917010f96de63dc01c3a587d808ded8a0d)
+++ uspace/drv/bus/isa/isa.dev	(revision 3de67b4cff4994af4a74b190c5b094f45c15b561)
@@ -32,4 +32,21 @@
 	io_range 70 2
 
-ata_bd:
+ata-c1:
 	match 100 isa/ata_bd
+	io_range 0x1f0 8
+	io_range 0x3f0 8
+
+ata-c2:
+	match 100 isa/ata_bd
+	io_range 0x170 8
+	io_range 0x370 8
+
+ata-c3:
+	match 100 isa/ata_bd
+	io_range 0x1e8 8
+	io_range 0x3e8 8
+
+ata-c4:
+	match 100 isa/ata_bd
+	io_range 0x168 8
+	io_range 0x368 8
