dma.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  1. /*
  2. * Filename: dma.c
  3. *
  4. *
  5. * Authors: Joshua Morris <josh.h.morris@us.ibm.com>
  6. * Philip Kelleher <pjk1939@linux.vnet.ibm.com>
  7. *
  8. * (C) Copyright 2013 IBM Corporation
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License as
  12. * published by the Free Software Foundation; either version 2 of the
  13. * License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful, but
  16. * WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software Foundation,
  22. * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  23. */
  24. #include <linux/slab.h>
  25. #include "rsxx_priv.h"
  26. struct rsxx_dma {
  27. struct list_head list;
  28. u8 cmd;
  29. unsigned int laddr; /* Logical address */
  30. struct {
  31. u32 off;
  32. u32 cnt;
  33. } sub_page;
  34. dma_addr_t dma_addr;
  35. struct page *page;
  36. unsigned int pg_off; /* Page Offset */
  37. rsxx_dma_cb cb;
  38. void *cb_data;
  39. };
  40. /* This timeout is used to detect a stalled DMA channel */
  41. #define DMA_ACTIVITY_TIMEOUT msecs_to_jiffies(10000)
  42. struct hw_status {
  43. u8 status;
  44. u8 tag;
  45. __le16 count;
  46. __le32 _rsvd2;
  47. __le64 _rsvd3;
  48. } __packed;
  49. enum rsxx_dma_status {
  50. DMA_SW_ERR = 0x1,
  51. DMA_HW_FAULT = 0x2,
  52. DMA_CANCELLED = 0x4,
  53. };
  54. struct hw_cmd {
  55. u8 command;
  56. u8 tag;
  57. u8 _rsvd;
  58. u8 sub_page; /* Bit[0:2]: 512byte offset */
  59. /* Bit[4:6]: 512byte count */
  60. __le32 device_addr;
  61. __le64 host_addr;
  62. } __packed;
  63. enum rsxx_hw_cmd {
  64. HW_CMD_BLK_DISCARD = 0x70,
  65. HW_CMD_BLK_WRITE = 0x80,
  66. HW_CMD_BLK_READ = 0xC0,
  67. HW_CMD_BLK_RECON_READ = 0xE0,
  68. };
  69. enum rsxx_hw_status {
  70. HW_STATUS_CRC = 0x01,
  71. HW_STATUS_HARD_ERR = 0x02,
  72. HW_STATUS_SOFT_ERR = 0x04,
  73. HW_STATUS_FAULT = 0x08,
  74. };
  75. static struct kmem_cache *rsxx_dma_pool;
  76. struct dma_tracker {
  77. int next_tag;
  78. struct rsxx_dma *dma;
  79. };
  80. #define DMA_TRACKER_LIST_SIZE8 (sizeof(struct dma_tracker_list) + \
  81. (sizeof(struct dma_tracker) * RSXX_MAX_OUTSTANDING_CMDS))
  82. struct dma_tracker_list {
  83. spinlock_t lock;
  84. int head;
  85. struct dma_tracker list[0];
  86. };
  87. /*----------------- Misc Utility Functions -------------------*/
  88. static unsigned int rsxx_addr8_to_laddr(u64 addr8, struct rsxx_cardinfo *card)
  89. {
  90. unsigned long long tgt_addr8;
  91. tgt_addr8 = ((addr8 >> card->_stripe.upper_shift) &
  92. card->_stripe.upper_mask) |
  93. ((addr8) & card->_stripe.lower_mask);
  94. do_div(tgt_addr8, RSXX_HW_BLK_SIZE);
  95. return tgt_addr8;
  96. }
  97. static unsigned int rsxx_get_dma_tgt(struct rsxx_cardinfo *card, u64 addr8)
  98. {
  99. unsigned int tgt;
  100. tgt = (addr8 >> card->_stripe.target_shift) & card->_stripe.target_mask;
  101. return tgt;
  102. }
  103. void rsxx_dma_queue_reset(struct rsxx_cardinfo *card)
  104. {
  105. /* Reset all DMA Command/Status Queues */
  106. iowrite32(DMA_QUEUE_RESET, card->regmap + RESET);
  107. }
  108. static unsigned int get_dma_size(struct rsxx_dma *dma)
  109. {
  110. if (dma->sub_page.cnt)
  111. return dma->sub_page.cnt << 9;
  112. else
  113. return RSXX_HW_BLK_SIZE;
  114. }
  115. /*----------------- DMA Tracker -------------------*/
  116. static void set_tracker_dma(struct dma_tracker_list *trackers,
  117. int tag,
  118. struct rsxx_dma *dma)
  119. {
  120. trackers->list[tag].dma = dma;
  121. }
  122. static struct rsxx_dma *get_tracker_dma(struct dma_tracker_list *trackers,
  123. int tag)
  124. {
  125. return trackers->list[tag].dma;
  126. }
  127. static int pop_tracker(struct dma_tracker_list *trackers)
  128. {
  129. int tag;
  130. spin_lock(&trackers->lock);
  131. tag = trackers->head;
  132. if (tag != -1) {
  133. trackers->head = trackers->list[tag].next_tag;
  134. trackers->list[tag].next_tag = -1;
  135. }
  136. spin_unlock(&trackers->lock);
  137. return tag;
  138. }
  139. static void push_tracker(struct dma_tracker_list *trackers, int tag)
  140. {
  141. spin_lock(&trackers->lock);
  142. trackers->list[tag].next_tag = trackers->head;
  143. trackers->head = tag;
  144. trackers->list[tag].dma = NULL;
  145. spin_unlock(&trackers->lock);
  146. }
  147. /*----------------- Interrupt Coalescing -------------*/
  148. /*
  149. * Interrupt Coalescing Register Format:
  150. * Interrupt Timer (64ns units) [15:0]
  151. * Interrupt Count [24:16]
  152. * Reserved [31:25]
  153. */
  154. #define INTR_COAL_LATENCY_MASK (0x0000ffff)
  155. #define INTR_COAL_COUNT_SHIFT 16
  156. #define INTR_COAL_COUNT_BITS 9
  157. #define INTR_COAL_COUNT_MASK (((1 << INTR_COAL_COUNT_BITS) - 1) << \
  158. INTR_COAL_COUNT_SHIFT)
  159. #define INTR_COAL_LATENCY_UNITS_NS 64
  160. static u32 dma_intr_coal_val(u32 mode, u32 count, u32 latency)
  161. {
  162. u32 latency_units = latency / INTR_COAL_LATENCY_UNITS_NS;
  163. if (mode == RSXX_INTR_COAL_DISABLED)
  164. return 0;
  165. return ((count << INTR_COAL_COUNT_SHIFT) & INTR_COAL_COUNT_MASK) |
  166. (latency_units & INTR_COAL_LATENCY_MASK);
  167. }
  168. static void dma_intr_coal_auto_tune(struct rsxx_cardinfo *card)
  169. {
  170. int i;
  171. u32 q_depth = 0;
  172. u32 intr_coal;
  173. if (card->config.data.intr_coal.mode != RSXX_INTR_COAL_AUTO_TUNE ||
  174. unlikely(card->eeh_state))
  175. return;
  176. for (i = 0; i < card->n_targets; i++)
  177. q_depth += atomic_read(&card->ctrl[i].stats.hw_q_depth);
  178. intr_coal = dma_intr_coal_val(card->config.data.intr_coal.mode,
  179. q_depth / 2,
  180. card->config.data.intr_coal.latency);
  181. iowrite32(intr_coal, card->regmap + INTR_COAL);
  182. }
  183. /*----------------- RSXX DMA Handling -------------------*/
  184. static void rsxx_free_dma(struct rsxx_dma_ctrl *ctrl, struct rsxx_dma *dma)
  185. {
  186. if (!pci_dma_mapping_error(ctrl->card->dev, dma->dma_addr)) {
  187. pci_unmap_page(ctrl->card->dev, dma->dma_addr,
  188. get_dma_size(dma),
  189. dma->cmd == HW_CMD_BLK_WRITE ?
  190. PCI_DMA_TODEVICE :
  191. PCI_DMA_FROMDEVICE);
  192. }
  193. kmem_cache_free(rsxx_dma_pool, dma);
  194. }
  195. static void rsxx_complete_dma(struct rsxx_dma_ctrl *ctrl,
  196. struct rsxx_dma *dma,
  197. unsigned int status)
  198. {
  199. if (status & DMA_SW_ERR)
  200. ctrl->stats.dma_sw_err++;
  201. if (status & DMA_HW_FAULT)
  202. ctrl->stats.dma_hw_fault++;
  203. if (status & DMA_CANCELLED)
  204. ctrl->stats.dma_cancelled++;
  205. if (dma->cb)
  206. dma->cb(ctrl->card, dma->cb_data, status ? 1 : 0);
  207. rsxx_free_dma(ctrl, dma);
  208. }
  209. int rsxx_cleanup_dma_queue(struct rsxx_dma_ctrl *ctrl,
  210. struct list_head *q, unsigned int done)
  211. {
  212. struct rsxx_dma *dma;
  213. struct rsxx_dma *tmp;
  214. int cnt = 0;
  215. list_for_each_entry_safe(dma, tmp, q, list) {
  216. list_del(&dma->list);
  217. if (done & COMPLETE_DMA)
  218. rsxx_complete_dma(ctrl, dma, DMA_CANCELLED);
  219. else
  220. rsxx_free_dma(ctrl, dma);
  221. cnt++;
  222. }
  223. return cnt;
  224. }
  225. static void rsxx_requeue_dma(struct rsxx_dma_ctrl *ctrl,
  226. struct rsxx_dma *dma)
  227. {
  228. /*
  229. * Requeued DMAs go to the front of the queue so they are issued
  230. * first.
  231. */
  232. spin_lock_bh(&ctrl->queue_lock);
  233. ctrl->stats.sw_q_depth++;
  234. list_add(&dma->list, &ctrl->queue);
  235. spin_unlock_bh(&ctrl->queue_lock);
  236. }
  237. static void rsxx_handle_dma_error(struct rsxx_dma_ctrl *ctrl,
  238. struct rsxx_dma *dma,
  239. u8 hw_st)
  240. {
  241. unsigned int status = 0;
  242. int requeue_cmd = 0;
  243. dev_dbg(CARD_TO_DEV(ctrl->card),
  244. "Handling DMA error(cmd x%02x, laddr x%08x st:x%02x)\n",
  245. dma->cmd, dma->laddr, hw_st);
  246. if (hw_st & HW_STATUS_CRC)
  247. ctrl->stats.crc_errors++;
  248. if (hw_st & HW_STATUS_HARD_ERR)
  249. ctrl->stats.hard_errors++;
  250. if (hw_st & HW_STATUS_SOFT_ERR)
  251. ctrl->stats.soft_errors++;
  252. switch (dma->cmd) {
  253. case HW_CMD_BLK_READ:
  254. if (hw_st & (HW_STATUS_CRC | HW_STATUS_HARD_ERR)) {
  255. if (ctrl->card->scrub_hard) {
  256. dma->cmd = HW_CMD_BLK_RECON_READ;
  257. requeue_cmd = 1;
  258. ctrl->stats.reads_retried++;
  259. } else {
  260. status |= DMA_HW_FAULT;
  261. ctrl->stats.reads_failed++;
  262. }
  263. } else if (hw_st & HW_STATUS_FAULT) {
  264. status |= DMA_HW_FAULT;
  265. ctrl->stats.reads_failed++;
  266. }
  267. break;
  268. case HW_CMD_BLK_RECON_READ:
  269. if (hw_st & (HW_STATUS_CRC | HW_STATUS_HARD_ERR)) {
  270. /* Data could not be reconstructed. */
  271. status |= DMA_HW_FAULT;
  272. ctrl->stats.reads_failed++;
  273. }
  274. break;
  275. case HW_CMD_BLK_WRITE:
  276. status |= DMA_HW_FAULT;
  277. ctrl->stats.writes_failed++;
  278. break;
  279. case HW_CMD_BLK_DISCARD:
  280. status |= DMA_HW_FAULT;
  281. ctrl->stats.discards_failed++;
  282. break;
  283. default:
  284. dev_err(CARD_TO_DEV(ctrl->card),
  285. "Unknown command in DMA!(cmd: x%02x "
  286. "laddr x%08x st: x%02x\n",
  287. dma->cmd, dma->laddr, hw_st);
  288. status |= DMA_SW_ERR;
  289. break;
  290. }
  291. if (requeue_cmd)
  292. rsxx_requeue_dma(ctrl, dma);
  293. else
  294. rsxx_complete_dma(ctrl, dma, status);
  295. }
  296. static void dma_engine_stalled(unsigned long data)
  297. {
  298. struct rsxx_dma_ctrl *ctrl = (struct rsxx_dma_ctrl *)data;
  299. int cnt;
  300. if (atomic_read(&ctrl->stats.hw_q_depth) == 0 ||
  301. unlikely(ctrl->card->eeh_state))
  302. return;
  303. if (ctrl->cmd.idx != ioread32(ctrl->regmap + SW_CMD_IDX)) {
  304. /*
  305. * The dma engine was stalled because the SW_CMD_IDX write
  306. * was lost. Issue it again to recover.
  307. */
  308. dev_warn(CARD_TO_DEV(ctrl->card),
  309. "SW_CMD_IDX write was lost, re-writing...\n");
  310. iowrite32(ctrl->cmd.idx, ctrl->regmap + SW_CMD_IDX);
  311. mod_timer(&ctrl->activity_timer,
  312. jiffies + DMA_ACTIVITY_TIMEOUT);
  313. } else {
  314. dev_warn(CARD_TO_DEV(ctrl->card),
  315. "DMA channel %d has stalled, faulting interface.\n",
  316. ctrl->id);
  317. ctrl->card->dma_fault = 1;
  318. /* Clean up the DMA queue */
  319. spin_lock(&ctrl->queue_lock);
  320. cnt = rsxx_cleanup_dma_queue(ctrl, &ctrl->queue, COMPLETE_DMA);
  321. spin_unlock(&ctrl->queue_lock);
  322. cnt += rsxx_dma_cancel(ctrl);
  323. if (cnt)
  324. dev_info(CARD_TO_DEV(ctrl->card),
  325. "Freed %d queued DMAs on channel %d\n",
  326. cnt, ctrl->id);
  327. }
  328. }
  329. static void rsxx_issue_dmas(struct rsxx_dma_ctrl *ctrl)
  330. {
  331. struct rsxx_dma *dma;
  332. int tag;
  333. int cmds_pending = 0;
  334. struct hw_cmd *hw_cmd_buf;
  335. hw_cmd_buf = ctrl->cmd.buf;
  336. if (unlikely(ctrl->card->halt) ||
  337. unlikely(ctrl->card->eeh_state))
  338. return;
  339. while (1) {
  340. spin_lock_bh(&ctrl->queue_lock);
  341. if (list_empty(&ctrl->queue)) {
  342. spin_unlock_bh(&ctrl->queue_lock);
  343. break;
  344. }
  345. spin_unlock_bh(&ctrl->queue_lock);
  346. tag = pop_tracker(ctrl->trackers);
  347. if (tag == -1)
  348. break;
  349. spin_lock_bh(&ctrl->queue_lock);
  350. dma = list_entry(ctrl->queue.next, struct rsxx_dma, list);
  351. list_del(&dma->list);
  352. ctrl->stats.sw_q_depth--;
  353. spin_unlock_bh(&ctrl->queue_lock);
  354. /*
  355. * This will catch any DMAs that slipped in right before the
  356. * fault, but was queued after all the other DMAs were
  357. * cancelled.
  358. */
  359. if (unlikely(ctrl->card->dma_fault)) {
  360. push_tracker(ctrl->trackers, tag);
  361. rsxx_complete_dma(ctrl, dma, DMA_CANCELLED);
  362. continue;
  363. }
  364. set_tracker_dma(ctrl->trackers, tag, dma);
  365. hw_cmd_buf[ctrl->cmd.idx].command = dma->cmd;
  366. hw_cmd_buf[ctrl->cmd.idx].tag = tag;
  367. hw_cmd_buf[ctrl->cmd.idx]._rsvd = 0;
  368. hw_cmd_buf[ctrl->cmd.idx].sub_page =
  369. ((dma->sub_page.cnt & 0x7) << 4) |
  370. (dma->sub_page.off & 0x7);
  371. hw_cmd_buf[ctrl->cmd.idx].device_addr =
  372. cpu_to_le32(dma->laddr);
  373. hw_cmd_buf[ctrl->cmd.idx].host_addr =
  374. cpu_to_le64(dma->dma_addr);
  375. dev_dbg(CARD_TO_DEV(ctrl->card),
  376. "Issue DMA%d(laddr %d tag %d) to idx %d\n",
  377. ctrl->id, dma->laddr, tag, ctrl->cmd.idx);
  378. ctrl->cmd.idx = (ctrl->cmd.idx + 1) & RSXX_CS_IDX_MASK;
  379. cmds_pending++;
  380. if (dma->cmd == HW_CMD_BLK_WRITE)
  381. ctrl->stats.writes_issued++;
  382. else if (dma->cmd == HW_CMD_BLK_DISCARD)
  383. ctrl->stats.discards_issued++;
  384. else
  385. ctrl->stats.reads_issued++;
  386. }
  387. /* Let HW know we've queued commands. */
  388. if (cmds_pending) {
  389. atomic_add(cmds_pending, &ctrl->stats.hw_q_depth);
  390. mod_timer(&ctrl->activity_timer,
  391. jiffies + DMA_ACTIVITY_TIMEOUT);
  392. if (unlikely(ctrl->card->eeh_state)) {
  393. del_timer_sync(&ctrl->activity_timer);
  394. return;
  395. }
  396. iowrite32(ctrl->cmd.idx, ctrl->regmap + SW_CMD_IDX);
  397. }
  398. }
  399. static void rsxx_dma_done(struct rsxx_dma_ctrl *ctrl)
  400. {
  401. struct rsxx_dma *dma;
  402. unsigned long flags;
  403. u16 count;
  404. u8 status;
  405. u8 tag;
  406. struct hw_status *hw_st_buf;
  407. hw_st_buf = ctrl->status.buf;
  408. if (unlikely(ctrl->card->halt) ||
  409. unlikely(ctrl->card->dma_fault) ||
  410. unlikely(ctrl->card->eeh_state))
  411. return;
  412. count = le16_to_cpu(hw_st_buf[ctrl->status.idx].count);
  413. while (count == ctrl->e_cnt) {
  414. /*
  415. * The read memory-barrier is necessary to keep aggressive
  416. * processors/optimizers (such as the PPC Apple G5) from
  417. * reordering the following status-buffer tag & status read
  418. * *before* the count read on subsequent iterations of the
  419. * loop!
  420. */
  421. rmb();
  422. status = hw_st_buf[ctrl->status.idx].status;
  423. tag = hw_st_buf[ctrl->status.idx].tag;
  424. dma = get_tracker_dma(ctrl->trackers, tag);
  425. if (dma == NULL) {
  426. spin_lock_irqsave(&ctrl->card->irq_lock, flags);
  427. rsxx_disable_ier(ctrl->card, CR_INTR_DMA_ALL);
  428. spin_unlock_irqrestore(&ctrl->card->irq_lock, flags);
  429. dev_err(CARD_TO_DEV(ctrl->card),
  430. "No tracker for tag %d "
  431. "(idx %d id %d)\n",
  432. tag, ctrl->status.idx, ctrl->id);
  433. return;
  434. }
  435. dev_dbg(CARD_TO_DEV(ctrl->card),
  436. "Completing DMA%d"
  437. "(laddr x%x tag %d st: x%x cnt: x%04x) from idx %d.\n",
  438. ctrl->id, dma->laddr, tag, status, count,
  439. ctrl->status.idx);
  440. atomic_dec(&ctrl->stats.hw_q_depth);
  441. mod_timer(&ctrl->activity_timer,
  442. jiffies + DMA_ACTIVITY_TIMEOUT);
  443. if (status)
  444. rsxx_handle_dma_error(ctrl, dma, status);
  445. else
  446. rsxx_complete_dma(ctrl, dma, 0);
  447. push_tracker(ctrl->trackers, tag);
  448. ctrl->status.idx = (ctrl->status.idx + 1) &
  449. RSXX_CS_IDX_MASK;
  450. ctrl->e_cnt++;
  451. count = le16_to_cpu(hw_st_buf[ctrl->status.idx].count);
  452. }
  453. dma_intr_coal_auto_tune(ctrl->card);
  454. if (atomic_read(&ctrl->stats.hw_q_depth) == 0)
  455. del_timer_sync(&ctrl->activity_timer);
  456. spin_lock_irqsave(&ctrl->card->irq_lock, flags);
  457. rsxx_enable_ier(ctrl->card, CR_INTR_DMA(ctrl->id));
  458. spin_unlock_irqrestore(&ctrl->card->irq_lock, flags);
  459. spin_lock_bh(&ctrl->queue_lock);
  460. if (ctrl->stats.sw_q_depth)
  461. queue_work(ctrl->issue_wq, &ctrl->issue_dma_work);
  462. spin_unlock_bh(&ctrl->queue_lock);
  463. }
  464. static void rsxx_schedule_issue(struct work_struct *work)
  465. {
  466. struct rsxx_dma_ctrl *ctrl;
  467. ctrl = container_of(work, struct rsxx_dma_ctrl, issue_dma_work);
  468. mutex_lock(&ctrl->work_lock);
  469. rsxx_issue_dmas(ctrl);
  470. mutex_unlock(&ctrl->work_lock);
  471. }
  472. static void rsxx_schedule_done(struct work_struct *work)
  473. {
  474. struct rsxx_dma_ctrl *ctrl;
  475. ctrl = container_of(work, struct rsxx_dma_ctrl, dma_done_work);
  476. mutex_lock(&ctrl->work_lock);
  477. rsxx_dma_done(ctrl);
  478. mutex_unlock(&ctrl->work_lock);
  479. }
  480. static int rsxx_queue_discard(struct rsxx_cardinfo *card,
  481. struct list_head *q,
  482. unsigned int laddr,
  483. rsxx_dma_cb cb,
  484. void *cb_data)
  485. {
  486. struct rsxx_dma *dma;
  487. dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL);
  488. if (!dma)
  489. return -ENOMEM;
  490. dma->cmd = HW_CMD_BLK_DISCARD;
  491. dma->laddr = laddr;
  492. dma->dma_addr = 0;
  493. dma->sub_page.off = 0;
  494. dma->sub_page.cnt = 0;
  495. dma->page = NULL;
  496. dma->pg_off = 0;
  497. dma->cb = cb;
  498. dma->cb_data = cb_data;
  499. dev_dbg(CARD_TO_DEV(card), "Queuing[D] laddr %x\n", dma->laddr);
  500. list_add_tail(&dma->list, q);
  501. return 0;
  502. }
  503. static int rsxx_queue_dma(struct rsxx_cardinfo *card,
  504. struct list_head *q,
  505. int dir,
  506. unsigned int dma_off,
  507. unsigned int dma_len,
  508. unsigned int laddr,
  509. struct page *page,
  510. unsigned int pg_off,
  511. rsxx_dma_cb cb,
  512. void *cb_data)
  513. {
  514. struct rsxx_dma *dma;
  515. dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL);
  516. if (!dma)
  517. return -ENOMEM;
  518. dma->dma_addr = pci_map_page(card->dev, page, pg_off, dma_len,
  519. dir ? PCI_DMA_TODEVICE :
  520. PCI_DMA_FROMDEVICE);
  521. if (pci_dma_mapping_error(card->dev, dma->dma_addr)) {
  522. kmem_cache_free(rsxx_dma_pool, dma);
  523. return -ENOMEM;
  524. }
  525. dma->cmd = dir ? HW_CMD_BLK_WRITE : HW_CMD_BLK_READ;
  526. dma->laddr = laddr;
  527. dma->sub_page.off = (dma_off >> 9);
  528. dma->sub_page.cnt = (dma_len >> 9);
  529. dma->page = page;
  530. dma->pg_off = pg_off;
  531. dma->cb = cb;
  532. dma->cb_data = cb_data;
  533. dev_dbg(CARD_TO_DEV(card),
  534. "Queuing[%c] laddr %x off %d cnt %d page %p pg_off %d\n",
  535. dir ? 'W' : 'R', dma->laddr, dma->sub_page.off,
  536. dma->sub_page.cnt, dma->page, dma->pg_off);
  537. /* Queue the DMA */
  538. list_add_tail(&dma->list, q);
  539. return 0;
  540. }
  541. int rsxx_dma_queue_bio(struct rsxx_cardinfo *card,
  542. struct bio *bio,
  543. atomic_t *n_dmas,
  544. rsxx_dma_cb cb,
  545. void *cb_data)
  546. {
  547. struct list_head dma_list[RSXX_MAX_TARGETS];
  548. struct bio_vec *bvec;
  549. unsigned long long addr8;
  550. unsigned int laddr;
  551. unsigned int bv_len;
  552. unsigned int bv_off;
  553. unsigned int dma_off;
  554. unsigned int dma_len;
  555. int dma_cnt[RSXX_MAX_TARGETS];
  556. int tgt;
  557. int st;
  558. int i;
  559. addr8 = bio->bi_sector << 9; /* sectors are 512 bytes */
  560. atomic_set(n_dmas, 0);
  561. for (i = 0; i < card->n_targets; i++) {
  562. INIT_LIST_HEAD(&dma_list[i]);
  563. dma_cnt[i] = 0;
  564. }
  565. if (bio->bi_rw & REQ_DISCARD) {
  566. bv_len = bio->bi_size;
  567. while (bv_len > 0) {
  568. tgt = rsxx_get_dma_tgt(card, addr8);
  569. laddr = rsxx_addr8_to_laddr(addr8, card);
  570. st = rsxx_queue_discard(card, &dma_list[tgt], laddr,
  571. cb, cb_data);
  572. if (st)
  573. goto bvec_err;
  574. dma_cnt[tgt]++;
  575. atomic_inc(n_dmas);
  576. addr8 += RSXX_HW_BLK_SIZE;
  577. bv_len -= RSXX_HW_BLK_SIZE;
  578. }
  579. } else {
  580. bio_for_each_segment(bvec, bio, i) {
  581. bv_len = bvec->bv_len;
  582. bv_off = bvec->bv_offset;
  583. while (bv_len > 0) {
  584. tgt = rsxx_get_dma_tgt(card, addr8);
  585. laddr = rsxx_addr8_to_laddr(addr8, card);
  586. dma_off = addr8 & RSXX_HW_BLK_MASK;
  587. dma_len = min(bv_len,
  588. RSXX_HW_BLK_SIZE - dma_off);
  589. st = rsxx_queue_dma(card, &dma_list[tgt],
  590. bio_data_dir(bio),
  591. dma_off, dma_len,
  592. laddr, bvec->bv_page,
  593. bv_off, cb, cb_data);
  594. if (st)
  595. goto bvec_err;
  596. dma_cnt[tgt]++;
  597. atomic_inc(n_dmas);
  598. addr8 += dma_len;
  599. bv_off += dma_len;
  600. bv_len -= dma_len;
  601. }
  602. }
  603. }
  604. for (i = 0; i < card->n_targets; i++) {
  605. if (!list_empty(&dma_list[i])) {
  606. spin_lock_bh(&card->ctrl[i].queue_lock);
  607. card->ctrl[i].stats.sw_q_depth += dma_cnt[i];
  608. list_splice_tail(&dma_list[i], &card->ctrl[i].queue);
  609. spin_unlock_bh(&card->ctrl[i].queue_lock);
  610. queue_work(card->ctrl[i].issue_wq,
  611. &card->ctrl[i].issue_dma_work);
  612. }
  613. }
  614. return 0;
  615. bvec_err:
  616. for (i = 0; i < card->n_targets; i++)
  617. rsxx_cleanup_dma_queue(&card->ctrl[i], &dma_list[i],
  618. FREE_DMA);
  619. return st;
  620. }
  621. /*----------------- DMA Engine Initialization & Setup -------------------*/
  622. int rsxx_hw_buffers_init(struct pci_dev *dev, struct rsxx_dma_ctrl *ctrl)
  623. {
  624. ctrl->status.buf = pci_alloc_consistent(dev, STATUS_BUFFER_SIZE8,
  625. &ctrl->status.dma_addr);
  626. ctrl->cmd.buf = pci_alloc_consistent(dev, COMMAND_BUFFER_SIZE8,
  627. &ctrl->cmd.dma_addr);
  628. if (ctrl->status.buf == NULL || ctrl->cmd.buf == NULL)
  629. return -ENOMEM;
  630. memset(ctrl->status.buf, 0xac, STATUS_BUFFER_SIZE8);
  631. iowrite32(lower_32_bits(ctrl->status.dma_addr),
  632. ctrl->regmap + SB_ADD_LO);
  633. iowrite32(upper_32_bits(ctrl->status.dma_addr),
  634. ctrl->regmap + SB_ADD_HI);
  635. memset(ctrl->cmd.buf, 0x83, COMMAND_BUFFER_SIZE8);
  636. iowrite32(lower_32_bits(ctrl->cmd.dma_addr), ctrl->regmap + CB_ADD_LO);
  637. iowrite32(upper_32_bits(ctrl->cmd.dma_addr), ctrl->regmap + CB_ADD_HI);
  638. ctrl->status.idx = ioread32(ctrl->regmap + HW_STATUS_CNT);
  639. if (ctrl->status.idx > RSXX_MAX_OUTSTANDING_CMDS) {
  640. dev_crit(&dev->dev, "Failed reading status cnt x%x\n",
  641. ctrl->status.idx);
  642. return -EINVAL;
  643. }
  644. iowrite32(ctrl->status.idx, ctrl->regmap + HW_STATUS_CNT);
  645. iowrite32(ctrl->status.idx, ctrl->regmap + SW_STATUS_CNT);
  646. ctrl->cmd.idx = ioread32(ctrl->regmap + HW_CMD_IDX);
  647. if (ctrl->cmd.idx > RSXX_MAX_OUTSTANDING_CMDS) {
  648. dev_crit(&dev->dev, "Failed reading cmd cnt x%x\n",
  649. ctrl->status.idx);
  650. return -EINVAL;
  651. }
  652. iowrite32(ctrl->cmd.idx, ctrl->regmap + HW_CMD_IDX);
  653. iowrite32(ctrl->cmd.idx, ctrl->regmap + SW_CMD_IDX);
  654. return 0;
  655. }
  656. static int rsxx_dma_ctrl_init(struct pci_dev *dev,
  657. struct rsxx_dma_ctrl *ctrl)
  658. {
  659. int i;
  660. int st;
  661. memset(&ctrl->stats, 0, sizeof(ctrl->stats));
  662. ctrl->trackers = vmalloc(DMA_TRACKER_LIST_SIZE8);
  663. if (!ctrl->trackers)
  664. return -ENOMEM;
  665. ctrl->trackers->head = 0;
  666. for (i = 0; i < RSXX_MAX_OUTSTANDING_CMDS; i++) {
  667. ctrl->trackers->list[i].next_tag = i + 1;
  668. ctrl->trackers->list[i].dma = NULL;
  669. }
  670. ctrl->trackers->list[RSXX_MAX_OUTSTANDING_CMDS-1].next_tag = -1;
  671. spin_lock_init(&ctrl->trackers->lock);
  672. spin_lock_init(&ctrl->queue_lock);
  673. mutex_init(&ctrl->work_lock);
  674. INIT_LIST_HEAD(&ctrl->queue);
  675. setup_timer(&ctrl->activity_timer, dma_engine_stalled,
  676. (unsigned long)ctrl);
  677. ctrl->issue_wq = alloc_ordered_workqueue(DRIVER_NAME"_issue", 0);
  678. if (!ctrl->issue_wq)
  679. return -ENOMEM;
  680. ctrl->done_wq = alloc_ordered_workqueue(DRIVER_NAME"_done", 0);
  681. if (!ctrl->done_wq)
  682. return -ENOMEM;
  683. INIT_WORK(&ctrl->issue_dma_work, rsxx_schedule_issue);
  684. INIT_WORK(&ctrl->dma_done_work, rsxx_schedule_done);
  685. st = rsxx_hw_buffers_init(dev, ctrl);
  686. if (st)
  687. return st;
  688. return 0;
  689. }
  690. static int rsxx_dma_stripe_setup(struct rsxx_cardinfo *card,
  691. unsigned int stripe_size8)
  692. {
  693. if (!is_power_of_2(stripe_size8)) {
  694. dev_err(CARD_TO_DEV(card),
  695. "stripe_size is NOT a power of 2!\n");
  696. return -EINVAL;
  697. }
  698. card->_stripe.lower_mask = stripe_size8 - 1;
  699. card->_stripe.upper_mask = ~(card->_stripe.lower_mask);
  700. card->_stripe.upper_shift = ffs(card->n_targets) - 1;
  701. card->_stripe.target_mask = card->n_targets - 1;
  702. card->_stripe.target_shift = ffs(stripe_size8) - 1;
  703. dev_dbg(CARD_TO_DEV(card), "_stripe.lower_mask = x%016llx\n",
  704. card->_stripe.lower_mask);
  705. dev_dbg(CARD_TO_DEV(card), "_stripe.upper_shift = x%016llx\n",
  706. card->_stripe.upper_shift);
  707. dev_dbg(CARD_TO_DEV(card), "_stripe.upper_mask = x%016llx\n",
  708. card->_stripe.upper_mask);
  709. dev_dbg(CARD_TO_DEV(card), "_stripe.target_mask = x%016llx\n",
  710. card->_stripe.target_mask);
  711. dev_dbg(CARD_TO_DEV(card), "_stripe.target_shift = x%016llx\n",
  712. card->_stripe.target_shift);
  713. return 0;
  714. }
  715. int rsxx_dma_configure(struct rsxx_cardinfo *card)
  716. {
  717. u32 intr_coal;
  718. intr_coal = dma_intr_coal_val(card->config.data.intr_coal.mode,
  719. card->config.data.intr_coal.count,
  720. card->config.data.intr_coal.latency);
  721. iowrite32(intr_coal, card->regmap + INTR_COAL);
  722. return rsxx_dma_stripe_setup(card, card->config.data.stripe_size);
  723. }
  724. int rsxx_dma_setup(struct rsxx_cardinfo *card)
  725. {
  726. unsigned long flags;
  727. int st;
  728. int i;
  729. dev_info(CARD_TO_DEV(card),
  730. "Initializing %d DMA targets\n",
  731. card->n_targets);
  732. /* Regmap is divided up into 4K chunks. One for each DMA channel */
  733. for (i = 0; i < card->n_targets; i++)
  734. card->ctrl[i].regmap = card->regmap + (i * 4096);
  735. card->dma_fault = 0;
  736. /* Reset the DMA queues */
  737. rsxx_dma_queue_reset(card);
  738. /************* Setup DMA Control *************/
  739. for (i = 0; i < card->n_targets; i++) {
  740. st = rsxx_dma_ctrl_init(card->dev, &card->ctrl[i]);
  741. if (st)
  742. goto failed_dma_setup;
  743. card->ctrl[i].card = card;
  744. card->ctrl[i].id = i;
  745. }
  746. card->scrub_hard = 1;
  747. if (card->config_valid)
  748. rsxx_dma_configure(card);
  749. /* Enable the interrupts after all setup has completed. */
  750. for (i = 0; i < card->n_targets; i++) {
  751. spin_lock_irqsave(&card->irq_lock, flags);
  752. rsxx_enable_ier_and_isr(card, CR_INTR_DMA(i));
  753. spin_unlock_irqrestore(&card->irq_lock, flags);
  754. }
  755. return 0;
  756. failed_dma_setup:
  757. for (i = 0; i < card->n_targets; i++) {
  758. struct rsxx_dma_ctrl *ctrl = &card->ctrl[i];
  759. if (ctrl->issue_wq) {
  760. destroy_workqueue(ctrl->issue_wq);
  761. ctrl->issue_wq = NULL;
  762. }
  763. if (ctrl->done_wq) {
  764. destroy_workqueue(ctrl->done_wq);
  765. ctrl->done_wq = NULL;
  766. }
  767. if (ctrl->trackers)
  768. vfree(ctrl->trackers);
  769. if (ctrl->status.buf)
  770. pci_free_consistent(card->dev, STATUS_BUFFER_SIZE8,
  771. ctrl->status.buf,
  772. ctrl->status.dma_addr);
  773. if (ctrl->cmd.buf)
  774. pci_free_consistent(card->dev, COMMAND_BUFFER_SIZE8,
  775. ctrl->cmd.buf, ctrl->cmd.dma_addr);
  776. }
  777. return st;
  778. }
  779. int rsxx_dma_cancel(struct rsxx_dma_ctrl *ctrl)
  780. {
  781. struct rsxx_dma *dma;
  782. int i;
  783. int cnt = 0;
  784. /* Clean up issued DMAs */
  785. for (i = 0; i < RSXX_MAX_OUTSTANDING_CMDS; i++) {
  786. dma = get_tracker_dma(ctrl->trackers, i);
  787. if (dma) {
  788. atomic_dec(&ctrl->stats.hw_q_depth);
  789. rsxx_complete_dma(ctrl, dma, DMA_CANCELLED);
  790. push_tracker(ctrl->trackers, i);
  791. cnt++;
  792. }
  793. }
  794. return cnt;
  795. }
  796. void rsxx_dma_destroy(struct rsxx_cardinfo *card)
  797. {
  798. struct rsxx_dma_ctrl *ctrl;
  799. int i;
  800. for (i = 0; i < card->n_targets; i++) {
  801. ctrl = &card->ctrl[i];
  802. if (ctrl->issue_wq) {
  803. destroy_workqueue(ctrl->issue_wq);
  804. ctrl->issue_wq = NULL;
  805. }
  806. if (ctrl->done_wq) {
  807. destroy_workqueue(ctrl->done_wq);
  808. ctrl->done_wq = NULL;
  809. }
  810. if (timer_pending(&ctrl->activity_timer))
  811. del_timer_sync(&ctrl->activity_timer);
  812. /* Clean up the DMA queue */
  813. spin_lock_bh(&ctrl->queue_lock);
  814. rsxx_cleanup_dma_queue(ctrl, &ctrl->queue, COMPLETE_DMA);
  815. spin_unlock_bh(&ctrl->queue_lock);
  816. rsxx_dma_cancel(ctrl);
  817. vfree(ctrl->trackers);
  818. pci_free_consistent(card->dev, STATUS_BUFFER_SIZE8,
  819. ctrl->status.buf, ctrl->status.dma_addr);
  820. pci_free_consistent(card->dev, COMMAND_BUFFER_SIZE8,
  821. ctrl->cmd.buf, ctrl->cmd.dma_addr);
  822. }
  823. }
  824. int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
  825. {
  826. int i;
  827. int j;
  828. int cnt;
  829. struct rsxx_dma *dma;
  830. struct list_head *issued_dmas;
  831. issued_dmas = kzalloc(sizeof(*issued_dmas) * card->n_targets,
  832. GFP_KERNEL);
  833. if (!issued_dmas)
  834. return -ENOMEM;
  835. for (i = 0; i < card->n_targets; i++) {
  836. INIT_LIST_HEAD(&issued_dmas[i]);
  837. cnt = 0;
  838. for (j = 0; j < RSXX_MAX_OUTSTANDING_CMDS; j++) {
  839. dma = get_tracker_dma(card->ctrl[i].trackers, j);
  840. if (dma == NULL)
  841. continue;
  842. if (dma->cmd == HW_CMD_BLK_WRITE)
  843. card->ctrl[i].stats.writes_issued--;
  844. else if (dma->cmd == HW_CMD_BLK_DISCARD)
  845. card->ctrl[i].stats.discards_issued--;
  846. else
  847. card->ctrl[i].stats.reads_issued--;
  848. list_add_tail(&dma->list, &issued_dmas[i]);
  849. push_tracker(card->ctrl[i].trackers, j);
  850. cnt++;
  851. }
  852. spin_lock_bh(&card->ctrl[i].queue_lock);
  853. list_splice(&issued_dmas[i], &card->ctrl[i].queue);
  854. atomic_sub(cnt, &card->ctrl[i].stats.hw_q_depth);
  855. card->ctrl[i].stats.sw_q_depth += cnt;
  856. card->ctrl[i].e_cnt = 0;
  857. list_for_each_entry(dma, &card->ctrl[i].queue, list) {
  858. if (!pci_dma_mapping_error(card->dev, dma->dma_addr))
  859. pci_unmap_page(card->dev, dma->dma_addr,
  860. get_dma_size(dma),
  861. dma->cmd == HW_CMD_BLK_WRITE ?
  862. PCI_DMA_TODEVICE :
  863. PCI_DMA_FROMDEVICE);
  864. }
  865. spin_unlock_bh(&card->ctrl[i].queue_lock);
  866. }
  867. kfree(issued_dmas);
  868. return 0;
  869. }
  870. int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card)
  871. {
  872. struct rsxx_dma *dma;
  873. int i;
  874. for (i = 0; i < card->n_targets; i++) {
  875. spin_lock_bh(&card->ctrl[i].queue_lock);
  876. list_for_each_entry(dma, &card->ctrl[i].queue, list) {
  877. dma->dma_addr = pci_map_page(card->dev, dma->page,
  878. dma->pg_off, get_dma_size(dma),
  879. dma->cmd == HW_CMD_BLK_WRITE ?
  880. PCI_DMA_TODEVICE :
  881. PCI_DMA_FROMDEVICE);
  882. if (pci_dma_mapping_error(card->dev, dma->dma_addr)) {
  883. spin_unlock_bh(&card->ctrl[i].queue_lock);
  884. kmem_cache_free(rsxx_dma_pool, dma);
  885. return -ENOMEM;
  886. }
  887. }
  888. spin_unlock_bh(&card->ctrl[i].queue_lock);
  889. }
  890. return 0;
  891. }
  892. int rsxx_dma_init(void)
  893. {
  894. rsxx_dma_pool = KMEM_CACHE(rsxx_dma, SLAB_HWCACHE_ALIGN);
  895. if (!rsxx_dma_pool)
  896. return -ENOMEM;
  897. return 0;
  898. }
  899. void rsxx_dma_cleanup(void)
  900. {
  901. kmem_cache_destroy(rsxx_dma_pool);
  902. }