Index: uspace/srv/bd/ata_bd/ata_bd.c
===================================================================
--- uspace/srv/bd/ata_bd/ata_bd.c	(revision fb4c877b5a2e89c57f7d1e3d731e386508596fbd)
+++ uspace/srv/bd/ata_bd/ata_bd.c	(revision f480d7e1f5cf4ba7a6678d2d63060e7f8756330d)
@@ -118,4 +118,6 @@
 static int ata_pcmd_inquiry(int dev_idx, void *obuf, size_t obuf_size);
 static int ata_pcmd_read_12(int dev_idx, uint64_t ba, size_t cnt,
+    void *obuf, size_t obuf_size);
+static int ata_pcmd_read_toc(int dev_idx, uint8_t ses,
     void *obuf, size_t obuf_size);
 static void disk_print_summary(disk_t *d);
@@ -353,4 +355,12 @@
 			    UPPER32(disk[disk_id].blocks));
 			continue;
+		case BD_READ_TOC:
+			cnt = IPC_GET_ARG1(call);
+			if (disk[disk_id].dev_type == ata_pkt_dev)
+				retval = ata_pcmd_read_toc(disk_id, cnt, fs_va,
+				    disk[disk_id].block_size);
+			else
+				retval = EINVAL;
+			break;
 		default:
 			retval = EINVAL;
@@ -810,4 +820,43 @@
 }
 
+/** Issue ATAPI read TOC command.
+ *
+ * Read TOC in 'multi-session' format (first and last session number
+ * with last session LBA).
+ *
+ * http://suif.stanford.edu/~csapuntz/specs/INF-8020.PDF page 171
+ *
+ * Output buffer must be large enough to hold the data, otherwise the
+ * function will fail.
+ *
+ * @param dev_idx	Device index (0 or 1)
+ * @param session	Starting session
+ * @param obuf		Buffer for storing inquiry data read from device
+ * @param obuf_size	Size of obuf in bytes
+ *
+ * @return EOK on success, EIO on error.
+ */
+static int ata_pcmd_read_toc(int dev_idx, uint8_t session, void *obuf,
+    size_t obuf_size)
+{
+	ata_pcmd_read_toc_t cp;
+	int rc;
+
+	memset(&cp, 0, sizeof(cp));
+
+	cp.opcode = PCMD_READ_TOC;
+	cp.msf = 0;
+	cp.format = 0x01; /* 0x01 = multi-session mode */
+	cp.start = session;
+	cp.size = host2uint16_t_be(obuf_size);
+	cp.oldformat = 0x40; /* 0x01 = multi-session mode (shifted to MSB) */
+	
+	rc = ata_cmd_packet(0, &cp, sizeof(cp), obuf, obuf_size);
+	if (rc != EOK)
+		return rc;
+	
+	return EOK;
+}
+
 /** Read a physical from the device.
  *
Index: uspace/srv/bd/ata_bd/ata_hw.h
===================================================================
--- uspace/srv/bd/ata_bd/ata_hw.h	(revision fb4c877b5a2e89c57f7d1e3d731e386508596fbd)
+++ uspace/srv/bd/ata_bd/ata_hw.h	(revision f480d7e1f5cf4ba7a6678d2d63060e7f8756330d)
@@ -244,5 +244,6 @@
 enum ata_pkt_command {
 	PCMD_INQUIRY		= 0x12,
-	PCMD_READ_12		= 0xa8
+	PCMD_READ_12		= 0xa8,
+	PCMD_READ_TOC		= 0x43
 };
 
@@ -269,4 +270,19 @@
 	uint8_t _res2;
 } __attribute__ ((packed)) ata_pcmd_read_12_t;
+
+/** ATAPI Read TOC command */
+typedef struct {
+	uint8_t opcode;		/**< Operation code (PCMD_READ_TOC) */
+	uint8_t msf;            /**< 0x2 = MSF bit set */
+	uint8_t format;         /**< low 3 bits */
+	uint8_t _res0;
+	uint8_t _res1;
+	uint8_t _res2;
+	uint8_t start;          /**< starting track/session number */
+	uint16_t size;		/**< Allocation length */
+	uint8_t oldformat;         /**< high 2 bits */
+	uint8_t _res3;
+	uint8_t _res4;
+} __attribute__ ((packed)) ata_pcmd_read_toc_t;
 
 /** Data returned from Inquiry command (mandatory part) */
