ipl.c 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ipl/reipl/dump support for Linux on s390.
  4. *
  5. * Copyright IBM Corp. 2005, 2012
  6. * Author(s): Michael Holzheu <holzheu@de.ibm.com>
  7. * Volker Sameske <sameske@de.ibm.com>
  8. */
  9. #include <linux/types.h>
  10. #include <linux/export.h>
  11. #include <linux/init.h>
  12. #include <linux/device.h>
  13. #include <linux/delay.h>
  14. #include <linux/kstrtox.h>
  15. #include <linux/panic_notifier.h>
  16. #include <linux/reboot.h>
  17. #include <linux/ctype.h>
  18. #include <linux/fs.h>
  19. #include <linux/gfp.h>
  20. #include <linux/crash_dump.h>
  21. #include <linux/debug_locks.h>
  22. #include <linux/vmalloc.h>
  23. #include <asm/asm-extable.h>
  24. #include <asm/diag.h>
  25. #include <asm/ipl.h>
  26. #include <asm/smp.h>
  27. #include <asm/setup.h>
  28. #include <asm/cpcmd.h>
  29. #include <asm/ebcdic.h>
  30. #include <asm/sclp.h>
  31. #include <asm/checksum.h>
  32. #include <asm/debug.h>
  33. #include <asm/abs_lowcore.h>
  34. #include <asm/os_info.h>
  35. #include <asm/sections.h>
  36. #include <asm/boot_data.h>
  37. #include "entry.h"
  38. #define IPL_PARM_BLOCK_VERSION 0
  39. #define IPL_UNKNOWN_STR "unknown"
  40. #define IPL_CCW_STR "ccw"
  41. #define IPL_ECKD_STR "eckd"
  42. #define IPL_ECKD_DUMP_STR "eckd_dump"
  43. #define IPL_FCP_STR "fcp"
  44. #define IPL_FCP_DUMP_STR "fcp_dump"
  45. #define IPL_NVME_STR "nvme"
  46. #define IPL_NVME_DUMP_STR "nvme_dump"
  47. #define IPL_NSS_STR "nss"
  48. #define DUMP_CCW_STR "ccw"
  49. #define DUMP_ECKD_STR "eckd"
  50. #define DUMP_FCP_STR "fcp"
  51. #define DUMP_NVME_STR "nvme"
  52. #define DUMP_NONE_STR "none"
  53. /*
  54. * Four shutdown trigger types are supported:
  55. * - panic
  56. * - halt
  57. * - power off
  58. * - reipl
  59. * - restart
  60. */
  61. #define ON_PANIC_STR "on_panic"
  62. #define ON_HALT_STR "on_halt"
  63. #define ON_POFF_STR "on_poff"
  64. #define ON_REIPL_STR "on_reboot"
  65. #define ON_RESTART_STR "on_restart"
  66. struct shutdown_action;
  67. struct shutdown_trigger {
  68. char *name;
  69. struct shutdown_action *action;
  70. };
  71. /*
  72. * The following shutdown action types are supported:
  73. */
  74. #define SHUTDOWN_ACTION_IPL_STR "ipl"
  75. #define SHUTDOWN_ACTION_REIPL_STR "reipl"
  76. #define SHUTDOWN_ACTION_DUMP_STR "dump"
  77. #define SHUTDOWN_ACTION_VMCMD_STR "vmcmd"
  78. #define SHUTDOWN_ACTION_STOP_STR "stop"
  79. #define SHUTDOWN_ACTION_DUMP_REIPL_STR "dump_reipl"
  80. struct shutdown_action {
  81. char *name;
  82. void (*fn) (struct shutdown_trigger *trigger);
  83. int (*init) (void);
  84. int init_rc;
  85. };
  86. static char *ipl_type_str(enum ipl_type type)
  87. {
  88. switch (type) {
  89. case IPL_TYPE_CCW:
  90. return IPL_CCW_STR;
  91. case IPL_TYPE_ECKD:
  92. return IPL_ECKD_STR;
  93. case IPL_TYPE_ECKD_DUMP:
  94. return IPL_ECKD_DUMP_STR;
  95. case IPL_TYPE_FCP:
  96. return IPL_FCP_STR;
  97. case IPL_TYPE_FCP_DUMP:
  98. return IPL_FCP_DUMP_STR;
  99. case IPL_TYPE_NSS:
  100. return IPL_NSS_STR;
  101. case IPL_TYPE_NVME:
  102. return IPL_NVME_STR;
  103. case IPL_TYPE_NVME_DUMP:
  104. return IPL_NVME_DUMP_STR;
  105. case IPL_TYPE_UNKNOWN:
  106. default:
  107. return IPL_UNKNOWN_STR;
  108. }
  109. }
  110. enum dump_type {
  111. DUMP_TYPE_NONE = 1,
  112. DUMP_TYPE_CCW = 2,
  113. DUMP_TYPE_FCP = 4,
  114. DUMP_TYPE_NVME = 8,
  115. DUMP_TYPE_ECKD = 16,
  116. };
  117. static char *dump_type_str(enum dump_type type)
  118. {
  119. switch (type) {
  120. case DUMP_TYPE_NONE:
  121. return DUMP_NONE_STR;
  122. case DUMP_TYPE_CCW:
  123. return DUMP_CCW_STR;
  124. case DUMP_TYPE_ECKD:
  125. return DUMP_ECKD_STR;
  126. case DUMP_TYPE_FCP:
  127. return DUMP_FCP_STR;
  128. case DUMP_TYPE_NVME:
  129. return DUMP_NVME_STR;
  130. default:
  131. return NULL;
  132. }
  133. }
  134. int __bootdata_preserved(ipl_block_valid);
  135. struct ipl_parameter_block __bootdata_preserved(ipl_block);
  136. int __bootdata_preserved(ipl_secure_flag);
  137. unsigned long __bootdata_preserved(ipl_cert_list_addr);
  138. unsigned long __bootdata_preserved(ipl_cert_list_size);
  139. unsigned long __bootdata(early_ipl_comp_list_addr);
  140. unsigned long __bootdata(early_ipl_comp_list_size);
  141. static int reipl_capabilities = IPL_TYPE_UNKNOWN;
  142. static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN;
  143. static struct ipl_parameter_block *reipl_block_fcp;
  144. static struct ipl_parameter_block *reipl_block_nvme;
  145. static struct ipl_parameter_block *reipl_block_ccw;
  146. static struct ipl_parameter_block *reipl_block_eckd;
  147. static struct ipl_parameter_block *reipl_block_nss;
  148. static struct ipl_parameter_block *reipl_block_actual;
  149. static int dump_capabilities = DUMP_TYPE_NONE;
  150. static enum dump_type dump_type = DUMP_TYPE_NONE;
  151. static struct ipl_parameter_block *dump_block_fcp;
  152. static struct ipl_parameter_block *dump_block_nvme;
  153. static struct ipl_parameter_block *dump_block_ccw;
  154. static struct ipl_parameter_block *dump_block_eckd;
  155. static struct sclp_ipl_info sclp_ipl_info;
  156. static bool reipl_nvme_clear;
  157. static bool reipl_fcp_clear;
  158. static bool reipl_ccw_clear;
  159. static bool reipl_eckd_clear;
  160. static unsigned long os_info_flags;
  161. static inline int __diag308(unsigned long subcode, unsigned long addr)
  162. {
  163. union register_pair r1;
  164. r1.even = addr;
  165. r1.odd = 0;
  166. asm volatile(
  167. " diag %[r1],%[subcode],0x308\n"
  168. "0: nopr %%r7\n"
  169. EX_TABLE(0b,0b)
  170. : [r1] "+&d" (r1.pair)
  171. : [subcode] "d" (subcode)
  172. : "cc", "memory");
  173. return r1.odd;
  174. }
  175. int diag308(unsigned long subcode, void *addr)
  176. {
  177. diag_stat_inc(DIAG_STAT_X308);
  178. return __diag308(subcode, addr ? virt_to_phys(addr) : 0);
  179. }
  180. EXPORT_SYMBOL_GPL(diag308);
  181. /* SYSFS */
  182. #define IPL_ATTR_SHOW_FN(_prefix, _name, _format, args...) \
  183. static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
  184. struct kobj_attribute *attr, \
  185. char *page) \
  186. { \
  187. return scnprintf(page, PAGE_SIZE, _format, ##args); \
  188. }
  189. #define IPL_ATTR_CCW_STORE_FN(_prefix, _name, _ipl_blk) \
  190. static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
  191. struct kobj_attribute *attr, \
  192. const char *buf, size_t len) \
  193. { \
  194. unsigned long long ssid, devno; \
  195. \
  196. if (sscanf(buf, "0.%llx.%llx\n", &ssid, &devno) != 2) \
  197. return -EINVAL; \
  198. \
  199. if (ssid > __MAX_SSID || devno > __MAX_SUBCHANNEL) \
  200. return -EINVAL; \
  201. \
  202. _ipl_blk.ssid = ssid; \
  203. _ipl_blk.devno = devno; \
  204. return len; \
  205. }
  206. #define DEFINE_IPL_CCW_ATTR_RW(_prefix, _name, _ipl_blk) \
  207. IPL_ATTR_SHOW_FN(_prefix, _name, "0.%x.%04x\n", \
  208. _ipl_blk.ssid, _ipl_blk.devno); \
  209. IPL_ATTR_CCW_STORE_FN(_prefix, _name, _ipl_blk); \
  210. static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
  211. __ATTR(_name, 0644, \
  212. sys_##_prefix##_##_name##_show, \
  213. sys_##_prefix##_##_name##_store) \
  214. #define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \
  215. IPL_ATTR_SHOW_FN(_prefix, _name, _format, _value) \
  216. static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
  217. __ATTR(_name, 0444, sys_##_prefix##_##_name##_show, NULL)
  218. #define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \
  219. IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, (unsigned long long) _value) \
  220. static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
  221. struct kobj_attribute *attr, \
  222. const char *buf, size_t len) \
  223. { \
  224. unsigned long long value; \
  225. if (sscanf(buf, _fmt_in, &value) != 1) \
  226. return -EINVAL; \
  227. _value = value; \
  228. return len; \
  229. } \
  230. static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
  231. __ATTR(_name, 0644, \
  232. sys_##_prefix##_##_name##_show, \
  233. sys_##_prefix##_##_name##_store)
  234. #define DEFINE_IPL_ATTR_STR_RW(_prefix, _name, _fmt_out, _fmt_in, _value)\
  235. IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value) \
  236. static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
  237. struct kobj_attribute *attr, \
  238. const char *buf, size_t len) \
  239. { \
  240. if (len >= sizeof(_value)) \
  241. return -E2BIG; \
  242. len = strscpy(_value, buf, sizeof(_value)); \
  243. if ((ssize_t)len < 0) \
  244. return len; \
  245. strim(_value); \
  246. return len; \
  247. } \
  248. static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
  249. __ATTR(_name, 0644, \
  250. sys_##_prefix##_##_name##_show, \
  251. sys_##_prefix##_##_name##_store)
  252. #define IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block) \
  253. static ssize_t sys_##_prefix##_scp_data_show(struct file *filp, \
  254. struct kobject *kobj, \
  255. struct bin_attribute *attr, \
  256. char *buf, loff_t off, \
  257. size_t count) \
  258. { \
  259. size_t size = _ipl_block.scp_data_len; \
  260. void *scp_data = _ipl_block.scp_data; \
  261. \
  262. return memory_read_from_buffer(buf, count, &off, \
  263. scp_data, size); \
  264. }
  265. #define IPL_ATTR_SCP_DATA_STORE_FN(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len)\
  266. static ssize_t sys_##_prefix##_scp_data_store(struct file *filp, \
  267. struct kobject *kobj, \
  268. struct bin_attribute *attr, \
  269. char *buf, loff_t off, \
  270. size_t count) \
  271. { \
  272. size_t scpdata_len = count; \
  273. size_t padding; \
  274. \
  275. if (off) \
  276. return -EINVAL; \
  277. \
  278. memcpy(_ipl_block.scp_data, buf, count); \
  279. if (scpdata_len % 8) { \
  280. padding = 8 - (scpdata_len % 8); \
  281. memset(_ipl_block.scp_data + scpdata_len, \
  282. 0, padding); \
  283. scpdata_len += padding; \
  284. } \
  285. \
  286. _ipl_block_hdr.len = _ipl_bp_len + scpdata_len; \
  287. _ipl_block.len = _ipl_bp0_len + scpdata_len; \
  288. _ipl_block.scp_data_len = scpdata_len; \
  289. \
  290. return count; \
  291. }
  292. #define DEFINE_IPL_ATTR_SCP_DATA_RO(_prefix, _ipl_block, _size) \
  293. IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block) \
  294. static struct bin_attribute sys_##_prefix##_scp_data_attr = \
  295. __BIN_ATTR(scp_data, 0444, sys_##_prefix##_scp_data_show, \
  296. NULL, _size)
  297. #define DEFINE_IPL_ATTR_SCP_DATA_RW(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len, _size)\
  298. IPL_ATTR_SCP_DATA_SHOW_FN(_prefix, _ipl_block) \
  299. IPL_ATTR_SCP_DATA_STORE_FN(_prefix, _ipl_block_hdr, _ipl_block, _ipl_bp_len, _ipl_bp0_len)\
  300. static struct bin_attribute sys_##_prefix##_scp_data_attr = \
  301. __BIN_ATTR(scp_data, 0644, sys_##_prefix##_scp_data_show, \
  302. sys_##_prefix##_scp_data_store, _size)
  303. /*
  304. * ipl section
  305. */
  306. static __init enum ipl_type get_ipl_type(void)
  307. {
  308. if (!ipl_block_valid)
  309. return IPL_TYPE_UNKNOWN;
  310. switch (ipl_block.pb0_hdr.pbt) {
  311. case IPL_PBT_CCW:
  312. return IPL_TYPE_CCW;
  313. case IPL_PBT_FCP:
  314. if (ipl_block.fcp.opt == IPL_PB0_FCP_OPT_DUMP)
  315. return IPL_TYPE_FCP_DUMP;
  316. else
  317. return IPL_TYPE_FCP;
  318. case IPL_PBT_NVME:
  319. if (ipl_block.nvme.opt == IPL_PB0_NVME_OPT_DUMP)
  320. return IPL_TYPE_NVME_DUMP;
  321. else
  322. return IPL_TYPE_NVME;
  323. case IPL_PBT_ECKD:
  324. if (ipl_block.eckd.opt == IPL_PB0_ECKD_OPT_DUMP)
  325. return IPL_TYPE_ECKD_DUMP;
  326. else
  327. return IPL_TYPE_ECKD;
  328. }
  329. return IPL_TYPE_UNKNOWN;
  330. }
  331. struct ipl_info ipl_info;
  332. EXPORT_SYMBOL_GPL(ipl_info);
  333. static ssize_t ipl_type_show(struct kobject *kobj, struct kobj_attribute *attr,
  334. char *page)
  335. {
  336. return sprintf(page, "%s\n", ipl_type_str(ipl_info.type));
  337. }
  338. static struct kobj_attribute sys_ipl_type_attr = __ATTR_RO(ipl_type);
  339. static ssize_t ipl_secure_show(struct kobject *kobj,
  340. struct kobj_attribute *attr, char *page)
  341. {
  342. return sprintf(page, "%i\n", !!ipl_secure_flag);
  343. }
  344. static struct kobj_attribute sys_ipl_secure_attr =
  345. __ATTR(secure, 0444, ipl_secure_show, NULL);
  346. static ssize_t ipl_has_secure_show(struct kobject *kobj,
  347. struct kobj_attribute *attr, char *page)
  348. {
  349. return sprintf(page, "%i\n", !!sclp.has_sipl);
  350. }
  351. static struct kobj_attribute sys_ipl_has_secure_attr =
  352. __ATTR(has_secure, 0444, ipl_has_secure_show, NULL);
  353. static ssize_t ipl_vm_parm_show(struct kobject *kobj,
  354. struct kobj_attribute *attr, char *page)
  355. {
  356. char parm[DIAG308_VMPARM_SIZE + 1] = {};
  357. if (ipl_block_valid && (ipl_block.pb0_hdr.pbt == IPL_PBT_CCW))
  358. ipl_block_get_ascii_vmparm(parm, sizeof(parm), &ipl_block);
  359. return sprintf(page, "%s\n", parm);
  360. }
  361. static struct kobj_attribute sys_ipl_vm_parm_attr =
  362. __ATTR(parm, 0444, ipl_vm_parm_show, NULL);
  363. static ssize_t sys_ipl_device_show(struct kobject *kobj,
  364. struct kobj_attribute *attr, char *page)
  365. {
  366. switch (ipl_info.type) {
  367. case IPL_TYPE_CCW:
  368. return sprintf(page, "0.%x.%04x\n", ipl_block.ccw.ssid,
  369. ipl_block.ccw.devno);
  370. case IPL_TYPE_ECKD:
  371. case IPL_TYPE_ECKD_DUMP:
  372. return sprintf(page, "0.%x.%04x\n", ipl_block.eckd.ssid,
  373. ipl_block.eckd.devno);
  374. case IPL_TYPE_FCP:
  375. case IPL_TYPE_FCP_DUMP:
  376. return sprintf(page, "0.0.%04x\n", ipl_block.fcp.devno);
  377. case IPL_TYPE_NVME:
  378. case IPL_TYPE_NVME_DUMP:
  379. return sprintf(page, "%08ux\n", ipl_block.nvme.fid);
  380. default:
  381. return 0;
  382. }
  383. }
  384. static struct kobj_attribute sys_ipl_device_attr =
  385. __ATTR(device, 0444, sys_ipl_device_show, NULL);
  386. static ssize_t sys_ipl_parameter_read(struct file *filp, struct kobject *kobj,
  387. struct bin_attribute *attr, char *buf,
  388. loff_t off, size_t count)
  389. {
  390. return memory_read_from_buffer(buf, count, &off, &ipl_block,
  391. ipl_block.hdr.len);
  392. }
  393. static struct bin_attribute sys_ipl_parameter_attr =
  394. __BIN_ATTR(binary_parameter, 0444, sys_ipl_parameter_read, NULL,
  395. PAGE_SIZE);
  396. DEFINE_IPL_ATTR_SCP_DATA_RO(ipl_fcp, ipl_block.fcp, PAGE_SIZE);
  397. static struct bin_attribute *ipl_fcp_bin_attrs[] = {
  398. &sys_ipl_parameter_attr,
  399. &sys_ipl_fcp_scp_data_attr,
  400. NULL,
  401. };
  402. DEFINE_IPL_ATTR_SCP_DATA_RO(ipl_nvme, ipl_block.nvme, PAGE_SIZE);
  403. static struct bin_attribute *ipl_nvme_bin_attrs[] = {
  404. &sys_ipl_parameter_attr,
  405. &sys_ipl_nvme_scp_data_attr,
  406. NULL,
  407. };
  408. DEFINE_IPL_ATTR_SCP_DATA_RO(ipl_eckd, ipl_block.eckd, PAGE_SIZE);
  409. static struct bin_attribute *ipl_eckd_bin_attrs[] = {
  410. &sys_ipl_parameter_attr,
  411. &sys_ipl_eckd_scp_data_attr,
  412. NULL,
  413. };
  414. /* FCP ipl device attributes */
  415. DEFINE_IPL_ATTR_RO(ipl_fcp, wwpn, "0x%016llx\n",
  416. (unsigned long long)ipl_block.fcp.wwpn);
  417. DEFINE_IPL_ATTR_RO(ipl_fcp, lun, "0x%016llx\n",
  418. (unsigned long long)ipl_block.fcp.lun);
  419. DEFINE_IPL_ATTR_RO(ipl_fcp, bootprog, "%lld\n",
  420. (unsigned long long)ipl_block.fcp.bootprog);
  421. DEFINE_IPL_ATTR_RO(ipl_fcp, br_lba, "%lld\n",
  422. (unsigned long long)ipl_block.fcp.br_lba);
  423. /* NVMe ipl device attributes */
  424. DEFINE_IPL_ATTR_RO(ipl_nvme, fid, "0x%08llx\n",
  425. (unsigned long long)ipl_block.nvme.fid);
  426. DEFINE_IPL_ATTR_RO(ipl_nvme, nsid, "0x%08llx\n",
  427. (unsigned long long)ipl_block.nvme.nsid);
  428. DEFINE_IPL_ATTR_RO(ipl_nvme, bootprog, "%lld\n",
  429. (unsigned long long)ipl_block.nvme.bootprog);
  430. DEFINE_IPL_ATTR_RO(ipl_nvme, br_lba, "%lld\n",
  431. (unsigned long long)ipl_block.nvme.br_lba);
  432. /* ECKD ipl device attributes */
  433. DEFINE_IPL_ATTR_RO(ipl_eckd, bootprog, "%lld\n",
  434. (unsigned long long)ipl_block.eckd.bootprog);
  435. #define IPL_ATTR_BR_CHR_SHOW_FN(_name, _ipb) \
  436. static ssize_t eckd_##_name##_br_chr_show(struct kobject *kobj, \
  437. struct kobj_attribute *attr, \
  438. char *buf) \
  439. { \
  440. struct ipl_pb0_eckd *ipb = &(_ipb); \
  441. \
  442. if (!ipb->br_chr.cyl && \
  443. !ipb->br_chr.head && \
  444. !ipb->br_chr.record) \
  445. return sprintf(buf, "auto\n"); \
  446. \
  447. return sprintf(buf, "0x%x,0x%x,0x%x\n", \
  448. ipb->br_chr.cyl, \
  449. ipb->br_chr.head, \
  450. ipb->br_chr.record); \
  451. }
  452. #define IPL_ATTR_BR_CHR_STORE_FN(_name, _ipb) \
  453. static ssize_t eckd_##_name##_br_chr_store(struct kobject *kobj, \
  454. struct kobj_attribute *attr, \
  455. const char *buf, size_t len) \
  456. { \
  457. struct ipl_pb0_eckd *ipb = &(_ipb); \
  458. unsigned long args[3] = { 0 }; \
  459. char *p, *p1, *tmp = NULL; \
  460. int i, rc; \
  461. \
  462. if (!strncmp(buf, "auto", 4)) \
  463. goto out; \
  464. \
  465. tmp = kstrdup(buf, GFP_KERNEL); \
  466. p = tmp; \
  467. for (i = 0; i < 3; i++) { \
  468. p1 = strsep(&p, ", "); \
  469. if (!p1) { \
  470. rc = -EINVAL; \
  471. goto err; \
  472. } \
  473. rc = kstrtoul(p1, 0, args + i); \
  474. if (rc) \
  475. goto err; \
  476. } \
  477. \
  478. rc = -EINVAL; \
  479. if (i != 3) \
  480. goto err; \
  481. \
  482. if ((args[0] || args[1]) && !args[2]) \
  483. goto err; \
  484. \
  485. if (args[0] > UINT_MAX || args[1] > 255 || args[2] > 255) \
  486. goto err; \
  487. \
  488. out: \
  489. ipb->br_chr.cyl = args[0]; \
  490. ipb->br_chr.head = args[1]; \
  491. ipb->br_chr.record = args[2]; \
  492. rc = len; \
  493. err: \
  494. kfree(tmp); \
  495. return rc; \
  496. }
  497. IPL_ATTR_BR_CHR_SHOW_FN(ipl, ipl_block.eckd);
  498. static struct kobj_attribute sys_ipl_eckd_br_chr_attr =
  499. __ATTR(br_chr, 0644, eckd_ipl_br_chr_show, NULL);
  500. IPL_ATTR_BR_CHR_SHOW_FN(reipl, reipl_block_eckd->eckd);
  501. IPL_ATTR_BR_CHR_STORE_FN(reipl, reipl_block_eckd->eckd);
  502. static struct kobj_attribute sys_reipl_eckd_br_chr_attr =
  503. __ATTR(br_chr, 0644, eckd_reipl_br_chr_show, eckd_reipl_br_chr_store);
  504. static ssize_t ipl_ccw_loadparm_show(struct kobject *kobj,
  505. struct kobj_attribute *attr, char *page)
  506. {
  507. char loadparm[LOADPARM_LEN + 1] = {};
  508. if (!sclp_ipl_info.is_valid)
  509. return sprintf(page, "#unknown#\n");
  510. memcpy(loadparm, &sclp_ipl_info.loadparm, LOADPARM_LEN);
  511. EBCASC(loadparm, LOADPARM_LEN);
  512. strim(loadparm);
  513. return sprintf(page, "%s\n", loadparm);
  514. }
  515. static struct kobj_attribute sys_ipl_ccw_loadparm_attr =
  516. __ATTR(loadparm, 0444, ipl_ccw_loadparm_show, NULL);
  517. static struct attribute *ipl_fcp_attrs[] = {
  518. &sys_ipl_device_attr.attr,
  519. &sys_ipl_fcp_wwpn_attr.attr,
  520. &sys_ipl_fcp_lun_attr.attr,
  521. &sys_ipl_fcp_bootprog_attr.attr,
  522. &sys_ipl_fcp_br_lba_attr.attr,
  523. &sys_ipl_ccw_loadparm_attr.attr,
  524. NULL,
  525. };
  526. static struct attribute_group ipl_fcp_attr_group = {
  527. .attrs = ipl_fcp_attrs,
  528. .bin_attrs = ipl_fcp_bin_attrs,
  529. };
  530. static struct attribute *ipl_nvme_attrs[] = {
  531. &sys_ipl_nvme_fid_attr.attr,
  532. &sys_ipl_nvme_nsid_attr.attr,
  533. &sys_ipl_nvme_bootprog_attr.attr,
  534. &sys_ipl_nvme_br_lba_attr.attr,
  535. &sys_ipl_ccw_loadparm_attr.attr,
  536. NULL,
  537. };
  538. static struct attribute_group ipl_nvme_attr_group = {
  539. .attrs = ipl_nvme_attrs,
  540. .bin_attrs = ipl_nvme_bin_attrs,
  541. };
  542. static struct attribute *ipl_eckd_attrs[] = {
  543. &sys_ipl_eckd_bootprog_attr.attr,
  544. &sys_ipl_eckd_br_chr_attr.attr,
  545. &sys_ipl_ccw_loadparm_attr.attr,
  546. &sys_ipl_device_attr.attr,
  547. NULL,
  548. };
  549. static struct attribute_group ipl_eckd_attr_group = {
  550. .attrs = ipl_eckd_attrs,
  551. .bin_attrs = ipl_eckd_bin_attrs,
  552. };
  553. /* CCW ipl device attributes */
  554. static struct attribute *ipl_ccw_attrs_vm[] = {
  555. &sys_ipl_device_attr.attr,
  556. &sys_ipl_ccw_loadparm_attr.attr,
  557. &sys_ipl_vm_parm_attr.attr,
  558. NULL,
  559. };
  560. static struct attribute *ipl_ccw_attrs_lpar[] = {
  561. &sys_ipl_device_attr.attr,
  562. &sys_ipl_ccw_loadparm_attr.attr,
  563. NULL,
  564. };
  565. static struct attribute_group ipl_ccw_attr_group_vm = {
  566. .attrs = ipl_ccw_attrs_vm,
  567. };
  568. static struct attribute_group ipl_ccw_attr_group_lpar = {
  569. .attrs = ipl_ccw_attrs_lpar
  570. };
  571. static struct attribute *ipl_common_attrs[] = {
  572. &sys_ipl_type_attr.attr,
  573. &sys_ipl_secure_attr.attr,
  574. &sys_ipl_has_secure_attr.attr,
  575. NULL,
  576. };
  577. static struct attribute_group ipl_common_attr_group = {
  578. .attrs = ipl_common_attrs,
  579. };
  580. static struct kset *ipl_kset;
  581. static void __ipl_run(void *unused)
  582. {
  583. diag308(DIAG308_LOAD_CLEAR, NULL);
  584. }
  585. static void ipl_run(struct shutdown_trigger *trigger)
  586. {
  587. smp_call_ipl_cpu(__ipl_run, NULL);
  588. }
  589. static int __init ipl_init(void)
  590. {
  591. int rc;
  592. ipl_kset = kset_create_and_add("ipl", NULL, firmware_kobj);
  593. if (!ipl_kset) {
  594. rc = -ENOMEM;
  595. goto out;
  596. }
  597. rc = sysfs_create_group(&ipl_kset->kobj, &ipl_common_attr_group);
  598. if (rc)
  599. goto out;
  600. switch (ipl_info.type) {
  601. case IPL_TYPE_CCW:
  602. if (MACHINE_IS_VM)
  603. rc = sysfs_create_group(&ipl_kset->kobj,
  604. &ipl_ccw_attr_group_vm);
  605. else
  606. rc = sysfs_create_group(&ipl_kset->kobj,
  607. &ipl_ccw_attr_group_lpar);
  608. break;
  609. case IPL_TYPE_ECKD:
  610. case IPL_TYPE_ECKD_DUMP:
  611. rc = sysfs_create_group(&ipl_kset->kobj, &ipl_eckd_attr_group);
  612. break;
  613. case IPL_TYPE_FCP:
  614. case IPL_TYPE_FCP_DUMP:
  615. rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
  616. break;
  617. case IPL_TYPE_NVME:
  618. case IPL_TYPE_NVME_DUMP:
  619. rc = sysfs_create_group(&ipl_kset->kobj, &ipl_nvme_attr_group);
  620. break;
  621. default:
  622. break;
  623. }
  624. out:
  625. if (rc)
  626. panic("ipl_init failed: rc = %i\n", rc);
  627. return 0;
  628. }
  629. static struct shutdown_action __refdata ipl_action = {
  630. .name = SHUTDOWN_ACTION_IPL_STR,
  631. .fn = ipl_run,
  632. .init = ipl_init,
  633. };
  634. /*
  635. * reipl shutdown action: Reboot Linux on shutdown.
  636. */
  637. /* VM IPL PARM attributes */
  638. static ssize_t reipl_generic_vmparm_show(struct ipl_parameter_block *ipb,
  639. char *page)
  640. {
  641. char vmparm[DIAG308_VMPARM_SIZE + 1] = {};
  642. ipl_block_get_ascii_vmparm(vmparm, sizeof(vmparm), ipb);
  643. return sprintf(page, "%s\n", vmparm);
  644. }
  645. static ssize_t reipl_generic_vmparm_store(struct ipl_parameter_block *ipb,
  646. size_t vmparm_max,
  647. const char *buf, size_t len)
  648. {
  649. int i, ip_len;
  650. /* ignore trailing newline */
  651. ip_len = len;
  652. if ((len > 0) && (buf[len - 1] == '\n'))
  653. ip_len--;
  654. if (ip_len > vmparm_max)
  655. return -EINVAL;
  656. /* parm is used to store kernel options, check for common chars */
  657. for (i = 0; i < ip_len; i++)
  658. if (!(isalnum(buf[i]) || isascii(buf[i]) || isprint(buf[i])))
  659. return -EINVAL;
  660. memset(ipb->ccw.vm_parm, 0, DIAG308_VMPARM_SIZE);
  661. ipb->ccw.vm_parm_len = ip_len;
  662. if (ip_len > 0) {
  663. ipb->ccw.vm_flags |= IPL_PB0_CCW_VM_FLAG_VP;
  664. memcpy(ipb->ccw.vm_parm, buf, ip_len);
  665. ASCEBC(ipb->ccw.vm_parm, ip_len);
  666. } else {
  667. ipb->ccw.vm_flags &= ~IPL_PB0_CCW_VM_FLAG_VP;
  668. }
  669. return len;
  670. }
  671. /* NSS wrapper */
  672. static ssize_t reipl_nss_vmparm_show(struct kobject *kobj,
  673. struct kobj_attribute *attr, char *page)
  674. {
  675. return reipl_generic_vmparm_show(reipl_block_nss, page);
  676. }
  677. static ssize_t reipl_nss_vmparm_store(struct kobject *kobj,
  678. struct kobj_attribute *attr,
  679. const char *buf, size_t len)
  680. {
  681. return reipl_generic_vmparm_store(reipl_block_nss, 56, buf, len);
  682. }
  683. /* CCW wrapper */
  684. static ssize_t reipl_ccw_vmparm_show(struct kobject *kobj,
  685. struct kobj_attribute *attr, char *page)
  686. {
  687. return reipl_generic_vmparm_show(reipl_block_ccw, page);
  688. }
  689. static ssize_t reipl_ccw_vmparm_store(struct kobject *kobj,
  690. struct kobj_attribute *attr,
  691. const char *buf, size_t len)
  692. {
  693. return reipl_generic_vmparm_store(reipl_block_ccw, 64, buf, len);
  694. }
  695. static struct kobj_attribute sys_reipl_nss_vmparm_attr =
  696. __ATTR(parm, 0644, reipl_nss_vmparm_show,
  697. reipl_nss_vmparm_store);
  698. static struct kobj_attribute sys_reipl_ccw_vmparm_attr =
  699. __ATTR(parm, 0644, reipl_ccw_vmparm_show,
  700. reipl_ccw_vmparm_store);
  701. /* FCP reipl device attributes */
  702. DEFINE_IPL_ATTR_SCP_DATA_RW(reipl_fcp, reipl_block_fcp->hdr,
  703. reipl_block_fcp->fcp,
  704. IPL_BP_FCP_LEN, IPL_BP0_FCP_LEN,
  705. DIAG308_SCPDATA_SIZE);
  706. static struct bin_attribute *reipl_fcp_bin_attrs[] = {
  707. &sys_reipl_fcp_scp_data_attr,
  708. NULL,
  709. };
  710. DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%llx\n",
  711. reipl_block_fcp->fcp.wwpn);
  712. DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%llx\n",
  713. reipl_block_fcp->fcp.lun);
  714. DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n",
  715. reipl_block_fcp->fcp.bootprog);
  716. DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n",
  717. reipl_block_fcp->fcp.br_lba);
  718. DEFINE_IPL_ATTR_RW(reipl_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
  719. reipl_block_fcp->fcp.devno);
  720. static void reipl_get_ascii_loadparm(char *loadparm,
  721. struct ipl_parameter_block *ibp)
  722. {
  723. memcpy(loadparm, ibp->common.loadparm, LOADPARM_LEN);
  724. EBCASC(loadparm, LOADPARM_LEN);
  725. loadparm[LOADPARM_LEN] = 0;
  726. strim(loadparm);
  727. }
  728. static ssize_t reipl_generic_loadparm_show(struct ipl_parameter_block *ipb,
  729. char *page)
  730. {
  731. char buf[LOADPARM_LEN + 1];
  732. reipl_get_ascii_loadparm(buf, ipb);
  733. return sprintf(page, "%s\n", buf);
  734. }
  735. static ssize_t reipl_generic_loadparm_store(struct ipl_parameter_block *ipb,
  736. const char *buf, size_t len)
  737. {
  738. int i, lp_len;
  739. /* ignore trailing newline */
  740. lp_len = len;
  741. if ((len > 0) && (buf[len - 1] == '\n'))
  742. lp_len--;
  743. /* loadparm can have max 8 characters and must not start with a blank */
  744. if ((lp_len > LOADPARM_LEN) || ((lp_len > 0) && (buf[0] == ' ')))
  745. return -EINVAL;
  746. /* loadparm can only contain "a-z,A-Z,0-9,SP,." */
  747. for (i = 0; i < lp_len; i++) {
  748. if (isalpha(buf[i]) || isdigit(buf[i]) || (buf[i] == ' ') ||
  749. (buf[i] == '.'))
  750. continue;
  751. return -EINVAL;
  752. }
  753. /* initialize loadparm with blanks */
  754. memset(ipb->common.loadparm, ' ', LOADPARM_LEN);
  755. /* copy and convert to ebcdic */
  756. memcpy(ipb->common.loadparm, buf, lp_len);
  757. ASCEBC(ipb->common.loadparm, LOADPARM_LEN);
  758. ipb->common.flags |= IPL_PB0_FLAG_LOADPARM;
  759. return len;
  760. }
  761. #define DEFINE_GENERIC_LOADPARM(name) \
  762. static ssize_t reipl_##name##_loadparm_show(struct kobject *kobj, \
  763. struct kobj_attribute *attr, char *page) \
  764. { \
  765. return reipl_generic_loadparm_show(reipl_block_##name, page); \
  766. } \
  767. static ssize_t reipl_##name##_loadparm_store(struct kobject *kobj, \
  768. struct kobj_attribute *attr, \
  769. const char *buf, size_t len) \
  770. { \
  771. return reipl_generic_loadparm_store(reipl_block_##name, buf, len); \
  772. } \
  773. static struct kobj_attribute sys_reipl_##name##_loadparm_attr = \
  774. __ATTR(loadparm, 0644, reipl_##name##_loadparm_show, \
  775. reipl_##name##_loadparm_store)
  776. DEFINE_GENERIC_LOADPARM(fcp);
  777. DEFINE_GENERIC_LOADPARM(nvme);
  778. DEFINE_GENERIC_LOADPARM(ccw);
  779. DEFINE_GENERIC_LOADPARM(nss);
  780. DEFINE_GENERIC_LOADPARM(eckd);
  781. static ssize_t reipl_fcp_clear_show(struct kobject *kobj,
  782. struct kobj_attribute *attr, char *page)
  783. {
  784. return sprintf(page, "%u\n", reipl_fcp_clear);
  785. }
  786. static ssize_t reipl_fcp_clear_store(struct kobject *kobj,
  787. struct kobj_attribute *attr,
  788. const char *buf, size_t len)
  789. {
  790. if (kstrtobool(buf, &reipl_fcp_clear) < 0)
  791. return -EINVAL;
  792. return len;
  793. }
  794. static struct attribute *reipl_fcp_attrs[] = {
  795. &sys_reipl_fcp_device_attr.attr,
  796. &sys_reipl_fcp_wwpn_attr.attr,
  797. &sys_reipl_fcp_lun_attr.attr,
  798. &sys_reipl_fcp_bootprog_attr.attr,
  799. &sys_reipl_fcp_br_lba_attr.attr,
  800. &sys_reipl_fcp_loadparm_attr.attr,
  801. NULL,
  802. };
  803. static struct attribute_group reipl_fcp_attr_group = {
  804. .attrs = reipl_fcp_attrs,
  805. .bin_attrs = reipl_fcp_bin_attrs,
  806. };
  807. static struct kobj_attribute sys_reipl_fcp_clear_attr =
  808. __ATTR(clear, 0644, reipl_fcp_clear_show, reipl_fcp_clear_store);
  809. /* NVME reipl device attributes */
  810. DEFINE_IPL_ATTR_SCP_DATA_RW(reipl_nvme, reipl_block_nvme->hdr,
  811. reipl_block_nvme->nvme,
  812. IPL_BP_NVME_LEN, IPL_BP0_NVME_LEN,
  813. DIAG308_SCPDATA_SIZE);
  814. static struct bin_attribute *reipl_nvme_bin_attrs[] = {
  815. &sys_reipl_nvme_scp_data_attr,
  816. NULL,
  817. };
  818. DEFINE_IPL_ATTR_RW(reipl_nvme, fid, "0x%08llx\n", "%llx\n",
  819. reipl_block_nvme->nvme.fid);
  820. DEFINE_IPL_ATTR_RW(reipl_nvme, nsid, "0x%08llx\n", "%llx\n",
  821. reipl_block_nvme->nvme.nsid);
  822. DEFINE_IPL_ATTR_RW(reipl_nvme, bootprog, "%lld\n", "%lld\n",
  823. reipl_block_nvme->nvme.bootprog);
  824. DEFINE_IPL_ATTR_RW(reipl_nvme, br_lba, "%lld\n", "%lld\n",
  825. reipl_block_nvme->nvme.br_lba);
  826. static struct attribute *reipl_nvme_attrs[] = {
  827. &sys_reipl_nvme_fid_attr.attr,
  828. &sys_reipl_nvme_nsid_attr.attr,
  829. &sys_reipl_nvme_bootprog_attr.attr,
  830. &sys_reipl_nvme_br_lba_attr.attr,
  831. &sys_reipl_nvme_loadparm_attr.attr,
  832. NULL,
  833. };
  834. static struct attribute_group reipl_nvme_attr_group = {
  835. .attrs = reipl_nvme_attrs,
  836. .bin_attrs = reipl_nvme_bin_attrs
  837. };
  838. static ssize_t reipl_nvme_clear_show(struct kobject *kobj,
  839. struct kobj_attribute *attr, char *page)
  840. {
  841. return sprintf(page, "%u\n", reipl_nvme_clear);
  842. }
  843. static ssize_t reipl_nvme_clear_store(struct kobject *kobj,
  844. struct kobj_attribute *attr,
  845. const char *buf, size_t len)
  846. {
  847. if (kstrtobool(buf, &reipl_nvme_clear) < 0)
  848. return -EINVAL;
  849. return len;
  850. }
  851. static struct kobj_attribute sys_reipl_nvme_clear_attr =
  852. __ATTR(clear, 0644, reipl_nvme_clear_show, reipl_nvme_clear_store);
  853. /* CCW reipl device attributes */
  854. DEFINE_IPL_CCW_ATTR_RW(reipl_ccw, device, reipl_block_ccw->ccw);
  855. static ssize_t reipl_ccw_clear_show(struct kobject *kobj,
  856. struct kobj_attribute *attr, char *page)
  857. {
  858. return sprintf(page, "%u\n", reipl_ccw_clear);
  859. }
  860. static ssize_t reipl_ccw_clear_store(struct kobject *kobj,
  861. struct kobj_attribute *attr,
  862. const char *buf, size_t len)
  863. {
  864. if (kstrtobool(buf, &reipl_ccw_clear) < 0)
  865. return -EINVAL;
  866. return len;
  867. }
  868. static struct kobj_attribute sys_reipl_ccw_clear_attr =
  869. __ATTR(clear, 0644, reipl_ccw_clear_show, reipl_ccw_clear_store);
  870. static struct attribute *reipl_ccw_attrs_vm[] = {
  871. &sys_reipl_ccw_device_attr.attr,
  872. &sys_reipl_ccw_loadparm_attr.attr,
  873. &sys_reipl_ccw_vmparm_attr.attr,
  874. &sys_reipl_ccw_clear_attr.attr,
  875. NULL,
  876. };
  877. static struct attribute *reipl_ccw_attrs_lpar[] = {
  878. &sys_reipl_ccw_device_attr.attr,
  879. &sys_reipl_ccw_loadparm_attr.attr,
  880. &sys_reipl_ccw_clear_attr.attr,
  881. NULL,
  882. };
  883. static struct attribute_group reipl_ccw_attr_group_vm = {
  884. .name = IPL_CCW_STR,
  885. .attrs = reipl_ccw_attrs_vm,
  886. };
  887. static struct attribute_group reipl_ccw_attr_group_lpar = {
  888. .name = IPL_CCW_STR,
  889. .attrs = reipl_ccw_attrs_lpar,
  890. };
  891. /* ECKD reipl device attributes */
  892. DEFINE_IPL_ATTR_SCP_DATA_RW(reipl_eckd, reipl_block_eckd->hdr,
  893. reipl_block_eckd->eckd,
  894. IPL_BP_ECKD_LEN, IPL_BP0_ECKD_LEN,
  895. DIAG308_SCPDATA_SIZE);
  896. static struct bin_attribute *reipl_eckd_bin_attrs[] = {
  897. &sys_reipl_eckd_scp_data_attr,
  898. NULL,
  899. };
  900. DEFINE_IPL_CCW_ATTR_RW(reipl_eckd, device, reipl_block_eckd->eckd);
  901. DEFINE_IPL_ATTR_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n",
  902. reipl_block_eckd->eckd.bootprog);
  903. static struct attribute *reipl_eckd_attrs[] = {
  904. &sys_reipl_eckd_device_attr.attr,
  905. &sys_reipl_eckd_bootprog_attr.attr,
  906. &sys_reipl_eckd_br_chr_attr.attr,
  907. &sys_reipl_eckd_loadparm_attr.attr,
  908. NULL,
  909. };
  910. static struct attribute_group reipl_eckd_attr_group = {
  911. .attrs = reipl_eckd_attrs,
  912. .bin_attrs = reipl_eckd_bin_attrs
  913. };
  914. static ssize_t reipl_eckd_clear_show(struct kobject *kobj,
  915. struct kobj_attribute *attr, char *page)
  916. {
  917. return sprintf(page, "%u\n", reipl_eckd_clear);
  918. }
  919. static ssize_t reipl_eckd_clear_store(struct kobject *kobj,
  920. struct kobj_attribute *attr,
  921. const char *buf, size_t len)
  922. {
  923. if (kstrtobool(buf, &reipl_eckd_clear) < 0)
  924. return -EINVAL;
  925. return len;
  926. }
  927. static struct kobj_attribute sys_reipl_eckd_clear_attr =
  928. __ATTR(clear, 0644, reipl_eckd_clear_show, reipl_eckd_clear_store);
  929. /* NSS reipl device attributes */
  930. static void reipl_get_ascii_nss_name(char *dst,
  931. struct ipl_parameter_block *ipb)
  932. {
  933. memcpy(dst, ipb->ccw.nss_name, NSS_NAME_SIZE);
  934. EBCASC(dst, NSS_NAME_SIZE);
  935. dst[NSS_NAME_SIZE] = 0;
  936. }
  937. static ssize_t reipl_nss_name_show(struct kobject *kobj,
  938. struct kobj_attribute *attr, char *page)
  939. {
  940. char nss_name[NSS_NAME_SIZE + 1] = {};
  941. reipl_get_ascii_nss_name(nss_name, reipl_block_nss);
  942. return sprintf(page, "%s\n", nss_name);
  943. }
  944. static ssize_t reipl_nss_name_store(struct kobject *kobj,
  945. struct kobj_attribute *attr,
  946. const char *buf, size_t len)
  947. {
  948. int nss_len;
  949. /* ignore trailing newline */
  950. nss_len = len;
  951. if ((len > 0) && (buf[len - 1] == '\n'))
  952. nss_len--;
  953. if (nss_len > NSS_NAME_SIZE)
  954. return -EINVAL;
  955. memset(reipl_block_nss->ccw.nss_name, 0x40, NSS_NAME_SIZE);
  956. if (nss_len > 0) {
  957. reipl_block_nss->ccw.vm_flags |= IPL_PB0_CCW_VM_FLAG_NSS;
  958. memcpy(reipl_block_nss->ccw.nss_name, buf, nss_len);
  959. ASCEBC(reipl_block_nss->ccw.nss_name, nss_len);
  960. EBC_TOUPPER(reipl_block_nss->ccw.nss_name, nss_len);
  961. } else {
  962. reipl_block_nss->ccw.vm_flags &= ~IPL_PB0_CCW_VM_FLAG_NSS;
  963. }
  964. return len;
  965. }
  966. static struct kobj_attribute sys_reipl_nss_name_attr =
  967. __ATTR(name, 0644, reipl_nss_name_show,
  968. reipl_nss_name_store);
  969. static struct attribute *reipl_nss_attrs[] = {
  970. &sys_reipl_nss_name_attr.attr,
  971. &sys_reipl_nss_loadparm_attr.attr,
  972. &sys_reipl_nss_vmparm_attr.attr,
  973. NULL,
  974. };
  975. static struct attribute_group reipl_nss_attr_group = {
  976. .name = IPL_NSS_STR,
  977. .attrs = reipl_nss_attrs,
  978. };
  979. void set_os_info_reipl_block(void)
  980. {
  981. os_info_entry_add_data(OS_INFO_REIPL_BLOCK, reipl_block_actual,
  982. reipl_block_actual->hdr.len);
  983. }
  984. /* reipl type */
  985. static int reipl_set_type(enum ipl_type type)
  986. {
  987. if (!(reipl_capabilities & type))
  988. return -EINVAL;
  989. switch(type) {
  990. case IPL_TYPE_CCW:
  991. reipl_block_actual = reipl_block_ccw;
  992. break;
  993. case IPL_TYPE_ECKD:
  994. reipl_block_actual = reipl_block_eckd;
  995. break;
  996. case IPL_TYPE_FCP:
  997. reipl_block_actual = reipl_block_fcp;
  998. break;
  999. case IPL_TYPE_NVME:
  1000. reipl_block_actual = reipl_block_nvme;
  1001. break;
  1002. case IPL_TYPE_NSS:
  1003. reipl_block_actual = reipl_block_nss;
  1004. break;
  1005. default:
  1006. break;
  1007. }
  1008. reipl_type = type;
  1009. return 0;
  1010. }
  1011. static ssize_t reipl_type_show(struct kobject *kobj,
  1012. struct kobj_attribute *attr, char *page)
  1013. {
  1014. return sprintf(page, "%s\n", ipl_type_str(reipl_type));
  1015. }
  1016. static ssize_t reipl_type_store(struct kobject *kobj,
  1017. struct kobj_attribute *attr,
  1018. const char *buf, size_t len)
  1019. {
  1020. int rc = -EINVAL;
  1021. if (strncmp(buf, IPL_CCW_STR, strlen(IPL_CCW_STR)) == 0)
  1022. rc = reipl_set_type(IPL_TYPE_CCW);
  1023. else if (strncmp(buf, IPL_ECKD_STR, strlen(IPL_ECKD_STR)) == 0)
  1024. rc = reipl_set_type(IPL_TYPE_ECKD);
  1025. else if (strncmp(buf, IPL_FCP_STR, strlen(IPL_FCP_STR)) == 0)
  1026. rc = reipl_set_type(IPL_TYPE_FCP);
  1027. else if (strncmp(buf, IPL_NVME_STR, strlen(IPL_NVME_STR)) == 0)
  1028. rc = reipl_set_type(IPL_TYPE_NVME);
  1029. else if (strncmp(buf, IPL_NSS_STR, strlen(IPL_NSS_STR)) == 0)
  1030. rc = reipl_set_type(IPL_TYPE_NSS);
  1031. return (rc != 0) ? rc : len;
  1032. }
  1033. static struct kobj_attribute reipl_type_attr =
  1034. __ATTR(reipl_type, 0644, reipl_type_show, reipl_type_store);
  1035. static struct kset *reipl_kset;
  1036. static struct kset *reipl_fcp_kset;
  1037. static struct kset *reipl_nvme_kset;
  1038. static struct kset *reipl_eckd_kset;
  1039. static void __reipl_run(void *unused)
  1040. {
  1041. switch (reipl_type) {
  1042. case IPL_TYPE_CCW:
  1043. diag308(DIAG308_SET, reipl_block_ccw);
  1044. if (reipl_ccw_clear)
  1045. diag308(DIAG308_LOAD_CLEAR, NULL);
  1046. else
  1047. diag308(DIAG308_LOAD_NORMAL_DUMP, NULL);
  1048. break;
  1049. case IPL_TYPE_ECKD:
  1050. diag308(DIAG308_SET, reipl_block_eckd);
  1051. if (reipl_eckd_clear)
  1052. diag308(DIAG308_LOAD_CLEAR, NULL);
  1053. else
  1054. diag308(DIAG308_LOAD_NORMAL, NULL);
  1055. break;
  1056. case IPL_TYPE_FCP:
  1057. diag308(DIAG308_SET, reipl_block_fcp);
  1058. if (reipl_fcp_clear)
  1059. diag308(DIAG308_LOAD_CLEAR, NULL);
  1060. else
  1061. diag308(DIAG308_LOAD_NORMAL, NULL);
  1062. break;
  1063. case IPL_TYPE_NVME:
  1064. diag308(DIAG308_SET, reipl_block_nvme);
  1065. if (reipl_nvme_clear)
  1066. diag308(DIAG308_LOAD_CLEAR, NULL);
  1067. else
  1068. diag308(DIAG308_LOAD_NORMAL, NULL);
  1069. break;
  1070. case IPL_TYPE_NSS:
  1071. diag308(DIAG308_SET, reipl_block_nss);
  1072. diag308(DIAG308_LOAD_CLEAR, NULL);
  1073. break;
  1074. case IPL_TYPE_UNKNOWN:
  1075. diag308(DIAG308_LOAD_CLEAR, NULL);
  1076. break;
  1077. case IPL_TYPE_FCP_DUMP:
  1078. case IPL_TYPE_NVME_DUMP:
  1079. case IPL_TYPE_ECKD_DUMP:
  1080. break;
  1081. }
  1082. disabled_wait();
  1083. }
  1084. static void reipl_run(struct shutdown_trigger *trigger)
  1085. {
  1086. smp_call_ipl_cpu(__reipl_run, NULL);
  1087. }
  1088. static void reipl_block_ccw_init(struct ipl_parameter_block *ipb)
  1089. {
  1090. ipb->hdr.len = IPL_BP_CCW_LEN;
  1091. ipb->hdr.version = IPL_PARM_BLOCK_VERSION;
  1092. ipb->pb0_hdr.len = IPL_BP0_CCW_LEN;
  1093. ipb->pb0_hdr.pbt = IPL_PBT_CCW;
  1094. }
  1095. static void reipl_block_ccw_fill_parms(struct ipl_parameter_block *ipb)
  1096. {
  1097. /* LOADPARM */
  1098. /* check if read scp info worked and set loadparm */
  1099. if (sclp_ipl_info.is_valid)
  1100. memcpy(ipb->ccw.loadparm, &sclp_ipl_info.loadparm, LOADPARM_LEN);
  1101. else
  1102. /* read scp info failed: set empty loadparm (EBCDIC blanks) */
  1103. memset(ipb->ccw.loadparm, 0x40, LOADPARM_LEN);
  1104. ipb->ccw.flags = IPL_PB0_FLAG_LOADPARM;
  1105. /* VM PARM */
  1106. if (MACHINE_IS_VM && ipl_block_valid &&
  1107. (ipl_block.ccw.vm_flags & IPL_PB0_CCW_VM_FLAG_VP)) {
  1108. ipb->ccw.vm_flags |= IPL_PB0_CCW_VM_FLAG_VP;
  1109. ipb->ccw.vm_parm_len = ipl_block.ccw.vm_parm_len;
  1110. memcpy(ipb->ccw.vm_parm,
  1111. ipl_block.ccw.vm_parm, DIAG308_VMPARM_SIZE);
  1112. }
  1113. }
  1114. static int __init reipl_nss_init(void)
  1115. {
  1116. int rc;
  1117. if (!MACHINE_IS_VM)
  1118. return 0;
  1119. reipl_block_nss = (void *) get_zeroed_page(GFP_KERNEL);
  1120. if (!reipl_block_nss)
  1121. return -ENOMEM;
  1122. rc = sysfs_create_group(&reipl_kset->kobj, &reipl_nss_attr_group);
  1123. if (rc)
  1124. return rc;
  1125. reipl_block_ccw_init(reipl_block_nss);
  1126. reipl_capabilities |= IPL_TYPE_NSS;
  1127. return 0;
  1128. }
  1129. static int __init reipl_ccw_init(void)
  1130. {
  1131. int rc;
  1132. reipl_block_ccw = (void *) get_zeroed_page(GFP_KERNEL);
  1133. if (!reipl_block_ccw)
  1134. return -ENOMEM;
  1135. rc = sysfs_create_group(&reipl_kset->kobj,
  1136. MACHINE_IS_VM ? &reipl_ccw_attr_group_vm
  1137. : &reipl_ccw_attr_group_lpar);
  1138. if (rc)
  1139. return rc;
  1140. reipl_block_ccw_init(reipl_block_ccw);
  1141. if (ipl_info.type == IPL_TYPE_CCW) {
  1142. reipl_block_ccw->ccw.ssid = ipl_block.ccw.ssid;
  1143. reipl_block_ccw->ccw.devno = ipl_block.ccw.devno;
  1144. reipl_block_ccw_fill_parms(reipl_block_ccw);
  1145. }
  1146. reipl_capabilities |= IPL_TYPE_CCW;
  1147. return 0;
  1148. }
  1149. static int __init reipl_fcp_init(void)
  1150. {
  1151. int rc;
  1152. reipl_block_fcp = (void *) get_zeroed_page(GFP_KERNEL);
  1153. if (!reipl_block_fcp)
  1154. return -ENOMEM;
  1155. /* sysfs: create fcp kset for mixing attr group and bin attrs */
  1156. reipl_fcp_kset = kset_create_and_add(IPL_FCP_STR, NULL,
  1157. &reipl_kset->kobj);
  1158. if (!reipl_fcp_kset) {
  1159. free_page((unsigned long) reipl_block_fcp);
  1160. return -ENOMEM;
  1161. }
  1162. rc = sysfs_create_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group);
  1163. if (rc)
  1164. goto out1;
  1165. if (test_facility(141)) {
  1166. rc = sysfs_create_file(&reipl_fcp_kset->kobj,
  1167. &sys_reipl_fcp_clear_attr.attr);
  1168. if (rc)
  1169. goto out2;
  1170. } else {
  1171. reipl_fcp_clear = true;
  1172. }
  1173. if (ipl_info.type == IPL_TYPE_FCP) {
  1174. memcpy(reipl_block_fcp, &ipl_block, sizeof(ipl_block));
  1175. /*
  1176. * Fix loadparm: There are systems where the (SCSI) LOADPARM
  1177. * is invalid in the SCSI IPL parameter block, so take it
  1178. * always from sclp_ipl_info.
  1179. */
  1180. memcpy(reipl_block_fcp->fcp.loadparm, sclp_ipl_info.loadparm,
  1181. LOADPARM_LEN);
  1182. } else {
  1183. reipl_block_fcp->hdr.len = IPL_BP_FCP_LEN;
  1184. reipl_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION;
  1185. reipl_block_fcp->fcp.len = IPL_BP0_FCP_LEN;
  1186. reipl_block_fcp->fcp.pbt = IPL_PBT_FCP;
  1187. reipl_block_fcp->fcp.opt = IPL_PB0_FCP_OPT_IPL;
  1188. }
  1189. reipl_capabilities |= IPL_TYPE_FCP;
  1190. return 0;
  1191. out2:
  1192. sysfs_remove_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group);
  1193. out1:
  1194. kset_unregister(reipl_fcp_kset);
  1195. free_page((unsigned long) reipl_block_fcp);
  1196. return rc;
  1197. }
  1198. static int __init reipl_nvme_init(void)
  1199. {
  1200. int rc;
  1201. reipl_block_nvme = (void *) get_zeroed_page(GFP_KERNEL);
  1202. if (!reipl_block_nvme)
  1203. return -ENOMEM;
  1204. /* sysfs: create kset for mixing attr group and bin attrs */
  1205. reipl_nvme_kset = kset_create_and_add(IPL_NVME_STR, NULL,
  1206. &reipl_kset->kobj);
  1207. if (!reipl_nvme_kset) {
  1208. free_page((unsigned long) reipl_block_nvme);
  1209. return -ENOMEM;
  1210. }
  1211. rc = sysfs_create_group(&reipl_nvme_kset->kobj, &reipl_nvme_attr_group);
  1212. if (rc)
  1213. goto out1;
  1214. if (test_facility(141)) {
  1215. rc = sysfs_create_file(&reipl_nvme_kset->kobj,
  1216. &sys_reipl_nvme_clear_attr.attr);
  1217. if (rc)
  1218. goto out2;
  1219. } else {
  1220. reipl_nvme_clear = true;
  1221. }
  1222. if (ipl_info.type == IPL_TYPE_NVME) {
  1223. memcpy(reipl_block_nvme, &ipl_block, sizeof(ipl_block));
  1224. /*
  1225. * Fix loadparm: There are systems where the (SCSI) LOADPARM
  1226. * is invalid in the IPL parameter block, so take it
  1227. * always from sclp_ipl_info.
  1228. */
  1229. memcpy(reipl_block_nvme->nvme.loadparm, sclp_ipl_info.loadparm,
  1230. LOADPARM_LEN);
  1231. } else {
  1232. reipl_block_nvme->hdr.len = IPL_BP_NVME_LEN;
  1233. reipl_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
  1234. reipl_block_nvme->nvme.len = IPL_BP0_NVME_LEN;
  1235. reipl_block_nvme->nvme.pbt = IPL_PBT_NVME;
  1236. reipl_block_nvme->nvme.opt = IPL_PB0_NVME_OPT_IPL;
  1237. }
  1238. reipl_capabilities |= IPL_TYPE_NVME;
  1239. return 0;
  1240. out2:
  1241. sysfs_remove_group(&reipl_nvme_kset->kobj, &reipl_nvme_attr_group);
  1242. out1:
  1243. kset_unregister(reipl_nvme_kset);
  1244. free_page((unsigned long) reipl_block_nvme);
  1245. return rc;
  1246. }
  1247. static int __init reipl_eckd_init(void)
  1248. {
  1249. int rc;
  1250. if (!sclp.has_sipl_eckd)
  1251. return 0;
  1252. reipl_block_eckd = (void *)get_zeroed_page(GFP_KERNEL);
  1253. if (!reipl_block_eckd)
  1254. return -ENOMEM;
  1255. /* sysfs: create kset for mixing attr group and bin attrs */
  1256. reipl_eckd_kset = kset_create_and_add(IPL_ECKD_STR, NULL,
  1257. &reipl_kset->kobj);
  1258. if (!reipl_eckd_kset) {
  1259. free_page((unsigned long)reipl_block_eckd);
  1260. return -ENOMEM;
  1261. }
  1262. rc = sysfs_create_group(&reipl_eckd_kset->kobj, &reipl_eckd_attr_group);
  1263. if (rc)
  1264. goto out1;
  1265. if (test_facility(141)) {
  1266. rc = sysfs_create_file(&reipl_eckd_kset->kobj,
  1267. &sys_reipl_eckd_clear_attr.attr);
  1268. if (rc)
  1269. goto out2;
  1270. } else {
  1271. reipl_eckd_clear = true;
  1272. }
  1273. if (ipl_info.type == IPL_TYPE_ECKD) {
  1274. memcpy(reipl_block_eckd, &ipl_block, sizeof(ipl_block));
  1275. } else {
  1276. reipl_block_eckd->hdr.len = IPL_BP_ECKD_LEN;
  1277. reipl_block_eckd->hdr.version = IPL_PARM_BLOCK_VERSION;
  1278. reipl_block_eckd->eckd.len = IPL_BP0_ECKD_LEN;
  1279. reipl_block_eckd->eckd.pbt = IPL_PBT_ECKD;
  1280. reipl_block_eckd->eckd.opt = IPL_PB0_ECKD_OPT_IPL;
  1281. }
  1282. reipl_capabilities |= IPL_TYPE_ECKD;
  1283. return 0;
  1284. out2:
  1285. sysfs_remove_group(&reipl_eckd_kset->kobj, &reipl_eckd_attr_group);
  1286. out1:
  1287. kset_unregister(reipl_eckd_kset);
  1288. free_page((unsigned long)reipl_block_eckd);
  1289. return rc;
  1290. }
  1291. static int __init reipl_type_init(void)
  1292. {
  1293. enum ipl_type reipl_type = ipl_info.type;
  1294. struct ipl_parameter_block *reipl_block;
  1295. unsigned long size;
  1296. reipl_block = os_info_old_entry(OS_INFO_REIPL_BLOCK, &size);
  1297. if (!reipl_block)
  1298. goto out;
  1299. /*
  1300. * If we have an OS info reipl block, this will be used
  1301. */
  1302. if (reipl_block->pb0_hdr.pbt == IPL_PBT_FCP) {
  1303. memcpy(reipl_block_fcp, reipl_block, size);
  1304. reipl_type = IPL_TYPE_FCP;
  1305. } else if (reipl_block->pb0_hdr.pbt == IPL_PBT_NVME) {
  1306. memcpy(reipl_block_nvme, reipl_block, size);
  1307. reipl_type = IPL_TYPE_NVME;
  1308. } else if (reipl_block->pb0_hdr.pbt == IPL_PBT_CCW) {
  1309. memcpy(reipl_block_ccw, reipl_block, size);
  1310. reipl_type = IPL_TYPE_CCW;
  1311. } else if (reipl_block->pb0_hdr.pbt == IPL_PBT_ECKD) {
  1312. memcpy(reipl_block_eckd, reipl_block, size);
  1313. reipl_type = IPL_TYPE_ECKD;
  1314. }
  1315. out:
  1316. return reipl_set_type(reipl_type);
  1317. }
  1318. static int __init reipl_init(void)
  1319. {
  1320. int rc;
  1321. reipl_kset = kset_create_and_add("reipl", NULL, firmware_kobj);
  1322. if (!reipl_kset)
  1323. return -ENOMEM;
  1324. rc = sysfs_create_file(&reipl_kset->kobj, &reipl_type_attr.attr);
  1325. if (rc) {
  1326. kset_unregister(reipl_kset);
  1327. return rc;
  1328. }
  1329. rc = reipl_ccw_init();
  1330. if (rc)
  1331. return rc;
  1332. rc = reipl_eckd_init();
  1333. if (rc)
  1334. return rc;
  1335. rc = reipl_fcp_init();
  1336. if (rc)
  1337. return rc;
  1338. rc = reipl_nvme_init();
  1339. if (rc)
  1340. return rc;
  1341. rc = reipl_nss_init();
  1342. if (rc)
  1343. return rc;
  1344. return reipl_type_init();
  1345. }
  1346. static struct shutdown_action __refdata reipl_action = {
  1347. .name = SHUTDOWN_ACTION_REIPL_STR,
  1348. .fn = reipl_run,
  1349. .init = reipl_init,
  1350. };
  1351. /*
  1352. * dump shutdown action: Dump Linux on shutdown.
  1353. */
  1354. /* FCP dump device attributes */
  1355. DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%llx\n",
  1356. dump_block_fcp->fcp.wwpn);
  1357. DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%llx\n",
  1358. dump_block_fcp->fcp.lun);
  1359. DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n",
  1360. dump_block_fcp->fcp.bootprog);
  1361. DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n",
  1362. dump_block_fcp->fcp.br_lba);
  1363. DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
  1364. dump_block_fcp->fcp.devno);
  1365. DEFINE_IPL_ATTR_SCP_DATA_RW(dump_fcp, dump_block_fcp->hdr,
  1366. dump_block_fcp->fcp,
  1367. IPL_BP_FCP_LEN, IPL_BP0_FCP_LEN,
  1368. DIAG308_SCPDATA_SIZE);
  1369. static struct attribute *dump_fcp_attrs[] = {
  1370. &sys_dump_fcp_device_attr.attr,
  1371. &sys_dump_fcp_wwpn_attr.attr,
  1372. &sys_dump_fcp_lun_attr.attr,
  1373. &sys_dump_fcp_bootprog_attr.attr,
  1374. &sys_dump_fcp_br_lba_attr.attr,
  1375. NULL,
  1376. };
  1377. static struct bin_attribute *dump_fcp_bin_attrs[] = {
  1378. &sys_dump_fcp_scp_data_attr,
  1379. NULL,
  1380. };
  1381. static struct attribute_group dump_fcp_attr_group = {
  1382. .name = IPL_FCP_STR,
  1383. .attrs = dump_fcp_attrs,
  1384. .bin_attrs = dump_fcp_bin_attrs,
  1385. };
  1386. /* NVME dump device attributes */
  1387. DEFINE_IPL_ATTR_RW(dump_nvme, fid, "0x%08llx\n", "%llx\n",
  1388. dump_block_nvme->nvme.fid);
  1389. DEFINE_IPL_ATTR_RW(dump_nvme, nsid, "0x%08llx\n", "%llx\n",
  1390. dump_block_nvme->nvme.nsid);
  1391. DEFINE_IPL_ATTR_RW(dump_nvme, bootprog, "%lld\n", "%llx\n",
  1392. dump_block_nvme->nvme.bootprog);
  1393. DEFINE_IPL_ATTR_RW(dump_nvme, br_lba, "%lld\n", "%llx\n",
  1394. dump_block_nvme->nvme.br_lba);
  1395. DEFINE_IPL_ATTR_SCP_DATA_RW(dump_nvme, dump_block_nvme->hdr,
  1396. dump_block_nvme->nvme,
  1397. IPL_BP_NVME_LEN, IPL_BP0_NVME_LEN,
  1398. DIAG308_SCPDATA_SIZE);
  1399. static struct attribute *dump_nvme_attrs[] = {
  1400. &sys_dump_nvme_fid_attr.attr,
  1401. &sys_dump_nvme_nsid_attr.attr,
  1402. &sys_dump_nvme_bootprog_attr.attr,
  1403. &sys_dump_nvme_br_lba_attr.attr,
  1404. NULL,
  1405. };
  1406. static struct bin_attribute *dump_nvme_bin_attrs[] = {
  1407. &sys_dump_nvme_scp_data_attr,
  1408. NULL,
  1409. };
  1410. static struct attribute_group dump_nvme_attr_group = {
  1411. .name = IPL_NVME_STR,
  1412. .attrs = dump_nvme_attrs,
  1413. .bin_attrs = dump_nvme_bin_attrs,
  1414. };
  1415. /* ECKD dump device attributes */
  1416. DEFINE_IPL_CCW_ATTR_RW(dump_eckd, device, dump_block_eckd->eckd);
  1417. DEFINE_IPL_ATTR_RW(dump_eckd, bootprog, "%lld\n", "%llx\n",
  1418. dump_block_eckd->eckd.bootprog);
  1419. IPL_ATTR_BR_CHR_SHOW_FN(dump, dump_block_eckd->eckd);
  1420. IPL_ATTR_BR_CHR_STORE_FN(dump, dump_block_eckd->eckd);
  1421. static struct kobj_attribute sys_dump_eckd_br_chr_attr =
  1422. __ATTR(br_chr, 0644, eckd_dump_br_chr_show, eckd_dump_br_chr_store);
  1423. DEFINE_IPL_ATTR_SCP_DATA_RW(dump_eckd, dump_block_eckd->hdr,
  1424. dump_block_eckd->eckd,
  1425. IPL_BP_ECKD_LEN, IPL_BP0_ECKD_LEN,
  1426. DIAG308_SCPDATA_SIZE);
  1427. static struct attribute *dump_eckd_attrs[] = {
  1428. &sys_dump_eckd_device_attr.attr,
  1429. &sys_dump_eckd_bootprog_attr.attr,
  1430. &sys_dump_eckd_br_chr_attr.attr,
  1431. NULL,
  1432. };
  1433. static struct bin_attribute *dump_eckd_bin_attrs[] = {
  1434. &sys_dump_eckd_scp_data_attr,
  1435. NULL,
  1436. };
  1437. static struct attribute_group dump_eckd_attr_group = {
  1438. .name = IPL_ECKD_STR,
  1439. .attrs = dump_eckd_attrs,
  1440. .bin_attrs = dump_eckd_bin_attrs,
  1441. };
  1442. /* CCW dump device attributes */
  1443. DEFINE_IPL_CCW_ATTR_RW(dump_ccw, device, dump_block_ccw->ccw);
  1444. static struct attribute *dump_ccw_attrs[] = {
  1445. &sys_dump_ccw_device_attr.attr,
  1446. NULL,
  1447. };
  1448. static struct attribute_group dump_ccw_attr_group = {
  1449. .name = IPL_CCW_STR,
  1450. .attrs = dump_ccw_attrs,
  1451. };
  1452. /* dump type */
  1453. static int dump_set_type(enum dump_type type)
  1454. {
  1455. if (!(dump_capabilities & type))
  1456. return -EINVAL;
  1457. dump_type = type;
  1458. return 0;
  1459. }
  1460. static ssize_t dump_type_show(struct kobject *kobj,
  1461. struct kobj_attribute *attr, char *page)
  1462. {
  1463. return sprintf(page, "%s\n", dump_type_str(dump_type));
  1464. }
  1465. static ssize_t dump_type_store(struct kobject *kobj,
  1466. struct kobj_attribute *attr,
  1467. const char *buf, size_t len)
  1468. {
  1469. int rc = -EINVAL;
  1470. if (strncmp(buf, DUMP_NONE_STR, strlen(DUMP_NONE_STR)) == 0)
  1471. rc = dump_set_type(DUMP_TYPE_NONE);
  1472. else if (strncmp(buf, DUMP_CCW_STR, strlen(DUMP_CCW_STR)) == 0)
  1473. rc = dump_set_type(DUMP_TYPE_CCW);
  1474. else if (strncmp(buf, DUMP_ECKD_STR, strlen(DUMP_ECKD_STR)) == 0)
  1475. rc = dump_set_type(DUMP_TYPE_ECKD);
  1476. else if (strncmp(buf, DUMP_FCP_STR, strlen(DUMP_FCP_STR)) == 0)
  1477. rc = dump_set_type(DUMP_TYPE_FCP);
  1478. else if (strncmp(buf, DUMP_NVME_STR, strlen(DUMP_NVME_STR)) == 0)
  1479. rc = dump_set_type(DUMP_TYPE_NVME);
  1480. return (rc != 0) ? rc : len;
  1481. }
  1482. static struct kobj_attribute dump_type_attr =
  1483. __ATTR(dump_type, 0644, dump_type_show, dump_type_store);
  1484. static struct kset *dump_kset;
  1485. static void diag308_dump(void *dump_block)
  1486. {
  1487. diag308(DIAG308_SET, dump_block);
  1488. while (1) {
  1489. if (diag308(DIAG308_LOAD_NORMAL_DUMP, NULL) != 0x302)
  1490. break;
  1491. udelay(USEC_PER_SEC);
  1492. }
  1493. }
  1494. static void __dump_run(void *unused)
  1495. {
  1496. switch (dump_type) {
  1497. case DUMP_TYPE_CCW:
  1498. diag308_dump(dump_block_ccw);
  1499. break;
  1500. case DUMP_TYPE_ECKD:
  1501. diag308_dump(dump_block_eckd);
  1502. break;
  1503. case DUMP_TYPE_FCP:
  1504. diag308_dump(dump_block_fcp);
  1505. break;
  1506. case DUMP_TYPE_NVME:
  1507. diag308_dump(dump_block_nvme);
  1508. break;
  1509. default:
  1510. break;
  1511. }
  1512. }
  1513. static void dump_run(struct shutdown_trigger *trigger)
  1514. {
  1515. if (dump_type == DUMP_TYPE_NONE)
  1516. return;
  1517. smp_send_stop();
  1518. smp_call_ipl_cpu(__dump_run, NULL);
  1519. }
  1520. static int __init dump_ccw_init(void)
  1521. {
  1522. int rc;
  1523. dump_block_ccw = (void *) get_zeroed_page(GFP_KERNEL);
  1524. if (!dump_block_ccw)
  1525. return -ENOMEM;
  1526. rc = sysfs_create_group(&dump_kset->kobj, &dump_ccw_attr_group);
  1527. if (rc) {
  1528. free_page((unsigned long)dump_block_ccw);
  1529. return rc;
  1530. }
  1531. dump_block_ccw->hdr.len = IPL_BP_CCW_LEN;
  1532. dump_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION;
  1533. dump_block_ccw->ccw.len = IPL_BP0_CCW_LEN;
  1534. dump_block_ccw->ccw.pbt = IPL_PBT_CCW;
  1535. dump_capabilities |= DUMP_TYPE_CCW;
  1536. return 0;
  1537. }
  1538. static int __init dump_fcp_init(void)
  1539. {
  1540. int rc;
  1541. if (!sclp_ipl_info.has_dump)
  1542. return 0; /* LDIPL DUMP is not installed */
  1543. dump_block_fcp = (void *) get_zeroed_page(GFP_KERNEL);
  1544. if (!dump_block_fcp)
  1545. return -ENOMEM;
  1546. rc = sysfs_create_group(&dump_kset->kobj, &dump_fcp_attr_group);
  1547. if (rc) {
  1548. free_page((unsigned long)dump_block_fcp);
  1549. return rc;
  1550. }
  1551. dump_block_fcp->hdr.len = IPL_BP_FCP_LEN;
  1552. dump_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION;
  1553. dump_block_fcp->fcp.len = IPL_BP0_FCP_LEN;
  1554. dump_block_fcp->fcp.pbt = IPL_PBT_FCP;
  1555. dump_block_fcp->fcp.opt = IPL_PB0_FCP_OPT_DUMP;
  1556. dump_capabilities |= DUMP_TYPE_FCP;
  1557. return 0;
  1558. }
  1559. static int __init dump_nvme_init(void)
  1560. {
  1561. int rc;
  1562. if (!sclp_ipl_info.has_dump)
  1563. return 0; /* LDIPL DUMP is not installed */
  1564. dump_block_nvme = (void *) get_zeroed_page(GFP_KERNEL);
  1565. if (!dump_block_nvme)
  1566. return -ENOMEM;
  1567. rc = sysfs_create_group(&dump_kset->kobj, &dump_nvme_attr_group);
  1568. if (rc) {
  1569. free_page((unsigned long)dump_block_nvme);
  1570. return rc;
  1571. }
  1572. dump_block_nvme->hdr.len = IPL_BP_NVME_LEN;
  1573. dump_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
  1574. dump_block_nvme->nvme.len = IPL_BP0_NVME_LEN;
  1575. dump_block_nvme->nvme.pbt = IPL_PBT_NVME;
  1576. dump_block_nvme->nvme.opt = IPL_PB0_NVME_OPT_DUMP;
  1577. dump_capabilities |= DUMP_TYPE_NVME;
  1578. return 0;
  1579. }
  1580. static int __init dump_eckd_init(void)
  1581. {
  1582. int rc;
  1583. if (!sclp_ipl_info.has_dump || !sclp.has_sipl_eckd)
  1584. return 0; /* LDIPL DUMP is not installed */
  1585. dump_block_eckd = (void *)get_zeroed_page(GFP_KERNEL);
  1586. if (!dump_block_eckd)
  1587. return -ENOMEM;
  1588. rc = sysfs_create_group(&dump_kset->kobj, &dump_eckd_attr_group);
  1589. if (rc) {
  1590. free_page((unsigned long)dump_block_eckd);
  1591. return rc;
  1592. }
  1593. dump_block_eckd->hdr.len = IPL_BP_ECKD_LEN;
  1594. dump_block_eckd->hdr.version = IPL_PARM_BLOCK_VERSION;
  1595. dump_block_eckd->eckd.len = IPL_BP0_ECKD_LEN;
  1596. dump_block_eckd->eckd.pbt = IPL_PBT_ECKD;
  1597. dump_block_eckd->eckd.opt = IPL_PB0_ECKD_OPT_DUMP;
  1598. dump_capabilities |= DUMP_TYPE_ECKD;
  1599. return 0;
  1600. }
  1601. static int __init dump_init(void)
  1602. {
  1603. int rc;
  1604. dump_kset = kset_create_and_add("dump", NULL, firmware_kobj);
  1605. if (!dump_kset)
  1606. return -ENOMEM;
  1607. rc = sysfs_create_file(&dump_kset->kobj, &dump_type_attr.attr);
  1608. if (rc) {
  1609. kset_unregister(dump_kset);
  1610. return rc;
  1611. }
  1612. rc = dump_ccw_init();
  1613. if (rc)
  1614. return rc;
  1615. rc = dump_eckd_init();
  1616. if (rc)
  1617. return rc;
  1618. rc = dump_fcp_init();
  1619. if (rc)
  1620. return rc;
  1621. rc = dump_nvme_init();
  1622. if (rc)
  1623. return rc;
  1624. dump_set_type(DUMP_TYPE_NONE);
  1625. return 0;
  1626. }
  1627. static struct shutdown_action __refdata dump_action = {
  1628. .name = SHUTDOWN_ACTION_DUMP_STR,
  1629. .fn = dump_run,
  1630. .init = dump_init,
  1631. };
  1632. static void dump_reipl_run(struct shutdown_trigger *trigger)
  1633. {
  1634. struct lowcore *abs_lc;
  1635. unsigned int csum;
  1636. /*
  1637. * Set REIPL_CLEAR flag in os_info flags entry indicating
  1638. * 'clear' sysfs attribute has been set on the panicked system
  1639. * for specified reipl type.
  1640. * Always set for IPL_TYPE_NSS and IPL_TYPE_UNKNOWN.
  1641. */
  1642. if ((reipl_type == IPL_TYPE_CCW && reipl_ccw_clear) ||
  1643. (reipl_type == IPL_TYPE_ECKD && reipl_eckd_clear) ||
  1644. (reipl_type == IPL_TYPE_FCP && reipl_fcp_clear) ||
  1645. (reipl_type == IPL_TYPE_NVME && reipl_nvme_clear) ||
  1646. reipl_type == IPL_TYPE_NSS ||
  1647. reipl_type == IPL_TYPE_UNKNOWN)
  1648. os_info_flags |= OS_INFO_FLAG_REIPL_CLEAR;
  1649. os_info_entry_add_data(OS_INFO_FLAGS_ENTRY, &os_info_flags, sizeof(os_info_flags));
  1650. csum = (__force unsigned int)cksm(reipl_block_actual, reipl_block_actual->hdr.len, 0);
  1651. abs_lc = get_abs_lowcore();
  1652. abs_lc->ipib = __pa(reipl_block_actual);
  1653. abs_lc->ipib_checksum = csum;
  1654. put_abs_lowcore(abs_lc);
  1655. dump_run(trigger);
  1656. }
  1657. static struct shutdown_action __refdata dump_reipl_action = {
  1658. .name = SHUTDOWN_ACTION_DUMP_REIPL_STR,
  1659. .fn = dump_reipl_run,
  1660. };
  1661. /*
  1662. * vmcmd shutdown action: Trigger vm command on shutdown.
  1663. */
  1664. #define VMCMD_MAX_SIZE 240
  1665. static char vmcmd_on_reboot[VMCMD_MAX_SIZE + 1];
  1666. static char vmcmd_on_panic[VMCMD_MAX_SIZE + 1];
  1667. static char vmcmd_on_halt[VMCMD_MAX_SIZE + 1];
  1668. static char vmcmd_on_poff[VMCMD_MAX_SIZE + 1];
  1669. static char vmcmd_on_restart[VMCMD_MAX_SIZE + 1];
  1670. DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot);
  1671. DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic);
  1672. DEFINE_IPL_ATTR_STR_RW(vmcmd, on_halt, "%s\n", "%s\n", vmcmd_on_halt);
  1673. DEFINE_IPL_ATTR_STR_RW(vmcmd, on_poff, "%s\n", "%s\n", vmcmd_on_poff);
  1674. DEFINE_IPL_ATTR_STR_RW(vmcmd, on_restart, "%s\n", "%s\n", vmcmd_on_restart);
  1675. static struct attribute *vmcmd_attrs[] = {
  1676. &sys_vmcmd_on_reboot_attr.attr,
  1677. &sys_vmcmd_on_panic_attr.attr,
  1678. &sys_vmcmd_on_halt_attr.attr,
  1679. &sys_vmcmd_on_poff_attr.attr,
  1680. &sys_vmcmd_on_restart_attr.attr,
  1681. NULL,
  1682. };
  1683. static struct attribute_group vmcmd_attr_group = {
  1684. .attrs = vmcmd_attrs,
  1685. };
  1686. static struct kset *vmcmd_kset;
  1687. static void vmcmd_run(struct shutdown_trigger *trigger)
  1688. {
  1689. char *cmd;
  1690. if (strcmp(trigger->name, ON_REIPL_STR) == 0)
  1691. cmd = vmcmd_on_reboot;
  1692. else if (strcmp(trigger->name, ON_PANIC_STR) == 0)
  1693. cmd = vmcmd_on_panic;
  1694. else if (strcmp(trigger->name, ON_HALT_STR) == 0)
  1695. cmd = vmcmd_on_halt;
  1696. else if (strcmp(trigger->name, ON_POFF_STR) == 0)
  1697. cmd = vmcmd_on_poff;
  1698. else if (strcmp(trigger->name, ON_RESTART_STR) == 0)
  1699. cmd = vmcmd_on_restart;
  1700. else
  1701. return;
  1702. if (strlen(cmd) == 0)
  1703. return;
  1704. __cpcmd(cmd, NULL, 0, NULL);
  1705. }
  1706. static int vmcmd_init(void)
  1707. {
  1708. if (!MACHINE_IS_VM)
  1709. return -EOPNOTSUPP;
  1710. vmcmd_kset = kset_create_and_add("vmcmd", NULL, firmware_kobj);
  1711. if (!vmcmd_kset)
  1712. return -ENOMEM;
  1713. return sysfs_create_group(&vmcmd_kset->kobj, &vmcmd_attr_group);
  1714. }
  1715. static struct shutdown_action vmcmd_action = {SHUTDOWN_ACTION_VMCMD_STR,
  1716. vmcmd_run, vmcmd_init};
  1717. /*
  1718. * stop shutdown action: Stop Linux on shutdown.
  1719. */
  1720. static void stop_run(struct shutdown_trigger *trigger)
  1721. {
  1722. if (strcmp(trigger->name, ON_PANIC_STR) == 0 ||
  1723. strcmp(trigger->name, ON_RESTART_STR) == 0)
  1724. disabled_wait();
  1725. smp_stop_cpu();
  1726. }
  1727. static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR,
  1728. stop_run, NULL};
  1729. /* action list */
  1730. static struct shutdown_action *shutdown_actions_list[] = {
  1731. &ipl_action, &reipl_action, &dump_reipl_action, &dump_action,
  1732. &vmcmd_action, &stop_action};
  1733. #define SHUTDOWN_ACTIONS_COUNT (sizeof(shutdown_actions_list) / sizeof(void *))
  1734. /*
  1735. * Trigger section
  1736. */
  1737. static struct kset *shutdown_actions_kset;
  1738. static int set_trigger(const char *buf, struct shutdown_trigger *trigger,
  1739. size_t len)
  1740. {
  1741. int i;
  1742. for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) {
  1743. if (sysfs_streq(buf, shutdown_actions_list[i]->name)) {
  1744. if (shutdown_actions_list[i]->init_rc) {
  1745. return shutdown_actions_list[i]->init_rc;
  1746. } else {
  1747. trigger->action = shutdown_actions_list[i];
  1748. return len;
  1749. }
  1750. }
  1751. }
  1752. return -EINVAL;
  1753. }
  1754. /* on reipl */
  1755. static struct shutdown_trigger on_reboot_trigger = {ON_REIPL_STR,
  1756. &reipl_action};
  1757. static ssize_t on_reboot_show(struct kobject *kobj,
  1758. struct kobj_attribute *attr, char *page)
  1759. {
  1760. return sprintf(page, "%s\n", on_reboot_trigger.action->name);
  1761. }
  1762. static ssize_t on_reboot_store(struct kobject *kobj,
  1763. struct kobj_attribute *attr,
  1764. const char *buf, size_t len)
  1765. {
  1766. return set_trigger(buf, &on_reboot_trigger, len);
  1767. }
  1768. static struct kobj_attribute on_reboot_attr = __ATTR_RW(on_reboot);
  1769. static void do_machine_restart(char *__unused)
  1770. {
  1771. smp_send_stop();
  1772. on_reboot_trigger.action->fn(&on_reboot_trigger);
  1773. reipl_run(NULL);
  1774. }
  1775. void (*_machine_restart)(char *command) = do_machine_restart;
  1776. /* on panic */
  1777. static struct shutdown_trigger on_panic_trigger = {ON_PANIC_STR, &stop_action};
  1778. static ssize_t on_panic_show(struct kobject *kobj,
  1779. struct kobj_attribute *attr, char *page)
  1780. {
  1781. return sprintf(page, "%s\n", on_panic_trigger.action->name);
  1782. }
  1783. static ssize_t on_panic_store(struct kobject *kobj,
  1784. struct kobj_attribute *attr,
  1785. const char *buf, size_t len)
  1786. {
  1787. return set_trigger(buf, &on_panic_trigger, len);
  1788. }
  1789. static struct kobj_attribute on_panic_attr = __ATTR_RW(on_panic);
  1790. static void do_panic(void)
  1791. {
  1792. lgr_info_log();
  1793. on_panic_trigger.action->fn(&on_panic_trigger);
  1794. stop_run(&on_panic_trigger);
  1795. }
  1796. /* on restart */
  1797. static struct shutdown_trigger on_restart_trigger = {ON_RESTART_STR,
  1798. &stop_action};
  1799. static ssize_t on_restart_show(struct kobject *kobj,
  1800. struct kobj_attribute *attr, char *page)
  1801. {
  1802. return sprintf(page, "%s\n", on_restart_trigger.action->name);
  1803. }
  1804. static ssize_t on_restart_store(struct kobject *kobj,
  1805. struct kobj_attribute *attr,
  1806. const char *buf, size_t len)
  1807. {
  1808. return set_trigger(buf, &on_restart_trigger, len);
  1809. }
  1810. static struct kobj_attribute on_restart_attr = __ATTR_RW(on_restart);
  1811. static void __do_restart(void *ignore)
  1812. {
  1813. smp_send_stop();
  1814. #ifdef CONFIG_CRASH_DUMP
  1815. crash_kexec(NULL);
  1816. #endif
  1817. on_restart_trigger.action->fn(&on_restart_trigger);
  1818. stop_run(&on_restart_trigger);
  1819. }
  1820. void do_restart(void *arg)
  1821. {
  1822. tracing_off();
  1823. debug_locks_off();
  1824. lgr_info_log();
  1825. smp_call_ipl_cpu(__do_restart, arg);
  1826. }
  1827. /* on halt */
  1828. static struct shutdown_trigger on_halt_trigger = {ON_HALT_STR, &stop_action};
  1829. static ssize_t on_halt_show(struct kobject *kobj,
  1830. struct kobj_attribute *attr, char *page)
  1831. {
  1832. return sprintf(page, "%s\n", on_halt_trigger.action->name);
  1833. }
  1834. static ssize_t on_halt_store(struct kobject *kobj,
  1835. struct kobj_attribute *attr,
  1836. const char *buf, size_t len)
  1837. {
  1838. return set_trigger(buf, &on_halt_trigger, len);
  1839. }
  1840. static struct kobj_attribute on_halt_attr = __ATTR_RW(on_halt);
  1841. static void do_machine_halt(void)
  1842. {
  1843. smp_send_stop();
  1844. on_halt_trigger.action->fn(&on_halt_trigger);
  1845. stop_run(&on_halt_trigger);
  1846. }
  1847. void (*_machine_halt)(void) = do_machine_halt;
  1848. /* on power off */
  1849. static struct shutdown_trigger on_poff_trigger = {ON_POFF_STR, &stop_action};
  1850. static ssize_t on_poff_show(struct kobject *kobj,
  1851. struct kobj_attribute *attr, char *page)
  1852. {
  1853. return sprintf(page, "%s\n", on_poff_trigger.action->name);
  1854. }
  1855. static ssize_t on_poff_store(struct kobject *kobj,
  1856. struct kobj_attribute *attr,
  1857. const char *buf, size_t len)
  1858. {
  1859. return set_trigger(buf, &on_poff_trigger, len);
  1860. }
  1861. static struct kobj_attribute on_poff_attr = __ATTR_RW(on_poff);
  1862. static void do_machine_power_off(void)
  1863. {
  1864. smp_send_stop();
  1865. on_poff_trigger.action->fn(&on_poff_trigger);
  1866. stop_run(&on_poff_trigger);
  1867. }
  1868. void (*_machine_power_off)(void) = do_machine_power_off;
  1869. static struct attribute *shutdown_action_attrs[] = {
  1870. &on_restart_attr.attr,
  1871. &on_reboot_attr.attr,
  1872. &on_panic_attr.attr,
  1873. &on_halt_attr.attr,
  1874. &on_poff_attr.attr,
  1875. NULL,
  1876. };
  1877. static struct attribute_group shutdown_action_attr_group = {
  1878. .attrs = shutdown_action_attrs,
  1879. };
  1880. static void __init shutdown_triggers_init(void)
  1881. {
  1882. shutdown_actions_kset = kset_create_and_add("shutdown_actions", NULL,
  1883. firmware_kobj);
  1884. if (!shutdown_actions_kset)
  1885. goto fail;
  1886. if (sysfs_create_group(&shutdown_actions_kset->kobj,
  1887. &shutdown_action_attr_group))
  1888. goto fail;
  1889. return;
  1890. fail:
  1891. panic("shutdown_triggers_init failed\n");
  1892. }
  1893. static void __init shutdown_actions_init(void)
  1894. {
  1895. int i;
  1896. for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) {
  1897. if (!shutdown_actions_list[i]->init)
  1898. continue;
  1899. shutdown_actions_list[i]->init_rc =
  1900. shutdown_actions_list[i]->init();
  1901. }
  1902. }
  1903. static int __init s390_ipl_init(void)
  1904. {
  1905. char str[8] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
  1906. sclp_early_get_ipl_info(&sclp_ipl_info);
  1907. /*
  1908. * Fix loadparm: There are systems where the (SCSI) LOADPARM
  1909. * returned by read SCP info is invalid (contains EBCDIC blanks)
  1910. * when the system has been booted via diag308. In that case we use
  1911. * the value from diag308, if available.
  1912. *
  1913. * There are also systems where diag308 store does not work in
  1914. * case the system is booted from HMC. Fortunately in this case
  1915. * READ SCP info provides the correct value.
  1916. */
  1917. if (memcmp(sclp_ipl_info.loadparm, str, sizeof(str)) == 0 && ipl_block_valid)
  1918. memcpy(sclp_ipl_info.loadparm, ipl_block.ccw.loadparm, LOADPARM_LEN);
  1919. shutdown_actions_init();
  1920. shutdown_triggers_init();
  1921. return 0;
  1922. }
  1923. __initcall(s390_ipl_init);
  1924. static void __init strncpy_skip_quote(char *dst, char *src, int n)
  1925. {
  1926. int sx, dx;
  1927. dx = 0;
  1928. for (sx = 0; src[sx] != 0; sx++) {
  1929. if (src[sx] == '"')
  1930. continue;
  1931. dst[dx++] = src[sx];
  1932. if (dx >= n)
  1933. break;
  1934. }
  1935. }
  1936. static int __init vmcmd_on_reboot_setup(char *str)
  1937. {
  1938. if (!MACHINE_IS_VM)
  1939. return 1;
  1940. strncpy_skip_quote(vmcmd_on_reboot, str, VMCMD_MAX_SIZE);
  1941. vmcmd_on_reboot[VMCMD_MAX_SIZE] = 0;
  1942. on_reboot_trigger.action = &vmcmd_action;
  1943. return 1;
  1944. }
  1945. __setup("vmreboot=", vmcmd_on_reboot_setup);
  1946. static int __init vmcmd_on_panic_setup(char *str)
  1947. {
  1948. if (!MACHINE_IS_VM)
  1949. return 1;
  1950. strncpy_skip_quote(vmcmd_on_panic, str, VMCMD_MAX_SIZE);
  1951. vmcmd_on_panic[VMCMD_MAX_SIZE] = 0;
  1952. on_panic_trigger.action = &vmcmd_action;
  1953. return 1;
  1954. }
  1955. __setup("vmpanic=", vmcmd_on_panic_setup);
  1956. static int __init vmcmd_on_halt_setup(char *str)
  1957. {
  1958. if (!MACHINE_IS_VM)
  1959. return 1;
  1960. strncpy_skip_quote(vmcmd_on_halt, str, VMCMD_MAX_SIZE);
  1961. vmcmd_on_halt[VMCMD_MAX_SIZE] = 0;
  1962. on_halt_trigger.action = &vmcmd_action;
  1963. return 1;
  1964. }
  1965. __setup("vmhalt=", vmcmd_on_halt_setup);
  1966. static int __init vmcmd_on_poff_setup(char *str)
  1967. {
  1968. if (!MACHINE_IS_VM)
  1969. return 1;
  1970. strncpy_skip_quote(vmcmd_on_poff, str, VMCMD_MAX_SIZE);
  1971. vmcmd_on_poff[VMCMD_MAX_SIZE] = 0;
  1972. on_poff_trigger.action = &vmcmd_action;
  1973. return 1;
  1974. }
  1975. __setup("vmpoff=", vmcmd_on_poff_setup);
  1976. static int on_panic_notify(struct notifier_block *self,
  1977. unsigned long event, void *data)
  1978. {
  1979. do_panic();
  1980. return NOTIFY_OK;
  1981. }
  1982. static struct notifier_block on_panic_nb = {
  1983. .notifier_call = on_panic_notify,
  1984. .priority = INT_MIN,
  1985. };
  1986. void __init setup_ipl(void)
  1987. {
  1988. BUILD_BUG_ON(sizeof(struct ipl_parameter_block) != PAGE_SIZE);
  1989. ipl_info.type = get_ipl_type();
  1990. switch (ipl_info.type) {
  1991. case IPL_TYPE_CCW:
  1992. ipl_info.data.ccw.dev_id.ssid = ipl_block.ccw.ssid;
  1993. ipl_info.data.ccw.dev_id.devno = ipl_block.ccw.devno;
  1994. break;
  1995. case IPL_TYPE_ECKD:
  1996. case IPL_TYPE_ECKD_DUMP:
  1997. ipl_info.data.eckd.dev_id.ssid = ipl_block.eckd.ssid;
  1998. ipl_info.data.eckd.dev_id.devno = ipl_block.eckd.devno;
  1999. break;
  2000. case IPL_TYPE_FCP:
  2001. case IPL_TYPE_FCP_DUMP:
  2002. ipl_info.data.fcp.dev_id.ssid = 0;
  2003. ipl_info.data.fcp.dev_id.devno = ipl_block.fcp.devno;
  2004. ipl_info.data.fcp.wwpn = ipl_block.fcp.wwpn;
  2005. ipl_info.data.fcp.lun = ipl_block.fcp.lun;
  2006. break;
  2007. case IPL_TYPE_NVME:
  2008. case IPL_TYPE_NVME_DUMP:
  2009. ipl_info.data.nvme.fid = ipl_block.nvme.fid;
  2010. ipl_info.data.nvme.nsid = ipl_block.nvme.nsid;
  2011. break;
  2012. case IPL_TYPE_NSS:
  2013. case IPL_TYPE_UNKNOWN:
  2014. /* We have no info to copy */
  2015. break;
  2016. }
  2017. atomic_notifier_chain_register(&panic_notifier_list, &on_panic_nb);
  2018. }
  2019. void s390_reset_system(void)
  2020. {
  2021. /* Disable prefixing */
  2022. set_prefix(0);
  2023. /* Disable lowcore protection */
  2024. local_ctl_clear_bit(0, CR0_LOW_ADDRESS_PROTECTION_BIT);
  2025. diag_amode31_ops.diag308_reset();
  2026. }
  2027. #ifdef CONFIG_KEXEC_FILE
  2028. int ipl_report_add_component(struct ipl_report *report, struct kexec_buf *kbuf,
  2029. unsigned char flags, unsigned short cert)
  2030. {
  2031. struct ipl_report_component *comp;
  2032. comp = vzalloc(sizeof(*comp));
  2033. if (!comp)
  2034. return -ENOMEM;
  2035. list_add_tail(&comp->list, &report->components);
  2036. comp->entry.addr = kbuf->mem;
  2037. comp->entry.len = kbuf->memsz;
  2038. comp->entry.flags = flags;
  2039. comp->entry.certificate_index = cert;
  2040. report->size += sizeof(comp->entry);
  2041. return 0;
  2042. }
  2043. int ipl_report_add_certificate(struct ipl_report *report, void *key,
  2044. unsigned long addr, unsigned long len)
  2045. {
  2046. struct ipl_report_certificate *cert;
  2047. cert = vzalloc(sizeof(*cert));
  2048. if (!cert)
  2049. return -ENOMEM;
  2050. list_add_tail(&cert->list, &report->certificates);
  2051. cert->entry.addr = addr;
  2052. cert->entry.len = len;
  2053. cert->key = key;
  2054. report->size += sizeof(cert->entry);
  2055. report->size += cert->entry.len;
  2056. return 0;
  2057. }
  2058. struct ipl_report *ipl_report_init(struct ipl_parameter_block *ipib)
  2059. {
  2060. struct ipl_report *report;
  2061. report = vzalloc(sizeof(*report));
  2062. if (!report)
  2063. return ERR_PTR(-ENOMEM);
  2064. report->ipib = ipib;
  2065. INIT_LIST_HEAD(&report->components);
  2066. INIT_LIST_HEAD(&report->certificates);
  2067. report->size = ALIGN(ipib->hdr.len, 8);
  2068. report->size += sizeof(struct ipl_rl_hdr);
  2069. report->size += sizeof(struct ipl_rb_components);
  2070. report->size += sizeof(struct ipl_rb_certificates);
  2071. return report;
  2072. }
  2073. void *ipl_report_finish(struct ipl_report *report)
  2074. {
  2075. struct ipl_report_certificate *cert;
  2076. struct ipl_report_component *comp;
  2077. struct ipl_rb_certificates *certs;
  2078. struct ipl_parameter_block *ipib;
  2079. struct ipl_rb_components *comps;
  2080. struct ipl_rl_hdr *rl_hdr;
  2081. void *buf, *ptr;
  2082. buf = vzalloc(report->size);
  2083. if (!buf)
  2084. goto out;
  2085. ptr = buf;
  2086. memcpy(ptr, report->ipib, report->ipib->hdr.len);
  2087. ipib = ptr;
  2088. if (ipl_secure_flag)
  2089. ipib->hdr.flags |= IPL_PL_FLAG_SIPL;
  2090. ipib->hdr.flags |= IPL_PL_FLAG_IPLSR;
  2091. ptr += report->ipib->hdr.len;
  2092. ptr = PTR_ALIGN(ptr, 8);
  2093. rl_hdr = ptr;
  2094. ptr += sizeof(*rl_hdr);
  2095. comps = ptr;
  2096. comps->rbt = IPL_RBT_COMPONENTS;
  2097. ptr += sizeof(*comps);
  2098. list_for_each_entry(comp, &report->components, list) {
  2099. memcpy(ptr, &comp->entry, sizeof(comp->entry));
  2100. ptr += sizeof(comp->entry);
  2101. }
  2102. comps->len = ptr - (void *)comps;
  2103. certs = ptr;
  2104. certs->rbt = IPL_RBT_CERTIFICATES;
  2105. ptr += sizeof(*certs);
  2106. list_for_each_entry(cert, &report->certificates, list) {
  2107. memcpy(ptr, &cert->entry, sizeof(cert->entry));
  2108. ptr += sizeof(cert->entry);
  2109. }
  2110. certs->len = ptr - (void *)certs;
  2111. rl_hdr->len = ptr - (void *)rl_hdr;
  2112. list_for_each_entry(cert, &report->certificates, list) {
  2113. memcpy(ptr, cert->key, cert->entry.len);
  2114. ptr += cert->entry.len;
  2115. }
  2116. BUG_ON(ptr > buf + report->size);
  2117. out:
  2118. return buf;
  2119. }
  2120. int ipl_report_free(struct ipl_report *report)
  2121. {
  2122. struct ipl_report_component *comp, *ncomp;
  2123. struct ipl_report_certificate *cert, *ncert;
  2124. list_for_each_entry_safe(comp, ncomp, &report->components, list)
  2125. vfree(comp);
  2126. list_for_each_entry_safe(cert, ncert, &report->certificates, list)
  2127. vfree(cert);
  2128. vfree(report);
  2129. return 0;
  2130. }
  2131. #endif