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 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);
... ...
... ... @@ -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  
... ...
... ... @@ -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,
... ...