mmc.c (8ac8a2630459bacb2d9b6516d49bedad61ca63f8) | mmc.c (c744b6f6dcf6054f4eb8ff2428edb6ba408c4a46) |
---|---|
1/* 2 * Copyright 2008, Freescale Semiconductor, Inc 3 * Andy Fleming 4 * 5 * Based vaguely on the Linux code 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ --- 1235 unchanged lines hidden (view full) --- 1244 mmc->tran_speed = 52000000; 1245 else 1246 mmc->tran_speed = 26000000; 1247 } 1248 1249 return err; 1250} 1251 | 1/* 2 * Copyright 2008, Freescale Semiconductor, Inc 3 * Andy Fleming 4 * 5 * Based vaguely on the Linux code 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ --- 1235 unchanged lines hidden (view full) --- 1244 mmc->tran_speed = 52000000; 1245 else 1246 mmc->tran_speed = 26000000; 1247 } 1248 1249 return err; 1250} 1251 |
1252static int mmc_startup_v4(struct mmc *mmc, u8 *ext_csd) 1253{ 1254 int err, i; 1255 u64 capacity; 1256 bool has_parts = false; 1257 bool part_completed; 1258 1259 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4)) 1260 return 0; 1261 1262 /* check ext_csd version and capacity */ 1263 err = mmc_send_ext_csd(mmc, ext_csd); 1264 if (err) 1265 return err; 1266 if (ext_csd[EXT_CSD_REV] >= 2) { 1267 /* 1268 * According to the JEDEC Standard, the value of 1269 * ext_csd's capacity is valid if the value is more 1270 * than 2GB 1271 */ 1272 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0 1273 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8 1274 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16 1275 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24; 1276 capacity *= MMC_MAX_BLOCK_LEN; 1277 if ((capacity >> 20) > 2 * 1024) 1278 mmc->capacity_user = capacity; 1279 } 1280 1281 switch (ext_csd[EXT_CSD_REV]) { 1282 case 1: 1283 mmc->version = MMC_VERSION_4_1; 1284 break; 1285 case 2: 1286 mmc->version = MMC_VERSION_4_2; 1287 break; 1288 case 3: 1289 mmc->version = MMC_VERSION_4_3; 1290 break; 1291 case 5: 1292 mmc->version = MMC_VERSION_4_41; 1293 break; 1294 case 6: 1295 mmc->version = MMC_VERSION_4_5; 1296 break; 1297 case 7: 1298 mmc->version = MMC_VERSION_5_0; 1299 break; 1300 case 8: 1301 mmc->version = MMC_VERSION_5_1; 1302 break; 1303 } 1304 1305 /* The partition data may be non-zero but it is only 1306 * effective if PARTITION_SETTING_COMPLETED is set in 1307 * EXT_CSD, so ignore any data if this bit is not set, 1308 * except for enabling the high-capacity group size 1309 * definition (see below). 1310 */ 1311 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] & 1312 EXT_CSD_PARTITION_SETTING_COMPLETED); 1313 1314 /* store the partition info of emmc */ 1315 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT]; 1316 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) || 1317 ext_csd[EXT_CSD_BOOT_MULT]) 1318 mmc->part_config = ext_csd[EXT_CSD_PART_CONF]; 1319 if (part_completed && 1320 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT)) 1321 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE]; 1322 1323 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17; 1324 1325 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17; 1326 1327 for (i = 0; i < 4; i++) { 1328 int idx = EXT_CSD_GP_SIZE_MULT + i * 3; 1329 uint mult = (ext_csd[idx + 2] << 16) + 1330 (ext_csd[idx + 1] << 8) + ext_csd[idx]; 1331 if (mult) 1332 has_parts = true; 1333 if (!part_completed) 1334 continue; 1335 mmc->capacity_gp[i] = mult; 1336 mmc->capacity_gp[i] *= 1337 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; 1338 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; 1339 mmc->capacity_gp[i] <<= 19; 1340 } 1341 1342 if (part_completed) { 1343 mmc->enh_user_size = 1344 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) + 1345 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8) + 1346 ext_csd[EXT_CSD_ENH_SIZE_MULT]; 1347 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; 1348 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; 1349 mmc->enh_user_size <<= 19; 1350 mmc->enh_user_start = 1351 (ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24) + 1352 (ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16) + 1353 (ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8) + 1354 ext_csd[EXT_CSD_ENH_START_ADDR]; 1355 if (mmc->high_capacity) 1356 mmc->enh_user_start <<= 9; 1357 } 1358 1359 /* 1360 * Host needs to enable ERASE_GRP_DEF bit if device is 1361 * partitioned. This bit will be lost every time after a reset 1362 * or power off. This will affect erase size. 1363 */ 1364 if (part_completed) 1365 has_parts = true; 1366 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) && 1367 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) 1368 has_parts = true; 1369 if (has_parts) { 1370 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, 1371 EXT_CSD_ERASE_GROUP_DEF, 1); 1372 1373 if (err) 1374 return err; 1375 1376 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1; 1377 } 1378 1379 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) { 1380 /* Read out group size from ext_csd */ 1381 mmc->erase_grp_size = 1382 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024; 1383 /* 1384 * if high capacity and partition setting completed 1385 * SEC_COUNT is valid even if it is smaller than 2 GiB 1386 * JEDEC Standard JESD84-B45, 6.2.4 1387 */ 1388 if (mmc->high_capacity && part_completed) { 1389 capacity = (ext_csd[EXT_CSD_SEC_CNT]) | 1390 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) | 1391 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) | 1392 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24); 1393 capacity *= MMC_MAX_BLOCK_LEN; 1394 mmc->capacity_user = capacity; 1395 } 1396 } else { 1397 /* Calculate the group size from the csd value. */ 1398 int erase_gsz, erase_gmul; 1399 1400 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10; 1401 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5; 1402 mmc->erase_grp_size = (erase_gsz + 1) 1403 * (erase_gmul + 1); 1404 } 1405 1406 mmc->hc_wp_grp_size = 1024 1407 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] 1408 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; 1409 1410 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET]; 1411 1412 return 0; 1413} 1414 |
|
1252static int mmc_startup(struct mmc *mmc) 1253{ 1254 int err, i; 1255 uint mult, freq; | 1415static int mmc_startup(struct mmc *mmc) 1416{ 1417 int err, i; 1418 uint mult, freq; |
1256 u64 cmult, csize, capacity; | 1419 u64 cmult, csize; |
1257 struct mmc_cmd cmd; 1258 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); | 1420 struct mmc_cmd cmd; 1421 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); |
1259 bool has_parts = false; 1260 bool part_completed; | |
1261 struct blk_desc *bdesc; 1262 1263#ifdef CONFIG_MMC_SPI_CRC_ON 1264 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */ 1265 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF; 1266 cmd.resp_type = MMC_RSP_R1; 1267 cmd.cmdarg = 1; 1268 err = mmc_send_cmd(mmc, &cmd, NULL); --- 131 unchanged lines hidden (view full) --- 1400 return err; 1401 } 1402 1403 /* 1404 * For SD, its erase group is always one sector 1405 */ 1406 mmc->erase_grp_size = 1; 1407 mmc->part_config = MMCPART_NOAVAILABLE; | 1422 struct blk_desc *bdesc; 1423 1424#ifdef CONFIG_MMC_SPI_CRC_ON 1425 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */ 1426 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF; 1427 cmd.resp_type = MMC_RSP_R1; 1428 cmd.cmdarg = 1; 1429 err = mmc_send_cmd(mmc, &cmd, NULL); --- 131 unchanged lines hidden (view full) --- 1561 return err; 1562 } 1563 1564 /* 1565 * For SD, its erase group is always one sector 1566 */ 1567 mmc->erase_grp_size = 1; 1568 mmc->part_config = MMCPART_NOAVAILABLE; |
1408 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) { 1409 /* check ext_csd version and capacity */ 1410 err = mmc_send_ext_csd(mmc, ext_csd); 1411 if (err) 1412 return err; 1413 if (ext_csd[EXT_CSD_REV] >= 2) { 1414 /* 1415 * According to the JEDEC Standard, the value of 1416 * ext_csd's capacity is valid if the value is more 1417 * than 2GB 1418 */ 1419 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0 1420 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8 1421 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16 1422 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24; 1423 capacity *= MMC_MAX_BLOCK_LEN; 1424 if ((capacity >> 20) > 2 * 1024) 1425 mmc->capacity_user = capacity; 1426 } | |
1427 | 1569 |
1428 switch (ext_csd[EXT_CSD_REV]) { 1429 case 1: 1430 mmc->version = MMC_VERSION_4_1; 1431 break; 1432 case 2: 1433 mmc->version = MMC_VERSION_4_2; 1434 break; 1435 case 3: 1436 mmc->version = MMC_VERSION_4_3; 1437 break; 1438 case 5: 1439 mmc->version = MMC_VERSION_4_41; 1440 break; 1441 case 6: 1442 mmc->version = MMC_VERSION_4_5; 1443 break; 1444 case 7: 1445 mmc->version = MMC_VERSION_5_0; 1446 break; 1447 case 8: 1448 mmc->version = MMC_VERSION_5_1; 1449 break; 1450 } | 1570 err = mmc_startup_v4(mmc, ext_csd); 1571 if (err) 1572 return err; |
1451 | 1573 |
1452 /* The partition data may be non-zero but it is only 1453 * effective if PARTITION_SETTING_COMPLETED is set in 1454 * EXT_CSD, so ignore any data if this bit is not set, 1455 * except for enabling the high-capacity group size 1456 * definition (see below). */ 1457 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] & 1458 EXT_CSD_PARTITION_SETTING_COMPLETED); 1459 1460 /* store the partition info of emmc */ 1461 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT]; 1462 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) || 1463 ext_csd[EXT_CSD_BOOT_MULT]) 1464 mmc->part_config = ext_csd[EXT_CSD_PART_CONF]; 1465 if (part_completed && 1466 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT)) 1467 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE]; 1468 1469 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17; 1470 1471 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17; 1472 1473 for (i = 0; i < 4; i++) { 1474 int idx = EXT_CSD_GP_SIZE_MULT + i * 3; 1475 uint mult = (ext_csd[idx + 2] << 16) + 1476 (ext_csd[idx + 1] << 8) + ext_csd[idx]; 1477 if (mult) 1478 has_parts = true; 1479 if (!part_completed) 1480 continue; 1481 mmc->capacity_gp[i] = mult; 1482 mmc->capacity_gp[i] *= 1483 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; 1484 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; 1485 mmc->capacity_gp[i] <<= 19; 1486 } 1487 1488 if (part_completed) { 1489 mmc->enh_user_size = 1490 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) + 1491 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) + 1492 ext_csd[EXT_CSD_ENH_SIZE_MULT]; 1493 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; 1494 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; 1495 mmc->enh_user_size <<= 19; 1496 mmc->enh_user_start = 1497 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) + 1498 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) + 1499 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) + 1500 ext_csd[EXT_CSD_ENH_START_ADDR]; 1501 if (mmc->high_capacity) 1502 mmc->enh_user_start <<= 9; 1503 } 1504 1505 /* 1506 * Host needs to enable ERASE_GRP_DEF bit if device is 1507 * partitioned. This bit will be lost every time after a reset 1508 * or power off. This will affect erase size. 1509 */ 1510 if (part_completed) 1511 has_parts = true; 1512 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) && 1513 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) 1514 has_parts = true; 1515 if (has_parts) { 1516 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, 1517 EXT_CSD_ERASE_GROUP_DEF, 1); 1518 1519 if (err) 1520 return err; 1521 else 1522 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1; 1523 } 1524 1525 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) { 1526 /* Read out group size from ext_csd */ 1527 mmc->erase_grp_size = 1528 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024; 1529 /* 1530 * if high capacity and partition setting completed 1531 * SEC_COUNT is valid even if it is smaller than 2 GiB 1532 * JEDEC Standard JESD84-B45, 6.2.4 1533 */ 1534 if (mmc->high_capacity && part_completed) { 1535 capacity = (ext_csd[EXT_CSD_SEC_CNT]) | 1536 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) | 1537 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) | 1538 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24); 1539 capacity *= MMC_MAX_BLOCK_LEN; 1540 mmc->capacity_user = capacity; 1541 } 1542 } else { 1543 /* Calculate the group size from the csd value. */ 1544 int erase_gsz, erase_gmul; 1545 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10; 1546 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5; 1547 mmc->erase_grp_size = (erase_gsz + 1) 1548 * (erase_gmul + 1); 1549 } 1550 1551 mmc->hc_wp_grp_size = 1024 1552 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] 1553 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; 1554 1555 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET]; 1556 } 1557 | |
1558 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart); 1559 if (err) 1560 return err; 1561 1562 if (IS_SD(mmc)) 1563 err = sd_select_bus_freq_width(mmc); 1564 else 1565 err = mmc_select_bus_freq_width(mmc, ext_csd); --- 348 unchanged lines hidden --- | 1574 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart); 1575 if (err) 1576 return err; 1577 1578 if (IS_SD(mmc)) 1579 err = sd_select_bus_freq_width(mmc); 1580 else 1581 err = mmc_select_bus_freq_width(mmc, ext_csd); --- 348 unchanged lines hidden --- |