qdio_setup.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * qdio queue initialization
  4. *
  5. * Copyright IBM Corp. 2008
  6. * Author(s): Jan Glauber <jang@linux.vnet.ibm.com>
  7. */
  8. #include <linux/kernel.h>
  9. #include <linux/slab.h>
  10. #include <linux/export.h>
  11. #include <linux/io.h>
  12. #include <asm/ebcdic.h>
  13. #include <asm/qdio.h>
  14. #include "cio.h"
  15. #include "css.h"
  16. #include "device.h"
  17. #include "ioasm.h"
  18. #include "chsc.h"
  19. #include "qdio.h"
  20. #include "qdio_debug.h"
  21. #define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer))
  22. static struct kmem_cache *qdio_q_cache;
  23. /**
  24. * qdio_free_buffers() - free qdio buffers
  25. * @buf: array of pointers to qdio buffers
  26. * @count: number of qdio buffers to free
  27. */
  28. void qdio_free_buffers(struct qdio_buffer **buf, unsigned int count)
  29. {
  30. int pos;
  31. for (pos = 0; pos < count; pos += QBUFF_PER_PAGE)
  32. free_page((unsigned long) buf[pos]);
  33. }
  34. EXPORT_SYMBOL_GPL(qdio_free_buffers);
  35. /**
  36. * qdio_alloc_buffers() - allocate qdio buffers
  37. * @buf: array of pointers to qdio buffers
  38. * @count: number of qdio buffers to allocate
  39. */
  40. int qdio_alloc_buffers(struct qdio_buffer **buf, unsigned int count)
  41. {
  42. int pos;
  43. for (pos = 0; pos < count; pos += QBUFF_PER_PAGE) {
  44. buf[pos] = (void *) get_zeroed_page(GFP_KERNEL);
  45. if (!buf[pos]) {
  46. qdio_free_buffers(buf, count);
  47. return -ENOMEM;
  48. }
  49. }
  50. for (pos = 0; pos < count; pos++)
  51. if (pos % QBUFF_PER_PAGE)
  52. buf[pos] = buf[pos - 1] + 1;
  53. return 0;
  54. }
  55. EXPORT_SYMBOL_GPL(qdio_alloc_buffers);
  56. /**
  57. * qdio_reset_buffers() - reset qdio buffers
  58. * @buf: array of pointers to qdio buffers
  59. * @count: number of qdio buffers that will be zeroed
  60. */
  61. void qdio_reset_buffers(struct qdio_buffer **buf, unsigned int count)
  62. {
  63. int pos;
  64. for (pos = 0; pos < count; pos++)
  65. memset(buf[pos], 0, sizeof(struct qdio_buffer));
  66. }
  67. EXPORT_SYMBOL_GPL(qdio_reset_buffers);
  68. static void __qdio_free_queues(struct qdio_q **queues, unsigned int count)
  69. {
  70. struct qdio_q *q;
  71. unsigned int i;
  72. for (i = 0; i < count; i++) {
  73. q = queues[i];
  74. free_page((unsigned long) q->slib);
  75. kmem_cache_free(qdio_q_cache, q);
  76. }
  77. }
  78. void qdio_free_queues(struct qdio_irq *irq_ptr)
  79. {
  80. __qdio_free_queues(irq_ptr->input_qs, irq_ptr->max_input_qs);
  81. irq_ptr->max_input_qs = 0;
  82. __qdio_free_queues(irq_ptr->output_qs, irq_ptr->max_output_qs);
  83. irq_ptr->max_output_qs = 0;
  84. }
  85. static int __qdio_allocate_qs(struct qdio_q **irq_ptr_qs, int nr_queues)
  86. {
  87. struct qdio_q *q;
  88. int i;
  89. for (i = 0; i < nr_queues; i++) {
  90. q = kmem_cache_zalloc(qdio_q_cache, GFP_KERNEL);
  91. if (!q) {
  92. __qdio_free_queues(irq_ptr_qs, i);
  93. return -ENOMEM;
  94. }
  95. q->slib = (struct slib *) __get_free_page(GFP_KERNEL);
  96. if (!q->slib) {
  97. kmem_cache_free(qdio_q_cache, q);
  98. __qdio_free_queues(irq_ptr_qs, i);
  99. return -ENOMEM;
  100. }
  101. irq_ptr_qs[i] = q;
  102. }
  103. return 0;
  104. }
  105. int qdio_allocate_qs(struct qdio_irq *irq_ptr, int nr_input_qs, int nr_output_qs)
  106. {
  107. int rc;
  108. rc = __qdio_allocate_qs(irq_ptr->input_qs, nr_input_qs);
  109. if (rc)
  110. return rc;
  111. rc = __qdio_allocate_qs(irq_ptr->output_qs, nr_output_qs);
  112. if (rc) {
  113. __qdio_free_queues(irq_ptr->input_qs, nr_input_qs);
  114. return rc;
  115. }
  116. irq_ptr->max_input_qs = nr_input_qs;
  117. irq_ptr->max_output_qs = nr_output_qs;
  118. return 0;
  119. }
  120. static void setup_queues_misc(struct qdio_q *q, struct qdio_irq *irq_ptr,
  121. qdio_handler_t *handler, int i)
  122. {
  123. struct slib *slib = q->slib;
  124. /* queue must be cleared for qdio_establish */
  125. memset(q, 0, sizeof(*q));
  126. memset(slib, 0, PAGE_SIZE);
  127. q->slib = slib;
  128. q->irq_ptr = irq_ptr;
  129. q->mask = 1 << (31 - i);
  130. q->nr = i;
  131. q->handler = handler;
  132. }
  133. static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr,
  134. struct qdio_buffer **sbals_array, int i)
  135. {
  136. struct qdio_q *prev;
  137. int j;
  138. DBF_HEX(&q, sizeof(void *));
  139. q->sl = (struct sl *)((char *)q->slib + PAGE_SIZE / 2);
  140. /* fill in sbal */
  141. for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++)
  142. q->sbal[j] = *sbals_array++;
  143. /* fill in slib */
  144. if (i > 0) {
  145. prev = (q->is_input_q) ? irq_ptr->input_qs[i - 1]
  146. : irq_ptr->output_qs[i - 1];
  147. prev->slib->nsliba = (unsigned long)q->slib;
  148. }
  149. q->slib->sla = (unsigned long)q->sl;
  150. q->slib->slsba = (unsigned long)&q->slsb.val[0];
  151. /* fill in sl */
  152. for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++)
  153. q->sl->element[j].sbal = virt_to_dma64(q->sbal[j]);
  154. }
  155. static void setup_queues(struct qdio_irq *irq_ptr,
  156. struct qdio_initialize *qdio_init)
  157. {
  158. struct qdio_q *q;
  159. int i;
  160. for_each_input_queue(irq_ptr, q, i) {
  161. DBF_EVENT("inq:%1d", i);
  162. setup_queues_misc(q, irq_ptr, qdio_init->input_handler, i);
  163. q->is_input_q = 1;
  164. setup_storage_lists(q, irq_ptr,
  165. qdio_init->input_sbal_addr_array[i], i);
  166. }
  167. for_each_output_queue(irq_ptr, q, i) {
  168. DBF_EVENT("outq:%1d", i);
  169. setup_queues_misc(q, irq_ptr, qdio_init->output_handler, i);
  170. q->is_input_q = 0;
  171. setup_storage_lists(q, irq_ptr,
  172. qdio_init->output_sbal_addr_array[i], i);
  173. }
  174. }
  175. static void check_and_setup_qebsm(struct qdio_irq *irq_ptr,
  176. unsigned char qdioac, unsigned long token)
  177. {
  178. if (!(irq_ptr->qib.rflags & QIB_RFLAGS_ENABLE_QEBSM))
  179. goto no_qebsm;
  180. if (!(qdioac & AC1_SC_QEBSM_AVAILABLE) ||
  181. (!(qdioac & AC1_SC_QEBSM_ENABLED)))
  182. goto no_qebsm;
  183. irq_ptr->sch_token = token;
  184. DBF_EVENT("V=V:1");
  185. DBF_EVENT("%8lx", irq_ptr->sch_token);
  186. return;
  187. no_qebsm:
  188. irq_ptr->sch_token = 0;
  189. irq_ptr->qib.rflags &= ~QIB_RFLAGS_ENABLE_QEBSM;
  190. DBF_EVENT("noV=V");
  191. }
  192. /*
  193. * If there is a qdio_irq we use the chsc_page and store the information
  194. * in the qdio_irq, otherwise we copy it to the specified structure.
  195. */
  196. int qdio_setup_get_ssqd(struct qdio_irq *irq_ptr,
  197. struct subchannel_id *schid,
  198. struct qdio_ssqd_desc *data)
  199. {
  200. struct chsc_ssqd_area *ssqd;
  201. int rc;
  202. DBF_EVENT("getssqd:%4x", schid->sch_no);
  203. if (!irq_ptr) {
  204. ssqd = (struct chsc_ssqd_area *)__get_free_page(GFP_KERNEL);
  205. if (!ssqd)
  206. return -ENOMEM;
  207. } else {
  208. ssqd = (struct chsc_ssqd_area *)irq_ptr->chsc_page;
  209. }
  210. rc = chsc_ssqd(*schid, ssqd);
  211. if (rc)
  212. goto out;
  213. if (!(ssqd->qdio_ssqd.flags & CHSC_FLAG_QDIO_CAPABILITY) ||
  214. !(ssqd->qdio_ssqd.flags & CHSC_FLAG_VALIDITY) ||
  215. (ssqd->qdio_ssqd.sch != schid->sch_no))
  216. rc = -EINVAL;
  217. if (!rc)
  218. memcpy(data, &ssqd->qdio_ssqd, sizeof(*data));
  219. out:
  220. if (!irq_ptr)
  221. free_page((unsigned long)ssqd);
  222. return rc;
  223. }
  224. void qdio_setup_ssqd_info(struct qdio_irq *irq_ptr)
  225. {
  226. unsigned char qdioac;
  227. int rc;
  228. rc = qdio_setup_get_ssqd(irq_ptr, &irq_ptr->schid, &irq_ptr->ssqd_desc);
  229. if (rc) {
  230. DBF_ERROR("%4x ssqd ERR", irq_ptr->schid.sch_no);
  231. DBF_ERROR("rc:%x", rc);
  232. /* all flags set, worst case */
  233. qdioac = AC1_SIGA_INPUT_NEEDED | AC1_SIGA_OUTPUT_NEEDED |
  234. AC1_SIGA_SYNC_NEEDED;
  235. } else
  236. qdioac = irq_ptr->ssqd_desc.qdioac1;
  237. check_and_setup_qebsm(irq_ptr, qdioac, irq_ptr->ssqd_desc.sch_token);
  238. irq_ptr->qdioac1 = qdioac;
  239. DBF_EVENT("ac 1:%2x 2:%4x", qdioac, irq_ptr->ssqd_desc.qdioac2);
  240. DBF_EVENT("3:%4x qib:%4x", irq_ptr->ssqd_desc.qdioac3, irq_ptr->qib.ac);
  241. }
  242. static void qdio_fill_qdr_desc(struct qdesfmt0 *desc, struct qdio_q *queue)
  243. {
  244. desc->sliba = virt_to_dma64(queue->slib);
  245. desc->sla = virt_to_dma64(queue->sl);
  246. desc->slsba = virt_to_dma64(&queue->slsb);
  247. desc->akey = PAGE_DEFAULT_KEY >> 4;
  248. desc->bkey = PAGE_DEFAULT_KEY >> 4;
  249. desc->ckey = PAGE_DEFAULT_KEY >> 4;
  250. desc->dkey = PAGE_DEFAULT_KEY >> 4;
  251. }
  252. static void setup_qdr(struct qdio_irq *irq_ptr,
  253. struct qdio_initialize *qdio_init)
  254. {
  255. struct qdesfmt0 *desc = &irq_ptr->qdr->qdf0[0];
  256. int i;
  257. memset(irq_ptr->qdr, 0, sizeof(struct qdr));
  258. irq_ptr->qdr->qfmt = qdio_init->q_format;
  259. irq_ptr->qdr->ac = qdio_init->qdr_ac;
  260. irq_ptr->qdr->iqdcnt = qdio_init->no_input_qs;
  261. irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs;
  262. irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */
  263. irq_ptr->qdr->oqdsz = sizeof(struct qdesfmt0) / 4;
  264. irq_ptr->qdr->qiba = virt_to_dma64(&irq_ptr->qib);
  265. irq_ptr->qdr->qkey = PAGE_DEFAULT_KEY >> 4;
  266. for (i = 0; i < qdio_init->no_input_qs; i++)
  267. qdio_fill_qdr_desc(desc++, irq_ptr->input_qs[i]);
  268. for (i = 0; i < qdio_init->no_output_qs; i++)
  269. qdio_fill_qdr_desc(desc++, irq_ptr->output_qs[i]);
  270. }
  271. static void setup_qib(struct qdio_irq *irq_ptr,
  272. struct qdio_initialize *init_data)
  273. {
  274. memset(&irq_ptr->qib, 0, sizeof(irq_ptr->qib));
  275. irq_ptr->qib.qfmt = init_data->q_format;
  276. irq_ptr->qib.pfmt = init_data->qib_param_field_format;
  277. irq_ptr->qib.rflags = init_data->qib_rflags;
  278. if (css_general_characteristics.qebsm)
  279. irq_ptr->qib.rflags |= QIB_RFLAGS_ENABLE_QEBSM;
  280. if (init_data->no_input_qs)
  281. irq_ptr->qib.isliba =
  282. (unsigned long)(irq_ptr->input_qs[0]->slib);
  283. if (init_data->no_output_qs)
  284. irq_ptr->qib.osliba =
  285. (unsigned long)(irq_ptr->output_qs[0]->slib);
  286. memcpy(irq_ptr->qib.ebcnam, dev_name(&irq_ptr->cdev->dev), 8);
  287. ASCEBC(irq_ptr->qib.ebcnam, 8);
  288. if (init_data->qib_param_field)
  289. memcpy(irq_ptr->qib.parm, init_data->qib_param_field,
  290. sizeof(irq_ptr->qib.parm));
  291. }
  292. void qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data)
  293. {
  294. struct ccw_device *cdev = irq_ptr->cdev;
  295. irq_ptr->qdioac1 = 0;
  296. memset(&irq_ptr->ssqd_desc, 0, sizeof(irq_ptr->ssqd_desc));
  297. memset(&irq_ptr->perf_stat, 0, sizeof(irq_ptr->perf_stat));
  298. irq_ptr->debugfs_dev = NULL;
  299. irq_ptr->sch_token = irq_ptr->perf_stat_enabled = 0;
  300. irq_ptr->state = QDIO_IRQ_STATE_INACTIVE;
  301. irq_ptr->error_handler = init_data->input_handler;
  302. irq_ptr->int_parm = init_data->int_parm;
  303. irq_ptr->nr_input_qs = init_data->no_input_qs;
  304. irq_ptr->nr_output_qs = init_data->no_output_qs;
  305. ccw_device_get_schid(cdev, &irq_ptr->schid);
  306. setup_queues(irq_ptr, init_data);
  307. irq_ptr->irq_poll = init_data->irq_poll;
  308. set_bit(QDIO_IRQ_DISABLED, &irq_ptr->poll_state);
  309. setup_qib(irq_ptr, init_data);
  310. /* fill input and output descriptors */
  311. setup_qdr(irq_ptr, init_data);
  312. /* qdr, qib, sls, slsbs, slibs, sbales are filled now */
  313. /* set our IRQ handler */
  314. spin_lock_irq(get_ccwdev_lock(cdev));
  315. irq_ptr->orig_handler = cdev->handler;
  316. cdev->handler = qdio_int_handler;
  317. spin_unlock_irq(get_ccwdev_lock(cdev));
  318. }
  319. void qdio_shutdown_irq(struct qdio_irq *irq)
  320. {
  321. struct ccw_device *cdev = irq->cdev;
  322. /* restore IRQ handler */
  323. spin_lock_irq(get_ccwdev_lock(cdev));
  324. cdev->handler = irq->orig_handler;
  325. cdev->private->intparm = 0;
  326. spin_unlock_irq(get_ccwdev_lock(cdev));
  327. }
  328. void qdio_print_subchannel_info(struct qdio_irq *irq_ptr)
  329. {
  330. dev_info(&irq_ptr->cdev->dev,
  331. "qdio: %s on SC %x using AI:%d QEBSM:%d PRI:%d TDD:%d SIGA:%s%s%s\n",
  332. (irq_ptr->qib.qfmt == QDIO_QETH_QFMT) ? "OSA" :
  333. ((irq_ptr->qib.qfmt == QDIO_ZFCP_QFMT) ? "ZFCP" : "HS"),
  334. irq_ptr->schid.sch_no,
  335. is_thinint_irq(irq_ptr),
  336. (irq_ptr->sch_token) ? 1 : 0,
  337. pci_out_supported(irq_ptr) ? 1 : 0,
  338. css_general_characteristics.aif_tdd,
  339. qdio_need_siga_in(irq_ptr) ? "R" : " ",
  340. qdio_need_siga_out(irq_ptr) ? "W" : " ",
  341. qdio_need_siga_sync(irq_ptr) ? "S" : " ");
  342. }
  343. int __init qdio_setup_init(void)
  344. {
  345. qdio_q_cache = kmem_cache_create("qdio_q", sizeof(struct qdio_q),
  346. 256, 0, NULL);
  347. if (!qdio_q_cache)
  348. return -ENOMEM;
  349. /* Check for OSA/FCP thin interrupts (bit 67). */
  350. DBF_EVENT("thinint:%1d",
  351. (css_general_characteristics.aif_osa) ? 1 : 0);
  352. /* Check for QEBSM support in general (bit 58). */
  353. DBF_EVENT("cssQEBSM:%1d", css_general_characteristics.qebsm);
  354. return 0;
  355. }
  356. void qdio_setup_exit(void)
  357. {
  358. kmem_cache_destroy(qdio_q_cache);
  359. }