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,6 +43,8 @@ do { printf("ESP: " fmt , ##args); } while (0) | ||
| 43 | 43 | ||
| 44 | #define ESP_MAXREG 0x3f | 44 | #define ESP_MAXREG 0x3f |
| 45 | #define TI_BUFSZ 32 | 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 | typedef struct ESPState ESPState; | 49 | typedef struct ESPState ESPState; |
| 48 | 50 | ||
| @@ -526,11 +528,33 @@ static int esp_load(QEMUFile *f, void *opaque, int version_id) | @@ -526,11 +528,33 @@ static int esp_load(QEMUFile *f, void *opaque, int version_id) | ||
| 526 | return 0; | 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 | void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) | 554 | void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) |
| 530 | { | 555 | { |
| 531 | ESPState *s; | 556 | ESPState *s; |
| 532 | int esp_io_memory; | 557 | int esp_io_memory; |
| 533 | - int i; | ||
| 534 | 558 | ||
| 535 | s = qemu_mallocz(sizeof(ESPState)); | 559 | s = qemu_mallocz(sizeof(ESPState)); |
| 536 | if (!s) | 560 | if (!s) |
| @@ -546,13 +570,6 @@ void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) | @@ -546,13 +570,6 @@ void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque) | ||
| 546 | 570 | ||
| 547 | register_savevm("esp", espaddr, 2, esp_save, esp_load, s); | 571 | register_savevm("esp", espaddr, 2, esp_save, esp_load, s); |
| 548 | qemu_register_reset(esp_reset, s); | 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 | return s; | 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,6 +262,12 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, | ||
| 262 | slavio_serial_init(PHYS_JJ_SER, PHYS_JJ_SER_IRQ, serial_hds[1], serial_hds[0]); | 262 | slavio_serial_init(PHYS_JJ_SER, PHYS_JJ_SER_IRQ, serial_hds[1], serial_hds[0]); |
| 263 | fdctrl_init(PHYS_JJ_FLOPPY_IRQ, 0, 1, PHYS_JJ_FDC, fd_table); | 263 | fdctrl_init(PHYS_JJ_FLOPPY_IRQ, 0, 1, PHYS_JJ_FDC, fd_table); |
| 264 | main_esp = esp_init(bs_table, PHYS_JJ_ESP, dma); | 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 | slavio_misc = slavio_misc_init(PHYS_JJ_SLAVIO, PHYS_JJ_ME_IRQ); | 271 | slavio_misc = slavio_misc_init(PHYS_JJ_SLAVIO, PHYS_JJ_ME_IRQ); |
| 266 | cs_init(PHYS_JJ_CS, PHYS_JJ_CS_IRQ, slavio_intctl); | 272 | cs_init(PHYS_JJ_CS, PHYS_JJ_CS_IRQ, slavio_intctl); |
| 267 | sparc32_dma_set_reset_data(dma, main_esp, main_lance); | 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,8 +3925,12 @@ static int disk_options_init(int num_ide_disks, | ||
| 3925 | 3925 | ||
| 3926 | for(i = 0; i < num_scsi_disks; i++) { | 3926 | for(i = 0; i < num_scsi_disks; i++) { |
| 3927 | 3927 | ||
| 3928 | +#if !defined(TARGET_SPARC) || defined(TARGET_SPARC64) | ||
| 3928 | temp_adapter = SCSI_LSI_53C895A; | 3929 | temp_adapter = SCSI_LSI_53C895A; |
| 3929 | scsi_hba_lsi++; | 3930 | scsi_hba_lsi++; |
| 3931 | +#else | ||
| 3932 | + temp_adapter = SCSI_ESP; | ||
| 3933 | +#endif | ||
| 3930 | 3934 | ||
| 3931 | /*Check for sdx= parameter */ | 3935 | /*Check for sdx= parameter */ |
| 3932 | if (get_param_value(buf, sizeof(buf), "sdx", scsi_disk_options[i])) { | 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,6 +4003,9 @@ static int disk_options_init(int num_ide_disks, | ||
| 3999 | fprintf(stderr, "qemu: SCSI disk image not specified for sd%c \n", i + 'a'); | 4003 | fprintf(stderr, "qemu: SCSI disk image not specified for sd%c \n", i + 'a'); |
| 4000 | return -1; | 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 | return 0; | 4011 | return 0; |
| @@ -6887,6 +6894,8 @@ int main(int argc, char **argv) | @@ -6887,6 +6894,8 @@ int main(int argc, char **argv) | ||
| 6887 | kernel_cmdline = optarg; | 6894 | kernel_cmdline = optarg; |
| 6888 | break; | 6895 | break; |
| 6889 | case QEMU_OPTION_cdrom: | 6896 | case QEMU_OPTION_cdrom: |
| 6897 | +#if !defined(TARGET_SPARC) || defined(TARGET_SPARC64) | ||
| 6898 | + /* Assume boot cdrom is IDE */ | ||
| 6890 | { | 6899 | { |
| 6891 | char buf[22]; | 6900 | char buf[22]; |
| 6892 | if (num_ide_disks >= MAX_DISKS) { | 6901 | if (num_ide_disks >= MAX_DISKS) { |
| @@ -6904,6 +6913,27 @@ int main(int argc, char **argv) | @@ -6904,6 +6913,27 @@ int main(int argc, char **argv) | ||
| 6904 | optarg); | 6913 | optarg); |
| 6905 | num_ide_disks++; | 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 | break; | 6937 | break; |
| 6908 | case QEMU_OPTION_boot: | 6938 | case QEMU_OPTION_boot: |
| 6909 | boot_device = optarg[0]; | 6939 | boot_device = optarg[0]; |
| @@ -7193,6 +7223,7 @@ int main(int argc, char **argv) | @@ -7193,6 +7223,7 @@ int main(int argc, char **argv) | ||
| 7193 | 7223 | ||
| 7194 | if (!linux_boot && | 7224 | if (!linux_boot && |
| 7195 | num_ide_disks == 0 && | 7225 | num_ide_disks == 0 && |
| 7226 | + num_scsi_disks == 0 && | ||
| 7196 | fd_filename[0] == '\0') | 7227 | fd_filename[0] == '\0') |
| 7197 | help(); | 7228 | help(); |
| 7198 | 7229 |
vl.h
| @@ -1093,6 +1093,7 @@ void *slavio_misc_init(uint32_t base, int irq); | @@ -1093,6 +1093,7 @@ void *slavio_misc_init(uint32_t base, int irq); | ||
| 1093 | void slavio_set_power_fail(void *opaque, int power_failing); | 1093 | void slavio_set_power_fail(void *opaque, int power_failing); |
| 1094 | 1094 | ||
| 1095 | /* esp.c */ | 1095 | /* esp.c */ |
| 1096 | +void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); | ||
| 1096 | void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque); | 1097 | void *esp_init(BlockDriverState **bd, uint32_t espaddr, void *dma_opaque); |
| 1097 | void esp_reset(void *opaque); | 1098 | void esp_reset(void *opaque); |
| 1098 | 1099 | ||
| @@ -1223,7 +1224,8 @@ void scsi_cancel_io(SCSIDevice *s, uint32_t tag); | @@ -1223,7 +1224,8 @@ void scsi_cancel_io(SCSIDevice *s, uint32_t tag); | ||
| 1223 | uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag); | 1224 | uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag); |
| 1224 | 1225 | ||
| 1225 | enum scsi_host_adapters { | 1226 | enum scsi_host_adapters { |
| 1226 | - SCSI_LSI_53C895A | 1227 | + SCSI_LSI_53C895A, |
| 1228 | + SCSI_ESP | ||
| 1227 | }; | 1229 | }; |
| 1228 | enum scsi_devices { | 1230 | enum scsi_devices { |
| 1229 | SCSI_CDROM, | 1231 | SCSI_CDROM, |