ufs_aio_hcd.c 126 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427
  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. #include "ufs_aio_cfg.h"
  32. #include "ufs_aio_types.h"
  33. #include "ufs_aio_compiler.h"
  34. #include "ufs_aio_platform.h"
  35. #include "ufs_aio.h"
  36. #include "ufs_aio_utils.h"
  37. #include "ufs_aio_hcd.h"
  38. #include "ufs_aio_core.h"
  39. #include "ufs_aio_quirks.h"
  40. #include "ufs_aio_unipro.h"
  41. #include "ufs_aio_error.h"
  42. #if defined(MTK_UFS_DRV_PRELOADER)
  43. #if CFG_ENABLE_DCACHE
  44. #include "platform.h"
  45. #endif
  46. #endif
  47. #if defined(MTK_UFS_DRV_DA)
  48. #include <arch/ops.h> /* for cache maintanance APIs */
  49. #include "dev/gpt_timer/gpt_timer.h" /* for gpt4_time2tick_ms APIs */
  50. #include <kernel/event.h> /* for event_wait_timeout APIs */
  51. #include "boot/system_objects.h" /* for sysob_runtime_params and INT_MODE_ENABLE */
  52. #include <dev/irq/irq.h> /* for mt_irq_set_sens APIs */
  53. #include <dev/irq/gic.h> /* for mt_irq_ack APIs */
  54. #endif
  55. #if defined(MTK_UFS_DRV_LK)
  56. #include <arch/ops.h> /* for cache maintanance APIs */
  57. #include <kernel/event.h>
  58. #include <mt_gic.h>
  59. #include <profiling.h>
  60. #include <sync_write.h>
  61. #include <mtk_secure_api.h>
  62. /* used for secure call */
  63. #define MTK_SIP_BL_UFS_CONTROL_AARCH32 0x8200040D
  64. #endif
  65. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  66. static event_t ufshcd_intr_event;
  67. static u32 ufshcd_intr_status;
  68. #endif
  69. #if defined(MTK_UFS_DRV_CTP)
  70. #include <common.h>
  71. #include <api.h> /* for cache maintanance APIs (cache_api.h) */
  72. #include <kernel_to_ctp.h> /* for delay functions */
  73. u8 ufs_crypto_rw_en = 0;
  74. #endif
  75. #if !defined(__WEAK)
  76. #define __WEAK __attribute__((weak))
  77. #endif
  78. struct ufs_hba g_ufs_hba = {0};
  79. struct ufs_platform_info ufs_platform = {0};
  80. static struct utp_transfer_cmd_desc ufs_ucdl[UFS_AIO_MAX_NUTRS] __attribute__((aligned(UFS_ALIGN_UCD)));
  81. static struct utp_transfer_req_desc ufs_utrdl[UTRD_NUTRS] __attribute__((aligned(UFS_ALIGN_UTRD)));
  82. static struct ufshcd_lrb ufs_lrb[UFS_AIO_MAX_NUTRS];
  83. unsigned char ufs_req_upiu[UPIU_CMD_BUF_SIZE]; /* for PIO only */
  84. unsigned char ufs_resp_upiu[UPIU_CMD_BUF_SIZE]; /* for PIO only */
  85. /* static struct utp_task_req_desc ufs_utmrdl[UFS_AIO_MAX_NUTMRS] __ALIGNED(UFS_ALIGN_UTMRD); */
  86. /* static u32 ufs_sense_buf[(UFS_AIO_MAX_NUTRS * SCSI_SENSE_BUFFERSIZE) / sizeof(u32)]; */
  87. /**
  88. * g_ufs_temp_buf, for
  89. * 1. ufshcd_read_desc_param: read partial descriptor case. Size limit: UFS_TEMP_BUF_SIZE (256 bytes)
  90. * 2. ufshcd_read_string_desc: used for destination buffer of utf16s_to_utf8s
  91. */
  92. unsigned char g_ufs_temp_buf[UFS_TEMP_BUF_SIZE] __attribute__((aligned(UFS_PLATFORM_CACHE_LINE_SIZE)));
  93. static u32 ufs_query_desc_max_size[] = {
  94. QUERY_DESC_DEVICE_MAX_SIZE,
  95. QUERY_DESC_CONFIGURAION_MAX_SIZE_HPB_20,
  96. QUERY_DESC_UNIT_MAX_SIZE,
  97. QUERY_DESC_RFU_MAX_SIZE,
  98. QUERY_DESC_INTERCONNECT_MAX_SIZE,
  99. QUERY_DESC_STRING_MAX_SIZE,
  100. QUERY_DESC_RFU_MAX_SIZE,
  101. QUERY_DESC_GEOMETRY_MAX_SIZE,
  102. QUERY_DESC_POWER_MAX_SIZE,
  103. QUERY_DESC_HEALTH_MAX_SIZE,
  104. QUERY_DESC_RFU_MAX_SIZE,
  105. };
  106. int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val, u8 peer);
  107. int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, u32 mib_val, u8 peer);
  108. int ufshcd_wait_command(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, u32 timeout_ms);
  109. static void ufs_aio_reset_device(struct ufs_hba *hba);
  110. static void ufs_aio_advertise_hci_quirks(struct ufs_hba *hba);
  111. static int ufs_aio_bootrom_deputy(struct ufs_hba *hba);
  112. static void ufs_aio_dma_map(ufs_vaddr_t buf, ufs_size_t len, enum dma_data_direction dir);
  113. static void ufs_aio_dma_unmap(ufs_vaddr_t buf, ufs_size_t len, enum dma_data_direction dir);
  114. int ufs_aio_pio_read_flag(struct ufs_hba *hba, unsigned char flag_idx, bool *value);
  115. int ufs_aio_pio_set_flag(struct ufs_hba *hba, unsigned char flag_idx);
  116. static int ufs_aio_post_link(struct ufs_hba *hba);
  117. static int ufs_aio_pre_link(struct ufs_hba *hba);
  118. static int ufs_aio_pre_pwr_change(struct ufs_hba *hba, struct ufs_pa_layer_attr *desired, struct ufs_pa_layer_attr *final);
  119. static int ufs_aio_prepare_new_ufs(struct ufs_hba *hba);
  120. static int ufs_aio_test_unit_ready_all_device(struct ufs_hba *hba);
  121. static void ufshcd_init_desc_sizes(struct ufs_hba *hba);
  122. static int ufshcd_init_vendor_desc_sizes(struct ufs_hba *hba);
  123. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  124. extern void arch_clean_invalidate_cache_range(ufs_vaddr_t start, ufs_size_t len);
  125. extern void arch_sync_cache_range(ufs_vaddr_t start, ufs_size_t len);
  126. void ufshcd_irq_handler(unsigned int irq)
  127. {
  128. struct ufs_hba *hba = &g_ufs_hba;
  129. struct ufshcd_lrb *lrbp;
  130. u32 tag_mask;
  131. u32 tr_doorbell;
  132. tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
  133. lrbp = &hba->lrb[0];
  134. tag_mask = 1 << lrbp->task_tag;
  135. if (!(tag_mask & tr_doorbell)) {
  136. /* Clear_bit(lrbp->task_tag, &hba->outstanding_reqs); */
  137. hba->outstanding_reqs &= ~(tag_mask);
  138. /* Save interrupt status and clear it */
  139. ufshcd_intr_status = ufs_aio_readl(hba, REG_INTERRUPT_STATUS);
  140. ufshcd_writel(hba, ufshcd_intr_status, REG_INTERRUPT_STATUS);
  141. /* dsb make sure clear initerrupt status */
  142. dsb();
  143. /* Wakeup ufshcd_wait_command */
  144. event_signal(&ufshcd_intr_event, 0);
  145. }
  146. /* Let irq handler can enter again, must put in irq handler bottom */
  147. mt_irq_ack(irq);
  148. }
  149. __WEAK int ufs_get_irq_id(void)
  150. {
  151. return 0xFFFFFFFF;
  152. }
  153. static int ufshcd_irq_init(struct ufs_hba *hba)
  154. {
  155. hba->irq = ufs_get_irq_id();
  156. if (hba->irq == 0xFFFFFFFF)
  157. return -1;
  158. /* Set ufs interrupt level, polarity */
  159. mt_irq_set_sens(hba->irq, MT65xx_LEVEL_SENSITIVE);
  160. mt_irq_set_polarity(hba->irq, MT65xx_POLARITY_LOW);
  161. /* Init event for thread function ufshcd_wait_command sleep/wakeup */
  162. event_init(&ufshcd_intr_event, false, EVENT_FLAG_AUTOUNSIGNAL);
  163. /*
  164. * Mask all interrupt first, only unmask before thread sleep and wait.
  165. * Else there may have un-wanted interrupt come in, which is need by
  166. * polling function, like UIC_COMMAND_COMPL
  167. */
  168. mt_irq_mask(hba->irq);
  169. return 0;
  170. }
  171. #endif
  172. /* Platform different need implement it's ufs_get_platform_data */
  173. __WEAK void ufs_get_platform_data(void)
  174. {
  175. ufs_platform.hci_base = (void*) 0x11270000;
  176. ufs_platform.pericfg_base = (void *)0x10003000;
  177. ufs_platform.mphy_base = (void *)0x11FA0000;
  178. ufs_platform.reg_ufs_pericfg = 0x448;
  179. ufs_platform.reg_ufs_pericfg_rst_n_bit = 3;
  180. ufs_platform.reg_ufs_pericfg_ldo_n_bit = 0xF;
  181. ufs_platform.reg_ufs_pericfg_lp_n_bit = 0xF;
  182. ufs_platform.highspeed_gear = UFS_HS_G3;
  183. }
  184. static inline void ufshcd_get_host_capabilities(struct ufs_hba *hba)
  185. {
  186. /* for AIO driver, only 1 task is enough */
  187. hba->nutrs = UFS_AIO_MAX_NUTRS;
  188. /* hba->nutmrs = UFS_AIO_MAX_NUTMRS; */
  189. }
  190. void ufshcd_power(struct ufs_hba *hba, bool on)
  191. {
  192. }
  193. void ufshcd_clock(struct ufs_hba *hba, u8 on)
  194. {
  195. }
  196. /**
  197. * ufshcd_memory_alloc - allocate memory for hba memory space data structures
  198. * @hba: per adapter instance
  199. *
  200. * 1. Allocate DMA memory for Command Descriptor array
  201. * Each command descriptor consist of Command UPIU, Response UPIU and PRDT
  202. * 2. Allocate DMA memory for UTP Transfer Request Descriptor List (UTRDL).
  203. * 3. Allocate DMA memory for UTP Task Management Request Descriptor List
  204. * (UTMRDL)
  205. * 4. Allocate memory for local reference block(lrb).
  206. *
  207. * Returns 0 for success, non-zero in case of failure
  208. */
  209. static int ufshcd_memory_alloc(struct ufs_hba *hba)
  210. {
  211. /* u32 i; */
  212. /* u8 *ptr; */
  213. /* Allocate memory for UTP command descriptors */
  214. hba->ucdl_base_addr = (struct utp_transfer_cmd_desc *)&ufs_ucdl[0];
  215. hba->ucdl_dma_addr = (ufs_paddr_t)hba->ucdl_base_addr;
  216. if (hba->ucdl_dma_addr & (UFS_ALIGN_UCD - 1)) {
  217. UFS_DBG_LOGD("memory alignment failed: ucdl, addr 0x%x, shall align %d\n", (unsigned int)hba->ucdl_dma_addr, UFS_ALIGN_UCD);
  218. goto out;
  219. }
  220. /*
  221. * Allocate memory for UTP Transfer descriptors
  222. * UFSHCI requires 1024 byte alignment of UTRD
  223. */
  224. hba->utrdl_base_addr = (struct utp_transfer_req_desc *)&ufs_utrdl[0];
  225. hba->utrdl_dma_addr = (ufs_paddr_t)hba->utrdl_base_addr;
  226. if (hba->utrdl_dma_addr & (UFS_ALIGN_UTRD - 1)) {
  227. UFS_DBG_LOGD("memory alignment failed: utrdl, addr 0x%x, shall align %d\n", (unsigned int)hba->utrdl_dma_addr, UFS_ALIGN_UTRD);
  228. goto out;
  229. }
  230. /*
  231. * Note. UFSHCI 2.1 requires 1024-byte alignment for UTRD (UTP Transfer Request Descriptor)
  232. *
  233. * SW tricks:
  234. * 1. Fill-in UFS_HCI_REG_UTRLBA a 1024-byte alignment address to assume the 1st UTRD entry (task ID = 0) is in that address.
  235. * 2. Since every UTRD entry is fixed to 32 bytes, now we can use our real UTRD base address by using "its" task ID.
  236. */
  237. hba->active_tr_tag = (u8)(((unsigned long)hba->utrdl_base_addr & UFS_1KB_MASK) / sizeof(struct utp_transfer_req_desc));
  238. #if 0
  239. /*
  240. * Allocate memory for UTP Task Management descriptors
  241. * UFSHCI requires 1024 byte alignment of UTMRD
  242. */
  243. hba->utmrdl_base_addr = (utp_task_req_desc *)&ufs_utmrdl[0];
  244. hba->utmrdl_dma_addr = (ufs_paddr_t)hba->utmrdl_base_addr;
  245. if (hba->utmrdl_dma_addr & (UFS_ALIGN_UTMRD - 1)) {
  246. UFS_DBG_LOGD("memory alignment failed: utmrdl, addr 0x%x, shall align %d\n", hba->utmrdl_dma_addr, UFS_ALIGN_UTMRD);
  247. goto out;
  248. }
  249. hba->active_tm_tag = (hba->utmrdl_base_addr & UFS_1KB_MASK) / sizeof(struct utp_task_req_desc);
  250. #endif
  251. /* Allocate memory for local reference block */
  252. hba->lrb = &ufs_lrb[0];
  253. #if 0
  254. /* Allocate memory for SCSI sense buffer */
  255. ptr = &(ufs_sense_buf[0]);
  256. for (i = 0; i < UFS_AIO_MAX_NUTRS; i++, ptr += SCSI_SENSE_BUFFERSIZE)
  257. hba->sense_buf_base_addr[i] = hba->sense_buf_dma_addr[i] = ptr;
  258. #endif
  259. return 0;
  260. out:
  261. return -1;
  262. }
  263. static void ufshcd_host_memory_configure(struct ufs_hba *hba)
  264. {
  265. int i;
  266. int cmd_desc_size;
  267. u16 prdt_offset;
  268. u16 response_offset;
  269. ufs_paddr_t cmd_desc_element_addr;
  270. ufs_paddr_t cmd_desc_dma_addr;
  271. struct utp_transfer_req_desc *utrdlp;
  272. struct utp_transfer_cmd_desc *cmd_descp;
  273. cmd_descp = hba->ucdl_base_addr;
  274. utrdlp = hba->utrdl_base_addr;
  275. prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table);
  276. response_offset = offsetof(struct utp_transfer_cmd_desc, response_upiu);
  277. cmd_desc_dma_addr = hba->ucdl_dma_addr;
  278. cmd_desc_size = sizeof(struct utp_transfer_cmd_desc);
  279. for (i = 0; i < hba->nutrs; i++) {
  280. cmd_desc_element_addr =
  281. (cmd_desc_dma_addr + (cmd_desc_size * i));
  282. utrdlp[i].command_desc_base_addr_hi = cpu_to_le32(upper_32_bits(cmd_desc_element_addr));
  283. utrdlp[i].command_desc_base_addr_lo = cpu_to_le32(lower_32_bits(cmd_desc_element_addr));
  284. utrdlp[i].response_upiu_length = cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
  285. utrdlp[i].prd_table_offset = cpu_to_le16((prdt_offset >> 2));
  286. utrdlp[i].response_upiu_offset = cpu_to_le16((response_offset >> 2));
  287. hba->lrb[i].ucd_prdt_ptr = (struct ufshcd_sg_entry *)cmd_descp[i].prd_table;
  288. hba->lrb[i].ucd_req_ptr = (struct utp_upiu_req *)(cmd_descp + i);
  289. hba->lrb[i].ucd_rsp_ptr = (struct utp_upiu_rsp *)cmd_descp[i].response_upiu;
  290. hba->lrb[i].utr_descriptor_ptr = (utrdlp + i);
  291. }
  292. }
  293. /**
  294. * ufshcd_enable_intr - enable interrupts
  295. * @hba: per adapter instance
  296. * @intrs: interrupt bits
  297. */
  298. static void ufshcd_enable_intr(struct ufs_hba *hba, u32 intrs)
  299. {
  300. u32 set = ufshcd_readl(hba, REG_INTERRUPT_ENABLE);
  301. set |= intrs;
  302. ufshcd_writel(hba, set, REG_INTERRUPT_ENABLE);
  303. }
  304. static int ufshcd_hba_enable(struct ufs_hba *hba)
  305. {
  306. int retry;
  307. if ((ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & 0x1) == 1) {
  308. ufshcd_writel(hba, CONTROLLER_DISABLE, REG_CONTROLLER_ENABLE);
  309. msleep(5);
  310. }
  311. /*
  312. * Reset device after hba disabled
  313. * This is to make sure host TX is idle
  314. * when resetting device.
  315. */
  316. ufs_aio_reset_device(hba);
  317. ufshcd_writel(hba, CONTROLLER_ENABLE, REG_CONTROLLER_ENABLE);
  318. msleep(1);
  319. retry = 20;
  320. while ((ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & 0x1) == 0) {
  321. if (retry) {
  322. retry--;
  323. } else {
  324. UFS_DBG_LOGE("Controller enable failed\n");
  325. return -1;
  326. }
  327. msleep(5);
  328. }
  329. /* enable UIC related interrupts */
  330. ufshcd_enable_intr(hba, UFSHCD_UIC_MASK);
  331. return 0;
  332. }
  333. static int
  334. __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
  335. {
  336. if (!(ufshcd_readl(hba, REG_CONTROLLER_STATUS) & UIC_COMMAND_READY)) {
  337. UFS_DBG_LOGD("Controller not ready to accept UIC commands\n");
  338. return -1;
  339. }
  340. UFS_DBG_LOGD("[UFS] info: UCMD:%x,%x,%x,%x\n", uic_cmd->command, uic_cmd->argument1, uic_cmd->argument2, uic_cmd->argument3);
  341. hba->active_uic_cmd = uic_cmd;
  342. ufshcd_writel(hba, uic_cmd->argument1, REG_UIC_COMMAND_ARG_1);
  343. ufshcd_writel(hba, uic_cmd->argument2, REG_UIC_COMMAND_ARG_2);
  344. ufshcd_writel(hba, uic_cmd->argument3, REG_UIC_COMMAND_ARG_3);
  345. ufshcd_writel(hba, uic_cmd->command & COMMAND_OPCODE_MASK, REG_UIC_COMMAND);
  346. return 0;
  347. }
  348. static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
  349. u32 val, unsigned long interval_us, unsigned long timeout_ms)
  350. {
  351. unsigned long elapsed_us = 0;
  352. int err = 0;
  353. val &= mask;
  354. while (val != (ufshcd_readl(hba, reg) & mask)) {
  355. /* wakeup within 50us of expiry */
  356. usleep(interval_us);
  357. elapsed_us += interval_us;
  358. if (elapsed_us > timeout_ms * 1000) {
  359. if ((ufshcd_readl(hba, reg) & mask) != val)
  360. err = -1;
  361. break;
  362. }
  363. }
  364. return err;
  365. }
  366. static void ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status)
  367. {
  368. if ((intr_status & UIC_COMMAND_COMPL) && hba->active_uic_cmd) {
  369. hba->active_uic_cmd->argument2 |=
  370. (ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2) & MASK_UIC_COMMAND_RESULT);
  371. hba->active_uic_cmd->argument3 = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3);
  372. }
  373. }
  374. static int ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
  375. {
  376. int ret;
  377. ret = ufshcd_wait_for_register(hba, REG_INTERRUPT_STATUS,
  378. UIC_COMMAND_COMPL, UIC_COMMAND_COMPL,
  379. 100, UIC_CMD_TIMEOUT);
  380. if (!ret) {
  381. ufshcd_writel(hba, UIC_COMMAND_COMPL,
  382. REG_INTERRUPT_STATUS);
  383. ufshcd_uic_cmd_compl(hba, UIC_COMMAND_COMPL);
  384. } else {
  385. UFS_DBG_LOGD("ufshcd_wait_for_uic_cmd error! ret: %d\n", ret);
  386. }
  387. hba->active_uic_cmd = NULL;
  388. return ret;
  389. }
  390. static int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
  391. {
  392. int ret;
  393. ret = __ufshcd_send_uic_cmd(hba, uic_cmd);
  394. if (!ret)
  395. ret = ufshcd_wait_for_uic_cmd(hba, uic_cmd);
  396. return ret;
  397. }
  398. int ufshcd_uic_cmd_run(struct ufs_hba *hba, struct uic_command *cmds, int ncmds)
  399. {
  400. int i;
  401. int err = 0;
  402. for (i = 0; i < ncmds; i++) {
  403. err = ufshcd_send_uic_cmd(hba, &cmds[i]);
  404. if (err) {
  405. UFS_DBG_LOGD("ufshcd_uic_cmd_run fail, cmd: %x, arg1: %x\n", cmds->command, cmds->argument1);
  406. /* send next commands anyway */
  407. }
  408. }
  409. return err;
  410. }
  411. static int ufshcd_dme_link_startup(struct ufs_hba *hba)
  412. {
  413. struct uic_command uic_cmd = {0};
  414. uic_cmd.command = UIC_CMD_DME_LINK_STARTUP;
  415. return ufshcd_send_uic_cmd(hba, &uic_cmd);
  416. }
  417. /**
  418. * ufshcd_is_device_present - Check if any device connected to
  419. * the host controller
  420. * @hba: pointer to adapter instance
  421. *
  422. * Returns 1 if device present, 0 if no device detected
  423. */
  424. static inline int ufshcd_is_device_present(struct ufs_hba *hba)
  425. {
  426. return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) &
  427. DEVICE_PRESENT) ? 1 : 0;
  428. }
  429. /**
  430. * ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY
  431. * @reg: Register value of host controller status
  432. *
  433. * Returns integer, 0 on Success and positive value if failed
  434. */
  435. static inline int ufshcd_get_lists_status(u32 reg)
  436. {
  437. /*
  438. * The mask 0xFF is for the following HCS register bits
  439. * Bit Description
  440. * 0 Device Present
  441. * 1 UTRLRDY
  442. * 2 UTMRLRDY
  443. * 3 UCRDY
  444. * 4 HEI
  445. * 5 DEI
  446. * 6-7 reserved
  447. */
  448. return (((reg) & (0xFF)) >> 1) ^ (0x07);
  449. }
  450. /**
  451. * ufshcd_enable_run_stop_reg - Enable run-stop registers,
  452. * When run-stop registers are set to 1, it indicates the
  453. * host controller that it can process the requests
  454. * @hba: per adapter instance
  455. */
  456. static void ufshcd_enable_run_stop_reg(struct ufs_hba *hba)
  457. {
  458. ufshcd_writel(hba, UTP_TASK_REQ_LIST_RUN_STOP_BIT,
  459. REG_UTP_TASK_REQ_LIST_RUN_STOP);
  460. ufshcd_writel(hba, UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT,
  461. REG_UTP_TRANSFER_REQ_LIST_RUN_STOP);
  462. }
  463. static int ufshcd_make_hba_operational(struct ufs_hba *hba)
  464. {
  465. int err = 0;
  466. u32 reg;
  467. ufshcd_writel(hba, upper_32_bits(hba->utrdl_dma_addr),
  468. REG_UTP_TRANSFER_REQ_LIST_BASE_H);
  469. ufshcd_writel(hba, lower_32_bits(hba->utrdl_dma_addr),
  470. REG_UTP_TRANSFER_REQ_LIST_BASE_L);
  471. ufshcd_enable_intr(hba, UFSHCD_ENABLE_INTRS);
  472. reg = ufshcd_readl(hba, REG_CONTROLLER_STATUS);
  473. if ((ufshcd_get_lists_status(reg)) == 0) {
  474. ufshcd_enable_run_stop_reg(hba);
  475. } else {
  476. UFS_DBG_LOGD("Host controller not ready to process requests");
  477. err = -1;
  478. }
  479. return err;
  480. }
  481. /**
  482. * ufshcd_link_startup - Initialize unipro link startup
  483. * @hba: per adapter instance
  484. *
  485. * Returns 0 for success, non-zero in case of failure
  486. */
  487. static int ufshcd_link_startup(struct ufs_hba *hba)
  488. {
  489. int ret;
  490. int retries = DME_LINKSTARTUP_RETRIES;
  491. do {
  492. ufs_aio_pre_link(hba);
  493. ret = ufshcd_dme_link_startup(hba);
  494. if (ret) {
  495. UFS_DBG_LOGE("link: UIC command fail\n");
  496. goto retry;
  497. }
  498. /* check if device is detected by inter-connect layer */
  499. if (!ufshcd_is_device_present(hba)) {
  500. UFS_DBG_LOGE("link: Device not present\n");
  501. ret = -1;
  502. /* directly go through to retry section */
  503. }
  504. retry:
  505. /*
  506. * DME link lost indication is only received when link is up,
  507. * but we can't be sure if the link is up until link startup
  508. * succeeds. So reset the local Uni-Pro and try again.
  509. */
  510. if (ret) {
  511. UFS_DBG_LOGE("link startup fail, retrying the %d times ...\n", DME_LINKSTARTUP_RETRIES - retries + 1);
  512. if (ufshcd_hba_enable(hba)) {
  513. /* critical error: controller is not working now, keep ret and goto out */
  514. goto out;
  515. }
  516. }
  517. } while (ret && retries--);
  518. if (ret)
  519. /* failed to get the link up... retire */
  520. goto out;
  521. /* Include any host controller configuration via UIC commands */
  522. ret = ufs_aio_post_link(hba);
  523. if (ret)
  524. goto out;
  525. ret = ufshcd_make_hba_operational(hba);
  526. out:
  527. if (ret)
  528. UFS_DBG_LOGE("link startup failed %d\n", ret);
  529. return ret;
  530. }
  531. /**
  532. * ufshcd_init_pwr_info - setting the POR (power on reset)
  533. * values in hba power info
  534. * @hba: per-adapter instance
  535. */
  536. static void ufshcd_init_pwr_info(struct ufs_hba *hba)
  537. {
  538. hba->pwr_info.gear_rx = UFS_PWM_G1;
  539. hba->pwr_info.gear_tx = UFS_PWM_G1;
  540. hba->pwr_info.lane_rx = 1;
  541. hba->pwr_info.lane_tx = 1;
  542. hba->pwr_info.pwr_rx = SLOW_MODE;
  543. hba->pwr_info.pwr_tx = SLOW_MODE;
  544. hba->pwr_info.hs_rate = 1;
  545. }
  546. /**
  547. * ufshcd_get_dev_cmd_tag - Get device management command tag
  548. * @hba: per-adapter instance
  549. * @tag: pointer to variable with available slot value
  550. *
  551. * Get a free slot and lock it until device management command
  552. * completes.
  553. *
  554. * Returns FALSE if free slot is unavailable for locking, else
  555. * return TRUE with tag value in @tag.
  556. */
  557. bool ufshcd_get_free_tag(struct ufs_hba *hba, int *tag_out)
  558. {
  559. #ifdef UFS_CFG_SINGLE_COMMAND
  560. if (!tag_out)
  561. return FALSE;
  562. if (hba->lrb_in_use & (1 << hba->active_tr_tag)) {
  563. UFS_DBG_LOGE("[UFS] ufshcd_get_free_tag fail\n");
  564. return FALSE;
  565. }
  566. else {
  567. hba->lrb_in_use |= (1 << hba->active_tr_tag);
  568. *tag_out = hba->active_tr_tag;
  569. return TRUE;
  570. }
  571. #else /* !UFS_CFG_SINGLE_COMMAND */
  572. int tag;
  573. bool ret = FALSE;
  574. unsigned long tmp;
  575. if (!tag_out)
  576. goto out;
  577. do {
  578. tmp = ~hba->lrb_in_use;
  579. tag = find_last_bit(&tmp, hba->nutrs);
  580. if (tag >= hba->nutrs)
  581. goto out;
  582. } while (test_and_set_bit(tag, &hba->lrb_in_use));
  583. *tag_out = tag;
  584. ret = TRUE;
  585. out:
  586. return ret;
  587. #endif /* UFS_CFG_SINGLE_COMMAND */
  588. }
  589. void ufshcd_put_tag(struct ufs_hba *hba, int tag)
  590. {
  591. /* clear_bit(tag, &hba->lrb_in_use); */
  592. hba->lrb_in_use &= ~(1 << tag);
  593. }
  594. static void ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba,
  595. struct ufshcd_lrb *lrbp,
  596. u32 *upiu_flags, enum dma_data_direction cmd_dir)
  597. {
  598. struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
  599. u32 data_direction;
  600. u32 dword_0;
  601. if (cmd_dir == DMA_FROM_DEVICE) {
  602. data_direction = UTP_DEVICE_TO_HOST;
  603. *upiu_flags = UPIU_CMD_FLAGS_READ;
  604. } else if (cmd_dir == DMA_TO_DEVICE) {
  605. data_direction = UTP_HOST_TO_DEVICE;
  606. *upiu_flags = UPIU_CMD_FLAGS_WRITE;
  607. } else {
  608. data_direction = UTP_NO_DATA_TRANSFER;
  609. *upiu_flags = UPIU_CMD_FLAGS_NONE;
  610. }
  611. dword_0 = data_direction;
  612. dword_0 |= 1 << UPIU_COMMAND_TYPE_OFFSET;
  613. #ifdef UFS_CFG_CRYPTO
  614. if (lrbp->crypto_en) {
  615. dword_0 |= (1 << UPIU_COMMAND_CRYPTO_EN_OFFSET); /* crypto enable */
  616. dword_0 |= lrbp->crypto_cfgid;
  617. req_desc->header.dword_1 = cpu_to_le32(lrbp->crypto_dunl);
  618. req_desc->header.dword_3 = cpu_to_le32(lrbp->crypto_dunu);
  619. }
  620. #endif
  621. if (lrbp->intr_cmd)
  622. dword_0 |= UTP_REQ_DESC_INT_CMD;
  623. req_desc->header.dword_2 = cpu_to_le32(OCS_INVALID_COMMAND_STATUS);
  624. req_desc->header.dword_0 = cpu_to_le32(dword_0);
  625. }
  626. static void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufshcd_lrb *lrbp, u32 upiu_flags)
  627. {
  628. struct utp_upiu_req *ucd_req = lrbp->ucd_req_ptr;
  629. ucd_req->sc.exp_data_transfer_len = cpu_to_be32(lrbp->cmd->exp_len);
  630. ucd_req->header.dword_2 = 0;
  631. ucd_req->header.dword_1 = UPIU_HEADER_DWORD(
  632. UPIU_COMMAND_SET_TYPE_SCSI, 0, 0, 0);
  633. ucd_req->header.dword_0 = UPIU_HEADER_DWORD(
  634. UPIU_TRANSACTION_COMMAND, upiu_flags,
  635. lrbp->lun, lrbp->task_tag);
  636. memcpy(ucd_req->sc.cdb, lrbp->cmd->cmd_data, (min_t(unsigned short, lrbp->cmd->cmd_len, MAX_CDB_SIZE)));
  637. }
  638. static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
  639. struct ufshcd_lrb *lrbp, u32 upiu_flags)
  640. {
  641. u8 *descp = (u8 *)lrbp->ucd_req_ptr + GENERAL_UPIU_REQUEST_SIZE;
  642. struct ufs_query *query = &hba->dev_cmd.query;
  643. u16 len = be16_to_cpu(query->request.upiu_req.length);
  644. struct utp_upiu_req *ucd_req = lrbp->ucd_req_ptr;
  645. ucd_req->header.dword_2 = UPIU_HEADER_DWORD(
  646. 0, 0, len >> 8, (u8)len);
  647. ucd_req->header.dword_1 = UPIU_HEADER_DWORD(
  648. 0, query->request.query_func, 0, 0);
  649. ucd_req->header.dword_0 = UPIU_HEADER_DWORD(
  650. UPIU_TRANSACTION_QUERY_REQ, upiu_flags,
  651. lrbp->lun, lrbp->task_tag);
  652. /* Copy the Query Request buffer as is */
  653. memcpy(&ucd_req->qr, &query->request.upiu_req, QUERY_OSF_SIZE);
  654. /* Copy the Descriptor */
  655. if (query->request.upiu_req.opcode == UPIU_QUERY_OPCODE_WRITE_DESC) {
  656. memcpy(descp, query->descriptor, len);
  657. /*
  658. * ufshcd_send_command() only flushes length of sizeof(struct utp_upiu_req).
  659. * For Write Descriptor, we may need to flush more data range.
  660. */
  661. ufs_aio_dma_map((unsigned long)descp, len, DMA_TO_DEVICE);
  662. }
  663. }
  664. static int ufshcd_compose_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
  665. {
  666. u32 upiu_flags;
  667. int ret = 0;
  668. switch (lrbp->command_type) {
  669. case UTP_CMD_TYPE_SCSI:
  670. if (lrbp->cmd) {
  671. /* prepare transfer request descriptor */
  672. ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, lrbp->cmd->dir);
  673. /* prepare COMMAND UPIU */
  674. ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
  675. } else {
  676. ret = -1;
  677. }
  678. break;
  679. case UTP_CMD_TYPE_DEV_MANAGE:
  680. ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE);
  681. if (hba->dev_cmd.type == DEV_CMD_TYPE_QUERY)
  682. ufshcd_prepare_utp_query_req_upiu(hba, lrbp, upiu_flags);
  683. else if (hba->dev_cmd.type == DEV_CMD_TYPE_NOP) {
  684. memset(lrbp->ucd_req_ptr, 0, sizeof(struct utp_upiu_req));
  685. lrbp->ucd_req_ptr->header.dword_0 = UPIU_HEADER_DWORD(UPIU_TRANSACTION_NOP_OUT, 0, 0, lrbp->task_tag);
  686. }
  687. else
  688. ret = -1;
  689. break;
  690. case UTP_CMD_TYPE_UFS:
  691. /* For UFS native command implementation */
  692. ret = -1;
  693. UFS_DBG_LOGD("UFS native command are not supported\n");
  694. break;
  695. default:
  696. ret = -1;
  697. UFS_DBG_LOGD("unknown command type: 0x%x\n", lrbp->command_type);
  698. break;
  699. } /* end of switch */
  700. return ret;
  701. }
  702. static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
  703. struct ufshcd_lrb *lrbp, enum dev_cmd_type cmd_type, int tag)
  704. {
  705. lrbp->cmd = NULL;
  706. /* lrbp->sense_bufflen = 0; */
  707. /* lrbp->sense_buffer = NULL; */
  708. lrbp->task_tag = tag;
  709. lrbp->lun = 0; /* device management cmd is not specific to any LUN */
  710. lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
  711. lrbp->intr_cmd = TRUE; /* No interrupt aggregation */
  712. hba->dev_cmd.type = cmd_type;
  713. #ifdef UFS_CFG_CRYPTO
  714. lrbp->crypto_en = 0;
  715. #endif
  716. return ufshcd_compose_upiu(hba, lrbp);
  717. }
  718. /**
  719. * ufshcd_send_command - Send SCSI or device management commands
  720. * @hba: per adapter instance
  721. * @task_tag: Task tag of the command
  722. */
  723. static inline void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
  724. {
  725. volatile u32 intr_status;
  726. /* set_bit(task_tag, &hba->outstanding_reqs); */
  727. hba->outstanding_reqs |= (1 << task_tag);
  728. #ifdef UFS_CFG_SINGLE_COMMAND
  729. /* flush COMMAND UPIU */
  730. ufs_aio_dma_map((unsigned long)hba->lrb->ucd_req_ptr, sizeof(struct utp_upiu_req), DMA_TO_DEVICE);
  731. /* invalidate RESPONSE UPIU */
  732. ufs_aio_dma_map((unsigned long)hba->lrb->ucd_rsp_ptr, sizeof(struct utp_upiu_rsp), DMA_FROM_DEVICE);
  733. /* flush PRDT */
  734. ufs_aio_dma_map((unsigned long)hba->lrb->ucd_prdt_ptr, sizeof(struct ufs_aio_sg_entry) * UFS_AIO_MAX_SG_SEGMENTS, DMA_TO_DEVICE);
  735. /* invalidate transfer request descriptor (UTRD) */
  736. ufs_aio_dma_map((unsigned long)hba->lrb->utr_descriptor_ptr, sizeof(struct utp_transfer_req_desc), DMA_BIDIRECTIONAL);
  737. #else
  738. #error "Err: UFS AIO driver does not support multiple commands now."
  739. #endif
  740. /* clear interrupt status */
  741. intr_status = ufs_aio_readl(hba, REG_INTERRUPT_STATUS);
  742. if (intr_status)
  743. ufs_aio_writel(hba, intr_status, REG_INTERRUPT_STATUS);
  744. ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL);
  745. }
  746. /**
  747. * ufshcd_exec_dev_cmd - API for sending device management requests
  748. * @hba - UFS hba
  749. * @cmd_type - specifies the type (NOP, Query...)
  750. * @timeout - time in seconds
  751. *
  752. * NOTE: Since there is only one available tag for device management commands,
  753. * it is expected you hold the hba->dev_cmd.lock mutex.
  754. */
  755. static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
  756. enum dev_cmd_type cmd_type, u32 timeout)
  757. {
  758. struct ufshcd_lrb *lrbp;
  759. int err;
  760. int tag;
  761. if (!ufshcd_get_free_tag(hba, &tag))
  762. return -1;
  763. #ifdef UFS_CFG_SINGLE_COMMAND
  764. lrbp = &hba->lrb[0];
  765. #else
  766. lrbp = &hba->lrb[tag];
  767. #endif
  768. err = ufshcd_compose_dev_cmd(hba, lrbp, cmd_type, tag);
  769. if (err)
  770. goto out_put_tag;
  771. ufshcd_send_command(hba, tag);
  772. err = ufshcd_wait_command(hba, lrbp, timeout);
  773. out_put_tag:
  774. ufshcd_put_tag(hba, tag);
  775. return err;
  776. }
  777. static inline void ufshcd_init_query(struct ufs_hba *hba,
  778. struct ufs_query_req **request, struct ufs_query_res **response,
  779. enum query_opcode opcode, u8 idn, u8 index, u8 selector)
  780. {
  781. *request = &hba->dev_cmd.query.request;
  782. *response = &hba->dev_cmd.query.response;
  783. memset(*request, 0, sizeof(struct ufs_query_req));
  784. memset(*response, 0, sizeof(struct ufs_query_res));
  785. (*request)->upiu_req.opcode = opcode;
  786. (*request)->upiu_req.idn = idn;
  787. (*request)->upiu_req.index = index;
  788. (*request)->upiu_req.selector = selector;
  789. }
  790. /**
  791. * ufshcd_complete_dev_init() - checks device readiness
  792. * hba: per-adapter instance
  793. *
  794. * Set fDeviceInit flag and poll until device toggles it.
  795. */
  796. static int ufshcd_complete_dev_init(struct ufs_hba *hba)
  797. {
  798. int retries, err = 0;
  799. bool flag_res = 1;
  800. u32 start_tick, timeout_tick;
  801. for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) {
  802. /* Set the fDeviceInit flag */
  803. err = hba->query_flag(hba, UPIU_QUERY_OPCODE_SET_FLAG, QUERY_FLAG_IDN_FDEVICEINIT, NULL);
  804. if (!err)
  805. break;
  806. UFS_DBG_LOGD("error %d retrying\n", err);
  807. }
  808. if (err) {
  809. UFS_DBG_LOGD("setting fDeviceInit flag failed with error %d\n", err);
  810. goto out;
  811. }
  812. // get timeout tick
  813. timeout_tick = gpt4_time2tick_us (UFS_FDEVICEINIT_TIMEOUT_US);
  814. start_tick = gpt4_get_current_tick ();
  815. /* poll for max. UFS_FDEVICEINIT_TIMEOUT_US(5s) for fDeviceInit flag to clear */
  816. do {
  817. for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) {
  818. err = hba->query_flag(hba, UPIU_QUERY_OPCODE_READ_FLAG, QUERY_FLAG_IDN_FDEVICEINIT, &flag_res);
  819. if (!err)
  820. break;
  821. UFS_DBG_LOGD("error %d retrying\n", err);
  822. }
  823. } while (!err && flag_res && !gpt4_timeout_tick (start_tick, timeout_tick));
  824. if (err)
  825. UFS_DBG_LOGD("reading fDeviceInit flag failed with error %d\n", err);
  826. else if (flag_res) {
  827. UFS_DBG_LOGD("fDeviceInit was not cleared by the device\n");
  828. err = UFS_ERR_FDEVICEINIT_NOT_CLR;
  829. }
  830. out:
  831. return err;
  832. }
  833. int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val, u8 peer)
  834. {
  835. int ret;
  836. struct uic_command uic_cmd = {0};
  837. uic_cmd.argument1 = attr_sel;
  838. uic_cmd.command = peer ? UIC_CMD_DME_PEER_GET : UIC_CMD_DME_GET;
  839. ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
  840. if (mib_val && !ret)
  841. *mib_val = uic_cmd.argument3;
  842. if (ret)
  843. UFS_DBG_LOGD("attr-id 0x%x error code %d\n", UIC_GET_ATTR_ID(attr_sel), ret);
  844. return ret;
  845. }
  846. /**
  847. * ufshcd_dme_set_attr - UIC command for DME_SET, DME_PEER_SET
  848. * @hba: per adapter instance
  849. * @attr_sel: uic command argument1
  850. * @attr_set: attribute set type as uic command argument2
  851. * @mib_val: setting value as uic command argument3
  852. * @peer: indicate whether peer or local
  853. *
  854. * Returns 0 on success, non-zero value on failure
  855. */
  856. int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, u32 mib_val, u8 peer)
  857. {
  858. struct uic_command uic_cmd = {0};
  859. int ret;
  860. uic_cmd.command = peer ? UIC_CMD_DME_PEER_SET : UIC_CMD_DME_SET;
  861. uic_cmd.argument1 = attr_sel;
  862. uic_cmd.argument2 = UIC_ARG_ATTR_TYPE(attr_set);
  863. uic_cmd.argument3 = mib_val;
  864. ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
  865. if (ret)
  866. UFS_DBG_LOGE("[UFS] err: attr-id 0x%x val 0x%x error code %d (peer %d)\n", UIC_GET_ATTR_ID(attr_sel), mib_val, ret, peer);
  867. return ret;
  868. }
  869. /**
  870. * ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device
  871. * @hba: per-adapter instance
  872. */
  873. static int ufshcd_get_max_pwr_mode(struct ufs_hba *hba)
  874. {
  875. struct ufs_pa_layer_attr *pwr_info = &hba->max_pwr_info.info;
  876. if (hba->max_pwr_info.is_valid)
  877. return 0;
  878. pwr_info->pwr_tx = FAST_MODE;
  879. pwr_info->pwr_rx = FAST_MODE;
  880. pwr_info->hs_rate = PA_HS_MODE_B;
  881. /* Get the connected lane count */
  882. hba->dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES),
  883. &pwr_info->lane_rx);
  884. UFS_DBG_LOGD("[UFS] info: ufshcd_get_max_pwr_mode, lane_rx: %d\n", pwr_info->lane_rx); /* mtk debug */
  885. hba->dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
  886. &pwr_info->lane_tx);
  887. UFS_DBG_LOGD("[UFS] info: ufshcd_get_max_pwr_mode, lane_tx: %d\n", pwr_info->lane_tx); /* mtk debug */
  888. if (!pwr_info->lane_rx || !pwr_info->lane_tx) {
  889. UFS_DBG_LOGD("invalid connected lanes value. rx=%d, tx=%d\n",
  890. pwr_info->lane_rx,
  891. pwr_info->lane_tx);
  892. return -1;
  893. }
  894. /*
  895. * First, get the maximum gears of HS speed.
  896. * If a zero value, it means there is no HSGEAR capability.
  897. * Then, get the maximum gears of PWM speed.
  898. */
  899. hba->dme_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), &pwr_info->gear_rx);
  900. if (!pwr_info->gear_rx) {
  901. hba->dme_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), &pwr_info->gear_rx);
  902. if (!pwr_info->gear_rx) {
  903. UFS_DBG_LOGD("invalid max pwm rx gear read = %d\n", pwr_info->gear_rx);
  904. return -1;
  905. }
  906. pwr_info->pwr_rx = SLOWAUTO_MODE;
  907. } else
  908. UFS_DBG_LOGD("[UFS] info: ufshcd_get_max_pwr_mode, gear_rx: %d\n", pwr_info->gear_rx); /* mtk debug */
  909. hba->dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR),
  910. &pwr_info->gear_tx);
  911. if (!pwr_info->gear_tx) {
  912. hba->dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR),
  913. &pwr_info->gear_tx);
  914. if (!pwr_info->gear_tx) {
  915. UFS_DBG_LOGD("invalid max pwm tx gear read = %d\n", pwr_info->gear_tx);
  916. return -1;
  917. }
  918. pwr_info->pwr_tx = SLOWAUTO_MODE;
  919. } else
  920. UFS_DBG_LOGD("[UFS] info: ufshcd_get_max_pwr_mode, gear_tx: %d\n", pwr_info->gear_tx); /* mtk debug */
  921. hba->max_pwr_info.is_valid = TRUE;
  922. return 0;
  923. }
  924. /**
  925. * ufshcd_get_upmcrs - Get the power mode change request status
  926. * @hba: Pointer to adapter instance
  927. *
  928. * This function gets the UPMCRS field of HCS register
  929. * Returns value of UPMCRS field
  930. */
  931. static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba)
  932. {
  933. return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) >> 8) & 0x7;
  934. }
  935. static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
  936. {
  937. u8 status;
  938. int ret;
  939. ret = __ufshcd_send_uic_cmd(hba, cmd);
  940. if (ret) {
  941. UFS_DBG_LOGD("pwr ctrl cmd 0x%x with mode 0x%x uic error %d\n", cmd->command, cmd->argument3, ret);
  942. goto out;
  943. }
  944. ret = ufshcd_wait_for_uic_cmd(hba, cmd);
  945. if (ret) {
  946. UFS_DBG_LOGD("pwr ctrl cmd 0x%x with mode 0x%x uic error %d\n", cmd->command, cmd->argument3, ret);
  947. goto out;
  948. }
  949. ret = ufshcd_wait_for_register(hba, REG_INTERRUPT_STATUS,
  950. UIC_POWER_MODE, UIC_POWER_MODE,
  951. 100, UIC_CMD_TIMEOUT);
  952. if (ret) {
  953. UFS_DBG_LOGE("[UFS] err: wait UIC_POWER_MODE interrupt timeout\n");
  954. goto out;
  955. }
  956. ufshcd_writel(hba, UIC_POWER_MODE, REG_INTERRUPT_STATUS);
  957. status = ufshcd_get_upmcrs(hba);
  958. if (status != PWR_LOCAL) {
  959. UFS_DBG_LOGE("[UFS] err: pwr ctrl cmd 0x%0x failed, host umpcrs:0x%x\n", cmd->command, status);
  960. ret = (status != PWR_OK) ? status : -1;
  961. }
  962. out:
  963. return ret;
  964. }
  965. static int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode)
  966. {
  967. int ret;
  968. struct uic_command uic_cmd = {0};
  969. uic_cmd.argument1 = UIC_ARG_MIB(PA_PWRMODE);
  970. uic_cmd.command = UIC_CMD_DME_SET;
  971. uic_cmd.argument3 = mode;
  972. ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd);
  973. return ret;
  974. }
  975. static int ufshcd_dme_copy_attr(struct ufs_hba *hba,
  976. u32 attr_sel_dst, u8 peer_dst,
  977. u32 attr_sel_src, u8 peer_src)
  978. {
  979. int ret;
  980. u32 mib_val = 0;
  981. ret = ufshcd_dme_get_attr(hba, attr_sel_src, &mib_val, peer_src);
  982. if (ret)
  983. return ret;
  984. return ufshcd_dme_set_attr(hba, attr_sel_dst, ATTR_SET_NOR,
  985. mib_val, peer_dst);
  986. }
  987. static int ufshcd_setup_userdata(struct ufs_hba *hba)
  988. {
  989. int i;
  990. int err = 0;
  991. struct {
  992. u32 attr_userdata;
  993. u32 attr_timeout;
  994. } userdata_config[] = {
  995. {
  996. UIC_ARG_MIB(PA_PWRMODEUSERDATA0),
  997. UIC_ARG_MIB(DL_FC0PROTTIMEOUTVAL),
  998. },
  999. {
  1000. UIC_ARG_MIB(PA_PWRMODEUSERDATA1),
  1001. UIC_ARG_MIB(DL_TC0REPLAYTIMEOUTVAL),
  1002. },
  1003. {
  1004. UIC_ARG_MIB(PA_PWRMODEUSERDATA2),
  1005. UIC_ARG_MIB(DL_AFC0REQTIMEOUTVAL),
  1006. },
  1007. };
  1008. for (i = 0; !err && (u32)i < UFS_ARRAY_SIZE(userdata_config); i++) {
  1009. err = ufshcd_dme_copy_attr(hba,
  1010. userdata_config[i].attr_userdata, DME_LOCAL,
  1011. userdata_config[i].attr_timeout, DME_LOCAL);
  1012. }
  1013. return err;
  1014. }
  1015. static u32 get_termination(u32 pwr_mode)
  1016. {
  1017. switch (pwr_mode) {
  1018. case FASTAUTO_MODE:
  1019. case FAST_MODE:
  1020. return 1;
  1021. case SLOWAUTO_MODE:
  1022. case SLOW_MODE:
  1023. return 0;
  1024. }
  1025. return 0;
  1026. }
  1027. static int pwr_mode_change(struct ufs_hba *hba,
  1028. u32 tx_pwr_mode, u32 rx_pwr_mode,
  1029. u32 tx_gear, u32 rx_gear,
  1030. u32 tx_lanes, u32 rx_lanes, u32 hs_series)
  1031. {
  1032. u32 tx_term = get_termination(tx_pwr_mode);
  1033. u32 rx_term = get_termination(rx_pwr_mode);
  1034. struct uic_command cmds[7];
  1035. int ret;
  1036. ret = ufshcd_dme_copy_attr(hba,
  1037. UIC_ARG_MIB(PA_TXTRAILINGCLOCKS), DME_LOCAL,
  1038. UIC_ARG_MIB(PA_MINRXTRAILINGCLOCKS), DME_PEER);
  1039. if (ret)
  1040. return ret;
  1041. ret = ufshcd_dme_copy_attr(hba,
  1042. UIC_ARG_MIB(PA_TXTRAILINGCLOCKS), DME_PEER,
  1043. UIC_ARG_MIB(PA_MINRXTRAILINGCLOCKS), DME_LOCAL);
  1044. if (ret)
  1045. return ret;
  1046. cmds[0] = UIC_CMD_DME_SET(PA_TXTERMINATION, 0, tx_term);
  1047. cmds[1] = UIC_CMD_DME_SET(PA_RXTERMINATION, 0, rx_term);
  1048. cmds[2] = UIC_CMD_DME_SET(PA_TXGEAR, 0, tx_gear);
  1049. cmds[3] = UIC_CMD_DME_SET(PA_RXGEAR, 0, rx_gear);
  1050. cmds[4] = UIC_CMD_DME_SET(PA_ACTIVETXDATALANES, 0, tx_lanes);
  1051. cmds[5] = UIC_CMD_DME_SET(PA_ACTIVERXDATALANES, 0, rx_lanes);
  1052. cmds[6] = UIC_CMD_DME_SET(PA_HSSERIES, 0, hs_series);
  1053. return ufshcd_uic_cmd_run(hba, cmds, UFS_ARRAY_SIZE(cmds));
  1054. }
  1055. int ufshcd_legacy_pwr_mode_change(struct ufs_hba *hba, u32 tx_pwr_mode,
  1056. u32 rx_pwr_mode, u32 tx_gear, u32 rx_gear,
  1057. u32 hs_series, u32 tx_lanes, u32 rx_lanes)
  1058. {
  1059. int err;
  1060. err = ufshcd_setup_userdata(hba);
  1061. if (err)
  1062. return err;
  1063. err = pwr_mode_change(hba, tx_pwr_mode, rx_pwr_mode,
  1064. tx_gear, rx_gear, tx_lanes, rx_lanes, hs_series);
  1065. if (err)
  1066. return err;
  1067. err = ufshcd_uic_change_pwr_mode(hba, rx_pwr_mode << 4 | tx_pwr_mode);
  1068. return err;
  1069. }
  1070. /**
  1071. * ufshcd_config_pwr_mode - configure a new power mode
  1072. * @hba: per-adapter instance
  1073. * @desired_pwr_mode: desired power configuration
  1074. */
  1075. int ufshcd_config_pwr_mode(struct ufs_hba *hba,
  1076. struct ufs_pa_layer_attr *desired_pwr_mode)
  1077. {
  1078. struct ufs_pa_layer_attr final_params = { 0 };
  1079. int ret;
  1080. ufs_aio_pre_pwr_change(hba, desired_pwr_mode, &final_params);
  1081. ret = ufshcd_legacy_pwr_mode_change(hba,
  1082. final_params.pwr_tx, final_params.pwr_rx,
  1083. final_params.gear_tx, final_params.gear_rx,
  1084. final_params.hs_rate,
  1085. final_params.lane_tx, final_params.lane_rx);
  1086. return ret;
  1087. }
  1088. int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
  1089. {
  1090. struct ufshcd_sg_entry *prd_table;
  1091. struct ufs_aio_scsi_cmd *cmd;
  1092. int sg_size = UFS_AIO_MAX_SIZE_PER_SG_SEGMENT;
  1093. int sg_segments;
  1094. int i;
  1095. u32 residual;
  1096. ufs_paddr_t buf_dma_addr;
  1097. cmd = lrbp->cmd;
  1098. if (cmd->exp_len == 0)
  1099. sg_segments = 0;
  1100. else
  1101. sg_segments = ((cmd->exp_len + sg_size - 1) / sg_size);
  1102. if (sg_segments) {
  1103. lrbp->utr_descriptor_ptr->prd_table_length = cpu_to_le16((u16) (sg_segments));
  1104. prd_table = (struct ufshcd_sg_entry *)lrbp->ucd_prdt_ptr;
  1105. buf_dma_addr = (ufs_paddr_t)cmd->data_buf;
  1106. residual = cmd->exp_len;
  1107. for (i = 0; i < sg_segments; i++) {
  1108. /* size should be 32-bit aligned, this is forced by spec */
  1109. if (residual > (u32)sg_size)
  1110. prd_table[i].size = cpu_to_le32((u32)sg_size - 1);
  1111. else
  1112. prd_table[i].size = cpu_to_le32((u32)residual - 1);
  1113. /* addr should be 32-bit aligned, this is forced by spec */
  1114. prd_table[i].base_addr = cpu_to_le32(lower_32_bits(buf_dma_addr));
  1115. prd_table[i].upper_addr = cpu_to_le32(upper_32_bits(buf_dma_addr));
  1116. buf_dma_addr += sg_size;
  1117. residual -= sg_size;
  1118. }
  1119. /* invalidate data buffer if existed */
  1120. ufs_aio_dma_map((ufs_vaddr_t)cmd->data_buf, cmd->exp_len, lrbp->cmd->dir);
  1121. } else {
  1122. lrbp->utr_descriptor_ptr->prd_table_length = 0;
  1123. }
  1124. return 0;
  1125. }
  1126. /**
  1127. * ufshcd_get_tr_ocs - Get the UTRD Overall Command Status
  1128. * @lrb: pointer to local command reference block
  1129. *
  1130. * This function is used to get the OCS field from UTRD
  1131. * Returns the OCS field in the UTRD
  1132. */
  1133. static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
  1134. {
  1135. return le32_to_cpu(lrbp->utr_descriptor_ptr->header.dword_2) & MASK_OCS;
  1136. }
  1137. /**
  1138. * ufshcd_get_rsp_upiu_result - Get the result from response UPIU
  1139. * @ucd_rsp_ptr: pointer to response UPIU
  1140. *
  1141. * This function gets the response status and scsi_status from response UPIU
  1142. * Returns the response result code.
  1143. */
  1144. static inline int
  1145. ufshcd_get_rsp_upiu_result(struct utp_upiu_rsp *ucd_rsp_ptr)
  1146. {
  1147. return be32_to_cpu(ucd_rsp_ptr->header.dword_1) & MASK_RSP_UPIU_RESULT;
  1148. }
  1149. static int ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
  1150. {
  1151. struct ufs_query_res *query_res = &hba->dev_cmd.query.response;
  1152. memcpy(&query_res->upiu_res, &lrbp->ucd_rsp_ptr->qr, QUERY_OSF_SIZE);
  1153. /* Get the descriptor */
  1154. if (lrbp->ucd_rsp_ptr->qr.opcode == UPIU_QUERY_OPCODE_READ_DESC) {
  1155. u8 *descp = (u8 *)lrbp->ucd_rsp_ptr +
  1156. GENERAL_UPIU_REQUEST_SIZE;
  1157. u16 resp_len;
  1158. u16 buf_len;
  1159. /* data segment length */
  1160. resp_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2) &
  1161. MASK_QUERY_DATA_SEG_LEN;
  1162. buf_len = be16_to_cpu(
  1163. hba->dev_cmd.query.request.upiu_req.length);
  1164. if (buf_len >= resp_len) {
  1165. /*
  1166. * ufshcd_wait_command() only invalidates length of "strcut utp_upiu_rsp".
  1167. * We need to invalidate more data range for Read Descriptor operation.
  1168. */
  1169. ufs_aio_dma_unmap((U32)descp, resp_len, DMA_FROM_DEVICE);
  1170. memcpy(hba->dev_cmd.query.descriptor, descp, resp_len);
  1171. } else {
  1172. UFS_DBG_LOGD("Response size is bigger than buffer");
  1173. return -1;
  1174. }
  1175. }
  1176. return 0;
  1177. }
  1178. static inline int ufshcd_get_req_rsp(struct utp_upiu_rsp *ucd_rsp_ptr)
  1179. {
  1180. return be32_to_cpu(ucd_rsp_ptr->header.dword_0) >> 24;
  1181. }
  1182. static int ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
  1183. {
  1184. int err = 0;
  1185. int resp;
  1186. resp = ufshcd_get_req_rsp(lrbp->ucd_rsp_ptr);
  1187. switch (resp) {
  1188. case UPIU_TRANSACTION_REJECT_UPIU:
  1189. /* TODO: handle Reject UPIU Response */
  1190. err = -1;
  1191. UFS_DBG_LOGD("Reject UPIU not fully implemented\n");
  1192. break;
  1193. case UPIU_TRANSACTION_QUERY_RSP:
  1194. hba->dev_cmd.query.response.response = ufshcd_get_rsp_upiu_result(lrbp->ucd_rsp_ptr) >> UPIU_RSP_CODE_OFFSET;
  1195. err = hba->dev_cmd.query.response.response ;
  1196. if (!err)
  1197. err = ufshcd_copy_query_response(hba, lrbp);
  1198. break;
  1199. case UPIU_TRANSACTION_NOP_IN:
  1200. if (hba->dev_cmd.type != DEV_CMD_TYPE_NOP) {
  1201. err = -1;
  1202. UFS_DBG_LOGD("unexpected response %x\n", resp);
  1203. }
  1204. break;
  1205. default:
  1206. err = -1;
  1207. UFS_DBG_LOGD("Invalid device management cmd response: %x\n", resp);
  1208. break;
  1209. }
  1210. return err;
  1211. }
  1212. int ufshcd_wait_command(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, u32 timeout_ms)
  1213. {
  1214. u8 ocs;
  1215. u16 resp;
  1216. int ret = UFS_ERR_NONE;
  1217. u32 value;
  1218. u32 tag_mask = 1 << lrbp->task_tag;
  1219. u32 tr_doorbell;
  1220. u32 intr_status;
  1221. #ifdef MTK_UFS_DRV_DA
  1222. u32 time_start;
  1223. u32 time_timeout;
  1224. u32 wait_loop = 0;
  1225. #else
  1226. unsigned long elapsed_ms = 0;
  1227. #endif
  1228. #if defined(MTK_UFS_DRV_DA)
  1229. time_start = gpt4_get_current_tick();
  1230. time_timeout = gpt4_time2tick_ms(timeout_ms);
  1231. #endif
  1232. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  1233. if (hba->drv_status & UFS_DRV_STS_DMA_WAIT_INTERRUPT) {
  1234. /* Unmask interrupt now and wait */
  1235. mt_irq_unmask(hba->irq);
  1236. ret = event_wait_timeout(&ufshcd_intr_event, timeout_ms);
  1237. if (ret != 0)
  1238. UFS_DBG_LOGE("[UFS]: failed to get event timeout:%d\n", timeout_ms);
  1239. /* Mask interrupt */
  1240. mt_irq_mask(hba->irq);
  1241. } else
  1242. #endif
  1243. do {
  1244. tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
  1245. if (!(tag_mask & tr_doorbell)) {
  1246. /* clear_bit(lrbp->task_tag, &hba->outstanding_reqs); */
  1247. hba->outstanding_reqs &= ~(1 << lrbp->task_tag);
  1248. break;
  1249. }
  1250. #ifdef MTK_UFS_DRV_DA
  1251. /* ensure to use timeout detector in consideration of wrap around case in gpt register */
  1252. if (gpt4_timeout_tick(time_start, time_timeout)) /* timeout, stop waiting */
  1253. break;
  1254. wait_loop++;
  1255. if (wait_loop && (wait_loop % 10000) == 0)
  1256. UFS_DBG_LOGD("[UFS] info: waiting for cmd done, loop %d ...\n", wait_loop);
  1257. #else
  1258. msleep(1);
  1259. elapsed_ms += 1;
  1260. if (elapsed_ms > timeout_ms)
  1261. break;
  1262. #endif
  1263. } while (1);
  1264. /* clear_bit(lrbp->task_tag, &hba->lrb_in_use); // need to clear lrb_in_use for polling case, otherwise no one can use this tag in the future. */
  1265. hba->lrb_in_use &= ~(1 << lrbp->task_tag);
  1266. tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
  1267. if (tag_mask & tr_doorbell) {
  1268. UFS_DBG_LOGE("[UFS] err: Query Request timeout.timeout_ms:%d\n", timeout_ms);
  1269. ret = UFS_ERR_TIMEOUT_QUERY_REQUEST;
  1270. }
  1271. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  1272. if (hba->drv_status & UFS_DRV_STS_DMA_WAIT_INTERRUPT)
  1273. intr_status = ufshcd_intr_status;
  1274. else
  1275. #endif
  1276. intr_status = ufs_aio_readl(hba, REG_INTERRUPT_STATUS);
  1277. /* check interrupt status if any error happens */
  1278. if (intr_status & UFSHCD_ERROR_MASK) {
  1279. UFS_DBG_LOGE("[UFS] ERR! intr_status: 0x%x\n", intr_status);
  1280. if (intr_status & UIC_ERROR) {
  1281. UFS_DBG_LOGE("[UFS] REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER: 0x%x\n", ufs_aio_readl(hba, REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER));
  1282. UFS_DBG_LOGE("[UFS] REG_UIC_ERROR_CODE_DATA_LINK_LAYER: 0x%x\n", ufs_aio_readl(hba, REG_UIC_ERROR_CODE_DATA_LINK_LAYER));
  1283. UFS_DBG_LOGE("[UFS] REG_UIC_ERROR_CODE_NETWORK_LAYER: 0x%x\n", ufs_aio_readl(hba, REG_UIC_ERROR_CODE_NETWORK_LAYER));
  1284. UFS_DBG_LOGE("[UFS] REG_UIC_ERROR_CODE_TRANSPORT_LAYER: 0x%x\n", ufs_aio_readl(hba, REG_UIC_ERROR_CODE_TRANSPORT_LAYER));
  1285. UFS_DBG_LOGE("[UFS] REG_UIC_ERROR_CODE_DME: 0x%x\n", ufs_aio_readl(hba, REG_UIC_ERROR_CODE_DME));
  1286. }
  1287. ufshcd_writel(hba, UFSHCD_ERROR_MASK, REG_INTERRUPT_STATUS);
  1288. }
  1289. if (ret == UFS_ERR_TIMEOUT_QUERY_REQUEST)
  1290. goto out;
  1291. /* invalid data buffer */
  1292. if (lrbp->cmd)
  1293. ufs_aio_dma_unmap((unsigned long)lrbp->cmd->data_buf, lrbp->cmd->exp_len, lrbp->cmd->dir);
  1294. /* dummy, just for pairing with ufs_aio_dma_map(UTRD) and ufs_aio_dma_map(PRDT) */
  1295. /* ufs_aio_dma_unmap((unsigned long)lrbp->ucd_req_ptr, sizeof(struct utp_upiu_req), DMA_TO_DEVICE); */
  1296. /* ufs_aio_dma_unmap((unsigned long)hba->lrb->ucd_prdt_ptr, sizeof(struct ufs_aio_sg_entry) * UFS_AIO_MAX_SG_SEGMENTS, DMA_TO_DEVICE); */
  1297. /* check OCS */
  1298. /* invalid UTRD cache */
  1299. ufs_aio_dma_unmap((unsigned long)lrbp->utr_descriptor_ptr, sizeof(struct utp_transfer_req_desc), DMA_BIDIRECTIONAL);
  1300. ocs = ufshcd_get_tr_ocs(lrbp);
  1301. if (ocs != OCS_SUCCESS) {
  1302. UFS_DBG_LOGE("[UFS] err: OCS error = %x, T:%d\n", ocs, lrbp->task_tag);
  1303. #if (UFS_DBG_LVL <= UFS_DBG_LVL_DEBUG)
  1304. {
  1305. u8 cnt;
  1306. value = ufshcd_readl(hba, REG_UFS_MTK_OCS_ERR_STATUS);
  1307. UFS_DBG_LOGD("[UFS] err: OCS err status reg = %x\n", value);
  1308. for (cnt = 0; g_ufs_ocs_error_str[cnt].err != 0xFF; cnt++) {
  1309. if (value & (1 << cnt))
  1310. UFS_DBG_LOGD("[UFS] err: %s\n", g_ufs_ocs_error_str[cnt].name);
  1311. }
  1312. }
  1313. #endif /* UFS_DBG_LVL_DEBUG */
  1314. ret = UFS_ERR_OCS_ERROR;
  1315. goto out;
  1316. }
  1317. /* check response code */
  1318. /* invalid RESPONSE UPIU cache
  1319. *
  1320. * NOTE: Here we only invalidate length of "strcut utp_upiu_rsp". For Response UPIU with
  1321. * longer data size (e.g., Read Descriptor), need to invalidate more data.
  1322. * Please see ufshcd_copy_query_response().
  1323. */
  1324. ufs_aio_dma_unmap((U32)lrbp->ucd_rsp_ptr, sizeof(struct utp_upiu_rsp), DMA_FROM_DEVICE);
  1325. if (UTP_CMD_TYPE_DEV_MANAGE == lrbp->command_type) /* for device management commands */
  1326. return ufshcd_dev_cmd_completion(hba, lrbp);
  1327. else { /* for SCSI commands */
  1328. resp = ufshcd_get_rsp_upiu_result(lrbp->ucd_rsp_ptr);
  1329. if (resp & MASK_TASK_RESPONSE) {
  1330. value = ufshcd_get_req_rsp(lrbp->ucd_rsp_ptr);
  1331. if (UPIU_TRANSACTION_RESPONSE == value)
  1332. ufs_mtk_dump_asc_ascq(hba, lrbp->ucd_rsp_ptr->sr.sense_data[12], lrbp->ucd_rsp_ptr->sr.sense_data[13]);
  1333. /* sense key is UNIT_ATTENTION, will retry */
  1334. if (lrbp->cmd && lrbp->cmd->cmd_data[0] == TEST_UNIT_READY && (lrbp->ucd_rsp_ptr->sr.sense_data[2] &0xF) == UNIT_ATTENTION)
  1335. ret = UFS_TEST_UNIT_RDY_ERR;
  1336. else {
  1337. ret = UFS_ERR_TASK_RESP_ERROR;
  1338. UFS_DBG_LOGE("[UFS] err: task response error = %x\n", (resp & MASK_TASK_RESPONSE) >> 8);
  1339. }
  1340. goto out;
  1341. }
  1342. }
  1343. out:
  1344. if (lrbp->cmd)
  1345. lrbp->cmd = NULL;
  1346. UFS_DBG_LOGV("[UFS] info: CMD done\n");
  1347. return ret;
  1348. }
  1349. void ufs_aio_crypto_cal_dun(u32 alg_id, u32 lba, u32 *dunl, u32 *dunu)
  1350. {
  1351. if (UFS_CRYPTO_ALGO_BITLOCKER_AES_CBC != alg_id) {
  1352. *dunl = lba;
  1353. *dunu = 0;
  1354. } else { /* bitlocker dun use byte address */
  1355. *dunl = (lba & 0x7FFFF) << 12; /* byte address for lower 32 bit */
  1356. *dunu = (lba >> (32-12)) << 12; /* byte address for higher 32 bit */
  1357. }
  1358. }
  1359. static void ufshcd_queuecommand_timeout(struct ufs_aio_scsi_cmd *cmd, int *timeout)
  1360. {
  1361. if(cmd->cmd_data[0] == UNMAP)
  1362. *timeout = UTP_UNMAP_TIMEOUT_MS;
  1363. else
  1364. *timeout = UTP_TRANSFER_REQ_TIMEOUT_MS;
  1365. }
  1366. int ufshcd_queuecommand(struct ufs_hba *hba, struct ufs_aio_scsi_cmd *cmd)
  1367. {
  1368. struct ufshcd_lrb *lrbp;
  1369. int tag, lun;
  1370. int err = 0;
  1371. #if defined(UFS_CFG_DEBUG)
  1372. u32 blk_cnt;
  1373. #endif
  1374. #if defined(UFS_CFG_DEBUG) || defined(UFS_CFG_CRYPTO)
  1375. u32 lba;
  1376. #endif
  1377. #ifdef UFS_CFG_CRYPTO
  1378. u32 dunl, dunu;
  1379. #endif
  1380. int timeout = UTP_TRANSFER_REQ_TIMEOUT_MS;
  1381. tag = cmd->tag;
  1382. lun = cmd->lun;
  1383. #if defined(UFS_CFG_DEBUG)
  1384. lba = cmd->cmd_data[5] | (cmd->cmd_data[4] << 8) | (cmd->cmd_data[3] << 16) | (cmd->cmd_data[2] << 24);
  1385. blk_cnt = cmd->cmd_data[8] | (cmd->cmd_data[7] << 8);
  1386. UFS_DBG_LOGD("[UFS] info: QCMD,L:%x,T:%d,0x%x,A:0x%x,C:%d\n", lun, tag, cmd->cmd_data[0],lba, blk_cnt);
  1387. #endif
  1388. #ifdef UFS_CFG_SINGLE_COMMAND
  1389. lrbp = &hba->lrb[0];
  1390. #else
  1391. lrbp = &hba->lrb[tag];
  1392. #endif
  1393. #ifdef UFS_CFG_CRYPTO
  1394. if (ufs_crypto_rw_en) {
  1395. lba = ((cmd->cmd_data[2]) << 24) | ((cmd->cmd_data[3]) << 16) |
  1396. ((cmd->cmd_data[4]) << 8) | (cmd->cmd_data[5]);
  1397. ufs_aio_crypto_cal_dun(UFS_CRYPTO_ALGO_ESSIV_AES_CBC, lba, &dunl, &dunu);
  1398. }
  1399. #endif
  1400. lrbp->cmd = cmd;
  1401. /* lrbp->sense_bufflen = SCSI_SENSE_BUFFERSIZE; */
  1402. /* lrbp->sense_buffer = hba->sense_buf_base_addr[tag]; */
  1403. lrbp->task_tag = tag;
  1404. lrbp->lun = lun;
  1405. lrbp->intr_cmd = TRUE; /* in AIO driver, use interrupt for every commands. */
  1406. lrbp->command_type = UTP_CMD_TYPE_SCSI;
  1407. #ifdef UFS_CFG_CRYPTO
  1408. if (ufs_crypto_rw_en) {
  1409. lrbp->crypto_cfgid = 0;
  1410. lrbp->crypto_dunl = dunl;
  1411. lrbp->crypto_dunu = dunu;
  1412. lrbp->crypto_en = 1;
  1413. } else
  1414. lrbp->crypto_en = 0;
  1415. #endif
  1416. /* form UPIU before issuing the command */
  1417. ufshcd_compose_upiu(hba, lrbp);
  1418. err = ufshcd_map_sg(hba, lrbp);
  1419. if (err) {
  1420. UFS_DBG_LOGD("Err: ufshcd_map_sg_ut fails\n");
  1421. lrbp->cmd = NULL;
  1422. /* clear_bit(tag, &hba->lrb_in_use); */
  1423. hba->lrb_in_use &= ~(1 << tag);
  1424. goto out;
  1425. }
  1426. /* issue command to the controller */
  1427. ufshcd_send_command(hba, tag);
  1428. /* Setting utp transfer req command timeout according to different cmd */
  1429. ufshcd_queuecommand_timeout(cmd, &timeout);
  1430. err = ufshcd_wait_command(hba, lrbp, timeout);
  1431. out:
  1432. return err;
  1433. }
  1434. #ifdef MTK_UFS_DRV_DA
  1435. int ufs_aio_get_ref_clk(struct ufs_hba *hba, u32 *ref)
  1436. {
  1437. int ret;
  1438. /*
  1439. * Reference Clock Frequency value
  1440. * 0h: 19.2MHz
  1441. * 1h: 26MHz
  1442. * 2h: 38.4MHz
  1443. * 3h: 52MHz
  1444. */
  1445. ret = hba->query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, ATTR_B_REF_CLK_FREQ, 0, 0, ref);
  1446. if (ret != 0)
  1447. UFS_DBG_LOGD("[UFS] err: %s error: %d\n", __func__, ret);
  1448. return ret;
  1449. }
  1450. int ufs_aio_set_ref_clk(struct ufs_hba *hba, u32 ref)
  1451. {
  1452. int ret;
  1453. /*
  1454. * Reference Clock Frequency value
  1455. * 0h: 19.2MHz
  1456. * 1h: 26MHz
  1457. * 2h: 38.4MHz
  1458. * 3h: 52MHz
  1459. */
  1460. ret = hba->query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, ATTR_B_REF_CLK_FREQ, 0, 0, &ref);
  1461. if (ret != 0)
  1462. UFS_DBG_LOGD("[UFS] err: %s error: %d\n", __func__, ret);
  1463. else
  1464. UFS_DBG_LOGD("[UFS] info: %s %d done\n", __func__, ref);
  1465. return ret;
  1466. }
  1467. __WEAK unsigned int config_TW_size_GB(void)
  1468. {
  1469. return 0xffffffff;
  1470. }
  1471. __WEAK unsigned int config_TW_no_reduction(void)
  1472. {
  1473. return 1;
  1474. }
  1475. __WEAK unsigned int config_HPB_size_GB(void)
  1476. {
  1477. return 0xffffffff;
  1478. }
  1479. static void ufshcd_init_custom_info(struct ufs_hba *hba)
  1480. {
  1481. /* Already set done and not changed by UI */
  1482. if (hba->custom_info.custom_flag & CUSTOM_SET_DONE)
  1483. return;
  1484. /*
  1485. * Set to custom value in DA if flag not set.
  1486. * Set to UI config in flag set.
  1487. */
  1488. if ((hba->custom_info.custom_flag & CUSTOM_FORCE_PROVISION) == 0)
  1489. hba->custom_info.force_provision = FALSE;
  1490. if ((hba->custom_info.custom_flag & CUSTOM_TW_GB) == 0)
  1491. hba->custom_info.tw_size_gb = config_TW_size_GB();
  1492. if ((hba->custom_info.custom_flag & CUSTOM_TW_NO_RED) == 0)
  1493. hba->custom_info.tw_no_red = config_TW_no_reduction();
  1494. if ((hba->custom_info.custom_flag & CUSTOM_HPB_REGION_COUNT) == 0)
  1495. hba->custom_info.hpb_size_gb = config_HPB_size_GB();
  1496. if ((hba->custom_info.custom_flag & CUSTOM_LU3) == 0) {
  1497. hba->custom_info.lu3_size_mb = 0;
  1498. hba->custom_info.lu3_type = 0;
  1499. }
  1500. /* Set custom info done flag */
  1501. hba->custom_info.custom_flag |= CUSTOM_SET_DONE;
  1502. UFS_DBG_LOGI("[UFS] Custom force provison=%d, TW size=%dGB, TW no red=%d, HPB size=%dGB\n",
  1503. hba->custom_info.force_provision,
  1504. hba->custom_info.tw_size_gb,
  1505. hba->custom_info.tw_no_red,
  1506. hba->custom_info.hpb_size_gb);
  1507. }
  1508. #endif
  1509. static int ufshcd_probe_hba(struct ufs_hba *hba)
  1510. {
  1511. int ret;
  1512. #ifdef MTK_UFS_DRV_DA
  1513. u32 ref_clk;
  1514. #endif
  1515. ret = ufshcd_link_startup(hba);
  1516. if (ret)
  1517. goto out;
  1518. ufshcd_init_pwr_info(hba);
  1519. ret = hba->nopin_nopout(hba);
  1520. if (ret)
  1521. goto out;
  1522. #if defined(MTK_UFS_DRV_LK)
  1523. PROFILING_START("UFS device init");
  1524. #endif
  1525. ret = ufshcd_complete_dev_init(hba);
  1526. #if defined(MTK_UFS_DRV_LK)
  1527. PROFILING_END();
  1528. #endif
  1529. if (ret)
  1530. goto out;
  1531. /* Init check for device descriptor sizes */
  1532. ufshcd_init_desc_sizes(hba);
  1533. /* get quirks according to Device Descritpor contents */
  1534. ufs_advertise_fixup_device(hba);
  1535. #ifdef MTK_UFS_DRV_DA
  1536. ufshcd_init_custom_info(hba);
  1537. /* check 1. check if bootable UFS */
  1538. /* get device infomation by reading Device Descriptor */
  1539. ufs_aio_get_device_info(hba);
  1540. ret = ufs_aio_check_lu_cfg(hba);
  1541. /* new UFS or invalid LU configuration is found, start (re-)configuration flow */
  1542. if ((hba->dev_info.bootable == 0) ||
  1543. (ret == UFS_ERR_INVALID_LU_CONFIGURATION) ||
  1544. (hba->custom_info.force_provision == TRUE)) {
  1545. hba->custom_info.force_provision = FALSE;
  1546. return ufs_aio_prepare_new_ufs(hba);
  1547. }
  1548. UFS_DBG_LOGI("[UFS] info: LU Configuration Check OK. Bootable UFS\n");
  1549. /* check 2. check if Boot LU is configured as expectation */
  1550. /* Boot LU 1/2 shall set in LU0/1 */
  1551. ret = ufs_aio_read_unit_desc_cfg_param(hba);
  1552. if (!(hba->unit_desc_cfg_param[0].b_lu_enable &&
  1553. hba->unit_desc_cfg_param[0].b_boot_lun_id == 1 &&
  1554. hba->unit_desc_cfg_param[1].b_lu_enable &&
  1555. hba->unit_desc_cfg_param[1].b_boot_lun_id == 2))
  1556. return ufs_aio_prepare_new_ufs(hba);
  1557. UFS_DBG_LOGI("[UFS] info: Boot LU Configuration Check OK. Active Boot LU: LU0\n");
  1558. #else
  1559. ufs_aio_check_lu_cfg(hba);
  1560. #endif /* MTK_UFS_DRV_DA */
  1561. ufs_aio_test_unit_ready_all_device(hba);
  1562. /* ufshcd_force_reset_auto_bkops(hba); */
  1563. #ifdef MTK_UFS_DRV_DA
  1564. /*
  1565. * Change device to 26MHz
  1566. * Need check first. If not, some old device cannot write and return F8
  1567. * as "Parameter already written". which cause ufs init fail.
  1568. */
  1569. ret = ufs_aio_get_ref_clk(hba, &ref_clk);
  1570. if ((ret == 0) && (ref_clk != 1)) {
  1571. ret = ufs_aio_set_ref_clk(hba, 1);
  1572. if (ret) {
  1573. UFS_DBG_LOGE("[UFS] Set device 26Mhz fail! %d\n", ret);
  1574. goto out;
  1575. }
  1576. }
  1577. #endif
  1578. #if !defined(MTK_UFS_DRV_CTP)
  1579. if (ufshcd_get_max_pwr_mode(hba))
  1580. UFS_DBG_LOGE("[UFS] Failed getting max supported power mode\n");
  1581. else {
  1582. ret = ufshcd_config_pwr_mode(hba, &hba->max_pwr_info.info);
  1583. if (ret) {
  1584. UFS_DBG_LOGE("Failed setting power mode, err = %d\n", ret);
  1585. /* ignore power mode change error to let UFS init go through anyway */
  1586. ret = 0;
  1587. }
  1588. }
  1589. #endif
  1590. out:
  1591. return ret;
  1592. }
  1593. /**
  1594. * ufshcd_init - Driver initialization routine
  1595. * Returns 0 on success, non-zero value on failure
  1596. */
  1597. int ufshcd_init(void)
  1598. {
  1599. int err;
  1600. int retry_init_cnt = 0;
  1601. struct ufs_hba *hba = &g_ufs_hba;
  1602. UFS_DBG_LOGD("[UFS] memory (ufs_ucdl): 0x%x\n", (u32)&ufs_ucdl[0]);
  1603. UFS_DBG_LOGD("[UFS] memory (ufs_lrb): 0x%x\n", (u32)&ufs_lrb[0]);
  1604. ufs_get_platform_data();
  1605. hba->hci_base = ufs_platform.hci_base;
  1606. hba->pericfg_base = ufs_platform.pericfg_base;
  1607. hba->mphy_base = ufs_platform.mphy_base;
  1608. /* get hba capabilities */
  1609. ufshcd_get_host_capabilities(hba);
  1610. /* init power */
  1611. ufshcd_power(hba, TRUE);
  1612. /* init clock */
  1613. ufshcd_clock(hba, TRUE);
  1614. ufs_aio_advertise_hci_quirks(hba);
  1615. /* allocate memory for hba memory space */
  1616. err = ufshcd_memory_alloc(hba);
  1617. if (err) {
  1618. UFS_DBG_LOGD("Memory allocation failed\n");
  1619. goto out_error;
  1620. }
  1621. /* Configure LRB */
  1622. ufshcd_host_memory_configure(hba);
  1623. ufshcd_init_reinit_host:
  1624. /* Host controller enable */
  1625. err = ufshcd_hba_enable(hba);
  1626. if (err) {
  1627. UFS_DBG_LOGE("[UFS] err: Host controller enable failed\n");
  1628. goto out_error;
  1629. }
  1630. err = ufshcd_probe_hba(hba);
  1631. if (UFS_ERR_NEED_REINIT_HOST == err) {
  1632. retry_init_cnt++;
  1633. if (retry_init_cnt > 3) {
  1634. UFS_DBG_LOGE("[UFS] err: retry number exceeded (reinit host)\n");
  1635. goto out_error;
  1636. }
  1637. goto ufshcd_init_reinit_host;
  1638. }
  1639. if (err) {
  1640. UFS_DBG_LOGE("[UFS] err: ufshcd_probe_hba failed\n");
  1641. goto out_error;
  1642. }
  1643. #if defined(MTK_UFS_DRV_DA)
  1644. if (sysob_runtime_params.flag & INT_MODE_ENABLE) {
  1645. if (!ufshcd_irq_init(hba))
  1646. hba->drv_status |= UFS_DRV_STS_DMA_WAIT_INTERRUPT;
  1647. }
  1648. #elif defined(MTK_UFS_DRV_LK)
  1649. if (!ufshcd_irq_init(hba))
  1650. hba->drv_status |= UFS_DRV_STS_DMA_WAIT_INTERRUPT;
  1651. #endif
  1652. return 0;
  1653. out_error:
  1654. return err;
  1655. }
  1656. static int ufshcd_query_descriptor(struct ufs_hba *hba,
  1657. enum query_opcode opcode, enum desc_idn idn, u8 index,
  1658. u8 selector, u8 *desc_buf, u32 *buf_len)
  1659. {
  1660. struct ufs_query_req *request = NULL;
  1661. struct ufs_query_res *response = NULL;
  1662. int err;
  1663. BUG_ON(!hba);
  1664. if (*buf_len < QUERY_DESC_MIN_SIZE || *buf_len > QUERY_DESC_MAX_SIZE) {
  1665. UFS_DBG_LOGD("descriptor buffer size (%d) is out of range\n", *buf_len);
  1666. err = -1;
  1667. goto out;
  1668. }
  1669. if (!desc_buf) {
  1670. UFS_DBG_LOGD("descriptor buffer required for opcode 0x%x\n", opcode);
  1671. err = -1;
  1672. goto out;
  1673. }
  1674. ufshcd_init_query(hba, &request, &response, opcode, idn, index, selector);
  1675. request->upiu_req.length = cpu_to_be16(*buf_len);
  1676. hba->dev_cmd.query.descriptor = desc_buf;
  1677. switch (opcode) {
  1678. case UPIU_QUERY_OPCODE_READ_DESC:
  1679. request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
  1680. break;
  1681. case UPIU_QUERY_OPCODE_WRITE_DESC:
  1682. request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
  1683. break;
  1684. default:
  1685. UFS_DBG_LOGE("Expected query descriptor opcode but got = 0x%x\n", opcode);
  1686. err = -1;
  1687. goto out;
  1688. }
  1689. err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT);
  1690. if (err) {
  1691. UFS_DBG_LOGE("opcode 0x%x for idn %d failed, err = %d\n", opcode, idn, err);
  1692. goto out;
  1693. }
  1694. *buf_len = be16_to_cpu(response->upiu_res.length);
  1695. hba->dev_cmd.query.descriptor = NULL;
  1696. out:
  1697. return err;
  1698. }
  1699. static int ufshcd_read_desc_param(struct ufs_hba *hba,
  1700. enum desc_idn desc_id,
  1701. int desc_index,
  1702. u8 selector,
  1703. u8 *param_read_buf,
  1704. u32 param_size)
  1705. {
  1706. u32 desc_len;
  1707. u8 *desc_buf;
  1708. int ret;
  1709. if (desc_id >= QUERY_DESC_IDN_MAX)
  1710. return -1;
  1711. desc_len = ufs_query_desc_max_size[desc_id];
  1712. if (desc_len > param_size)
  1713. desc_len = param_size;
  1714. desc_buf = param_read_buf;
  1715. ret = ufshcd_query_descriptor(hba, UPIU_QUERY_OPCODE_READ_DESC,
  1716. desc_id, desc_index, selector, desc_buf,
  1717. &desc_len);
  1718. if (ret ||
  1719. (desc_len > ufs_query_desc_max_size[desc_id]) ||
  1720. (desc_buf[QUERY_DESC_DESC_TYPE_OFFSET] != desc_id)) {
  1721. UFS_DBG_LOGE("[UFS] failed reading descriptor. desc_id %d desc_len %d ret %d\n", desc_id, desc_len, ret);
  1722. if (!ret)
  1723. ret = UFS_ERR_INVALID_DESCRIPTOR;
  1724. goto out;
  1725. }
  1726. out:
  1727. return ret;
  1728. }
  1729. static int ufshcd_read_desc_length(struct ufs_hba *hba,
  1730. enum desc_idn desc_id,
  1731. int desc_index,
  1732. u8 selector,
  1733. u32 *desc_length)
  1734. {
  1735. int ret;
  1736. u8 header[QUERY_DESC_HDR_SIZE];
  1737. u32 header_len = QUERY_DESC_HDR_SIZE;
  1738. if (desc_id >= QUERY_DESC_IDN_MAX)
  1739. ret = -1;
  1740. ret = ufshcd_query_descriptor(hba, UPIU_QUERY_OPCODE_READ_DESC,
  1741. desc_id, desc_index, selector, header,
  1742. &header_len);
  1743. if (ret) {
  1744. UFS_DBG_LOGE("%s: Failed to get descriptor header id %d\n",
  1745. __func__, desc_id);
  1746. return ret;
  1747. } else if (desc_id != header[QUERY_DESC_DESC_TYPE_OFFSET]) {
  1748. UFS_DBG_LOGE("%s: descriptor header id %d and desc_id %d mismatch\n",
  1749. __func__, header[QUERY_DESC_DESC_TYPE_OFFSET],
  1750. desc_id);
  1751. ret = -1;
  1752. }
  1753. *desc_length = header[QUERY_DESC_LENGTH_OFFSET];
  1754. return ret;
  1755. }
  1756. static void ufshcd_init_desc_sizes(struct ufs_hba *hba)
  1757. {
  1758. int err;
  1759. static int init_done = 0;
  1760. if (init_done)
  1761. return;
  1762. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_DEVICE, 0, 0,
  1763. &ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  1764. if (err)
  1765. ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE] = QUERY_DESC_DEVICE_MAX_SIZE;
  1766. UFS_DBG_LOGI("device descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  1767. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_POWER, 0, 0,
  1768. &ufs_query_desc_max_size[QUERY_DESC_IDN_POWER]);
  1769. if (err)
  1770. ufs_query_desc_max_size[QUERY_DESC_IDN_POWER] = QUERY_DESC_POWER_MAX_SIZE;
  1771. UFS_DBG_LOGI("power descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_POWER]);
  1772. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_INTERCONNECT, 0, 0,
  1773. &ufs_query_desc_max_size[QUERY_DESC_IDN_INTERCONNECT]);
  1774. if (err)
  1775. ufs_query_desc_max_size[QUERY_DESC_IDN_INTERCONNECT] = QUERY_DESC_INTERCONNECT_MAX_SIZE;
  1776. UFS_DBG_LOGI("interconnect descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_INTERCONNECT]);
  1777. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 0,
  1778. &ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  1779. if (err)
  1780. ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION] = QUERY_DESC_CONFIGURAION_MAX_SIZE;
  1781. UFS_DBG_LOGI("configuration descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  1782. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_UNIT, 0, 0,
  1783. &ufs_query_desc_max_size[QUERY_DESC_IDN_UNIT]);
  1784. if (err)
  1785. ufs_query_desc_max_size[QUERY_DESC_IDN_UNIT] = QUERY_DESC_UNIT_MAX_SIZE;
  1786. UFS_DBG_LOGI("unit descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_UNIT]);
  1787. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_GEOMETRY, 0, 0,
  1788. &ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  1789. if (err)
  1790. ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY] = QUERY_DESC_GEOMETRY_MAX_SIZE;
  1791. UFS_DBG_LOGI("geometry descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  1792. init_done = 1;
  1793. }
  1794. static int ufshcd_init_vendor_desc_sizes(struct ufs_hba *hba)
  1795. {
  1796. static int err = 0;
  1797. static int vendor_init_done = 0;
  1798. if (vendor_init_done)
  1799. return err;
  1800. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_DEVICE, 0, 1,
  1801. &ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  1802. if (err)
  1803. goto out;
  1804. UFS_DBG_LOGI("vendor device descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  1805. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 1,
  1806. &ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  1807. if (err)
  1808. goto out;
  1809. UFS_DBG_LOGI("vendor configuration descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  1810. err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_GEOMETRY, 0, 1,
  1811. &ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  1812. if (err)
  1813. goto out;
  1814. UFS_DBG_LOGI("vendor geometry descriptor length = 0x%x\n", ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  1815. out:
  1816. vendor_init_done = 1;
  1817. return err;
  1818. }
  1819. /* replace non-printable or non-ASCII characters with spaces */
  1820. static inline void ufshcd_remove_non_printable(u8 *val)
  1821. {
  1822. if (!val)
  1823. return;
  1824. if (*val < 0x20 || *val > 0x7e)
  1825. *val = ' ';
  1826. }
  1827. static int ufs_aio_pre_pwr_change(struct ufs_hba *hba, struct ufs_pa_layer_attr *desired, struct ufs_pa_layer_attr *final)
  1828. {
  1829. if (0 == hba->dev_info.wmanufacturerid) {
  1830. UFS_DBG_LOGD("bug: manufacturer_id shall not be 0");
  1831. return -1;
  1832. }
  1833. /* fill-in desired gear for different environment */
  1834. /* make sure device capability */
  1835. #if defined(MTK_UFS_DRV_CTP)
  1836. final->gear_rx = desired->gear_rx;
  1837. final->gear_tx = desired->gear_tx;
  1838. final->lane_rx = desired->lane_rx;
  1839. final->lane_tx = desired->lane_tx;
  1840. final->hs_rate = desired->hs_rate;
  1841. final->pwr_rx = desired->pwr_rx;
  1842. final->pwr_tx = desired->pwr_tx;
  1843. #else
  1844. #ifndef UFS_CFG_SAFE_BRING_UP
  1845. if (final->pwr_rx == SLOW_MODE || final->pwr_rx == SLOWAUTO_MODE) {
  1846. final->gear_rx = min_t(u32, UFS_DEV_MAX_GEAR_RX, 4);
  1847. final->gear_tx = min_t(u32, UFS_DEV_MAX_GEAR_TX, 4);
  1848. } else {
  1849. final->gear_rx = min_t(u32, ufs_platform.highspeed_gear, desired->gear_rx);
  1850. final->gear_tx = min_t(u32, ufs_platform.highspeed_gear, desired->gear_tx);
  1851. if (ufs_platform.highspeed_gear == UFS_HS_G4) {
  1852. if ((desired->gear_rx == UFS_HS_G4) &&
  1853. (desired->gear_tx == UFS_HS_G4)) {
  1854. /* INITIAL ADAPT */
  1855. hba->dme_set(hba,
  1856. UIC_ARG_MIB(PA_TXHSADAPTTYPE),
  1857. PA_INITIAL_ADAPT);
  1858. } else {
  1859. /* NO ADAPT */
  1860. hba->dme_set(hba,
  1861. UIC_ARG_MIB(PA_TXHSADAPTTYPE),
  1862. PA_NO_ADAPT);
  1863. }
  1864. }
  1865. }
  1866. final->lane_rx = min_t(u32, UFS_DEV_MAX_LANE_RX, desired->lane_rx);
  1867. final->lane_tx = min_t(u32, UFS_DEV_MAX_LANE_TX, desired->lane_tx);
  1868. #else
  1869. final->gear_rx = UFS_DEV_MAX_GEAR_RX;
  1870. final->gear_tx = UFS_DEV_MAX_GEAR_TX;
  1871. final->lane_rx = UFS_DEV_MAX_LANE_RX;
  1872. final->lane_tx = UFS_DEV_MAX_LANE_TX;
  1873. #endif
  1874. final->hs_rate = UFS_DEV_DEFAULT_HS_RATE;
  1875. final->pwr_rx = UFS_DEV_DEFAULT_PWR_RX;
  1876. final->pwr_tx = UFS_DEV_DEFAULT_PWR_TX;
  1877. #endif
  1878. if (final->pwr_rx == SLOW_MODE || final->pwr_rx == SLOWAUTO_MODE)
  1879. UFS_DBG_LOGI("[UFS] info: PWM-G%d\n", final->gear_rx);
  1880. else
  1881. UFS_DBG_LOGI("[UFS] info: HS-G%d-%d\n", final->gear_rx, final->hs_rate);
  1882. /* Set PAPowerModeUserData[0~5] = 0xffff, default is 0 */
  1883. hba->dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA0), 0x1fff);
  1884. hba->dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA1), 0xffff);
  1885. hba->dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA2), 0x7fff);
  1886. hba->dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA3), 0x1fff);
  1887. hba->dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA4), 0xffff);
  1888. hba->dme_set(hba, UIC_ARG_MIB(PA_PWRMODEUSERDATA5), 0x7fff);
  1889. return 0;
  1890. }
  1891. int ufs_aio_enable_unipro_cg(struct ufs_hba *hba, bool enable)
  1892. {
  1893. u32 tmp;
  1894. if (enable) {
  1895. hba->dme_get(hba, UIC_ARG_MIB(VENDOR_SAVEPOWERCONTROL), &tmp);
  1896. tmp = tmp | (1 << RX_SYMBOL_CLK_GATE_EN) |
  1897. (1 << SYS_CLK_GATE_EN) |
  1898. (1 << TX_CLK_GATE_EN);
  1899. hba->dme_set(hba, UIC_ARG_MIB(VENDOR_SAVEPOWERCONTROL), tmp);
  1900. hba->dme_get(hba, UIC_ARG_MIB(VENDOR_DEBUGCLOCKENABLE), &tmp);
  1901. tmp = tmp & ~(1 << TX_SYMBOL_CLK_REQ_FORCE);
  1902. hba->dme_set(hba, UIC_ARG_MIB(VENDOR_DEBUGCLOCKENABLE), tmp);
  1903. } else {
  1904. hba->dme_get(hba, UIC_ARG_MIB(VENDOR_SAVEPOWERCONTROL), &tmp);
  1905. tmp = tmp & ~((1 << RX_SYMBOL_CLK_GATE_EN) |
  1906. (1 << SYS_CLK_GATE_EN) |
  1907. (1 << TX_CLK_GATE_EN));
  1908. hba->dme_set(hba, UIC_ARG_MIB(VENDOR_SAVEPOWERCONTROL), tmp);
  1909. hba->dme_get(hba, UIC_ARG_MIB(VENDOR_DEBUGCLOCKENABLE), &tmp);
  1910. tmp = tmp | (1 << TX_SYMBOL_CLK_REQ_FORCE);
  1911. hba->dme_set(hba, UIC_ARG_MIB(VENDOR_DEBUGCLOCKENABLE), tmp);
  1912. }
  1913. return 0;
  1914. }
  1915. static int ufs_aio_pre_link(struct ufs_hba *hba)
  1916. {
  1917. int ret = 0;
  1918. u32 tmp;
  1919. struct uic_command dme_setting_before_link[] = {
  1920. UIC_CMD_DME_SET(PA_LOCALTXLCCENABLE, 0, 0x0), /* set LCC_Enable to 0 */
  1921. };
  1922. ufs_aio_bootrom_deputy(hba);
  1923. ufs_aio_init_mphy(hba);
  1924. if (hba->hci_quirks & UFSHCD_QUIRK_MTK_MPHY_TESTCHIP) {
  1925. /* enable UIC related interrupts */
  1926. ufshcd_enable_intr(hba, UIC_COMMAND_COMPL);
  1927. /* apply setting before link startup */
  1928. ret = ufshcd_uic_cmd_run(hba, dme_setting_before_link,
  1929. UFS_ARRAY_SIZE(dme_setting_before_link));
  1930. if (ret)
  1931. UFS_DBG_LOGD("dme_setting_before_link fail\n");
  1932. }
  1933. /* disable deep stall by default */
  1934. hba->dme_get(hba, UIC_ARG_MIB(VENDOR_SAVEPOWERCONTROL), &tmp);
  1935. tmp &= ~(1 << 6);
  1936. hba->dme_set(hba, UIC_ARG_MIB(VENDOR_SAVEPOWERCONTROL), tmp);
  1937. /* disable scrambling by default */
  1938. hba->dme_set(hba, UIC_ARG_MIB(PA_SCRAMBLING), 0);
  1939. /* disable unipro clock gating feature by default */
  1940. ufs_aio_enable_unipro_cg(hba, FALSE);
  1941. if (0 != ret)
  1942. ret = 1;
  1943. return ret;
  1944. }
  1945. static int ufs_aio_post_link(struct ufs_hba *hba)
  1946. {
  1947. int ret = 0;
  1948. struct uic_command dme_setting_after_link[] = {
  1949. UIC_CMD_DME_PEER_SET(PA_LOCALTXLCCENABLE, 0, 0x0), /* device LCC_Enable to 0 */
  1950. };
  1951. if (hba->hci_quirks & UFSHCD_QUIRK_MTK_MPHY_TESTCHIP) {
  1952. /* apply setting after link startup */
  1953. ret = ufshcd_uic_cmd_run(hba, dme_setting_after_link,
  1954. UFS_ARRAY_SIZE(dme_setting_after_link));
  1955. if (ret)
  1956. UFS_DBG_LOGD("dme_setting_after_link fail\n");
  1957. }
  1958. #ifdef UFS_CFG_CRYPTO
  1959. /* init HW FDE feature inlined in HCI */
  1960. ufs_aio_crypto_init(hba);
  1961. #endif
  1962. if (0 != ret)
  1963. ret = 1;
  1964. return ret;
  1965. }
  1966. /*
  1967. * In early-porting stage, because of no bootrom, something finished by bootrom shall be finished here instead.
  1968. * Returns:
  1969. * 0: Successful.
  1970. * Non-zero: Failed.
  1971. */
  1972. static int ufs_aio_bootrom_deputy(struct ufs_hba *hba)
  1973. {
  1974. #ifdef UFS_CFG_FPGA_PLATFORM
  1975. u32 reg;
  1976. u32 mask = 0;
  1977. if (!hba->pericfg_base)
  1978. return 1;
  1979. reg = readl(hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  1980. if (ufs_platform.reg_ufs_pericfg_ldo_n_bit != 0xF)
  1981. mask |= (1 << ufs_platform.reg_ufs_pericfg_ldo_n_bit);
  1982. if (ufs_platform.reg_ufs_pericfg_rst_n_bit != 0xF)
  1983. mask |= (1 << ufs_platform.reg_ufs_pericfg_rst_n_bit);
  1984. reg = reg & ~mask;
  1985. writel(reg, hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  1986. udelay(10);
  1987. if (ufs_platform.reg_ufs_pericfg_ldo_n_bit != 0xF) {
  1988. reg = readl(hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  1989. reg = reg | (1 << ufs_platform.reg_ufs_pericfg_ldo_n_bit);
  1990. writel(reg, hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  1991. udelay(10);
  1992. }
  1993. if (ufs_platform.reg_ufs_pericfg_rst_n_bit != 0xF) {
  1994. reg = readl(hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  1995. reg = reg | (1 << ufs_platform.reg_ufs_pericfg_rst_n_bit);
  1996. writel(reg, hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  1997. udelay(10);
  1998. }
  1999. mdelay(1);
  2000. return 0;
  2001. #else
  2002. return 0;
  2003. #endif
  2004. }
  2005. static int ufs_aio_test_unit_ready_all_device(struct ufs_hba *hba)
  2006. {
  2007. int i, tag;
  2008. struct ufs_aio_scsi_cmd cmd;
  2009. u32 start_tick, timeout_tick;
  2010. int ret = UFS_ERR_NONE;
  2011. if (0 == hba->dev_info.num_active_lu) {
  2012. UFS_DBG_LOGE("bug: active_num_lu shall not be 0");
  2013. return -1;
  2014. }
  2015. if (!ufshcd_get_free_tag(hba, &tag))
  2016. return -1;
  2017. /* send test unit ready to each LUN to remove possible UNIT ATTENTION */
  2018. for (i = 0; i < hba->dev_info.num_active_lu; i++) {
  2019. start_tick = gpt4_get_current_tick ();
  2020. timeout_tick =
  2021. gpt4_time2tick_us(UFS_TEST_UNIT_READY_TIMEOUT_US);
  2022. do {
  2023. ufs_aio_scsi_cmd_test_unit_ready(&cmd, tag, i);
  2024. /* check error code if retrun with UNIT ATTENTION */
  2025. ret = ufshcd_queuecommand(hba, &cmd);
  2026. } while (ret && !gpt4_timeout_tick (start_tick, timeout_tick));
  2027. }
  2028. /* send test unit ready to WRPMB LUN */
  2029. start_tick = gpt4_get_current_tick ();
  2030. timeout_tick = gpt4_time2tick_us(UFS_TEST_UNIT_READY_TIMEOUT_US);
  2031. do {
  2032. ufs_aio_scsi_cmd_test_unit_ready(&cmd, tag, WLUN_RPMB);
  2033. /* check error code if retrun with UNIT ATTENTION */
  2034. ret = ufshcd_queuecommand(hba, &cmd);
  2035. } while (ret && !gpt4_timeout_tick (start_tick, timeout_tick));
  2036. ufshcd_put_tag(hba, tag);
  2037. return 0;
  2038. }
  2039. static void ufs_aio_advertise_hci_quirks(struct ufs_hba *hba)
  2040. {
  2041. #ifdef UFS_CFG_FPGA_PLATFORM
  2042. hba->hci_quirks |= UFSHCD_QUIRK_MTK_MPHY_TESTCHIP;
  2043. #endif
  2044. }
  2045. static void ufs_aio_reset_device(struct ufs_hba *hba)
  2046. {
  2047. #if defined(MTK_UFS_DRV_LK)
  2048. /* reset device */
  2049. mt_secure_call(MTK_SIP_BL_UFS_CONTROL_AARCH32, 2, 0, 0, 0);
  2050. udelay(10);
  2051. mt_secure_call(MTK_SIP_BL_UFS_CONTROL_AARCH32, 2, 1, 0, 0);
  2052. #else
  2053. u32 reg;
  2054. if (!hba->pericfg_base) {
  2055. UFS_DBG_LOGD("[UFS] err: %s: pericfg_base is NULL\n", __func__);
  2056. return;
  2057. }
  2058. reg = readl(hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  2059. /* reset device */
  2060. reg = reg & ~(1 << ufs_platform.reg_ufs_pericfg_rst_n_bit);
  2061. writel(reg, hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  2062. udelay(10);
  2063. reg = reg | (1 << ufs_platform.reg_ufs_pericfg_rst_n_bit);
  2064. writel(reg, hba->pericfg_base + ufs_platform.reg_ufs_pericfg);
  2065. #endif
  2066. /* wait awhile after device reset */
  2067. /* We add this as general solution even though only SK-Hynix needs this delay actually. */
  2068. mdelay(10);
  2069. }
  2070. int ufs_aio_set_boot_lu(struct ufs_hba *hba, u32 b_boot_lun_en)
  2071. {
  2072. int ret;
  2073. ret = hba->query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, ATTR_B_BOOT_LUN_EN, 0, 0, &b_boot_lun_en);
  2074. if (0 != ret)
  2075. UFS_DBG_LOGD("[UFS] err: ufs_aio_set_boot_lu error: %d\n", ret);
  2076. else
  2077. UFS_DBG_LOGD("[UFS] info: ufs_aio_set_boot_lu %d done\n", b_boot_lun_en);
  2078. return ret;
  2079. }
  2080. #if defined(MTK_UFS_DRV_PRELOADER)
  2081. int ufs_aio_get_boot_lu(struct ufs_hba *hba, u32 *b_boot_lun)
  2082. {
  2083. int ret;
  2084. ret = hba->query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, ATTR_B_BOOT_LUN_EN, 0, 0, b_boot_lun);
  2085. if (0 != ret)
  2086. UFS_DBG_LOGD("[UFS] err: ufs_aio_get_boot_lu error: %d\n", ret);
  2087. else
  2088. UFS_DBG_LOGD("[UFS] info: ufs_aio_get_boot_lu %d done\n", *b_boot_lun);
  2089. return ret;
  2090. }
  2091. #endif
  2092. u32 ufs_aio_get_lu_cfg_size(struct ufs_hba *hba, struct ufs_geometry_info *info, u32 lun_id)
  2093. {
  2094. u32 d_num_alloc_units;
  2095. u32 tw_size_gb;
  2096. u32 tw_no_red;
  2097. u32 hpb_region_count;
  2098. u32 hpb_size_gb;
  2099. u64 lu2_size; /* unit : 512B */
  2100. u16 lu3_adj_factor;
  2101. UFS_DBG_LOGE("[UFS] %s: lun %d\n", __func__, lun_id);
  2102. UFS_DBG_LOGE("[UFS] d_segment_size=0x%x\n", info->d_segment_size);
  2103. UFS_DBG_LOGE("[UFS] b_allocation_units_size=0x%x\n", info->b_allocation_units_size);
  2104. UFS_DBG_LOGE("[UFS] q_total_raw_device_capacity=0x%llx\n", info->q_total_raw_device_capacity);
  2105. /*
  2106. * 00h: Normal Memory
  2107. * 01h: System code memory type
  2108. * 02h: Non-Persistent memory type
  2109. * 03h: Enhanced memory type 1
  2110. * 04h: Enhanced memory type 2
  2111. * 05h: Enhanced memory type 3
  2112. * 06h: Enhanced memory type 4
  2113. * Others: Reserved
  2114. */
  2115. if (hba->custom_info.lu3_type == 1)
  2116. lu3_adj_factor = info->w_adj_factor_system_code;
  2117. else if (hba->custom_info.lu3_type == 2)
  2118. lu3_adj_factor = info->w_adj_factor_non_persist;
  2119. else if (hba->custom_info.lu3_type == 3)
  2120. lu3_adj_factor = info->w_adj_factor_enahnced_1;
  2121. else if (hba->custom_info.lu3_type == 4)
  2122. lu3_adj_factor = info->w_adj_factor_enahnced_2;
  2123. else if (hba->custom_info.lu3_type == 5)
  2124. lu3_adj_factor = info->w_adj_factor_enahnced_3;
  2125. else if (hba->custom_info.lu3_type == 6)
  2126. lu3_adj_factor = info->w_adj_factor_enahnced_4;
  2127. else
  2128. lu3_adj_factor = 256;
  2129. if (lun_id < 2) { /* boot lu */
  2130. /*
  2131. * Boot size is 4MB which have enhance feature, real size
  2132. * shoule be 4MB * (w_adj_factor_enahnced_1 / 256)
  2133. */
  2134. UFS_DBG_LOGE("[UFS] w_adj_factor_enahnced_1=%d\n", info->w_adj_factor_enahnced_1);
  2135. d_num_alloc_units = ((UFS_BOOT_LU_SIZE_BYTE >> 9) * (info->w_adj_factor_enahnced_1 >> 8)) /
  2136. info->d_segment_size / info->b_allocation_units_size;
  2137. } else if (lun_id == 3) {
  2138. /*
  2139. * LU3 size MB which may have enhance feature, real size
  2140. * shoule be 4MB * (lu3_adj_factor / 256)
  2141. */
  2142. UFS_DBG_LOGE("[UFS] lu3_size_mb=%lld, lu3_type=%d\n", hba->custom_info.lu3_size_mb, hba->custom_info.lu3_type);
  2143. UFS_DBG_LOGE("[UFS] lu3_adj_factor=%d\n", lu3_adj_factor);
  2144. d_num_alloc_units = ((hba->custom_info.lu3_size_mb << 11) * (lu3_adj_factor >> 8)) /
  2145. info->d_segment_size / info->b_allocation_units_size;
  2146. } else { /* user lu */
  2147. d_num_alloc_units = (u32)(((info->q_total_raw_device_capacity) -
  2148. (u64)(2 * (UFS_BOOT_LU_SIZE_BYTE >> 9) * (info->w_adj_factor_enahnced_1 >> 8)) -
  2149. (u64)((hba->custom_info.lu3_size_mb << 11) * (lu3_adj_factor >> 8))) /
  2150. info->d_segment_size / info->b_allocation_units_size);
  2151. if (hba->dev_info.tw_support) {
  2152. tw_size_gb = hba->custom_info.tw_size_gb;
  2153. tw_no_red = hba->custom_info.tw_no_red;
  2154. /* default use ceiling[1/16 of lu 2] */
  2155. if (tw_size_gb == 0xffffffff)
  2156. tw_size_gb = (((d_num_alloc_units * info->b_allocation_units_size * info->d_segment_size) >> 21) + 15) >> 4;
  2157. /* for customer set to max au */
  2158. if (tw_size_gb == 0xfffffffe) {
  2159. info->d_tw_buf_au = info->d_tw_buf_max_au;
  2160. tw_size_gb = (info->d_tw_buf_max_au * info->b_allocation_units_size * info->d_segment_size) >> 21;
  2161. /* Samsung 3.0 not follow spec */
  2162. if ((hba->dev_info.wmanufacturerid == UFS_VENDOR_SAMSUNG) && (hba->dev_info.tw_ver == 0x0101))
  2163. tw_size_gb = tw_size_gb / info->b_tw_buf_adj_fac;
  2164. } else {
  2165. /* Samsung 3.0 not follow spec */
  2166. if ((hba->dev_info.wmanufacturerid == UFS_VENDOR_SAMSUNG) && (hba->dev_info.tw_ver == 0x0101))
  2167. info->d_tw_buf_au = ((tw_size_gb << 21) / info->d_segment_size / info->b_allocation_units_size) * info->b_tw_buf_adj_fac;
  2168. else
  2169. info->d_tw_buf_au = ((tw_size_gb << 21) / info->d_segment_size / info->b_allocation_units_size);
  2170. }
  2171. /* No check error, return err if custom provision fail, auto provision will set to max */
  2172. if (info->d_tw_buf_au > info->d_tw_buf_max_au) {
  2173. if (hba->custom_info.tw_size_gb == 0xffffffff)
  2174. info->d_tw_buf_au = info->d_tw_buf_max_au;
  2175. else
  2176. UFS_DBG_LOGE("[UFS]======================> Err! Max AU=0x%x, but set=0x%x\n", info->d_tw_buf_max_au, info->d_tw_buf_au);
  2177. }
  2178. UFS_DBG_LOGI("[UFS] TW size=%dGB, TW AU=0x%x\n", tw_size_gb, info->d_tw_buf_au);
  2179. if (tw_no_red == 0)
  2180. d_num_alloc_units -= info->d_tw_buf_au;
  2181. }
  2182. if ((hba->dev_info.hpb_support) && (info->q_hpb_region_size)) {
  2183. lu2_size = (u64)d_num_alloc_units * info->b_allocation_units_size * info->d_segment_size;
  2184. UFS_DBG_LOGI("[UFS] LU2 size=0x%llx\n", lu2_size);
  2185. info->w_hpb_lu_max_active_regions = (u32)((lu2_size + info->q_hpb_region_size - 1) / info->q_hpb_region_size);
  2186. if (info->w_hpb_lu_max_active_regions > info->w_hpb_device_max_active_regions) {
  2187. UFS_DBG_LOGI("[UFS] HPB max LU regions=0x%x > device max active regions=0x%x\n",
  2188. info->w_hpb_lu_max_active_regions, info->w_hpb_device_max_active_regions);
  2189. info->w_hpb_lu_max_active_regions = info->w_hpb_device_max_active_regions;
  2190. }
  2191. /* No check error, return err if provision fail */
  2192. if (hba->custom_info.hpb_size_gb != 0xffffffff) {
  2193. hpb_region_count = (hba->custom_info.hpb_size_gb << 21) / info->q_hpb_region_size;
  2194. if (hpb_region_count > info->w_hpb_lu_max_active_regions) {
  2195. UFS_DBG_LOGE("[UFS]======================> Err! Max region count=0x%x, but set=0x%x\n",
  2196. info->w_hpb_lu_max_active_regions, hpb_region_count);
  2197. }
  2198. info->w_hpb_lu_max_active_regions = hpb_region_count;
  2199. }
  2200. hpb_size_gb = (u64)(info->w_hpb_lu_max_active_regions * info->q_hpb_region_size) >> 21;
  2201. UFS_DBG_LOGI("[UFS] HPB size=%dGB, HPB LU regions=0x%x\n", hpb_size_gb, info->w_hpb_lu_max_active_regions);
  2202. }
  2203. }
  2204. UFS_DBG_LOGE("[UFS] d_num_alloc_units=0x%x\n", d_num_alloc_units);
  2205. return d_num_alloc_units;
  2206. }
  2207. static void ufs_aio_util_dump_config_table_hex(u8 *table, u32 bytes, u32 ud0_base_offset, u32 ud_config_len)
  2208. {
  2209. u32 i, ptr;
  2210. ptr = 0;
  2211. for (i = 0; i < ud0_base_offset; i++) {
  2212. UFS_DBG_LOGI("%x ", table[ptr]);
  2213. ptr++;
  2214. if (ptr >= bytes)
  2215. break;
  2216. }
  2217. UFS_DBG_LOGE("\n");
  2218. while (ptr < bytes) {
  2219. for (i = 0; i < ud_config_len; i++) {
  2220. UFS_DBG_LOGI("%x ", table[ptr]);
  2221. ptr++;
  2222. if (ptr >= bytes)
  2223. break;
  2224. }
  2225. UFS_DBG_LOGE("\n");
  2226. if (ptr >= bytes)
  2227. return;
  2228. }
  2229. }
  2230. void ufs_aio_util_dump_table_hex(u8 *table, u32 bytes)
  2231. {
  2232. u32 i, ptr;
  2233. ptr = 0;
  2234. while (ptr < bytes) {
  2235. for (i = 0; i < 16; i++) {
  2236. UFS_DBG_LOGI("%x ", table[ptr]);
  2237. ptr++;
  2238. if (ptr >= bytes)
  2239. break;
  2240. }
  2241. UFS_DBG_LOGE("\n");
  2242. if (ptr >= bytes)
  2243. return;
  2244. }
  2245. }
  2246. int ufs_aio_check_lu_cfg(struct ufs_hba *hba)
  2247. {
  2248. int ret;
  2249. u32 i;
  2250. u8 *p;
  2251. u32 num_active_lu = 0;
  2252. u32 num_boot_lu = 0;
  2253. #ifdef MTK_UFS_DRV_DA
  2254. #ifdef UFS_AIO_DEV_CHECK_LU_SIZE
  2255. u32 d_num_alloc_units_boot_lu;
  2256. u32 d_num_alloc_units_user_lu;
  2257. struct ufs_geometry_info info = {0};
  2258. #endif
  2259. #endif
  2260. /* HPB support, read configuration descriptor with HPB, selector = 1, length = 0xD0(HPB1.0)/0xE2(HPB2.0) */
  2261. if ((hba->dev_info.hpb_support) && (hba->dev_info.wmanufacturerid == UFS_VENDOR_SAMSUNG || hba->dev_info.wmanufacturerid == UFS_VENDOR_MICRON_MP))
  2262. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 1, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  2263. else
  2264. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 0, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  2265. if (0 != ret) {
  2266. UFS_DBG_LOGE("[UFS] err: ufs_aio_check_lu_cfg: read config descr error: %d\n", ret);
  2267. return ret;
  2268. }
  2269. UFS_DBG_LOGE("[UFS] %s: original Configuration Desc:\n", __func__);
  2270. ufs_aio_util_dump_config_table_hex(&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION], hba->dev_info.ud0_base_offset, hba->dev_info.ud_config_len);
  2271. p = (u8 *)&g_ufs_temp_buf[0];
  2272. /* check: number of active LU */
  2273. for (i = 0; i < 8; i++) { /* traverse 8 Unit Descriptor configurable parameters */
  2274. if (i == 0)
  2275. p += hba->dev_info.ud0_base_offset;
  2276. else
  2277. p += hba->dev_info.ud_config_len;
  2278. #ifdef MTK_UFS_DRV_DA
  2279. if ((hba->dev_info.hpb_support) && (i == 2) && (p[CONF_DESC_UNIT_B_LU_ENABLE] == 1) && (hba->custom_info.hpb_size_gb != 0)) {
  2280. UFS_DBG_LOGE("[UFS] error: LU cfg error! HPB support, but not enable, need re-configuration.\n");
  2281. return UFS_ERR_INVALID_LU_CONFIGURATION;
  2282. }
  2283. #endif
  2284. /* 01h: Logical Unit enabled, 02h: HPB Logical Unit enabled */
  2285. if ((p[CONF_DESC_UNIT_B_LU_ENABLE] == 1) ||
  2286. ((hba->dev_info.hpb_support) && (p[CONF_DESC_UNIT_B_LU_ENABLE] == 2)))
  2287. num_active_lu++;
  2288. if ((i < 2) && (0 != p[CONF_DESC_UNIT_B_BOOT_LUN_ID])) {
  2289. num_boot_lu++;
  2290. }
  2291. }
  2292. hba->dev_info.num_active_lu = num_active_lu;
  2293. #ifdef MTK_UFS_DRV_DA
  2294. if (num_active_lu < 3) {
  2295. UFS_DBG_LOGE("[UFS] error: LU cfg error! incorrect number of active LUs: %d, need re-configuration.\n", num_active_lu);
  2296. return UFS_ERR_INVALID_LU_CONFIGURATION;
  2297. } else
  2298. UFS_DBG_LOGI("[UFS] info: number of active LU: %d, check OK.\n", num_active_lu);
  2299. /* check: must have 2 Boot LUs in the first 2 LUs */
  2300. if (num_boot_lu != 2) {
  2301. UFS_DBG_LOGE("[UFS] error: LU cfg error! shall have 2 Boot LUs in the first 2 LUs, need re-configuration.\n");
  2302. return UFS_ERR_INVALID_LU_CONFIGURATION;
  2303. } else
  2304. UFS_DBG_LOGI("[UFS] info: number of Boot LU: %d, check OK.\n", num_boot_lu);
  2305. /* todo: check Boot LU size and User LU size. */
  2306. #ifdef UFS_AIO_DEV_CHECK_LU_SIZE
  2307. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_GEOMETRY, 0, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  2308. if (ret != 0) {
  2309. UFS_DBG_LOGE("[UFS] err: ufs_aio_configure_new_ufs: read geometry desc error: %d\n", ret);
  2310. return ret;
  2311. }
  2312. UFS_DBG_LOGE("[UFS] %s: Geometry Desc:\n", __func__);
  2313. ufs_aio_util_dump_table_hex(&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  2314. p = (u8 *)&g_ufs_temp_buf[0];
  2315. info.q_total_raw_device_capacity = ((u64)p[4] << 56) |
  2316. ((u64)p[5] << 48) |
  2317. ((u64)p[6] << 40) |
  2318. ((u64)p[7] << 32) |
  2319. (p[8] << 24) |
  2320. (p[9] << 16) |
  2321. (p[10] << 8) |
  2322. p[11];
  2323. info.d_segment_size = (p[13] << 24) |
  2324. (p[14] << 16) |
  2325. (p[15] << 8) |
  2326. p[16];
  2327. info.b_allocation_units_size = p[17];
  2328. info.w_adj_factor_system_code = (p[0x24] << 8) | p[0x25];
  2329. info.w_adj_factor_non_persist = (p[0x2A] << 8) | p[0x2B];
  2330. info.w_adj_factor_enahnced_1 = (p[0x30] << 8) | p[0x31];
  2331. info.w_adj_factor_enahnced_2 = (p[0x36] << 8) | p[0x37];
  2332. info.w_adj_factor_enahnced_3 = (p[0x3C] << 8) | p[0x3D];
  2333. info.w_adj_factor_enahnced_4 = (p[0x42] << 8) | p[0x43];
  2334. /* decide LU size */
  2335. d_num_alloc_units_boot_lu = ufs_aio_get_lu_cfg_size(hba, &info, UFS_LU_0);
  2336. d_num_alloc_units_user_lu = ufs_aio_get_lu_cfg_size(hba, &info, UFS_LU_2);
  2337. #endif
  2338. #endif
  2339. return UFS_ERR_NONE;
  2340. }
  2341. #if defined(MTK_UFS_DRV_PRELOADER)
  2342. int ufs_aio_rpmb_get_rw_size(void)
  2343. {
  2344. struct ufs_hba *hba = &g_ufs_hba;
  2345. int ret, size;
  2346. u8 buf[QUERY_DESC_GEOMETRY_MAX_SIZE];
  2347. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_GEOMETRY, 0, 0, buf, QUERY_DESC_GEOMETRY_MAX_SIZE);
  2348. if (ret) {
  2349. UFS_DBG_LOGE("[UFS] err: ufs_aio_rpmb_get_rw_size: read geometry desc error: %d\n", ret);
  2350. return ret;
  2351. }
  2352. size = (int)buf[GEOMETRY_DESC_PARAM_RPMB_READ_WRITE_SIZE];
  2353. UFS_DBG_LOGD("[UFS] rpmb: rw size: %d frames\n", size);
  2354. if (hba->dev_quirks & UFS_DEVICE_QUIRK_LIMITED_RPMB_MAX_RW_SIZE) {
  2355. if (size > UFS_RPMB_DEV_MAX_RW_SIZE_LIMITATION) {
  2356. size = UFS_RPMB_DEV_MAX_RW_SIZE_LIMITATION;
  2357. UFS_DBG_LOGD("[UFS] rpmb: rw size: %d frames (limitation)\n", size);
  2358. }
  2359. }
  2360. return size;
  2361. }
  2362. u64 ufs_aio_rpmb_get_lu_size(void)
  2363. {
  2364. struct ufs_hba *hba = &g_ufs_hba;
  2365. int ret, i;
  2366. u8 buf[QUERY_DESC_UNIT_MAX_SIZE];
  2367. u8 logical_blk_size;
  2368. u32 logical_blk_size_bytes;
  2369. u64 logical_blk_cnt;
  2370. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_UNIT, UFS_UPIU_RPMB_WLUN, 0, buf, QUERY_DESC_UNIT_MAX_SIZE);
  2371. if (ret) {
  2372. UFS_DBG_LOGE("[UFS] err: ufs_aio_rpmb_get_lu_size: read rpmb unit desc error: %d\n", ret);
  2373. return ret;
  2374. }
  2375. logical_blk_size = buf[UNIT_DESC_PARAM_LOGICAL_BLK_SIZE];
  2376. for (i = 0, logical_blk_size_bytes = 1; i < logical_blk_size; i++)
  2377. logical_blk_size_bytes = logical_blk_size_bytes << 1;
  2378. UFS_DBG_LOGD("[UFS] rpmb: logical_blk_size: %d bytes\n", (int)logical_blk_size_bytes);
  2379. logical_blk_cnt = ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT] << 56) |
  2380. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 1] << 48) |
  2381. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 2] << 40) |
  2382. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 3] << 32) |
  2383. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 4] << 24) |
  2384. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 5] << 16) |
  2385. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 6] << 8) |
  2386. ((u64)buf[UNIT_DESC_PARAM_LOGICAL_BLK_COUNT + 7]);
  2387. UFS_DBG_LOGD("[UFS] rpmb: logical_blk_cnt: 0x%llx\n", logical_blk_cnt);
  2388. return (u64)logical_blk_size_bytes * logical_blk_cnt;
  2389. }
  2390. #endif
  2391. int ufs_aio_configure_new_ufs(struct ufs_hba *hba)
  2392. {
  2393. int ret;
  2394. u32 i;
  2395. u8 *p;
  2396. u32 d_num_alloc_units_boot_lu;
  2397. u32 d_num_alloc_units_user_lu;
  2398. u32 d_num_alloc_units_lu3;
  2399. u8 b_tw_buf_type = 0;
  2400. struct ufs_geometry_info info = {0};
  2401. /* HPB support, read geometry descriptor with HPB, selector = 1 */
  2402. if ((hba->dev_info.hpb_support) && (hba->dev_info.wmanufacturerid == UFS_VENDOR_SAMSUNG || hba->dev_info.wmanufacturerid == UFS_VENDOR_MICRON_MP))
  2403. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_GEOMETRY, 0, 1, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  2404. else
  2405. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_GEOMETRY, 0, 0, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  2406. if (0 != ret) {
  2407. UFS_DBG_LOGE("[UFS] err: ufs_aio_configure_new_ufs: read geometry desc error: %d\n", ret);
  2408. return ret;
  2409. }
  2410. UFS_DBG_LOGE("[UFS] %s: Geometry Desc:\n", __func__);
  2411. ufs_aio_util_dump_table_hex(&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_GEOMETRY]);
  2412. p = (u8 *)&g_ufs_temp_buf[0];
  2413. info.q_total_raw_device_capacity = ((u64)p[4] << 56) |
  2414. ((u64)p[5] << 48) |
  2415. ((u64)p[6] << 40) |
  2416. ((u64)p[7] << 32) |
  2417. ((u64)p[8] << 24) |
  2418. ((u64)p[9] << 16) |
  2419. ((u64)p[10] << 8) |
  2420. (u64)p[11];
  2421. info.d_segment_size = (p[13] << 24) |
  2422. (p[14] << 16) |
  2423. (p[15] << 8) |
  2424. p[16];
  2425. info.b_allocation_units_size = p[17];
  2426. info.w_adj_factor_system_code = (p[0x24] << 8) | p[0x25];
  2427. info.w_adj_factor_non_persist = (p[0x2A] << 8) | p[0x2B];
  2428. info.w_adj_factor_enahnced_1 = (p[0x30] << 8) | p[0x31];
  2429. info.w_adj_factor_enahnced_2 = (p[0x36] << 8) | p[0x37];
  2430. info.w_adj_factor_enahnced_3 = (p[0x3C] << 8) | p[0x3D];
  2431. info.w_adj_factor_enahnced_4 = (p[0x42] << 8) | p[0x43];
  2432. if (hba->dev_info.hpb_support) {
  2433. info.q_hpb_region_size = (u64)1 << p[0x48];
  2434. info.w_hpb_device_max_active_regions = (p[0x4B] << 8) | p[0x4C];
  2435. UFS_DBG_LOGI("[UFS] HPB device max active regions=0x%x, region size=0x%llx\n",
  2436. info.w_hpb_device_max_active_regions, info.q_hpb_region_size);
  2437. }
  2438. if (hba->dev_info.tw_support) {
  2439. info.d_tw_buf_max_au = (p[0x4F] << 24)| (p[0x50] << 16) | (p[0x51] << 8) | p[0x52];
  2440. info.b_tw_buf_adj_fac = p[0x54];
  2441. info.b_tw_support_red_type = p[0x55];
  2442. info.b_tw_support_buf_type = p[0x56];
  2443. UFS_DBG_LOGI("[UFS] TW max AU=0x%x, TW adj=%d, TW reduction=%d, TW buffer type=%d\n",
  2444. info.d_tw_buf_max_au, info.b_tw_buf_adj_fac,
  2445. info.b_tw_support_red_type, info.b_tw_support_buf_type);
  2446. }
  2447. /* prepare configuration descriptor */
  2448. memset(&g_ufs_temp_buf[0], 0, QUERY_DESC_CONFIGURAION_MAX_SIZE_HPB_20);
  2449. /*
  2450. * Use length from device descriptor, not from configuartion descriptor.
  2451. * Because some deivce may have 2 kinds configuartion descriptor.
  2452. */
  2453. p[CONF_DESC_B_LENGTH] = hba->dev_info.ud0_base_offset + (8 * hba->dev_info.ud_config_len);
  2454. p[CONF_DESC_B_DESCRIPTOR_TYPE] = QUERY_DESC_IDN_CONFIGURATION;
  2455. p[CONF_DESC_B_BOOT_ENABLE] = 1;
  2456. p[CONF_DESC_B_DESCR_ACCESS_EN] = 1;
  2457. p[CONF_DESC_B_INIT_POWER_MODE] = 1;
  2458. p[CONF_DESC_B_HIGH_PRIORITY_LUN] = 0x7F; /* no high priority LU */
  2459. /* decide LU size */
  2460. d_num_alloc_units_boot_lu = ufs_aio_get_lu_cfg_size(hba, &info, UFS_LU_0);
  2461. d_num_alloc_units_user_lu = ufs_aio_get_lu_cfg_size(hba, &info, UFS_LU_2);
  2462. d_num_alloc_units_lu3 = ufs_aio_get_lu_cfg_size(hba, &info, UFS_LU_3);
  2463. if (hba->dev_info.hpb_support)
  2464. p[CONF_DESC_B_HPB_CINTROL] = 1; /* Device Control */
  2465. if (hba->dev_info.tw_support) {
  2466. p[CONF_DESC_B_TW_BUF_NO_RED_EN] = hba->custom_info.tw_no_red; /* user space reduction */
  2467. if (info.b_tw_support_buf_type == 0x2) /* Support both */
  2468. p[CONF_DESC_B_TW_BUF_TYPE] = 0; /* LU base WB buffer */
  2469. else /* Only support LU base WB buffer(0), single share(1) */
  2470. p[CONF_DESC_B_TW_BUF_TYPE] = info.b_tw_support_buf_type;
  2471. b_tw_buf_type = p[CONF_DESC_B_TW_BUF_TYPE];
  2472. /* 0: LU Base, 1: Single share */
  2473. if (b_tw_buf_type == 1) {
  2474. p[CONF_DESC_D_NUM_SHARED_WB_BUF_AU] = (info.d_tw_buf_au >> 24) & 0xFF;
  2475. p[CONF_DESC_D_NUM_SHARED_WB_BUF_AU + 1] = (info.d_tw_buf_au >> 16) & 0xFF;
  2476. p[CONF_DESC_D_NUM_SHARED_WB_BUF_AU + 2] = (info.d_tw_buf_au >> 8) & 0xFF;
  2477. p[CONF_DESC_D_NUM_SHARED_WB_BUF_AU + 3] = info.d_tw_buf_au & 0xFF;
  2478. }
  2479. }
  2480. for (i = 0; i < 8; i++) { /* traverse 8 Unit Descriptor configurable parameters */
  2481. if (i == 0)
  2482. p += hba->dev_info.ud0_base_offset;
  2483. else
  2484. p += hba->dev_info.ud_config_len;
  2485. /* enable LU0 (boot 1), LU1 (boot 2), LU2 (user) only */
  2486. if (i >= 4) {
  2487. if (hba->dev_quirks & UFS_DEVICE_QUIRK_NEED_CONFIGURATION_FOR_UNUSED_LU) {
  2488. /*
  2489. * Some device does not allow 0x0 in LOGICAL_BLOCK_SIZE even for unused LU.
  2490. *
  2491. * Device vendor shall fix this to ignore any checking for unused LU.
  2492. * Apply this quirk here for development purpose.
  2493. */
  2494. p[CONF_DESC_UNIT_B_LOGICAL_BLOCK_SIZE] = 0xC; /* 4 KB */
  2495. }
  2496. continue;
  2497. }
  2498. /* common configurations for all LUs */
  2499. if ((i == 2) && (hba->dev_info.hpb_support) && (info.w_hpb_lu_max_active_regions != 0)) {
  2500. /* Enable HPB */
  2501. p[CONF_DESC_UNIT_B_LU_ENABLE] = 2;
  2502. p[CONF_DESC_UNIT_W_MAX_ACTIVE_HPB_REGIONS] = (info.w_hpb_lu_max_active_regions >> 8) & 0xFF;
  2503. p[CONF_DESC_UNIT_W_MAX_ACTIVE_HPB_REGIONS + 1] = info.w_hpb_lu_max_active_regions & 0xFF;
  2504. p[CONF_DESC_UNIT_W_HPB_PINNED_REGION_START_IDX] = 0;
  2505. p[CONF_DESC_UNIT_W_HPB_PINNED_REGION_START_IDX + 1] = 0;
  2506. p[CONF_DESC_UNIT_W_NUM_HPB_PINNED_REGIONS] = 0;
  2507. p[CONF_DESC_UNIT_W_NUM_HPB_PINNED_REGIONS + 1] = 0;
  2508. } else {
  2509. p[CONF_DESC_UNIT_B_LU_ENABLE] = 1;
  2510. }
  2511. /* 0: LU Base, 1: Single share */
  2512. if ((i == 2) && (hba->dev_info.tw_support) && (b_tw_buf_type == 0)) {
  2513. p[CONF_DESC_UNIT_D_NUM_TW_BUF_AU] = (info.d_tw_buf_au >> 24) & 0xFF;
  2514. p[CONF_DESC_UNIT_D_NUM_TW_BUF_AU + 1] = (info.d_tw_buf_au >> 16) & 0xFF;
  2515. p[CONF_DESC_UNIT_D_NUM_TW_BUF_AU + 2] = (info.d_tw_buf_au >> 8) & 0xFF;
  2516. p[CONF_DESC_UNIT_D_NUM_TW_BUF_AU + 3] = info.d_tw_buf_au & 0xFF;
  2517. }
  2518. p[CONF_DESC_UNIT_B_LOGICAL_BLOCK_SIZE] = 0xC; /* 4 KB */
  2519. p[CONF_DESC_UNIT_B_PROVISIONING_TYPE] = 0x2; /* thin-provisioning with TPRZ = 0 */
  2520. if (i < 2) { /* boot LU */
  2521. p[CONF_DESC_UNIT_B_DATA_RELIABILITY] = 1;
  2522. p[CONF_DESC_UNIT_B_BOOT_LUN_ID] = i + 1; /* LU0 = Boot A, LU1 = Boot B */
  2523. /*
  2524. * TODO: Set Memory Type of Boot LU according to different vendors
  2525. * SK-Hynix/Samsung: 3
  2526. * Toshiba: 4
  2527. */
  2528. p[CONF_DESC_UNIT_B_MEMORY_TYPE] = UFS_MEMORY_TYPE_ENHANCED_1;
  2529. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS] = (d_num_alloc_units_boot_lu >> 24) & 0xFF;
  2530. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 1] = (d_num_alloc_units_boot_lu >> 16) & 0xFF;
  2531. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 2] = (d_num_alloc_units_boot_lu >> 8) & 0xFF;
  2532. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 3] = d_num_alloc_units_boot_lu & 0xFF;
  2533. } else if (i == 3) { /* new LU3 support */
  2534. if (d_num_alloc_units_lu3) {
  2535. p[CONF_DESC_UNIT_B_MEMORY_TYPE] = hba->custom_info.lu3_type;
  2536. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS] = (d_num_alloc_units_lu3 >> 24) & 0xFF;
  2537. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 1] = (d_num_alloc_units_lu3 >> 16) & 0xFF;
  2538. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 2] = (d_num_alloc_units_lu3 >> 8) & 0xFF;
  2539. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 3] = d_num_alloc_units_lu3 & 0xFF;
  2540. } else {
  2541. p[CONF_DESC_UNIT_B_LU_ENABLE] = 0;
  2542. p[CONF_DESC_UNIT_B_LOGICAL_BLOCK_SIZE] = 0;
  2543. p[CONF_DESC_UNIT_B_PROVISIONING_TYPE] = 0;
  2544. if (hba->dev_quirks & UFS_DEVICE_QUIRK_NEED_CONFIGURATION_FOR_UNUSED_LU)
  2545. p[CONF_DESC_UNIT_B_LOGICAL_BLOCK_SIZE] = 0xC;
  2546. }
  2547. } else { /* non-boot LU (user LU) */
  2548. p[CONF_DESC_UNIT_B_MEMORY_TYPE] = UFS_MEMORY_TYPE_NORMAL;
  2549. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS] = (d_num_alloc_units_user_lu >> 24) & 0xFF;
  2550. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 1] = (d_num_alloc_units_user_lu >> 16) & 0xFF;
  2551. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 2] = (d_num_alloc_units_user_lu >> 8) & 0xFF;
  2552. p[CONF_DESC_UNIT_D_NUM_ALLOC_UNITS + 3] = d_num_alloc_units_user_lu & 0xFF;
  2553. }
  2554. }
  2555. #ifdef MTK_UFS_DRV_DA
  2556. hba->unit_desc_cfg_param_valid = 0;
  2557. #endif
  2558. UFS_DBG_LOGE("[UFS] %s: new Configuration Desc:\n", __func__);
  2559. /* HPB support, write configuration descriptor with HPB, selector = 1, length = 0xD0(HPB1.0)/0xE2(HPB2.0) */
  2560. ufs_aio_util_dump_config_table_hex(&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION], hba->dev_info.ud0_base_offset, hba->dev_info.ud_config_len);
  2561. if ((hba->dev_info.hpb_support) && (hba->dev_info.wmanufacturerid == UFS_VENDOR_SAMSUNG || hba->dev_info.wmanufacturerid == UFS_VENDOR_MICRON_MP))
  2562. ret = hba->write_descriptor(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 1, &g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  2563. else
  2564. ret = hba->write_descriptor(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 0, &g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  2565. if (ret) {
  2566. UFS_DBG_LOGE("[UFS] err: ufs_aio_configure_new_ufs: write conf desc error: %d (0x%x)\n", ret, ret);
  2567. return ret;
  2568. } else
  2569. UFS_DBG_LOGD("[UFS] info: ufs_aio_configure_new_ufs: write conf desc done\n");
  2570. ret = ufs_aio_set_boot_lu(hba, ATTR_B_BOOT_LUN_EN_BOOT_LU_A);
  2571. if (ret)
  2572. return ret;
  2573. // lock down configuration descriptor if required
  2574. if (hba->dev_quirks & UFS_DEVICE_QUIRK_NEED_LOCK_CONFIG_DESC)
  2575. {
  2576. i = 0x1;
  2577. if ((ret = (hba->query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, ATTR_B_CONFIG_DESCR_LOCK, 0, 0, &i))))
  2578. return ret;
  2579. }
  2580. return UFS_ERR_NONE;
  2581. }
  2582. static int ufs_aio_prepare_new_ufs(struct ufs_hba *hba)
  2583. {
  2584. int ret;
  2585. /* configure this new UFS device */
  2586. UFS_DBG_LOGI("[UFS] info: new UFS is found, configuring it ...\n");
  2587. ret = ufs_aio_configure_new_ufs(hba);
  2588. if (UFS_ERR_NONE != ret) {
  2589. UFS_DBG_LOGE("[UFS] err: ufs_aio_configure_new_ufs fail\n");
  2590. return ret;
  2591. }
  2592. UFS_DBG_LOGI("[UFS] info: new UFS configuration done\n");
  2593. /* reset device to apply new configurations */
  2594. #ifdef UFS_CFG_DEVICE_RESET_NONPROTECTED
  2595. ufs_aio_reset_device(hba);
  2596. return UFS_ERR_NEED_REINIT_HOST;
  2597. #else
  2598. /* trigger watchdog reset */
  2599. #endif
  2600. return UFS_ERR_NONE; /* shall not happen */
  2601. }
  2602. struct ufs_hba *ufs_aio_get_host(u8 host_id)
  2603. {
  2604. return &g_ufs_hba;
  2605. }
  2606. int ufs_aio_get_device_info(struct ufs_hba *hba)
  2607. {
  2608. struct ufs_aio_scsi_cmd cmd;
  2609. struct ufs_device_info *card_data;
  2610. int err;
  2611. int tag;
  2612. u8 *p;
  2613. int str_len;
  2614. int sn, i;
  2615. char *bp;
  2616. card_data = &hba->dev_info;
  2617. /* Have init and not reconfing device */
  2618. if ((card_data->wmanufacturerid != 0) && (card_data->bootable == 1))
  2619. return 0;
  2620. memset(card_data, 0, sizeof(struct ufs_device_info));
  2621. err = hba->read_descriptor(hba, QUERY_DESC_IDN_DEVICE, 0, 0, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  2622. if (err) {
  2623. UFS_DBG_LOGE("[UFS] err: ufs_aio_get_device_info: failed reading Device Desc. err = %d\n", err);
  2624. return -1;
  2625. }
  2626. p = (u8 *)&g_ufs_temp_buf[0];
  2627. card_data->ufs_ver = p[DEVICE_DESC_PARAM_SPEC_VER] << 8 |
  2628. p[DEVICE_DESC_PARAM_SPEC_VER + 1];
  2629. UFS_DBG_LOGI("[UFS] UFS version %x.%x\n", p[DEVICE_DESC_PARAM_SPEC_VER], p[DEVICE_DESC_PARAM_SPEC_VER + 1]);
  2630. UFS_DBG_LOGI("[UFS] Device Desc:\n");
  2631. ufs_aio_util_dump_table_hex(p, ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  2632. if (p[DEVICE_DESC_PARAM_BOOT_ENBL] == 0)
  2633. card_data->bootable = 0;
  2634. else
  2635. card_data->bootable = 1;
  2636. /*
  2637. * getting vendor (manufacturerID) and Bank Index in big endian format
  2638. */
  2639. card_data->wmanufacturerid = p[DEVICE_DESC_PARAM_MANF_ID] << 8 |
  2640. p[DEVICE_DESC_PARAM_MANF_ID + 1];
  2641. if ((card_data->wmanufacturerid == UFS_VENDOR_SAMSUNG) || (card_data->wmanufacturerid == UFS_VENDOR_MICRON_MP)) {
  2642. err = ufshcd_init_vendor_desc_sizes(hba); /* samsung/micron need use selector = 1 to read hpb support */
  2643. if (err) /* not support selector = 1 */
  2644. goto skip_selector;
  2645. err = hba->read_descriptor(hba, QUERY_DESC_IDN_DEVICE, 0, 1,
  2646. (u8 *)&g_ufs_temp_buf[0],
  2647. ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  2648. if (err) {
  2649. UFS_DBG_LOGE("[UFS] err: ufs_aio_get_device_info: failed reading HPB Device Desc. err = %d\n", err);
  2650. return -1;
  2651. }
  2652. UFS_DBG_LOGD("[UFS] %s: Device Desc:\n", __func__);
  2653. ufs_aio_util_dump_table_hex(p, ufs_query_desc_max_size[QUERY_DESC_IDN_DEVICE]);
  2654. }
  2655. skip_selector:
  2656. /* Check support HPB feature or not */
  2657. if (p[DEVICE_DESC_PARAM_FEAT_SUP] & 0x80)
  2658. card_data->hpb_support = 1;
  2659. else
  2660. card_data->hpb_support = 0;
  2661. if (card_data->hpb_support) {
  2662. card_data->hpb_ver = (p[DEVICE_DESC_PARAM_HPB_VER] << 8) |
  2663. p[DEVICE_DESC_PARAM_HPB_VER + 1];
  2664. UFS_DBG_LOGI("HPB Version = %x.%x.%x\n",
  2665. (card_data->hpb_ver >> 8) & 0xFF,
  2666. (card_data->hpb_ver >> 4) & 0xF,
  2667. card_data->hpb_ver & 0xF);
  2668. }
  2669. /* Check support TW feature or not */
  2670. if (p[DEVICE_DESC_PARAM_EXT_FEAT_SUP + 2] & 0x1)
  2671. card_data->tw_support = 1;
  2672. else
  2673. card_data->tw_support = 0;
  2674. if (card_data->tw_support) {
  2675. card_data->tw_red = p[DEVICE_DESC_PARAM_TW_BUF_USER_REDUCED];
  2676. card_data->tw_type = p[DEVICE_DESC_PARAM_TW_BUF_TYPE];
  2677. UFS_DBG_LOGI("TW Reduction = %d, TW Type = %d\n",
  2678. card_data->tw_red,card_data->tw_type);
  2679. /* Only Samsung special ufs version have this field */
  2680. if (card_data->wmanufacturerid == UFS_VENDOR_SAMSUNG) {
  2681. if ((card_data->ufs_ver == 0x210) || (card_data->ufs_ver == 0x300))
  2682. card_data->tw_ver = (p[0x55] << 8) | p[0x56];
  2683. else
  2684. card_data->tw_ver = (p[0x4D] << 8) | p[0x4E];
  2685. UFS_DBG_LOGI("TW Version = %x.%x.%x\n",
  2686. (card_data->tw_ver >> 8) & 0xFF,
  2687. (card_data->tw_ver >> 4) & 0xF,
  2688. card_data->tw_ver & 0xF);
  2689. } else {
  2690. card_data->wb_buf_au = (p[DEVICE_DESC_PARAM_NUM_SHARED_WB_BUF_AU] << 24) |
  2691. (p[DEVICE_DESC_PARAM_NUM_SHARED_WB_BUF_AU + 1] << 16) |
  2692. (p[DEVICE_DESC_PARAM_NUM_SHARED_WB_BUF_AU + 2] << 5) |
  2693. (p[DEVICE_DESC_PARAM_NUM_SHARED_WB_BUF_AU + 3]);
  2694. UFS_DBG_LOGI("Shared WB Buffer AU = 0x%x\n", card_data->wb_buf_au);
  2695. }
  2696. }
  2697. /* Normal device:(0x10, 0x10) / HPB device:(0x10, 0x18) */
  2698. card_data->ud0_base_offset = p[DEVICE_DESC_PARAM_UD_OFFSET];
  2699. card_data->ud_config_len = p[DEVICE_DESC_PARAM_UD_LEN];
  2700. UFS_DBG_LOGI("bbUD0BaseOffset = %d, bUDConfigPLength = %d\n", card_data->ud0_base_offset, card_data->ud_config_len);
  2701. /* Serial number */
  2702. sn = p[DEVICE_DESC_PARAM_SN];
  2703. memset(&g_ufs_temp_buf[0], 0, QUERY_DESC_STRING_MAX_SIZE);
  2704. err = hba->read_descriptor(hba, QUERY_DESC_IDN_STRING, sn, 0,
  2705. (u8 *)&g_ufs_temp_buf[0], QUERY_DESC_STRING_MAX_SIZE);
  2706. if (err) {
  2707. UFS_DBG_LOGE("[UFS] err: read string desc error: %d\n", err);
  2708. } else {
  2709. p = (u8 *)&g_ufs_temp_buf[0];
  2710. card_data->serial_number_len = p[0] - 2;
  2711. UFS_DBG_LOGI("[UFS] String Desc: Serial Number INDEX %d, LENGTH %d\n",
  2712. sn, card_data->serial_number_len);
  2713. ufs_aio_util_dump_table_hex(p, p[0]);
  2714. if (card_data->serial_number_len < MAX_SERAL_NUMBER_LEN) {
  2715. bp = card_data->serial_number;
  2716. for (i = 0; i < card_data->serial_number_len; i++)
  2717. itoa(&bp, (int) p[i+2], 16);
  2718. UFS_DBG_LOGI("[UFS] Serial Number: %s\n", card_data->serial_number);
  2719. } else {
  2720. UFS_DBG_LOGE("[UFS] Serial Number size over reserved 64\n");
  2721. }
  2722. }
  2723. #if defined(MTK_UFS_DRV_DA)
  2724. /* Device Health */
  2725. memset(&g_ufs_temp_buf[0], 0, QUERY_DESC_HEALTH_MAX_SIZE);
  2726. err = hba->read_descriptor(hba, QUERY_DESC_IDN_HEALTH, 0, 0,
  2727. (u8 *)&g_ufs_temp_buf[0], QUERY_DESC_HEALTH_MAX_SIZE);
  2728. if (err) {
  2729. UFS_DBG_LOGE("[UFS] err: read health desc error: %d\n", err);
  2730. } else {
  2731. p = (u8 *)&g_ufs_temp_buf[0];
  2732. card_data->pre_eol_info = p[HEALTH_DESC_B_PRE_EOL_INFO];
  2733. card_data->life_time_est_a = p[HEALTH_DESC_B_DEVICE_LIFE_TIME_EST_A];
  2734. card_data->life_time_est_b = p[HEALTH_DESC_B_DEVICE_LIFE_TIME_EST_B];
  2735. UFS_DBG_LOGI("[UFS] life cycle check, pre_eol_info=%d, life_time_est_a=%d, life_time_est_b=%d\n",
  2736. card_data->pre_eol_info, card_data->life_time_est_a, card_data->life_time_est_b);
  2737. }
  2738. #endif
  2739. /* getting active LU number */
  2740. /* card_data->num_active_lu = p[DEVICE_DESC_PARAM_NUM_LU]; */
  2741. if (!ufshcd_get_free_tag(hba, &tag))
  2742. return -1;
  2743. ufs_aio_scsi_cmd_inquiry(&cmd, tag, 0, (unsigned long *)&g_ufs_temp_buf[0]);
  2744. err = ufshcd_queuecommand(hba, &cmd);
  2745. if (err) {
  2746. UFS_DBG_LOGD("[UFS] err: ufshcd_queuecommand err\n");
  2747. return -1;
  2748. }
  2749. ufshcd_put_tag(hba, tag);
  2750. p = (u8 *)&g_ufs_temp_buf[0];
  2751. /*
  2752. * get product ID and product revision level (fw ver)
  2753. * by INQUIRY command
  2754. */
  2755. /* product ID */
  2756. str_len = ufs_util_sanitize_inquiry_string(&p[16], 16);
  2757. if (str_len) {
  2758. UFS_DBG_LOGD("[UFS] get product id string len 0x%x\n", str_len);
  2759. memcpy(card_data->product_id, &p[16], str_len);
  2760. }
  2761. /* product revision level */
  2762. str_len = ufs_util_sanitize_inquiry_string(&p[32], 4);
  2763. if (str_len) {
  2764. UFS_DBG_LOGD("[UFS] get revision level string len 0x%x\n", str_len);
  2765. memcpy(card_data->product_revision_level, &p[32], str_len);
  2766. }
  2767. return 0;
  2768. }
  2769. #if defined(MTK_UFS_DRV_DA)
  2770. int ufs_aio_get_device_buf_alignment_req(struct ufs_hba *hba)
  2771. {
  2772. if (hba->dev_quirks & UFS_DEVICE_QUIRK_NEED_8_BYTE_ALIGNED_BUF)
  2773. return 8;
  2774. else
  2775. return 4;
  2776. }
  2777. int ufs_aio_read_unit_desc_cfg_param(struct ufs_hba *hba)
  2778. {
  2779. int ret;
  2780. u8 *p;
  2781. int i;
  2782. if (1 == hba->unit_desc_cfg_param_valid)
  2783. return 0;
  2784. /* HPB support, read configuration descriptor with HPB, selector = 1, length = 0xD0(HPB1.0)/0xE2(HPB2.0) */
  2785. if ((hba->dev_info.hpb_support) && (hba->dev_info.wmanufacturerid == UFS_VENDOR_SAMSUNG || hba->dev_info.wmanufacturerid == UFS_VENDOR_MICRON_MP))
  2786. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 1, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  2787. else
  2788. ret = hba->read_descriptor(hba, QUERY_DESC_IDN_CONFIGURATION, 0, 0, (u8 *)&g_ufs_temp_buf[0], ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]);
  2789. if (0 != ret) {
  2790. UFS_DBG_LOGD("[UFS] err: ufs_aio_read_unit_desc_cfg_param read desc error: %d\n", ret);
  2791. return ret;
  2792. }
  2793. p = (u8 *)&g_ufs_temp_buf[0];
  2794. if (((p[0] != ufs_query_desc_max_size[QUERY_DESC_IDN_CONFIGURATION]) && (p[0] != QUERY_DESC_CONFIGURAION_MAX_SIZE_HPB) && (p[0] != QUERY_DESC_CONFIGURAION_MAX_SIZE_HPB_20)) ||
  2795. (p[1] != 0x1)) {
  2796. UFS_DBG_LOGD("[UFS] err: invalid configuration descriptor, len: %d, id: %d\n", p[0], p[1]);
  2797. return -1;
  2798. }
  2799. for (i = 0; i < UFS_UPIU_MAX_GENERAL_LUN; i++) {
  2800. memcpy(&hba->unit_desc_cfg_param[i],
  2801. (p + hba->dev_info.ud0_base_offset + (i * hba->dev_info.ud_config_len)),
  2802. 16);
  2803. }
  2804. hba->unit_desc_cfg_param_valid = 1;
  2805. return 0;
  2806. }
  2807. #endif /* MTK_UFS_DRV_DA */
  2808. int ufs_aio_get_lu_size(struct ufs_hba *hba, u32 lun, u32 *blk_size_in_byte, u32 *blk_cnt)
  2809. {
  2810. struct ufs_aio_scsi_cmd cmd;
  2811. int tag;
  2812. int ret;
  2813. u8 *p;
  2814. u32 blk_cnt_int, blk_size_int;
  2815. if (!ufshcd_get_free_tag(hba, &tag))
  2816. return -1;
  2817. ufs_aio_scsi_cmd_read_capacity(&cmd, (u32)tag, lun, (unsigned long *)&g_ufs_temp_buf[0]);
  2818. ret = ufshcd_queuecommand(hba, &cmd);
  2819. if (UFS_ERR_NONE != ret) {
  2820. UFS_DBG_LOGE("[UFS] err: ufs_aio_get_lu_size: ufshcd_queuecommand err\n");
  2821. return ret;
  2822. }
  2823. ufshcd_put_tag(hba, tag);
  2824. p = (u8 *)&g_ufs_temp_buf[0];
  2825. blk_cnt_int = (((u32)(p[0]) << 24) | ((u32)(p[1]) << 16) | ((u32)(p[2]) << 8) | (u32)(p[3])) + 1;
  2826. if (blk_cnt)
  2827. *blk_cnt = blk_cnt_int;
  2828. blk_size_int = ((u32)(p[4]) << 24) | ((u32)(p[5]) << 16) | ((u32)(p[6]) << 8) | (u32)(p[7]);
  2829. if (blk_size_in_byte)
  2830. *blk_size_in_byte = blk_size_int;
  2831. UFS_DBG_LOGE("[UFS] get lu size: lun=%d, blk_cnt=%d, blk_size_in_byte=%d\n",
  2832. lun, blk_cnt_int, blk_size_int);
  2833. return ret;
  2834. }
  2835. void ufs_aio_dbg_show_reg(struct ufs_hba *hba, u32 addr)
  2836. {
  2837. #if (UFS_DBG_LVL <= UFS_DBG_LVL_DEBUG)
  2838. u32 data;
  2839. data = ufshcd_readl(hba, addr);
  2840. UFS_DBG_LOGD("\t: 0x%x, 0x%x\n", addr, data);
  2841. #endif
  2842. }
  2843. static void ufs_aio_dma_map(ufs_vaddr_t buf, ufs_size_t len, enum dma_data_direction dir)
  2844. {
  2845. if (DMA_FROM_DEVICE == dir) { /* read from device (or write to memory) */
  2846. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  2847. arch_clean_invalidate_cache_range((ufs_vaddr_t)buf, (ufs_size_t)len);
  2848. #elif defined(MTK_UFS_DRV_PRELOADER)
  2849. #if CFG_ENABLE_DCACHE
  2850. plat_clean_invalidate_dcache();
  2851. #endif
  2852. #elif defined(MTK_UFS_DRV_CTP)
  2853. cache_clean_invalidate();
  2854. #else
  2855. #error "MUST PORTING ufs_aio_dma_map()\n"
  2856. #endif
  2857. } else { /* bi-directional or read from memory (or write to device) */
  2858. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  2859. arch_sync_cache_range((ufs_vaddr_t)buf, (ufs_size_t)len);
  2860. #elif defined(MTK_UFS_DRV_PRELOADER)
  2861. #if CFG_ENABLE_DCACHE
  2862. plat_clean_invalidate_dcache();
  2863. #endif
  2864. #elif defined(MTK_UFS_DRV_CTP)
  2865. cache_clean();
  2866. #else
  2867. #error "MUST PORTING ufs_aio_dma_map()\n"
  2868. #endif
  2869. }
  2870. }
  2871. static void ufs_aio_dma_unmap(ufs_vaddr_t buf, ufs_size_t len, enum dma_data_direction dir)
  2872. {
  2873. if (DMA_TO_DEVICE != dir) { /* bi-directional or read from device (or write to memory) */
  2874. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_LK)
  2875. arch_clean_invalidate_cache_range((ufs_vaddr_t)buf, (ufs_size_t)len);
  2876. #elif defined(MTK_UFS_DRV_PRELOADER)
  2877. #if CFG_ENABLE_DCACHE
  2878. plat_clean_invalidate_dcache();
  2879. #endif
  2880. #elif defined(MTK_UFS_DRV_CTP)
  2881. cache_clean_invalidate();
  2882. #endif
  2883. }
  2884. }
  2885. int ufs_aio_dma_dme_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val)
  2886. {
  2887. return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_LOCAL);
  2888. }
  2889. int ufs_aio_dma_dme_peer_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val)
  2890. {
  2891. return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_PEER);
  2892. }
  2893. int ufs_aio_dma_dme_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val)
  2894. {
  2895. return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR, mib_val, DME_LOCAL);
  2896. }
  2897. int ufs_aio_dma_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val)
  2898. {
  2899. return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR, mib_val, DME_PEER);
  2900. }
  2901. int ufs_aio_dma_nopin_nopout(struct ufs_hba *hba)
  2902. {
  2903. int err = 0;
  2904. int retries;
  2905. for (retries = NOP_OUT_RETRIES; retries > 0; retries--) {
  2906. err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_NOP,
  2907. NOP_OUT_TIMEOUT);
  2908. if (!err)
  2909. break;
  2910. }
  2911. if (err)
  2912. UFS_DBG_LOGE("[UFS] err: NOP OUT failed\n");
  2913. return err;
  2914. }
  2915. int ufs_aio_dma_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
  2916. enum flag_idn idn, bool *flag_res)
  2917. {
  2918. struct ufs_query_req *request = NULL;
  2919. struct ufs_query_res *response = NULL;
  2920. int err, index = 0, selector = 0;
  2921. BUG_ON(!hba);
  2922. ufshcd_init_query(hba, &request, &response, opcode, idn, index,
  2923. selector);
  2924. switch (opcode) {
  2925. case UPIU_QUERY_OPCODE_SET_FLAG:
  2926. case UPIU_QUERY_OPCODE_CLEAR_FLAG:
  2927. case UPIU_QUERY_OPCODE_TOGGLE_FLAG:
  2928. request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
  2929. break;
  2930. case UPIU_QUERY_OPCODE_READ_FLAG:
  2931. request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
  2932. if (!flag_res) {
  2933. /* No dummy reads */
  2934. UFS_DBG_LOGD("Invalid argument for read request\n");
  2935. err = -1;
  2936. goto out_unlock;
  2937. }
  2938. break;
  2939. default:
  2940. UFS_DBG_LOGD("Expected query flag opcode but got = %d\n", opcode);
  2941. err = -1;
  2942. goto out_unlock;
  2943. }
  2944. err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT);
  2945. if (err) {
  2946. UFS_DBG_LOGD("Sending flag query for idn %d failed, err = %d\n", idn, err);
  2947. goto out_unlock;
  2948. }
  2949. if (flag_res)
  2950. *flag_res = (be32_to_cpu(response->upiu_res.value) &
  2951. MASK_QUERY_UPIU_FLAG_LOC) & 0x1;
  2952. out_unlock:
  2953. return err;
  2954. }
  2955. int ufs_aio_dma_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
  2956. enum attr_idn idn, u8 index, u8 selector, u32 *attr_val)
  2957. {
  2958. struct ufs_query_req *request = NULL;
  2959. struct ufs_query_res *response = NULL;
  2960. int err;
  2961. if (!attr_val) {
  2962. UFS_DBG_LOGD("attribute value required for opcode 0x%x\n", opcode);
  2963. err = -1;
  2964. goto out;
  2965. }
  2966. ufshcd_init_query(hba, &request, &response, opcode, idn, index, selector);
  2967. switch (opcode) {
  2968. case UPIU_QUERY_OPCODE_WRITE_ATTR:
  2969. request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
  2970. request->upiu_req.value = cpu_to_be32(*attr_val);
  2971. break;
  2972. case UPIU_QUERY_OPCODE_READ_ATTR:
  2973. request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
  2974. break;
  2975. default:
  2976. UFS_DBG_LOGD("Expected query attr opcode but got = 0x%.2x\n", opcode);
  2977. err = -1;
  2978. goto out;
  2979. }
  2980. err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT);
  2981. if (err) {
  2982. UFS_DBG_LOGD("opcode 0x%x for idn %d failed, err = %d\n", opcode, idn, err);
  2983. goto out;
  2984. }
  2985. *attr_val = be32_to_cpu(response->upiu_res.value);
  2986. out:
  2987. return err;
  2988. }
  2989. int ufs_aio_dma_read_desc(struct ufs_hba *hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 size)
  2990. {
  2991. return ufshcd_read_desc_param(hba, desc_id, desc_index, selector, buf, size);
  2992. }
  2993. int ufs_aio_dma_write_desc(struct ufs_hba *hba, enum desc_idn idn, int index, u8 selector, u8 *src_buf, u32 buf_len)
  2994. {
  2995. u32 buf_len_local = buf_len;
  2996. return ufshcd_query_descriptor(hba, UPIU_QUERY_OPCODE_WRITE_DESC, idn, index, selector, src_buf, &buf_len_local);
  2997. }
  2998. #if defined(UFS_CFG_CRYPTO)
  2999. u32 sha256_prebuilt[3][16] = {
  3000. { /*for 128 bit key*/
  3001. 0xa5a5a5a5, 0x5a5a5a5a, 0x55aa55aa, 0xaa55aa55,
  3002. 0x0, 0x0, 0x0, 0x0,
  3003. 0x9309da32, 0x87a0c7fc, 0x1b58a359, 0x14fc38ea,
  3004. 0x68c7b319, 0x0dcb6355, 0xa0e565e9, 0x8765ccb5,
  3005. },
  3006. { /*for 192 bit key*/
  3007. 0xa5a5a5a5, 0x5a5a5a5a, 0x55aa55aa, 0xaa55aa55,
  3008. 0xa5a5a5a5, 0x5a5a5a5a, 0x0, 0x0,
  3009. 0xad168c0f, 0x502b6ae1, 0x30199ad0, 0x69488013,
  3010. 0x42659ad8, 0xf94f95ca, 0xf8084fc1, 0x7a2059e6,
  3011. },
  3012. { /*for 256 bit key*/
  3013. 0xa5a5a5a5, 0x5a5a5a5a, 0x55aa55aa, 0xaa55aa55,
  3014. 0xa5a5a5a5, 0x5a5a5a5a, 0x55aa55aa, 0xaa55aa55,
  3015. 0x6a3d2ed7, 0x228ff865, 0x7ea361c0, 0x88610f0c,
  3016. 0x5f3f1c57, 0x8bc5316e, 0x12ab5119, 0x82e947aa,
  3017. },
  3018. };
  3019. int ufs_aio_crypto_init(struct ufs_hba *hba)
  3020. {
  3021. u32 addr, key_bits, key_bytes, cfg_ptr, alg_id, i;
  3022. u32 key[16];
  3023. union ufs_cap_cfg cpt_cfg;
  3024. union ufs_cpt_cap cpt_cap;
  3025. union ufs_cpt_capx cpt_capx;
  3026. u32 cap_id = 7; /* AES-CBC-ESSIV-128bit */
  3027. u32 cfg_id = 0; /* use slot 0 by default */
  3028. /* in-line encryption feature enable */
  3029. ufs_aio_writel(hba, (ufs_aio_readl(hba, REG_CONTROLLER_ENABLE) | (0x1 << 1)), REG_CONTROLLER_ENABLE);
  3030. /* get algo id */
  3031. cpt_capx.capx_raw = ufs_aio_readl(hba, REG_CRYPTO_CAPABILITY_X + (cap_id << 2));
  3032. alg_id = cpt_capx.capx.alg_id;
  3033. /* get cfg ptr */
  3034. cpt_cap.cap_raw = ufs_aio_readl(hba, REG_CRYPTO_CAPABILITY);
  3035. cfg_ptr = cpt_cap.cap.cfg_ptr;
  3036. addr = (cfg_ptr << 8) + (u32)(cfg_id << 7);
  3037. /* set default key */
  3038. memset(key, 0x5A, sizeof(key));
  3039. /* set crypto cfg */
  3040. memset(&cpt_cfg, 0, sizeof(cpt_cfg));
  3041. cpt_cfg.cfgx.cfg_en = 1;
  3042. cpt_cfg.cfgx.cap_id = (u8)cap_id;
  3043. cpt_cfg.cfgx.du_size = (1 << UFS_CRYPTO_DATA_UNIT_SIZE_4KB);
  3044. /* apply key value according to different algorithms */
  3045. switch (cpt_capx.capx.key_size) {
  3046. case 1:
  3047. key_bits = 128;
  3048. break;
  3049. case 2:
  3050. key_bits = 192;
  3051. break;
  3052. case 3:
  3053. key_bits = 256;
  3054. break;
  3055. case 4:
  3056. key_bits = 512;
  3057. break;
  3058. default :
  3059. key_bits = 128; // shall not happen
  3060. break;
  3061. }
  3062. key_bytes = key_bits >> 3; /* byte count*/
  3063. if (UFS_CRYPTO_ALGO_AES_XTS == alg_id) { // AES-XTS
  3064. memcpy((void *)&(cpt_cfg.cfgx.key[0]), (void *)key, key_bytes);
  3065. memcpy((void *)&(cpt_cfg.cfgx.key[8]), (void *)(key + 16), key_bytes);
  3066. } else if (UFS_CRYPTO_ALGO_ESSIV_AES_CBC == alg_id) { // AES-CBC-ESSIV
  3067. if (128 == key_bits)
  3068. memcpy((void *)&(cpt_cfg.cfgx.key[0]), (void *)sha256_prebuilt[0], 64); // always copy 64 byte = 512 bits, will cover both key and hash(key)
  3069. else if (192 == key_bits)
  3070. memcpy((void *)&(cpt_cfg.cfgx.key[0]), (void *)sha256_prebuilt[1], 64); // always copy 64 byte = 512 bits, will cover both key and hash(key)
  3071. else if (256 == key_bits)
  3072. memcpy((void *)&(cpt_cfg.cfgx.key[0]), (void *)sha256_prebuilt[2], 64); // always copy 64 byte = 512 bits, will cover both key and hash(key)
  3073. } else // AES-ECB
  3074. memcpy((void *)&(cpt_cfg.cfgx.key[0]), (void *)key, key_bytes);
  3075. for (i = 0; i < 32; i++)
  3076. ufs_aio_writel(hba, cpt_cfg.cfgx_raw[i], (addr + i * 4));
  3077. return 0;
  3078. }
  3079. #endif /* MTK_UFS_DRV_CTP */
  3080. #ifdef UFS_CFG_ENABLE_PIO
  3081. /**
  3082. * PIO mode related API bodies
  3083. */
  3084. /* TODO: ensure GPT4 is initialized */
  3085. int ufs_aio_pio_cport_direct_write(struct ufs_hba *hba, const unsigned char *data, unsigned long len, int eom, int retry_ms)
  3086. {
  3087. u32 ctrl = 0, reg = 0;
  3088. u32 val_low = 0, val_high = 0;
  3089. int cnt = 0;
  3090. int last = 0;
  3091. int wordLen;
  3092. int i = 0;
  3093. u32 timeout_tick = 0, start_tick = 0;
  3094. wordLen = 8;
  3095. cnt = len / wordLen;
  3096. last = len % wordLen;
  3097. if (last != 0)
  3098. return UFS_CPORT_DIR_ACC_ALIGN_8BYTE_ERR; /* should be 8-byte align in bootROM */
  3099. UFS_DBG_LOGD("cnt is %d\n", cnt);
  3100. if (cnt) {
  3101. /* write data */
  3102. for (i = 0; i < len ; i += wordLen) {
  3103. if (data) {
  3104. val_low = ((*(data + i)) << 24) | ((*(data + i + 1)) << 16) | ((*(data + i + 2)) << 8) | (*(data + i + 3));
  3105. val_high = ((*(data + i + 4)) << 24) | ((*(data + i + 5)) << 16) | ((*(data + i + 6)) << 8) | (*(data + i + 7));
  3106. } else {
  3107. return UFS_CPORT_DIR_ACC_ERR;
  3108. }
  3109. /* write bit enable and control */
  3110. ctrl = 0xFF00 | (1 << 28) | (1 << 29); /* all bytes enable, CADEN on, word alignment on */
  3111. if ((i >= len-wordLen) && (last == 0) && eom)
  3112. ctrl |= (1<<16);
  3113. ufshcd_writel(hba, ctrl, REG_CDACFG);
  3114. ufshcd_writel(hba, val_high, REG_CDATX1);
  3115. ufshcd_writel(hba, val_low, REG_CDATX2);
  3116. /* get timeout tick */
  3117. #ifdef MTK_UFS_DRV_DA
  3118. timeout_tick = gpt4_time2tick_ms(retry_ms);
  3119. start_tick = gpt4_get_current_tick();
  3120. #endif
  3121. while (1) {
  3122. reg = ufshcd_readl(hba, REG_CDASTA);
  3123. if ((reg & (UFS_HCI_REGISTER_FLAG_CDARES | UFS_HCI_REGISTER_FLAG_CDABUSY)) == 0) {
  3124. break; /* ready and no error */
  3125. } else if ((reg & UFS_HCI_REGISTER_FLAG_CDARES) && ((reg & UFS_HCI_REGISTER_FLAG_CDABUSY) == 0)) { /* ready but error */
  3126. UFS_DBG_LOGD("%s #%d: CPort direct access error. error code: 0x%04x\n", __func__, __LINE__, (reg)>>20);
  3127. return UFS_CPORT_DIR_ACC_ERR;
  3128. } else if (gpt4_timeout_tick(start_tick, timeout_tick)) {
  3129. UFS_DBG_LOGD("%s #%d: CPort direct access time out\n", __func__, __LINE__);
  3130. return UFS_CPORT_DIR_ACC_ERR_TIMEOUT;
  3131. }
  3132. }
  3133. }
  3134. }
  3135. return UFS_ERR_NONE;
  3136. }
  3137. int ufs_aio_pio_cport_direct_read(struct ufs_hba *hba, unsigned char *data, unsigned long buflen, u32 *plen, int retry_ms, bool isDummy, u32 real_byte)
  3138. {
  3139. u32 ctrl = 0, reg = 0;
  3140. u32 val_low_u = 0, val_high_u = 0;
  3141. int i = 0;
  3142. u32 buf_index = 0;
  3143. u32 timeout_tick = 0, start_tick = 0;
  3144. /* UFS_DBG_LOGD("Isdummy: %d real_byte:%d read_bytes: %d\n", isDummy, real_byte, *byte_read); */
  3145. *plen = 0;
  3146. /* get timeout tick */
  3147. #ifdef MTK_UFS_DRV_DA
  3148. timeout_tick = gpt4_time2tick_ms(retry_ms);
  3149. start_tick = gpt4_get_current_tick();
  3150. #endif
  3151. while (1) {
  3152. reg = ufshcd_readl(hba, REG_CDASTA);
  3153. if ((reg & UFS_HCI_REGISTER_FLAG_CDASTA)) {
  3154. break;
  3155. } else if (gpt4_timeout_tick(start_tick, timeout_tick)) {
  3156. UFS_DBG_LOGD("%s #%d: CPort direct access time out\n", __func__, __LINE__);
  3157. return UFS_CPORT_DIR_ACC_ERR_TIMEOUT;
  3158. }
  3159. }
  3160. while (reg & UFS_HCI_REGISTER_FLAG_CDASTA) { /* CDASTA (indicates if there is a new data in the buffer */
  3161. if (buf_index >= buflen) {
  3162. UFS_DBG_LOGD("Buffer full so stop reading. buf_index: %d, buflen: %d\n", (int)buf_index, (int)buflen);
  3163. break;
  3164. }
  3165. val_high_u = ufshcd_readl(hba, REG_CDARX1);
  3166. val_low_u = ufshcd_readl(hba, REG_CDARX2);
  3167. ctrl = (reg & 0xFF00) >> 8;
  3168. #ifdef MSG_DEBUG
  3169. #ifdef UFS_UPIU_DEBUG
  3170. /* for debug only */
  3171. if (buflen == 32) {
  3172. UFS_DBG_LOGD("read RX1: 0x%x\n", val_high_u);
  3173. UFS_DBG_LOGD("read RX2: 0x%x\n", val_low_u);
  3174. UFS_DBG_LOGD("read ctrl: 0x%x\n", ctrl);
  3175. }
  3176. #endif
  3177. #endif
  3178. for (i = 0; i < 4; i++) {
  3179. if (ctrl & 0x80) {
  3180. #if 0
  3181. if ((isDummy == TRUE) && (*byte_read >= real_byte)) {
  3182. buf_index++;
  3183. *byte_read++;
  3184. } else
  3185. #endif
  3186. {
  3187. data[buf_index] = (val_low_u >> (3-i)*8) & 0xff;
  3188. buf_index++;
  3189. #if 0
  3190. if (isDummy == TRUE)
  3191. *byte_read++;
  3192. #endif
  3193. }
  3194. }
  3195. ctrl = ctrl << 1;
  3196. }
  3197. if (buf_index >= buflen) { /* Solve 4-byte align data over read problem. ex: expect: 20 byte read: 32byte */
  3198. UFS_DBG_LOGD("Buffer full so stop reading. buf_index: %d, buflen: %d\n", (int)buf_index, (int)buflen);
  3199. break;
  3200. }
  3201. if (i == 4) {
  3202. for (i = 0; i < 4; i++) {
  3203. if (ctrl & 0x80) {
  3204. #if 0
  3205. if ((isDummy == TRUE) && (*byte_read >= real_byte)) {
  3206. buf_index++;
  3207. *byte_read++;
  3208. } else
  3209. #endif
  3210. {
  3211. data[buf_index] = (val_high_u >> (3 - i) * 8) & 0xff;
  3212. buf_index++;
  3213. #if 0
  3214. if (isDummy == TRUE)
  3215. *byte_read++;
  3216. #endif
  3217. }
  3218. }
  3219. ctrl = ctrl << 1;
  3220. }
  3221. }
  3222. reg = ufshcd_readl(hba, REG_CDASTA);
  3223. if (buf_index < buflen) {
  3224. /* get timeout tick */
  3225. #ifdef MTK_UFS_DRV_DA
  3226. timeout_tick = gpt4_time2tick_ms(retry_ms);
  3227. start_tick = gpt4_get_current_tick();
  3228. #endif
  3229. while (1) {
  3230. reg = ufshcd_readl(hba, REG_CDASTA);
  3231. if ((reg & UFS_HCI_REGISTER_FLAG_CDASTA)) {
  3232. break;
  3233. } else if (gpt4_timeout_tick(start_tick, timeout_tick)) {
  3234. UFS_DBG_LOGD("buf_index: %d, buflen: %d", (int)buf_index, (int)buflen);
  3235. UFS_DBG_LOGD("CPort direct access time out\n");
  3236. return UFS_CPORT_DIR_ACC_ERR_TIMEOUT;
  3237. }
  3238. }
  3239. }
  3240. }
  3241. UFS_DBG_LOGD("data length is 0x%x\n", (int)buf_index);
  3242. *plen = buf_index;
  3243. return UFS_ERR_NONE;
  3244. }
  3245. int ufs_aio_pio_query_flag(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res)
  3246. {
  3247. if (UPIU_QUERY_OPCODE_SET_FLAG == opcode)
  3248. return ufs_aio_pio_set_flag(hba, idn);
  3249. else if (UPIU_QUERY_OPCODE_READ_FLAG == opcode)
  3250. return ufs_aio_pio_read_flag(hba, idn, flag_res);
  3251. else
  3252. return -1;
  3253. }
  3254. int ufs_aio_pio_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
  3255. enum attr_idn idn, u8 index, u8 selector, u32 *attr_val)
  3256. {
  3257. return -1;
  3258. }
  3259. int ufs_aio_pio_write_desc(struct ufs_hba *hba, enum desc_idn idn, int index, u8 selector, u8 *src_buf, u32 buf_len)
  3260. {
  3261. return -1;
  3262. }
  3263. int ufs_aio_pio_read_flag(struct ufs_hba *hba, unsigned char flag_idx, bool *value)
  3264. {
  3265. int ret = 0;
  3266. /* unsigned char buf[14]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; */
  3267. u32 resp_read = 0;
  3268. unsigned char req_upiu[32] = {0x0};
  3269. unsigned char resp_upiu[32] = {0x0};
  3270. req_upiu[0] = UPIU_TRANSACTION_QUERY_REQ;
  3271. req_upiu[3] = 0;
  3272. req_upiu[5] = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
  3273. req_upiu[12] = UPIU_QUERY_OPCODE_READ_FLAG;
  3274. req_upiu[13] = flag_idx; /* flag_idn */
  3275. ret = ufs_aio_pio_cport_direct_write(hba, req_upiu, LEN_32, 1, LEN_1000); /* send query request upiu */
  3276. UFS_DBG_LOGD("Not sleep, use polling!!!\n");
  3277. ret = ufs_aio_pio_cport_direct_read(hba, resp_upiu, LEN_32, &resp_read, LEN_1000, FALSE, 0); /* get query response upiu */
  3278. if (resp_upiu[6] != UPIU_RESPONSE_SUCCESS)
  3279. return UFS_EXIT_FAILURE;
  3280. UFS_DBG_LOGD("flag read flag_ind:%d value:%d\n", flag_idx, resp_upiu[23]);
  3281. *value = (bool)resp_upiu[23];
  3282. if (resp_read > 0) {
  3283. unsigned long i;
  3284. UFS_DBG_LOGD("get read flag query response upiu (byte %d):\n", resp_read);
  3285. for (i = 0; i < resp_read; i++) {
  3286. UFS_DBG_LOGD("0x%x ", resp_upiu[i]);
  3287. }
  3288. UFS_DBG_LOGD("\n");
  3289. }
  3290. return ret;
  3291. }
  3292. /* @SET FLAG @In2:flag_idn */
  3293. /* ex: tools 57 1 fDeviceInit Set */
  3294. int ufs_aio_pio_set_flag(struct ufs_hba *hba, unsigned char flag_idx)
  3295. {
  3296. int ret = 0;
  3297. u32 resp_read = 0;
  3298. unsigned char resp_upiu[32] = {0x0};
  3299. unsigned char req_upiu[32] = {0x0};
  3300. req_upiu[0] = UPIU_TRANSACTION_QUERY_REQ;
  3301. req_upiu[3] = 0;
  3302. req_upiu[5] = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
  3303. req_upiu[12] = UPIU_QUERY_OPCODE_SET_FLAG;
  3304. req_upiu[13] = flag_idx;
  3305. UFS_DBG_LOGD("flag set flag_ind:%d\n", flag_idx);
  3306. ret = ufs_aio_pio_cport_direct_write(hba, req_upiu, LEN_32, 1, LEN_1000); /* send query request upiu */
  3307. UFS_DBG_LOGD("Not sleep, use polling!!!\n");
  3308. ret = ufs_aio_pio_cport_direct_read(hba, resp_upiu, LEN_32, &resp_read, LEN_1000, FALSE, 0); /* get query response upiu */
  3309. if (resp_upiu[6] != UPIU_RESPONSE_SUCCESS)
  3310. return UFS_EXIT_FAILURE;
  3311. if (resp_read > 0) {
  3312. unsigned long i;
  3313. UFS_DBG_LOGD("get set flag query response upiu (byte: %d):\n", resp_read);
  3314. for (i = 0; i < resp_read; i++) {
  3315. UFS_DBG_LOGD("0x%x ", resp_upiu[i]);
  3316. }
  3317. UFS_DBG_LOGD("\n");
  3318. }
  3319. return ret;
  3320. }
  3321. int ufs_aio_pio_nopin_nopout(struct ufs_hba *hba)
  3322. {
  3323. int ret = 0;
  3324. unsigned char nopout_cmd[UFS_AIO_PIO_UPIU_CMD_BUF_SIZE], nopin_cmd[UFS_AIO_PIO_UPIU_CMD_BUF_SIZE];
  3325. u32 resp_read = 0;
  3326. memset(nopout_cmd, 0, sizeof(nopout_cmd));
  3327. memset(nopin_cmd, 0, sizeof(nopin_cmd));
  3328. ret = ufs_aio_pio_cport_direct_write(hba, nopout_cmd, LEN_32, 1, LEN_1000); /* send nopout */
  3329. if (ret != UFS_ERR_NONE)
  3330. return UFS_NOPOUT_NOPIN_CPORT_TX_ERR;
  3331. ret = ufs_aio_pio_cport_direct_read(hba, nopin_cmd, LEN_32, &resp_read, LEN_1000, FALSE, 0); /* get nopin */
  3332. if (ret != UFS_ERR_NONE)
  3333. return UFS_NOPOUT_NOPIN_CPORT_RX_ERR;
  3334. #ifdef MSG_DEBUG
  3335. #ifdef UFS_UPIU_DEBUG
  3336. if (resp_read > 0) {
  3337. unsigned long i;
  3338. UFS_DBG_LOGD("get nopin upiu (byte:%d):\n", resp_read);
  3339. for (i = 0; i < resp_read; i++) {
  3340. UFS_DBG_LOGD("0x%x ", nopin_cmd[i]);
  3341. }
  3342. UFS_DBG_LOGD("\n");
  3343. }
  3344. #endif
  3345. #endif
  3346. /* Error handling */
  3347. if ((nopin_cmd[0] != UPIU_TRANSACTION_NOP_IN) || (nopin_cmd[6] != UPIU_RESPONSE_SUCCESS))
  3348. return UFS_NOPOUT_NOPIN_ERR;
  3349. return ret;
  3350. }
  3351. int ufs_aio_pio_read_desc(struct ufs_hba *hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 buf_size)
  3352. {
  3353. int ret = UFS_ERR_NONE;
  3354. u32 resp_read = 0;
  3355. memset(ufs_req_upiu, 0, sizeof(ufs_req_upiu));
  3356. memset(ufs_resp_upiu, 0, sizeof(ufs_resp_upiu));
  3357. memset(buf, 0, buf_size);
  3358. ufs_req_upiu[0] = UPIU_TRANSACTION_QUERY_REQ;
  3359. ufs_req_upiu[3] = 0; /* Task Tag */
  3360. ufs_req_upiu[5] = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
  3361. ufs_req_upiu[12] = UPIU_QUERY_OPCODE_READ_DESC;
  3362. ufs_req_upiu[13] = desc_id; /* Descriptor IDN */
  3363. ufs_req_upiu[14] = desc_index; /* Index */
  3364. ufs_req_upiu[15] = selector; /* Index */
  3365. ufs_req_upiu[10] = 0; /* Data segment length (MSB) */
  3366. ufs_req_upiu[11] = buf_size; /* Data segment length (LSB) */
  3367. ufs_req_upiu[18] = 0; /* Transaction Specific Fields for READ DESCRIPTOR OPCODE: Length (MSB) */
  3368. ufs_req_upiu[19] = buf_size; /* Transaction Specific Fields for READ DESCRIPTOR OPCODE: Length (LSB) */
  3369. ret = ufs_aio_pio_cport_direct_write(hba, ufs_req_upiu, LEN_32, 1, LEN_1000); /* send query request UPIU */
  3370. if (ret != UFS_ERR_NONE)
  3371. return UFS_READ_DESC_CPORT_TX_ERR;
  3372. ret = ufs_aio_pio_cport_direct_read(hba, ufs_resp_upiu, LEN_32, &resp_read, LEN_1000, FALSE, 0); /* get query response UPIU (top 32 bytes, before data) */
  3373. if (ret != UFS_ERR_NONE)
  3374. return UFS_READ_DESC_CPORT_RX_ERR;
  3375. #ifdef MSG_DEBUG
  3376. #ifdef UFS_UPIU_DEBUG
  3377. if (resp_read > 0) {
  3378. unsigned long i;
  3379. UFS_DBG_LOGD("get read device descriptor before data (byte:%d):\n", resp_read);
  3380. for (i = 0; i < resp_read; i++) {
  3381. UFS_DBG_LOGD("0x%x ", ufs_resp_upiu[i]);
  3382. }
  3383. UFS_DBG_LOGD("\n");
  3384. }
  3385. #endif
  3386. #endif
  3387. /* Error handling */
  3388. if ((ufs_resp_upiu[0] != UPIU_TRANSACTION_QUERY_RSP) || (ufs_resp_upiu[6] != UPIU_RESPONSE_SUCCESS))
  3389. return UFS_READ_DESC_ERR;
  3390. ret = ufs_aio_pio_cport_direct_read(hba, buf, ((ufs_resp_upiu[18] << 8) | ufs_resp_upiu[19]), &resp_read, LEN_1000, FALSE, 0); /* get query response UPIU (data part) */
  3391. if (ret != UFS_ERR_NONE)
  3392. return UFS_READ_DESC_CPORT_RX_ERR;
  3393. #ifdef MSG_DEBUG
  3394. #ifdef UFS_UPIU_DEBUG
  3395. if (resp_read > 0) {
  3396. unsigned long i;
  3397. UFS_DBG_LOGD("get device descriptor data (byte:%d)\n", resp_read);
  3398. for (i = 0; i < resp_read; i++) {
  3399. UFS_DBG_LOGD("0x%x ", buf[i]);
  3400. }
  3401. UFS_DBG_LOGD("\n");
  3402. }
  3403. #endif
  3404. #endif
  3405. return ret;
  3406. }
  3407. /* int ufs_aio_pio_dme_set(struct ufs_hba * hba, u32 uic_cmd, uint16 mib_attribute, uint16 gen_select_index, u32 value, u32 *return_code, int retry_ms) */
  3408. int ufs_aio_pio_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, u32 mib_val, u8 peer, u32 *return_code, int retry_ms)
  3409. {
  3410. u32 ret = 0;
  3411. u32 timeout_tick = 0, start_tick = 0;
  3412. if (return_code)
  3413. *return_code = 0;
  3414. ufshcd_writel(hba, attr_sel, REG_UIC_COMMAND_ARG_1);
  3415. ufshcd_writel(hba, UIC_ARG_ATTR_TYPE(attr_set), REG_UIC_COMMAND_ARG_2);
  3416. ufshcd_writel(hba, mib_val, REG_UIC_COMMAND_ARG_3);
  3417. ufshcd_writel(hba, (peer ? UIC_CMD_DME_PEER_SET : UIC_CMD_DME_SET) & COMMAND_OPCODE_MASK, REG_UIC_COMMAND);
  3418. /* get timeout tick */
  3419. #ifdef MTK_UFS_DRV_DA
  3420. timeout_tick = gpt4_time2tick_ms(retry_ms);
  3421. start_tick = gpt4_get_current_tick();
  3422. #endif
  3423. while (1) {
  3424. ret = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
  3425. if ((ret & 0x400) == 0x400) {
  3426. ufshcd_writel(hba, 0x400, REG_INTERRUPT_STATUS);
  3427. break;
  3428. }
  3429. if (gpt4_timeout_tick(start_tick, timeout_tick)) {
  3430. UFS_DBG_LOGD("ERROR : UIC command fail (timeout).\n");
  3431. return UFS_UIC_CMD_ERR_TIMEOUT;
  3432. }
  3433. }
  3434. ret = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2);
  3435. if (ret & 0xFF) {
  3436. UFS_DBG_LOGD("ERROR : ufs_aio_pio_dme_set_attr fail (error arg2: 0x%x)\n", ret);
  3437. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER);
  3438. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_DATA_LINK_LAYER);
  3439. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_NETWORK_LAYER);
  3440. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_TRANSPORT_LAYER);
  3441. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_DME);
  3442. if (return_code)
  3443. *return_code = ret;
  3444. return UFS_UIC_CMD_ERR;
  3445. }
  3446. return UFS_ERR_NONE;
  3447. }
  3448. int ufs_aio_pio_dme_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val)
  3449. {
  3450. return ufs_aio_pio_dme_set_attr(hba, attr_sel, ATTR_SET_NOR, mib_val, DME_LOCAL, NULL, 1000);
  3451. }
  3452. int ufs_aio_pio_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val)
  3453. {
  3454. return ufs_aio_pio_dme_set_attr(hba, attr_sel, ATTR_SET_NOR, mib_val, DME_PEER, NULL, 1000);
  3455. }
  3456. int ufs_aio_pio_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val, u8 peer, u32 *return_code, int retry_ms)
  3457. {
  3458. u32 ret;
  3459. u32 timeout_tick = 0, start_tick = 0;
  3460. if (return_code)
  3461. *return_code = 0;
  3462. ufshcd_writel(hba, attr_sel, REG_UIC_COMMAND_ARG_1);
  3463. ufshcd_writel(hba, 0, REG_UIC_COMMAND_ARG_2);
  3464. ufshcd_writel(hba, 0, REG_UIC_COMMAND_ARG_3);
  3465. ufshcd_writel(hba, (peer ? UIC_CMD_DME_PEER_GET : UIC_CMD_DME_GET) & COMMAND_OPCODE_MASK, REG_UIC_COMMAND);
  3466. /* get timeout tick */
  3467. #ifdef MTK_UFS_DRV_DA
  3468. timeout_tick = gpt4_time2tick_ms(retry_ms);
  3469. start_tick = gpt4_get_current_tick();
  3470. #endif
  3471. while (1) {
  3472. ret = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
  3473. if ((ret & 0x400) == 0x400) {
  3474. ufshcd_writel(hba, 0x400, REG_INTERRUPT_STATUS);
  3475. break;
  3476. }
  3477. if (gpt4_timeout_tick(start_tick, timeout_tick)) {
  3478. UFS_DBG_LOGD("ERROR : UIC command fail (timeout).\n");
  3479. return UFS_UIC_CMD_ERR_TIMEOUT;
  3480. }
  3481. }
  3482. ret = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2);
  3483. if (ret & 0xFF) {
  3484. UFS_DBG_LOGD("ERROR : UIC command fail.\n");
  3485. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER);
  3486. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_DATA_LINK_LAYER);
  3487. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_NETWORK_LAYER);
  3488. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_TRANSPORT_LAYER);
  3489. ufs_aio_dbg_show_reg(hba, REG_UIC_ERROR_CODE_DME);
  3490. if (return_code)
  3491. *return_code = ret;
  3492. return UFS_UIC_CMD_ERR;
  3493. }
  3494. *mib_val = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3);
  3495. return UFS_ERR_NONE;
  3496. }
  3497. int ufs_aio_pio_dme_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val)
  3498. {
  3499. return ufs_aio_pio_dme_get_attr(hba, attr_sel, mib_val, DME_LOCAL, NULL, 1000);
  3500. }
  3501. int ufs_aio_pio_dme_peer_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val)
  3502. {
  3503. return ufs_aio_pio_dme_get_attr(hba, attr_sel, mib_val, DME_PEER, NULL, 1000);
  3504. }
  3505. #endif /* UFS_CFG_ENABLE_PIO */