Lines Matching refs:dd
98 static int qib_sd7220_reg_mod(struct qib_devdata *dd, int sdnum, u32 loc,
100 static int ibsd_mod_allchnls(struct qib_devdata *dd, int loc, int val,
102 static int qib_sd_trimdone_poll(struct qib_devdata *dd);
103 static void qib_sd_trimdone_monitor(struct qib_devdata *dd, const char *where);
104 static int qib_sd_setvals(struct qib_devdata *dd);
105 static int qib_sd_early(struct qib_devdata *dd);
106 static int qib_sd_dactrim(struct qib_devdata *dd);
107 static int qib_internal_presets(struct qib_devdata *dd);
109 static int qib_sd_trimself(struct qib_devdata *dd, int val);
110 static int epb_access(struct qib_devdata *dd, int sdnum, int claim);
111 static int qib_sd7220_ib_load(struct qib_devdata *dd,
113 static int qib_sd7220_ib_vfy(struct qib_devdata *dd,
126 struct qib_devdata *dd = ppd->dd; in qib_ibsd_ucode_loaded() local
128 if (!dd->cspec->serdes_first_init_done && in qib_ibsd_ucode_loaded()
129 qib_sd7220_ib_vfy(dd, fw) > 0) in qib_ibsd_ucode_loaded()
130 dd->cspec->serdes_first_init_done = 1; in qib_ibsd_ucode_loaded()
131 return dd->cspec->serdes_first_init_done; in qib_ibsd_ucode_loaded()
143 void qib_sd7220_clr_ibpar(struct qib_devdata *dd) in qib_sd7220_clr_ibpar() argument
148 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, in qib_sd7220_clr_ibpar()
151 qib_dev_err(dd, "Failed clearing IBSerDes Parity err\n"); in qib_sd7220_clr_ibpar()
154 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, 0, in qib_sd7220_clr_ibpar()
157 qib_read_kreg32(dd, kr_scratch); in qib_sd7220_clr_ibpar()
159 qib_write_kreg(dd, kr_hwerrclear, in qib_sd7220_clr_ibpar()
161 qib_read_kreg32(dd, kr_scratch); in qib_sd7220_clr_ibpar()
175 static int qib_resync_ibepb(struct qib_devdata *dd) in qib_resync_ibepb() argument
184 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, 0, 0); in qib_resync_ibepb()
186 qib_dev_err(dd, "Failed read in resync\n"); in qib_resync_ibepb()
190 qib_dev_err(dd, "unexpected pattern in resync\n"); in qib_resync_ibepb()
192 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, pat, 0xFF); in qib_resync_ibepb()
194 qib_dev_err(dd, "Failed write in resync\n"); in qib_resync_ibepb()
197 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, 0, 0); in qib_resync_ibepb()
199 qib_dev_err(dd, "Failed re-read in resync\n"); in qib_resync_ibepb()
203 qib_dev_err(dd, "Failed compare1 in resync\n"); in qib_resync_ibepb()
207 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, 0, 0); in qib_resync_ibepb()
209 qib_dev_err(dd, "Failed CMUDONE rd in resync\n"); in qib_resync_ibepb()
213 qib_dev_err(dd, "Bad CMUDONE value %02X, chn %d\n", in qib_resync_ibepb()
227 static int qib_ibsd_reset(struct qib_devdata *dd, int assert_rst) in qib_ibsd_reset() argument
233 rst_val = qib_read_kreg64(dd, kr_ibserdesctrl); in qib_ibsd_reset()
239 spin_lock_irqsave(&dd->cspec->sdepb_lock, flags); in qib_ibsd_reset()
240 epb_access(dd, IB_7220_SERDES, 1); in qib_ibsd_reset()
243 qib_write_kreg(dd, kr_hwerrmask, in qib_ibsd_reset()
244 dd->cspec->hwerrmask & in qib_ibsd_reset()
246 qib_write_kreg(dd, kr_ibserdesctrl, rst_val); in qib_ibsd_reset()
248 qib_read_kreg32(dd, kr_scratch); in qib_ibsd_reset()
251 epb_access(dd, IB_7220_SERDES, -1); in qib_ibsd_reset()
252 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_ibsd_reset()
263 qib_write_kreg(dd, kr_hwerrmask, in qib_ibsd_reset()
264 dd->cspec->hwerrmask & in qib_ibsd_reset()
267 ret = qib_resync_ibepb(dd); in qib_ibsd_reset()
269 qib_dev_err(dd, "unable to re-sync IB EPB\n"); in qib_ibsd_reset()
272 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG5, 1, 1); in qib_ibsd_reset()
276 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, 0x80, in qib_ibsd_reset()
279 qib_dev_err(dd, "Failed to set WDOG disable\n"); in qib_ibsd_reset()
282 qib_write_kreg(dd, kr_ibserdesctrl, rst_val); in qib_ibsd_reset()
284 qib_read_kreg32(dd, kr_scratch); in qib_ibsd_reset()
287 qib_sd7220_clr_ibpar(dd); in qib_ibsd_reset()
288 val = qib_read_kreg64(dd, kr_hwerrstatus); in qib_ibsd_reset()
290 qib_dev_err(dd, "IBUC Parity still set after RST\n"); in qib_ibsd_reset()
291 dd->cspec->hwerrmask &= in qib_ibsd_reset()
294 qib_write_kreg(dd, kr_hwerrmask, in qib_ibsd_reset()
295 dd->cspec->hwerrmask); in qib_ibsd_reset()
302 static void qib_sd_trimdone_monitor(struct qib_devdata *dd, in qib_sd_trimdone_monitor() argument
314 ret = qib_resync_ibepb(dd); in qib_sd_trimdone_monitor()
316 qib_dev_err(dd, "not able to re-sync IB EPB (%s)\n", where); in qib_sd_trimdone_monitor()
319 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_CTRL2(0), 0, 0); in qib_sd_trimdone_monitor()
321 qib_dev_err(dd, "Failed TRIMDONE 1st read, (%s)\n", where); in qib_sd_trimdone_monitor()
324 val = qib_read_kreg64(dd, kr_ibcstatus); in qib_sd_trimdone_monitor()
326 qib_dev_err(dd, "IBCS TRIMDONE clear (%s)\n", where); in qib_sd_trimdone_monitor()
333 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, 0x80, 0x80); in qib_sd_trimdone_monitor()
335 qib_dev_err(dd, "Failed Dummy RMW, (%s)\n", where); in qib_sd_trimdone_monitor()
342 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
345 qib_dev_err(dd, in qib_sd_trimdone_monitor()
353 qib_dev_err(dd, in qib_sd_trimdone_monitor()
356 probe = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
358 qib_dev_err(dd, "probe is %d (%02X)\n", in qib_sd_trimdone_monitor()
360 probe = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
362 qib_dev_err(dd, "re-read: %d (%02X)\n", in qib_sd_trimdone_monitor()
364 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
367 qib_dev_err(dd, in qib_sd_trimdone_monitor()
374 qib_dev_err(dd, in qib_sd_trimdone_monitor()
377 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
380 qib_dev_err(dd, in qib_sd_trimdone_monitor()
393 int qib_sd7220_init(struct qib_devdata *dd) in qib_sd7220_init() argument
400 was_reset = (qib_read_kreg64(dd, kr_ibserdesctrl) & 1); in qib_sd7220_init()
403 qib_ibsd_reset(dd, 1); in qib_sd7220_init()
404 qib_sd_trimdone_monitor(dd, "Driver-reload"); in qib_sd7220_init()
407 ret = request_firmware(&fw, SD7220_FW_NAME, &dd->pcidev->dev); in qib_sd7220_init()
409 qib_dev_err(dd, "Failed to load IB SERDES image\n"); in qib_sd7220_init()
414 ret = qib_ibsd_ucode_loaded(dd->pport, fw); in qib_sd7220_init()
423 ret = qib_sd_early(dd); in qib_sd7220_init()
425 qib_dev_err(dd, "Failed to set IB SERDES early defaults\n"); in qib_sd7220_init()
434 ret = qib_sd_dactrim(dd); in qib_sd7220_init()
436 qib_dev_err(dd, "Failed IB SERDES DAC trim\n"); in qib_sd7220_init()
446 ret = qib_internal_presets(dd); in qib_sd7220_init()
448 qib_dev_err(dd, "Failed to set IB SERDES presets\n"); in qib_sd7220_init()
451 ret = qib_sd_trimself(dd, 0x80); in qib_sd7220_init()
453 qib_dev_err(dd, "Failed to set IB SERDES TRIMSELF\n"); in qib_sd7220_init()
463 ret = qib_sd7220_ib_load(dd, fw); in qib_sd7220_init()
465 qib_dev_err(dd, "Failed to load IB SERDES image\n"); in qib_sd7220_init()
469 vfy = qib_sd7220_ib_vfy(dd, fw); in qib_sd7220_init()
471 qib_dev_err(dd, "SERDES PRAM VFY failed\n"); in qib_sd7220_init()
489 ret = ibsd_mod_allchnls(dd, START_EQ1(0), 0, 0x38); in qib_sd7220_init()
491 qib_dev_err(dd, "Failed clearing START_EQ1\n"); in qib_sd7220_init()
495 qib_ibsd_reset(dd, 0); in qib_sd7220_init()
500 trim_done = qib_sd_trimdone_poll(dd); in qib_sd7220_init()
506 qib_ibsd_reset(dd, 1); in qib_sd7220_init()
509 qib_dev_err(dd, "No TRIMDONE seen\n"); in qib_sd7220_init()
516 qib_sd_trimdone_monitor(dd, "First-reset"); in qib_sd7220_init()
518 dd->cspec->serdes_first_init_done = 1; in qib_sd7220_init()
525 if (qib_sd_setvals(dd) >= 0) in qib_sd7220_init()
531 set_7220_relock_poll(dd, -1); in qib_sd7220_init()
551 static int epb_access(struct qib_devdata *dd, int sdnum, int claim) in epb_access() argument
579 qib_read_kreg32(dd, kr_scratch); in epb_access()
582 accval = qib_read_kreg32(dd, acc); in epb_access()
593 qib_write_kreg(dd, acc, newval); in epb_access()
595 pollval = qib_read_kreg32(dd, acc); in epb_access()
597 pollval = qib_read_kreg32(dd, acc); in epb_access()
604 qib_write_kreg(dd, acc, newval); in epb_access()
606 pollval = qib_read_kreg32(dd, acc); in epb_access()
608 pollval = qib_read_kreg32(dd, acc); in epb_access()
618 static int epb_trans(struct qib_devdata *dd, u16 reg, u64 i_val, u64 *o_vp) in epb_trans() argument
623 qib_write_kreg(dd, reg, i_val); in epb_trans()
625 transval = qib_read_kreg64(dd, reg); in epb_trans()
628 transval = qib_read_kreg32(dd, reg); in epb_trans()
653 static int qib_sd7220_reg_mod(struct qib_devdata *dd, int sdnum, u32 loc, in qib_sd7220_reg_mod() argument
680 spin_lock_irqsave(&dd->cspec->sdepb_lock, flags); in qib_sd7220_reg_mod()
682 owned = epb_access(dd, sdnum, 1); in qib_sd7220_reg_mod()
684 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_reg_mod()
689 transval = qib_read_kreg32(dd, trans); in qib_sd7220_reg_mod()
703 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_reg_mod()
711 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_reg_mod()
719 if (epb_access(dd, sdnum, -1) < 0) in qib_sd7220_reg_mod()
724 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_reg_mod()
743 static int qib_sd7220_ram_xfer(struct qib_devdata *dd, int sdnum, u32 loc, in qib_sd7220_ram_xfer() argument
776 spin_lock_irqsave(&dd->cspec->sdepb_lock, flags); in qib_sd7220_ram_xfer()
778 owned = epb_access(dd, sdnum, 1); in qib_sd7220_ram_xfer()
780 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_ram_xfer()
793 transval = qib_read_kreg32(dd, trans); in qib_sd7220_ram_xfer()
810 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_ram_xfer()
816 tries = epb_trans(dd, trans, transval, in qib_sd7220_ram_xfer()
822 tries = epb_trans(dd, trans, transval, in qib_sd7220_ram_xfer()
832 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_ram_xfer()
841 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_ram_xfer()
846 if (epb_access(dd, sdnum, -1) < 0) in qib_sd7220_ram_xfer()
849 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_ram_xfer()
857 static int qib_sd7220_prog_ld(struct qib_devdata *dd, int sdnum, in qib_sd7220_prog_ld() argument
867 cnt = qib_sd7220_ram_xfer(dd, sdnum, offset + sofar, in qib_sd7220_prog_ld()
881 static int qib_sd7220_prog_vfy(struct qib_devdata *dd, int sdnum, in qib_sd7220_prog_vfy() argument
893 cnt = qib_sd7220_ram_xfer(dd, sdnum, sofar + offset, in qib_sd7220_prog_vfy()
910 qib_sd7220_ib_load(struct qib_devdata *dd, const struct firmware *fw) in qib_sd7220_ib_load() argument
912 return qib_sd7220_prog_ld(dd, IB_7220_SERDES, fw->data, fw->size, 0); in qib_sd7220_ib_load()
916 qib_sd7220_ib_vfy(struct qib_devdata *dd, const struct firmware *fw) in qib_sd7220_ib_vfy() argument
918 return qib_sd7220_prog_vfy(dd, IB_7220_SERDES, fw->data, fw->size, 0); in qib_sd7220_ib_vfy()
927 static int qib_sd_trimdone_poll(struct qib_devdata *dd) in qib_sd_trimdone_poll() argument
938 val = qib_read_kreg64(dd, kr_ibcstatus); in qib_sd_trimdone_poll()
946 qib_dev_err(dd, "No TRIMDONE in %d tries\n", trim_tmo); in qib_sd_trimdone_poll()
1040 static int qib_sd_setvals(struct qib_devdata *dd) in qib_sd_setvals() argument
1049 taddr = dd->kregbase + kr_serdes_maptable; in qib_sd_setvals()
1050 iaddr = dd->kregbase + kr_serdes_ddsrxeq0; in qib_sd_setvals()
1057 sdctl = qib_read_kreg64(dd, kr_ibserdesctrl); in qib_sd_setvals()
1060 qib_write_kreg(dd, kr_ibserdesctrl, sdctl); in qib_sd_setvals()
1070 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1077 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1099 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1105 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1128 static int ibsd_mod_allchnls(struct qib_devdata *dd, int loc, int val, in ibsd_mod_allchnls() argument
1144 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in ibsd_mod_allchnls()
1149 qib_dev_err(dd, in ibsd_mod_allchnls()
1158 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, val, 0xFF); in ibsd_mod_allchnls()
1162 qib_dev_err(dd, in ibsd_mod_allchnls()
1174 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, cloc, val, mask); in ibsd_mod_allchnls()
1178 qib_dev_err(dd, in ibsd_mod_allchnls()
1192 static int set_dds_vals(struct qib_devdata *dd, struct dds_init *ddi) in set_dds_vals() argument
1204 ret = ibsd_mod_allchnls(dd, EPB_LOC(0, 9, reg), data, 0xFF); in set_dds_vals()
1215 static int set_rxeq_vals(struct qib_devdata *dd, int vsel) in set_rxeq_vals() argument
1229 ret = ibsd_mod_allchnls(dd, loc, val, 0xFF); in set_rxeq_vals()
1251 static int qib_internal_presets(struct qib_devdata *dd) in qib_internal_presets() argument
1255 ret = set_dds_vals(dd, dds_init_vals + DDS_3M); in qib_internal_presets()
1258 qib_dev_err(dd, "Failed to set default DDS values\n"); in qib_internal_presets()
1259 ret = set_rxeq_vals(dd, qib_rxeq_set & 3); in qib_internal_presets()
1261 qib_dev_err(dd, "Failed to set default RXEQ values\n"); in qib_internal_presets()
1265 int qib_sd7220_presets(struct qib_devdata *dd) in qib_sd7220_presets() argument
1269 if (!dd->cspec->presets_needed) in qib_sd7220_presets()
1271 dd->cspec->presets_needed = 0; in qib_sd7220_presets()
1273 qib_ibsd_reset(dd, 1); in qib_sd7220_presets()
1275 qib_sd_trimdone_monitor(dd, "link-down"); in qib_sd7220_presets()
1277 ret = qib_internal_presets(dd); in qib_sd7220_presets()
1281 static int qib_sd_trimself(struct qib_devdata *dd, int val) in qib_sd_trimself() argument
1285 return qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, val, 0xFF); in qib_sd_trimself()
1288 static int qib_sd_early(struct qib_devdata *dd) in qib_sd_early() argument
1292 ret = ibsd_mod_allchnls(dd, RXHSCTRL0(0) | EPB_GLOBAL_WR, 0xD4, 0xFF); in qib_sd_early()
1295 ret = ibsd_mod_allchnls(dd, START_EQ1(0) | EPB_GLOBAL_WR, 0x10, 0xFF); in qib_sd_early()
1298 ret = ibsd_mod_allchnls(dd, START_EQ2(0) | EPB_GLOBAL_WR, 0x30, 0xFF); in qib_sd_early()
1307 static int qib_sd_dactrim(struct qib_devdata *dd) in qib_sd_dactrim() argument
1311 ret = ibsd_mod_allchnls(dd, VCDL_DAC2(0) | EPB_GLOBAL_WR, 0x2D, 0xFF); in qib_sd_dactrim()
1316 ret = ibsd_mod_allchnls(dd, VCDL_CTRL2(0), 3, 0xF); in qib_sd_dactrim()
1320 ret = ibsd_mod_allchnls(dd, BACTRL(0) | EPB_GLOBAL_WR, 0x40, 0xFF); in qib_sd_dactrim()
1324 ret = ibsd_mod_allchnls(dd, LDOUTCTRL1(0) | EPB_GLOBAL_WR, 0x04, 0xFF); in qib_sd_dactrim()
1328 ret = ibsd_mod_allchnls(dd, RXHSSTATUS(0) | EPB_GLOBAL_WR, 0x04, 0xFF); in qib_sd_dactrim()
1338 ret = ibsd_mod_allchnls(dd, LDOUTCTRL1(0) | EPB_GLOBAL_WR, 0x00, 0xFF); in qib_sd_dactrim()
1346 void toggle_7220_rclkrls(struct qib_devdata *dd) in toggle_7220_rclkrls() argument
1351 ret = ibsd_mod_allchnls(dd, loc, 0, 0x80); in toggle_7220_rclkrls()
1353 qib_dev_err(dd, "RCLKRLS failed to clear D7\n"); in toggle_7220_rclkrls()
1356 ibsd_mod_allchnls(dd, loc, 0x80, 0x80); in toggle_7220_rclkrls()
1360 ret = ibsd_mod_allchnls(dd, loc, 0, 0x80); in toggle_7220_rclkrls()
1362 qib_dev_err(dd, "RCLKRLS failed to clear D7\n"); in toggle_7220_rclkrls()
1365 ibsd_mod_allchnls(dd, loc, 0x80, 0x80); in toggle_7220_rclkrls()
1368 dd->f_xgxs_reset(dd->pport); in toggle_7220_rclkrls()
1377 void shutdown_7220_relock_poll(struct qib_devdata *dd) in shutdown_7220_relock_poll() argument
1379 if (dd->cspec->relock_timer_active) in shutdown_7220_relock_poll()
1380 del_timer_sync(&dd->cspec->relock_timer); in shutdown_7220_relock_poll()
1390 struct qib_devdata *dd = (struct qib_devdata *)opaque; in qib_run_relock() local
1391 struct qib_pportdata *ppd = dd->pport; in qib_run_relock()
1392 struct qib_chip_specific *cs = dd->cspec; in qib_run_relock()
1401 if ((dd->flags & QIB_INITTED) && !(ppd->lflags & in qib_run_relock()
1406 toggle_7220_rclkrls(dd); in qib_run_relock()
1418 void set_7220_relock_poll(struct qib_devdata *dd, int ibup) in set_7220_relock_poll() argument
1420 struct qib_chip_specific *cs = dd->cspec; in set_7220_relock_poll()
1440 cs->relock_timer.data = (unsigned long) dd; in set_7220_relock_poll()