Lines Matching refs:sc

65 cfi_read_raw(struct cfi_softc *sc, u_int ofs)  in cfi_read_raw()  argument
69 ofs &= ~(sc->sc_width - 1); in cfi_read_raw()
70 switch (sc->sc_width) { in cfi_read_raw()
72 val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); in cfi_read_raw()
75 val = bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs); in cfi_read_raw()
78 val = bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs); in cfi_read_raw()
88 cfi_read(struct cfi_softc *sc, u_int ofs) in cfi_read() argument
93 ofs &= ~(sc->sc_width - 1); in cfi_read()
94 switch (sc->sc_width) { in cfi_read()
96 val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); in cfi_read()
99 sval = bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs); in cfi_read()
107 val = bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs); in cfi_read()
120 cfi_write(struct cfi_softc *sc, u_int ofs, u_int val) in cfi_write() argument
123 ofs &= ~(sc->sc_width - 1); in cfi_write()
124 switch (sc->sc_width) { in cfi_write()
126 bus_space_write_1(sc->sc_tag, sc->sc_handle, ofs, val); in cfi_write()
130 bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, val); in cfi_write()
132 bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, htole16(val)); in cfi_write()
138 bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, val); in cfi_write()
140 bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, htole32(val)); in cfi_write()
150 cfi_reset_default(struct cfi_softc *sc) in cfi_reset_default() argument
153 cfi_write(sc, 0, CFI_BCS_READ_ARRAY2); in cfi_reset_default()
154 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_reset_default()
158 cfi_read_qry(struct cfi_softc *sc, u_int ofs) in cfi_read_qry() argument
162 cfi_write(sc, CFI_QRY_CMD_ADDR * sc->sc_width, CFI_QRY_CMD_DATA); in cfi_read_qry()
163 val = cfi_read(sc, ofs * sc->sc_width); in cfi_read_qry()
164 cfi_reset_default(sc); in cfi_read_qry()
169 cfi_amd_write(struct cfi_softc *sc, u_int ofs, u_int addr, u_int data) in cfi_amd_write() argument
172 cfi_write(sc, ofs + AMD_ADDR_START, CFI_AMD_UNLOCK); in cfi_amd_write()
173 cfi_write(sc, ofs + AMD_ADDR_ACK, CFI_AMD_UNLOCK_ACK); in cfi_amd_write()
174 cfi_write(sc, ofs + addr, data); in cfi_amd_write()
198 struct cfi_softc *sc; in cfi_probe() local
203 sc = device_get_softc(dev); in cfi_probe()
204 sc->sc_dev = dev; in cfi_probe()
206 sc->sc_rid = 0; in cfi_probe()
207 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, in cfi_probe()
209 if (sc->sc_res == NULL) in cfi_probe()
212 sc->sc_tag = rman_get_bustag(sc->sc_res); in cfi_probe()
213 sc->sc_handle = rman_get_bushandle(sc->sc_res); in cfi_probe()
215 if (sc->sc_width == 0) { in cfi_probe()
216 sc->sc_width = 1; in cfi_probe()
217 while (sc->sc_width <= 4) { in cfi_probe()
218 if (cfi_read_qry(sc, CFI_QRY_IDENT) == 'Q') in cfi_probe()
220 sc->sc_width <<= 1; in cfi_probe()
222 } else if (cfi_read_qry(sc, CFI_QRY_IDENT) != 'Q') { in cfi_probe()
226 if (sc->sc_width > 4) { in cfi_probe()
232 if (cfi_read_qry(sc, CFI_QRY_IDENT + 1) != 'R' || in cfi_probe()
233 cfi_read_qry(sc, CFI_QRY_IDENT + 2) != 'Y') { in cfi_probe()
239 vend = cfi_read_qry(sc, CFI_QRY_VEND) | in cfi_probe()
240 (cfi_read_qry(sc, CFI_QRY_VEND + 1) << 8); in cfi_probe()
242 sc->sc_cmdset = vend; in cfi_probe()
265 sc->sc_size = 1U << cfi_read_qry(sc, CFI_QRY_SIZE); in cfi_probe()
268 iface = cfi_read_qry(sc, CFI_QRY_IFACE) | in cfi_probe()
269 (cfi_read_qry(sc, CFI_QRY_IFACE + 1) << 8); in cfi_probe()
278 error = (iface & sc->sc_width) ? 0 : EINVAL; in cfi_probe()
283 cfi_fmtsize(sc->sc_size)); in cfi_probe()
287 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); in cfi_probe()
294 struct cfi_softc *sc; in cfi_attach() local
303 sc = device_get_softc(dev); in cfi_attach()
304 sc->sc_dev = dev; in cfi_attach()
306 sc->sc_rid = 0; in cfi_attach()
307 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, in cfi_attach()
313 if (sc->sc_res == NULL) in cfi_attach()
316 sc->sc_tag = rman_get_bustag(sc->sc_res); in cfi_attach()
317 sc->sc_handle = rman_get_bushandle(sc->sc_res); in cfi_attach()
320 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_ERASE); in cfi_attach()
321 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_ERASE); in cfi_attach()
340 sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] = SBT_1MS * (1ULL << ttoexp); in cfi_attach()
341 sc->sc_max_timeouts[CFI_TIMEOUT_ERASE] = in cfi_attach()
342 sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] * (1ULL << mtoexp); in cfi_attach()
344 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_WRITE); in cfi_attach()
345 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_WRITE); in cfi_attach()
364 sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] = SBT_1US * (1ULL << ttoexp); in cfi_attach()
365 sc->sc_max_timeouts[CFI_TIMEOUT_WRITE] = in cfi_attach()
366 sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] * (1ULL << mtoexp); in cfi_attach()
368 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE); in cfi_attach()
369 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE); in cfi_attach()
380 sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] = in cfi_attach()
381 SBT_1US * (1ULL << cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE)); in cfi_attach()
382 sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE] = in cfi_attach()
383 sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] * in cfi_attach()
384 (1ULL << cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE)); in cfi_attach()
387 if (sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] != 0) in cfi_attach()
388 sc->sc_maxbuf = 1 << (cfi_read_qry(sc, CFI_QRY_MAXBUF) | in cfi_attach()
389 cfi_read_qry(sc, CFI_QRY_MAXBUF) << 8); in cfi_attach()
391 sc->sc_maxbuf = 0; in cfi_attach()
394 sc->sc_regions = cfi_read_qry(sc, CFI_QRY_NREGIONS); in cfi_attach()
395 sc->sc_region = malloc(sc->sc_regions * sizeof(struct cfi_region), in cfi_attach()
397 for (r = 0; r < sc->sc_regions; r++) { in cfi_attach()
398 blocks = cfi_read_qry(sc, CFI_QRY_REGION(r)) | in cfi_attach()
399 (cfi_read_qry(sc, CFI_QRY_REGION(r) + 1) << 8); in cfi_attach()
400 sc->sc_region[r].r_blocks = blocks + 1; in cfi_attach()
402 blksz = cfi_read_qry(sc, CFI_QRY_REGION(r) + 2) | in cfi_attach()
403 (cfi_read_qry(sc, CFI_QRY_REGION(r) + 3) << 8); in cfi_attach()
404 sc->sc_region[r].r_blksz = (blksz == 0) ? 128 : in cfi_attach()
409 cfi_write(sc, 0, CFI_BCS_CLEAR_STATUS); in cfi_attach()
413 for (r = 0; r < sc->sc_regions; r++) { in cfi_attach()
414 printf("%ux%s%s", sc->sc_region[r].r_blocks, in cfi_attach()
415 cfi_fmtsize(sc->sc_region[r].r_blksz), in cfi_attach()
416 (r == sc->sc_regions - 1) ? "]\n" : ","); in cfi_attach()
420 if (sc->sc_cmdset == CFI_VEND_AMD_ECS || in cfi_attach()
421 sc->sc_cmdset == CFI_VEND_AMD_SCS) { in cfi_attach()
422 cfi_amd_write(sc, 0, AMD_ADDR_START, CFI_AMD_AUTO_SELECT); in cfi_attach()
423 sc->sc_manid = cfi_read(sc, 0); in cfi_attach()
424 sc->sc_devid = cfi_read(sc, 2); in cfi_attach()
426 sc->sc_manid, sc->sc_devid); in cfi_attach()
427 cfi_write(sc, 0, CFI_BCS_READ_ARRAY2); in cfi_attach()
431 sc->sc_nod = make_dev(&cfi_cdevsw, u, UID_ROOT, GID_WHEEL, 0600, in cfi_attach()
433 sc->sc_nod->si_drv1 = sc; in cfi_attach()
435 cfi_add_sysctls(sc); in cfi_attach()
442 if (cfi_intel_get_factory_pr(sc, &ppr) == 0) { in cfi_attach()
458 cfi_add_sysctls(struct cfi_softc *sc) in cfi_add_sysctls() argument
463 ctx = device_get_sysctl_ctx(sc->sc_dev); in cfi_add_sysctls()
464 children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); in cfi_add_sysctls()
468 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_ERASE], in cfi_add_sysctls()
472 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_ERASE], 0, in cfi_add_sysctls()
476 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_WRITE], 0, in cfi_add_sysctls()
480 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_WRITE], 0, in cfi_add_sysctls()
482 if (sc->sc_maxbuf > 0) { in cfi_add_sysctls()
485 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_BUFWRITE], 0, in cfi_add_sysctls()
490 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_BUFWRITE], 0, in cfi_add_sysctls()
499 struct cfi_softc *sc; in cfi_detach() local
501 sc = device_get_softc(dev); in cfi_detach()
503 destroy_dev(sc->sc_nod); in cfi_detach()
504 free(sc->sc_region, M_TEMP); in cfi_detach()
505 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); in cfi_detach()
510 cfi_check_erase(struct cfi_softc *sc, u_int ofs, u_int sz) in cfi_check_erase() argument
517 for (i = 0; i < sz; i += sc->sc_width) { in cfi_check_erase()
518 val = cfi_read(sc, ofs + i); in cfi_check_erase()
519 switch (sc->sc_width) { in cfi_check_erase()
541 cfi_wait_ready(struct cfi_softc *sc, u_int ofs, sbintime_t start, in cfi_wait_ready() argument
558 switch (sc->sc_cmdset) { in cfi_wait_ready()
561 st = cfi_read(sc, ofs); in cfi_wait_ready()
580 st0 = cfi_read(sc, ofs); in cfi_wait_ready()
581 st = cfi_read(sc, ofs); in cfi_wait_ready()
587 now > start + sc->sc_typical_timeouts[cmd]) { in cfi_wait_ready()
590 sc->sc_tto_counts[cmd]++; in cfi_wait_ready()
592 device_printf(sc->sc_dev, in cfi_wait_ready()
596 if (now > start + sc->sc_max_timeouts[cmd]) { in cfi_wait_ready()
597 sc->sc_mto_counts[cmd]++; in cfi_wait_ready()
599 device_printf(sc->sc_dev, in cfi_wait_ready()
613 cfi_write_block(struct cfi_softc *sc) in cfi_write_block() argument
629 switch (sc->sc_cmdset) { in cfi_write_block()
632 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS); in cfi_write_block()
633 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_UB); in cfi_write_block()
634 cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY); in cfi_write_block()
639 for (i = 0; i < sc->sc_wrbufsz; i++) in cfi_write_block()
640 if ((sc->sc_wrbuf[i] & sc->sc_wrbufcpy[i]) != sc->sc_wrbuf[i]) { in cfi_write_block()
649 switch (sc->sc_cmdset) { in cfi_write_block()
652 cfi_write(sc, sc->sc_wrofs, CFI_BCS_BLOCK_ERASE); in cfi_write_block()
653 cfi_write(sc, sc->sc_wrofs, CFI_BCS_CONFIRM); in cfi_write_block()
658 minsz = sc->sc_region[0].r_blksz; in cfi_write_block()
659 for (i = 1; i < sc->sc_regions; i++) { in cfi_write_block()
660 if (sc->sc_region[i].r_blksz < minsz) in cfi_write_block()
661 minsz = sc->sc_region[i].r_blksz; in cfi_write_block()
663 cfi_amd_write(sc, sc->sc_wrofs, AMD_ADDR_START, in cfi_write_block()
665 cfi_amd_write(sc, sc->sc_wrofs, in cfi_write_block()
666 sc->sc_wrofs >> (ffs(minsz) - 1), in cfi_write_block()
669 if (cfi_check_erase(sc, sc->sc_wrofs, in cfi_write_block()
670 sc->sc_wrbufsz)) in cfi_write_block()
685 error = cfi_wait_ready(sc, sc->sc_wrofs, start, in cfi_write_block()
693 ptr.x8 = sc->sc_wrbuf; in cfi_write_block()
694 cpyprt.x8 = sc->sc_wrbufcpy; in cfi_write_block()
695 if (sc->sc_maxbuf > sc->sc_width) { in cfi_write_block()
696 switch (sc->sc_cmdset) { in cfi_write_block()
699 for (i = 0; i < sc->sc_wrbufsz; i += wlen) { in cfi_write_block()
700 wlen = MIN(sc->sc_maxbuf, sc->sc_wrbufsz - i); in cfi_write_block()
706 cfi_write(sc, sc->sc_wrofs + i, in cfi_write_block()
708 if (sbinuptime() > start + sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE]) { in cfi_write_block()
712 st = cfi_read(sc, sc->sc_wrofs + i); in cfi_write_block()
715 cfi_write(sc, sc->sc_wrofs + i, in cfi_write_block()
716 (wlen / sc->sc_width) - 1); in cfi_write_block()
717 switch (sc->sc_width) { in cfi_write_block()
719 bus_space_write_region_1(sc->sc_tag, in cfi_write_block()
720 sc->sc_handle, sc->sc_wrofs + i, in cfi_write_block()
724 bus_space_write_region_2(sc->sc_tag, in cfi_write_block()
725 sc->sc_handle, sc->sc_wrofs + i, in cfi_write_block()
729 bus_space_write_region_4(sc->sc_tag, in cfi_write_block()
730 sc->sc_handle, sc->sc_wrofs + i, in cfi_write_block()
735 cfi_write(sc, sc->sc_wrofs + i, in cfi_write_block()
740 error = cfi_wait_ready(sc, sc->sc_wrofs + i, in cfi_write_block()
753 for (i = 0; i < sc->sc_wrbufsz; i += sc->sc_width) { in cfi_write_block()
756 switch (sc->sc_width) { in cfi_write_block()
780 switch (sc->sc_cmdset) { in cfi_write_block()
783 cfi_write(sc, sc->sc_wrofs + i, CFI_BCS_PROGRAM); in cfi_write_block()
787 cfi_amd_write(sc, 0, AMD_ADDR_START, CFI_AMD_PROGRAM); in cfi_write_block()
790 switch (sc->sc_width) { in cfi_write_block()
792 bus_space_write_1(sc->sc_tag, sc->sc_handle, in cfi_write_block()
793 sc->sc_wrofs + i, *(ptr.x8 + i)); in cfi_write_block()
796 bus_space_write_2(sc->sc_tag, sc->sc_handle, in cfi_write_block()
797 sc->sc_wrofs + i, *(ptr.x16 + i / 2)); in cfi_write_block()
800 bus_space_write_4(sc->sc_tag, sc->sc_handle, in cfi_write_block()
801 sc->sc_wrofs + i, *(ptr.x32 + i / 4)); in cfi_write_block()
807 if (sc->sc_cmdset == CFI_VEND_AMD_ECS || in cfi_write_block()
808 sc->sc_cmdset == CFI_VEND_AMD_SCS) { in cfi_write_block()
810 switch (sc->sc_width) { in cfi_write_block()
822 if (cfi_read(sc, sc->sc_wrofs + i) == val) in cfi_write_block()
833 error = cfi_wait_ready(sc, sc->sc_wrofs, start, in cfi_write_block()
843 cfi_reset_default(sc); in cfi_write_block()
846 switch (sc->sc_cmdset) { in cfi_write_block()
849 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS); in cfi_write_block()
850 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LB); in cfi_write_block()
851 cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY); in cfi_write_block()
871 cfi_get16(struct cfi_softc *sc, int off) in cfi_get16() argument
873 uint16_t v = bus_space_read_2(sc->sc_tag, sc->sc_handle, off<<1); in cfi_get16()
879 cfi_put16(struct cfi_softc *sc, int off, uint16_t v) in cfi_put16() argument
881 bus_space_write_2(sc->sc_tag, sc->sc_handle, off<<1, v); in cfi_put16()
889 cfi_intel_get_factory_pr(struct cfi_softc *sc, uint64_t *id) in cfi_intel_get_factory_pr() argument
891 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_get_factory_pr()
893 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_get_factory_pr()
895 cfi_write(sc, 0, CFI_INTEL_READ_ID); in cfi_intel_get_factory_pr()
896 *id = ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(0)))<<48 | in cfi_intel_get_factory_pr()
897 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(1)))<<32 | in cfi_intel_get_factory_pr()
898 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(2)))<<16 | in cfi_intel_get_factory_pr()
899 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(3))); in cfi_intel_get_factory_pr()
900 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_get_factory_pr()
908 cfi_intel_get_oem_pr(struct cfi_softc *sc, uint64_t *id) in cfi_intel_get_oem_pr() argument
910 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_get_oem_pr()
912 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_get_oem_pr()
914 cfi_write(sc, 0, CFI_INTEL_READ_ID); in cfi_intel_get_oem_pr()
915 *id = ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(4)))<<48 | in cfi_intel_get_oem_pr()
916 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(5)))<<32 | in cfi_intel_get_oem_pr()
917 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(6)))<<16 | in cfi_intel_get_oem_pr()
918 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(7))); in cfi_intel_get_oem_pr()
919 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_get_oem_pr()
928 cfi_intel_set_oem_pr(struct cfi_softc *sc, uint64_t id) in cfi_intel_set_oem_pr() argument
936 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_set_oem_pr()
938 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_set_oem_pr()
944 cfi_write(sc, 0, CFI_INTEL_PP_SETUP); in cfi_intel_set_oem_pr()
945 cfi_put16(sc, CFI_INTEL_PR(i), id&0xffff); in cfi_intel_set_oem_pr()
947 error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start, in cfi_intel_set_oem_pr()
952 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_set_oem_pr()
955 device_printf(sc->sc_dev, "%s: OEM PR not set, " in cfi_intel_set_oem_pr()
965 cfi_intel_get_plr(struct cfi_softc *sc, uint32_t *plr) in cfi_intel_get_plr() argument
967 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_get_plr()
969 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_get_plr()
971 cfi_write(sc, 0, CFI_INTEL_READ_ID); in cfi_intel_get_plr()
972 *plr = cfi_get16(sc, CFI_INTEL_PLR); in cfi_intel_get_plr()
973 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_get_plr()
983 cfi_intel_set_plr(struct cfi_softc *sc) in cfi_intel_set_plr() argument
990 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_set_plr()
992 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_set_plr()
996 device_printf(sc->sc_dev, "set PLR\n"); in cfi_intel_set_plr()
999 cfi_write(sc, 0, CFI_INTEL_PP_SETUP); in cfi_intel_set_plr()
1000 cfi_put16(sc, CFI_INTEL_PLR, 0xFFFD); in cfi_intel_set_plr()
1002 error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start, in cfi_intel_set_plr()
1004 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_set_plr()
1007 device_printf(sc->sc_dev, "%s: PLR not set, " in cfi_intel_set_plr()