Commit fa1fb14cd2f4f24e158b1bb284bd193e79899575

Authored by ths
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
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);
@@ -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
@@ -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,