mmc_core.c 99 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. /*=======================================================================*/
  32. /* HEADER FILES */
  33. /*=======================================================================*/
  34. #include "msdc.h"
  35. #define NR_MMC (MSDC_MAX_NUM)
  36. static struct mmc_host sd_host[NR_MMC];
  37. static struct mmc_card sd_card[NR_MMC];
  38. static const unsigned int tran_exp[] = {
  39. 10000, 100000, 1000000, 10000000,
  40. 0, 0, 0, 0
  41. };
  42. static const unsigned char tran_mant[] = {
  43. 0, 10, 12, 13, 15, 20, 25, 30,
  44. 35, 40, 45, 50, 55, 60, 70, 80,
  45. };
  46. static const unsigned char mmc_tran_mant[] = {
  47. 0, 10, 12, 13, 15, 20, 26, 30,
  48. 35, 40, 45, 52, 55, 60, 70, 80,
  49. };
  50. static const unsigned int tacc_exp[] = {
  51. 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
  52. };
  53. static const unsigned int tacc_mant[] = {
  54. 0, 10, 12, 13, 15, 20, 25, 30,
  55. 35, 40, 45, 50, 55, 60, 70, 80,
  56. };
  57. static u32 unstuff_bits(u32 *resp, u32 start, u32 size)
  58. {
  59. const u32 __mask = (1 << (size)) - 1;
  60. const int __off = 3 - ((start) / 32);
  61. const int __shft = (start) & 31;
  62. u32 __res;
  63. __res = resp[__off] >> __shft;
  64. if ((size) + __shft >= 32)
  65. __res |= resp[__off-1] << (32 - __shft);
  66. return __res & __mask;
  67. }
  68. #ifdef MTK_EMMC_POWER_ON_WP
  69. int mmc_set_write_protect_by_group(struct mmc_card *card,
  70. Region partition,unsigned long blknr,u32 blkcnt, EMMC_WP_TYPE type);
  71. #endif
  72. #ifdef MMC_PROFILING
  73. static void mmc_prof_card_init(void *data, ulong id, ulong counts)
  74. {
  75. int err = (int)data;
  76. if (!err) {
  77. msdc_printf("[SD%d] Init Card, %d counts, %d us\n",
  78. id, counts, counts * 30 + counts * 16960 / 32768);
  79. }
  80. }
  81. static void mmc_prof_read(void *data, ulong id, ulong counts)
  82. {
  83. struct mmc_op_perf *perf = (struct mmc_op_perf *)data;
  84. struct mmc_op_report *rpt;
  85. u32 blksz = perf->host->blklen;
  86. u32 blkcnt = (u32)id;
  87. if (blkcnt > 1)
  88. rpt = &perf->multi_blks_read;
  89. else
  90. rpt = &perf->single_blk_read;
  91. rpt->count++;
  92. rpt->total_size += blkcnt * blksz;
  93. rpt->total_time += counts;
  94. if ((counts < rpt->min_time) || (rpt->min_time == 0))
  95. rpt->min_time = counts;
  96. if ((counts > rpt->max_time) || (rpt->max_time == 0))
  97. rpt->max_time = counts;
  98. msdc_printf("[SD%d] Read %d bytes, %d counts, %d us, %d KB/s, Avg: %d KB/s\n",
  99. perf->host->id, blkcnt * blksz, counts,
  100. counts * 30 + counts * 16960 / 32768,
  101. blkcnt * blksz * 32 / (counts ? counts : 1),
  102. ((rpt->total_size / 1024) * 32768) / rpt->total_time);
  103. }
  104. static void mmc_prof_write(void *data, ulong id, ulong counts)
  105. {
  106. struct mmc_op_perf *perf = (struct mmc_op_perf *)data;
  107. struct mmc_op_report *rpt;
  108. u32 blksz = perf->host->blklen;
  109. u32 blkcnt = (u32)id;
  110. if (blkcnt > 1)
  111. rpt = &perf->multi_blks_write;
  112. else
  113. rpt = &perf->single_blk_write;
  114. rpt->count++;
  115. rpt->total_size += blkcnt * blksz;
  116. rpt->total_time += counts;
  117. if ((counts < rpt->min_time) || (rpt->min_time == 0))
  118. rpt->min_time = counts;
  119. if ((counts > rpt->max_time) || (rpt->max_time == 0))
  120. rpt->max_time = counts;
  121. msdc_printf("[SD%d] Write %d bytes, %d counts, %d us, %d KB/s, Avg: %d KB/s\n",
  122. perf->host->id, blkcnt * blksz, counts,
  123. counts * 30 + counts * 16960 / 32768,
  124. blkcnt * blksz * 32 / (counts ? counts : 1),
  125. ((rpt->total_size / 1024) * 32768) / rpt->total_time);
  126. }
  127. #endif
  128. #if MMC_DEBUG
  129. void mmc_dump_card_status(u32 card_status)
  130. {
  131. msdc_dump_card_status(card_status);
  132. }
  133. static void mmc_dump_ocr_reg(u32 resp)
  134. {
  135. msdc_dump_ocr_reg(resp);
  136. }
  137. static void mmc_dump_rca_resp(u32 resp)
  138. {
  139. msdc_dump_rca_resp(resp);
  140. }
  141. static void mmc_dump_tuning_blk(u8 *buf)
  142. {
  143. int i;
  144. for (i = 0; i < 16; i++) {
  145. msdc_printf("[TBLK%d] %x%x%x%x%x%x%x%x\n", i,
  146. (buf[(i<<2)] >> 4) & 0xF, buf[(i<<2)] & 0xF,
  147. (buf[(i<<2)+1] >> 4) & 0xF, buf[(i<<2)+1] & 0xF,
  148. (buf[(i<<2)+2] >> 4) & 0xF, buf[(i<<2)+2] & 0xF,
  149. (buf[(i<<2)+3] >> 4) & 0xF, buf[(i<<2)+3] & 0xF);
  150. }
  151. }
  152. static void mmc_dump_csd(struct mmc_card *card)
  153. {
  154. struct mmc_csd *csd = &card->csd;
  155. u32 *resp = card->raw_csd;
  156. int i;
  157. unsigned int csd_struct;
  158. static char *sd_csd_ver[] = {"v1.0", "v2.0"};
  159. static char *mmc_csd_ver[] = {"v1.0", "v1.1", "v1.2", "Ver. in EXT_CSD"};
  160. static char *mmc_cmd_cls[] = {"basic", "stream read", "block read",
  161. "stream write", "block write", "erase", "write prot", "lock card",
  162. "app-spec", "I/O", "rsv.", "rsv."
  163. };
  164. static char *sd_cmd_cls[] = {"basic", "rsv.", "block read",
  165. "rsv.", "block write", "erase", "write prot", "lock card",
  166. "app-spec", "I/O", "switch", "rsv."
  167. };
  168. if (mmc_card_sd(card)) {
  169. csd_struct = unstuff_bits(resp, 126, 2);
  170. msdc_printf("[CSD] CSD %s\n", sd_csd_ver[csd_struct]);
  171. msdc_printf("[CSD] TACC_NS: %d ns, TACC_CLKS: %d clks\n", csd->tacc_ns, csd->tacc_clks);
  172. if (csd_struct == 1) {
  173. msdc_printf("[CSD] Read/Write Blk Len = 512bytes\n");
  174. } else {
  175. msdc_printf("[CSD] Read Blk Len = %d, Write Blk Len = %d\n",
  176. 1 << csd->read_blkbits, 1 << csd->write_blkbits);
  177. }
  178. msdc_printf("[CSD] CMD Class:");
  179. for (i = 0; i < 12; i++) {
  180. if ((csd->cmdclass >> i) & 0x1)
  181. msdc_printf("'%s' ", sd_cmd_cls[i]);
  182. }
  183. msdc_printf("\n");
  184. } else {
  185. csd_struct = unstuff_bits(resp, 126, 2);
  186. msdc_printf("[CSD] CSD %s\n", mmc_csd_ver[csd_struct]);
  187. msdc_printf("[CSD] MMCA Spec v%d\n", csd->mmca_vsn);
  188. msdc_printf("[CSD] TACC_NS: %d ns, TACC_CLKS: %d clks\n", csd->tacc_ns, csd->tacc_clks);
  189. msdc_printf("[CSD] Read Blk Len = %d, Write Blk Len = %d\n",
  190. 1 << csd->read_blkbits, 1 << csd->write_blkbits);
  191. msdc_printf("[CSD] CMD Class:");
  192. for (i = 0; i < 12; i++) {
  193. if ((csd->cmdclass >> i) & 0x1)
  194. msdc_printf("'%s' ", mmc_cmd_cls[i]);
  195. }
  196. msdc_printf("\n");
  197. }
  198. }
  199. void mmc_dump_ext_csd(struct mmc_card *card)
  200. {
  201. u8 *ext_csd = &card->raw_ext_csd[0];
  202. u32 tmp;
  203. char *rev[] = {"4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1"};
  204. msdc_printf("===========================================================\n");
  205. msdc_printf("[EXT_CSD] EXT_CSD rev. : v1.%d (MMCv%s)\n",
  206. ext_csd[EXT_CSD_REV], rev[ext_csd[EXT_CSD_REV]]);
  207. msdc_printf("[EXT_CSD] CSD struct rev. : v1.%d\n", ext_csd[EXT_CSD_STRUCT]);
  208. msdc_printf("[EXT_CSD] Supported command sets : %xh\n", ext_csd[EXT_CSD_S_CMD_SET]);
  209. msdc_printf("[EXT_CSD] HPI features : %xh\n", ext_csd[EXT_CSD_HPI_FEATURE]);
  210. msdc_printf("[EXT_CSD] BG operations support : %xh\n", ext_csd[EXT_CSD_BKOPS_SUPP]);
  211. msdc_printf("[EXT_CSD] BG operations status : %xh\n", ext_csd[EXT_CSD_BKOPS_STATUS]);
  212. memcpy(&tmp, &ext_csd[EXT_CSD_CORRECT_PRG_SECTS_NUM], 4);
  213. msdc_printf("[EXT_CSD] Correct prg. sectors : %xh\n", tmp);
  214. msdc_printf("[EXT_CSD] 1st init time after part. : %d ms\n", ext_csd[EXT_CSD_INI_TIMEOUT_AP] * 100);
  215. msdc_printf("[EXT_CSD] Min. write perf.(DDR,52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_DDR_W_8_52]);
  216. msdc_printf("[EXT_CSD] Min. read perf. (DDR,52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_DDR_R_8_52]);
  217. msdc_printf("[EXT_CSD] TRIM timeout: %d ms\n", ext_csd[EXT_CSD_TRIM_MULT] & 0xFF * 300);
  218. msdc_printf("[EXT_CSD] Secure feature support: %xh\n", ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]);
  219. msdc_printf("[EXT_CSD] Secure erase timeout : %d ms\n", 300 *
  220. ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] * ext_csd[EXT_CSD_SEC_ERASE_MULT]);
  221. msdc_printf("[EXT_CSD] Secure trim timeout : %d ms\n", 300 *
  222. ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] * ext_csd[EXT_CSD_SEC_TRIM_MULT]);
  223. msdc_printf("[EXT_CSD] Access size : %d bytes\n", ext_csd[EXT_CSD_ACC_SIZE] * 512);
  224. msdc_printf("[EXT_CSD] HC erase unit size : %d kbytes\n", ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512);
  225. msdc_printf("[EXT_CSD] HC erase timeout : %d ms\n", ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] * 300);
  226. msdc_printf("[EXT_CSD] HC write prot grp size: %d kbytes\n", 512 *
  227. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * ext_csd[EXT_CSD_HC_WP_GPR_SIZE]);
  228. msdc_printf("[EXT_CSD] HC erase grp def. : %xh\n", ext_csd[EXT_CSD_ERASE_GRP_DEF]);
  229. msdc_printf("[EXT_CSD] Reliable write sect count: %xh\n", ext_csd[EXT_CSD_REL_WR_SEC_C]);
  230. msdc_printf("[EXT_CSD] Sleep current (VCC) : %xh\n", ext_csd[EXT_CSD_S_C_VCC]);
  231. msdc_printf("[EXT_CSD] Sleep current (VCCQ): %xh\n", ext_csd[EXT_CSD_S_C_VCCQ]);
  232. msdc_printf("[EXT_CSD] Sleep/awake timeout : %d ns\n",
  233. 100 * (2 << ext_csd[EXT_CSD_S_A_TIMEOUT]));
  234. memcpy(&tmp, &ext_csd[EXT_CSD_SEC_CNT], 4);
  235. msdc_printf("[EXT_CSD] Sector count : %xh\n", tmp);
  236. msdc_printf("[EXT_CSD] Min. WR Perf. (52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_W_8_52]);
  237. msdc_printf("[EXT_CSD] Min. Read Perf.(52MH,8b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_R_8_52]);
  238. msdc_printf("[EXT_CSD] Min. WR Perf. (26MH,8b,52MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_W_8_26_4_25]);
  239. msdc_printf("[EXT_CSD] Min. Read Perf.(26MH,8b,52MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_R_8_26_4_25]);
  240. msdc_printf("[EXT_CSD] Min. WR Perf. (26MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_W_4_26]);
  241. msdc_printf("[EXT_CSD] Min. Read Perf.(26MH,4b): %xh\n", ext_csd[EXT_CSD_MIN_PERF_R_4_26]);
  242. msdc_printf("[EXT_CSD] Power class: %x\n", ext_csd[EXT_CSD_PWR_CLASS]);
  243. msdc_printf("[EXT_CSD] Power class(DDR,52MH,3.6V): %xh\n", ext_csd[EXT_CSD_PWR_CL_DDR_52_360]);
  244. msdc_printf("[EXT_CSD] Power class(DDR,52MH,1.9V): %xh\n", ext_csd[EXT_CSD_PWR_CL_DDR_52_195]);
  245. msdc_printf("[EXT_CSD] Power class(26MH,3.6V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_26_360]);
  246. msdc_printf("[EXT_CSD] Power class(52MH,3.6V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_52_360]);
  247. msdc_printf("[EXT_CSD] Power class(26MH,1.9V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_26_195]);
  248. msdc_printf("[EXT_CSD] Power class(52MH,1.9V) : %xh\n", ext_csd[EXT_CSD_PWR_CL_52_195]);
  249. msdc_printf("[EXT_CSD] Part. switch timing : %xh\n", ext_csd[EXT_CSD_PART_SWITCH_TIME]);
  250. msdc_printf("[EXT_CSD] Out-of-INTR busy timing: %xh\n", ext_csd[EXT_CSD_OUT_OF_INTR_TIME]);
  251. msdc_printf("[EXT_CSD] Card type : %xh\n", ext_csd[EXT_CSD_CARD_TYPE]);
  252. msdc_printf("[EXT_CSD] Command set : %xh\n", ext_csd[EXT_CSD_CMD_SET]);
  253. msdc_printf("[EXT_CSD] Command set rev.: %xh\n", ext_csd[EXT_CSD_CMD_SET_REV]);
  254. msdc_printf("[EXT_CSD] HS timing : %xh\n", ext_csd[EXT_CSD_HS_TIMING]);
  255. msdc_printf("[EXT_CSD] Bus width : %xh\n", ext_csd[EXT_CSD_BUS_WIDTH]);
  256. msdc_printf("[EXT_CSD] Erase memory content : %xh\n", ext_csd[EXT_CSD_ERASED_MEM_CONT]);
  257. msdc_printf("[EXT_CSD] Partition config : %xh\n", ext_csd[EXT_CSD_PART_CFG]);
  258. msdc_printf("[EXT_CSD] Boot partition size : %d kbytes\n", ext_csd[EXT_CSD_BOOT_SIZE_MULT] * 128);
  259. msdc_printf("[EXT_CSD] Boot information : %xh\n", ext_csd[EXT_CSD_BOOT_INFO]);
  260. msdc_printf("[EXT_CSD] Boot config protection: %xh\n", ext_csd[EXT_CSD_BOOT_CONFIG_PROT]);
  261. msdc_printf("[EXT_CSD] Boot bus width : %xh\n", ext_csd[EXT_CSD_BOOT_BUS_WIDTH]);
  262. msdc_printf("[EXT_CSD] Boot area write prot : %xh\n", ext_csd[EXT_CSD_BOOT_WP]);
  263. msdc_printf("[EXT_CSD] User area write prot : %xh\n", ext_csd[EXT_CSD_USR_WP]);
  264. msdc_printf("[EXT_CSD] FW configuration : %xh\n", ext_csd[EXT_CSD_FW_CONFIG]);
  265. msdc_printf("[EXT_CSD] RPMB size : %d kbytes\n", ext_csd[EXT_CSD_RPMB_SIZE_MULT] * 128);
  266. msdc_printf("[EXT_CSD] Write rel. setting : %xh\n", ext_csd[EXT_CSD_WR_REL_SET]);
  267. msdc_printf("[EXT_CSD] Write rel. parameter: %xh\n", ext_csd[EXT_CSD_WR_REL_PARAM]);
  268. msdc_printf("[EXT_CSD] Start background ops : %xh\n", ext_csd[EXT_CSD_BKOPS_START]);
  269. msdc_printf("[EXT_CSD] Enable background ops: %xh\n", ext_csd[EXT_CSD_BKOPS_EN]);
  270. msdc_printf("[EXT_CSD] H/W reset function : %xh\n", ext_csd[EXT_CSD_RST_N_FUNC]);
  271. msdc_printf("[EXT_CSD] HPI management : %xh\n", ext_csd[EXT_CSD_HPI_MGMT]);
  272. memcpy(&tmp, &ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT], 4);
  273. msdc_printf("[EXT_CSD] Max. enhanced area size : %xh (%d kbytes)\n",
  274. tmp & 0x00FFFFFF, (tmp & 0x00FFFFFF) * 512 *
  275. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  276. msdc_printf("[EXT_CSD] Part. support : %xh\n", ext_csd[EXT_CSD_PART_SUPPORT]);
  277. msdc_printf("[EXT_CSD] Part. attribute: %xh\n", ext_csd[EXT_CSD_PART_ATTR]);
  278. msdc_printf("[EXT_CSD] Part. setting : %xh\n", ext_csd[EXT_CSD_PART_SET_COMPL]);
  279. msdc_printf("[EXT_CSD] General purpose 1 size : %xh (%d kbytes)\n",
  280. (ext_csd[EXT_CSD_GP1_SIZE_MULT + 0] |
  281. ext_csd[EXT_CSD_GP1_SIZE_MULT + 1] << 8 |
  282. ext_csd[EXT_CSD_GP1_SIZE_MULT + 2] << 16),
  283. (ext_csd[EXT_CSD_GP1_SIZE_MULT + 0] |
  284. ext_csd[EXT_CSD_GP1_SIZE_MULT + 1] << 8 |
  285. ext_csd[EXT_CSD_GP1_SIZE_MULT + 2] << 16) * 512 *
  286. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  287. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  288. msdc_printf("[EXT_CSD] General purpose 2 size : %xh (%d kbytes)\n",
  289. (ext_csd[EXT_CSD_GP2_SIZE_MULT + 0] |
  290. ext_csd[EXT_CSD_GP2_SIZE_MULT + 1] << 8 |
  291. ext_csd[EXT_CSD_GP2_SIZE_MULT + 2] << 16),
  292. (ext_csd[EXT_CSD_GP2_SIZE_MULT + 0] |
  293. ext_csd[EXT_CSD_GP2_SIZE_MULT + 1] << 8 |
  294. ext_csd[EXT_CSD_GP2_SIZE_MULT + 2] << 16) * 512 *
  295. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  296. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  297. msdc_printf("[EXT_CSD] General purpose 3 size : %xh (%d kbytes)\n",
  298. (ext_csd[EXT_CSD_GP3_SIZE_MULT + 0] |
  299. ext_csd[EXT_CSD_GP3_SIZE_MULT + 1] << 8 |
  300. ext_csd[EXT_CSD_GP3_SIZE_MULT + 2] << 16),
  301. (ext_csd[EXT_CSD_GP3_SIZE_MULT + 0] |
  302. ext_csd[EXT_CSD_GP3_SIZE_MULT + 1] << 8 |
  303. ext_csd[EXT_CSD_GP3_SIZE_MULT + 2] << 16) * 512 *
  304. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  305. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  306. msdc_printf("[EXT_CSD] General purpose 4 size : %xh (%d kbytes)\n",
  307. (ext_csd[EXT_CSD_GP4_SIZE_MULT + 0] |
  308. ext_csd[EXT_CSD_GP4_SIZE_MULT + 1] << 8 |
  309. ext_csd[EXT_CSD_GP4_SIZE_MULT + 2] << 16),
  310. (ext_csd[EXT_CSD_GP4_SIZE_MULT + 0] |
  311. ext_csd[EXT_CSD_GP4_SIZE_MULT + 1] << 8 |
  312. ext_csd[EXT_CSD_GP4_SIZE_MULT + 2] << 16) * 512 *
  313. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  314. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  315. msdc_printf("[EXT_CSD] Enh. user area size : %xh (%d kbytes)\n",
  316. (ext_csd[EXT_CSD_ENH_SIZE_MULT + 0] |
  317. ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8 |
  318. ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16),
  319. (ext_csd[EXT_CSD_ENH_SIZE_MULT + 0] |
  320. ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8 |
  321. ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) * 512 *
  322. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] *
  323. ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  324. msdc_printf("[EXT_CSD] Enh. user area start: %xh\n",
  325. (ext_csd[EXT_CSD_ENH_START_ADDR + 0] |
  326. ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8 |
  327. ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16 |
  328. ext_csd[EXT_CSD_ENH_START_ADDR + 3]) << 24);
  329. msdc_printf("[EXT_CSD] Bad block mgmt mode: %xh\n", ext_csd[EXT_CSD_BADBLK_MGMT]);
  330. msdc_printf("===========================================================\n");
  331. }
  332. #endif
  333. #if defined(FEATURE_MMC_CARD_DETECT)
  334. int mmc_card_avail(struct mmc_host *host)
  335. {
  336. return msdc_card_avail(host);
  337. }
  338. #endif
  339. #if defined(MMC_MSDC_DRV_CTP)
  340. int mmc_card_protected(struct mmc_host *host)
  341. {
  342. return msdc_card_protected(host);
  343. }
  344. #endif
  345. struct mmc_host *mmc_get_host(int id)
  346. {
  347. return &sd_host[id];
  348. }
  349. struct mmc_card *mmc_get_card(int id)
  350. {
  351. return &sd_card[id];
  352. }
  353. int mmc_cmd(struct mmc_host *host, struct mmc_command *cmd)
  354. {
  355. int err;
  356. int retry = cmd->retries;
  357. if (cmd->opcode == MMC_CMD_APP_CMD ) {
  358. host->app_cmd = 1;
  359. host->app_cmd_arg = cmd->arg;
  360. } else {
  361. host->app_cmd = 0;
  362. }
  363. do {
  364. err = msdc_cmd(host, cmd);
  365. if (err == MMC_ERR_NONE)
  366. break;
  367. /* Break retry, just retrun erase seq fail */
  368. if (err == MMC_ERR_ERASE_SEQ)
  369. break;
  370. } while (retry--);
  371. return err;
  372. }
  373. static int mmc_app_cmd(struct mmc_host *host, struct mmc_command *cmd,
  374. u32 rca, int retries)
  375. {
  376. int err = MMC_ERR_FAILED;
  377. struct mmc_command appcmd;
  378. appcmd.opcode = MMC_CMD_APP_CMD;
  379. appcmd.arg = rca << 16;
  380. appcmd.rsptyp = RESP_R1;
  381. appcmd.retries = CMD_RETRIES;
  382. appcmd.timeout = CMD_TIMEOUT;
  383. do {
  384. err = mmc_cmd(host, &appcmd);
  385. if (err == MMC_ERR_NONE)
  386. err = mmc_cmd(host, cmd);
  387. if (err == MMC_ERR_NONE)
  388. break;
  389. } while (retries--);
  390. return err;
  391. }
  392. u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
  393. {
  394. int bit;
  395. ocr &= host->ocr_avail;
  396. bit = uffs(ocr);
  397. if (bit) {
  398. bit -= 1;
  399. ocr &= 3 << bit;
  400. } else {
  401. ocr = 0;
  402. }
  403. return ocr;
  404. }
  405. int mmc_go_idle(struct mmc_host *host)
  406. {
  407. struct mmc_command cmd;
  408. cmd.opcode = MMC_CMD_GO_IDLE_STATE;
  409. cmd.rsptyp = RESP_NONE;
  410. cmd.arg = 0;
  411. cmd.retries = CMD_RETRIES;
  412. cmd.timeout = CMD_TIMEOUT;
  413. return mmc_cmd(host, &cmd);
  414. }
  415. #if defined(MMC_MSDC_DRV_CTP)
  416. int mmc_go_irq_state(struct mmc_host *host, struct mmc_card *card)
  417. {
  418. struct mmc_command cmd;
  419. if (!(card->csd.cmdclass & CCC_IO_MODE)) {
  420. msdc_printf("[SD%d] Card doesn't support I/O mode for IRQ state\n", host->id);
  421. return MMC_ERR_FAILED;
  422. }
  423. cmd.opcode = MMC_CMD_GO_IRQ_STATE;
  424. cmd.rsptyp = RESP_R5;
  425. cmd.arg = 0;
  426. cmd.retries = CMD_RETRIES;
  427. cmd.timeout = CMD_TIMEOUT;
  428. return mmc_cmd(host, &cmd);
  429. }
  430. static int mmc_go_inactive(struct mmc_host *host, struct mmc_card *card)
  431. {
  432. struct mmc_command cmd;
  433. cmd.opcode = MMC_CMD_GO_INACTIVE_STATE;
  434. cmd.rsptyp = RESP_NONE;
  435. cmd.arg = 0;
  436. cmd.retries = CMD_RETRIES;
  437. cmd.timeout = CMD_TIMEOUT;
  438. return mmc_cmd(host, &cmd);
  439. }
  440. static int mmc_go_pre_idle(struct mmc_host *host, struct mmc_card *card)
  441. {
  442. struct mmc_command cmd;
  443. cmd.opcode = MMC_CMD_GO_IDLE_STATE;
  444. cmd.rsptyp = RESP_NONE;
  445. cmd.arg = 0xF0F0F0F0;
  446. cmd.retries = CMD_RETRIES;
  447. cmd.timeout = CMD_TIMEOUT;
  448. return mmc_cmd(host, &cmd);
  449. }
  450. #endif
  451. int mmc_sleep_awake(struct mmc_host *host, struct mmc_card *card, int sleep)
  452. {
  453. struct mmc_command cmd;
  454. u32 timeout;
  455. if (card->raw_ext_csd[EXT_CSD_S_A_TIMEOUT]) {
  456. timeout = ((1 << card->raw_ext_csd[EXT_CSD_S_A_TIMEOUT]) * 100) / 1000000;
  457. } else {
  458. timeout = CMD_TIMEOUT;
  459. }
  460. cmd.opcode = MMC_CMD_SLEEP_AWAKE;
  461. cmd.rsptyp = RESP_R1B;
  462. cmd.arg = (card->rca << 16) | (sleep << 15);
  463. cmd.retries = CMD_RETRIES;
  464. cmd.timeout = timeout;
  465. return mmc_cmd(host, &cmd);
  466. }
  467. int mmc_send_status(struct mmc_host *host, struct mmc_card *card, u32 *status)
  468. {
  469. int err;
  470. struct mmc_command cmd;
  471. cmd.opcode = MMC_CMD_SEND_STATUS;
  472. cmd.arg = card->rca << 16;
  473. cmd.rsptyp = RESP_R1;
  474. cmd.retries = CMD_RETRIES;
  475. cmd.timeout = CMD_TIMEOUT;
  476. err = mmc_cmd(host, &cmd);
  477. if (err == MMC_ERR_NONE) {
  478. *status = cmd.resp[0];
  479. #if MMC_DEBUG
  480. mmc_dump_card_status(*status);
  481. #endif
  482. }
  483. return err;
  484. }
  485. static int mmc_send_if_cond(struct mmc_host *host, u32 ocr)
  486. {
  487. struct mmc_command cmd;
  488. int err;
  489. static const u8 test_pattern = 0xAA;
  490. u8 result_pattern;
  491. /*
  492. * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND
  493. * before SD_APP_OP_COND. This command will harmlessly fail for
  494. * SD 1.0 cards.
  495. */
  496. memset(&cmd, 0, sizeof(struct mmc_command));
  497. cmd.opcode = SD_CMD_SEND_IF_COND;
  498. cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | test_pattern;
  499. cmd.rsptyp = RESP_R1;
  500. cmd.retries = 0;
  501. cmd.timeout = CMD_TIMEOUT;
  502. err = mmc_cmd(host, &cmd);
  503. if (err != MMC_ERR_NONE)
  504. return err;
  505. result_pattern = cmd.resp[0] & 0xFF;
  506. if (result_pattern != test_pattern)
  507. return MMC_ERR_INVALID;
  508. return MMC_ERR_NONE;
  509. }
  510. static int mmc_sd_get_write_blocks(struct mmc_host *host, struct mmc_card *card, u32* num)
  511. {
  512. u32 base = host->base;
  513. struct mmc_command cmd;
  514. int err;
  515. int result = MMC_ERR_NONE;
  516. u8 buf[4];
  517. cmd.opcode = SD_ACMD_SEND_NR_WR_BLOCKS;
  518. cmd.arg = 0;
  519. cmd.rsptyp = RESP_R1;
  520. cmd.retries = 3;
  521. cmd.timeout = CMD_TIMEOUT;
  522. #if defined(FEATURE_MMC_RD_TUNING)
  523. msdc_reset_tune_counter(host);
  524. do {
  525. #endif
  526. msdc_set_blknum(host, 1);
  527. msdc_set_blklen(host, 4);
  528. msdc_set_timeout(host, 100000000, 0);
  529. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO);
  530. err = mmc_app_cmd(host, &cmd, card->rca, CMD_RETRIES);
  531. if (err != MMC_ERR_NONE)
  532. return err;
  533. /* 32bits = 4 byte */
  534. err = msdc_pio_read(host, (u32*)buf, 4);
  535. //msdc_printf("[%s:%d]err = %d\n", __func__, __LINE__, err);
  536. if (err != MMC_ERR_NONE) {
  537. msdc_abort_handler(host, 1);
  538. #if defined(FEATURE_MMC_RD_TUNING)
  539. result = msdc_tune_read(host);
  540. #else
  541. goto out;
  542. #endif
  543. }
  544. #if defined(FEATURE_MMC_RD_TUNING)
  545. } while (err && (result != MMC_ERR_READTUNEFAIL));
  546. msdc_reset_tune_counter(host);
  547. #endif
  548. msdc_set_blklen(host, 512);
  549. if (err != MMC_ERR_NONE) {
  550. return err;
  551. }
  552. *num = buf[3] | buf[2] << 8 | buf[1] << 16 | buf[0] << 24;
  553. out:
  554. return MMC_ERR_NONE;
  555. }
  556. static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
  557. {
  558. struct mmc_command cmd;
  559. int i, err = 0;
  560. cmd.opcode = MMC_CMD_SEND_OP_COND;
  561. cmd.arg = ocr;
  562. cmd.rsptyp = RESP_R3;
  563. cmd.retries = 0;
  564. cmd.timeout = CMD_TIMEOUT;
  565. for (i = 100; i; i--) {
  566. err = mmc_cmd(host, &cmd);
  567. if (err)
  568. break;
  569. /* if we're just probing, do a single pass */
  570. if (ocr == 0)
  571. break;
  572. if (cmd.resp[0] & MMC_CARD_BUSY)
  573. break;
  574. err = MMC_ERR_TIMEOUT;
  575. mdelay(10);
  576. }
  577. if (!err && rocr)
  578. *rocr = cmd.resp[0];
  579. return err;
  580. }
  581. static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
  582. {
  583. struct mmc_command cmd;
  584. int i, err = 0;
  585. cmd.opcode = SD_ACMD_SEND_OP_COND;
  586. cmd.arg = ocr;
  587. cmd.rsptyp = RESP_R3;
  588. cmd.retries = CMD_RETRIES;
  589. cmd.timeout = CMD_TIMEOUT;
  590. for (i = 100; i; i--) {
  591. err = mmc_app_cmd(host, &cmd, 0, CMD_RETRIES);
  592. if (err != MMC_ERR_NONE)
  593. break;
  594. if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0)
  595. break;
  596. err = MMC_ERR_TIMEOUT;
  597. mdelay(10);
  598. }
  599. if (rocr)
  600. *rocr = cmd.resp[0];
  601. return err;
  602. }
  603. static int mmc_all_send_cid(struct mmc_host *host, u32 *cid)
  604. {
  605. int err;
  606. struct mmc_command cmd;
  607. /* send cid */
  608. cmd.opcode = MMC_CMD_ALL_SEND_CID;
  609. cmd.arg = 0;
  610. cmd.rsptyp = RESP_R2;
  611. cmd.retries = CMD_RETRIES;
  612. cmd.timeout = CMD_TIMEOUT;
  613. err = mmc_cmd(host, &cmd);
  614. if (err != MMC_ERR_NONE)
  615. return err;
  616. memcpy(cid, cmd.resp, sizeof(u32) * 4);
  617. return MMC_ERR_NONE;
  618. }
  619. /* code size add 1KB*/
  620. static void mmc_decode_cid(struct mmc_card *card)
  621. {
  622. u32 *resp = card->raw_cid;
  623. memset(&card->cid, 0, sizeof(struct mmc_cid));
  624. card->cid.prod_name[4] = unstuff_bits(resp, 64, 8);
  625. card->cid.prod_name[3] = unstuff_bits(resp, 72, 8);
  626. card->cid.prod_name[2] = unstuff_bits(resp, 80, 8);
  627. card->cid.prod_name[1] = unstuff_bits(resp, 88, 8);
  628. card->cid.prod_name[0] = unstuff_bits(resp, 96, 8);
  629. if (mmc_card_sd(card)) {
  630. /*
  631. * SD doesn't currently have a version field so we will
  632. * have to assume we can parse this.
  633. */
  634. card->cid.month = unstuff_bits(resp, 8, 4);
  635. card->cid.year = unstuff_bits(resp, 12, 8);
  636. card->cid.serial = unstuff_bits(resp, 24, 32);
  637. card->cid.fwrev = unstuff_bits(resp, 56, 4);
  638. card->cid.hwrev = unstuff_bits(resp, 60, 4);
  639. card->cid.oemid = unstuff_bits(resp, 104, 16);
  640. card->cid.manfid = unstuff_bits(resp, 120, 8);
  641. card->cid.year += 2000; /* SD cards year offset */
  642. } else {
  643. /*
  644. * The selection of the format here is based upon published
  645. * specs from sandisk and from what people have reported.
  646. */
  647. card->cid.year = unstuff_bits(resp, 8, 4) + 1997;
  648. card->cid.month = unstuff_bits(resp, 12, 4);
  649. card->cid.prod_name[5] = unstuff_bits(resp, 56, 8);
  650. switch (card->csd.mmca_vsn) {
  651. case 0: /* MMC v1.0 - v1.2 */
  652. case 1: /* MMC v1.4 */
  653. card->cid.serial = unstuff_bits(resp, 16, 24);
  654. card->cid.fwrev = unstuff_bits(resp, 40, 4);
  655. card->cid.hwrev = unstuff_bits(resp, 44, 4);
  656. card->cid.prod_name[6] = unstuff_bits(resp, 48, 8);
  657. card->cid.manfid = unstuff_bits(resp, 104, 24);
  658. break;
  659. case 2: /* MMC v2.0 - v2.2 */
  660. case 3: /* MMC v3.1 - v3.3 */
  661. case 4: /* MMC v4 */
  662. card->cid.serial = unstuff_bits(resp, 16, 32);
  663. card->cid.oemid = unstuff_bits(resp, 104, 16);
  664. //card->cid.cbx = unstuff_bits(resp, 112, 2);
  665. card->cid.manfid = unstuff_bits(resp, 120, 8);
  666. break;
  667. default:
  668. msdc_printf("[SD%d] Unknown MMCA version %d\n",
  669. mmc_card_id(card), card->csd.mmca_vsn);
  670. break;
  671. }
  672. }
  673. }
  674. static int mmc_decode_csd(struct mmc_card *card)
  675. {
  676. struct mmc_csd *csd = &card->csd;
  677. unsigned int e, m, csd_struct;
  678. u32 *resp = card->raw_csd;
  679. /* common part; some part are updated later according to spec. */
  680. csd_struct = unstuff_bits(resp, 126, 2);
  681. csd->csd_struct = csd_struct;
  682. /* For MMC
  683. * We only understand CSD structure v1.1 and v1.2.
  684. * v1.2 has extra information in bits 15, 11 and 10.
  685. */
  686. if ( ( mmc_card_mmc(card) &&
  687. ( csd_struct != CSD_STRUCT_VER_1_0 && csd_struct != CSD_STRUCT_VER_1_1
  688. && csd_struct != CSD_STRUCT_VER_1_2 && csd_struct != CSD_STRUCT_EXT_CSD )
  689. ) ||
  690. ( mmc_card_sd(card) && ( csd_struct != 0 && csd_struct!=1 ) )
  691. ) {
  692. msdc_printf("[SD%d] Unknown CSD ver %d\n", mmc_card_id(card), csd_struct);
  693. return MMC_ERR_INVALID;
  694. }
  695. m = unstuff_bits(resp, 99, 4);
  696. e = unstuff_bits(resp, 96, 3);
  697. csd->max_dtr = tran_exp[e] * tran_mant[m];
  698. /* update later according to spec. */
  699. csd->read_blkbits = unstuff_bits(resp, 80, 4);
  700. #if !defined(FEATURE_MMC_SLIM)
  701. csd->cmdclass = unstuff_bits(resp, 84, 12);
  702. csd->read_partial = unstuff_bits(resp, 79, 1);
  703. csd->write_misalign = unstuff_bits(resp, 78, 1);
  704. csd->read_misalign = unstuff_bits(resp, 77, 1);
  705. csd->dsr = unstuff_bits(resp, 76, 1);
  706. csd->write_prot_grpsz = unstuff_bits(resp, 32, 7);
  707. csd->write_prot_grp = unstuff_bits(resp, 31, 1);
  708. csd->r2w_factor = unstuff_bits(resp, 26, 3);
  709. csd->write_blkbits = unstuff_bits(resp, 22, 4);
  710. csd->write_partial = unstuff_bits(resp, 21, 1);
  711. csd->copy = unstuff_bits(resp, 14, 1);
  712. csd->perm_wr_prot = unstuff_bits(resp, 13, 1);
  713. csd->tmp_wr_prot = unstuff_bits(resp, 12, 1);
  714. m = unstuff_bits(resp, 115, 4);
  715. e = unstuff_bits(resp, 112, 3);
  716. csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
  717. csd->tacc_clks = unstuff_bits(resp, 104, 8) * 100;
  718. #endif
  719. e = unstuff_bits(resp, 47, 3);
  720. m = unstuff_bits(resp, 62, 12);
  721. csd->capacity = (1 + m) << (e + 2);
  722. //Specific part
  723. if (mmc_card_sd(card)) {
  724. #if !defined(FEATURE_MMC_SLIM)
  725. csd->erase_blk_en = unstuff_bits(resp, 46, 1);
  726. csd->erase_sctsz = unstuff_bits(resp, 39, 7) + 1;
  727. #endif
  728. switch (csd_struct) {
  729. case 0:
  730. break;
  731. case 1:
  732. /*
  733. * This is a block-addressed SDHC card. Most
  734. * interesting fields are unused and have fixed
  735. * values. To avoid getting tripped by buggy cards,
  736. * we assume those fixed values ourselves.
  737. */
  738. mmc_card_set_blockaddr(card);
  739. m = unstuff_bits(resp, 48, 22);
  740. csd->capacity = (1 + m) << 10;
  741. csd->read_blkbits = 9;
  742. #if !defined(FEATURE_MMC_SLIM)
  743. csd->tacc_ns = 0; /* Unused */
  744. csd->tacc_clks = 0; /* Unused */
  745. csd->read_partial = 0;
  746. csd->write_misalign = 0;
  747. csd->read_misalign = 0;
  748. csd->r2w_factor = 4; /* Unused */
  749. csd->write_blkbits = 9;
  750. csd->write_partial = 0;
  751. #endif
  752. break;
  753. }
  754. } else {
  755. csd->mmca_vsn = unstuff_bits(resp, 122, 4);
  756. #if !defined(FEATURE_MMC_SLIM)
  757. csd->write_prot_grpsz = unstuff_bits(resp, 32, 5);
  758. csd->erase_sctsz = (unstuff_bits(resp, 42, 5) + 1) * (unstuff_bits(resp, 37, 5) + 1);
  759. #endif
  760. }
  761. #if MMC_DEBUG
  762. mmc_dump_csd(card);
  763. #endif
  764. return 0;
  765. }
  766. static void mmc_decode_ext_csd(struct mmc_card *card)
  767. {
  768. u8 *ext_csd = &card->raw_ext_csd[0];
  769. card->ext_csd.sectors =
  770. ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
  771. ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
  772. ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
  773. ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
  774. #if !defined(FEATURE_MMC_SLIM)
  775. card->ext_csd.rev = ext_csd[EXT_CSD_REV];
  776. card->ext_csd.hc_erase_grp_sz = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512 * 1024;
  777. card->ext_csd.hc_wp_grp_sz = ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512 * 1024;
  778. card->ext_csd.trim_tmo_ms = ext_csd[EXT_CSD_TRIM_MULT] * 300;
  779. card->ext_csd.boot_info = ext_csd[EXT_CSD_BOOT_INFO];
  780. card->ext_csd.boot_part_sz = ext_csd[EXT_CSD_BOOT_SIZE_MULT] * 128 * 1024;
  781. card->ext_csd.access_sz = (ext_csd[EXT_CSD_ACC_SIZE] & 0xf) * 512;
  782. card->ext_csd.rpmb_sz = ext_csd[EXT_CSD_RPMB_SIZE_MULT] * 128 * 1024;
  783. card->ext_csd.erased_mem_cont = ext_csd[EXT_CSD_ERASED_MEM_CONT];
  784. card->ext_csd.part_en = ext_csd[EXT_CSD_PART_SUPPORT] & EXT_CSD_PART_SUPPORT_PART_EN ? 1 : 0;
  785. card->ext_csd.enh_attr_en = ext_csd[EXT_CSD_PART_SUPPORT] & EXT_CSD_PART_SUPPORT_ENH_ATTR_EN ? 1 : 0;
  786. card->ext_csd.enh_start_addr =
  787. (ext_csd[EXT_CSD_ENH_START_ADDR + 0] |
  788. ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8 |
  789. ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16 |
  790. ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24);
  791. card->ext_csd.enh_sz =
  792. (ext_csd[EXT_CSD_ENH_SIZE_MULT + 0] |
  793. ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8 |
  794. ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) * 512 * 1024 *
  795. ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
  796. #endif
  797. if (card->ext_csd.sectors)
  798. mmc_card_set_blockaddr(card);
  799. card->ext_csd.hs_max_dtr = 0;
  800. if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS400_1_2V) ||
  801. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS400_1_8V)) {
  802. card->ext_csd.hs_max_dtr = 200000000;
  803. card->ext_csd.ddr_support = 1;
  804. card->version = EMMC_VER_50;
  805. } else if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS200_1_2V) ||
  806. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_HS200_1_8V)) {
  807. card->ext_csd.hs_max_dtr = 200000000;
  808. if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52_1_2V) ||
  809. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52)) {
  810. card->ext_csd.ddr_support = 1;
  811. }
  812. card->version = EMMC_VER_45;
  813. } else if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52_1_2V) ||
  814. (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_DDR_52)) {
  815. card->ext_csd.ddr_support = 1;
  816. card->ext_csd.hs_max_dtr = 52000000;
  817. card->version = EMMC_VER_44;
  818. } else if (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_52) {
  819. card->ext_csd.hs_max_dtr = 52000000;
  820. card->version = EMMC_VER_43;
  821. } else if ((ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_26)) {
  822. card->ext_csd.hs_max_dtr = 26000000;
  823. card->version = EMMC_VER_42;
  824. } else {
  825. /* MMC v4 spec says this cannot happen */
  826. msdc_printf("[SD%d] MMCv4 but HS unsupported\n", card->host->id);
  827. }
  828. #ifdef FEATURE_MMC_CMDQ
  829. mmc_decode_ext_csd_for_cmdq(card);
  830. #endif
  831. #ifdef MTK_EMMC_POWER_ON_WP
  832. card->ext_csd.usr_wp = ext_csd[EXT_CSD_USR_WP];
  833. card->ext_csd.boot_wp = ext_csd[EXT_CSD_BOOT_WP];
  834. //compute wp_size
  835. if (ext_csd[EXT_CSD_ERASE_GRP_DEF]&EXT_CSD_ERASE_GRP_DEF_EN) {
  836. card->wp_size = card->ext_csd.hc_erase_grp_sz * card->ext_csd.hc_wp_grp_sz >>9 ; //should be the sector size
  837. msdc_printf("EXT_CSD_ERASE_GRP_DEF is On, wp_size = %dMB\n", card->wp_size/2048);
  838. } else {
  839. card->wp_size =(card->csd.write_prot_grpsz+1) * card->csd.erase_sctsz;
  840. msdc_printf("EXT_CSD_ERASE_GRP_DEF is Off, wp_size = %dMB, csd.write_prot_grpsz = %d,csd.erase_sctsz = %d\n", card->wp_size/2048, card->csd.write_prot_grpsz, card->csd.erase_sctsz);
  841. }
  842. msdc_printf("[%s]: mmc_set_wp_size %dMB\n", __func__,card->wp_size/2048);
  843. #endif
  844. #if MMC_DEBUG
  845. mmc_dump_ext_csd(card);
  846. #endif
  847. return;
  848. }
  849. //Note: 1. Neither preloader or LK define this function
  850. #if defined(MMC_MSDC_DRV_CTP)
  851. int mmc_deselect_all_card(struct mmc_host *host)
  852. {
  853. int err;
  854. struct mmc_command cmd;
  855. cmd.opcode = MMC_CMD_SELECT_CARD;
  856. cmd.arg = 0;
  857. cmd.rsptyp = RESP_NONE;
  858. cmd.retries = CMD_RETRIES;
  859. cmd.timeout = CMD_TIMEOUT;
  860. err = mmc_cmd(host, &cmd);
  861. return err;
  862. }
  863. #endif
  864. int mmc_select_card(struct mmc_host *host, struct mmc_card *card)
  865. {
  866. int err;
  867. struct mmc_command cmd;
  868. cmd.opcode = MMC_CMD_SELECT_CARD;
  869. cmd.arg = card->rca << 16;
  870. cmd.rsptyp = RESP_R1B;
  871. cmd.retries = CMD_RETRIES;
  872. cmd.timeout = CMD_TIMEOUT;
  873. err = mmc_cmd(host, &cmd);
  874. return err;
  875. }
  876. int mmc_send_relative_addr(struct mmc_host *host, struct mmc_card *card, unsigned int *rca)
  877. {
  878. int err;
  879. struct mmc_command cmd;
  880. memset(&cmd, 0, sizeof(struct mmc_command));
  881. if (mmc_card_mmc(card)) { /* set rca */
  882. cmd.opcode = MMC_CMD_SET_RELATIVE_ADDR;
  883. cmd.arg = *rca << 16;
  884. cmd.rsptyp = RESP_R1;
  885. cmd.retries = CMD_RETRIES;
  886. cmd.timeout = CMD_TIMEOUT;
  887. } else { /* send rca */
  888. cmd.opcode = SD_CMD_SEND_RELATIVE_ADDR;
  889. cmd.arg = 0;
  890. cmd.rsptyp = RESP_R6;
  891. cmd.retries = CMD_RETRIES;
  892. cmd.timeout = CMD_TIMEOUT;
  893. }
  894. err = mmc_cmd(host, &cmd);
  895. if ((err == MMC_ERR_NONE) && !mmc_card_mmc(card))
  896. *rca = cmd.resp[0] >> 16;
  897. return err;
  898. }
  899. int mmc_send_tuning_blk(struct mmc_host *host, struct mmc_card *card, u32 *buf)
  900. {
  901. int err;
  902. struct mmc_command cmd;
  903. cmd.opcode = SD_CMD_SEND_TUNING_BLOCK;
  904. cmd.arg = 0;
  905. cmd.rsptyp = RESP_R1;
  906. cmd.retries = CMD_RETRIES;
  907. cmd.timeout = CMD_TIMEOUT;
  908. msdc_set_blknum(host, 1);
  909. msdc_set_blklen(host, 64);
  910. msdc_set_timeout(host, 100000000, 0);
  911. err = mmc_cmd(host, &cmd);
  912. if (err != MMC_ERR_NONE)
  913. goto out;
  914. err = msdc_pio_read(host, buf, 64);
  915. if (err != MMC_ERR_NONE)
  916. goto out;
  917. #if MMC_DEBUG
  918. mmc_dump_tuning_blk((u8*)buf);
  919. #endif
  920. out:
  921. return err;
  922. }
  923. int mmc_switch(struct mmc_host *host, struct mmc_card *card,
  924. u8 set, u8 index, u8 value)
  925. {
  926. int err;
  927. u32 status = 0;
  928. uint count = 0;
  929. struct mmc_command cmd;
  930. cmd.opcode = MMC_CMD_SWITCH;
  931. cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
  932. (index << 16) | (value << 8) | set;
  933. cmd.rsptyp = RESP_R1B;
  934. cmd.retries = CMD_RETRIES;
  935. cmd.timeout = CMD_TIMEOUT;
  936. err = mmc_cmd(host, &cmd);
  937. if (err != MMC_ERR_NONE)
  938. return err;
  939. do {
  940. err = mmc_send_status(host, card, &status);
  941. if (err) {
  942. msdc_printf("[SD%d] Fail to send status %d\n", host->id, err);
  943. break;
  944. }
  945. if (status & R1_SWITCH_ERROR) {
  946. msdc_printf("[SD%d] switch error. arg(0x%x)\n", host->id, cmd.arg);
  947. return MMC_ERR_FAILED;
  948. }
  949. if (count++ >= 600000) {
  950. msdc_printf("[%s]: timeout happend, count=%d, status=0x%x\n", __func__, count, status);
  951. break;
  952. }
  953. } while (!(status & R1_READY_FOR_DATA) || (R1_CURRENT_STATE(status) == 7));
  954. return err;
  955. }
  956. static int mmc_sd_switch(struct mmc_host *host,
  957. struct mmc_card *card,
  958. int mode, int group, u8 value, mmc_switch_t *resp)
  959. {
  960. int err = MMC_ERR_FAILED;
  961. int result = 0;
  962. struct mmc_command cmd;
  963. u32 *sts = (u32 *)resp;
  964. mode = !!mode;
  965. value &= 0xF;
  966. /* argument: mode[31]= 0 (for check func.) and 1 (for switch func) */
  967. cmd.opcode = SD_CMD_SWITCH;
  968. cmd.arg = mode << 31 | 0x00FFFFFF;
  969. cmd.arg &= ~(0xF << (group * 4));
  970. cmd.arg |= value << (group * 4);
  971. cmd.rsptyp = RESP_R1;
  972. cmd.retries = CMD_RETRIES;
  973. cmd.timeout = 100; /* 100ms */
  974. #if defined(FEATURE_MMC_RD_TUNING)
  975. //Note: 1. CTP does not perform tuning
  976. msdc_reset_tune_counter(host);
  977. do {
  978. #endif
  979. msdc_set_blknum(host, 1);
  980. msdc_set_blklen(host, 64);
  981. msdc_set_timeout(host, 100000000, 0);
  982. err = mmc_cmd(host, &cmd);
  983. if (err != MMC_ERR_NONE)
  984. goto out;
  985. /* 512 bits = 64 bytes = 16 words */
  986. err = msdc_pio_read(host, sts, 64);
  987. if (err != MMC_ERR_NONE) {
  988. msdc_abort_handler(host, 1);
  989. #if defined(FEATURE_MMC_RD_TUNING)
  990. result = msdc_tune_read(host);
  991. #else
  992. goto out;
  993. #endif
  994. }
  995. #if defined(FEATURE_MMC_RD_TUNING)
  996. } while (err && result != MMC_ERR_READTUNEFAIL);
  997. msdc_reset_tune_counter(host);
  998. #endif
  999. #if MMC_DEBUG
  1000. {
  1001. int i;
  1002. u8 *byte = (u8*)&sts[0];
  1003. /* Status: B0 B1 ...
  1004. * Bits : 511-504 503-495 ...
  1005. */
  1006. for (i = 0; i < 4; i++) {
  1007. MSG(RSP, " [%d-%d] %xh %xh %xh %xh\n",
  1008. ((3 - i + 1) << 7) - 1, (3 - i) << 7,
  1009. sts[(i << 2) + 0], sts[(i << 2) + 1],
  1010. sts[(i << 2) + 2], sts[(i << 2) + 3]);
  1011. }
  1012. for (i = 0; i < 8; i++) {
  1013. MSG(RSP, " [%d-%d] %xh %xh %xh %xh %xh %xh %xh %xh\n",
  1014. ((8 - i) << 6) - 1, (8 - i - 1) << 6,
  1015. byte[(i << 3) + 0], byte[(i << 3) + 1],
  1016. byte[(i << 3) + 2], byte[(i << 3) + 3],
  1017. byte[(i << 3) + 4], byte[(i << 3) + 5],
  1018. byte[(i << 3) + 6], byte[(i << 3) + 7]);
  1019. }
  1020. }
  1021. #endif
  1022. out:
  1023. return err;
  1024. }
  1025. #if defined(FEATURE_MMC_UHS1)
  1026. int mmc_ctrl_speed_class(struct mmc_host *host, u32 scc)
  1027. {
  1028. struct mmc_command cmd;
  1029. cmd.opcode = SD_CMD_SPEED_CLASS_CTRL;
  1030. cmd.arg = scc << 28;
  1031. cmd.rsptyp = RESP_R1B;
  1032. cmd.retries = CMD_RETRIES;
  1033. cmd.timeout = CMD_TIMEOUT;
  1034. return mmc_cmd(host, &cmd);
  1035. }
  1036. int mmc_switch_volt(struct mmc_host *host, struct mmc_card *card)
  1037. {
  1038. int err;
  1039. struct mmc_command cmd;
  1040. cmd.opcode = SD_CMD_VOL_SWITCH;
  1041. cmd.arg = 0;
  1042. cmd.rsptyp = RESP_R1;
  1043. cmd.retries = CMD_RETRIES;
  1044. cmd.timeout = CMD_TIMEOUT;
  1045. err = mmc_cmd(host, &cmd);
  1046. #ifndef USE_SDIO_1V8
  1047. //3.3V only device (e.g., standalone 6630 EVB) does not support voltage switch
  1048. if ( mmc_card_sdio(card) )
  1049. return err;
  1050. #endif
  1051. if (err == MMC_ERR_NONE)
  1052. err = msdc_switch_volt(host, MMC_VDD_18_19);
  1053. return err;
  1054. }
  1055. #endif
  1056. int mmc_switch_hs(struct mmc_host *host, struct mmc_card *card)
  1057. {
  1058. int err;
  1059. u8 status[64];
  1060. int val = MMC_SWITCH_MODE_SDR25;
  1061. err = mmc_sd_switch(host, card, 1, 0, val, (mmc_switch_t*)&status[0]);
  1062. if (err != MMC_ERR_NONE)
  1063. goto out;
  1064. if ((status[16] & 0xF) != 1) {
  1065. msdc_printf("[SD%d] HS mode not supported!\n", host->id);
  1066. err = MMC_ERR_FAILED;
  1067. } else {
  1068. msdc_printf("[SD%d] Switch to HS mode!\n", host->id);
  1069. mmc_card_set_highspeed(card);
  1070. }
  1071. out:
  1072. return err;
  1073. }
  1074. #if defined(FEATURE_MMC_UHS1)
  1075. int mmc_switch_uhs1(struct mmc_host *host, struct mmc_card *card, unsigned int mode)
  1076. {
  1077. int err;
  1078. u8 status[64];
  1079. int val;
  1080. const char *smode[] = { "SDR12", "SDR25", "SDR50", "SDR104", "DDR50" };
  1081. err = mmc_sd_switch(host, card, 1, 0, mode, (mmc_switch_t*)&status[0]);
  1082. if (err != MMC_ERR_NONE)
  1083. goto out;
  1084. if ((status[16] & 0xF) != mode) {
  1085. msdc_printf("[SD%d] UHS-1 %s mode not supported!\n", host->id, smode[mode]);
  1086. err = MMC_ERR_FAILED;
  1087. } else {
  1088. card->uhs_mode = mode;
  1089. mmc_card_set_uhs1(card);
  1090. msdc_printf("[SD%d] Switch to UHS-1 %s mode!\n", host->id, smode[mode]);
  1091. if (mode == MMC_SWITCH_MODE_DDR50) {
  1092. mmc_card_set_ddr(card);
  1093. }
  1094. }
  1095. out:
  1096. return err;
  1097. }
  1098. int mmc_switch_drv_type(struct mmc_host *host, struct mmc_card *card, int val)
  1099. {
  1100. int err;
  1101. u8 status[64];
  1102. const char *type[] = { "TYPE-B", "TYPE-A", "TYPE-C", "TYPE-D" };
  1103. err = mmc_sd_switch(host, card, 1, 2, val, (mmc_switch_t*)&status[0]);
  1104. if (err != MMC_ERR_NONE)
  1105. goto out;
  1106. if ((status[15] & 0xF) != val) {
  1107. msdc_printf("[SD%d] UHS-1 %s drv not supported!\n", host->id, type[val]);
  1108. err = MMC_ERR_FAILED;
  1109. } else {
  1110. msdc_printf("[SD%d] Switch to UHS-1 %s drv!\n", host->id, type[val]);
  1111. }
  1112. out:
  1113. return err;
  1114. }
  1115. int mmc_switch_max_cur(struct mmc_host *host, struct mmc_card *card, int val)
  1116. {
  1117. int err;
  1118. u8 status[64];
  1119. const char *curr[] = { "200mA", "400mA", "600mA", "800mA" };
  1120. err = mmc_sd_switch(host, card, 1, 3, val, (mmc_switch_t*)&status[0]);
  1121. if (err != MMC_ERR_NONE)
  1122. goto out;
  1123. if (((status[15] >> 4) & 0xF) != val) {
  1124. msdc_printf("[SD%d] UHS-1 %s max. current not supported!\n", host->id, curr[val]);
  1125. err = MMC_ERR_FAILED;
  1126. } else {
  1127. msdc_printf("[SD%d] Switch to UHS-1 %s max. current!\n", host->id, curr[val]);
  1128. }
  1129. out:
  1130. return err;
  1131. }
  1132. #endif
  1133. static int mmc_read_csds(struct mmc_host *host, struct mmc_card *card)
  1134. {
  1135. int err;
  1136. struct mmc_command cmd;
  1137. cmd.opcode = MMC_CMD_SEND_CSD;
  1138. cmd.arg = card->rca << 16;
  1139. cmd.rsptyp = RESP_R2;
  1140. cmd.retries = CMD_RETRIES;
  1141. cmd.timeout = CMD_TIMEOUT * 100;
  1142. err = mmc_cmd(host, &cmd);
  1143. if (err == MMC_ERR_NONE)
  1144. memcpy(&card->raw_csd, &cmd.resp[0], sizeof(u32) * 4);
  1145. return err;
  1146. }
  1147. #if !defined(FEATURE_MMC_SLIM)
  1148. static int mmc_read_scrs(struct mmc_host *host, struct mmc_card *card)
  1149. {
  1150. int err = MMC_ERR_NONE;
  1151. int result=0;
  1152. struct mmc_command cmd;
  1153. struct sd_scr *scr = &card->scr;
  1154. u32 resp[4];
  1155. u32 tmp;
  1156. u8 buf[8];
  1157. msdc_set_blknum(host, 1);
  1158. msdc_set_blklen(host, 8);
  1159. msdc_set_timeout(host, 100000000, 0);
  1160. memset(buf, 0, 8);
  1161. cmd.opcode = SD_ACMD_SEND_SCR;
  1162. cmd.arg = 0;
  1163. cmd.rsptyp = RESP_R1;
  1164. cmd.retries = CMD_RETRIES;
  1165. cmd.timeout = CMD_TIMEOUT;
  1166. #if defined(FEATURE_MMC_RD_TUNING)
  1167. msdc_reset_tune_counter(host);
  1168. do {
  1169. #endif
  1170. mmc_app_cmd(host, &cmd, card->rca, CMD_RETRIES);
  1171. if ((err != MMC_ERR_NONE) || !(cmd.resp[0] & R1_APP_CMD))
  1172. return MMC_ERR_FAILED;
  1173. /* 8 bytes = 2 words */
  1174. err = msdc_pio_read(host, (u32 *)buf, 8);
  1175. if (err != MMC_ERR_NONE) {
  1176. msdc_abort_handler(host, 1);
  1177. #if defined(FEATURE_MMC_RD_TUNING)
  1178. result = msdc_tune_read(host);
  1179. #else
  1180. return err;
  1181. #endif
  1182. }
  1183. #if defined(FEATURE_MMC_RD_TUNING)
  1184. } while (err && result != MMC_ERR_READTUNEFAIL);
  1185. msdc_reset_tune_counter(host);
  1186. #endif
  1187. if ( (err==MMC_ERR_NONE) && (result != MMC_ERR_READTUNEFAIL) ) {
  1188. memcpy(card->raw_scr, buf, 8);
  1189. }
  1190. MSG(INF, "[SD%d] SCR: %x %x (raw)\n", host->id, card->raw_scr[0], card->raw_scr[1]);
  1191. tmp = ntohl(card->raw_scr[0]);
  1192. card->raw_scr[0] = ntohl(card->raw_scr[1]);
  1193. card->raw_scr[1] = tmp;
  1194. MSG(INF, "[SD%d] SCR: %x %x (ntohl)\n", host->id, card->raw_scr[0], card->raw_scr[1]);
  1195. resp[2] = card->raw_scr[1];
  1196. resp[3] = card->raw_scr[0];
  1197. if (unstuff_bits(resp, 60, 4) != 0) {
  1198. msdc_printf("[SD%d] Unknown SCR ver %d\n",
  1199. mmc_card_id(card), unstuff_bits(resp, 60, 4));
  1200. return MMC_ERR_INVALID;
  1201. }
  1202. scr->scr_struct = unstuff_bits(resp, 60, 4);
  1203. scr->sda_vsn = unstuff_bits(resp, 56, 4);
  1204. scr->data_bit_after_erase = unstuff_bits(resp, 55, 1);
  1205. scr->security = unstuff_bits(resp, 52, 3);
  1206. scr->bus_widths = unstuff_bits(resp, 48, 4);
  1207. scr->sda_vsn3 = unstuff_bits(resp, 47, 1);
  1208. scr->ex_security = unstuff_bits(resp, 43, 4);
  1209. scr->cmd_support = unstuff_bits(resp, 32, 2);
  1210. msdc_printf("[SD%d] SD_SPEC(%d) SD_SPEC3(%d) SD_BUS_WIDTH=%d\n",
  1211. mmc_card_id(card), scr->sda_vsn, scr->sda_vsn3, scr->bus_widths);
  1212. msdc_printf("[SD%d] SD_SECU(%d) EX_SECU(%d), CMD_SUPP(%d): CMD23(%d), CMD20(%d)\n",
  1213. mmc_card_id(card), scr->security, scr->ex_security, scr->cmd_support,
  1214. (scr->cmd_support >> 1) & 0x1, scr->cmd_support & 0x1);
  1215. return err;
  1216. }
  1217. #endif
  1218. /* Read and decode extended CSD. */
  1219. int mmc_read_ext_csd(struct mmc_host *host, struct mmc_card *card)
  1220. {
  1221. int err = MMC_ERR_NONE;
  1222. u32 *ptr;
  1223. int result = MMC_ERR_NONE;
  1224. struct mmc_command cmd;
  1225. u8 buf[512];
  1226. if (card->csd.mmca_vsn < CSD_SPEC_VER_4) {
  1227. msdc_printf("[SD%d] MMCA_VSN: %d. Skip EXT_CSD\n", host->id, card->csd.mmca_vsn);
  1228. return MMC_ERR_NONE;
  1229. }
  1230. memset(buf, 0, 512); //memset(&card->raw_ext_csd[0], 0, 512);
  1231. ptr = (u32 *)buf; //ptr = (u32*)&card->raw_ext_csd[0];
  1232. cmd.opcode = MMC_CMD_SEND_EXT_CSD;
  1233. cmd.arg = 0;
  1234. cmd.rsptyp = RESP_R1;
  1235. cmd.retries = CMD_RETRIES;
  1236. cmd.timeout = CMD_TIMEOUT;
  1237. #if defined(FEATURE_MMC_RD_TUNING)
  1238. msdc_reset_tune_counter(host);
  1239. do {
  1240. #endif
  1241. msdc_set_blknum(host, 1);
  1242. msdc_set_blklen(host, 512);
  1243. msdc_set_timeout(host, 100000000, 0);
  1244. err = mmc_cmd(host, &cmd);
  1245. if (err != MMC_ERR_NONE)
  1246. goto out;
  1247. err = msdc_pio_read(host, ptr, 512);
  1248. if (err != MMC_ERR_NONE) {
  1249. host->card = card; // host->card not set will assert
  1250. msdc_abort_handler(host, 1);
  1251. #if defined(FEATURE_MMC_RD_TUNING)
  1252. result = msdc_tune_read(host);
  1253. #else
  1254. goto out;
  1255. #endif
  1256. }
  1257. #if defined(FEATURE_MMC_RD_TUNING)
  1258. } while (err && result != MMC_ERR_READTUNEFAIL);
  1259. msdc_reset_tune_counter(host);
  1260. #endif
  1261. if ( (err==MMC_ERR_NONE) && (result != MMC_ERR_READTUNEFAIL) ) {
  1262. memcpy(card->raw_ext_csd, buf, 512);
  1263. mmc_decode_ext_csd(card);
  1264. }
  1265. out:
  1266. return err;
  1267. }
  1268. /* Fetches and decodes switch information */
  1269. static int mmc_read_switch(struct mmc_host *host, struct mmc_card *card)
  1270. {
  1271. int err;
  1272. u8 status[64];
  1273. err = mmc_sd_switch(host, card, 0, 0, 1, (mmc_switch_t*)&status[0]);
  1274. if (err != MMC_ERR_NONE) {
  1275. /* Card not supporting high-speed will ignore the command. */
  1276. err = MMC_ERR_NONE;
  1277. goto out;
  1278. }
  1279. /* bit 511:480 in status[0]. bit 415:400 in status[13] */
  1280. if (status[13] & 0x01) {
  1281. msdc_printf("[SD%d] Support: Default/SDR12\n", host->id);
  1282. card->sw_caps.hs_max_dtr = 25000000; /* default or sdr12 */
  1283. }
  1284. if (status[13] & 0x02) {
  1285. msdc_printf("[SD%d] Support: HS/SDR25\n", host->id);
  1286. card->sw_caps.hs_max_dtr = 50000000; /* high-speed or sdr25 */
  1287. }
  1288. if (status[13] & 0x10) {
  1289. msdc_printf("[SD%d] Support: DDR50\n", host->id);
  1290. card->sw_caps.hs_max_dtr = 50000000; /* ddr50 */
  1291. card->sw_caps.ddr = 1;
  1292. }
  1293. #if defined(FEATURE_MMC_UHS1)
  1294. if (status[13] & 0x04) {
  1295. msdc_printf("[SD%d] Support: SDR50\n", host->id);
  1296. card->sw_caps.hs_max_dtr = 100000000; /* sdr50 */
  1297. }
  1298. if (status[13] & 0x08) {
  1299. msdc_printf("[SD%d] Support: SDR104\n", host->id);
  1300. card->sw_caps.hs_max_dtr = 208000000; /* sdr104 */
  1301. }
  1302. if (status[9] & 0x01) {
  1303. msdc_printf("[SD%d] Support: Type-B Drv\n", host->id);
  1304. }
  1305. if (status[9] & 0x02) {
  1306. msdc_printf("[SD%d] Support: Type-A Drv\n", host->id);
  1307. }
  1308. if (status[9] & 0x04) {
  1309. msdc_printf("[SD%d] Support: Type-C Drv\n", host->id);
  1310. }
  1311. if (status[9] & 0x08) {
  1312. msdc_printf("[SD%d] Support: Type-D Drv\n", host->id);
  1313. }
  1314. if (status[7] & 0x01) {
  1315. msdc_printf("[SD%d] Support: 200mA current limit\n", host->id);
  1316. }
  1317. if (status[7] & 0x02) {
  1318. msdc_printf("[SD%d] Support: 400mA current limit\n", host->id);
  1319. }
  1320. if (status[7] & 0x04) {
  1321. msdc_printf("[SD%d] Support: 600mA current limit\n", host->id);
  1322. }
  1323. if (status[7] & 0x08) {
  1324. msdc_printf("[SD%d] Support: 800mA current limit\n", host->id);
  1325. }
  1326. #endif
  1327. out:
  1328. return err;
  1329. }
  1330. #if 0
  1331. static int mmc_deselect_cards(struct mmc_host *host)
  1332. {
  1333. struct mmc_command cmd;
  1334. cmd.opcode = MMC_CMD_SELECT_CARD;
  1335. cmd.arg = 0;
  1336. cmd.rsptyp = RESP_NONE;
  1337. cmd.retries = CMD_RETRIES;
  1338. cmd.timeout = CMD_TIMEOUT;
  1339. return mmc_cmd(host, &cmd);
  1340. }
  1341. int mmc_lock_unlock(struct mmc_host *host)
  1342. {
  1343. struct mmc_command cmd;
  1344. cmd.opcode = MMC_CMD_LOCK_UNLOCK;
  1345. cmd.rsptyp = RESP_R1;
  1346. cmd.arg = 0;
  1347. cmd.retries = 3;
  1348. cmd.timeout = CMD_TIMEOUT;
  1349. return mmc_cmd(host, &cmd);
  1350. }
  1351. #endif
  1352. int mmc_set_write_prot(struct mmc_host *host, u32 addr)
  1353. {
  1354. struct mmc_command cmd;
  1355. if (!(host->card->csd.cmdclass & CCC_WRITE_PROT))
  1356. return MMC_ERR_INVALID;
  1357. cmd.opcode = MMC_CMD_SET_WRITE_PROT;
  1358. cmd.rsptyp = RESP_R1B;
  1359. cmd.arg = addr;
  1360. cmd.retries = 3;
  1361. cmd.timeout = CMD_TIMEOUT;
  1362. return mmc_cmd(host, &cmd);
  1363. }
  1364. int mmc_clr_write_prot(struct mmc_card *card, u32 addr)
  1365. {
  1366. struct mmc_command cmd;
  1367. if (!(card->csd.cmdclass & CCC_WRITE_PROT))
  1368. return MMC_ERR_INVALID;
  1369. cmd.opcode = MMC_CMD_CLR_WRITE_PROT;
  1370. cmd.rsptyp = RESP_R1B;
  1371. cmd.arg = addr;
  1372. cmd.retries = 3;
  1373. cmd.timeout = CMD_TIMEOUT;
  1374. return mmc_cmd(card->host, &cmd);
  1375. }
  1376. //Note: 1. LK undefine this function
  1377. //SDHC and SDXC does not support this command
  1378. int mmc_send_write_prot(struct mmc_card *card, u32 wp_addr, u32 *wp_status)
  1379. {
  1380. int err;
  1381. struct mmc_command cmd;
  1382. struct mmc_host *host = card->host;
  1383. u8 *buf = (u8*)wp_status;
  1384. if (!(card->csd.cmdclass & CCC_WRITE_PROT))
  1385. return MMC_ERR_INVALID;
  1386. cmd.opcode = MMC_CMD_SEND_WRITE_PROT;
  1387. cmd.rsptyp = RESP_R1;
  1388. cmd.arg = wp_addr;
  1389. cmd.retries = 3;
  1390. cmd.timeout = CMD_TIMEOUT;
  1391. msdc_set_blknum(host, 1);
  1392. msdc_set_blklen(host, 4);
  1393. msdc_set_timeout(host, 100000000, 0);
  1394. err = mmc_cmd(host, &cmd);
  1395. if (err != MMC_ERR_NONE)
  1396. goto out;
  1397. err = msdc_pio_read(host, (u32*)buf, 4);
  1398. if (err != MMC_ERR_NONE)
  1399. goto out;
  1400. out:
  1401. return err;
  1402. }
  1403. int mmc_erase_start(struct mmc_card *card, u64 addr)
  1404. {
  1405. struct mmc_command cmd;
  1406. if (!(card->csd.cmdclass & CCC_ERASE)) {
  1407. msdc_printf("[SD%d] Card doesn't support Erase commands\n", card->host->id);
  1408. return MMC_ERR_INVALID;
  1409. }
  1410. if (mmc_card_highcaps(card))
  1411. addr /= MMC_BLOCK_SIZE; /* in sector unit */
  1412. if (mmc_card_mmc(card)) {
  1413. cmd.opcode = MMC_CMD_ERASE_GROUP_START;
  1414. } else {
  1415. cmd.opcode = MMC_CMD_ERASE_WR_BLK_START;
  1416. }
  1417. cmd.rsptyp = RESP_R1;
  1418. cmd.arg = addr;
  1419. cmd.retries = 3;
  1420. cmd.timeout = CMD_TIMEOUT;
  1421. return mmc_cmd(card->host, &cmd);
  1422. }
  1423. int mmc_erase_end(struct mmc_card *card, u64 addr)
  1424. {
  1425. struct mmc_command cmd;
  1426. if (!(card->csd.cmdclass & CCC_ERASE)) {
  1427. msdc_printf("[SD%d] Erase isn't supported\n", card->host->id);
  1428. return MMC_ERR_INVALID;
  1429. }
  1430. if (mmc_card_highcaps(card))
  1431. addr /= MMC_BLOCK_SIZE; /* in sector unit */
  1432. if (mmc_card_mmc(card)) {
  1433. cmd.opcode = MMC_CMD_ERASE_GROUP_END;
  1434. } else {
  1435. cmd.opcode = MMC_CMD_ERASE_WR_BLK_END;
  1436. }
  1437. cmd.rsptyp = RESP_R1;
  1438. cmd.arg = addr;
  1439. cmd.retries = 3;
  1440. cmd.timeout = CMD_TIMEOUT;
  1441. return mmc_cmd(card->host, &cmd);
  1442. }
  1443. int mmc_erase(struct mmc_card *card, u32 arg)
  1444. {
  1445. int err;
  1446. u32 status;
  1447. struct mmc_command cmd;
  1448. if (!(card->csd.cmdclass & CCC_ERASE)) {
  1449. msdc_printf("[SD%d] Erase isn't supported\n", card->host->id);
  1450. return MMC_ERR_INVALID;
  1451. }
  1452. if (arg & MMC_ERASE_SECURE_REQ) {
  1453. if (!(card->raw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] &
  1454. EXT_CSD_SEC_FEATURE_ER_EN)) {
  1455. return MMC_ERR_INVALID;
  1456. }
  1457. }
  1458. if ((arg & MMC_ERASE_GC_REQ) || (arg & MMC_ERASE_TRIM)) {
  1459. if (!(card->raw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] &
  1460. EXT_CSD_SEC_FEATURE_GB_CL_EN)) {
  1461. return MMC_ERR_INVALID;
  1462. }
  1463. }
  1464. cmd.opcode = MMC_CMD_ERASE;
  1465. cmd.rsptyp = RESP_R1B;
  1466. cmd.arg = arg;
  1467. cmd.retries = 3;
  1468. cmd.timeout = CMD_TIMEOUT;
  1469. err = mmc_cmd(card->host, &cmd);
  1470. if (!err) {
  1471. do {
  1472. err = mmc_send_status(card->host, card, &status);
  1473. if (err) break;
  1474. #if MMC_DEBUG
  1475. mmc_dump_card_status(status);
  1476. #endif
  1477. if (R1_STATUS(status) != 0) break;
  1478. } while (R1_CURRENT_STATE(status) == 7);
  1479. }
  1480. return err;
  1481. }
  1482. #if defined(FEATURE_MMC_UHS1)
  1483. int mmc_tune_timing(struct mmc_host *host, struct mmc_card *card)
  1484. {
  1485. int err = MMC_ERR_NONE;
  1486. if (mmc_card_sd(card) && mmc_card_uhs1(card) && !mmc_card_ddr(card)) {
  1487. err = msdc_tune_uhs1(host, card);
  1488. } else if (mmc_card_mmc(card) && mmc_card_hs200(card)) {
  1489. err = msdc_tune_hs200(host, card);
  1490. } else if (mmc_card_mmc(card) && mmc_card_hs400(card)) {
  1491. err = msdc_tune_hs400(host, card);
  1492. }
  1493. return err;
  1494. }
  1495. #endif
  1496. u32 mmc_get_wpg_size(struct mmc_card *card)
  1497. {
  1498. u32 size;
  1499. u8 *ext_csd;
  1500. if (mmc_card_mmc(card)) {
  1501. ext_csd = &card->raw_ext_csd[0];
  1502. if ((ext_csd[EXT_CSD_ERASE_GRP_DEF] & EXT_CSD_ERASE_GRP_DEF_EN)
  1503. && (ext_csd[EXT_CSD_HC_WP_GPR_SIZE] > 0)) {
  1504. size = 512 * 1024 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
  1505. ext_csd[EXT_CSD_HC_WP_GPR_SIZE];
  1506. } else {
  1507. size = card->csd.write_prot_grpsz;
  1508. }
  1509. } else {
  1510. if (card->csd.write_prot_grp) {
  1511. /* SDSC could support write protect group */
  1512. size = (card->csd.write_prot_grpsz + 1) * (1 << card->csd.write_blkbits);
  1513. } else {
  1514. /* SDHC and SDXC don't support write protect group */
  1515. size = 0;
  1516. }
  1517. }
  1518. return size;
  1519. }
  1520. #if defined(MMC_MSDC_DRV_CTP)
  1521. /* need reset some register while switch to hs400 mode with emmc50 */
  1522. int mmc_register_partial_reset(struct mmc_host* host)
  1523. {
  1524. if (host->id != 0) {
  1525. return 1;
  1526. }
  1527. /* back up, then reset to default value */
  1528. msdc_register_partial_backup_and_reset(host);
  1529. return 0;
  1530. }
  1531. int mmc_register_partial_restore(struct mmc_host* host)
  1532. {
  1533. if (host->id != 0) {
  1534. return 1;
  1535. }
  1536. /* back up, then reset to default value */
  1537. msdc_register_partial_restore(host);
  1538. return 0;
  1539. }
  1540. #endif
  1541. void mmc_switch_card_timing(struct mmc_host *host, unsigned int clkhz)
  1542. {
  1543. int id = host->id;
  1544. struct mmc_card *card = host->card;
  1545. int result = 0;
  1546. if (card && mmc_card_mmc(card)) {
  1547. if ((clkhz > 52000000) && (host->caps & MMC_CAP_EMMC_HS400)) {
  1548. if ((mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) &&
  1549. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8_DDR) == MMC_ERR_NONE) &&
  1550. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 3) == MMC_ERR_NONE)) {
  1551. msdc_printf("[SD%d] Switch to HS400 mode!\n", id);
  1552. mmc_card_clr_speed_mode(card);
  1553. mmc_card_set_hs400(card);
  1554. /* hs400 used ddr mode */
  1555. mmc_card_set_ddr(card);
  1556. } else {
  1557. result = -__LINE__;
  1558. goto failure;
  1559. }
  1560. } else if ((clkhz > 52000000) && (host->caps & MMC_CAP_EMMC_HS200)) {
  1561. if ((mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) &&
  1562. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8) == MMC_ERR_NONE) &&
  1563. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 2) == MMC_ERR_NONE)) {
  1564. msdc_printf("[SD%d] Switch to HS200 mode!\n", id);
  1565. mmc_card_clr_speed_mode(card);
  1566. mmc_card_set_hs200(card);
  1567. /*if ddr enable, disable it */
  1568. if (host->caps & MMC_CAP_DDR) {
  1569. host->caps &= ~MMC_CAP_DDR;
  1570. mmc_card_clr_ddr(card);
  1571. }
  1572. } else {
  1573. result = -__LINE__;
  1574. goto failure;
  1575. }
  1576. } else if ((clkhz > 26000000) && (clkhz <= 52000000) && (host->caps & MMC_CAP_DDR)) {
  1577. if ((mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) &&
  1578. (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8_DDR) == MMC_ERR_NONE)) {
  1579. msdc_printf("[SD%d] Switch to DDR50 mode!\n", id);
  1580. mmc_card_clr_speed_mode(card);
  1581. mmc_card_set_highspeed(card);
  1582. mmc_card_set_ddr(card);
  1583. } else {
  1584. result = -__LINE__;
  1585. goto failure;
  1586. }
  1587. } else if ((clkhz > 26000000) && (host->caps & MMC_CAP_MMC_HIGHSPEED)) {
  1588. if (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1) == MMC_ERR_NONE) {
  1589. msdc_printf("[SD%d] Switch to High-Speed mode!\n", id);
  1590. mmc_card_clr_speed_mode(card);
  1591. mmc_card_set_highspeed(card);
  1592. } else {
  1593. result = -__LINE__;
  1594. goto failure;
  1595. }
  1596. } else if (clkhz > 0) {
  1597. if (mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 0) == MMC_ERR_NONE) {
  1598. msdc_printf("[SD%d] Switch to Default mode!\n", id);
  1599. mmc_card_clr_speed_mode(card);
  1600. mmc_card_set_backyard(card);
  1601. } else {
  1602. result = -__LINE__;
  1603. goto failure;
  1604. }
  1605. }
  1606. }
  1607. #if defined(MMC_MSDC_DRV_CTP)
  1608. else if (card && mmc_card_sd(card) && (card->version > SD_VER_10)) {
  1609. int uhsmode = 0;
  1610. if ((clkhz > 100000000) && (host->caps & MMC_CAP_SD_UHS1)) {
  1611. uhsmode = MMC_SWITCH_MODE_SDR104;
  1612. } else if (clkhz > 50000000) {
  1613. if (card->sw_caps.ddr && msdc_cap[id].flags & MSDC_DDR) {
  1614. uhsmode = MMC_SWITCH_MODE_DDR50;
  1615. } else {
  1616. uhsmode = MMC_SWITCH_MODE_SDR50;
  1617. }
  1618. } else if ((clkhz > 25000000) && (host->caps & MMC_CAP_SD_HIGHSPEED)) {
  1619. uhsmode = MMC_SWITCH_MODE_SDR25;
  1620. /*if ddr enable, disable it */
  1621. if (host->caps & MMC_CAP_DDR) {
  1622. host->caps &= ~MMC_CAP_DDR;
  1623. mmc_card_clr_ddr(card);
  1624. }
  1625. } else if (clkhz > 0) {
  1626. uhsmode = MMC_SWITCH_MODE_SDR12;
  1627. }
  1628. if (mmc_switch_uhs1(host, card, uhsmode) != 0) {
  1629. result = -__LINE__;
  1630. goto failure;
  1631. }
  1632. }
  1633. #endif
  1634. failure:
  1635. if (result)
  1636. msdc_printf("[%s]: result=%d\n", __func__, result);
  1637. return;
  1638. }
  1639. void mmc_set_clock(struct mmc_host *host, int ddr, u32 hz)
  1640. {
  1641. unsigned int hs_timing = 0;
  1642. if (hz >= host->f_max) {
  1643. hz = host->f_max;
  1644. } else if (hz < host->f_min) {
  1645. hz = host->f_min;
  1646. }
  1647. //mmc_switch_card_timing(host, hz);
  1648. if (host->card && mmc_card_hs400(host->card)) {
  1649. hs_timing |= EXT_CSD_HS_TIMEING_HS400;
  1650. }
  1651. if (host->card) {
  1652. if (mmc_card_ddr(host->card) && (host->caps & MMC_CAP_DDR))
  1653. ddr = 1;
  1654. else
  1655. ddr = 0;
  1656. }
  1657. msdc_config_clock(host, ddr, hz, hs_timing);
  1658. }
  1659. int mmc_set_ext_csd(struct mmc_card *card, uint8 addr, uint8 value)
  1660. {
  1661. int err;
  1662. u8 *ext_csd;
  1663. /* can't write */
  1664. if (192 <= addr || !card || !mmc_card_mmc(card))
  1665. return MMC_ERR_INVALID;
  1666. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL, addr, value);
  1667. if (err == MMC_ERR_NONE) {
  1668. err = mmc_read_ext_csd(card->host, card);
  1669. if (err == MMC_ERR_NONE) {
  1670. ext_csd = &card->raw_ext_csd[0];
  1671. if (ext_csd[addr] != value)
  1672. err = MMC_ERR_FAILED;
  1673. }
  1674. }
  1675. return err;
  1676. }
  1677. int mmc_set_card_detect(struct mmc_host *host, struct mmc_card *card, int connect)
  1678. {
  1679. int err;
  1680. struct mmc_command cmd;
  1681. cmd.opcode = SD_ACMD_SET_CLR_CD;
  1682. cmd.arg = connect;
  1683. cmd.rsptyp = RESP_R1; /* CHECKME */
  1684. cmd.retries = CMD_RETRIES;
  1685. cmd.timeout = CMD_TIMEOUT;
  1686. err = mmc_app_cmd(host, &cmd, card->rca, CMD_RETRIES);
  1687. return err;
  1688. }
  1689. int mmc_set_blk_length(struct mmc_host *host, u32 blklen)
  1690. {
  1691. int err;
  1692. struct mmc_command cmd;
  1693. /* set block len */
  1694. cmd.opcode = MMC_CMD_SET_BLOCKLEN;
  1695. cmd.rsptyp = RESP_R1;
  1696. cmd.arg = blklen;
  1697. cmd.retries = 3;
  1698. cmd.timeout = CMD_TIMEOUT;
  1699. err = mmc_cmd(host, &cmd);
  1700. if (err == MMC_ERR_NONE)
  1701. msdc_set_blklen(host, blklen);
  1702. return err;
  1703. }
  1704. #if defined(MMC_MSDC_DRV_CTP)
  1705. int mmc_set_blk_count(struct mmc_host *host, u32 blkcnt)
  1706. {
  1707. int err;
  1708. struct mmc_command cmd;
  1709. /* set block count */
  1710. cmd.opcode = MMC_CMD_SET_BLOCK_COUNT;
  1711. cmd.rsptyp = RESP_R1;
  1712. cmd.arg = blkcnt; /* bit31 is for reliable write request */
  1713. #if MSDC_USE_DATA_TAG
  1714. cmd.arg |= (1 << 29);
  1715. cmd.arg &= ~(1 << 30);
  1716. #endif
  1717. #if MSDC_USE_RELIABLE_WRITE
  1718. cmd.arg |= (1 << 31);
  1719. cmd.arg &= ~(1 << 30);
  1720. #endif
  1721. #if MSDC_USE_FORCE_FLUSH
  1722. cmd.arg |= (1 << 24);
  1723. cmd.arg &= ~(1 << 30);
  1724. #endif
  1725. #if MSDC_USE_PACKED_CMD
  1726. cmd.arg &= ~0xffff;
  1727. cmd.arg |= (1 << 30);
  1728. #endif
  1729. cmd.retries = 3;
  1730. cmd.timeout = CMD_TIMEOUT;
  1731. err = mmc_cmd(host, &cmd);
  1732. return err;
  1733. }
  1734. #endif
  1735. int mmc_set_bus_width(struct mmc_host *host, struct mmc_card *card, int width)
  1736. {
  1737. int err = MMC_ERR_NONE;
  1738. u32 arg = 0;
  1739. struct mmc_command cmd;
  1740. if (mmc_card_sd(card)) {
  1741. if (width == HOST_BUS_WIDTH_8) {
  1742. WARN_ON(width == HOST_BUS_WIDTH_8);
  1743. arg = SD_BUS_WIDTH_4;
  1744. width = HOST_BUS_WIDTH_4;
  1745. }
  1746. if ((width == HOST_BUS_WIDTH_4) && (host->caps & MMC_CAP_4_BIT_DATA)) {
  1747. arg = SD_BUS_WIDTH_4;
  1748. } else {
  1749. arg = SD_BUS_WIDTH_1;
  1750. width = HOST_BUS_WIDTH_1;
  1751. }
  1752. cmd.opcode = SD_ACMD_SET_BUSWIDTH;
  1753. cmd.arg = arg;
  1754. cmd.rsptyp = RESP_R1;
  1755. cmd.retries = CMD_RETRIES;
  1756. cmd.timeout = CMD_TIMEOUT;
  1757. err = mmc_app_cmd(host, &cmd, card->rca, 0);
  1758. if (err != MMC_ERR_NONE)
  1759. goto out;
  1760. msdc_config_bus(host, width);
  1761. } else if (mmc_card_mmc(card)) {
  1762. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1763. goto out;
  1764. if (width == HOST_BUS_WIDTH_8) {
  1765. if (host->caps & MMC_CAP_8_BIT_DATA) {
  1766. /* need make sure card current bus mode */
  1767. if (mmc_card_hs400(card)) {
  1768. arg = (host->caps & MMC_CAP_EMMC_HS400) ?
  1769. EXT_CSD_BUS_WIDTH_8_DDR : EXT_CSD_BUS_WIDTH_8;
  1770. } else if (mmc_card_highspeed(card)) {
  1771. arg = ((host->caps & MMC_CAP_DDR) && card->ext_csd.ddr_support) ?
  1772. EXT_CSD_BUS_WIDTH_8_DDR : EXT_CSD_BUS_WIDTH_8;
  1773. } else if (mmc_card_hs200(card) || mmc_card_backyard(card)) {
  1774. arg = EXT_CSD_BUS_WIDTH_8;
  1775. } else {
  1776. width = HOST_BUS_WIDTH_4;
  1777. }
  1778. } else {
  1779. width = HOST_BUS_WIDTH_4;
  1780. }
  1781. }
  1782. if (width == HOST_BUS_WIDTH_4) {
  1783. if (host->caps & MMC_CAP_4_BIT_DATA) {
  1784. /* need make sure card current bus mode */
  1785. if (mmc_card_hs400(card)) {
  1786. arg = (host->caps & MMC_CAP_EMMC_HS400) ?
  1787. EXT_CSD_BUS_WIDTH_8_DDR : EXT_CSD_BUS_WIDTH_8;
  1788. } else if (mmc_card_highspeed(card)) {
  1789. arg = ((host->caps & MMC_CAP_DDR) && card->ext_csd.ddr_support) ?
  1790. EXT_CSD_BUS_WIDTH_4_DDR : EXT_CSD_BUS_WIDTH_4;
  1791. } else if (mmc_card_hs200(card) || mmc_card_backyard(card)) {
  1792. arg = EXT_CSD_BUS_WIDTH_4;
  1793. } else {
  1794. width = HOST_BUS_WIDTH_1;
  1795. }
  1796. } else {
  1797. width = HOST_BUS_WIDTH_1;
  1798. }
  1799. }
  1800. if (width == HOST_BUS_WIDTH_1)
  1801. arg = EXT_CSD_BUS_WIDTH_1;
  1802. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, arg);
  1803. if (err != MMC_ERR_NONE) {
  1804. msdc_printf("[SD%d] Switch to bus width(%d) failed\n", host->id, arg);
  1805. goto out;
  1806. }
  1807. if (arg == EXT_CSD_BUS_WIDTH_8_DDR || arg == EXT_CSD_BUS_WIDTH_4_DDR) {
  1808. mmc_card_set_ddr(card);
  1809. } else {
  1810. mmc_card_clr_ddr(card);
  1811. }
  1812. mmc_set_clock(host, mmc_card_ddr(card), host->cur_bus_clk);
  1813. msdc_config_bus(host, width);
  1814. } else {
  1815. BUG_ON(1); /* card is not recognized */
  1816. }
  1817. out:
  1818. #if 0
  1819. if (mmc_card_sd(card)) {
  1820. msdc_printf("[info][%s %d] switch to %dbit bus width, arg=0x%x, err = %d\n", __func__, __LINE__, (arg == SD_BUS_WIDTH_4) ? 4 : 1, arg, err);
  1821. } else {
  1822. switch (arg) {
  1823. case EXT_CSD_BUS_WIDTH_1:
  1824. msdc_printf("[info][%s %d] switch to 1bit bus width, err = %d\n", __func__, __LINE__, err);
  1825. break;
  1826. case EXT_CSD_BUS_WIDTH_4:
  1827. msdc_printf("[info][%s %d] switch to 4bit bus width, err = %d\n", __func__, __LINE__, err);
  1828. break;
  1829. case EXT_CSD_BUS_WIDTH_8:
  1830. msdc_printf("[info][%s %d] switch to 8bit bus width, err = %d\n", __func__, __LINE__, err);
  1831. break;
  1832. case EXT_CSD_BUS_WIDTH_4_DDR:
  1833. msdc_printf("[info][%s %d] switch to 4bit bus width(DDR), err = %d\n", __func__, __LINE__, err);
  1834. break;
  1835. case EXT_CSD_BUS_WIDTH_8_DDR:
  1836. msdc_printf("[info][%s %d] switch to 8bit bus width(DDR), err = %d\n", __func__, __LINE__, err);
  1837. break;
  1838. default:
  1839. msdc_printf("[info][%s %d] switch to ?bit bus width(DDR), err = %d\n", __func__, __LINE__, err);
  1840. break;
  1841. }
  1842. }
  1843. #endif
  1844. return err;
  1845. }
  1846. int mmc_set_erase_grp_def(struct mmc_card *card, int enable)
  1847. {
  1848. int err = MMC_ERR_FAILED;
  1849. if (mmc_card_sd(card) || !mmc_card_highcaps(card))
  1850. goto out;
  1851. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1852. goto out;
  1853. err = mmc_set_ext_csd(card, EXT_CSD_ERASE_GRP_DEF,
  1854. EXT_CSD_ERASE_GRP_DEF_EN & enable);
  1855. out:
  1856. return err;
  1857. }
  1858. int mmc_set_gp_size(struct mmc_card *card, u8 id, u32 size)
  1859. {
  1860. int i;
  1861. int err = MMC_ERR_FAILED;
  1862. u8 gp[] = { EXT_CSD_GP1_SIZE_MULT, EXT_CSD_GP2_SIZE_MULT,
  1863. EXT_CSD_GP3_SIZE_MULT, EXT_CSD_GP4_SIZE_MULT
  1864. };
  1865. u8 arg;
  1866. u8 *ext_csd = &card->raw_ext_csd[0];
  1867. if (mmc_card_sd(card) || !mmc_card_highcaps(card))
  1868. goto out;
  1869. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1870. goto out;
  1871. id--;
  1872. size /= 512 * 1024;
  1873. size /= (ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  1874. /* 143-144: GP_SIZE_MULT_X_0-GP_SIZE_MULT_X_2 */
  1875. for (i = 0; i < 3; i++) {
  1876. arg = (u8)(size & 0xFF);
  1877. size = size >> 8;
  1878. err = mmc_set_ext_csd(card, gp[id] + i, arg);
  1879. if (err)
  1880. goto out;
  1881. }
  1882. out:
  1883. return err;
  1884. }
  1885. int mmc_set_enh_size(struct mmc_card *card, u32 size)
  1886. {
  1887. int i;
  1888. int err = MMC_ERR_FAILED;
  1889. u8 arg;
  1890. u8 *ext_csd = &card->raw_ext_csd[0];
  1891. if (mmc_card_sd(card) || !mmc_card_highcaps(card))
  1892. goto out;
  1893. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1894. goto out;
  1895. /* need to set ERASE_GRP_DEF first?? */
  1896. if (0 == (card->raw_ext_csd[EXT_CSD_ERASE_GRP_DEF] & EXT_CSD_ERASE_GRP_DEF_EN))
  1897. goto out;
  1898. size /= (512 * 1024);
  1899. size /= (ext_csd[EXT_CSD_HC_WP_GPR_SIZE] * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]);
  1900. /* 140-142: ENH_SIZE_MULT0-ENH_SIZE_MULT2 */
  1901. for (i = 0; i < 3; i++) {
  1902. arg = (u8)(size & 0xFF);
  1903. size = size >> 8;
  1904. err = mmc_set_ext_csd(card, EXT_CSD_ENH_SIZE_MULT + i, arg);
  1905. if (err)
  1906. goto out;
  1907. }
  1908. out:
  1909. return err;
  1910. }
  1911. int mmc_set_enh_start_addr(struct mmc_card *card, u32 addr)
  1912. {
  1913. int i;
  1914. int err = MMC_ERR_FAILED;
  1915. u8 arg;
  1916. if (mmc_card_sd(card))
  1917. goto out;
  1918. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1919. goto out;
  1920. /* need to set ERASE_GRP_DEF first?? */
  1921. if (0 == (card->raw_ext_csd[EXT_CSD_ERASE_GRP_DEF] & EXT_CSD_ERASE_GRP_DEF_EN))
  1922. goto out;
  1923. /* start address would be round to protect group aligned. */
  1924. if (mmc_card_highcaps(card))
  1925. addr = addr / 512; /* in sector unit. otherwise in byte unit */
  1926. /* 136-139: ENH_START_ADDR0-ENH_START_ADDR3 */
  1927. for (i = 0; i < 4; i++) {
  1928. arg = (u8)(addr & 0xFF);
  1929. addr = addr >> 8;
  1930. err = mmc_set_ext_csd(card, EXT_CSD_ENH_START_ADDR + i, arg);
  1931. if (err)
  1932. goto out;
  1933. }
  1934. out:
  1935. return err;
  1936. }
  1937. int mmc_set_boot_bus(struct mmc_card *card, u8 rst_bwidth, u8 mode, u8 bwidth)
  1938. {
  1939. int err = MMC_ERR_FAILED;
  1940. u8 arg;
  1941. if (mmc_card_sd(card))
  1942. goto out;
  1943. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1944. goto out;
  1945. arg = mode | rst_bwidth | bwidth;
  1946. err = mmc_set_ext_csd(card, EXT_CSD_BOOT_BUS_WIDTH, arg);
  1947. out:
  1948. return err;
  1949. }
  1950. int mmc_set_part_config(struct mmc_card *card, u8 cfg)
  1951. {
  1952. int err = MMC_ERR_FAILED;
  1953. if (mmc_card_sd(card))
  1954. goto out;
  1955. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1956. goto out;
  1957. err = mmc_set_ext_csd(card, EXT_CSD_PART_CFG, cfg);
  1958. out:
  1959. return err;
  1960. }
  1961. int mmc_set_part_attr(struct mmc_card *card, u8 attr)
  1962. {
  1963. int err = MMC_ERR_FAILED;
  1964. if (mmc_card_sd(card))
  1965. goto out;
  1966. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1967. goto out;
  1968. if (!card->ext_csd.enh_attr_en) {
  1969. err = MMC_ERR_INVALID;
  1970. goto out;
  1971. }
  1972. attr &= 0x1F;
  1973. attr |= (card->raw_ext_csd[EXT_CSD_PART_ATTR] & 0x1F);
  1974. err = mmc_set_ext_csd(card, EXT_CSD_PART_ATTR, attr);
  1975. out:
  1976. return err;
  1977. }
  1978. int mmc_set_part_compl(struct mmc_card *card)
  1979. {
  1980. int err = MMC_ERR_FAILED;
  1981. if (mmc_card_sd(card))
  1982. goto out;
  1983. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1984. goto out;
  1985. err = mmc_set_ext_csd(card, EXT_CSD_PART_SET_COMPL,
  1986. EXT_CSD_PART_SET_COMPL_BIT);
  1987. out:
  1988. return err;
  1989. }
  1990. #if defined(MMC_MSDC_DRV_CTP)
  1991. int mmc_set_reset_func(struct mmc_card *card, u8 enable)
  1992. {
  1993. int err = MMC_ERR_FAILED;
  1994. u8 *ext_csd = &card->raw_ext_csd[0];
  1995. if (mmc_card_sd(card))
  1996. goto out;
  1997. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  1998. goto out;
  1999. if (ext_csd[EXT_CSD_RST_N_FUNC] == 0) {
  2000. err = mmc_set_ext_csd(card, EXT_CSD_RST_N_FUNC, enable);
  2001. } else {
  2002. /* no need set */
  2003. return MMC_ERR_NONE;
  2004. }
  2005. out:
  2006. return err;
  2007. }
  2008. int mmc_boot_config(struct mmc_card *card, u8 acken, u8 enpart, u8 buswidth, u8 busmode)
  2009. {
  2010. int err = MMC_ERR_FAILED;
  2011. u8 val;
  2012. u8 rst_bwidth = 0;
  2013. u8 *ext_csd = &card->raw_ext_csd[0];
  2014. if (mmc_card_sd(card) || card->csd.mmca_vsn < CSD_SPEC_VER_4 ||
  2015. !card->ext_csd.boot_info || card->ext_csd.rev < 3)
  2016. goto out;
  2017. if (card->ext_csd.rev > 3 && !card->ext_csd.part_en)
  2018. goto out;
  2019. /* configure boot partition */
  2020. val = acken | enpart | (ext_csd[EXT_CSD_PART_CFG] & 0x7);
  2021. err = mmc_set_part_config(card, val);
  2022. if (err != MMC_ERR_NONE)
  2023. goto out;
  2024. /* update ext_csd information */
  2025. ext_csd[EXT_CSD_PART_CFG] = val;
  2026. /* configure boot bus mode and width */
  2027. rst_bwidth = ((buswidth == EXT_CSD_BOOT_BUS_WIDTH_1) ? 0 : 1) << 2;
  2028. msdc_printf("=====Set boot Bus Width<%d>=======\n",buswidth);
  2029. msdc_printf("=====Set boot Bus mode<%d>=======\n",busmode);
  2030. err = mmc_set_boot_bus(card, rst_bwidth, busmode, buswidth);
  2031. out:
  2032. return err;
  2033. }
  2034. #if defined(FEATURE_MMC_BOOT_MODE)
  2035. int mmc_part_read(struct mmc_card *card, u8 partno, unsigned long blknr, u32 blkcnt, unsigned long *dst)
  2036. {
  2037. int err = MMC_ERR_FAILED;
  2038. u8 val;
  2039. u8 *ext_csd = &card->raw_ext_csd[0];
  2040. struct mmc_host *host = card->host;
  2041. if (mmc_card_sd(card) || card->csd.mmca_vsn < CSD_SPEC_VER_4 ||
  2042. !card->ext_csd.boot_info || card->ext_csd.rev < 3)
  2043. goto out;
  2044. if (card->ext_csd.rev > 3 && !card->ext_csd.part_en)
  2045. goto out;
  2046. /* configure to specified partition */
  2047. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | (partno & 0x7);
  2048. err = mmc_set_part_config(card, val);
  2049. if (err != MMC_ERR_NONE)
  2050. goto out;
  2051. /* write block to this partition */
  2052. err = mmc_block_read(host->id, blknr, blkcnt, dst);
  2053. out:
  2054. /* configure to user partition */
  2055. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | EXT_CSD_PART_CFG_DEFT_PART;
  2056. mmc_set_part_config(card, val);
  2057. return err;
  2058. }
  2059. int mmc_part_write(struct mmc_card *card, u8 partno, unsigned long blknr, u32 blkcnt, unsigned long *src)
  2060. {
  2061. int err = MMC_ERR_FAILED;
  2062. u8 val;
  2063. u8 *ext_csd = &card->raw_ext_csd[0];
  2064. struct mmc_host *host = card->host;
  2065. if (mmc_card_sd(card) || card->csd.mmca_vsn < CSD_SPEC_VER_4 ||
  2066. !card->ext_csd.boot_info || card->ext_csd.rev < 3)
  2067. goto out;
  2068. if (card->ext_csd.rev > 3 && !card->ext_csd.part_en)
  2069. goto out;
  2070. /* configure to specified partition */
  2071. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | (partno & 0x7);
  2072. err = mmc_set_part_config(card, val);
  2073. if (err != MMC_ERR_NONE)
  2074. goto out;
  2075. /* write block to this partition */
  2076. err = mmc_block_write(host->id, blknr, blkcnt, src);
  2077. out:
  2078. /* configure to user partition */
  2079. val = (ext_csd[EXT_CSD_PART_CFG] & ~0x7) | EXT_CSD_PART_CFG_DEFT_PART;
  2080. mmc_set_part_config(card, val);
  2081. return err;
  2082. }
  2083. #endif
  2084. #endif
  2085. #ifdef MTK_EMMC_POWER_ON_WP
  2086. int mmc_send_write_prot_type(struct mmc_card *card, u32 wp_addr, u32 *wp_type)
  2087. {
  2088. int err;
  2089. int result = MMC_ERR_NONE;
  2090. struct mmc_command cmd;
  2091. struct mmc_host *host = card->host;
  2092. u8 *buf = (u8*)wp_type;
  2093. //if (!(card->csd.cmdclass & CCC_WRITE_PROT))
  2094. // return MMC_ERR_INVALID;
  2095. cmd.opcode = MMC_CMD_SEND_WRITE_PROT_TYPE;
  2096. cmd.rsptyp = RESP_R1;
  2097. cmd.arg = wp_addr;
  2098. cmd.retries = 3;
  2099. cmd.timeout = CMD_TIMEOUT;
  2100. msdc_reset_tune_counter(host);
  2101. #if defined(FEATURE_MMC_RD_TUNING)
  2102. do {
  2103. #endif
  2104. msdc_set_blklen(host, 8);
  2105. msdc_set_timeout(host, 100000000, 0);
  2106. err = mmc_cmd(host, &cmd);
  2107. if (err != MMC_ERR_NONE)
  2108. goto out;
  2109. err = msdc_pio_read(host, (u32*)buf, 8);
  2110. if (err != MMC_ERR_NONE) {
  2111. if (msdc_abort_handler(host, 1))
  2112. msdc_printf("[SD%d] data abort failed\n",host->id);
  2113. result = msdc_tune_read(host);
  2114. }
  2115. #if defined(FEATURE_MMC_RD_TUNING)
  2116. } while (err && result != MMC_ERR_READTUNEFAIL);
  2117. #endif
  2118. msdc_reset_tune_counter(host);
  2119. out:
  2120. return err;
  2121. }
  2122. int mmc_verify_write_prot_type_by_group(struct mmc_card *card, unsigned long blknr,
  2123. u32 blkcnt, EMMC_WP_TYPE type)
  2124. {
  2125. int err = MMC_ERR_FAILED;
  2126. u32 count_wp;
  2127. u32 count_wp_rest;
  2128. u32 count_wp_group;
  2129. u32 i, j, z;
  2130. //memset(bd, 0, sizeof(bd_t) * MAX_BD_POOL_SZ);
  2131. //u8 status[512];
  2132. u8 status_bit;
  2133. //memset(status, 0, sizeof(u8) * 512);
  2134. u8 status[8] = {0xFF}; ;//64 bit
  2135. // Check the WP status
  2136. count_wp = blkcnt/card->wp_size;
  2137. count_wp_group = count_wp/32;
  2138. count_wp_rest = count_wp % 32;
  2139. if (type == WP_TEMPORARY) {
  2140. status_bit = 0x55;
  2141. } else if (type == WP_POWER_ON) {
  2142. status_bit = 0xAA;
  2143. } else if (type == WP_PERMANENT) {
  2144. status_bit = 0xFF;
  2145. } else {
  2146. status_bit = 0;
  2147. }
  2148. for (i = 0; i < count_wp_group; i++) {
  2149. //err = mmc_send_write_prot_type(card,blknr+index*32*card.wp_size,wp_type);
  2150. err = mmc_send_write_prot_type(card, blknr+i*32*card->wp_size, (u32 *) status);
  2151. if (err) {
  2152. msdc_printf("[%s]: mmc_send_write_prot_type err %d \n", __func__,err);
  2153. goto out;
  2154. }
  2155. //check each
  2156. for (j = 0; j < 8; j++) {
  2157. if (status[j] != status_bit) {
  2158. err = MMC_ERR_FAILED;
  2159. goto out;
  2160. }
  2161. }
  2162. //msdc_printf(" wp_type %d\n", status[j]);
  2163. }
  2164. //verify the rest bit
  2165. err = mmc_send_write_prot_type(card, blknr+count_wp_group*32*card->wp_size, (u32 *) status);
  2166. if (err) {
  2167. msdc_printf("[%s]: mmc_send_write_prot_type err %d \n", __func__,err);
  2168. goto out;
  2169. }
  2170. for (z = 0; z < 8; z++) {
  2171. if (count_wp_rest >= 4) {
  2172. if (status[7 - z] != status_bit) {
  2173. err = MMC_ERR_FAILED;
  2174. goto out;
  2175. }
  2176. count_wp_rest -= 4;
  2177. } else if (count_wp_rest >= 1) {
  2178. u8 status_select = status[7 - z] & (0xFF >> (8 - count_wp_rest * 2));
  2179. u8 status_should = status_bit >> (8 - count_wp_rest * 2);
  2180. if (status_select != status_should) {
  2181. err = MMC_ERR_FAILED;
  2182. goto out;
  2183. }
  2184. break;
  2185. } else
  2186. break;
  2187. }
  2188. err = 0;
  2189. out:
  2190. return err;
  2191. }
  2192. int mmc_set_write_protect_by_group(struct mmc_card *card,
  2193. Region partition,unsigned long blknr,u32 blkcnt, EMMC_WP_TYPE type)
  2194. {
  2195. int err = MMC_ERR_FAILED;
  2196. u32 count_wp;
  2197. u32 index;
  2198. //check type
  2199. if (type == WP_PERMANENT || type == WP_DISABLE || type == WP_TEMPORARY) {
  2200. msdc_printf("[%s]: Type Not Support\n", __func__);
  2201. return 0;
  2202. }
  2203. if (type > WP_DISABLE || type < 0) {
  2204. msdc_printf("[%s]:%d type=%d\n", __func__,__LINE__,type);
  2205. return err;
  2206. }
  2207. //check partition
  2208. if (partition == EMMC_PART_UNKNOWN ||partition == EMMC_PART_BOOT2
  2209. ||partition == EMMC_PART_RPMB ||partition == EMMC_PART_GP1
  2210. ||partition == EMMC_PART_GP2 ||partition == EMMC_PART_GP3
  2211. ||partition == EMMC_PART_GP4 ||partition == EMMC_PART_BOOT1) {
  2212. msdc_printf("[%s]: partition Not Support\n", __func__);
  2213. return 0;
  2214. }
  2215. if (partition >= EMMC_PART_END || partition < 0) {
  2216. msdc_printf("[%s]:%d partition=%d\n", __func__,__LINE__,partition);
  2217. return err;
  2218. }
  2219. //u8 wp_type[8] = {0xFF}; ;//64 bit
  2220. err=mmc_switch_part(EMMC_PART_USER);
  2221. if (err) {
  2222. msdc_printf("[%s]: mmc_switch_part err %d\n", __func__,err);
  2223. return err;
  2224. }
  2225. count_wp = blkcnt/card->wp_size;
  2226. msdc_printf("[%s]: count_wp %d\n", __func__,count_wp);
  2227. for (index=0; index<count_wp; index++) {
  2228. err=mmc_set_write_prot(card->host,blknr+(index*card->wp_size));
  2229. if (err) {
  2230. msdc_printf("[%s]: mmc_set_write_prot err %d \n", __func__,err);
  2231. return err;
  2232. }
  2233. }
  2234. err = mmc_verify_write_prot_type_by_group(card, blknr, blkcnt, type);
  2235. return err;
  2236. }
  2237. unsigned int mmc_set_write_protect(int dev_num, Region partition,unsigned long blknr,u32 blkcnt, EMMC_WP_TYPE type)
  2238. {
  2239. int err = MMC_ERR_FAILED;
  2240. // struct mmc_host *host = mmc_get_host(dev_num);
  2241. struct mmc_card *card = mmc_get_card(dev_num);
  2242. MSG(INF, "[%s]: mmc_set_write_protect start \n", __func__);
  2243. if (type==WP_POWER_ON && partition == EMMC_PART_USER) {
  2244. //check the alignment and capility
  2245. //size[EMMC_PART_USER] = (u64)card->blklen * card->nblks;
  2246. MSG(INF, "wp_size: %d blknr: %d blkcnt: %d nblks: %d\n", card->wp_size,
  2247. blknr, blkcnt, card->nblks);
  2248. if (blknr % card->wp_size || blkcnt % card->wp_size
  2249. || (blknr + blkcnt > card->nblks)) {
  2250. msdc_printf("[%s]: alignment or capility error \n", __func__);
  2251. MSG(INF, "return code: %d\n", MMC_ERR_FAILED);
  2252. return MMC_ERR_FAILED;
  2253. }
  2254. err=mmc_set_user_wp(card,WP_POWER_ON, blknr, blkcnt, partition);
  2255. if (err) {
  2256. msdc_printf("[%s]: mmc_set_user_wp err%d\n", __func__,err);
  2257. return err;
  2258. }
  2259. } else if (type==WP_POWER_ON && partition == EMMC_PART_BOOT1 ||
  2260. type==WP_POWER_ON && partition == EMMC_PART_BOOT2) {
  2261. //Boot partition power on protect
  2262. err = mmc_set_boot_wp(card, WP_POWER_ON, partition);
  2263. if (err) {
  2264. msdc_printf("[%s]: mmc_set_boot_wp err%d\n", __func__,err);
  2265. return err;
  2266. }
  2267. } else if (type == WP_PERMANENT || type == WP_DISABLE || type == WP_TEMPORARY) {
  2268. msdc_printf("[%s]: WP Type Not Support\n", __func__);
  2269. return 0;
  2270. } else if (partition == EMMC_PART_UNKNOWN ||partition == EMMC_PART_BOOT2
  2271. ||partition == EMMC_PART_RPMB ||partition == EMMC_PART_GP1
  2272. ||partition == EMMC_PART_GP2 ||partition == EMMC_PART_GP3
  2273. ||partition == EMMC_PART_GP4) {
  2274. msdc_printf("[%s]: partition Not Support\n", __func__);
  2275. return 0;
  2276. } else {
  2277. return err;
  2278. }
  2279. return err;
  2280. }
  2281. int mmc_set_boot_prot(struct mmc_card *card, u8 prot)
  2282. {
  2283. int err = MMC_ERR_FAILED;
  2284. if (!mmc_card_mmc(card))
  2285. goto out;
  2286. WARN_ON(card->csd.mmca_vsn < CSD_SPEC_VER_4);
  2287. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  2288. goto out;
  2289. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2290. EXT_CSD_BOOT_CONFIG_PROT, prot);
  2291. out:
  2292. return err;
  2293. }
  2294. int mmc_set_boot_wp(struct mmc_card *card, EMMC_WP_TYPE type, Region partition)
  2295. {
  2296. int err = MMC_ERR_FAILED;
  2297. u8 value;
  2298. if (type == WP_DISABLE || type == WP_PERMANENT || type == WP_TEMPORARY) {
  2299. return 0;
  2300. }
  2301. if (type > WP_DISABLE || type < 0) {
  2302. goto out;
  2303. }
  2304. if (!mmc_card_mmc(card))
  2305. goto out;
  2306. WARN_ON(card->csd.mmca_vsn < CSD_SPEC_VER_4);
  2307. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  2308. goto out;
  2309. if (card->ext_csd.boot_wp & EXT_CSD_BOOT_WP_DIS_PWR_WP) {
  2310. //msdc_printf(INFO, "[%s]: EXT_CSD_BOOT_WP_DIS_PWR_WP is err set \n", __func__);
  2311. goto out;
  2312. }
  2313. //Enable power-on protect
  2314. value = card->ext_csd.boot_wp | EXT_CSD_BOOT_WP_EN_PWR_WP;
  2315. //Set boot1 or boot2 protect
  2316. if (partition == EMMC_PART_BOOT1)
  2317. value &= ~EXT_CSD_BOOT_WP_WP_SEC_SEL;
  2318. else
  2319. value |= EXT_CSD_BOOT_WP_WP_SEC_SEL;
  2320. //Set only 1 protect according EXT_CSD_BOOT_WP_WP_SEC_SEL
  2321. value |= EXT_CSD_BOOT_WP_SEL;
  2322. //check if already set
  2323. if (card->ext_csd.boot_wp== value) {
  2324. //msdc_printf(INFO, "[%s]: EXT_CSD_BOOT_WP alread set ",__func__);
  2325. return 0;
  2326. }
  2327. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2328. EXT_CSD_BOOT_WP, value);
  2329. if (err) {
  2330. //msdc_printf(INFO, "[%s]: mmc_switch err %d\n", __func__,err);
  2331. goto out;
  2332. }
  2333. //check by read
  2334. err = mmc_read_ext_csd(card->host, card);
  2335. if (err) {
  2336. msdc_printf(INFO, "[%s]: read ext_csd err %d\n", __func__,err);
  2337. }
  2338. out:
  2339. return err;
  2340. }
  2341. int mmc_set_user_wp(struct mmc_card *card, EMMC_WP_TYPE type, unsigned long blknr,
  2342. u32 blkcnt,Region partition)
  2343. {
  2344. int err = MMC_ERR_FAILED;
  2345. u8 value;
  2346. if (type == WP_DISABLE || type == WP_PERMANENT || type == WP_TEMPORARY) {
  2347. return 0;
  2348. }
  2349. if (type > WP_DISABLE || type < 0) {
  2350. goto out;
  2351. }
  2352. if (!mmc_card_mmc(card))
  2353. goto out;
  2354. WARN_ON(card->csd.mmca_vsn < CSD_SPEC_VER_4);
  2355. if (card->csd.mmca_vsn < CSD_SPEC_VER_4)
  2356. goto out;
  2357. if (card->ext_csd.usr_wp & US_PWR_WP_DIS) {
  2358. msdc_printf("[%s]: US_PWR_WP_DIS is err set \n", __func__);
  2359. goto out;
  2360. }
  2361. value = card->ext_csd.usr_wp | US_PWR_WP_EN;
  2362. value &= ~US_PERM_WP_EN;
  2363. //check if already set
  2364. if (card->ext_csd.usr_wp == value) {
  2365. msdc_printf("[%s]: EXT_CSD_USR_WP alread set \n",__func__);
  2366. } else {
  2367. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2368. EXT_CSD_USR_WP, value);
  2369. if (err) {
  2370. msdc_printf("[%s]: mmc_switch err %d\n", __func__,err);
  2371. goto out;
  2372. }
  2373. //check by read
  2374. err = mmc_read_ext_csd(card->host, card);
  2375. if (err) {
  2376. msdc_printf("[%s]: read ext_csd err %d\n", __func__,err);
  2377. goto out;
  2378. }
  2379. msdc_printf("[%s]: card->ext_csd.usr_wp:%d\n", __func__,card->ext_csd.usr_wp);
  2380. }
  2381. //start to set the group wp
  2382. err = mmc_set_write_protect_by_group(card, partition, blknr, blkcnt, type);
  2383. if (err) {
  2384. msdc_printf("[%s]: mmc_set_write_protect_by_group err%d\n", __func__,err);
  2385. goto out;
  2386. }
  2387. //restore US_PWR_WP_EN
  2388. err = mmc_switch(card->host, card, EXT_CSD_CMD_SET_NORMAL,
  2389. EXT_CSD_USR_WP, card->ext_csd.usr_wp & ~US_PWR_WP_EN);
  2390. if (err) {
  2391. msdc_printf("[%s]: restore US_PWR_WP_EN err %d\n", __func__,err);
  2392. goto out;
  2393. }
  2394. //check by read
  2395. err = mmc_read_ext_csd(card->host, card);
  2396. if (err) {
  2397. msdc_printf("[%s]: read ext_csd err %d\n", __func__,err);
  2398. }
  2399. //msdc_printf("[%s]: %d\n", __func__,card->ext_csd.usr_wp);
  2400. out:
  2401. return err;
  2402. }
  2403. #endif
  2404. int mmc_dev_bread(struct mmc_card *card, unsigned long blknr, u32 blkcnt, u8 *dst)
  2405. {
  2406. struct mmc_host *host = card->host;
  2407. u32 blksz = host->blklen;
  2408. int tune = 0;
  2409. #if defined(FEATURE_MMC_RD_TUNING) || defined(MSDC_SLT)
  2410. int retry = 1;
  2411. #else
  2412. int retry = 3;
  2413. #endif
  2414. int err;
  2415. unsigned long src;
  2416. u8 *oridst = dst;
  2417. src = mmc_card_highcaps(card) ? blknr : blknr * blksz;
  2418. do {
  2419. mmc_prof_start();
  2420. if (!tune) {
  2421. err = host->blk_read(host, (uchar *)dst, src, blkcnt);
  2422. } else {
  2423. #ifdef FEATURE_MMC_RD_TUNING
  2424. if (mmc_card_mmc(card) && mmc_card_hs400(card)) {
  2425. msdc_printf("[tune][%s:%d] start hs400 read tune\n", __func__, __LINE__);
  2426. err = msdc_tune_rw_hs400(host, (uchar *)oridst, src, blkcnt, 0);
  2427. } else {
  2428. err = msdc_tune_bread(host, (uchar *)oridst, src, blkcnt);
  2429. }
  2430. #endif
  2431. if (err && (host->cur_bus_clk > (host->f_max >> 4))) {
  2432. mmc_set_clock(host, mmc_card_ddr(card), host->cur_bus_clk >> 1);
  2433. err = host->blk_read(host, (uchar *)oridst, src, blkcnt);
  2434. }
  2435. }
  2436. mmc_prof_stop();
  2437. if (err == MMC_ERR_NONE) {
  2438. mmc_prof_update(mmc_prof_read, blkcnt, mmc_prof_handle(host->id));
  2439. break;
  2440. }
  2441. #if defined(FEATURE_MMC_CM_TUNING) || defined(FEATURE_MMC_RD_TUNING)
  2442. if (err == MMC_ERR_BADCRC || err == MMC_ERR_ACMD_RSPCRC || err == MMC_ERR_CMD_RSPCRC || err == MMC_ERR_TIMEOUT) {
  2443. if ( tune ) break;
  2444. tune = 1;
  2445. } else if (err == MMC_ERR_READTUNEFAIL || err == MMC_ERR_CMDTUNEFAIL) {
  2446. msdc_printf("[SD%d] Fail to tuning,%s",host->id,(err == MMC_ERR_CMDTUNEFAIL)?"cmd tune failed!\n":"read tune failed!\n");
  2447. break;
  2448. }
  2449. #elif defined(MSDC_SLT_ANALYSIS)
  2450. if (err == MMC_ERR_BADCRC || err == MMC_ERR_ACMD_RSPCRC || err == MMC_ERR_CMD_RSPCRC || err == MMC_ERR_TIMEOUT) {
  2451. err = MMC_ERR_NONE;
  2452. break;
  2453. }
  2454. #endif
  2455. } while (retry--);
  2456. return err;
  2457. }
  2458. static int mmc_dev_bwrite(struct mmc_card *card, unsigned long blknr, u32 blkcnt, u8 *src)
  2459. {
  2460. struct mmc_host *host = card->host;
  2461. u32 blksz = host->blklen;
  2462. u32 status;
  2463. int tune = 0;
  2464. #if defined(FEATURE_MMC_WR_TUNING) || defined(MSDC_SLT)
  2465. int retry = 1;
  2466. #else
  2467. int retry = 3;
  2468. #endif
  2469. int err;
  2470. unsigned long dst;
  2471. dst = mmc_card_highcaps(card) ? blknr : blknr * blksz;
  2472. do {
  2473. mmc_prof_start();
  2474. if (!tune) {
  2475. err = host->blk_write(host, dst, (uchar *)src, blkcnt);
  2476. } else {
  2477. #if defined(FEATURE_MMC_WR_TUNING)
  2478. if (mmc_card_mmc(card) && mmc_card_hs400(card)) {
  2479. err = msdc_tune_rw_hs400(host, (uchar *) dst, (ulong) src, blkcnt, 1);
  2480. } else {
  2481. err = msdc_tune_bwrite(host, dst, (uchar *)src, blkcnt);
  2482. }
  2483. #endif
  2484. if (err && (host->cur_bus_clk > (host->f_max >> 4))) {
  2485. mmc_set_clock(host, mmc_card_ddr(card), host->cur_bus_clk >> 1);
  2486. err = host->blk_write(host, dst, (uchar *)src, blkcnt);
  2487. }
  2488. }
  2489. if (err == MMC_ERR_NONE) {
  2490. do {
  2491. err = mmc_send_status(host, card, &status);
  2492. if (err) {
  2493. msdc_printf("[SD%d] Fail to send status %d\n", host->id, err);
  2494. break;
  2495. }
  2496. } while (!(status & R1_READY_FOR_DATA) ||
  2497. (R1_CURRENT_STATE(status) == 7) ||
  2498. (R1_CURRENT_STATE(status) == 6));
  2499. mmc_prof_stop();
  2500. mmc_prof_update(mmc_prof_write, blkcnt, mmc_prof_handle(host->id));
  2501. MSG(OPS, "[SD%d] Write %d bytes (DONE)\n",
  2502. host->id, blkcnt * blksz);
  2503. break;
  2504. }
  2505. #if defined(FEATURE_MMC_WR_TUNING)
  2506. if (err == MMC_ERR_BADCRC || err == MMC_ERR_ACMD_RSPCRC || err == MMC_ERR_CMD_RSPCRC || err == MMC_ERR_TIMEOUT) {
  2507. if ( tune ) break;
  2508. tune = 1;
  2509. }
  2510. #elif defined(MSDC_SLT_ANALYSIS)
  2511. if (err == MMC_ERR_BADCRC || err == MMC_ERR_ACMD_RSPCRC || err == MMC_ERR_CMD_RSPCRC || err == MMC_ERR_TIMEOUT) {
  2512. err = MMC_ERR_NONE;
  2513. break;
  2514. }
  2515. #endif
  2516. } while (retry--);
  2517. return err;
  2518. }
  2519. int mmc_block_read(int dev_num, unsigned long blknr, u32 blkcnt, unsigned long *dst)
  2520. {
  2521. struct mmc_host *host = mmc_get_host(dev_num);
  2522. struct mmc_card *card = mmc_get_card(dev_num);
  2523. u32 blksz = host->blklen;
  2524. u32 maxblks = host->max_phys_segs;
  2525. //u32 xfercnt = blkcnt / maxblks;
  2526. //u32 leftblks = blkcnt % maxblks;
  2527. u32 leftblks;
  2528. u8 *buf = (u8*)dst;
  2529. int ret;
  2530. #ifdef FEATURE_NONBLOCKING_RW
  2531. if ( blkcnt> maxblks ) {
  2532. msdc_printf("[SD%d] Non-blocking RW does not allow blkcnt(%d) > maxblks(%d)\n", host->id, blkcnt, maxblks);
  2533. BUG_ON(1);
  2534. }
  2535. #endif
  2536. #ifdef FEATURE_MMC_CMDQ
  2537. if ( host->mmc_cmdq_enable ) {
  2538. if ( host->mmc_cmdq_first_task == (host->mmc_cmdq_last_task+1)%MMC_MAX_QUEUE_DEPTH_USER ) {
  2539. //msdc_printf("\n[SD%d] CMDQ Full: mmc_cmdq_first_task %d, mmc_cmdq_last_task %d\n",host->id, host->mmc_cmdq_first_task, host->mmc_cmdq_last_task);
  2540. BUG_ON(1);
  2541. } else {
  2542. host->mmc_cmdq_req[host->mmc_cmdq_last_task].blknr=blknr;
  2543. host->mmc_cmdq_req[host->mmc_cmdq_last_task].blkcnt=blkcnt;
  2544. host->mmc_cmdq_req[host->mmc_cmdq_last_task].task_id=0;
  2545. host->mmc_cmdq_req[host->mmc_cmdq_last_task].buf=buf;
  2546. host->mmc_cmdq_last_task++;
  2547. if ( host->mmc_cmdq_last_task==MMC_MAX_QUEUE_DEPTH_USER ) {
  2548. host->mmc_cmdq_last_task=0;
  2549. }
  2550. //msdc_printf("\n[SD%d] Task ID1: mmc_cmdq_first_task %d, mmc_cmdq_last_task %d\n",host->id, host->mmc_cmdq_first_task, host->mmc_cmdq_last_task);
  2551. }
  2552. //msdc_set_autocmd(host, MSDC_AUTOCMD23, 1); //Temp for emulation. To do: remove it later
  2553. }
  2554. #endif
  2555. if (!blkcnt)
  2556. return MMC_ERR_NONE;
  2557. if (blknr * (blksz / MMC_BLOCK_SIZE) > card->nblks) {
  2558. msdc_printf("[SD%d] Out of block range: blknr(%ld) > sd_blknr(%d)\n",
  2559. host->id, blknr, card->nblks);
  2560. return MMC_ERR_INVALID;
  2561. }
  2562. do {
  2563. leftblks=((blkcnt> maxblks) ? maxblks : blkcnt);
  2564. ret = mmc_dev_bread(card, (unsigned long)blknr, leftblks, buf);
  2565. if (ret)
  2566. return ret;
  2567. blknr += leftblks;
  2568. buf += maxblks * blksz;
  2569. blkcnt -= leftblks;
  2570. } while ( blkcnt );
  2571. return ret;
  2572. }
  2573. int mmc_block_write(int dev_num, unsigned long blknr, u32 blkcnt, unsigned long *src)
  2574. {
  2575. struct mmc_host *host = mmc_get_host(dev_num);
  2576. struct mmc_card *card = mmc_get_card(dev_num);
  2577. u32 blksz = host->blklen;
  2578. u32 maxblks = host->max_phys_segs;
  2579. //u32 xfercnt = blkcnt / maxblks;
  2580. //u32 leftblks = blkcnt % maxblks;
  2581. u32 leftblks;
  2582. u8 *buf = (u8*)src;
  2583. int ret;
  2584. #ifdef FEATURE_NONBLOCKING_RW
  2585. if ( blkcnt> maxblks ) {
  2586. msdc_printf("[SD%d] Non-blocking RW does not allow blkcnt(%d) > maxblks(%d)\n", host->id, blkcnt, maxblks);
  2587. BUG_ON(1);
  2588. }
  2589. #endif
  2590. if (!blkcnt)
  2591. return MMC_ERR_NONE;
  2592. if (blknr * (blksz / MMC_BLOCK_SIZE) > card->nblks) {
  2593. msdc_printf("[SD%d] Out of block range: blknr(%ld) > sd_blknr(%d)\n",
  2594. host->id, blknr, card->nblks);
  2595. return MMC_ERR_INVALID;
  2596. }
  2597. do {
  2598. leftblks=((blkcnt> maxblks) ? maxblks : blkcnt);
  2599. ret = mmc_dev_bwrite(card, (unsigned long)blknr, leftblks, buf);
  2600. if (ret)
  2601. return ret;
  2602. blknr += leftblks;
  2603. buf += maxblks * blksz;
  2604. blkcnt -= leftblks;
  2605. } while ( blkcnt );
  2606. return ret;
  2607. }
  2608. #ifdef FEATURE_NONBLOCKING_RW
  2609. int mmc_block_rw_nonblocking_check_done(int dev_num)
  2610. {
  2611. int ret=MMC_ERR_NONE;
  2612. struct mmc_host *host = mmc_get_host(dev_num);
  2613. ret = msdc_dma_nonblocking_check_done(host);
  2614. //To do: Add code for PIO
  2615. return ret;
  2616. }
  2617. #endif
  2618. #if defined(MMC_MSDC_DRV_PRELOADER)
  2619. void mmc_stuff_buff(u8* buf)
  2620. {
  2621. memset(buf,0,512);
  2622. buf[0] = 0x10;
  2623. buf[1] = 0x06;
  2624. buf[2] = 0x01;
  2625. buf[3] = 0xF0;
  2626. buf[11]= 0xAA;
  2627. buf[12]= 0xA9;
  2628. buf[13]= 0x87;
  2629. buf[14]= 0x74;
  2630. buf[15]= 0x3C;
  2631. buf[16]= 0x71;
  2632. buf[17]= 0xFB;
  2633. buf[18]= 0xD4;
  2634. }
  2635. int mmc_get_sandisk_fwid(int id, u8* buf)
  2636. {
  2637. struct mmc_host *host;
  2638. struct mmc_card *card;
  2639. struct mmc_command stop;
  2640. int err = MMC_ERR_NONE;
  2641. u32 status;
  2642. u32 state = 0;
  2643. host = &sd_host[id];
  2644. card = &sd_card[id];
  2645. while (state != 4) {
  2646. err = mmc_send_status(host, card, &status);
  2647. if (err) {
  2648. msdc_printf("[SD%d] Fail to send status %d\n", host->id, err);
  2649. return err;
  2650. }
  2651. state = R1_CURRENT_STATE(status);
  2652. msdc_printf("check card state<%d>\n", state);
  2653. if (state == 5 || state == 6) {
  2654. msdc_printf("state<%d> need cmd12 to stop\n", state);
  2655. stop.opcode = MMC_CMD_STOP_TRANSMISSION;
  2656. stop.rsptyp = RESP_R1B;
  2657. stop.arg = 0;
  2658. stop.retries = CMD_RETRIES;
  2659. stop.timeout = CMD_TIMEOUT;
  2660. msdc_send_cmd(host, &stop);
  2661. msdc_wait_rsp(host, &stop); // don't tuning
  2662. } else if (state == 7) { // busy in programing
  2663. msdc_printf("state<%d> card is busy\n", state);
  2664. mdelay(100);
  2665. } else if (state != 4) {
  2666. msdc_printf("state<%d> ??? \n", state);
  2667. return MMC_ERR_INVALID;
  2668. }
  2669. }
  2670. mmc_stuff_buff(buf);
  2671. #if defined(MSDC_ENABLE_DMA_MODE)
  2672. err = msdc_dma_send_sandisk_fwid(host, buf,MMC_CMD50,1);
  2673. if (err) {
  2674. msdc_printf("[SD%d] Fail to send(CMD50) sandisk fwid %d\n", host->id, err);
  2675. return err;
  2676. }
  2677. err = msdc_dma_send_sandisk_fwid(host, buf,MMC_CMD21,1);
  2678. if (err) {
  2679. msdc_printf("[SD%d] Fail to get(CMD21) sandisk fwid %d\n", host->id, err);
  2680. return err;
  2681. }
  2682. #else
  2683. err = msdc_pio_send_sandisk_fwid(host, buf);
  2684. if (err) {
  2685. msdc_printf("[SD%d] Fail to send(CMD50) sandisk fwid %d\n", host->id, err);
  2686. return err;
  2687. }
  2688. err = msdc_pio_get_sandisk_fwid(host, buf);
  2689. if (err) {
  2690. msdc_printf("[SD%d] Fail to get(CMD21) sandisk fwid %d\n", host->id, err);
  2691. return err;
  2692. }
  2693. #endif
  2694. return err;
  2695. }
  2696. #endif
  2697. #ifdef FEATURE_MMC_BOOT_MODE
  2698. void mmc_boot_reset(struct mmc_host *host, int reset)
  2699. {
  2700. msdc_emmc_boot_reset(host, reset);
  2701. }
  2702. int mmc_boot_up(struct mmc_host *host, int ddr, int mode, u8 hostbuswidth, int ackdis, u32 *to, u64 size, int read_mode)
  2703. {
  2704. int err;
  2705. ERR_EXIT(msdc_emmc_boot_start(host, host->cur_bus_clk, ddr, mode, ackdis, hostbuswidth, size), err, MMC_ERR_NONE);
  2706. ERR_EXIT(msdc_emmc_boot_read(host, size, to, read_mode), err, MMC_ERR_NONE);
  2707. exit:
  2708. msdc_emmc_boot_stop(host);
  2709. return err;
  2710. }
  2711. #endif
  2712. int mmc_init_mem_card(struct mmc_host *host, struct mmc_card *card, u32 ocr)
  2713. {
  2714. int err, id = host->id;
  2715. #if defined(FEATURE_MMC_UHS1)
  2716. int s18a = 0;
  2717. #endif
  2718. /*
  2719. * Sanity check the voltages that the card claims to
  2720. * support.
  2721. */
  2722. if (ocr & 0x7F) {
  2723. msdc_printf("card claims to support voltages "
  2724. "below the defined range. These will be ignored.\n");
  2725. ocr &= ~0x7F;
  2726. }
  2727. ocr = host->ocr = mmc_select_voltage(host, ocr);
  2728. /*
  2729. * Can we support the voltage(s) of the card(s)?
  2730. */
  2731. if (!host->ocr) {
  2732. err = MMC_ERR_FAILED;
  2733. goto out;
  2734. }
  2735. mmc_go_idle(host);
  2736. /* send interface condition */
  2737. if (mmc_card_sd(card))
  2738. err = mmc_send_if_cond(host, ocr);
  2739. /* host support HCS[30] */
  2740. ocr |= (1 << 30);
  2741. #if defined(FEATURE_MMC_UHS1)
  2742. if (!err) {
  2743. /* host support S18A[24] and XPC[28]=1 to support speed class */
  2744. if (host->caps & MMC_CAP_SD_UHS1)
  2745. ocr |= ((1 << 28) | (1 << 24));
  2746. card->version = SD_VER_20;
  2747. } else {
  2748. card->version = SD_VER_10;
  2749. }
  2750. #else
  2751. card->version = SD_VER_10;
  2752. #endif
  2753. /* send operation condition */
  2754. if (mmc_card_sd(card)) {
  2755. err = mmc_send_app_op_cond(host, ocr, &card->ocr);
  2756. } else {
  2757. /* The extra bit indicates that we support high capacity */
  2758. err = mmc_send_op_cond(host, ocr, &card->ocr);
  2759. }
  2760. if (err != MMC_ERR_NONE) {
  2761. msdc_printf("[SD%d] Fail in SEND_OP_COND cmd\n", id);
  2762. goto out;
  2763. }
  2764. /* set hcs bit if a high-capacity card */
  2765. card->state |= ((card->ocr >> 30) & 0x1) ? MMC_STATE_HIGHCAPS : 0;
  2766. #if defined(FEATURE_MMC_UHS1)
  2767. s18a = (card->ocr >> 24) & 0x1;
  2768. msdc_printf("[SD%d] ocr = 0x%X, card->ocr=0x%X, s18a = %d \n", id, ocr, card->ocr, s18a);
  2769. /* S18A support by card. switch to 1.8V signal */
  2770. if (s18a) {
  2771. card->version = SD_VER_30;
  2772. err = mmc_switch_volt(host, card);
  2773. if (err != MMC_ERR_NONE) {
  2774. msdc_printf("[SD%d] Fail in SWITCH_VOLT cmd\n", id);
  2775. goto out;
  2776. }
  2777. }
  2778. #endif
  2779. /* send cid */
  2780. err = mmc_all_send_cid(host, card->raw_cid);
  2781. if (err != MMC_ERR_NONE) {
  2782. msdc_printf("[SD%d] Fail in SEND_CID cmd\n", id);
  2783. goto out;
  2784. }
  2785. if (mmc_card_mmc(card))
  2786. card->rca = 0x1; /* assign a rca */
  2787. /* set/send rca */
  2788. err = mmc_send_relative_addr(host, card, &card->rca);
  2789. if (err != MMC_ERR_NONE) {
  2790. msdc_printf("[SD%d] Fail in SEND_RCA cmd\n", id);
  2791. goto out;
  2792. }
  2793. /* send csd */
  2794. err = mmc_read_csds(host, card);
  2795. if (err != MMC_ERR_NONE) {
  2796. msdc_printf("[SD%d] Fail in SEND_CSD cmd\n", id);
  2797. goto out;
  2798. }
  2799. /* decode csd */
  2800. err = mmc_decode_csd(card);
  2801. if (err != MMC_ERR_NONE) {
  2802. msdc_printf("[SD%d] Fail in decode csd\n", id);
  2803. goto out;
  2804. }
  2805. //CID shall be decoded after decoding CSD
  2806. mmc_decode_cid(card);
  2807. /* select this card */
  2808. err = mmc_select_card(host, card);
  2809. if (err != MMC_ERR_NONE) {
  2810. msdc_printf("[SD%d] Fail in select card cmd\n", id);
  2811. goto out;
  2812. }
  2813. if (mmc_card_sd(card)) {
  2814. #if !defined(FEATURE_MMC_SLIM)
  2815. /* send scr */
  2816. err = mmc_read_scrs(host, card);
  2817. if (err != MMC_ERR_NONE) {
  2818. msdc_printf("[SD%d] Fail in SEND_SCR cmd\n", id);
  2819. goto out;
  2820. }
  2821. #endif
  2822. if ((card->csd.cmdclass & CCC_SWITCH) &&
  2823. (mmc_read_switch(host, card) == MMC_ERR_NONE)) {
  2824. do {
  2825. #if defined(FEATURE_MMC_UHS1)
  2826. if (s18a && (host->caps & MMC_CAP_SD_UHS1)) {
  2827. /* TODO: Switch driver strength first then current limit
  2828. * and access mode */
  2829. unsigned int freq, uhs_mode, drv_type, max_curr;
  2830. freq = min(host->f_max, card->sw_caps.hs_max_dtr);
  2831. if (freq > 100000000) {
  2832. uhs_mode = MMC_SWITCH_MODE_SDR104;
  2833. } else if (freq <= 100000000 && freq > 50000000) {
  2834. if (card->sw_caps.ddr && (host->caps & MMC_CAP_DDR)) {
  2835. uhs_mode = MMC_SWITCH_MODE_DDR50;
  2836. } else {
  2837. uhs_mode = MMC_SWITCH_MODE_SDR50;
  2838. }
  2839. } else if (freq <= 50000000 && freq > 25000000) {
  2840. uhs_mode = MMC_SWITCH_MODE_SDR25;
  2841. } else {
  2842. uhs_mode = MMC_SWITCH_MODE_SDR12;
  2843. }
  2844. drv_type = MMC_SWITCH_MODE_DRV_TYPE_B;
  2845. max_curr = MMC_SWITCH_MODE_CL_200MA;
  2846. if (mmc_switch_drv_type(host, card, drv_type) == MMC_ERR_NONE &&
  2847. mmc_switch_max_cur(host, card, max_curr) == MMC_ERR_NONE &&
  2848. mmc_switch_uhs1(host, card, uhs_mode) == MMC_ERR_NONE) {
  2849. break;
  2850. } else {
  2851. mmc_switch_drv_type(host, card, MMC_SWITCH_MODE_DRV_TYPE_B);
  2852. mmc_switch_max_cur(host, card, MMC_SWITCH_MODE_CL_200MA);
  2853. }
  2854. }
  2855. #endif
  2856. if (host->caps & MMC_CAP_SD_HIGHSPEED) {
  2857. mmc_switch_hs(host, card);
  2858. break;
  2859. }
  2860. } while (0);
  2861. }
  2862. /* set bus width */
  2863. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_4);
  2864. /* compute bus speed. */
  2865. card->maxhz = (unsigned int)-1;
  2866. if (mmc_card_highspeed(card) || mmc_card_uhs1(card)) {
  2867. if (card->maxhz > card->sw_caps.hs_max_dtr)
  2868. card->maxhz = card->sw_caps.hs_max_dtr;
  2869. } else if (card->maxhz > card->csd.max_dtr) {
  2870. card->maxhz = card->csd.max_dtr;
  2871. }
  2872. } else {
  2873. /* at the begin, the emmc card is under backward mode, this mode can support 1/4/8 buswidth */
  2874. mmc_card_set_backyard(card);
  2875. /* send ext csd */
  2876. err = mmc_read_ext_csd(host, card);
  2877. if (err != MMC_ERR_NONE) {
  2878. msdc_printf("[SD%d] Fail in SEND_EXT_CSD cmd\n", id);
  2879. goto out;
  2880. }
  2881. /* activate hs400 (if supported) */
  2882. if ((card->ext_csd.hs_max_dtr > 52000000) && (host->caps & MMC_CAP_EMMC_HS400)) {
  2883. err = mmc_set_blk_length(host, MMC_BLOCK_SIZE);
  2884. if ( err != MMC_ERR_NONE )
  2885. goto out;
  2886. //Step1. switch to High-speed and becomes 1-bit@High-speed
  2887. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
  2888. if ( err != MMC_ERR_NONE ) {
  2889. msdc_printf("[SD%d] Switch to High-speed mode failed!\n", host->id);
  2890. goto out;
  2891. }
  2892. //Step2. switch to 8-bit DDR and becomes 8-bit@DDR50
  2893. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8_DDR);
  2894. if (err != MMC_ERR_NONE) {
  2895. msdc_printf("[SD%d] Switch to 8-bit failed!\n", host->id);
  2896. goto out;
  2897. }
  2898. msdc_config_bus(host, HOST_BUS_WIDTH_8);
  2899. //Step3. switch to HS400 and becomes 8-bit@HS400
  2900. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 3);
  2901. if ( err != MMC_ERR_NONE ) {
  2902. msdc_printf("[SD%d] Switch to HS400 mode failed!\n", host->id);
  2903. goto out;
  2904. }
  2905. mmc_card_set_hs400(card);
  2906. /* activate hs200 (if supported) */
  2907. } else if ((card->ext_csd.hs_max_dtr > 52000000) && (host->caps & MMC_CAP_EMMC_HS200)) {
  2908. //Step1. switch to 8-bit and becomes 8-bit@legacy-speed
  2909. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8);
  2910. if (err != MMC_ERR_NONE) {
  2911. msdc_printf("[SD%d] Switch to 8-bit failed!\n", host->id);
  2912. goto out;
  2913. }
  2914. //Step2. switch to HS200 and becomes 8-bit@HS200
  2915. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 2);
  2916. if (err == MMC_ERR_NONE) {
  2917. msdc_printf("[SD%d] Switch to HS200 mode!\n", host->id);
  2918. mmc_card_set_hs200(card);
  2919. }
  2920. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_8);
  2921. /* activate hs (if supported) */
  2922. } else if ((card->ext_csd.hs_max_dtr != 0) && (host->caps & MMC_CAP_MMC_HIGHSPEED)) {
  2923. //Step1. switch to High-speed and becomes 1-bit@High-speed
  2924. err = mmc_switch(host, card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
  2925. if (err == MMC_ERR_NONE) {
  2926. msdc_printf("[SD%d] Switch to High-Speed mode!\n", host->id);
  2927. mmc_card_set_highspeed(card);
  2928. }
  2929. //Step2. switch to 8-bit(SDR or DDR) and becomes 8-bit@DDR50 or 8-bit@High-speed
  2930. //if ((host->caps & MMC_CAP_DDR) && card->ext_csd.ddr_support ) {
  2931. //Note: mmc_set_bus_width will determine switching to 8-bit SDR or 8-bit DDR according to extcsd
  2932. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_8);
  2933. //}
  2934. } else {
  2935. mmc_set_bus_width(host, card, HOST_BUS_WIDTH_8);
  2936. }
  2937. /* compute bus speed. */
  2938. card->maxhz = (unsigned int)-1;
  2939. if (mmc_card_highspeed(card)) {
  2940. card->maxhz = 52000000;
  2941. } else if ( mmc_card_hs200(card) || mmc_card_hs400(card)) {
  2942. if (card->maxhz > card->ext_csd.hs_max_dtr)
  2943. card->maxhz = card->ext_csd.hs_max_dtr;
  2944. } else if (card->maxhz > card->csd.max_dtr) {
  2945. card->maxhz = card->csd.max_dtr;
  2946. }
  2947. }
  2948. /* set block len. note that cmd16 is illegal while mmc card is in ddr mode */
  2949. if (!(mmc_card_mmc(card) && (mmc_card_ddr(card) || mmc_card_hs400(card)))) {
  2950. err = mmc_set_blk_length(host, MMC_BLOCK_SIZE);
  2951. if (err != MMC_ERR_NONE) {
  2952. msdc_printf("[SD%d] Fail in set blklen cmd, card state=0x%x\n", id, card->state);
  2953. goto out;
  2954. }
  2955. }
  2956. /* set clear card detect */
  2957. if (mmc_card_sd(card))
  2958. mmc_set_card_detect(host, card, 0);
  2959. if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) {
  2960. /* The EXT_CSD sector count is in number or 512 byte sectors. */
  2961. card->blklen = MMC_BLOCK_SIZE;
  2962. card->nblks = card->ext_csd.sectors;
  2963. } else {
  2964. /* The CSD capacity field is in units of read_blkbits.
  2965. * set_capacity takes units of 512 bytes.
  2966. */
  2967. card->blklen = MMC_BLOCK_SIZE;
  2968. card->nblks = card->csd.capacity << (card->csd.read_blkbits - 9);
  2969. }
  2970. msdc_printf("[SD%d] Size: %d MB, Max.Speed: %d kHz, blklen(%d), nblks(%d), ro(%d)\n",
  2971. id, ((card->nblks / 1024) * card->blklen) / 1024 , card->maxhz / 1000,
  2972. card->blklen, card->nblks, mmc_card_readonly(card));
  2973. card->ready = 1;
  2974. msdc_printf("[%s %d][SD%d] Initialized, %s%d\n", __func__, __LINE__, id, mmc_card_sd(card)?"SD":"eMMC", card->version);
  2975. out:
  2976. return err;
  2977. }
  2978. int mmc_init_card(struct mmc_host *host, struct mmc_card *card)
  2979. {
  2980. int err, id = host->id;
  2981. u32 ocr;
  2982. msdc_printf("[%s]: start\n", __func__);
  2983. memset(card, 0, sizeof(struct mmc_card));
  2984. mmc_prof_init(id, host, card);
  2985. mmc_prof_start();
  2986. #ifdef FEATURE_MMC_CARD_DETECT
  2987. if (!msdc_card_avail(host)) {
  2988. err = MMC_ERR_INVALID;
  2989. goto out;
  2990. }
  2991. #endif
  2992. #if 0
  2993. if (msdc_card_protected(host))
  2994. mmc_card_set_readonly(card);
  2995. #endif
  2996. mmc_card_set_present(card);
  2997. mmc_card_set_host(card, host);
  2998. mmc_card_set_unknown(card);
  2999. mmc_go_idle(host);
  3000. /* send interface condition */
  3001. mmc_send_if_cond(host, host->ocr_avail);
  3002. #if defined(FEATURE_MMC_SDIO)
  3003. if (mmc_send_io_op_cond(host, 0, &ocr) == MMC_ERR_NONE) {
  3004. mmc_card_set_sdio(card);
  3005. err = mmc_init_sdio_card(host, card, ocr);
  3006. if (err != MMC_ERR_NONE) {
  3007. msdc_printf("[SD%d] Fail in init sdio card\n", id);
  3008. goto out;
  3009. }
  3010. /* no memory present */
  3011. if ((ocr & 0x08000000) == 0) {
  3012. goto out;
  3013. }
  3014. }
  3015. #endif
  3016. /* query operation condition */
  3017. err = mmc_send_app_op_cond(host, 0, &ocr);
  3018. if (err != MMC_ERR_NONE) {
  3019. err = mmc_send_op_cond(host, 0, &ocr);
  3020. if (err != MMC_ERR_NONE) {
  3021. msdc_printf("[SD%d] Fail in MMC_CMD_SEND_OP_COND/SD_ACMD_SEND_OP_COND cmd\n", id);
  3022. goto out;
  3023. }
  3024. mmc_card_set_mmc(card);
  3025. } else {
  3026. mmc_card_set_sd(card);
  3027. }
  3028. err = mmc_init_mem_card(host, card, ocr);
  3029. if (err)
  3030. goto out;
  3031. /* change clock */
  3032. mmc_set_clock(host, mmc_card_ddr(card), card->maxhz);
  3033. #if defined(FEATURE_MMC_UHS1)
  3034. /* tune timing */
  3035. mmc_tune_timing(host, card);
  3036. #endif
  3037. out:
  3038. mmc_prof_stop();
  3039. mmc_prof_update(mmc_prof_card_init, (ulong)id, (void*)err);
  3040. if (err) {
  3041. //msdc_power(host, MMC_POWER_OFF);
  3042. msdc_printf("[%s]: failed, err=%d\n", __func__, err);
  3043. return err;
  3044. }
  3045. host->card = card;
  3046. // HS400 change again, previous mmc_set_clock host->card is null.
  3047. // host is not set to HS400
  3048. if (mmc_card_hs400(card)) {
  3049. mmc_set_clock(host, mmc_card_ddr(card), card->maxhz);
  3050. }
  3051. msdc_printf("[%s]: finish successfully\n", __func__);
  3052. return 0;
  3053. }
  3054. int mmc_init_host(struct mmc_host *host, int id, int clksrc, u32 mode)
  3055. {
  3056. memset(host, 0, sizeof(struct mmc_host));
  3057. return msdc_init(id, host, clksrc, mode);
  3058. }
  3059. int mmc_init(int id, u32 trans_mode)
  3060. {
  3061. int err = MMC_ERR_NONE;
  3062. struct mmc_host *host;
  3063. struct mmc_card *card;
  3064. BUG_ON(id >= NR_MMC);
  3065. host = &sd_host[id];
  3066. card = &sd_card[id];
  3067. err = mmc_init_host(host, id, -1, trans_mode);
  3068. if (err != MMC_ERR_NONE)
  3069. return err;
  3070. msdc_printf("[%s]: msdc%d start mmc_init_card()\n", __func__, id);
  3071. err = mmc_init_card(host, card);
  3072. if (err != MMC_ERR_NONE)
  3073. return err;
  3074. #ifdef MTK_EMMC_SUPPORT_OTP
  3075. msdc_printf("[%s]: msdc%d, use hc erase size\n", __func__, id);
  3076. if (mmc_card_mmc(card))
  3077. err = mmc_set_erase_grp_def(card, 1);
  3078. #endif
  3079. #ifdef MMC_TEST
  3080. //mmc_test(0, NULL);
  3081. #endif
  3082. #ifdef MTK_EMMC_POWER_ON_WP
  3083. //mmc_wp_test();
  3084. #endif
  3085. #ifdef MTK_MSDC_PL_TEST
  3086. msdc_printf("[%s]: start r/w compare test \n", __func__);
  3087. emmc_r_w_compare_test();
  3088. #endif
  3089. return err;
  3090. }
  3091. #if defined(MMC_MSDC_DRV_CTP)
  3092. int mmc_polling_CD_INT(struct mmc_host * host)
  3093. {
  3094. return msdc_polling_CD_interrupt(host);
  3095. }
  3096. #endif