Commit fa1fb14cd2f4f24e158b1bb284bd193e79899575
1 parent
1f958449
Fix SCSI cdrom boot, thanks Blue Swirl.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2278 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
65 additions
and
9 deletions
hw/esp.c
... | ... | @@ -43,6 +43,8 @@ do { printf("ESP: " fmt , ##args); } while (0) |
43 | 43 | |
44 | 44 | #define ESP_MAXREG 0x3f |
45 | 45 | #define TI_BUFSZ 32 |
46 | +/* The HBA is ID 7, so for simplicitly limit to 7 devices. */ | |
47 | +#define ESP_MAX_DEVS 7 | |
46 | 48 | |
47 | 49 | typedef struct ESPState ESPState; |
48 | 50 | |
... | ... | @@ -526,11 +528,33 @@ static int esp_load(QEMUFile *f, void *opaque, int version_id) |
526 | 528 | return 0; |
527 | 529 | } |
528 | 530 | |
531 | +void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | |
532 | +{ | |
533 | + ESPState *s = (ESPState *)opaque; | |
534 | + | |
535 | + if (id < 0) { | |
536 | + for (id = 0; id < ESP_MAX_DEVS; id++) { | |
537 | + if (s->scsi_dev[id] == NULL) | |
538 | + break; | |
539 | + } | |
540 | + } | |
541 | + if (id >= ESP_MAX_DEVS) { | |
542 | + DPRINTF("Bad Device ID %d\n", id); | |
543 | + return; | |
544 | + } | |
545 | + if (s->scsi_dev[id]) { | |
546 | + DPRINTF("Destroying device %d\n", id); | |
547 | + scsi_disk_destroy(s->scsi_dev[id]); | |
548 | + } | |
549 | + DPRINTF("Attaching block device %d\n", id); | |
550 | + /* Command queueing is not implemented. */ | |
551 | + s->scsi_dev[id] = scsi_disk_init(bd, 0, esp_command_complete, s); | |
552 | +} | |
553 | + | |
529 | 554 | void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) |
530 | 555 | { |
531 | 556 | ESPState *s; |
532 | 557 | int esp_io_memory; |
533 | - int i; | |
534 | 558 | |
535 | 559 | s = qemu_mallocz(sizeof(ESPState)); |
536 | 560 | if (!s) |
... | ... | @@ -546,13 +570,6 @@ void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) |
546 | 570 | |
547 | 571 | register_savevm("esp", espaddr, 2, esp_save, esp_load, s); |
548 | 572 | qemu_register_reset(esp_reset, s); |
549 | - for (i = 0; i < MAX_DISKS; i++) { | |
550 | - if (bs_table[i]) { | |
551 | - /* Command queueing is not implemented. */ | |
552 | - s->scsi_dev[i] = | |
553 | - scsi_disk_init(bs_table[i], 0, esp_command_complete, s); | |
554 | - } | |
555 | - } | |
556 | 573 | |
557 | 574 | return s; |
558 | 575 | } | ... | ... |
hw/sun4m.c
... | ... | @@ -262,6 +262,12 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, |
262 | 262 | slavio_serial_init(PHYS_JJ_SER, PHYS_JJ_SER_IRQ, serial_hds[1], serial_hds[0]); |
263 | 263 | fdctrl_init(PHYS_JJ_FLOPPY_IRQ, 0, 1, PHYS_JJ_FDC, fd_table); |
264 | 264 | main_esp = esp_init(bs_table, PHYS_JJ_ESP, dma); |
265 | + for (i = 0; i < MAX_SCSI_DISKS; i++) { | |
266 | + if (scsi_disks_info[i].adapter == SCSI_ESP && | |
267 | + scsi_disks_info[i].device_type != SCSI_NONE) { | |
268 | + esp_scsi_attach(main_esp, bs_scsi_table[i], scsi_disks_info[i].id); | |
269 | + } | |
270 | + } | |
265 | 271 | slavio_misc = slavio_misc_init(PHYS_JJ_SLAVIO, PHYS_JJ_ME_IRQ); |
266 | 272 | cs_init(PHYS_JJ_CS, PHYS_JJ_CS_IRQ, slavio_intctl); |
267 | 273 | sparc32_dma_set_reset_data(dma, main_esp, main_lance); | ... | ... |
vl.c
... | ... | @@ -3925,8 +3925,12 @@ static int disk_options_init(int num_ide_disks, |
3925 | 3925 | |
3926 | 3926 | for(i = 0; i < num_scsi_disks; i++) { |
3927 | 3927 | |
3928 | +#if !defined(TARGET_SPARC) || defined(TARGET_SPARC64) | |
3928 | 3929 | temp_adapter = SCSI_LSI_53C895A; |
3929 | 3930 | scsi_hba_lsi++; |
3931 | +#else | |
3932 | + temp_adapter = SCSI_ESP; | |
3933 | +#endif | |
3930 | 3934 | |
3931 | 3935 | /*Check for sdx= parameter */ |
3932 | 3936 | if (get_param_value(buf, sizeof(buf), "sdx", scsi_disk_options[i])) { |
... | ... | @@ -3999,6 +4003,9 @@ static int disk_options_init(int num_ide_disks, |
3999 | 4003 | fprintf(stderr, "qemu: SCSI disk image not specified for sd%c \n", i + 'a'); |
4000 | 4004 | return -1; |
4001 | 4005 | } |
4006 | + if (cdrom_device) { | |
4007 | + bdrv_set_type_hint(bs_scsi_table[scsi_index], BDRV_TYPE_CDROM); | |
4008 | + } | |
4002 | 4009 | } |
4003 | 4010 | |
4004 | 4011 | return 0; |
... | ... | @@ -6887,6 +6894,8 @@ int main(int argc, char **argv) |
6887 | 6894 | kernel_cmdline = optarg; |
6888 | 6895 | break; |
6889 | 6896 | case QEMU_OPTION_cdrom: |
6897 | +#if !defined(TARGET_SPARC) || defined(TARGET_SPARC64) | |
6898 | + /* Assume boot cdrom is IDE */ | |
6890 | 6899 | { |
6891 | 6900 | char buf[22]; |
6892 | 6901 | if (num_ide_disks >= MAX_DISKS) { |
... | ... | @@ -6904,6 +6913,27 @@ int main(int argc, char **argv) |
6904 | 6913 | optarg); |
6905 | 6914 | num_ide_disks++; |
6906 | 6915 | } |
6916 | +#else | |
6917 | + /* Assume boot cdrom is SCSI */ | |
6918 | + { | |
6919 | + char buf[27]; | |
6920 | + if (num_scsi_disks >= MAX_SCSI_DISKS) { | |
6921 | + fprintf(stderr, "qemu: too many SCSI disks/cdroms defined.\n"); | |
6922 | + exit(1); | |
6923 | + } | |
6924 | + snprintf(buf, sizeof(buf), "type=cdrom,sdx=%c,id=%d,img=", | |
6925 | + num_scsi_disks + 'a', num_scsi_disks + 2); | |
6926 | + /* Build new disk SCSI syntax string */ | |
6927 | + pstrcpy(scsi_options[num_scsi_disks], | |
6928 | + 27, | |
6929 | + buf); | |
6930 | + /* Add on image filename */ | |
6931 | + pstrcpy(&(scsi_options[num_scsi_disks][26]), | |
6932 | + sizeof(scsi_options[0])-26, | |
6933 | + optarg); | |
6934 | + num_scsi_disks++; | |
6935 | + } | |
6936 | +#endif | |
6907 | 6937 | break; |
6908 | 6938 | case QEMU_OPTION_boot: |
6909 | 6939 | boot_device = optarg[0]; |
... | ... | @@ -7193,6 +7223,7 @@ int main(int argc, char **argv) |
7193 | 7223 | |
7194 | 7224 | if (!linux_boot && |
7195 | 7225 | num_ide_disks == 0 && |
7226 | + num_scsi_disks == 0 && | |
7196 | 7227 | fd_filename[0] == '\0') |
7197 | 7228 | help(); |
7198 | 7229 | ... | ... |
vl.h
... | ... | @@ -1093,6 +1093,7 @@ void *slavio_misc_init(uint32_t base, int irq); |
1093 | 1093 | void slavio_set_power_fail(void *opaque, int power_failing); |
1094 | 1094 | |
1095 | 1095 | /* esp.c */ |
1096 | +void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); | |
1096 | 1097 | void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque); |
1097 | 1098 | void esp_reset(void *opaque); |
1098 | 1099 | |
... | ... | @@ -1223,7 +1224,8 @@ void scsi_cancel_io(SCSIDevice *s, uint32_t tag); |
1223 | 1224 | uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag); |
1224 | 1225 | |
1225 | 1226 | enum scsi_host_adapters { |
1226 | - SCSI_LSI_53C895A | |
1227 | + SCSI_LSI_53C895A, | |
1228 | + SCSI_ESP | |
1227 | 1229 | }; |
1228 | 1230 | enum scsi_devices { |
1229 | 1231 | SCSI_CDROM, | ... | ... |