Changeset 33114 in vbox
- Timestamp:
- Oct 13, 2010 5:49:00 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/Ide.c
r33049 r33114 304 304 UINT8 PciClass; 305 305 UINT8 PciSubClass; 306 BOOLEAN fIDEAhciEmulation = FALSE; 306 307 307 308 Status = PciIo->Pci.Read ( … … 337 338 return Status; 338 339 } 340 switch (PciSubClass) 341 { 342 case PCI_CLASS_MASS_STORAGE_IDE: 343 fIDEAhciEmulation = FALSE; 344 break; 345 case 0x6: 346 fIDEAhciEmulation = TRUE; 347 break; 348 default: 349 ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 350 return EFI_UNSUPPORTED; 351 } 339 352 DEBUG((DEBUG_INFO, "class primary code: %x\n", PciData.Hdr.ClassCode[0] & IDE_PRIMARY_OPERATING_MODE)); 340 353 DEBUG((DEBUG_INFO, "class secondary code: %x\n", PciData.Hdr.ClassCode[0] & IDE_SECONDARY_OPERATING_MODE)); 341 354 if ((PciData.Hdr.ClassCode[0] & IDE_PRIMARY_OPERATING_MODE) == 0) { 342 switch (PciSubClass) 343 { 344 case PCI_CLASS_MASS_STORAGE_IDE: 345 IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = 0x1f0; 346 IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = 0x3f6; 347 IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr = 348 (UINT16)((PciData.Device.Bar[4] & 0x0000fff0)); 349 break; 350 case 0x6: 351 IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = 0x1e8; 352 IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = 0x3e6; 353 IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr = 0; 354 break; 355 default: 356 ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 357 } 355 IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = fIDEAhciEmulation ? 0x1e8 : 0x1f0; 356 IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = fIDEAhciEmulation ? 0x3e6 :0x3f6; 358 357 } else { 359 358 // … … 362 361 if ((PciData.Device.Bar[0] & BIT0) == 0 || 363 362 (PciData.Device.Bar[1] & BIT0) == 0) { 364 DEBUG((DEBUG_INFO, "%a:%d\n", __FILE__, __LINE__));365 363 return EFI_UNSUPPORTED; 366 364 } 367 365 368 switch (PciSubClass) 369 { 370 case PCI_CLASS_MASS_STORAGE_IDE: 371 IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = 372 (UINT16) (PciData.Device.Bar[0] & 0x0000fff8); 373 IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = 374 (UINT16) ((PciData.Device.Bar[1] & 0x0000fffc) + 2); 375 IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr = 376 (UINT16) ((PciData.Device.Bar[4] & 0x0000fff0)); 377 break; 378 case 0x6: 379 IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = 0x168; 380 IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = 0x366; 381 IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr = 0; 382 break; 383 default: 384 ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 385 } 386 } 366 IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr = 367 fIDEAhciEmulation ? 0x1e8 : (UINT16) (PciData.Device.Bar[0] & 0x0000fff8); 368 IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr = 369 fIDEAhciEmulation ? 0x3e6 :(UINT16) ((PciData.Device.Bar[1] & 0x0000fffc) + 2); 370 } 371 IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr = 372 fIDEAhciEmulation ? 0 : (UINT16)((PciData.Device.Bar[4] & 0x0000fff0)); 387 373 388 374 if ((PciData.Hdr.ClassCode[0] & IDE_SECONDARY_OPERATING_MODE) == 0) { 389 switch (PciSubClass) 390 { 391 case PCI_CLASS_MASS_STORAGE_IDE: 392 IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr = 0x170; 393 IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr = 0x376; 394 IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr = 395 (UINT16) ((PciData.Device.Bar[4] & 0x0000fff0)); 396 break; 397 case 0x6: 398 IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr = 0x1e8; 399 IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr = 0x3e6; 400 IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr = 0; 401 break; 402 default: 403 ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 404 } 375 IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr = fIDEAhciEmulation ? 0x168 : 0x170; 376 IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr = fIDEAhciEmulation ? 0x366 : 0x376; 405 377 } else { 406 378 // … … 409 381 if ((PciData.Device.Bar[2] & BIT0) == 0 || 410 382 (PciData.Device.Bar[3] & BIT0) == 0) { 411 DEBUG((DEBUG_INFO, "%a:%d\n", __FILE__, __LINE__));412 383 return EFI_UNSUPPORTED; 413 384 } 414 415 switch (PciSubClass) 416 { 417 case PCI_CLASS_MASS_STORAGE_IDE: 418 IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr = 419 (UINT16) (PciData.Device.Bar[2] & 0x0000fff8); 420 IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr = 421 (UINT16) ((PciData.Device.Bar[3] & 0x0000fffc) + 2); 422 IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr = 423 (UINT16) ((PciData.Device.Bar[4] & 0x0000fff0)); 424 break; 425 case 0x6: 426 IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr = 0x168; 427 IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr = 0x366; 428 IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr = 0; 429 break; 430 default: 431 ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 432 } 433 } 385 IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr = 386 fIDEAhciEmulation ? 0x168 : (UINT16) (PciData.Device.Bar[2] & 0x0000fff8); 387 IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr = 388 fIDEAhciEmulation ? 0x366 : (UINT16) ((PciData.Device.Bar[3] & 0x0000fffc) + 2); 389 } 390 IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr = 391 (UINT16) ((PciData.Device.Bar[fIDEAhciEmulation ? 5 : 4] & 0x0000fff0)); 434 392 435 393 DEBUG((DEBUG_INFO, "%a:%d CommandBlockBaseAddr:%x, "
Note:
See TracChangeset
for help on using the changeset viewer.