nfit.c 91 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  6. #include <linux/platform_device.h>
  7. #include <linux/dma-mapping.h>
  8. #include <linux/workqueue.h>
  9. #include <linux/libnvdimm.h>
  10. #include <linux/genalloc.h>
  11. #include <linux/vmalloc.h>
  12. #include <linux/device.h>
  13. #include <linux/module.h>
  14. #include <linux/mutex.h>
  15. #include <linux/ndctl.h>
  16. #include <linux/sizes.h>
  17. #include <linux/list.h>
  18. #include <linux/slab.h>
  19. #include <nd-core.h>
  20. #include <intel.h>
  21. #include <nfit.h>
  22. #include <nd.h>
  23. #include "nfit_test.h"
  24. #include "../watermark.h"
  25. /*
  26. * Generate an NFIT table to describe the following topology:
  27. *
  28. * BUS0: Interleaved PMEM regions, and aliasing with BLK regions
  29. *
  30. * (a) (b) DIMM BLK-REGION
  31. * +----------+--------------+----------+---------+
  32. * +------+ | blk2.0 | pm0.0 | blk2.1 | pm1.0 | 0 region2
  33. * | imc0 +--+- - - - - region0 - - - -+----------+ +
  34. * +--+---+ | blk3.0 | pm0.0 | blk3.1 | pm1.0 | 1 region3
  35. * | +----------+--------------v----------v v
  36. * +--+---+ | |
  37. * | cpu0 | region1
  38. * +--+---+ | |
  39. * | +-------------------------^----------^ ^
  40. * +--+---+ | blk4.0 | pm1.0 | 2 region4
  41. * | imc1 +--+-------------------------+----------+ +
  42. * +------+ | blk5.0 | pm1.0 | 3 region5
  43. * +-------------------------+----------+-+-------+
  44. *
  45. * +--+---+
  46. * | cpu1 |
  47. * +--+---+ (Hotplug DIMM)
  48. * | +----------------------------------------------+
  49. * +--+---+ | blk6.0/pm7.0 | 4 region6/7
  50. * | imc0 +--+----------------------------------------------+
  51. * +------+
  52. *
  53. *
  54. * *) In this layout we have four dimms and two memory controllers in one
  55. * socket. Each unique interface (BLK or PMEM) to DPA space
  56. * is identified by a region device with a dynamically assigned id.
  57. *
  58. * *) The first portion of dimm0 and dimm1 are interleaved as REGION0.
  59. * A single PMEM namespace "pm0.0" is created using half of the
  60. * REGION0 SPA-range. REGION0 spans dimm0 and dimm1. PMEM namespace
  61. * allocate from from the bottom of a region. The unallocated
  62. * portion of REGION0 aliases with REGION2 and REGION3. That
  63. * unallacted capacity is reclaimed as BLK namespaces ("blk2.0" and
  64. * "blk3.0") starting at the base of each DIMM to offset (a) in those
  65. * DIMMs. "pm0.0", "blk2.0" and "blk3.0" are free-form readable
  66. * names that can be assigned to a namespace.
  67. *
  68. * *) In the last portion of dimm0 and dimm1 we have an interleaved
  69. * SPA range, REGION1, that spans those two dimms as well as dimm2
  70. * and dimm3. Some of REGION1 allocated to a PMEM namespace named
  71. * "pm1.0" the rest is reclaimed in 4 BLK namespaces (for each
  72. * dimm in the interleave set), "blk2.1", "blk3.1", "blk4.0", and
  73. * "blk5.0".
  74. *
  75. * *) The portion of dimm2 and dimm3 that do not participate in the
  76. * REGION1 interleaved SPA range (i.e. the DPA address below offset
  77. * (b) are also included in the "blk4.0" and "blk5.0" namespaces.
  78. * Note, that BLK namespaces need not be contiguous in DPA-space, and
  79. * can consume aliased capacity from multiple interleave sets.
  80. *
  81. * BUS1: Legacy NVDIMM (single contiguous range)
  82. *
  83. * region2
  84. * +---------------------+
  85. * |---------------------|
  86. * || pm2.0 ||
  87. * |---------------------|
  88. * +---------------------+
  89. *
  90. * *) A NFIT-table may describe a simple system-physical-address range
  91. * with no BLK aliasing. This type of region may optionally
  92. * reference an NVDIMM.
  93. */
  94. enum {
  95. NUM_PM = 3,
  96. NUM_DCR = 5,
  97. NUM_HINTS = 8,
  98. NUM_BDW = NUM_DCR,
  99. NUM_SPA = NUM_PM + NUM_DCR + NUM_BDW,
  100. NUM_MEM = NUM_DCR + NUM_BDW + 2 /* spa0 iset */
  101. + 4 /* spa1 iset */ + 1 /* spa11 iset */,
  102. DIMM_SIZE = SZ_32M,
  103. LABEL_SIZE = SZ_128K,
  104. SPA_VCD_SIZE = SZ_4M,
  105. SPA0_SIZE = DIMM_SIZE,
  106. SPA1_SIZE = DIMM_SIZE*2,
  107. SPA2_SIZE = DIMM_SIZE,
  108. BDW_SIZE = 64 << 8,
  109. DCR_SIZE = 12,
  110. NUM_NFITS = 2, /* permit testing multiple NFITs per system */
  111. };
  112. struct nfit_test_dcr {
  113. __le64 bdw_addr;
  114. __le32 bdw_status;
  115. __u8 aperature[BDW_SIZE];
  116. };
  117. #define NFIT_DIMM_HANDLE(node, socket, imc, chan, dimm) \
  118. (((node & 0xfff) << 16) | ((socket & 0xf) << 12) \
  119. | ((imc & 0xf) << 8) | ((chan & 0xf) << 4) | (dimm & 0xf))
  120. static u32 handle[] = {
  121. [0] = NFIT_DIMM_HANDLE(0, 0, 0, 0, 0),
  122. [1] = NFIT_DIMM_HANDLE(0, 0, 0, 0, 1),
  123. [2] = NFIT_DIMM_HANDLE(0, 0, 1, 0, 0),
  124. [3] = NFIT_DIMM_HANDLE(0, 0, 1, 0, 1),
  125. [4] = NFIT_DIMM_HANDLE(0, 1, 0, 0, 0),
  126. [5] = NFIT_DIMM_HANDLE(1, 0, 0, 0, 0),
  127. [6] = NFIT_DIMM_HANDLE(1, 0, 0, 0, 1),
  128. };
  129. static unsigned long dimm_fail_cmd_flags[ARRAY_SIZE(handle)];
  130. static int dimm_fail_cmd_code[ARRAY_SIZE(handle)];
  131. struct nfit_test_sec {
  132. u8 state;
  133. u8 ext_state;
  134. u8 old_state;
  135. u8 passphrase[32];
  136. u8 master_passphrase[32];
  137. u64 overwrite_end_time;
  138. } dimm_sec_info[NUM_DCR];
  139. static const struct nd_intel_smart smart_def = {
  140. .flags = ND_INTEL_SMART_HEALTH_VALID
  141. | ND_INTEL_SMART_SPARES_VALID
  142. | ND_INTEL_SMART_ALARM_VALID
  143. | ND_INTEL_SMART_USED_VALID
  144. | ND_INTEL_SMART_SHUTDOWN_VALID
  145. | ND_INTEL_SMART_SHUTDOWN_COUNT_VALID
  146. | ND_INTEL_SMART_MTEMP_VALID
  147. | ND_INTEL_SMART_CTEMP_VALID,
  148. .health = ND_INTEL_SMART_NON_CRITICAL_HEALTH,
  149. .media_temperature = 23 * 16,
  150. .ctrl_temperature = 25 * 16,
  151. .pmic_temperature = 40 * 16,
  152. .spares = 75,
  153. .alarm_flags = ND_INTEL_SMART_SPARE_TRIP
  154. | ND_INTEL_SMART_TEMP_TRIP,
  155. .ait_status = 1,
  156. .life_used = 5,
  157. .shutdown_state = 0,
  158. .shutdown_count = 42,
  159. .vendor_size = 0,
  160. };
  161. struct nfit_test_fw {
  162. enum intel_fw_update_state state;
  163. u32 context;
  164. u64 version;
  165. u32 size_received;
  166. u64 end_time;
  167. bool armed;
  168. bool missed_activate;
  169. unsigned long last_activate;
  170. };
  171. struct nfit_test {
  172. struct acpi_nfit_desc acpi_desc;
  173. struct platform_device pdev;
  174. struct list_head resources;
  175. void *nfit_buf;
  176. dma_addr_t nfit_dma;
  177. size_t nfit_size;
  178. size_t nfit_filled;
  179. int dcr_idx;
  180. int num_dcr;
  181. int num_pm;
  182. void **dimm;
  183. dma_addr_t *dimm_dma;
  184. void **flush;
  185. dma_addr_t *flush_dma;
  186. void **label;
  187. dma_addr_t *label_dma;
  188. void **spa_set;
  189. dma_addr_t *spa_set_dma;
  190. struct nfit_test_dcr **dcr;
  191. dma_addr_t *dcr_dma;
  192. int (*alloc)(struct nfit_test *t);
  193. void (*setup)(struct nfit_test *t);
  194. int setup_hotplug;
  195. union acpi_object **_fit;
  196. dma_addr_t _fit_dma;
  197. struct ars_state {
  198. struct nd_cmd_ars_status *ars_status;
  199. unsigned long deadline;
  200. spinlock_t lock;
  201. } ars_state;
  202. struct device *dimm_dev[ARRAY_SIZE(handle)];
  203. struct nd_intel_smart *smart;
  204. struct nd_intel_smart_threshold *smart_threshold;
  205. struct badrange badrange;
  206. struct work_struct work;
  207. struct nfit_test_fw *fw;
  208. };
  209. static struct workqueue_struct *nfit_wq;
  210. static struct gen_pool *nfit_pool;
  211. static const char zero_key[NVDIMM_PASSPHRASE_LEN];
  212. static struct nfit_test *to_nfit_test(struct device *dev)
  213. {
  214. struct platform_device *pdev = to_platform_device(dev);
  215. return container_of(pdev, struct nfit_test, pdev);
  216. }
  217. static int nd_intel_test_get_fw_info(struct nfit_test *t,
  218. struct nd_intel_fw_info *nd_cmd, unsigned int buf_len,
  219. int idx)
  220. {
  221. struct device *dev = &t->pdev.dev;
  222. struct nfit_test_fw *fw = &t->fw[idx];
  223. dev_dbg(dev, "%s(nfit_test: %p nd_cmd: %p, buf_len: %u, idx: %d\n",
  224. __func__, t, nd_cmd, buf_len, idx);
  225. if (buf_len < sizeof(*nd_cmd))
  226. return -EINVAL;
  227. nd_cmd->status = 0;
  228. nd_cmd->storage_size = INTEL_FW_STORAGE_SIZE;
  229. nd_cmd->max_send_len = INTEL_FW_MAX_SEND_LEN;
  230. nd_cmd->query_interval = INTEL_FW_QUERY_INTERVAL;
  231. nd_cmd->max_query_time = INTEL_FW_QUERY_MAX_TIME;
  232. nd_cmd->update_cap = 0;
  233. nd_cmd->fis_version = INTEL_FW_FIS_VERSION;
  234. nd_cmd->run_version = 0;
  235. nd_cmd->updated_version = fw->version;
  236. return 0;
  237. }
  238. static int nd_intel_test_start_update(struct nfit_test *t,
  239. struct nd_intel_fw_start *nd_cmd, unsigned int buf_len,
  240. int idx)
  241. {
  242. struct device *dev = &t->pdev.dev;
  243. struct nfit_test_fw *fw = &t->fw[idx];
  244. dev_dbg(dev, "%s(nfit_test: %p nd_cmd: %p buf_len: %u idx: %d)\n",
  245. __func__, t, nd_cmd, buf_len, idx);
  246. if (buf_len < sizeof(*nd_cmd))
  247. return -EINVAL;
  248. if (fw->state != FW_STATE_NEW) {
  249. /* extended status, FW update in progress */
  250. nd_cmd->status = 0x10007;
  251. return 0;
  252. }
  253. fw->state = FW_STATE_IN_PROGRESS;
  254. fw->context++;
  255. fw->size_received = 0;
  256. nd_cmd->status = 0;
  257. nd_cmd->context = fw->context;
  258. dev_dbg(dev, "%s: context issued: %#x\n", __func__, nd_cmd->context);
  259. return 0;
  260. }
  261. static int nd_intel_test_send_data(struct nfit_test *t,
  262. struct nd_intel_fw_send_data *nd_cmd, unsigned int buf_len,
  263. int idx)
  264. {
  265. struct device *dev = &t->pdev.dev;
  266. struct nfit_test_fw *fw = &t->fw[idx];
  267. u32 *status = (u32 *)&nd_cmd->data[nd_cmd->length];
  268. dev_dbg(dev, "%s(nfit_test: %p nd_cmd: %p buf_len: %u idx: %d)\n",
  269. __func__, t, nd_cmd, buf_len, idx);
  270. if (buf_len < sizeof(*nd_cmd))
  271. return -EINVAL;
  272. dev_dbg(dev, "%s: cmd->status: %#x\n", __func__, *status);
  273. dev_dbg(dev, "%s: cmd->data[0]: %#x\n", __func__, nd_cmd->data[0]);
  274. dev_dbg(dev, "%s: cmd->data[%u]: %#x\n", __func__, nd_cmd->length-1,
  275. nd_cmd->data[nd_cmd->length-1]);
  276. if (fw->state != FW_STATE_IN_PROGRESS) {
  277. dev_dbg(dev, "%s: not in IN_PROGRESS state\n", __func__);
  278. *status = 0x5;
  279. return 0;
  280. }
  281. if (nd_cmd->context != fw->context) {
  282. dev_dbg(dev, "%s: incorrect context: in: %#x correct: %#x\n",
  283. __func__, nd_cmd->context, fw->context);
  284. *status = 0x10007;
  285. return 0;
  286. }
  287. /*
  288. * check offset + len > size of fw storage
  289. * check length is > max send length
  290. */
  291. if (nd_cmd->offset + nd_cmd->length > INTEL_FW_STORAGE_SIZE ||
  292. nd_cmd->length > INTEL_FW_MAX_SEND_LEN) {
  293. *status = 0x3;
  294. dev_dbg(dev, "%s: buffer boundary violation\n", __func__);
  295. return 0;
  296. }
  297. fw->size_received += nd_cmd->length;
  298. dev_dbg(dev, "%s: copying %u bytes, %u bytes so far\n",
  299. __func__, nd_cmd->length, fw->size_received);
  300. *status = 0;
  301. return 0;
  302. }
  303. static int nd_intel_test_finish_fw(struct nfit_test *t,
  304. struct nd_intel_fw_finish_update *nd_cmd,
  305. unsigned int buf_len, int idx)
  306. {
  307. struct device *dev = &t->pdev.dev;
  308. struct nfit_test_fw *fw = &t->fw[idx];
  309. dev_dbg(dev, "%s(nfit_test: %p nd_cmd: %p buf_len: %u idx: %d)\n",
  310. __func__, t, nd_cmd, buf_len, idx);
  311. if (fw->state == FW_STATE_UPDATED) {
  312. /* update already done, need activation */
  313. nd_cmd->status = 0x20007;
  314. return 0;
  315. }
  316. dev_dbg(dev, "%s: context: %#x ctrl_flags: %#x\n",
  317. __func__, nd_cmd->context, nd_cmd->ctrl_flags);
  318. switch (nd_cmd->ctrl_flags) {
  319. case 0: /* finish */
  320. if (nd_cmd->context != fw->context) {
  321. dev_dbg(dev, "%s: incorrect context: in: %#x correct: %#x\n",
  322. __func__, nd_cmd->context,
  323. fw->context);
  324. nd_cmd->status = 0x10007;
  325. return 0;
  326. }
  327. nd_cmd->status = 0;
  328. fw->state = FW_STATE_VERIFY;
  329. /* set 1 second of time for firmware "update" */
  330. fw->end_time = jiffies + HZ;
  331. break;
  332. case 1: /* abort */
  333. fw->size_received = 0;
  334. /* successfully aborted status */
  335. nd_cmd->status = 0x40007;
  336. fw->state = FW_STATE_NEW;
  337. dev_dbg(dev, "%s: abort successful\n", __func__);
  338. break;
  339. default: /* bad control flag */
  340. dev_warn(dev, "%s: unknown control flag: %#x\n",
  341. __func__, nd_cmd->ctrl_flags);
  342. return -EINVAL;
  343. }
  344. return 0;
  345. }
  346. static int nd_intel_test_finish_query(struct nfit_test *t,
  347. struct nd_intel_fw_finish_query *nd_cmd,
  348. unsigned int buf_len, int idx)
  349. {
  350. struct device *dev = &t->pdev.dev;
  351. struct nfit_test_fw *fw = &t->fw[idx];
  352. dev_dbg(dev, "%s(nfit_test: %p nd_cmd: %p buf_len: %u idx: %d)\n",
  353. __func__, t, nd_cmd, buf_len, idx);
  354. if (buf_len < sizeof(*nd_cmd))
  355. return -EINVAL;
  356. if (nd_cmd->context != fw->context) {
  357. dev_dbg(dev, "%s: incorrect context: in: %#x correct: %#x\n",
  358. __func__, nd_cmd->context, fw->context);
  359. nd_cmd->status = 0x10007;
  360. return 0;
  361. }
  362. dev_dbg(dev, "%s context: %#x\n", __func__, nd_cmd->context);
  363. switch (fw->state) {
  364. case FW_STATE_NEW:
  365. nd_cmd->updated_fw_rev = 0;
  366. nd_cmd->status = 0;
  367. dev_dbg(dev, "%s: new state\n", __func__);
  368. break;
  369. case FW_STATE_IN_PROGRESS:
  370. /* sequencing error */
  371. nd_cmd->status = 0x40007;
  372. nd_cmd->updated_fw_rev = 0;
  373. dev_dbg(dev, "%s: sequence error\n", __func__);
  374. break;
  375. case FW_STATE_VERIFY:
  376. if (time_is_after_jiffies64(fw->end_time)) {
  377. nd_cmd->updated_fw_rev = 0;
  378. nd_cmd->status = 0x20007;
  379. dev_dbg(dev, "%s: still verifying\n", __func__);
  380. break;
  381. }
  382. dev_dbg(dev, "%s: transition out verify\n", __func__);
  383. fw->state = FW_STATE_UPDATED;
  384. fw->missed_activate = false;
  385. fallthrough;
  386. case FW_STATE_UPDATED:
  387. nd_cmd->status = 0;
  388. /* bogus test version */
  389. fw->version = nd_cmd->updated_fw_rev =
  390. INTEL_FW_FAKE_VERSION;
  391. dev_dbg(dev, "%s: updated\n", __func__);
  392. break;
  393. default: /* we should never get here */
  394. return -EINVAL;
  395. }
  396. return 0;
  397. }
  398. static int nfit_test_cmd_get_config_size(struct nd_cmd_get_config_size *nd_cmd,
  399. unsigned int buf_len)
  400. {
  401. if (buf_len < sizeof(*nd_cmd))
  402. return -EINVAL;
  403. nd_cmd->status = 0;
  404. nd_cmd->config_size = LABEL_SIZE;
  405. nd_cmd->max_xfer = SZ_4K;
  406. return 0;
  407. }
  408. static int nfit_test_cmd_get_config_data(struct nd_cmd_get_config_data_hdr
  409. *nd_cmd, unsigned int buf_len, void *label)
  410. {
  411. unsigned int len, offset = nd_cmd->in_offset;
  412. int rc;
  413. if (buf_len < sizeof(*nd_cmd))
  414. return -EINVAL;
  415. if (offset >= LABEL_SIZE)
  416. return -EINVAL;
  417. if (nd_cmd->in_length + sizeof(*nd_cmd) > buf_len)
  418. return -EINVAL;
  419. nd_cmd->status = 0;
  420. len = min(nd_cmd->in_length, LABEL_SIZE - offset);
  421. memcpy(nd_cmd->out_buf, label + offset, len);
  422. rc = buf_len - sizeof(*nd_cmd) - len;
  423. return rc;
  424. }
  425. static int nfit_test_cmd_set_config_data(struct nd_cmd_set_config_hdr *nd_cmd,
  426. unsigned int buf_len, void *label)
  427. {
  428. unsigned int len, offset = nd_cmd->in_offset;
  429. u32 *status;
  430. int rc;
  431. if (buf_len < sizeof(*nd_cmd))
  432. return -EINVAL;
  433. if (offset >= LABEL_SIZE)
  434. return -EINVAL;
  435. if (nd_cmd->in_length + sizeof(*nd_cmd) + 4 > buf_len)
  436. return -EINVAL;
  437. status = (void *)nd_cmd + nd_cmd->in_length + sizeof(*nd_cmd);
  438. *status = 0;
  439. len = min(nd_cmd->in_length, LABEL_SIZE - offset);
  440. memcpy(label + offset, nd_cmd->in_buf, len);
  441. rc = buf_len - sizeof(*nd_cmd) - (len + 4);
  442. return rc;
  443. }
  444. #define NFIT_TEST_CLEAR_ERR_UNIT 256
  445. static int nfit_test_cmd_ars_cap(struct nd_cmd_ars_cap *nd_cmd,
  446. unsigned int buf_len)
  447. {
  448. int ars_recs;
  449. if (buf_len < sizeof(*nd_cmd))
  450. return -EINVAL;
  451. /* for testing, only store up to n records that fit within 4k */
  452. ars_recs = SZ_4K / sizeof(struct nd_ars_record);
  453. nd_cmd->max_ars_out = sizeof(struct nd_cmd_ars_status)
  454. + ars_recs * sizeof(struct nd_ars_record);
  455. nd_cmd->status = (ND_ARS_PERSISTENT | ND_ARS_VOLATILE) << 16;
  456. nd_cmd->clear_err_unit = NFIT_TEST_CLEAR_ERR_UNIT;
  457. return 0;
  458. }
  459. static void post_ars_status(struct ars_state *ars_state,
  460. struct badrange *badrange, u64 addr, u64 len)
  461. {
  462. struct nd_cmd_ars_status *ars_status;
  463. struct nd_ars_record *ars_record;
  464. struct badrange_entry *be;
  465. u64 end = addr + len - 1;
  466. int i = 0;
  467. ars_state->deadline = jiffies + 1*HZ;
  468. ars_status = ars_state->ars_status;
  469. ars_status->status = 0;
  470. ars_status->address = addr;
  471. ars_status->length = len;
  472. ars_status->type = ND_ARS_PERSISTENT;
  473. spin_lock(&badrange->lock);
  474. list_for_each_entry(be, &badrange->list, list) {
  475. u64 be_end = be->start + be->length - 1;
  476. u64 rstart, rend;
  477. /* skip entries outside the range */
  478. if (be_end < addr || be->start > end)
  479. continue;
  480. rstart = (be->start < addr) ? addr : be->start;
  481. rend = (be_end < end) ? be_end : end;
  482. ars_record = &ars_status->records[i];
  483. ars_record->handle = 0;
  484. ars_record->err_address = rstart;
  485. ars_record->length = rend - rstart + 1;
  486. i++;
  487. }
  488. spin_unlock(&badrange->lock);
  489. ars_status->num_records = i;
  490. ars_status->out_length = sizeof(struct nd_cmd_ars_status)
  491. + i * sizeof(struct nd_ars_record);
  492. }
  493. static int nfit_test_cmd_ars_start(struct nfit_test *t,
  494. struct ars_state *ars_state,
  495. struct nd_cmd_ars_start *ars_start, unsigned int buf_len,
  496. int *cmd_rc)
  497. {
  498. if (buf_len < sizeof(*ars_start))
  499. return -EINVAL;
  500. spin_lock(&ars_state->lock);
  501. if (time_before(jiffies, ars_state->deadline)) {
  502. ars_start->status = NFIT_ARS_START_BUSY;
  503. *cmd_rc = -EBUSY;
  504. } else {
  505. ars_start->status = 0;
  506. ars_start->scrub_time = 1;
  507. post_ars_status(ars_state, &t->badrange, ars_start->address,
  508. ars_start->length);
  509. *cmd_rc = 0;
  510. }
  511. spin_unlock(&ars_state->lock);
  512. return 0;
  513. }
  514. static int nfit_test_cmd_ars_status(struct ars_state *ars_state,
  515. struct nd_cmd_ars_status *ars_status, unsigned int buf_len,
  516. int *cmd_rc)
  517. {
  518. if (buf_len < ars_state->ars_status->out_length)
  519. return -EINVAL;
  520. spin_lock(&ars_state->lock);
  521. if (time_before(jiffies, ars_state->deadline)) {
  522. memset(ars_status, 0, buf_len);
  523. ars_status->status = NFIT_ARS_STATUS_BUSY;
  524. ars_status->out_length = sizeof(*ars_status);
  525. *cmd_rc = -EBUSY;
  526. } else {
  527. memcpy(ars_status, ars_state->ars_status,
  528. ars_state->ars_status->out_length);
  529. *cmd_rc = 0;
  530. }
  531. spin_unlock(&ars_state->lock);
  532. return 0;
  533. }
  534. static int nfit_test_cmd_clear_error(struct nfit_test *t,
  535. struct nd_cmd_clear_error *clear_err,
  536. unsigned int buf_len, int *cmd_rc)
  537. {
  538. const u64 mask = NFIT_TEST_CLEAR_ERR_UNIT - 1;
  539. if (buf_len < sizeof(*clear_err))
  540. return -EINVAL;
  541. if ((clear_err->address & mask) || (clear_err->length & mask))
  542. return -EINVAL;
  543. badrange_forget(&t->badrange, clear_err->address, clear_err->length);
  544. clear_err->status = 0;
  545. clear_err->cleared = clear_err->length;
  546. *cmd_rc = 0;
  547. return 0;
  548. }
  549. struct region_search_spa {
  550. u64 addr;
  551. struct nd_region *region;
  552. };
  553. static int is_region_device(struct device *dev)
  554. {
  555. return !strncmp(dev->kobj.name, "region", 6);
  556. }
  557. static int nfit_test_search_region_spa(struct device *dev, void *data)
  558. {
  559. struct region_search_spa *ctx = data;
  560. struct nd_region *nd_region;
  561. resource_size_t ndr_end;
  562. if (!is_region_device(dev))
  563. return 0;
  564. nd_region = to_nd_region(dev);
  565. ndr_end = nd_region->ndr_start + nd_region->ndr_size;
  566. if (ctx->addr >= nd_region->ndr_start && ctx->addr < ndr_end) {
  567. ctx->region = nd_region;
  568. return 1;
  569. }
  570. return 0;
  571. }
  572. static int nfit_test_search_spa(struct nvdimm_bus *bus,
  573. struct nd_cmd_translate_spa *spa)
  574. {
  575. int ret;
  576. struct nd_region *nd_region = NULL;
  577. struct nvdimm *nvdimm = NULL;
  578. struct nd_mapping *nd_mapping = NULL;
  579. struct region_search_spa ctx = {
  580. .addr = spa->spa,
  581. .region = NULL,
  582. };
  583. u64 dpa;
  584. ret = device_for_each_child(&bus->dev, &ctx,
  585. nfit_test_search_region_spa);
  586. if (!ret)
  587. return -ENODEV;
  588. nd_region = ctx.region;
  589. dpa = ctx.addr - nd_region->ndr_start;
  590. /*
  591. * last dimm is selected for test
  592. */
  593. nd_mapping = &nd_region->mapping[nd_region->ndr_mappings - 1];
  594. nvdimm = nd_mapping->nvdimm;
  595. spa->devices[0].nfit_device_handle = handle[nvdimm->id];
  596. spa->num_nvdimms = 1;
  597. spa->devices[0].dpa = dpa;
  598. return 0;
  599. }
  600. static int nfit_test_cmd_translate_spa(struct nvdimm_bus *bus,
  601. struct nd_cmd_translate_spa *spa, unsigned int buf_len)
  602. {
  603. if (buf_len < spa->translate_length)
  604. return -EINVAL;
  605. if (nfit_test_search_spa(bus, spa) < 0 || !spa->num_nvdimms)
  606. spa->status = 2;
  607. return 0;
  608. }
  609. static int nfit_test_cmd_smart(struct nd_intel_smart *smart, unsigned int buf_len,
  610. struct nd_intel_smart *smart_data)
  611. {
  612. if (buf_len < sizeof(*smart))
  613. return -EINVAL;
  614. memcpy(smart, smart_data, sizeof(*smart));
  615. return 0;
  616. }
  617. static int nfit_test_cmd_smart_threshold(
  618. struct nd_intel_smart_threshold *out,
  619. unsigned int buf_len,
  620. struct nd_intel_smart_threshold *smart_t)
  621. {
  622. if (buf_len < sizeof(*smart_t))
  623. return -EINVAL;
  624. memcpy(out, smart_t, sizeof(*smart_t));
  625. return 0;
  626. }
  627. static void smart_notify(struct device *bus_dev,
  628. struct device *dimm_dev, struct nd_intel_smart *smart,
  629. struct nd_intel_smart_threshold *thresh)
  630. {
  631. dev_dbg(dimm_dev, "%s: alarm: %#x spares: %d (%d) mtemp: %d (%d) ctemp: %d (%d)\n",
  632. __func__, thresh->alarm_control, thresh->spares,
  633. smart->spares, thresh->media_temperature,
  634. smart->media_temperature, thresh->ctrl_temperature,
  635. smart->ctrl_temperature);
  636. if (((thresh->alarm_control & ND_INTEL_SMART_SPARE_TRIP)
  637. && smart->spares
  638. <= thresh->spares)
  639. || ((thresh->alarm_control & ND_INTEL_SMART_TEMP_TRIP)
  640. && smart->media_temperature
  641. >= thresh->media_temperature)
  642. || ((thresh->alarm_control & ND_INTEL_SMART_CTEMP_TRIP)
  643. && smart->ctrl_temperature
  644. >= thresh->ctrl_temperature)
  645. || (smart->health != ND_INTEL_SMART_NON_CRITICAL_HEALTH)
  646. || (smart->shutdown_state != 0)) {
  647. device_lock(bus_dev);
  648. __acpi_nvdimm_notify(dimm_dev, 0x81);
  649. device_unlock(bus_dev);
  650. }
  651. }
  652. static int nfit_test_cmd_smart_set_threshold(
  653. struct nd_intel_smart_set_threshold *in,
  654. unsigned int buf_len,
  655. struct nd_intel_smart_threshold *thresh,
  656. struct nd_intel_smart *smart,
  657. struct device *bus_dev, struct device *dimm_dev)
  658. {
  659. unsigned int size;
  660. size = sizeof(*in) - 4;
  661. if (buf_len < size)
  662. return -EINVAL;
  663. memcpy(thresh->data, in, size);
  664. in->status = 0;
  665. smart_notify(bus_dev, dimm_dev, smart, thresh);
  666. return 0;
  667. }
  668. static int nfit_test_cmd_smart_inject(
  669. struct nd_intel_smart_inject *inj,
  670. unsigned int buf_len,
  671. struct nd_intel_smart_threshold *thresh,
  672. struct nd_intel_smart *smart,
  673. struct device *bus_dev, struct device *dimm_dev)
  674. {
  675. if (buf_len != sizeof(*inj))
  676. return -EINVAL;
  677. if (inj->flags & ND_INTEL_SMART_INJECT_MTEMP) {
  678. if (inj->mtemp_enable)
  679. smart->media_temperature = inj->media_temperature;
  680. else
  681. smart->media_temperature = smart_def.media_temperature;
  682. }
  683. if (inj->flags & ND_INTEL_SMART_INJECT_SPARE) {
  684. if (inj->spare_enable)
  685. smart->spares = inj->spares;
  686. else
  687. smart->spares = smart_def.spares;
  688. }
  689. if (inj->flags & ND_INTEL_SMART_INJECT_FATAL) {
  690. if (inj->fatal_enable)
  691. smart->health = ND_INTEL_SMART_FATAL_HEALTH;
  692. else
  693. smart->health = ND_INTEL_SMART_NON_CRITICAL_HEALTH;
  694. }
  695. if (inj->flags & ND_INTEL_SMART_INJECT_SHUTDOWN) {
  696. if (inj->unsafe_shutdown_enable) {
  697. smart->shutdown_state = 1;
  698. smart->shutdown_count++;
  699. } else
  700. smart->shutdown_state = 0;
  701. }
  702. inj->status = 0;
  703. smart_notify(bus_dev, dimm_dev, smart, thresh);
  704. return 0;
  705. }
  706. static void uc_error_notify(struct work_struct *work)
  707. {
  708. struct nfit_test *t = container_of(work, typeof(*t), work);
  709. __acpi_nfit_notify(&t->pdev.dev, t, NFIT_NOTIFY_UC_MEMORY_ERROR);
  710. }
  711. static int nfit_test_cmd_ars_error_inject(struct nfit_test *t,
  712. struct nd_cmd_ars_err_inj *err_inj, unsigned int buf_len)
  713. {
  714. int rc;
  715. if (buf_len != sizeof(*err_inj)) {
  716. rc = -EINVAL;
  717. goto err;
  718. }
  719. if (err_inj->err_inj_spa_range_length <= 0) {
  720. rc = -EINVAL;
  721. goto err;
  722. }
  723. rc = badrange_add(&t->badrange, err_inj->err_inj_spa_range_base,
  724. err_inj->err_inj_spa_range_length);
  725. if (rc < 0)
  726. goto err;
  727. if (err_inj->err_inj_options & (1 << ND_ARS_ERR_INJ_OPT_NOTIFY))
  728. queue_work(nfit_wq, &t->work);
  729. err_inj->status = 0;
  730. return 0;
  731. err:
  732. err_inj->status = NFIT_ARS_INJECT_INVALID;
  733. return rc;
  734. }
  735. static int nfit_test_cmd_ars_inject_clear(struct nfit_test *t,
  736. struct nd_cmd_ars_err_inj_clr *err_clr, unsigned int buf_len)
  737. {
  738. int rc;
  739. if (buf_len != sizeof(*err_clr)) {
  740. rc = -EINVAL;
  741. goto err;
  742. }
  743. if (err_clr->err_inj_clr_spa_range_length <= 0) {
  744. rc = -EINVAL;
  745. goto err;
  746. }
  747. badrange_forget(&t->badrange, err_clr->err_inj_clr_spa_range_base,
  748. err_clr->err_inj_clr_spa_range_length);
  749. err_clr->status = 0;
  750. return 0;
  751. err:
  752. err_clr->status = NFIT_ARS_INJECT_INVALID;
  753. return rc;
  754. }
  755. static int nfit_test_cmd_ars_inject_status(struct nfit_test *t,
  756. struct nd_cmd_ars_err_inj_stat *err_stat,
  757. unsigned int buf_len)
  758. {
  759. struct badrange_entry *be;
  760. int max = SZ_4K / sizeof(struct nd_error_stat_query_record);
  761. int i = 0;
  762. err_stat->status = 0;
  763. spin_lock(&t->badrange.lock);
  764. list_for_each_entry(be, &t->badrange.list, list) {
  765. err_stat->record[i].err_inj_stat_spa_range_base = be->start;
  766. err_stat->record[i].err_inj_stat_spa_range_length = be->length;
  767. i++;
  768. if (i > max)
  769. break;
  770. }
  771. spin_unlock(&t->badrange.lock);
  772. err_stat->inj_err_rec_count = i;
  773. return 0;
  774. }
  775. static int nd_intel_test_cmd_set_lss_status(struct nfit_test *t,
  776. struct nd_intel_lss *nd_cmd, unsigned int buf_len)
  777. {
  778. struct device *dev = &t->pdev.dev;
  779. if (buf_len < sizeof(*nd_cmd))
  780. return -EINVAL;
  781. switch (nd_cmd->enable) {
  782. case 0:
  783. nd_cmd->status = 0;
  784. dev_dbg(dev, "%s: Latch System Shutdown Status disabled\n",
  785. __func__);
  786. break;
  787. case 1:
  788. nd_cmd->status = 0;
  789. dev_dbg(dev, "%s: Latch System Shutdown Status enabled\n",
  790. __func__);
  791. break;
  792. default:
  793. dev_warn(dev, "Unknown enable value: %#x\n", nd_cmd->enable);
  794. nd_cmd->status = 0x3;
  795. break;
  796. }
  797. return 0;
  798. }
  799. static int override_return_code(int dimm, unsigned int func, int rc)
  800. {
  801. if ((1 << func) & dimm_fail_cmd_flags[dimm]) {
  802. if (dimm_fail_cmd_code[dimm])
  803. return dimm_fail_cmd_code[dimm];
  804. return -EIO;
  805. }
  806. return rc;
  807. }
  808. static int nd_intel_test_cmd_security_status(struct nfit_test *t,
  809. struct nd_intel_get_security_state *nd_cmd,
  810. unsigned int buf_len, int dimm)
  811. {
  812. struct device *dev = &t->pdev.dev;
  813. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  814. nd_cmd->status = 0;
  815. nd_cmd->state = sec->state;
  816. nd_cmd->extended_state = sec->ext_state;
  817. dev_dbg(dev, "security state (%#x) returned\n", nd_cmd->state);
  818. return 0;
  819. }
  820. static int nd_intel_test_cmd_unlock_unit(struct nfit_test *t,
  821. struct nd_intel_unlock_unit *nd_cmd,
  822. unsigned int buf_len, int dimm)
  823. {
  824. struct device *dev = &t->pdev.dev;
  825. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  826. if (!(sec->state & ND_INTEL_SEC_STATE_LOCKED) ||
  827. (sec->state & ND_INTEL_SEC_STATE_FROZEN)) {
  828. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  829. dev_dbg(dev, "unlock unit: invalid state: %#x\n",
  830. sec->state);
  831. } else if (memcmp(nd_cmd->passphrase, sec->passphrase,
  832. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  833. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  834. dev_dbg(dev, "unlock unit: invalid passphrase\n");
  835. } else {
  836. nd_cmd->status = 0;
  837. sec->state = ND_INTEL_SEC_STATE_ENABLED;
  838. dev_dbg(dev, "Unit unlocked\n");
  839. }
  840. dev_dbg(dev, "unlocking status returned: %#x\n", nd_cmd->status);
  841. return 0;
  842. }
  843. static int nd_intel_test_cmd_set_pass(struct nfit_test *t,
  844. struct nd_intel_set_passphrase *nd_cmd,
  845. unsigned int buf_len, int dimm)
  846. {
  847. struct device *dev = &t->pdev.dev;
  848. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  849. if (sec->state & ND_INTEL_SEC_STATE_FROZEN) {
  850. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  851. dev_dbg(dev, "set passphrase: wrong security state\n");
  852. } else if (memcmp(nd_cmd->old_pass, sec->passphrase,
  853. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  854. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  855. dev_dbg(dev, "set passphrase: wrong passphrase\n");
  856. } else {
  857. memcpy(sec->passphrase, nd_cmd->new_pass,
  858. ND_INTEL_PASSPHRASE_SIZE);
  859. sec->state |= ND_INTEL_SEC_STATE_ENABLED;
  860. nd_cmd->status = 0;
  861. dev_dbg(dev, "passphrase updated\n");
  862. }
  863. return 0;
  864. }
  865. static int nd_intel_test_cmd_freeze_lock(struct nfit_test *t,
  866. struct nd_intel_freeze_lock *nd_cmd,
  867. unsigned int buf_len, int dimm)
  868. {
  869. struct device *dev = &t->pdev.dev;
  870. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  871. if (!(sec->state & ND_INTEL_SEC_STATE_ENABLED)) {
  872. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  873. dev_dbg(dev, "freeze lock: wrong security state\n");
  874. } else {
  875. sec->state |= ND_INTEL_SEC_STATE_FROZEN;
  876. nd_cmd->status = 0;
  877. dev_dbg(dev, "security frozen\n");
  878. }
  879. return 0;
  880. }
  881. static int nd_intel_test_cmd_disable_pass(struct nfit_test *t,
  882. struct nd_intel_disable_passphrase *nd_cmd,
  883. unsigned int buf_len, int dimm)
  884. {
  885. struct device *dev = &t->pdev.dev;
  886. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  887. if (!(sec->state & ND_INTEL_SEC_STATE_ENABLED) ||
  888. (sec->state & ND_INTEL_SEC_STATE_FROZEN)) {
  889. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  890. dev_dbg(dev, "disable passphrase: wrong security state\n");
  891. } else if (memcmp(nd_cmd->passphrase, sec->passphrase,
  892. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  893. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  894. dev_dbg(dev, "disable passphrase: wrong passphrase\n");
  895. } else {
  896. memset(sec->passphrase, 0, ND_INTEL_PASSPHRASE_SIZE);
  897. sec->state = 0;
  898. dev_dbg(dev, "disable passphrase: done\n");
  899. }
  900. return 0;
  901. }
  902. static int nd_intel_test_cmd_secure_erase(struct nfit_test *t,
  903. struct nd_intel_secure_erase *nd_cmd,
  904. unsigned int buf_len, int dimm)
  905. {
  906. struct device *dev = &t->pdev.dev;
  907. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  908. if (sec->state & ND_INTEL_SEC_STATE_FROZEN) {
  909. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  910. dev_dbg(dev, "secure erase: wrong security state\n");
  911. } else if (memcmp(nd_cmd->passphrase, sec->passphrase,
  912. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  913. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  914. dev_dbg(dev, "secure erase: wrong passphrase\n");
  915. } else {
  916. if (!(sec->state & ND_INTEL_SEC_STATE_ENABLED)
  917. && (memcmp(nd_cmd->passphrase, zero_key,
  918. ND_INTEL_PASSPHRASE_SIZE) != 0)) {
  919. dev_dbg(dev, "invalid zero key\n");
  920. return 0;
  921. }
  922. memset(sec->passphrase, 0, ND_INTEL_PASSPHRASE_SIZE);
  923. memset(sec->master_passphrase, 0, ND_INTEL_PASSPHRASE_SIZE);
  924. sec->state = 0;
  925. sec->ext_state = ND_INTEL_SEC_ESTATE_ENABLED;
  926. dev_dbg(dev, "secure erase: done\n");
  927. }
  928. return 0;
  929. }
  930. static int nd_intel_test_cmd_overwrite(struct nfit_test *t,
  931. struct nd_intel_overwrite *nd_cmd,
  932. unsigned int buf_len, int dimm)
  933. {
  934. struct device *dev = &t->pdev.dev;
  935. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  936. if ((sec->state & ND_INTEL_SEC_STATE_ENABLED) &&
  937. memcmp(nd_cmd->passphrase, sec->passphrase,
  938. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  939. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  940. dev_dbg(dev, "overwrite: wrong passphrase\n");
  941. return 0;
  942. }
  943. sec->old_state = sec->state;
  944. sec->state = ND_INTEL_SEC_STATE_OVERWRITE;
  945. dev_dbg(dev, "overwrite progressing.\n");
  946. sec->overwrite_end_time = get_jiffies_64() + 5 * HZ;
  947. return 0;
  948. }
  949. static int nd_intel_test_cmd_query_overwrite(struct nfit_test *t,
  950. struct nd_intel_query_overwrite *nd_cmd,
  951. unsigned int buf_len, int dimm)
  952. {
  953. struct device *dev = &t->pdev.dev;
  954. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  955. if (!(sec->state & ND_INTEL_SEC_STATE_OVERWRITE)) {
  956. nd_cmd->status = ND_INTEL_STATUS_OQUERY_SEQUENCE_ERR;
  957. return 0;
  958. }
  959. if (time_is_before_jiffies64(sec->overwrite_end_time)) {
  960. sec->overwrite_end_time = 0;
  961. sec->state = sec->old_state;
  962. sec->old_state = 0;
  963. sec->ext_state = ND_INTEL_SEC_ESTATE_ENABLED;
  964. dev_dbg(dev, "overwrite is complete\n");
  965. } else
  966. nd_cmd->status = ND_INTEL_STATUS_OQUERY_INPROGRESS;
  967. return 0;
  968. }
  969. static int nd_intel_test_cmd_master_set_pass(struct nfit_test *t,
  970. struct nd_intel_set_master_passphrase *nd_cmd,
  971. unsigned int buf_len, int dimm)
  972. {
  973. struct device *dev = &t->pdev.dev;
  974. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  975. if (!(sec->ext_state & ND_INTEL_SEC_ESTATE_ENABLED)) {
  976. nd_cmd->status = ND_INTEL_STATUS_NOT_SUPPORTED;
  977. dev_dbg(dev, "master set passphrase: in wrong state\n");
  978. } else if (sec->ext_state & ND_INTEL_SEC_ESTATE_PLIMIT) {
  979. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  980. dev_dbg(dev, "master set passphrase: in wrong security state\n");
  981. } else if (memcmp(nd_cmd->old_pass, sec->master_passphrase,
  982. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  983. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  984. dev_dbg(dev, "master set passphrase: wrong passphrase\n");
  985. } else {
  986. memcpy(sec->master_passphrase, nd_cmd->new_pass,
  987. ND_INTEL_PASSPHRASE_SIZE);
  988. sec->ext_state = ND_INTEL_SEC_ESTATE_ENABLED;
  989. dev_dbg(dev, "master passphrase: updated\n");
  990. }
  991. return 0;
  992. }
  993. static int nd_intel_test_cmd_master_secure_erase(struct nfit_test *t,
  994. struct nd_intel_master_secure_erase *nd_cmd,
  995. unsigned int buf_len, int dimm)
  996. {
  997. struct device *dev = &t->pdev.dev;
  998. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  999. if (!(sec->ext_state & ND_INTEL_SEC_ESTATE_ENABLED)) {
  1000. nd_cmd->status = ND_INTEL_STATUS_NOT_SUPPORTED;
  1001. dev_dbg(dev, "master secure erase: in wrong state\n");
  1002. } else if (sec->ext_state & ND_INTEL_SEC_ESTATE_PLIMIT) {
  1003. nd_cmd->status = ND_INTEL_STATUS_INVALID_STATE;
  1004. dev_dbg(dev, "master secure erase: in wrong security state\n");
  1005. } else if (memcmp(nd_cmd->passphrase, sec->master_passphrase,
  1006. ND_INTEL_PASSPHRASE_SIZE) != 0) {
  1007. nd_cmd->status = ND_INTEL_STATUS_INVALID_PASS;
  1008. dev_dbg(dev, "master secure erase: wrong passphrase\n");
  1009. } else {
  1010. /* we do not erase master state passphrase ever */
  1011. sec->ext_state = ND_INTEL_SEC_ESTATE_ENABLED;
  1012. memset(sec->passphrase, 0, ND_INTEL_PASSPHRASE_SIZE);
  1013. sec->state = 0;
  1014. dev_dbg(dev, "master secure erase: done\n");
  1015. }
  1016. return 0;
  1017. }
  1018. static unsigned long last_activate;
  1019. static int nvdimm_bus_intel_fw_activate_businfo(struct nfit_test *t,
  1020. struct nd_intel_bus_fw_activate_businfo *nd_cmd,
  1021. unsigned int buf_len)
  1022. {
  1023. int i, armed = 0;
  1024. int state;
  1025. u64 tmo;
  1026. for (i = 0; i < NUM_DCR; i++) {
  1027. struct nfit_test_fw *fw = &t->fw[i];
  1028. if (fw->armed)
  1029. armed++;
  1030. }
  1031. /*
  1032. * Emulate 3 second activation max, and 1 second incremental
  1033. * quiesce time per dimm requiring multiple activates to get all
  1034. * DIMMs updated.
  1035. */
  1036. if (armed)
  1037. state = ND_INTEL_FWA_ARMED;
  1038. else if (!last_activate || time_after(jiffies, last_activate + 3 * HZ))
  1039. state = ND_INTEL_FWA_IDLE;
  1040. else
  1041. state = ND_INTEL_FWA_BUSY;
  1042. tmo = armed * USEC_PER_SEC;
  1043. *nd_cmd = (struct nd_intel_bus_fw_activate_businfo) {
  1044. .capability = ND_INTEL_BUS_FWA_CAP_FWQUIESCE
  1045. | ND_INTEL_BUS_FWA_CAP_OSQUIESCE
  1046. | ND_INTEL_BUS_FWA_CAP_RESET,
  1047. .state = state,
  1048. .activate_tmo = tmo,
  1049. .cpu_quiesce_tmo = tmo,
  1050. .io_quiesce_tmo = tmo,
  1051. .max_quiesce_tmo = 3 * USEC_PER_SEC,
  1052. };
  1053. return 0;
  1054. }
  1055. static int nvdimm_bus_intel_fw_activate(struct nfit_test *t,
  1056. struct nd_intel_bus_fw_activate *nd_cmd,
  1057. unsigned int buf_len)
  1058. {
  1059. struct nd_intel_bus_fw_activate_businfo info;
  1060. u32 status = 0;
  1061. int i;
  1062. nvdimm_bus_intel_fw_activate_businfo(t, &info, sizeof(info));
  1063. if (info.state == ND_INTEL_FWA_BUSY)
  1064. status = ND_INTEL_BUS_FWA_STATUS_BUSY;
  1065. else if (info.activate_tmo > info.max_quiesce_tmo)
  1066. status = ND_INTEL_BUS_FWA_STATUS_TMO;
  1067. else if (info.state == ND_INTEL_FWA_IDLE)
  1068. status = ND_INTEL_BUS_FWA_STATUS_NOARM;
  1069. dev_dbg(&t->pdev.dev, "status: %d\n", status);
  1070. nd_cmd->status = status;
  1071. if (status && status != ND_INTEL_BUS_FWA_STATUS_TMO)
  1072. return 0;
  1073. last_activate = jiffies;
  1074. for (i = 0; i < NUM_DCR; i++) {
  1075. struct nfit_test_fw *fw = &t->fw[i];
  1076. if (!fw->armed)
  1077. continue;
  1078. if (fw->state != FW_STATE_UPDATED)
  1079. fw->missed_activate = true;
  1080. else
  1081. fw->state = FW_STATE_NEW;
  1082. fw->armed = false;
  1083. fw->last_activate = last_activate;
  1084. }
  1085. return 0;
  1086. }
  1087. static int nd_intel_test_cmd_fw_activate_dimminfo(struct nfit_test *t,
  1088. struct nd_intel_fw_activate_dimminfo *nd_cmd,
  1089. unsigned int buf_len, int dimm)
  1090. {
  1091. struct nd_intel_bus_fw_activate_businfo info;
  1092. struct nfit_test_fw *fw = &t->fw[dimm];
  1093. u32 result, state;
  1094. nvdimm_bus_intel_fw_activate_businfo(t, &info, sizeof(info));
  1095. if (info.state == ND_INTEL_FWA_BUSY)
  1096. state = ND_INTEL_FWA_BUSY;
  1097. else if (info.state == ND_INTEL_FWA_IDLE)
  1098. state = ND_INTEL_FWA_IDLE;
  1099. else if (fw->armed)
  1100. state = ND_INTEL_FWA_ARMED;
  1101. else
  1102. state = ND_INTEL_FWA_IDLE;
  1103. result = ND_INTEL_DIMM_FWA_NONE;
  1104. if (last_activate && fw->last_activate == last_activate &&
  1105. state == ND_INTEL_FWA_IDLE) {
  1106. if (fw->missed_activate)
  1107. result = ND_INTEL_DIMM_FWA_NOTSTAGED;
  1108. else
  1109. result = ND_INTEL_DIMM_FWA_SUCCESS;
  1110. }
  1111. *nd_cmd = (struct nd_intel_fw_activate_dimminfo) {
  1112. .result = result,
  1113. .state = state,
  1114. };
  1115. return 0;
  1116. }
  1117. static int nd_intel_test_cmd_fw_activate_arm(struct nfit_test *t,
  1118. struct nd_intel_fw_activate_arm *nd_cmd,
  1119. unsigned int buf_len, int dimm)
  1120. {
  1121. struct nfit_test_fw *fw = &t->fw[dimm];
  1122. fw->armed = nd_cmd->activate_arm == ND_INTEL_DIMM_FWA_ARM;
  1123. nd_cmd->status = 0;
  1124. return 0;
  1125. }
  1126. static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
  1127. {
  1128. int i;
  1129. /* lookup per-dimm data */
  1130. for (i = 0; i < ARRAY_SIZE(handle); i++)
  1131. if (__to_nfit_memdev(nfit_mem)->device_handle == handle[i])
  1132. break;
  1133. if (i >= ARRAY_SIZE(handle))
  1134. return -ENXIO;
  1135. return i;
  1136. }
  1137. static void nfit_ctl_dbg(struct acpi_nfit_desc *acpi_desc,
  1138. struct nvdimm *nvdimm, unsigned int cmd, void *buf,
  1139. unsigned int len)
  1140. {
  1141. struct nfit_test *t = container_of(acpi_desc, typeof(*t), acpi_desc);
  1142. unsigned int func = cmd;
  1143. unsigned int family = 0;
  1144. if (cmd == ND_CMD_CALL) {
  1145. struct nd_cmd_pkg *pkg = buf;
  1146. len = pkg->nd_size_in;
  1147. family = pkg->nd_family;
  1148. buf = pkg->nd_payload;
  1149. func = pkg->nd_command;
  1150. }
  1151. dev_dbg(&t->pdev.dev, "%s family: %d cmd: %d: func: %d input length: %d\n",
  1152. nvdimm ? nvdimm_name(nvdimm) : "bus", family, cmd, func,
  1153. len);
  1154. print_hex_dump_debug("nvdimm in ", DUMP_PREFIX_OFFSET, 16, 4,
  1155. buf, min(len, 256u), true);
  1156. }
  1157. static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
  1158. struct nvdimm *nvdimm, unsigned int cmd, void *buf,
  1159. unsigned int buf_len, int *cmd_rc)
  1160. {
  1161. struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc);
  1162. struct nfit_test *t = container_of(acpi_desc, typeof(*t), acpi_desc);
  1163. unsigned int func = cmd;
  1164. int i, rc = 0, __cmd_rc;
  1165. if (!cmd_rc)
  1166. cmd_rc = &__cmd_rc;
  1167. *cmd_rc = 0;
  1168. nfit_ctl_dbg(acpi_desc, nvdimm, cmd, buf, buf_len);
  1169. if (nvdimm) {
  1170. struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
  1171. unsigned long cmd_mask = nvdimm_cmd_mask(nvdimm);
  1172. if (!nfit_mem)
  1173. return -ENOTTY;
  1174. if (cmd == ND_CMD_CALL) {
  1175. struct nd_cmd_pkg *call_pkg = buf;
  1176. buf_len = call_pkg->nd_size_in + call_pkg->nd_size_out;
  1177. buf = (void *) call_pkg->nd_payload;
  1178. func = call_pkg->nd_command;
  1179. if (call_pkg->nd_family != nfit_mem->family)
  1180. return -ENOTTY;
  1181. i = get_dimm(nfit_mem, func);
  1182. if (i < 0)
  1183. return i;
  1184. if (i >= NUM_DCR) {
  1185. dev_WARN_ONCE(&t->pdev.dev, 1,
  1186. "ND_CMD_CALL only valid for nfit_test0\n");
  1187. return -EINVAL;
  1188. }
  1189. switch (func) {
  1190. case NVDIMM_INTEL_GET_SECURITY_STATE:
  1191. rc = nd_intel_test_cmd_security_status(t,
  1192. buf, buf_len, i);
  1193. break;
  1194. case NVDIMM_INTEL_UNLOCK_UNIT:
  1195. rc = nd_intel_test_cmd_unlock_unit(t,
  1196. buf, buf_len, i);
  1197. break;
  1198. case NVDIMM_INTEL_SET_PASSPHRASE:
  1199. rc = nd_intel_test_cmd_set_pass(t,
  1200. buf, buf_len, i);
  1201. break;
  1202. case NVDIMM_INTEL_DISABLE_PASSPHRASE:
  1203. rc = nd_intel_test_cmd_disable_pass(t,
  1204. buf, buf_len, i);
  1205. break;
  1206. case NVDIMM_INTEL_FREEZE_LOCK:
  1207. rc = nd_intel_test_cmd_freeze_lock(t,
  1208. buf, buf_len, i);
  1209. break;
  1210. case NVDIMM_INTEL_SECURE_ERASE:
  1211. rc = nd_intel_test_cmd_secure_erase(t,
  1212. buf, buf_len, i);
  1213. break;
  1214. case NVDIMM_INTEL_OVERWRITE:
  1215. rc = nd_intel_test_cmd_overwrite(t,
  1216. buf, buf_len, i);
  1217. break;
  1218. case NVDIMM_INTEL_QUERY_OVERWRITE:
  1219. rc = nd_intel_test_cmd_query_overwrite(t,
  1220. buf, buf_len, i);
  1221. break;
  1222. case NVDIMM_INTEL_SET_MASTER_PASSPHRASE:
  1223. rc = nd_intel_test_cmd_master_set_pass(t,
  1224. buf, buf_len, i);
  1225. break;
  1226. case NVDIMM_INTEL_MASTER_SECURE_ERASE:
  1227. rc = nd_intel_test_cmd_master_secure_erase(t,
  1228. buf, buf_len, i);
  1229. break;
  1230. case NVDIMM_INTEL_FW_ACTIVATE_DIMMINFO:
  1231. rc = nd_intel_test_cmd_fw_activate_dimminfo(
  1232. t, buf, buf_len, i);
  1233. break;
  1234. case NVDIMM_INTEL_FW_ACTIVATE_ARM:
  1235. rc = nd_intel_test_cmd_fw_activate_arm(
  1236. t, buf, buf_len, i);
  1237. break;
  1238. case ND_INTEL_ENABLE_LSS_STATUS:
  1239. rc = nd_intel_test_cmd_set_lss_status(t,
  1240. buf, buf_len);
  1241. break;
  1242. case ND_INTEL_FW_GET_INFO:
  1243. rc = nd_intel_test_get_fw_info(t, buf,
  1244. buf_len, i);
  1245. break;
  1246. case ND_INTEL_FW_START_UPDATE:
  1247. rc = nd_intel_test_start_update(t, buf,
  1248. buf_len, i);
  1249. break;
  1250. case ND_INTEL_FW_SEND_DATA:
  1251. rc = nd_intel_test_send_data(t, buf,
  1252. buf_len, i);
  1253. break;
  1254. case ND_INTEL_FW_FINISH_UPDATE:
  1255. rc = nd_intel_test_finish_fw(t, buf,
  1256. buf_len, i);
  1257. break;
  1258. case ND_INTEL_FW_FINISH_QUERY:
  1259. rc = nd_intel_test_finish_query(t, buf,
  1260. buf_len, i);
  1261. break;
  1262. case ND_INTEL_SMART:
  1263. rc = nfit_test_cmd_smart(buf, buf_len,
  1264. &t->smart[i]);
  1265. break;
  1266. case ND_INTEL_SMART_THRESHOLD:
  1267. rc = nfit_test_cmd_smart_threshold(buf,
  1268. buf_len,
  1269. &t->smart_threshold[i]);
  1270. break;
  1271. case ND_INTEL_SMART_SET_THRESHOLD:
  1272. rc = nfit_test_cmd_smart_set_threshold(buf,
  1273. buf_len,
  1274. &t->smart_threshold[i],
  1275. &t->smart[i],
  1276. &t->pdev.dev, t->dimm_dev[i]);
  1277. break;
  1278. case ND_INTEL_SMART_INJECT:
  1279. rc = nfit_test_cmd_smart_inject(buf,
  1280. buf_len,
  1281. &t->smart_threshold[i],
  1282. &t->smart[i],
  1283. &t->pdev.dev, t->dimm_dev[i]);
  1284. break;
  1285. default:
  1286. return -ENOTTY;
  1287. }
  1288. return override_return_code(i, func, rc);
  1289. }
  1290. if (!test_bit(cmd, &cmd_mask)
  1291. || !test_bit(func, &nfit_mem->dsm_mask))
  1292. return -ENOTTY;
  1293. i = get_dimm(nfit_mem, func);
  1294. if (i < 0)
  1295. return i;
  1296. switch (func) {
  1297. case ND_CMD_GET_CONFIG_SIZE:
  1298. rc = nfit_test_cmd_get_config_size(buf, buf_len);
  1299. break;
  1300. case ND_CMD_GET_CONFIG_DATA:
  1301. rc = nfit_test_cmd_get_config_data(buf, buf_len,
  1302. t->label[i - t->dcr_idx]);
  1303. break;
  1304. case ND_CMD_SET_CONFIG_DATA:
  1305. rc = nfit_test_cmd_set_config_data(buf, buf_len,
  1306. t->label[i - t->dcr_idx]);
  1307. break;
  1308. default:
  1309. return -ENOTTY;
  1310. }
  1311. return override_return_code(i, func, rc);
  1312. } else {
  1313. struct ars_state *ars_state = &t->ars_state;
  1314. struct nd_cmd_pkg *call_pkg = buf;
  1315. if (!nd_desc)
  1316. return -ENOTTY;
  1317. if (cmd == ND_CMD_CALL && call_pkg->nd_family
  1318. == NVDIMM_BUS_FAMILY_NFIT) {
  1319. func = call_pkg->nd_command;
  1320. buf_len = call_pkg->nd_size_in + call_pkg->nd_size_out;
  1321. buf = (void *) call_pkg->nd_payload;
  1322. switch (func) {
  1323. case NFIT_CMD_TRANSLATE_SPA:
  1324. rc = nfit_test_cmd_translate_spa(
  1325. acpi_desc->nvdimm_bus, buf, buf_len);
  1326. return rc;
  1327. case NFIT_CMD_ARS_INJECT_SET:
  1328. rc = nfit_test_cmd_ars_error_inject(t, buf,
  1329. buf_len);
  1330. return rc;
  1331. case NFIT_CMD_ARS_INJECT_CLEAR:
  1332. rc = nfit_test_cmd_ars_inject_clear(t, buf,
  1333. buf_len);
  1334. return rc;
  1335. case NFIT_CMD_ARS_INJECT_GET:
  1336. rc = nfit_test_cmd_ars_inject_status(t, buf,
  1337. buf_len);
  1338. return rc;
  1339. default:
  1340. return -ENOTTY;
  1341. }
  1342. } else if (cmd == ND_CMD_CALL && call_pkg->nd_family
  1343. == NVDIMM_BUS_FAMILY_INTEL) {
  1344. func = call_pkg->nd_command;
  1345. buf_len = call_pkg->nd_size_in + call_pkg->nd_size_out;
  1346. buf = (void *) call_pkg->nd_payload;
  1347. switch (func) {
  1348. case NVDIMM_BUS_INTEL_FW_ACTIVATE_BUSINFO:
  1349. rc = nvdimm_bus_intel_fw_activate_businfo(t,
  1350. buf, buf_len);
  1351. return rc;
  1352. case NVDIMM_BUS_INTEL_FW_ACTIVATE:
  1353. rc = nvdimm_bus_intel_fw_activate(t, buf,
  1354. buf_len);
  1355. return rc;
  1356. default:
  1357. return -ENOTTY;
  1358. }
  1359. } else if (cmd == ND_CMD_CALL)
  1360. return -ENOTTY;
  1361. if (!nd_desc || !test_bit(cmd, &nd_desc->cmd_mask))
  1362. return -ENOTTY;
  1363. switch (func) {
  1364. case ND_CMD_ARS_CAP:
  1365. rc = nfit_test_cmd_ars_cap(buf, buf_len);
  1366. break;
  1367. case ND_CMD_ARS_START:
  1368. rc = nfit_test_cmd_ars_start(t, ars_state, buf,
  1369. buf_len, cmd_rc);
  1370. break;
  1371. case ND_CMD_ARS_STATUS:
  1372. rc = nfit_test_cmd_ars_status(ars_state, buf, buf_len,
  1373. cmd_rc);
  1374. break;
  1375. case ND_CMD_CLEAR_ERROR:
  1376. rc = nfit_test_cmd_clear_error(t, buf, buf_len, cmd_rc);
  1377. break;
  1378. default:
  1379. return -ENOTTY;
  1380. }
  1381. }
  1382. return rc;
  1383. }
  1384. static DEFINE_SPINLOCK(nfit_test_lock);
  1385. static struct nfit_test *instances[NUM_NFITS];
  1386. static void release_nfit_res(void *data)
  1387. {
  1388. struct nfit_test_resource *nfit_res = data;
  1389. spin_lock(&nfit_test_lock);
  1390. list_del(&nfit_res->list);
  1391. spin_unlock(&nfit_test_lock);
  1392. if (resource_size(&nfit_res->res) >= DIMM_SIZE)
  1393. gen_pool_free(nfit_pool, nfit_res->res.start,
  1394. resource_size(&nfit_res->res));
  1395. vfree(nfit_res->buf);
  1396. kfree(nfit_res);
  1397. }
  1398. static void *__test_alloc(struct nfit_test *t, size_t size, dma_addr_t *dma,
  1399. void *buf)
  1400. {
  1401. struct device *dev = &t->pdev.dev;
  1402. struct nfit_test_resource *nfit_res = kzalloc(sizeof(*nfit_res),
  1403. GFP_KERNEL);
  1404. int rc;
  1405. if (!buf || !nfit_res || !*dma)
  1406. goto err;
  1407. rc = devm_add_action(dev, release_nfit_res, nfit_res);
  1408. if (rc)
  1409. goto err;
  1410. INIT_LIST_HEAD(&nfit_res->list);
  1411. memset(buf, 0, size);
  1412. nfit_res->dev = dev;
  1413. nfit_res->buf = buf;
  1414. nfit_res->res.start = *dma;
  1415. nfit_res->res.end = *dma + size - 1;
  1416. nfit_res->res.name = "NFIT";
  1417. spin_lock_init(&nfit_res->lock);
  1418. INIT_LIST_HEAD(&nfit_res->requests);
  1419. spin_lock(&nfit_test_lock);
  1420. list_add(&nfit_res->list, &t->resources);
  1421. spin_unlock(&nfit_test_lock);
  1422. return nfit_res->buf;
  1423. err:
  1424. if (*dma && size >= DIMM_SIZE)
  1425. gen_pool_free(nfit_pool, *dma, size);
  1426. if (buf)
  1427. vfree(buf);
  1428. kfree(nfit_res);
  1429. return NULL;
  1430. }
  1431. static void *test_alloc(struct nfit_test *t, size_t size, dma_addr_t *dma)
  1432. {
  1433. struct genpool_data_align data = {
  1434. .align = SZ_128M,
  1435. };
  1436. void *buf = vmalloc(size);
  1437. if (size >= DIMM_SIZE)
  1438. *dma = gen_pool_alloc_algo(nfit_pool, size,
  1439. gen_pool_first_fit_align, &data);
  1440. else
  1441. *dma = (unsigned long) buf;
  1442. return __test_alloc(t, size, dma, buf);
  1443. }
  1444. static struct nfit_test_resource *nfit_test_lookup(resource_size_t addr)
  1445. {
  1446. int i;
  1447. for (i = 0; i < ARRAY_SIZE(instances); i++) {
  1448. struct nfit_test_resource *n, *nfit_res = NULL;
  1449. struct nfit_test *t = instances[i];
  1450. if (!t)
  1451. continue;
  1452. spin_lock(&nfit_test_lock);
  1453. list_for_each_entry(n, &t->resources, list) {
  1454. if (addr >= n->res.start && (addr < n->res.start
  1455. + resource_size(&n->res))) {
  1456. nfit_res = n;
  1457. break;
  1458. } else if (addr >= (unsigned long) n->buf
  1459. && (addr < (unsigned long) n->buf
  1460. + resource_size(&n->res))) {
  1461. nfit_res = n;
  1462. break;
  1463. }
  1464. }
  1465. spin_unlock(&nfit_test_lock);
  1466. if (nfit_res)
  1467. return nfit_res;
  1468. }
  1469. return NULL;
  1470. }
  1471. static int ars_state_init(struct device *dev, struct ars_state *ars_state)
  1472. {
  1473. /* for testing, only store up to n records that fit within 4k */
  1474. ars_state->ars_status = devm_kzalloc(dev,
  1475. sizeof(struct nd_cmd_ars_status) + SZ_4K, GFP_KERNEL);
  1476. if (!ars_state->ars_status)
  1477. return -ENOMEM;
  1478. spin_lock_init(&ars_state->lock);
  1479. return 0;
  1480. }
  1481. static void put_dimms(void *data)
  1482. {
  1483. struct nfit_test *t = data;
  1484. int i;
  1485. for (i = 0; i < t->num_dcr; i++)
  1486. if (t->dimm_dev[i])
  1487. device_unregister(t->dimm_dev[i]);
  1488. }
  1489. static const struct class nfit_test_dimm = {
  1490. .name = "nfit_test_dimm",
  1491. };
  1492. static int dimm_name_to_id(struct device *dev)
  1493. {
  1494. int dimm;
  1495. if (sscanf(dev_name(dev), "test_dimm%d", &dimm) != 1)
  1496. return -ENXIO;
  1497. return dimm;
  1498. }
  1499. static ssize_t handle_show(struct device *dev, struct device_attribute *attr,
  1500. char *buf)
  1501. {
  1502. int dimm = dimm_name_to_id(dev);
  1503. if (dimm < 0)
  1504. return dimm;
  1505. return sprintf(buf, "%#x\n", handle[dimm]);
  1506. }
  1507. DEVICE_ATTR_RO(handle);
  1508. static ssize_t fail_cmd_show(struct device *dev, struct device_attribute *attr,
  1509. char *buf)
  1510. {
  1511. int dimm = dimm_name_to_id(dev);
  1512. if (dimm < 0)
  1513. return dimm;
  1514. return sprintf(buf, "%#lx\n", dimm_fail_cmd_flags[dimm]);
  1515. }
  1516. static ssize_t fail_cmd_store(struct device *dev, struct device_attribute *attr,
  1517. const char *buf, size_t size)
  1518. {
  1519. int dimm = dimm_name_to_id(dev);
  1520. unsigned long val;
  1521. ssize_t rc;
  1522. if (dimm < 0)
  1523. return dimm;
  1524. rc = kstrtol(buf, 0, &val);
  1525. if (rc)
  1526. return rc;
  1527. dimm_fail_cmd_flags[dimm] = val;
  1528. return size;
  1529. }
  1530. static DEVICE_ATTR_RW(fail_cmd);
  1531. static ssize_t fail_cmd_code_show(struct device *dev, struct device_attribute *attr,
  1532. char *buf)
  1533. {
  1534. int dimm = dimm_name_to_id(dev);
  1535. if (dimm < 0)
  1536. return dimm;
  1537. return sprintf(buf, "%d\n", dimm_fail_cmd_code[dimm]);
  1538. }
  1539. static ssize_t fail_cmd_code_store(struct device *dev, struct device_attribute *attr,
  1540. const char *buf, size_t size)
  1541. {
  1542. int dimm = dimm_name_to_id(dev);
  1543. unsigned long val;
  1544. ssize_t rc;
  1545. if (dimm < 0)
  1546. return dimm;
  1547. rc = kstrtol(buf, 0, &val);
  1548. if (rc)
  1549. return rc;
  1550. dimm_fail_cmd_code[dimm] = val;
  1551. return size;
  1552. }
  1553. static DEVICE_ATTR_RW(fail_cmd_code);
  1554. static ssize_t lock_dimm_store(struct device *dev,
  1555. struct device_attribute *attr, const char *buf, size_t size)
  1556. {
  1557. int dimm = dimm_name_to_id(dev);
  1558. struct nfit_test_sec *sec = &dimm_sec_info[dimm];
  1559. sec->state = ND_INTEL_SEC_STATE_ENABLED | ND_INTEL_SEC_STATE_LOCKED;
  1560. return size;
  1561. }
  1562. static DEVICE_ATTR_WO(lock_dimm);
  1563. static struct attribute *nfit_test_dimm_attributes[] = {
  1564. &dev_attr_fail_cmd.attr,
  1565. &dev_attr_fail_cmd_code.attr,
  1566. &dev_attr_handle.attr,
  1567. &dev_attr_lock_dimm.attr,
  1568. NULL,
  1569. };
  1570. static struct attribute_group nfit_test_dimm_attribute_group = {
  1571. .attrs = nfit_test_dimm_attributes,
  1572. };
  1573. static const struct attribute_group *nfit_test_dimm_attribute_groups[] = {
  1574. &nfit_test_dimm_attribute_group,
  1575. NULL,
  1576. };
  1577. static int nfit_test_dimm_init(struct nfit_test *t)
  1578. {
  1579. int i;
  1580. if (devm_add_action_or_reset(&t->pdev.dev, put_dimms, t))
  1581. return -ENOMEM;
  1582. for (i = 0; i < t->num_dcr; i++) {
  1583. t->dimm_dev[i] = device_create_with_groups(&nfit_test_dimm,
  1584. &t->pdev.dev, 0, NULL,
  1585. nfit_test_dimm_attribute_groups,
  1586. "test_dimm%d", i + t->dcr_idx);
  1587. if (!t->dimm_dev[i])
  1588. return -ENOMEM;
  1589. }
  1590. return 0;
  1591. }
  1592. static void nfit_security_init(struct nfit_test *t)
  1593. {
  1594. int i;
  1595. for (i = 0; i < t->num_dcr; i++) {
  1596. struct nfit_test_sec *sec = &dimm_sec_info[i];
  1597. sec->ext_state = ND_INTEL_SEC_ESTATE_ENABLED;
  1598. }
  1599. }
  1600. static void smart_init(struct nfit_test *t)
  1601. {
  1602. int i;
  1603. const struct nd_intel_smart_threshold smart_t_data = {
  1604. .alarm_control = ND_INTEL_SMART_SPARE_TRIP
  1605. | ND_INTEL_SMART_TEMP_TRIP,
  1606. .media_temperature = 40 * 16,
  1607. .ctrl_temperature = 30 * 16,
  1608. .spares = 5,
  1609. };
  1610. for (i = 0; i < t->num_dcr; i++) {
  1611. memcpy(&t->smart[i], &smart_def, sizeof(smart_def));
  1612. memcpy(&t->smart_threshold[i], &smart_t_data,
  1613. sizeof(smart_t_data));
  1614. }
  1615. }
  1616. static size_t sizeof_spa(struct acpi_nfit_system_address *spa)
  1617. {
  1618. /* until spa location cookie support is added... */
  1619. return sizeof(*spa) - 8;
  1620. }
  1621. static int nfit_test0_alloc(struct nfit_test *t)
  1622. {
  1623. struct acpi_nfit_system_address *spa = NULL;
  1624. struct acpi_nfit_flush_address *flush;
  1625. size_t nfit_size = sizeof_spa(spa) * NUM_SPA
  1626. + sizeof(struct acpi_nfit_memory_map) * NUM_MEM
  1627. + sizeof(struct acpi_nfit_control_region) * NUM_DCR
  1628. + offsetof(struct acpi_nfit_control_region,
  1629. window_size) * NUM_DCR
  1630. + sizeof(struct acpi_nfit_data_region) * NUM_BDW
  1631. + struct_size(flush, hint_address, NUM_HINTS) * NUM_DCR
  1632. + sizeof(struct acpi_nfit_capabilities);
  1633. int i;
  1634. t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma);
  1635. if (!t->nfit_buf)
  1636. return -ENOMEM;
  1637. t->nfit_size = nfit_size;
  1638. t->spa_set[0] = test_alloc(t, SPA0_SIZE, &t->spa_set_dma[0]);
  1639. if (!t->spa_set[0])
  1640. return -ENOMEM;
  1641. t->spa_set[1] = test_alloc(t, SPA1_SIZE, &t->spa_set_dma[1]);
  1642. if (!t->spa_set[1])
  1643. return -ENOMEM;
  1644. t->spa_set[2] = test_alloc(t, SPA0_SIZE, &t->spa_set_dma[2]);
  1645. if (!t->spa_set[2])
  1646. return -ENOMEM;
  1647. for (i = 0; i < t->num_dcr; i++) {
  1648. t->dimm[i] = test_alloc(t, DIMM_SIZE, &t->dimm_dma[i]);
  1649. if (!t->dimm[i])
  1650. return -ENOMEM;
  1651. t->label[i] = test_alloc(t, LABEL_SIZE, &t->label_dma[i]);
  1652. if (!t->label[i])
  1653. return -ENOMEM;
  1654. sprintf(t->label[i], "label%d", i);
  1655. t->flush[i] = test_alloc(t, max(PAGE_SIZE,
  1656. sizeof(u64) * NUM_HINTS),
  1657. &t->flush_dma[i]);
  1658. if (!t->flush[i])
  1659. return -ENOMEM;
  1660. }
  1661. for (i = 0; i < t->num_dcr; i++) {
  1662. t->dcr[i] = test_alloc(t, LABEL_SIZE, &t->dcr_dma[i]);
  1663. if (!t->dcr[i])
  1664. return -ENOMEM;
  1665. }
  1666. t->_fit = test_alloc(t, sizeof(union acpi_object **), &t->_fit_dma);
  1667. if (!t->_fit)
  1668. return -ENOMEM;
  1669. if (nfit_test_dimm_init(t))
  1670. return -ENOMEM;
  1671. smart_init(t);
  1672. nfit_security_init(t);
  1673. return ars_state_init(&t->pdev.dev, &t->ars_state);
  1674. }
  1675. static int nfit_test1_alloc(struct nfit_test *t)
  1676. {
  1677. struct acpi_nfit_system_address *spa = NULL;
  1678. size_t nfit_size = sizeof_spa(spa) * 2
  1679. + sizeof(struct acpi_nfit_memory_map) * 2
  1680. + offsetof(struct acpi_nfit_control_region, window_size) * 2;
  1681. int i;
  1682. t->nfit_buf = test_alloc(t, nfit_size, &t->nfit_dma);
  1683. if (!t->nfit_buf)
  1684. return -ENOMEM;
  1685. t->nfit_size = nfit_size;
  1686. t->spa_set[0] = test_alloc(t, SPA2_SIZE, &t->spa_set_dma[0]);
  1687. if (!t->spa_set[0])
  1688. return -ENOMEM;
  1689. for (i = 0; i < t->num_dcr; i++) {
  1690. t->label[i] = test_alloc(t, LABEL_SIZE, &t->label_dma[i]);
  1691. if (!t->label[i])
  1692. return -ENOMEM;
  1693. sprintf(t->label[i], "label%d", i);
  1694. }
  1695. t->spa_set[1] = test_alloc(t, SPA_VCD_SIZE, &t->spa_set_dma[1]);
  1696. if (!t->spa_set[1])
  1697. return -ENOMEM;
  1698. if (nfit_test_dimm_init(t))
  1699. return -ENOMEM;
  1700. smart_init(t);
  1701. return ars_state_init(&t->pdev.dev, &t->ars_state);
  1702. }
  1703. static void dcr_common_init(struct acpi_nfit_control_region *dcr)
  1704. {
  1705. dcr->vendor_id = 0xabcd;
  1706. dcr->device_id = 0;
  1707. dcr->revision_id = 1;
  1708. dcr->valid_fields = 1;
  1709. dcr->manufacturing_location = 0xa;
  1710. dcr->manufacturing_date = cpu_to_be16(2016);
  1711. }
  1712. static void nfit_test0_setup(struct nfit_test *t)
  1713. {
  1714. const int flush_hint_size = sizeof(struct acpi_nfit_flush_address)
  1715. + (sizeof(u64) * NUM_HINTS);
  1716. struct acpi_nfit_desc *acpi_desc;
  1717. struct acpi_nfit_memory_map *memdev;
  1718. void *nfit_buf = t->nfit_buf;
  1719. struct acpi_nfit_system_address *spa;
  1720. struct acpi_nfit_control_region *dcr;
  1721. struct acpi_nfit_data_region *bdw;
  1722. struct acpi_nfit_flush_address *flush;
  1723. struct acpi_nfit_capabilities *pcap;
  1724. unsigned int offset = 0, i;
  1725. unsigned long *acpi_mask;
  1726. /*
  1727. * spa0 (interleave first half of dimm0 and dimm1, note storage
  1728. * does not actually alias the related block-data-window
  1729. * regions)
  1730. */
  1731. spa = nfit_buf;
  1732. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1733. spa->header.length = sizeof_spa(spa);
  1734. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
  1735. spa->range_index = 0+1;
  1736. spa->address = t->spa_set_dma[0];
  1737. spa->length = SPA0_SIZE;
  1738. offset += spa->header.length;
  1739. /*
  1740. * spa1 (interleave last half of the 4 DIMMS, note storage
  1741. * does not actually alias the related block-data-window
  1742. * regions)
  1743. */
  1744. spa = nfit_buf + offset;
  1745. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1746. spa->header.length = sizeof_spa(spa);
  1747. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
  1748. spa->range_index = 1+1;
  1749. spa->address = t->spa_set_dma[1];
  1750. spa->length = SPA1_SIZE;
  1751. offset += spa->header.length;
  1752. /* spa2 (dcr0) dimm0 */
  1753. spa = nfit_buf + offset;
  1754. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1755. spa->header.length = sizeof_spa(spa);
  1756. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
  1757. spa->range_index = 2+1;
  1758. spa->address = t->dcr_dma[0];
  1759. spa->length = DCR_SIZE;
  1760. offset += spa->header.length;
  1761. /* spa3 (dcr1) dimm1 */
  1762. spa = nfit_buf + offset;
  1763. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1764. spa->header.length = sizeof_spa(spa);
  1765. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
  1766. spa->range_index = 3+1;
  1767. spa->address = t->dcr_dma[1];
  1768. spa->length = DCR_SIZE;
  1769. offset += spa->header.length;
  1770. /* spa4 (dcr2) dimm2 */
  1771. spa = nfit_buf + offset;
  1772. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1773. spa->header.length = sizeof_spa(spa);
  1774. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
  1775. spa->range_index = 4+1;
  1776. spa->address = t->dcr_dma[2];
  1777. spa->length = DCR_SIZE;
  1778. offset += spa->header.length;
  1779. /* spa5 (dcr3) dimm3 */
  1780. spa = nfit_buf + offset;
  1781. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1782. spa->header.length = sizeof_spa(spa);
  1783. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
  1784. spa->range_index = 5+1;
  1785. spa->address = t->dcr_dma[3];
  1786. spa->length = DCR_SIZE;
  1787. offset += spa->header.length;
  1788. /* spa6 (bdw for dcr0) dimm0 */
  1789. spa = nfit_buf + offset;
  1790. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1791. spa->header.length = sizeof_spa(spa);
  1792. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
  1793. spa->range_index = 6+1;
  1794. spa->address = t->dimm_dma[0];
  1795. spa->length = DIMM_SIZE;
  1796. offset += spa->header.length;
  1797. /* spa7 (bdw for dcr1) dimm1 */
  1798. spa = nfit_buf + offset;
  1799. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1800. spa->header.length = sizeof_spa(spa);
  1801. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
  1802. spa->range_index = 7+1;
  1803. spa->address = t->dimm_dma[1];
  1804. spa->length = DIMM_SIZE;
  1805. offset += spa->header.length;
  1806. /* spa8 (bdw for dcr2) dimm2 */
  1807. spa = nfit_buf + offset;
  1808. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1809. spa->header.length = sizeof_spa(spa);
  1810. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
  1811. spa->range_index = 8+1;
  1812. spa->address = t->dimm_dma[2];
  1813. spa->length = DIMM_SIZE;
  1814. offset += spa->header.length;
  1815. /* spa9 (bdw for dcr3) dimm3 */
  1816. spa = nfit_buf + offset;
  1817. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  1818. spa->header.length = sizeof_spa(spa);
  1819. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
  1820. spa->range_index = 9+1;
  1821. spa->address = t->dimm_dma[3];
  1822. spa->length = DIMM_SIZE;
  1823. offset += spa->header.length;
  1824. /* mem-region0 (spa0, dimm0) */
  1825. memdev = nfit_buf + offset;
  1826. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1827. memdev->header.length = sizeof(*memdev);
  1828. memdev->device_handle = handle[0];
  1829. memdev->physical_id = 0;
  1830. memdev->region_id = 0;
  1831. memdev->range_index = 0+1;
  1832. memdev->region_index = 4+1;
  1833. memdev->region_size = SPA0_SIZE/2;
  1834. memdev->region_offset = 1;
  1835. memdev->address = 0;
  1836. memdev->interleave_index = 0;
  1837. memdev->interleave_ways = 2;
  1838. offset += memdev->header.length;
  1839. /* mem-region1 (spa0, dimm1) */
  1840. memdev = nfit_buf + offset;
  1841. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1842. memdev->header.length = sizeof(*memdev);
  1843. memdev->device_handle = handle[1];
  1844. memdev->physical_id = 1;
  1845. memdev->region_id = 0;
  1846. memdev->range_index = 0+1;
  1847. memdev->region_index = 5+1;
  1848. memdev->region_size = SPA0_SIZE/2;
  1849. memdev->region_offset = (1 << 8);
  1850. memdev->address = 0;
  1851. memdev->interleave_index = 0;
  1852. memdev->interleave_ways = 2;
  1853. memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
  1854. offset += memdev->header.length;
  1855. /* mem-region2 (spa1, dimm0) */
  1856. memdev = nfit_buf + offset;
  1857. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1858. memdev->header.length = sizeof(*memdev);
  1859. memdev->device_handle = handle[0];
  1860. memdev->physical_id = 0;
  1861. memdev->region_id = 1;
  1862. memdev->range_index = 1+1;
  1863. memdev->region_index = 4+1;
  1864. memdev->region_size = SPA1_SIZE/4;
  1865. memdev->region_offset = (1 << 16);
  1866. memdev->address = SPA0_SIZE/2;
  1867. memdev->interleave_index = 0;
  1868. memdev->interleave_ways = 4;
  1869. memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
  1870. offset += memdev->header.length;
  1871. /* mem-region3 (spa1, dimm1) */
  1872. memdev = nfit_buf + offset;
  1873. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1874. memdev->header.length = sizeof(*memdev);
  1875. memdev->device_handle = handle[1];
  1876. memdev->physical_id = 1;
  1877. memdev->region_id = 1;
  1878. memdev->range_index = 1+1;
  1879. memdev->region_index = 5+1;
  1880. memdev->region_size = SPA1_SIZE/4;
  1881. memdev->region_offset = (1 << 24);
  1882. memdev->address = SPA0_SIZE/2;
  1883. memdev->interleave_index = 0;
  1884. memdev->interleave_ways = 4;
  1885. offset += memdev->header.length;
  1886. /* mem-region4 (spa1, dimm2) */
  1887. memdev = nfit_buf + offset;
  1888. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1889. memdev->header.length = sizeof(*memdev);
  1890. memdev->device_handle = handle[2];
  1891. memdev->physical_id = 2;
  1892. memdev->region_id = 0;
  1893. memdev->range_index = 1+1;
  1894. memdev->region_index = 6+1;
  1895. memdev->region_size = SPA1_SIZE/4;
  1896. memdev->region_offset = (1ULL << 32);
  1897. memdev->address = SPA0_SIZE/2;
  1898. memdev->interleave_index = 0;
  1899. memdev->interleave_ways = 4;
  1900. memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
  1901. offset += memdev->header.length;
  1902. /* mem-region5 (spa1, dimm3) */
  1903. memdev = nfit_buf + offset;
  1904. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1905. memdev->header.length = sizeof(*memdev);
  1906. memdev->device_handle = handle[3];
  1907. memdev->physical_id = 3;
  1908. memdev->region_id = 0;
  1909. memdev->range_index = 1+1;
  1910. memdev->region_index = 7+1;
  1911. memdev->region_size = SPA1_SIZE/4;
  1912. memdev->region_offset = (1ULL << 40);
  1913. memdev->address = SPA0_SIZE/2;
  1914. memdev->interleave_index = 0;
  1915. memdev->interleave_ways = 4;
  1916. offset += memdev->header.length;
  1917. /* mem-region6 (spa/dcr0, dimm0) */
  1918. memdev = nfit_buf + offset;
  1919. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1920. memdev->header.length = sizeof(*memdev);
  1921. memdev->device_handle = handle[0];
  1922. memdev->physical_id = 0;
  1923. memdev->region_id = 0;
  1924. memdev->range_index = 2+1;
  1925. memdev->region_index = 0+1;
  1926. memdev->region_size = 0;
  1927. memdev->region_offset = 0;
  1928. memdev->address = 0;
  1929. memdev->interleave_index = 0;
  1930. memdev->interleave_ways = 1;
  1931. offset += memdev->header.length;
  1932. /* mem-region7 (spa/dcr1, dimm1) */
  1933. memdev = nfit_buf + offset;
  1934. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1935. memdev->header.length = sizeof(*memdev);
  1936. memdev->device_handle = handle[1];
  1937. memdev->physical_id = 1;
  1938. memdev->region_id = 0;
  1939. memdev->range_index = 3+1;
  1940. memdev->region_index = 1+1;
  1941. memdev->region_size = 0;
  1942. memdev->region_offset = 0;
  1943. memdev->address = 0;
  1944. memdev->interleave_index = 0;
  1945. memdev->interleave_ways = 1;
  1946. offset += memdev->header.length;
  1947. /* mem-region8 (spa/dcr2, dimm2) */
  1948. memdev = nfit_buf + offset;
  1949. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1950. memdev->header.length = sizeof(*memdev);
  1951. memdev->device_handle = handle[2];
  1952. memdev->physical_id = 2;
  1953. memdev->region_id = 0;
  1954. memdev->range_index = 4+1;
  1955. memdev->region_index = 2+1;
  1956. memdev->region_size = 0;
  1957. memdev->region_offset = 0;
  1958. memdev->address = 0;
  1959. memdev->interleave_index = 0;
  1960. memdev->interleave_ways = 1;
  1961. offset += memdev->header.length;
  1962. /* mem-region9 (spa/dcr3, dimm3) */
  1963. memdev = nfit_buf + offset;
  1964. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1965. memdev->header.length = sizeof(*memdev);
  1966. memdev->device_handle = handle[3];
  1967. memdev->physical_id = 3;
  1968. memdev->region_id = 0;
  1969. memdev->range_index = 5+1;
  1970. memdev->region_index = 3+1;
  1971. memdev->region_size = 0;
  1972. memdev->region_offset = 0;
  1973. memdev->address = 0;
  1974. memdev->interleave_index = 0;
  1975. memdev->interleave_ways = 1;
  1976. offset += memdev->header.length;
  1977. /* mem-region10 (spa/bdw0, dimm0) */
  1978. memdev = nfit_buf + offset;
  1979. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1980. memdev->header.length = sizeof(*memdev);
  1981. memdev->device_handle = handle[0];
  1982. memdev->physical_id = 0;
  1983. memdev->region_id = 0;
  1984. memdev->range_index = 6+1;
  1985. memdev->region_index = 0+1;
  1986. memdev->region_size = 0;
  1987. memdev->region_offset = 0;
  1988. memdev->address = 0;
  1989. memdev->interleave_index = 0;
  1990. memdev->interleave_ways = 1;
  1991. offset += memdev->header.length;
  1992. /* mem-region11 (spa/bdw1, dimm1) */
  1993. memdev = nfit_buf + offset;
  1994. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  1995. memdev->header.length = sizeof(*memdev);
  1996. memdev->device_handle = handle[1];
  1997. memdev->physical_id = 1;
  1998. memdev->region_id = 0;
  1999. memdev->range_index = 7+1;
  2000. memdev->region_index = 1+1;
  2001. memdev->region_size = 0;
  2002. memdev->region_offset = 0;
  2003. memdev->address = 0;
  2004. memdev->interleave_index = 0;
  2005. memdev->interleave_ways = 1;
  2006. offset += memdev->header.length;
  2007. /* mem-region12 (spa/bdw2, dimm2) */
  2008. memdev = nfit_buf + offset;
  2009. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2010. memdev->header.length = sizeof(*memdev);
  2011. memdev->device_handle = handle[2];
  2012. memdev->physical_id = 2;
  2013. memdev->region_id = 0;
  2014. memdev->range_index = 8+1;
  2015. memdev->region_index = 2+1;
  2016. memdev->region_size = 0;
  2017. memdev->region_offset = 0;
  2018. memdev->address = 0;
  2019. memdev->interleave_index = 0;
  2020. memdev->interleave_ways = 1;
  2021. offset += memdev->header.length;
  2022. /* mem-region13 (spa/dcr3, dimm3) */
  2023. memdev = nfit_buf + offset;
  2024. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2025. memdev->header.length = sizeof(*memdev);
  2026. memdev->device_handle = handle[3];
  2027. memdev->physical_id = 3;
  2028. memdev->region_id = 0;
  2029. memdev->range_index = 9+1;
  2030. memdev->region_index = 3+1;
  2031. memdev->region_size = 0;
  2032. memdev->region_offset = 0;
  2033. memdev->address = 0;
  2034. memdev->interleave_index = 0;
  2035. memdev->interleave_ways = 1;
  2036. memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
  2037. offset += memdev->header.length;
  2038. /* dcr-descriptor0: blk */
  2039. dcr = nfit_buf + offset;
  2040. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2041. dcr->header.length = sizeof(*dcr);
  2042. dcr->region_index = 0+1;
  2043. dcr_common_init(dcr);
  2044. dcr->serial_number = ~handle[0];
  2045. dcr->code = NFIT_FIC_BLK;
  2046. dcr->windows = 1;
  2047. dcr->window_size = DCR_SIZE;
  2048. dcr->command_offset = 0;
  2049. dcr->command_size = 8;
  2050. dcr->status_offset = 8;
  2051. dcr->status_size = 4;
  2052. offset += dcr->header.length;
  2053. /* dcr-descriptor1: blk */
  2054. dcr = nfit_buf + offset;
  2055. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2056. dcr->header.length = sizeof(*dcr);
  2057. dcr->region_index = 1+1;
  2058. dcr_common_init(dcr);
  2059. dcr->serial_number = ~handle[1];
  2060. dcr->code = NFIT_FIC_BLK;
  2061. dcr->windows = 1;
  2062. dcr->window_size = DCR_SIZE;
  2063. dcr->command_offset = 0;
  2064. dcr->command_size = 8;
  2065. dcr->status_offset = 8;
  2066. dcr->status_size = 4;
  2067. offset += dcr->header.length;
  2068. /* dcr-descriptor2: blk */
  2069. dcr = nfit_buf + offset;
  2070. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2071. dcr->header.length = sizeof(*dcr);
  2072. dcr->region_index = 2+1;
  2073. dcr_common_init(dcr);
  2074. dcr->serial_number = ~handle[2];
  2075. dcr->code = NFIT_FIC_BLK;
  2076. dcr->windows = 1;
  2077. dcr->window_size = DCR_SIZE;
  2078. dcr->command_offset = 0;
  2079. dcr->command_size = 8;
  2080. dcr->status_offset = 8;
  2081. dcr->status_size = 4;
  2082. offset += dcr->header.length;
  2083. /* dcr-descriptor3: blk */
  2084. dcr = nfit_buf + offset;
  2085. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2086. dcr->header.length = sizeof(*dcr);
  2087. dcr->region_index = 3+1;
  2088. dcr_common_init(dcr);
  2089. dcr->serial_number = ~handle[3];
  2090. dcr->code = NFIT_FIC_BLK;
  2091. dcr->windows = 1;
  2092. dcr->window_size = DCR_SIZE;
  2093. dcr->command_offset = 0;
  2094. dcr->command_size = 8;
  2095. dcr->status_offset = 8;
  2096. dcr->status_size = 4;
  2097. offset += dcr->header.length;
  2098. /* dcr-descriptor0: pmem */
  2099. dcr = nfit_buf + offset;
  2100. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2101. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2102. window_size);
  2103. dcr->region_index = 4+1;
  2104. dcr_common_init(dcr);
  2105. dcr->serial_number = ~handle[0];
  2106. dcr->code = NFIT_FIC_BYTEN;
  2107. dcr->windows = 0;
  2108. offset += dcr->header.length;
  2109. /* dcr-descriptor1: pmem */
  2110. dcr = nfit_buf + offset;
  2111. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2112. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2113. window_size);
  2114. dcr->region_index = 5+1;
  2115. dcr_common_init(dcr);
  2116. dcr->serial_number = ~handle[1];
  2117. dcr->code = NFIT_FIC_BYTEN;
  2118. dcr->windows = 0;
  2119. offset += dcr->header.length;
  2120. /* dcr-descriptor2: pmem */
  2121. dcr = nfit_buf + offset;
  2122. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2123. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2124. window_size);
  2125. dcr->region_index = 6+1;
  2126. dcr_common_init(dcr);
  2127. dcr->serial_number = ~handle[2];
  2128. dcr->code = NFIT_FIC_BYTEN;
  2129. dcr->windows = 0;
  2130. offset += dcr->header.length;
  2131. /* dcr-descriptor3: pmem */
  2132. dcr = nfit_buf + offset;
  2133. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2134. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2135. window_size);
  2136. dcr->region_index = 7+1;
  2137. dcr_common_init(dcr);
  2138. dcr->serial_number = ~handle[3];
  2139. dcr->code = NFIT_FIC_BYTEN;
  2140. dcr->windows = 0;
  2141. offset += dcr->header.length;
  2142. /* bdw0 (spa/dcr0, dimm0) */
  2143. bdw = nfit_buf + offset;
  2144. bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
  2145. bdw->header.length = sizeof(*bdw);
  2146. bdw->region_index = 0+1;
  2147. bdw->windows = 1;
  2148. bdw->offset = 0;
  2149. bdw->size = BDW_SIZE;
  2150. bdw->capacity = DIMM_SIZE;
  2151. bdw->start_address = 0;
  2152. offset += bdw->header.length;
  2153. /* bdw1 (spa/dcr1, dimm1) */
  2154. bdw = nfit_buf + offset;
  2155. bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
  2156. bdw->header.length = sizeof(*bdw);
  2157. bdw->region_index = 1+1;
  2158. bdw->windows = 1;
  2159. bdw->offset = 0;
  2160. bdw->size = BDW_SIZE;
  2161. bdw->capacity = DIMM_SIZE;
  2162. bdw->start_address = 0;
  2163. offset += bdw->header.length;
  2164. /* bdw2 (spa/dcr2, dimm2) */
  2165. bdw = nfit_buf + offset;
  2166. bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
  2167. bdw->header.length = sizeof(*bdw);
  2168. bdw->region_index = 2+1;
  2169. bdw->windows = 1;
  2170. bdw->offset = 0;
  2171. bdw->size = BDW_SIZE;
  2172. bdw->capacity = DIMM_SIZE;
  2173. bdw->start_address = 0;
  2174. offset += bdw->header.length;
  2175. /* bdw3 (spa/dcr3, dimm3) */
  2176. bdw = nfit_buf + offset;
  2177. bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
  2178. bdw->header.length = sizeof(*bdw);
  2179. bdw->region_index = 3+1;
  2180. bdw->windows = 1;
  2181. bdw->offset = 0;
  2182. bdw->size = BDW_SIZE;
  2183. bdw->capacity = DIMM_SIZE;
  2184. bdw->start_address = 0;
  2185. offset += bdw->header.length;
  2186. /* flush0 (dimm0) */
  2187. flush = nfit_buf + offset;
  2188. flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
  2189. flush->header.length = flush_hint_size;
  2190. flush->device_handle = handle[0];
  2191. flush->hint_count = NUM_HINTS;
  2192. for (i = 0; i < NUM_HINTS; i++)
  2193. flush->hint_address[i] = t->flush_dma[0] + i * sizeof(u64);
  2194. offset += flush->header.length;
  2195. /* flush1 (dimm1) */
  2196. flush = nfit_buf + offset;
  2197. flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
  2198. flush->header.length = flush_hint_size;
  2199. flush->device_handle = handle[1];
  2200. flush->hint_count = NUM_HINTS;
  2201. for (i = 0; i < NUM_HINTS; i++)
  2202. flush->hint_address[i] = t->flush_dma[1] + i * sizeof(u64);
  2203. offset += flush->header.length;
  2204. /* flush2 (dimm2) */
  2205. flush = nfit_buf + offset;
  2206. flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
  2207. flush->header.length = flush_hint_size;
  2208. flush->device_handle = handle[2];
  2209. flush->hint_count = NUM_HINTS;
  2210. for (i = 0; i < NUM_HINTS; i++)
  2211. flush->hint_address[i] = t->flush_dma[2] + i * sizeof(u64);
  2212. offset += flush->header.length;
  2213. /* flush3 (dimm3) */
  2214. flush = nfit_buf + offset;
  2215. flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
  2216. flush->header.length = flush_hint_size;
  2217. flush->device_handle = handle[3];
  2218. flush->hint_count = NUM_HINTS;
  2219. for (i = 0; i < NUM_HINTS; i++)
  2220. flush->hint_address[i] = t->flush_dma[3] + i * sizeof(u64);
  2221. offset += flush->header.length;
  2222. /* platform capabilities */
  2223. pcap = nfit_buf + offset;
  2224. pcap->header.type = ACPI_NFIT_TYPE_CAPABILITIES;
  2225. pcap->header.length = sizeof(*pcap);
  2226. pcap->highest_capability = 1;
  2227. pcap->capabilities = ACPI_NFIT_CAPABILITY_MEM_FLUSH;
  2228. offset += pcap->header.length;
  2229. if (t->setup_hotplug) {
  2230. /* dcr-descriptor4: blk */
  2231. dcr = nfit_buf + offset;
  2232. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2233. dcr->header.length = sizeof(*dcr);
  2234. dcr->region_index = 8+1;
  2235. dcr_common_init(dcr);
  2236. dcr->serial_number = ~handle[4];
  2237. dcr->code = NFIT_FIC_BLK;
  2238. dcr->windows = 1;
  2239. dcr->window_size = DCR_SIZE;
  2240. dcr->command_offset = 0;
  2241. dcr->command_size = 8;
  2242. dcr->status_offset = 8;
  2243. dcr->status_size = 4;
  2244. offset += dcr->header.length;
  2245. /* dcr-descriptor4: pmem */
  2246. dcr = nfit_buf + offset;
  2247. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2248. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2249. window_size);
  2250. dcr->region_index = 9+1;
  2251. dcr_common_init(dcr);
  2252. dcr->serial_number = ~handle[4];
  2253. dcr->code = NFIT_FIC_BYTEN;
  2254. dcr->windows = 0;
  2255. offset += dcr->header.length;
  2256. /* bdw4 (spa/dcr4, dimm4) */
  2257. bdw = nfit_buf + offset;
  2258. bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
  2259. bdw->header.length = sizeof(*bdw);
  2260. bdw->region_index = 8+1;
  2261. bdw->windows = 1;
  2262. bdw->offset = 0;
  2263. bdw->size = BDW_SIZE;
  2264. bdw->capacity = DIMM_SIZE;
  2265. bdw->start_address = 0;
  2266. offset += bdw->header.length;
  2267. /* spa10 (dcr4) dimm4 */
  2268. spa = nfit_buf + offset;
  2269. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  2270. spa->header.length = sizeof_spa(spa);
  2271. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
  2272. spa->range_index = 10+1;
  2273. spa->address = t->dcr_dma[4];
  2274. spa->length = DCR_SIZE;
  2275. offset += spa->header.length;
  2276. /*
  2277. * spa11 (single-dimm interleave for hotplug, note storage
  2278. * does not actually alias the related block-data-window
  2279. * regions)
  2280. */
  2281. spa = nfit_buf + offset;
  2282. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  2283. spa->header.length = sizeof_spa(spa);
  2284. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
  2285. spa->range_index = 11+1;
  2286. spa->address = t->spa_set_dma[2];
  2287. spa->length = SPA0_SIZE;
  2288. offset += spa->header.length;
  2289. /* spa12 (bdw for dcr4) dimm4 */
  2290. spa = nfit_buf + offset;
  2291. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  2292. spa->header.length = sizeof_spa(spa);
  2293. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
  2294. spa->range_index = 12+1;
  2295. spa->address = t->dimm_dma[4];
  2296. spa->length = DIMM_SIZE;
  2297. offset += spa->header.length;
  2298. /* mem-region14 (spa/dcr4, dimm4) */
  2299. memdev = nfit_buf + offset;
  2300. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2301. memdev->header.length = sizeof(*memdev);
  2302. memdev->device_handle = handle[4];
  2303. memdev->physical_id = 4;
  2304. memdev->region_id = 0;
  2305. memdev->range_index = 10+1;
  2306. memdev->region_index = 8+1;
  2307. memdev->region_size = 0;
  2308. memdev->region_offset = 0;
  2309. memdev->address = 0;
  2310. memdev->interleave_index = 0;
  2311. memdev->interleave_ways = 1;
  2312. offset += memdev->header.length;
  2313. /* mem-region15 (spa11, dimm4) */
  2314. memdev = nfit_buf + offset;
  2315. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2316. memdev->header.length = sizeof(*memdev);
  2317. memdev->device_handle = handle[4];
  2318. memdev->physical_id = 4;
  2319. memdev->region_id = 0;
  2320. memdev->range_index = 11+1;
  2321. memdev->region_index = 9+1;
  2322. memdev->region_size = SPA0_SIZE;
  2323. memdev->region_offset = (1ULL << 48);
  2324. memdev->address = 0;
  2325. memdev->interleave_index = 0;
  2326. memdev->interleave_ways = 1;
  2327. memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
  2328. offset += memdev->header.length;
  2329. /* mem-region16 (spa/bdw4, dimm4) */
  2330. memdev = nfit_buf + offset;
  2331. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2332. memdev->header.length = sizeof(*memdev);
  2333. memdev->device_handle = handle[4];
  2334. memdev->physical_id = 4;
  2335. memdev->region_id = 0;
  2336. memdev->range_index = 12+1;
  2337. memdev->region_index = 8+1;
  2338. memdev->region_size = 0;
  2339. memdev->region_offset = 0;
  2340. memdev->address = 0;
  2341. memdev->interleave_index = 0;
  2342. memdev->interleave_ways = 1;
  2343. offset += memdev->header.length;
  2344. /* flush3 (dimm4) */
  2345. flush = nfit_buf + offset;
  2346. flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
  2347. flush->header.length = flush_hint_size;
  2348. flush->device_handle = handle[4];
  2349. flush->hint_count = NUM_HINTS;
  2350. for (i = 0; i < NUM_HINTS; i++)
  2351. flush->hint_address[i] = t->flush_dma[4]
  2352. + i * sizeof(u64);
  2353. offset += flush->header.length;
  2354. /* sanity check to make sure we've filled the buffer */
  2355. WARN_ON(offset != t->nfit_size);
  2356. }
  2357. t->nfit_filled = offset;
  2358. post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0],
  2359. SPA0_SIZE);
  2360. acpi_desc = &t->acpi_desc;
  2361. set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en);
  2362. set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
  2363. set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
  2364. set_bit(ND_INTEL_SMART, &acpi_desc->dimm_cmd_force_en);
  2365. set_bit(ND_INTEL_SMART_THRESHOLD, &acpi_desc->dimm_cmd_force_en);
  2366. set_bit(ND_INTEL_SMART_SET_THRESHOLD, &acpi_desc->dimm_cmd_force_en);
  2367. set_bit(ND_INTEL_SMART_INJECT, &acpi_desc->dimm_cmd_force_en);
  2368. set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
  2369. set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
  2370. set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
  2371. set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
  2372. set_bit(ND_CMD_CALL, &acpi_desc->bus_cmd_force_en);
  2373. set_bit(NFIT_CMD_TRANSLATE_SPA, &acpi_desc->bus_dsm_mask);
  2374. set_bit(NFIT_CMD_ARS_INJECT_SET, &acpi_desc->bus_dsm_mask);
  2375. set_bit(NFIT_CMD_ARS_INJECT_CLEAR, &acpi_desc->bus_dsm_mask);
  2376. set_bit(NFIT_CMD_ARS_INJECT_GET, &acpi_desc->bus_dsm_mask);
  2377. set_bit(ND_INTEL_FW_GET_INFO, &acpi_desc->dimm_cmd_force_en);
  2378. set_bit(ND_INTEL_FW_START_UPDATE, &acpi_desc->dimm_cmd_force_en);
  2379. set_bit(ND_INTEL_FW_SEND_DATA, &acpi_desc->dimm_cmd_force_en);
  2380. set_bit(ND_INTEL_FW_FINISH_UPDATE, &acpi_desc->dimm_cmd_force_en);
  2381. set_bit(ND_INTEL_FW_FINISH_QUERY, &acpi_desc->dimm_cmd_force_en);
  2382. set_bit(ND_INTEL_ENABLE_LSS_STATUS, &acpi_desc->dimm_cmd_force_en);
  2383. set_bit(NVDIMM_INTEL_GET_SECURITY_STATE,
  2384. &acpi_desc->dimm_cmd_force_en);
  2385. set_bit(NVDIMM_INTEL_SET_PASSPHRASE, &acpi_desc->dimm_cmd_force_en);
  2386. set_bit(NVDIMM_INTEL_DISABLE_PASSPHRASE,
  2387. &acpi_desc->dimm_cmd_force_en);
  2388. set_bit(NVDIMM_INTEL_UNLOCK_UNIT, &acpi_desc->dimm_cmd_force_en);
  2389. set_bit(NVDIMM_INTEL_FREEZE_LOCK, &acpi_desc->dimm_cmd_force_en);
  2390. set_bit(NVDIMM_INTEL_SECURE_ERASE, &acpi_desc->dimm_cmd_force_en);
  2391. set_bit(NVDIMM_INTEL_OVERWRITE, &acpi_desc->dimm_cmd_force_en);
  2392. set_bit(NVDIMM_INTEL_QUERY_OVERWRITE, &acpi_desc->dimm_cmd_force_en);
  2393. set_bit(NVDIMM_INTEL_SET_MASTER_PASSPHRASE,
  2394. &acpi_desc->dimm_cmd_force_en);
  2395. set_bit(NVDIMM_INTEL_MASTER_SECURE_ERASE,
  2396. &acpi_desc->dimm_cmd_force_en);
  2397. set_bit(NVDIMM_INTEL_FW_ACTIVATE_DIMMINFO, &acpi_desc->dimm_cmd_force_en);
  2398. set_bit(NVDIMM_INTEL_FW_ACTIVATE_ARM, &acpi_desc->dimm_cmd_force_en);
  2399. acpi_mask = &acpi_desc->family_dsm_mask[NVDIMM_BUS_FAMILY_INTEL];
  2400. set_bit(NVDIMM_BUS_INTEL_FW_ACTIVATE_BUSINFO, acpi_mask);
  2401. set_bit(NVDIMM_BUS_INTEL_FW_ACTIVATE, acpi_mask);
  2402. }
  2403. static void nfit_test1_setup(struct nfit_test *t)
  2404. {
  2405. size_t offset;
  2406. void *nfit_buf = t->nfit_buf;
  2407. struct acpi_nfit_memory_map *memdev;
  2408. struct acpi_nfit_control_region *dcr;
  2409. struct acpi_nfit_system_address *spa;
  2410. struct acpi_nfit_desc *acpi_desc;
  2411. offset = 0;
  2412. /* spa0 (flat range with no bdw aliasing) */
  2413. spa = nfit_buf + offset;
  2414. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  2415. spa->header.length = sizeof_spa(spa);
  2416. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
  2417. spa->range_index = 0+1;
  2418. spa->address = t->spa_set_dma[0];
  2419. spa->length = SPA2_SIZE;
  2420. offset += spa->header.length;
  2421. /* virtual cd region */
  2422. spa = nfit_buf + offset;
  2423. spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
  2424. spa->header.length = sizeof_spa(spa);
  2425. memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_VCD), 16);
  2426. spa->range_index = 0;
  2427. spa->address = t->spa_set_dma[1];
  2428. spa->length = SPA_VCD_SIZE;
  2429. offset += spa->header.length;
  2430. /* mem-region0 (spa0, dimm0) */
  2431. memdev = nfit_buf + offset;
  2432. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2433. memdev->header.length = sizeof(*memdev);
  2434. memdev->device_handle = handle[5];
  2435. memdev->physical_id = 0;
  2436. memdev->region_id = 0;
  2437. memdev->range_index = 0+1;
  2438. memdev->region_index = 0+1;
  2439. memdev->region_size = SPA2_SIZE;
  2440. memdev->region_offset = 0;
  2441. memdev->address = 0;
  2442. memdev->interleave_index = 0;
  2443. memdev->interleave_ways = 1;
  2444. memdev->flags = ACPI_NFIT_MEM_SAVE_FAILED | ACPI_NFIT_MEM_RESTORE_FAILED
  2445. | ACPI_NFIT_MEM_FLUSH_FAILED | ACPI_NFIT_MEM_HEALTH_OBSERVED
  2446. | ACPI_NFIT_MEM_NOT_ARMED;
  2447. offset += memdev->header.length;
  2448. /* dcr-descriptor0 */
  2449. dcr = nfit_buf + offset;
  2450. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2451. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2452. window_size);
  2453. dcr->region_index = 0+1;
  2454. dcr_common_init(dcr);
  2455. dcr->serial_number = ~handle[5];
  2456. dcr->code = NFIT_FIC_BYTE;
  2457. dcr->windows = 0;
  2458. offset += dcr->header.length;
  2459. memdev = nfit_buf + offset;
  2460. memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
  2461. memdev->header.length = sizeof(*memdev);
  2462. memdev->device_handle = handle[6];
  2463. memdev->physical_id = 0;
  2464. memdev->region_id = 0;
  2465. memdev->range_index = 0;
  2466. memdev->region_index = 0+2;
  2467. memdev->region_size = SPA2_SIZE;
  2468. memdev->region_offset = 0;
  2469. memdev->address = 0;
  2470. memdev->interleave_index = 0;
  2471. memdev->interleave_ways = 1;
  2472. memdev->flags = ACPI_NFIT_MEM_MAP_FAILED;
  2473. offset += memdev->header.length;
  2474. /* dcr-descriptor1 */
  2475. dcr = nfit_buf + offset;
  2476. dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
  2477. dcr->header.length = offsetof(struct acpi_nfit_control_region,
  2478. window_size);
  2479. dcr->region_index = 0+2;
  2480. dcr_common_init(dcr);
  2481. dcr->serial_number = ~handle[6];
  2482. dcr->code = NFIT_FIC_BYTE;
  2483. dcr->windows = 0;
  2484. offset += dcr->header.length;
  2485. /* sanity check to make sure we've filled the buffer */
  2486. WARN_ON(offset != t->nfit_size);
  2487. t->nfit_filled = offset;
  2488. post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0],
  2489. SPA2_SIZE);
  2490. acpi_desc = &t->acpi_desc;
  2491. set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
  2492. set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
  2493. set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
  2494. set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
  2495. set_bit(ND_INTEL_ENABLE_LSS_STATUS, &acpi_desc->dimm_cmd_force_en);
  2496. set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en);
  2497. set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
  2498. set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
  2499. }
  2500. static unsigned long nfit_ctl_handle;
  2501. union acpi_object *result;
  2502. static union acpi_object *nfit_test_evaluate_dsm(acpi_handle handle,
  2503. const guid_t *guid, u64 rev, u64 func, union acpi_object *argv4)
  2504. {
  2505. if (handle != &nfit_ctl_handle)
  2506. return ERR_PTR(-ENXIO);
  2507. return result;
  2508. }
  2509. static int setup_result(void *buf, size_t size)
  2510. {
  2511. result = kmalloc(sizeof(union acpi_object) + size, GFP_KERNEL);
  2512. if (!result)
  2513. return -ENOMEM;
  2514. result->package.type = ACPI_TYPE_BUFFER,
  2515. result->buffer.pointer = (void *) (result + 1);
  2516. result->buffer.length = size;
  2517. memcpy(result->buffer.pointer, buf, size);
  2518. memset(buf, 0, size);
  2519. return 0;
  2520. }
  2521. static int nfit_ctl_test(struct device *dev)
  2522. {
  2523. int rc, cmd_rc;
  2524. struct nvdimm *nvdimm;
  2525. struct acpi_device *adev;
  2526. struct nfit_mem *nfit_mem;
  2527. struct nd_ars_record *record;
  2528. struct acpi_nfit_desc *acpi_desc;
  2529. const u64 test_val = 0x0123456789abcdefULL;
  2530. unsigned long mask, cmd_size, offset;
  2531. struct nfit_ctl_test_cmd {
  2532. struct nd_cmd_pkg pkg;
  2533. union {
  2534. struct nd_cmd_get_config_size cfg_size;
  2535. struct nd_cmd_clear_error clear_err;
  2536. struct nd_cmd_ars_status ars_stat;
  2537. struct nd_cmd_ars_cap ars_cap;
  2538. struct nd_intel_bus_fw_activate_businfo fwa_info;
  2539. char buf[sizeof(struct nd_cmd_ars_status)
  2540. + sizeof(struct nd_ars_record)];
  2541. };
  2542. } cmd;
  2543. adev = devm_kzalloc(dev, sizeof(*adev), GFP_KERNEL);
  2544. if (!adev)
  2545. return -ENOMEM;
  2546. *adev = (struct acpi_device) {
  2547. .handle = &nfit_ctl_handle,
  2548. .dev = {
  2549. .init_name = "test-adev",
  2550. },
  2551. };
  2552. acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL);
  2553. if (!acpi_desc)
  2554. return -ENOMEM;
  2555. *acpi_desc = (struct acpi_nfit_desc) {
  2556. .nd_desc = {
  2557. .cmd_mask = 1UL << ND_CMD_ARS_CAP
  2558. | 1UL << ND_CMD_ARS_START
  2559. | 1UL << ND_CMD_ARS_STATUS
  2560. | 1UL << ND_CMD_CLEAR_ERROR
  2561. | 1UL << ND_CMD_CALL,
  2562. .module = THIS_MODULE,
  2563. .provider_name = "ACPI.NFIT",
  2564. .ndctl = acpi_nfit_ctl,
  2565. .bus_family_mask = 1UL << NVDIMM_BUS_FAMILY_NFIT
  2566. | 1UL << NVDIMM_BUS_FAMILY_INTEL,
  2567. },
  2568. .bus_dsm_mask = 1UL << NFIT_CMD_TRANSLATE_SPA
  2569. | 1UL << NFIT_CMD_ARS_INJECT_SET
  2570. | 1UL << NFIT_CMD_ARS_INJECT_CLEAR
  2571. | 1UL << NFIT_CMD_ARS_INJECT_GET,
  2572. .family_dsm_mask[NVDIMM_BUS_FAMILY_INTEL] =
  2573. NVDIMM_BUS_INTEL_FW_ACTIVATE_CMDMASK,
  2574. .dev = &adev->dev,
  2575. };
  2576. nfit_mem = devm_kzalloc(dev, sizeof(*nfit_mem), GFP_KERNEL);
  2577. if (!nfit_mem)
  2578. return -ENOMEM;
  2579. mask = 1UL << ND_CMD_SMART | 1UL << ND_CMD_SMART_THRESHOLD
  2580. | 1UL << ND_CMD_DIMM_FLAGS | 1UL << ND_CMD_GET_CONFIG_SIZE
  2581. | 1UL << ND_CMD_GET_CONFIG_DATA | 1UL << ND_CMD_SET_CONFIG_DATA
  2582. | 1UL << ND_CMD_VENDOR;
  2583. *nfit_mem = (struct nfit_mem) {
  2584. .adev = adev,
  2585. .family = NVDIMM_FAMILY_INTEL,
  2586. .dsm_mask = mask,
  2587. };
  2588. nvdimm = devm_kzalloc(dev, sizeof(*nvdimm), GFP_KERNEL);
  2589. if (!nvdimm)
  2590. return -ENOMEM;
  2591. *nvdimm = (struct nvdimm) {
  2592. .provider_data = nfit_mem,
  2593. .cmd_mask = mask,
  2594. .dev = {
  2595. .init_name = "test-dimm",
  2596. },
  2597. };
  2598. /* basic checkout of a typical 'get config size' command */
  2599. cmd_size = sizeof(cmd.cfg_size);
  2600. cmd.cfg_size = (struct nd_cmd_get_config_size) {
  2601. .status = 0,
  2602. .config_size = SZ_128K,
  2603. .max_xfer = SZ_4K,
  2604. };
  2605. rc = setup_result(cmd.buf, cmd_size);
  2606. if (rc)
  2607. return rc;
  2608. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, nvdimm, ND_CMD_GET_CONFIG_SIZE,
  2609. cmd.buf, cmd_size, &cmd_rc);
  2610. if (rc < 0 || cmd_rc || cmd.cfg_size.status != 0
  2611. || cmd.cfg_size.config_size != SZ_128K
  2612. || cmd.cfg_size.max_xfer != SZ_4K) {
  2613. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2614. __func__, __LINE__, rc, cmd_rc);
  2615. return -EIO;
  2616. }
  2617. /* test ars_status with zero output */
  2618. cmd_size = offsetof(struct nd_cmd_ars_status, address);
  2619. cmd.ars_stat = (struct nd_cmd_ars_status) {
  2620. .out_length = 0,
  2621. };
  2622. rc = setup_result(cmd.buf, cmd_size);
  2623. if (rc)
  2624. return rc;
  2625. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
  2626. cmd.buf, cmd_size, &cmd_rc);
  2627. if (rc < 0 || cmd_rc) {
  2628. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2629. __func__, __LINE__, rc, cmd_rc);
  2630. return -EIO;
  2631. }
  2632. /* test ars_cap with benign extended status */
  2633. cmd_size = sizeof(cmd.ars_cap);
  2634. cmd.ars_cap = (struct nd_cmd_ars_cap) {
  2635. .status = ND_ARS_PERSISTENT << 16,
  2636. };
  2637. offset = offsetof(struct nd_cmd_ars_cap, status);
  2638. rc = setup_result(cmd.buf + offset, cmd_size - offset);
  2639. if (rc)
  2640. return rc;
  2641. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_CAP,
  2642. cmd.buf, cmd_size, &cmd_rc);
  2643. if (rc < 0 || cmd_rc) {
  2644. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2645. __func__, __LINE__, rc, cmd_rc);
  2646. return -EIO;
  2647. }
  2648. /* test ars_status with 'status' trimmed from 'out_length' */
  2649. cmd_size = sizeof(cmd.ars_stat) + sizeof(struct nd_ars_record);
  2650. cmd.ars_stat = (struct nd_cmd_ars_status) {
  2651. .out_length = cmd_size - 4,
  2652. };
  2653. record = &cmd.ars_stat.records[0];
  2654. *record = (struct nd_ars_record) {
  2655. .length = test_val,
  2656. };
  2657. rc = setup_result(cmd.buf, cmd_size);
  2658. if (rc)
  2659. return rc;
  2660. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
  2661. cmd.buf, cmd_size, &cmd_rc);
  2662. if (rc < 0 || cmd_rc || record->length != test_val) {
  2663. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2664. __func__, __LINE__, rc, cmd_rc);
  2665. return -EIO;
  2666. }
  2667. /* test ars_status with 'Output (Size)' including 'status' */
  2668. cmd_size = sizeof(cmd.ars_stat) + sizeof(struct nd_ars_record);
  2669. cmd.ars_stat = (struct nd_cmd_ars_status) {
  2670. .out_length = cmd_size,
  2671. };
  2672. record = &cmd.ars_stat.records[0];
  2673. *record = (struct nd_ars_record) {
  2674. .length = test_val,
  2675. };
  2676. rc = setup_result(cmd.buf, cmd_size);
  2677. if (rc)
  2678. return rc;
  2679. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
  2680. cmd.buf, cmd_size, &cmd_rc);
  2681. if (rc < 0 || cmd_rc || record->length != test_val) {
  2682. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2683. __func__, __LINE__, rc, cmd_rc);
  2684. return -EIO;
  2685. }
  2686. /* test extended status for get_config_size results in failure */
  2687. cmd_size = sizeof(cmd.cfg_size);
  2688. cmd.cfg_size = (struct nd_cmd_get_config_size) {
  2689. .status = 1 << 16,
  2690. };
  2691. rc = setup_result(cmd.buf, cmd_size);
  2692. if (rc)
  2693. return rc;
  2694. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, nvdimm, ND_CMD_GET_CONFIG_SIZE,
  2695. cmd.buf, cmd_size, &cmd_rc);
  2696. if (rc < 0 || cmd_rc >= 0) {
  2697. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2698. __func__, __LINE__, rc, cmd_rc);
  2699. return -EIO;
  2700. }
  2701. /* test clear error */
  2702. cmd_size = sizeof(cmd.clear_err);
  2703. cmd.clear_err = (struct nd_cmd_clear_error) {
  2704. .length = 512,
  2705. .cleared = 512,
  2706. };
  2707. rc = setup_result(cmd.buf, cmd_size);
  2708. if (rc)
  2709. return rc;
  2710. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_CLEAR_ERROR,
  2711. cmd.buf, cmd_size, &cmd_rc);
  2712. if (rc < 0 || cmd_rc) {
  2713. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2714. __func__, __LINE__, rc, cmd_rc);
  2715. return -EIO;
  2716. }
  2717. /* test firmware activate bus info */
  2718. cmd_size = sizeof(cmd.fwa_info);
  2719. cmd = (struct nfit_ctl_test_cmd) {
  2720. .pkg = {
  2721. .nd_command = NVDIMM_BUS_INTEL_FW_ACTIVATE_BUSINFO,
  2722. .nd_family = NVDIMM_BUS_FAMILY_INTEL,
  2723. .nd_size_out = cmd_size,
  2724. .nd_fw_size = cmd_size,
  2725. },
  2726. .fwa_info = {
  2727. .state = ND_INTEL_FWA_IDLE,
  2728. .capability = ND_INTEL_BUS_FWA_CAP_FWQUIESCE
  2729. | ND_INTEL_BUS_FWA_CAP_OSQUIESCE,
  2730. .activate_tmo = 1,
  2731. .cpu_quiesce_tmo = 1,
  2732. .io_quiesce_tmo = 1,
  2733. .max_quiesce_tmo = 1,
  2734. },
  2735. };
  2736. rc = setup_result(cmd.buf, cmd_size);
  2737. if (rc)
  2738. return rc;
  2739. rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_CALL,
  2740. &cmd, sizeof(cmd.pkg) + cmd_size, &cmd_rc);
  2741. if (rc < 0 || cmd_rc) {
  2742. dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
  2743. __func__, __LINE__, rc, cmd_rc);
  2744. return -EIO;
  2745. }
  2746. return 0;
  2747. }
  2748. static int nfit_test_probe(struct platform_device *pdev)
  2749. {
  2750. struct nvdimm_bus_descriptor *nd_desc;
  2751. struct acpi_nfit_desc *acpi_desc;
  2752. struct device *dev = &pdev->dev;
  2753. struct nfit_test *nfit_test;
  2754. struct nfit_mem *nfit_mem;
  2755. union acpi_object *obj;
  2756. int rc;
  2757. if (strcmp(dev_name(&pdev->dev), "nfit_test.0") == 0) {
  2758. rc = nfit_ctl_test(&pdev->dev);
  2759. if (rc)
  2760. return rc;
  2761. }
  2762. nfit_test = to_nfit_test(&pdev->dev);
  2763. /* common alloc */
  2764. if (nfit_test->num_dcr) {
  2765. int num = nfit_test->num_dcr;
  2766. nfit_test->dimm = devm_kcalloc(dev, num, sizeof(void *),
  2767. GFP_KERNEL);
  2768. nfit_test->dimm_dma = devm_kcalloc(dev, num, sizeof(dma_addr_t),
  2769. GFP_KERNEL);
  2770. nfit_test->flush = devm_kcalloc(dev, num, sizeof(void *),
  2771. GFP_KERNEL);
  2772. nfit_test->flush_dma = devm_kcalloc(dev, num, sizeof(dma_addr_t),
  2773. GFP_KERNEL);
  2774. nfit_test->label = devm_kcalloc(dev, num, sizeof(void *),
  2775. GFP_KERNEL);
  2776. nfit_test->label_dma = devm_kcalloc(dev, num,
  2777. sizeof(dma_addr_t), GFP_KERNEL);
  2778. nfit_test->dcr = devm_kcalloc(dev, num,
  2779. sizeof(struct nfit_test_dcr *), GFP_KERNEL);
  2780. nfit_test->dcr_dma = devm_kcalloc(dev, num,
  2781. sizeof(dma_addr_t), GFP_KERNEL);
  2782. nfit_test->smart = devm_kcalloc(dev, num,
  2783. sizeof(struct nd_intel_smart), GFP_KERNEL);
  2784. nfit_test->smart_threshold = devm_kcalloc(dev, num,
  2785. sizeof(struct nd_intel_smart_threshold),
  2786. GFP_KERNEL);
  2787. nfit_test->fw = devm_kcalloc(dev, num,
  2788. sizeof(struct nfit_test_fw), GFP_KERNEL);
  2789. if (nfit_test->dimm && nfit_test->dimm_dma && nfit_test->label
  2790. && nfit_test->label_dma && nfit_test->dcr
  2791. && nfit_test->dcr_dma && nfit_test->flush
  2792. && nfit_test->flush_dma
  2793. && nfit_test->fw)
  2794. /* pass */;
  2795. else
  2796. return -ENOMEM;
  2797. }
  2798. if (nfit_test->num_pm) {
  2799. int num = nfit_test->num_pm;
  2800. nfit_test->spa_set = devm_kcalloc(dev, num, sizeof(void *),
  2801. GFP_KERNEL);
  2802. nfit_test->spa_set_dma = devm_kcalloc(dev, num,
  2803. sizeof(dma_addr_t), GFP_KERNEL);
  2804. if (nfit_test->spa_set && nfit_test->spa_set_dma)
  2805. /* pass */;
  2806. else
  2807. return -ENOMEM;
  2808. }
  2809. /* per-nfit specific alloc */
  2810. if (nfit_test->alloc(nfit_test))
  2811. return -ENOMEM;
  2812. nfit_test->setup(nfit_test);
  2813. acpi_desc = &nfit_test->acpi_desc;
  2814. acpi_nfit_desc_init(acpi_desc, &pdev->dev);
  2815. nd_desc = &acpi_desc->nd_desc;
  2816. nd_desc->provider_name = NULL;
  2817. nd_desc->module = THIS_MODULE;
  2818. nd_desc->ndctl = nfit_test_ctl;
  2819. rc = acpi_nfit_init(acpi_desc, nfit_test->nfit_buf,
  2820. nfit_test->nfit_filled);
  2821. if (rc)
  2822. return rc;
  2823. rc = devm_add_action_or_reset(&pdev->dev, acpi_nfit_shutdown, acpi_desc);
  2824. if (rc)
  2825. return rc;
  2826. if (nfit_test->setup != nfit_test0_setup)
  2827. return 0;
  2828. nfit_test->setup_hotplug = 1;
  2829. nfit_test->setup(nfit_test);
  2830. obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  2831. if (!obj)
  2832. return -ENOMEM;
  2833. obj->type = ACPI_TYPE_BUFFER;
  2834. obj->buffer.length = nfit_test->nfit_size;
  2835. obj->buffer.pointer = nfit_test->nfit_buf;
  2836. *(nfit_test->_fit) = obj;
  2837. __acpi_nfit_notify(&pdev->dev, nfit_test, 0x80);
  2838. /* associate dimm devices with nfit_mem data for notification testing */
  2839. mutex_lock(&acpi_desc->init_mutex);
  2840. list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) {
  2841. u32 nfit_handle = __to_nfit_memdev(nfit_mem)->device_handle;
  2842. int i;
  2843. for (i = 0; i < ARRAY_SIZE(handle); i++)
  2844. if (nfit_handle == handle[i])
  2845. dev_set_drvdata(nfit_test->dimm_dev[i],
  2846. nfit_mem);
  2847. }
  2848. mutex_unlock(&acpi_desc->init_mutex);
  2849. return 0;
  2850. }
  2851. static void nfit_test_release(struct device *dev)
  2852. {
  2853. struct nfit_test *nfit_test = to_nfit_test(dev);
  2854. kfree(nfit_test);
  2855. }
  2856. static const struct platform_device_id nfit_test_id[] = {
  2857. { KBUILD_MODNAME },
  2858. { },
  2859. };
  2860. static struct platform_driver nfit_test_driver = {
  2861. .probe = nfit_test_probe,
  2862. .driver = {
  2863. .name = KBUILD_MODNAME,
  2864. },
  2865. .id_table = nfit_test_id,
  2866. };
  2867. static __init int nfit_test_init(void)
  2868. {
  2869. int rc, i;
  2870. pmem_test();
  2871. libnvdimm_test();
  2872. acpi_nfit_test();
  2873. device_dax_test();
  2874. dax_pmem_test();
  2875. nfit_test_setup(nfit_test_lookup, nfit_test_evaluate_dsm);
  2876. nfit_wq = create_singlethread_workqueue("nfit");
  2877. if (!nfit_wq)
  2878. return -ENOMEM;
  2879. rc = class_register(&nfit_test_dimm);
  2880. if (rc)
  2881. goto err_register;
  2882. nfit_pool = gen_pool_create(ilog2(SZ_4M), NUMA_NO_NODE);
  2883. if (!nfit_pool) {
  2884. rc = -ENOMEM;
  2885. goto err_register;
  2886. }
  2887. if (gen_pool_add(nfit_pool, SZ_4G, SZ_4G, NUMA_NO_NODE)) {
  2888. rc = -ENOMEM;
  2889. goto err_register;
  2890. }
  2891. for (i = 0; i < NUM_NFITS; i++) {
  2892. struct nfit_test *nfit_test;
  2893. struct platform_device *pdev;
  2894. nfit_test = kzalloc(sizeof(*nfit_test), GFP_KERNEL);
  2895. if (!nfit_test) {
  2896. rc = -ENOMEM;
  2897. goto err_register;
  2898. }
  2899. INIT_LIST_HEAD(&nfit_test->resources);
  2900. badrange_init(&nfit_test->badrange);
  2901. switch (i) {
  2902. case 0:
  2903. nfit_test->num_pm = NUM_PM;
  2904. nfit_test->dcr_idx = 0;
  2905. nfit_test->num_dcr = NUM_DCR;
  2906. nfit_test->alloc = nfit_test0_alloc;
  2907. nfit_test->setup = nfit_test0_setup;
  2908. break;
  2909. case 1:
  2910. nfit_test->num_pm = 2;
  2911. nfit_test->dcr_idx = NUM_DCR;
  2912. nfit_test->num_dcr = 2;
  2913. nfit_test->alloc = nfit_test1_alloc;
  2914. nfit_test->setup = nfit_test1_setup;
  2915. break;
  2916. default:
  2917. rc = -EINVAL;
  2918. goto err_register;
  2919. }
  2920. pdev = &nfit_test->pdev;
  2921. pdev->name = KBUILD_MODNAME;
  2922. pdev->id = i;
  2923. pdev->dev.release = nfit_test_release;
  2924. rc = platform_device_register(pdev);
  2925. if (rc) {
  2926. put_device(&pdev->dev);
  2927. goto err_register;
  2928. }
  2929. get_device(&pdev->dev);
  2930. rc = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
  2931. if (rc)
  2932. goto err_register;
  2933. instances[i] = nfit_test;
  2934. INIT_WORK(&nfit_test->work, uc_error_notify);
  2935. }
  2936. rc = platform_driver_register(&nfit_test_driver);
  2937. if (rc)
  2938. goto err_register;
  2939. return 0;
  2940. err_register:
  2941. if (nfit_pool)
  2942. gen_pool_destroy(nfit_pool);
  2943. destroy_workqueue(nfit_wq);
  2944. for (i = 0; i < NUM_NFITS; i++)
  2945. if (instances[i])
  2946. platform_device_unregister(&instances[i]->pdev);
  2947. nfit_test_teardown();
  2948. for (i = 0; i < NUM_NFITS; i++)
  2949. if (instances[i])
  2950. put_device(&instances[i]->pdev.dev);
  2951. return rc;
  2952. }
  2953. static __exit void nfit_test_exit(void)
  2954. {
  2955. int i;
  2956. destroy_workqueue(nfit_wq);
  2957. for (i = 0; i < NUM_NFITS; i++)
  2958. platform_device_unregister(&instances[i]->pdev);
  2959. platform_driver_unregister(&nfit_test_driver);
  2960. nfit_test_teardown();
  2961. gen_pool_destroy(nfit_pool);
  2962. for (i = 0; i < NUM_NFITS; i++)
  2963. put_device(&instances[i]->pdev.dev);
  2964. class_unregister(&nfit_test_dimm);
  2965. }
  2966. module_init(nfit_test_init);
  2967. module_exit(nfit_test_exit);
  2968. MODULE_DESCRIPTION("Test ACPI NFIT devices");
  2969. MODULE_LICENSE("GPL v2");
  2970. MODULE_AUTHOR("Intel Corporation");