mmc_core.c 105 KB

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