dprintf(1, "%s\n", adrive_g->drive.desc);
// fill cdidmap
- if (iscd)
+ if (iscd) {
map_cd_drive(&adrive_g->drive);
+ add_baid_cdrom(&adrive_g->drive);
+ }
return adrive_g;
}
return GLOBALFLAT2GLOBAL(drive_gf);
}
+int getDriveId(u8 exttype, struct drive_s *drive_g)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(Drives.idmap[0]); i++)
+ if (getDrive(exttype, i) == drive_g)
+ return i;
+
+ return -1;
+}
/****************************************************************
* Disk geometry translation
ie->description = d;
}
+// Add a IPL entry for BAID cdrom.
+void
+add_baid_cdrom(struct drive_s *drive_g)
+{
+ if (! CONFIG_CDROM_BOOT)
+ return;
+
+ /* put first cdrom into ipl 3 for compatability with qemu */
+ struct ipl_entry_s *ie = &IPL.bev[2];
+ if (IPL.bevcount >= ARRAY_SIZE(IPL.bev) && ie->vector)
+ return;
+
+ if (ie->vector)
+ ie = &IPL.bev[IPL.bevcount++];
+ ie->type = IPL_TYPE_CDROM;
+ ie->vector = (u32)drive_g;
+ ie->description = "DVD/CD";
+}
+
// Add a bcv entry for an expansion card harddrive or legacy option rom
void
add_bcv(u16 seg, u16 ip, u16 desc)
static int
menu_show_cdrom(struct ipl_entry_s *ie, int menupos)
{
- int i;
- for (i = 0; i < Drives.cdcount; i++) {
- struct drive_s *drive_g = getDrive(EXTTYPE_CD, i);
- printf("%d. DVD/CD [%s]\n", menupos + i, drive_g->desc);
- }
- return Drives.cdcount;
+ struct drive_s *drive_g = (void*)ie->vector;
+ if (!ie->vector)
+ return 0;
+ printf("%d. DVD/CD [%s]\n", menupos, drive_g->desc);
+ return 1;
}
// Show coreboot-fs menu item.
{
if (! CONFIG_CDROM_BOOT)
return;
- int status = cdrom_boot(ie->subchoice);
+
+ if (!ie->vector)
+ return;
+
+ struct drive_s *drive_g = (void*)ie->vector;
+ int status = cdrom_boot(drive_g);
if (status) {
- printf("Boot failed: Could not read from CDROM (code %04x)\n", status);
+ printf("Boot failed: Could not read from CDROM %s (code %04x)\n", drive_g->desc, status);
return;
}
void add_bcv(u16 seg, u16 ip, u16 desc);
struct drive_s;
void add_bcv_internal(struct drive_s *drive_g);
+void add_baid_cdrom(struct drive_s *drive_g);
+
void boot_prep(void);
#endif // __BOOT_H
}
int
-cdrom_boot(int cdid)
+cdrom_boot(struct drive_s *drive_g)
{
struct disk_op_s dop;
+ int cdid = getDriveId(EXTTYPE_CD, drive_g);
memset(&dop, 0, sizeof(dop));
- dop.drive_g = getDrive(EXTTYPE_CD, cdid);
- if (!dop.drive_g)
+ dop.drive_g = drive_g;
+ if (!dop.drive_g || cdid < 0)
return 1;
int ret = atapi_is_ready(&dop);
// block.c
extern struct drives_s Drives;
struct drive_s *getDrive(u8 exttype, u8 extdriveoffset);
+int getDriveId(u8 exttype, struct drive_s *drive_g);
void setup_translation(struct drive_s *drive_g);
void map_floppy_drive(struct drive_s *drive_g);
void map_hd_drive(struct drive_s *drive_g);
int process_cdemu_op(struct disk_op_s *op);
void cdemu_setup(void);
void cdemu_134b(struct bregs *regs);
-int cdrom_boot(int cdid);
+int cdrom_boot(struct drive_s *drive_g);
// ramdisk.c
void ramdisk_setup(void);