1 /** @file 2 * 3 * Copyright (c) 2011-2015, ARM Limited. All rights reserved. 4 * 5 * This program and the accompanying materials 6 * are licensed and made available under the terms and conditions of the BSD License 7 * which accompanies this distribution. The full text of the license may be found at 8 * http://opensource.org/licenses/bsd-license.php 9 * 10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 * 13 **/ 14 15 #include <Library/BaseMemoryLib.h> 16 #include <Library/TimerLib.h> 17 18 #include "Mmc.h" 19 20 typedef union { 21 UINT32 Raw; 22 OCR Ocr; 23 } OCR_RESPONSE; 24 25 #define MAX_RETRY_COUNT 1000 26 #define CMD_RETRY_COUNT 20 27 #define RCA_SHIFT_OFFSET 16 28 #define EMMC_CARD_SIZE 512 29 #define EMMC_ECSD_SIZE_OFFSET 53 30 31 #define EXTCSD_BUS_WIDTH 183 32 #define EXTCSD_HS_TIMING 185 33 34 #define EMMC_TIMING_BACKWARD 0 35 #define EMMC_TIMING_HS 1 36 #define EMMC_TIMING_HS200 2 37 #define EMMC_TIMING_HS400 3 38 39 #define EMMC_BUS_WIDTH_1BIT 0 40 #define EMMC_BUS_WIDTH_4BIT 1 41 #define EMMC_BUS_WIDTH_8BIT 2 42 #define EMMC_BUS_WIDTH_DDR_4BIT 5 43 #define EMMC_BUS_WIDTH_DDR_8BIT 6 44 45 #define EMMC_SWITCH_ERROR (1 << 7) 46 47 #define SD_BUS_WIDTH_1BIT (1 << 0) 48 #define SD_BUS_WIDTH_4BIT (1 << 2) 49 50 #define SD_CCC_SWITCH (1 << 10) 51 52 #define DEVICE_STATE(x) (((x) >> 9) & 0xf) 53 typedef enum _EMMC_DEVICE_STATE { 54 EMMC_IDLE_STATE = 0, 55 EMMC_READY_STATE, 56 EMMC_IDENT_STATE, 57 EMMC_STBY_STATE, 58 EMMC_TRAN_STATE, 59 EMMC_DATA_STATE, 60 EMMC_RCV_STATE, 61 EMMC_PRG_STATE, 62 EMMC_DIS_STATE, 63 EMMC_BTST_STATE, 64 EMMC_SLP_STATE 65 } EMMC_DEVICE_STATE; 66 67 UINT32 mEmmcRcaCount = 0; 68 69 STATIC 70 EFI_STATUS 71 EFIAPI 72 EmmcGetDeviceState ( 73 IN MMC_HOST_INSTANCE *MmcHostInstance, 74 OUT EMMC_DEVICE_STATE *State 75 ) 76 { 77 EFI_MMC_HOST_PROTOCOL *Host; 78 EFI_STATUS Status; 79 UINT32 Data, RCA; 80 81 if (State == NULL) { 82 return EFI_INVALID_PARAMETER; 83 } 84 85 Host = MmcHostInstance->MmcHost; 86 RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET; 87 Status = Host->SendCommand (Host, MMC_CMD13, RCA); 88 if (EFI_ERROR (Status)) { 89 DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to get card status, Status=%r.\n", Status)); 90 return Status; 91 } 92 Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R1, &Data); 93 if (EFI_ERROR (Status)) { 94 DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to get response of CMD13, Status=%r.\n", Status)); 95 return Status; 96 } 97 if (Data & EMMC_SWITCH_ERROR) { 98 DEBUG ((EFI_D_ERROR, "EmmcGetDeviceState(): Failed to switch expected mode, Status=%r.\n", Status)); 99 return EFI_DEVICE_ERROR; 100 } 101 *State = DEVICE_STATE(Data); 102 return EFI_SUCCESS; 103 } 104 105 STATIC 106 EFI_STATUS 107 EFIAPI 108 EmmcSetEXTCSD ( 109 IN MMC_HOST_INSTANCE *MmcHostInstance, 110 UINT32 ExtCmdIndex, 111 UINT32 Value 112 ) 113 { 114 EFI_MMC_HOST_PROTOCOL *Host; 115 EMMC_DEVICE_STATE State; 116 EFI_STATUS Status; 117 UINT32 Argument; 118 119 Host = MmcHostInstance->MmcHost; 120 Argument = EMMC_CMD6_ARG_ACCESS(3) | EMMC_CMD6_ARG_INDEX(ExtCmdIndex) | 121 EMMC_CMD6_ARG_VALUE(Value) | EMMC_CMD6_ARG_CMD_SET(1); 122 Status = Host->SendCommand (Host, MMC_CMD6, Argument); 123 if (EFI_ERROR (Status)) { 124 DEBUG ((EFI_D_ERROR, "EmmcSetEXTCSD(): Failed to send CMD6, Status=%r.\n", Status)); 125 return Status; 126 } 127 // Make sure device exiting prog mode 128 do { 129 Status = EmmcGetDeviceState (MmcHostInstance, &State); 130 if (EFI_ERROR (Status)) { 131 DEBUG ((EFI_D_ERROR, "EmmcSetEXTCSD(): Failed to get device state, Status=%r.\n", Status)); 132 return Status; 133 } 134 } while (State == EMMC_PRG_STATE); 135 return EFI_SUCCESS; 136 } 137 138 STATIC 139 EFI_STATUS 140 EFIAPI 141 EmmcIdentificationMode ( 142 IN MMC_HOST_INSTANCE *MmcHostInstance, 143 IN OCR_RESPONSE Response 144 ) 145 { 146 EFI_MMC_HOST_PROTOCOL *Host; 147 EFI_BLOCK_IO_MEDIA *Media; 148 EFI_STATUS Status; 149 EMMC_DEVICE_STATE State; 150 UINT32 RCA; 151 152 Host = MmcHostInstance->MmcHost; 153 Media = MmcHostInstance->BlockIo.Media; 154 155 // Fetch card identity register 156 Status = Host->SendCommand (Host, MMC_CMD2, 0); 157 if (EFI_ERROR (Status)) { 158 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Failed to send CMD2, Status=%r.\n", Status)); 159 return Status; 160 } 161 162 Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R2, (UINT32 *)&(MmcHostInstance->CardInfo.CIDData)); 163 if (EFI_ERROR (Status)) { 164 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): CID retrieval error, Status=%r.\n", Status)); 165 return Status; 166 } 167 168 // Assign a relative address value to the card 169 MmcHostInstance->CardInfo.RCA = ++mEmmcRcaCount; // TODO: might need a more sophisticated way of doing this 170 RCA = MmcHostInstance->CardInfo.RCA << RCA_SHIFT_OFFSET; 171 Status = Host->SendCommand (Host, MMC_CMD3, RCA); 172 if (EFI_ERROR (Status)) { 173 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): RCA set error, Status=%r.\n", Status)); 174 return Status; 175 } 176 177 // Fetch card specific data 178 Status = Host->SendCommand (Host, MMC_CMD9, RCA); 179 if (EFI_ERROR (Status)) { 180 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Failed to send CMD9, Status=%r.\n", Status)); 181 return Status; 182 } 183 184 Status = Host->ReceiveResponse (Host, MMC_RESPONSE_TYPE_R2, (UINT32 *)&(MmcHostInstance->CardInfo.CSDData)); 185 if (EFI_ERROR (Status)) { 186 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): CSD retrieval error, Status=%r.\n", Status)); 187 return Status; 188 } 189 190 // Select the card 191 Status = Host->SendCommand (Host, MMC_CMD7, RCA); 192 if (EFI_ERROR (Status)) { 193 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Card selection error, Status=%r.\n", Status)); 194 } 195 196 if (MMC_HOST_HAS_SETIOS(Host)) { 197 // Set 1-bit bus width 198 Status = Host->SetIos (Host, 0, 1, EMMCBACKWARD); 199 if (EFI_ERROR (Status)) { 200 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Set 1-bit bus width error, Status=%r.\n", Status)); 201 return Status; 202 } 203 204 // Set 1-bit bus width for EXTCSD 205 Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_BUS_WIDTH, EMMC_BUS_WIDTH_1BIT); 206 if (EFI_ERROR (Status)) { 207 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Set extcsd bus width error, Status=%r.\n", Status)); 208 return Status; 209 } 210 } 211 212 // Fetch ECSD 213 Status = Host->SendCommand (Host, MMC_CMD8, RCA); 214 if (EFI_ERROR (Status)) { 215 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): ECSD fetch error, Status=%r.\n", Status)); 216 } 217 218 Status = Host->ReadBlockData (Host, 0, 512, (UINT32 *)&(MmcHostInstance->CardInfo.ECSDData)); 219 if (EFI_ERROR (Status)) { 220 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): ECSD read error, Status=%r.\n", Status)); 221 return Status; 222 } 223 224 // Make sure device exiting data mode 225 do { 226 Status = EmmcGetDeviceState (MmcHostInstance, &State); 227 if (EFI_ERROR (Status)) { 228 DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Failed to get device state, Status=%r.\n", Status)); 229 return Status; 230 } 231 } while (State == EMMC_DATA_STATE); 232 233 // Set up media 234 Media->BlockSize = EMMC_CARD_SIZE; // 512-byte support is mandatory for eMMC cards 235 Media->MediaId = MmcHostInstance->CardInfo.CIDData.PSN; 236 Media->ReadOnly = MmcHostInstance->CardInfo.CSDData.PERM_WRITE_PROTECT; 237 Media->LogicalBlocksPerPhysicalBlock = 1; 238 Media->IoAlign = 4; 239 // Compute last block using bits [215:212] of the ECSD 240 Media->LastBlock = MmcHostInstance->CardInfo.ECSDData.SECTOR_COUNT - 1; // eMMC isn't supposed to report this for 241 // Cards <2GB in size, but the model does. 242 243 // Setup card type 244 MmcHostInstance->CardInfo.CardType = EMMC_CARD; 245 return EFI_SUCCESS; 246 } 247 248 STATIC 249 EFI_STATUS 250 InitializeEmmcDevice ( 251 IN MMC_HOST_INSTANCE *MmcHostInstance 252 ) 253 { 254 EFI_MMC_HOST_PROTOCOL *Host; 255 EFI_STATUS Status = EFI_SUCCESS; 256 ECSD *ECSDData; 257 UINT32 BusClockFreq, Idx; 258 UINT32 TimingMode[4] = {EMMCHS52DDR1V2, EMMCHS52DDR1V8, EMMCHS52, EMMCHS26}; 259 260 Host = MmcHostInstance->MmcHost; 261 ECSDData = &MmcHostInstance->CardInfo.ECSDData; 262 if (ECSDData->DEVICE_TYPE == EMMCBACKWARD) 263 return EFI_SUCCESS; 264 265 if (!MMC_HOST_HAS_SETIOS(Host)) { 266 return EFI_SUCCESS; 267 } 268 Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_HS_TIMING, EMMC_TIMING_HS); 269 if (EFI_ERROR (Status)) { 270 DEBUG ((DEBUG_ERROR, "InitializeEmmcDevice(): Failed to switch high speed mode, Status:%r.\n", Status)); 271 return Status; 272 } 273 274 for (Idx = 0; Idx < 4; Idx++) { 275 switch (TimingMode[Idx]) { 276 case EMMCHS52DDR1V2: 277 case EMMCHS52DDR1V8: 278 case EMMCHS52: 279 BusClockFreq = 52000000; 280 break; 281 case EMMCHS26: 282 BusClockFreq = 26000000; 283 break; 284 default: 285 return EFI_UNSUPPORTED; 286 } 287 Status = Host->SetIos (Host, BusClockFreq, 8, TimingMode[Idx]); 288 if (!EFI_ERROR (Status)) { 289 Status = EmmcSetEXTCSD (MmcHostInstance, EXTCSD_BUS_WIDTH, EMMC_BUS_WIDTH_DDR_8BIT); 290 if (EFI_ERROR (Status)) { 291 DEBUG ((DEBUG_ERROR, "InitializeEmmcDevice(): Failed to set EXTCSD bus width, Status:%r\n", Status)); 292 } 293 return Status; 294 } 295 } 296 return Status; 297 } 298 299 STATIC 300 EFI_STATUS 301 InitializeSdMmcDevice ( 302 IN MMC_HOST_INSTANCE *MmcHostInstance 303 ) 304 { 305 UINT32 CmdArg; 306 UINT32 Response[4]; 307 UINT32 Buffer[128]; 308 UINTN BlockSize; 309 UINTN CardSize; 310 UINTN NumBlocks; 311 BOOLEAN CccSwitch; 312 SCR Scr; 313 EFI_STATUS Status; 314 EFI_MMC_HOST_PROTOCOL *MmcHost; 315 316 MmcHost = MmcHostInstance->MmcHost; 317 318 // Send a command to get Card specific data 319 CmdArg = MmcHostInstance->CardInfo.RCA << 16; 320 Status = MmcHost->SendCommand (MmcHost, MMC_CMD9, CmdArg); 321 if (EFI_ERROR (Status)) { 322 DEBUG((EFI_D_ERROR, "InitializeSdMmcDevice(MMC_CMD9): Error, Status=%r\n", Status)); 323 return Status; 324 } 325 326 // Read Response 327 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_CSD, Response); 328 if (EFI_ERROR (Status)) { 329 DEBUG((EFI_D_ERROR, "InitializeSdMmcDevice(): Failed to receive CSD, Status=%r\n", Status)); 330 return Status; 331 } 332 PrintCSD (Response); 333 if (MMC_CSD_GET_CCC(Response) & SD_CCC_SWITCH) { 334 CccSwitch = TRUE; 335 } else { 336 CccSwitch = FALSE; 337 } 338 339 if (MmcHostInstance->CardInfo.CardType == SD_CARD_2_HIGH) { 340 CardSize = HC_MMC_CSD_GET_DEVICESIZE (Response); 341 NumBlocks = ((CardSize + 1) * 1024); 342 BlockSize = 1 << MMC_CSD_GET_READBLLEN (Response); 343 } else { 344 CardSize = MMC_CSD_GET_DEVICESIZE (Response); 345 NumBlocks = (CardSize + 1) * (1 << (MMC_CSD_GET_DEVICESIZEMULT (Response) + 2)); 346 BlockSize = 1 << MMC_CSD_GET_READBLLEN (Response); 347 } 348 349 // For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes. 350 if (BlockSize > 512) { 351 NumBlocks = MultU64x32 (NumBlocks, BlockSize / 512); 352 BlockSize = 512; 353 } 354 355 MmcHostInstance->BlockIo.Media->LastBlock = (NumBlocks - 1); 356 MmcHostInstance->BlockIo.Media->BlockSize = BlockSize; 357 MmcHostInstance->BlockIo.Media->ReadOnly = MmcHost->IsReadOnly (MmcHost); 358 MmcHostInstance->BlockIo.Media->MediaPresent = TRUE; 359 MmcHostInstance->BlockIo.Media->MediaId++; 360 361 CmdArg = MmcHostInstance->CardInfo.RCA << 16; 362 Status = MmcHost->SendCommand (MmcHost, MMC_CMD7, CmdArg); 363 if (EFI_ERROR (Status)) { 364 DEBUG((EFI_D_ERROR, "InitializeSdMmcDevice(MMC_CMD7): Error and Status = %r\n", Status)); 365 return Status; 366 } 367 368 Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg); 369 if (EFI_ERROR (Status)) { 370 DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status)); 371 return Status; 372 } 373 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1, Response); 374 if (EFI_ERROR (Status)) { 375 DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status)); 376 return Status; 377 } 378 if ((Response[0] & MMC_STATUS_APP_CMD) == 0) { 379 return EFI_SUCCESS; 380 } 381 382 /* SCR */ 383 Status = MmcHost->SendCommand (MmcHost, MMC_ACMD51, 0); 384 if (EFI_ERROR (Status)) { 385 DEBUG ((EFI_D_ERROR, "%a(MMC_ACMD51): Error and Status = %r\n", __func__, Status)); 386 return Status; 387 } else { 388 Status = MmcHost->ReadBlockData (MmcHost, 0, 8, Buffer); 389 if (EFI_ERROR (Status)) { 390 DEBUG ((EFI_D_ERROR, "%a(MMC_ACMD51): ReadBlockData Error and Status = %r\n", __func__, Status)); 391 return Status; 392 } 393 CopyMem (&Scr, Buffer, 8); 394 if (Scr.SD_SPEC == 2) { 395 if (Scr.SD_SPEC3 == 1) { 396 if (Scr.SD_SPEC4 == 1) { 397 DEBUG ((EFI_D_INFO, "Found SD Card for Spec Version 4.xx\n")); 398 } else { 399 DEBUG ((EFI_D_INFO, "Found SD Card for Spec Version 3.0x\n")); 400 } 401 } else { 402 if (Scr.SD_SPEC4 == 0) { 403 DEBUG ((EFI_D_INFO, "Found SD Card for Spec Version 2.0\n")); 404 } else { 405 DEBUG ((EFI_D_ERROR, "Found invalid SD Card\n")); 406 } 407 } 408 } else { 409 if ((Scr.SD_SPEC3 == 0) && (Scr.SD_SPEC4 == 0)) { 410 if (Scr.SD_SPEC == 1) { 411 DEBUG ((EFI_D_INFO, "Found SD Card for Spec Version 1.10\n")); 412 } else { 413 DEBUG ((EFI_D_INFO, "Found SD Card for Spec Version 1.0\n")); 414 } 415 } else { 416 DEBUG ((EFI_D_ERROR, "Found invalid SD Card\n")); 417 } 418 } 419 } 420 if (CccSwitch) { 421 /* SD Switch, Mode:1, Group:0, Value:1 */ 422 CmdArg = 1 << 31 | 0x00FFFFFF; 423 CmdArg &= ~(0xF << (0 * 4)); 424 CmdArg |= 1 << (0 * 4); 425 Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, CmdArg); 426 if (EFI_ERROR (Status)) { 427 DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = %r\n", Status)); 428 return Status; 429 } else { 430 Status = MmcHost->ReadBlockData (MmcHost, 0, 64, Buffer); 431 if (EFI_ERROR (Status)) { 432 DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): ReadBlockData Error and Status = %r\n", Status)); 433 return Status; 434 } 435 } 436 } 437 if (Scr.SD_BUS_WIDTHS & SD_BUS_WIDTH_4BIT) { 438 CmdArg = MmcHostInstance->CardInfo.RCA << 16; 439 Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, CmdArg); 440 if (EFI_ERROR (Status)) { 441 DEBUG ((EFI_D_ERROR, "%a(MMC_CMD55): Error and Status = %r\n", Status)); 442 return Status; 443 } 444 /* Width: 4 */ 445 Status = MmcHost->SendCommand (MmcHost, MMC_CMD6, 2); 446 if (EFI_ERROR (Status)) { 447 DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = %r\n", Status)); 448 return Status; 449 } 450 } 451 if (MMC_HOST_HAS_SETIOS(MmcHost)) { 452 Status = MmcHost->SetIos (MmcHost, 26 * 1000 * 1000, 4, EMMCBACKWARD); 453 if (EFI_ERROR (Status)) { 454 DEBUG ((EFI_D_ERROR, "%a(SetIos): Error and Status = %r\n", Status)); 455 return Status; 456 } 457 } 458 return EFI_SUCCESS; 459 } 460 461 STATIC 462 EFI_STATUS 463 EFIAPI 464 MmcIdentificationMode ( 465 IN MMC_HOST_INSTANCE *MmcHostInstance 466 ) 467 { 468 EFI_STATUS Status; 469 UINT32 Response[4]; 470 UINTN Timeout; 471 UINTN CmdArg; 472 BOOLEAN IsHCS; 473 EFI_MMC_HOST_PROTOCOL *MmcHost; 474 OCR_RESPONSE OcrResponse; 475 476 MmcHost = MmcHostInstance->MmcHost; 477 CmdArg = 0; 478 IsHCS = FALSE; 479 480 if (MmcHost == NULL) { 481 return EFI_INVALID_PARAMETER; 482 } 483 484 // We can get into this function if we restart the identification mode 485 if (MmcHostInstance->State == MmcHwInitializationState) { 486 // Initialize the MMC Host HW 487 Status = MmcNotifyState (MmcHostInstance, MmcHwInitializationState); 488 if (EFI_ERROR (Status)) { 489 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcHwInitializationState, Status=%r.\n", Status)); 490 return Status; 491 } 492 } 493 494 Status = MmcHost->SendCommand (MmcHost, MMC_CMD0, 0); 495 if (EFI_ERROR (Status)) { 496 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD0): Error, Status=%r.\n", Status)); 497 return Status; 498 } 499 Status = MmcNotifyState (MmcHostInstance, MmcIdleState); 500 if (EFI_ERROR (Status)) { 501 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcIdleState, Status=%r.\n", Status)); 502 return Status; 503 } 504 505 // Send CMD1 to get OCR (MMC) 506 // This command only valid for MMC and eMMC 507 Timeout = MAX_RETRY_COUNT; 508 do { 509 Status = MmcHost->SendCommand (MmcHost, MMC_CMD1, EMMC_CMD1_CAPACITY_GREATER_THAN_2GB); 510 if (EFI_ERROR (Status)) 511 break; 512 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, (UINT32 *)&OcrResponse); 513 if (EFI_ERROR (Status)) { 514 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status)); 515 return Status; 516 } 517 Timeout--; 518 } while (!OcrResponse.Ocr.PowerUp && (Timeout > 0)); 519 if (Status == EFI_SUCCESS) { 520 if (!OcrResponse.Ocr.PowerUp) { 521 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD1): Card initialisation failure, Status=%r.\n", Status)); 522 return EFI_DEVICE_ERROR; 523 } 524 OcrResponse.Ocr.PowerUp = 0; 525 if (OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB) { 526 MmcHostInstance->CardInfo.OCRData.AccessMode = BIT1; 527 } 528 else { 529 MmcHostInstance->CardInfo.OCRData.AccessMode = 0x0; 530 } 531 // Check whether MMC or eMMC 532 if (OcrResponse.Raw == EMMC_CMD1_CAPACITY_GREATER_THAN_2GB || 533 OcrResponse.Raw == EMMC_CMD1_CAPACITY_LESS_THAN_2GB) { 534 return EmmcIdentificationMode (MmcHostInstance, OcrResponse); 535 } 536 } 537 538 // Are we using SDIO ? 539 Status = MmcHost->SendCommand (MmcHost, MMC_CMD5, 0); 540 if (Status == EFI_SUCCESS) { 541 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD5): Error - SDIO not supported, Status=%r.\n", Status)); 542 return EFI_UNSUPPORTED; 543 } 544 545 // Check which kind of card we are using. Ver2.00 or later SD Memory Card (PL180 is SD v1.1) 546 CmdArg = (0x0UL << 12 | BIT8 | 0xCEUL << 0); 547 Status = MmcHost->SendCommand (MmcHost, MMC_CMD8, CmdArg); 548 if (Status == EFI_SUCCESS) { 549 DEBUG ((EFI_D_ERROR, "Card is SD2.0 => Supports high capacity\n")); 550 IsHCS = TRUE; 551 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R7, Response); 552 if (EFI_ERROR (Status)) { 553 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Failed to receive response to CMD8, Status=%r.\n", Status)); 554 return Status; 555 } 556 PrintResponseR1 (Response[0]); 557 // Check if it is valid response 558 if (Response[0] != CmdArg) { 559 DEBUG ((EFI_D_ERROR, "The Card is not usable\n")); 560 return EFI_UNSUPPORTED; 561 } 562 } else { 563 DEBUG ((EFI_D_ERROR, "Not a SD2.0 Card\n")); 564 } 565 566 // We need to wait for the MMC or SD card is ready => (gCardInfo.OCRData.PowerUp == 1) 567 Timeout = MAX_RETRY_COUNT; 568 while (Timeout > 0) { 569 // SD Card or MMC Card ? CMD55 indicates to the card that the next command is an application specific command 570 Status = MmcHost->SendCommand (MmcHost, MMC_CMD55, 0); 571 if (Status == EFI_SUCCESS) { 572 DEBUG ((EFI_D_INFO, "Card should be SD\n")); 573 if (IsHCS) { 574 MmcHostInstance->CardInfo.CardType = SD_CARD_2; 575 } else { 576 MmcHostInstance->CardInfo.CardType = SD_CARD; 577 } 578 579 // Note: The first time CmdArg will be zero 580 CmdArg = ((UINTN *) &(MmcHostInstance->CardInfo.OCRData))[0]; 581 if (IsHCS) { 582 CmdArg |= BIT30; 583 } 584 Status = MmcHost->SendCommand (MmcHost, MMC_ACMD41, CmdArg); 585 if (!EFI_ERROR (Status)) { 586 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, Response); 587 if (EFI_ERROR (Status)) { 588 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status)); 589 return Status; 590 } 591 ((UINT32 *) &(MmcHostInstance->CardInfo.OCRData))[0] = Response[0]; 592 } 593 } else { 594 DEBUG ((EFI_D_INFO, "Card should be MMC\n")); 595 MmcHostInstance->CardInfo.CardType = MMC_CARD; 596 597 Status = MmcHost->SendCommand (MmcHost, MMC_CMD1, 0x800000); 598 if (!EFI_ERROR (Status)) { 599 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_OCR, Response); 600 if (EFI_ERROR (Status)) { 601 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status)); 602 return Status; 603 } 604 ((UINT32 *) &(MmcHostInstance->CardInfo.OCRData))[0] = Response[0]; 605 } 606 } 607 608 if (!EFI_ERROR (Status)) { 609 if (!MmcHostInstance->CardInfo.OCRData.PowerUp) { 610 gBS->Stall (1); 611 Timeout--; 612 } else { 613 if ((MmcHostInstance->CardInfo.CardType == SD_CARD_2) && (MmcHostInstance->CardInfo.OCRData.AccessMode & BIT1)) { 614 MmcHostInstance->CardInfo.CardType = SD_CARD_2_HIGH; 615 DEBUG ((EFI_D_ERROR, "High capacity card.\n")); 616 } 617 break; // The MMC/SD card is ready. Continue the Identification Mode 618 } 619 } else { 620 gBS->Stall (1); 621 Timeout--; 622 } 623 } 624 625 if (Timeout == 0) { 626 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode(): No Card\n")); 627 return EFI_NO_MEDIA; 628 } else { 629 PrintOCR (Response[0]); 630 } 631 632 Status = MmcNotifyState (MmcHostInstance, MmcReadyState); 633 if (EFI_ERROR (Status)) { 634 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcReadyState\n")); 635 return Status; 636 } 637 638 Status = MmcHost->SendCommand (MmcHost, MMC_CMD2, 0); 639 if (EFI_ERROR (Status)) { 640 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD2): Error\n")); 641 return Status; 642 } 643 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_CID, Response); 644 if (EFI_ERROR (Status)) { 645 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Failed to receive CID, Status=%r.\n", Status)); 646 return Status; 647 } 648 649 PrintCID (Response); 650 651 Status = MmcHost->NotifyState (MmcHost, MmcIdentificationState); 652 if (EFI_ERROR (Status)) { 653 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcIdentificationState\n")); 654 return Status; 655 } 656 657 // 658 // Note, SD specifications say that "if the command execution causes a state change, it 659 // will be visible to the host in the response to the next command" 660 // The status returned for this CMD3 will be 2 - identification 661 // 662 CmdArg = 1; 663 Status = MmcHost->SendCommand (MmcHost, MMC_CMD3, CmdArg); 664 if (EFI_ERROR (Status)) { 665 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD3): Error\n")); 666 return Status; 667 } 668 669 Status = MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_RCA, Response); 670 if (EFI_ERROR (Status)) { 671 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Failed to receive RCA, Status=%r.\n", Status)); 672 return Status; 673 } 674 PrintRCA (Response[0]); 675 676 // For MMC card, RCA is assigned by CMD3 while CMD3 dumps the RCA for SD card 677 if (MmcHostInstance->CardInfo.CardType != MMC_CARD) { 678 MmcHostInstance->CardInfo.RCA = Response[0] >> 16; 679 } else { 680 MmcHostInstance->CardInfo.RCA = CmdArg; 681 } 682 Status = MmcNotifyState (MmcHostInstance, MmcStandByState); 683 if (EFI_ERROR (Status)) { 684 DEBUG ((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcStandByState\n")); 685 return Status; 686 } 687 688 return EFI_SUCCESS; 689 } 690 691 EFI_STATUS 692 InitializeMmcDevice ( 693 IN MMC_HOST_INSTANCE *MmcHostInstance 694 ) 695 { 696 EFI_STATUS Status; 697 EFI_MMC_HOST_PROTOCOL *MmcHost; 698 UINTN BlockCount; 699 700 BlockCount = 1; 701 MmcHost = MmcHostInstance->MmcHost; 702 703 Status = MmcIdentificationMode (MmcHostInstance); 704 if (EFI_ERROR (Status)) { 705 DEBUG((EFI_D_ERROR, "InitializeMmcDevice(): Error in Identification Mode, Status=%r\n", Status)); 706 return Status; 707 } 708 709 Status = MmcNotifyState (MmcHostInstance, MmcTransferState); 710 if (EFI_ERROR (Status)) { 711 DEBUG((EFI_D_ERROR, "InitializeMmcDevice(): Error MmcTransferState, Status=%r\n", Status)); 712 return Status; 713 } 714 715 if (MmcHostInstance->CardInfo.CardType != EMMC_CARD) { 716 Status = InitializeSdMmcDevice (MmcHostInstance); 717 } else { 718 Status = InitializeEmmcDevice (MmcHostInstance); 719 } 720 if (EFI_ERROR (Status)) { 721 return Status; 722 } 723 724 // Set Block Length 725 Status = MmcHost->SendCommand (MmcHost, MMC_CMD16, MmcHostInstance->BlockIo.Media->BlockSize); 726 if (EFI_ERROR (Status)) { 727 DEBUG((EFI_D_ERROR, "InitializeMmcDevice(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n", 728 MmcHostInstance->BlockIo.Media->BlockSize, Status)); 729 return Status; 730 } 731 732 // Block Count (not used). Could return an error for SD card 733 if (MmcHostInstance->CardInfo.CardType == MMC_CARD) { 734 Status = MmcHost->SendCommand (MmcHost, MMC_CMD23, BlockCount); 735 if (EFI_ERROR (Status)) { 736 DEBUG((EFI_D_ERROR, "InitializeMmcDevice(MMC_CMD23): Error, Status=%r\n", Status)); 737 return Status; 738 } 739 } 740 741 return EFI_SUCCESS; 742 } 743