Lines Matching refs:sc

67 cfi_read_raw(struct cfi_softc *sc, u_int ofs)  in cfi_read_raw()  argument
71 ofs &= ~(sc->sc_width - 1); in cfi_read_raw()
72 switch (sc->sc_width) { in cfi_read_raw()
74 val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); in cfi_read_raw()
77 val = bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs); in cfi_read_raw()
80 val = bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs); in cfi_read_raw()
90 cfi_read(struct cfi_softc *sc, u_int ofs) in cfi_read() argument
95 ofs &= ~(sc->sc_width - 1); in cfi_read()
96 switch (sc->sc_width) { in cfi_read()
98 val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); in cfi_read()
101 sval = bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs); in cfi_read()
105 val = bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs); in cfi_read()
116 cfi_write(struct cfi_softc *sc, u_int ofs, u_int val) in cfi_write() argument
119 ofs &= ~(sc->sc_width - 1); in cfi_write()
120 switch (sc->sc_width) { in cfi_write()
122 bus_space_write_1(sc->sc_tag, sc->sc_handle, ofs, val); in cfi_write()
125 bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, htole16(val)); in cfi_write()
128 bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, htole32(val)); in cfi_write()
134 cfi_read_qry(struct cfi_softc *sc, u_int ofs) in cfi_read_qry() argument
138 cfi_write(sc, CFI_QRY_CMD_ADDR * sc->sc_width, CFI_QRY_CMD_DATA); in cfi_read_qry()
139 val = cfi_read(sc, ofs * sc->sc_width); in cfi_read_qry()
140 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_read_qry()
145 cfi_amd_write(struct cfi_softc *sc, u_int ofs, u_int addr, u_int data) in cfi_amd_write() argument
148 cfi_write(sc, ofs + AMD_ADDR_START, CFI_AMD_UNLOCK); in cfi_amd_write()
149 cfi_write(sc, ofs + AMD_ADDR_ACK, CFI_AMD_UNLOCK_ACK); in cfi_amd_write()
150 cfi_write(sc, ofs + addr, data); in cfi_amd_write()
174 struct cfi_softc *sc; in cfi_probe() local
179 sc = device_get_softc(dev); in cfi_probe()
180 sc->sc_dev = dev; in cfi_probe()
182 sc->sc_rid = 0; in cfi_probe()
183 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, in cfi_probe()
185 if (sc->sc_res == NULL) in cfi_probe()
188 sc->sc_tag = rman_get_bustag(sc->sc_res); in cfi_probe()
189 sc->sc_handle = rman_get_bushandle(sc->sc_res); in cfi_probe()
191 if (sc->sc_width == 0) { in cfi_probe()
192 sc->sc_width = 1; in cfi_probe()
193 while (sc->sc_width <= 4) { in cfi_probe()
194 if (cfi_read_qry(sc, CFI_QRY_IDENT) == 'Q') in cfi_probe()
196 sc->sc_width <<= 1; in cfi_probe()
198 } else if (cfi_read_qry(sc, CFI_QRY_IDENT) != 'Q') { in cfi_probe()
202 if (sc->sc_width > 4) { in cfi_probe()
208 if (cfi_read_qry(sc, CFI_QRY_IDENT + 1) != 'R' || in cfi_probe()
209 cfi_read_qry(sc, CFI_QRY_IDENT + 2) != 'Y') { in cfi_probe()
215 vend = cfi_read_qry(sc, CFI_QRY_VEND) | in cfi_probe()
216 (cfi_read_qry(sc, CFI_QRY_VEND + 1) << 8); in cfi_probe()
218 sc->sc_cmdset = vend; in cfi_probe()
241 sc->sc_size = 1U << cfi_read_qry(sc, CFI_QRY_SIZE); in cfi_probe()
244 iface = cfi_read_qry(sc, CFI_QRY_IFACE) | in cfi_probe()
245 (cfi_read_qry(sc, CFI_QRY_IFACE + 1) << 8); in cfi_probe()
254 error = (iface & sc->sc_width) ? 0 : EINVAL; in cfi_probe()
259 cfi_fmtsize(sc->sc_size)); in cfi_probe()
263 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); in cfi_probe()
270 struct cfi_softc *sc; in cfi_attach() local
279 sc = device_get_softc(dev); in cfi_attach()
280 sc->sc_dev = dev; in cfi_attach()
282 sc->sc_rid = 0; in cfi_attach()
283 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, in cfi_attach()
289 if (sc->sc_res == NULL) in cfi_attach()
292 sc->sc_tag = rman_get_bustag(sc->sc_res); in cfi_attach()
293 sc->sc_handle = rman_get_bushandle(sc->sc_res); in cfi_attach()
296 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_ERASE); in cfi_attach()
297 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_ERASE); in cfi_attach()
316 sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] = SBT_1MS * (1ULL << ttoexp); in cfi_attach()
317 sc->sc_max_timeouts[CFI_TIMEOUT_ERASE] = in cfi_attach()
318 sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] * (1ULL << mtoexp); in cfi_attach()
320 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_WRITE); in cfi_attach()
321 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_WRITE); in cfi_attach()
340 sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] = SBT_1US * (1ULL << ttoexp); in cfi_attach()
341 sc->sc_max_timeouts[CFI_TIMEOUT_WRITE] = in cfi_attach()
342 sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] * (1ULL << mtoexp); in cfi_attach()
344 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE); in cfi_attach()
345 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE); in cfi_attach()
356 sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] = in cfi_attach()
357 SBT_1US * (1ULL << cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE)); in cfi_attach()
358 sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE] = in cfi_attach()
359 sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] * in cfi_attach()
360 (1ULL << cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE)); in cfi_attach()
363 if (sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] != 0) in cfi_attach()
364 sc->sc_maxbuf = 1 << (cfi_read_qry(sc, CFI_QRY_MAXBUF) | in cfi_attach()
365 cfi_read_qry(sc, CFI_QRY_MAXBUF) << 8); in cfi_attach()
367 sc->sc_maxbuf = 0; in cfi_attach()
370 sc->sc_regions = cfi_read_qry(sc, CFI_QRY_NREGIONS); in cfi_attach()
371 sc->sc_region = malloc(sc->sc_regions * sizeof(struct cfi_region), in cfi_attach()
373 for (r = 0; r < sc->sc_regions; r++) { in cfi_attach()
374 blocks = cfi_read_qry(sc, CFI_QRY_REGION(r)) | in cfi_attach()
375 (cfi_read_qry(sc, CFI_QRY_REGION(r) + 1) << 8); in cfi_attach()
376 sc->sc_region[r].r_blocks = blocks + 1; in cfi_attach()
378 blksz = cfi_read_qry(sc, CFI_QRY_REGION(r) + 2) | in cfi_attach()
379 (cfi_read_qry(sc, CFI_QRY_REGION(r) + 3) << 8); in cfi_attach()
380 sc->sc_region[r].r_blksz = (blksz == 0) ? 128 : in cfi_attach()
385 cfi_write(sc, 0, CFI_BCS_CLEAR_STATUS); in cfi_attach()
389 for (r = 0; r < sc->sc_regions; r++) { in cfi_attach()
390 printf("%ux%s%s", sc->sc_region[r].r_blocks, in cfi_attach()
391 cfi_fmtsize(sc->sc_region[r].r_blksz), in cfi_attach()
392 (r == sc->sc_regions - 1) ? "]\n" : ","); in cfi_attach()
397 sc->sc_nod = make_dev(&cfi_cdevsw, u, UID_ROOT, GID_WHEEL, 0600, in cfi_attach()
399 sc->sc_nod->si_drv1 = sc; in cfi_attach()
401 cfi_add_sysctls(sc); in cfi_attach()
408 if (cfi_intel_get_factory_pr(sc, &ppr) == 0) { in cfi_attach()
424 cfi_add_sysctls(struct cfi_softc *sc) in cfi_add_sysctls() argument
429 ctx = device_get_sysctl_ctx(sc->sc_dev); in cfi_add_sysctls()
430 children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); in cfi_add_sysctls()
434 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_ERASE], in cfi_add_sysctls()
438 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_ERASE], 0, in cfi_add_sysctls()
442 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_WRITE], 0, in cfi_add_sysctls()
446 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_WRITE], 0, in cfi_add_sysctls()
448 if (sc->sc_maxbuf > 0) { in cfi_add_sysctls()
451 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_BUFWRITE], 0, in cfi_add_sysctls()
456 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_BUFWRITE], 0, in cfi_add_sysctls()
465 struct cfi_softc *sc; in cfi_detach() local
467 sc = device_get_softc(dev); in cfi_detach()
469 destroy_dev(sc->sc_nod); in cfi_detach()
470 free(sc->sc_region, M_TEMP); in cfi_detach()
471 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); in cfi_detach()
476 cfi_wait_ready(struct cfi_softc *sc, u_int ofs, sbintime_t start, in cfi_wait_ready() argument
493 switch (sc->sc_cmdset) { in cfi_wait_ready()
496 st = cfi_read(sc, ofs); in cfi_wait_ready()
515 st0 = cfi_read(sc, ofs); in cfi_wait_ready()
516 st = cfi_read(sc, ofs); in cfi_wait_ready()
522 now > start + sc->sc_typical_timeouts[cmd]) { in cfi_wait_ready()
525 sc->sc_tto_counts[cmd]++; in cfi_wait_ready()
527 device_printf(sc->sc_dev, in cfi_wait_ready()
531 if (now > start + sc->sc_max_timeouts[cmd]) { in cfi_wait_ready()
532 sc->sc_mto_counts[cmd]++; in cfi_wait_ready()
534 device_printf(sc->sc_dev, in cfi_wait_ready()
548 cfi_write_block(struct cfi_softc *sc) in cfi_write_block() argument
562 switch (sc->sc_cmdset) { in cfi_write_block()
565 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS); in cfi_write_block()
566 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_UB); in cfi_write_block()
567 cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY); in cfi_write_block()
572 for (i = 0; i < sc->sc_wrbufsz; i++) in cfi_write_block()
573 if ((sc->sc_wrbuf[i] & sc->sc_wrbufcpy[i]) != sc->sc_wrbuf[i]) { in cfi_write_block()
582 switch (sc->sc_cmdset) { in cfi_write_block()
585 cfi_write(sc, sc->sc_wrofs, CFI_BCS_BLOCK_ERASE); in cfi_write_block()
586 cfi_write(sc, sc->sc_wrofs, CFI_BCS_CONFIRM); in cfi_write_block()
590 cfi_amd_write(sc, sc->sc_wrofs, AMD_ADDR_START, in cfi_write_block()
592 cfi_amd_write(sc, sc->sc_wrofs, 0, CFI_AMD_BLOCK_ERASE); in cfi_write_block()
600 error = cfi_wait_ready(sc, sc->sc_wrofs, start, in cfi_write_block()
608 ptr.x8 = sc->sc_wrbuf; in cfi_write_block()
609 cpyprt.x8 = sc->sc_wrbufcpy; in cfi_write_block()
610 if (sc->sc_maxbuf > sc->sc_width) { in cfi_write_block()
611 switch (sc->sc_cmdset) { in cfi_write_block()
614 for (i = 0; i < sc->sc_wrbufsz; i += wlen) { in cfi_write_block()
615 wlen = MIN(sc->sc_maxbuf, sc->sc_wrbufsz - i); in cfi_write_block()
621 cfi_write(sc, sc->sc_wrofs + i, in cfi_write_block()
623 if (sbinuptime() > start + sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE]) { in cfi_write_block()
627 st = cfi_read(sc, sc->sc_wrofs + i); in cfi_write_block()
630 cfi_write(sc, sc->sc_wrofs + i, in cfi_write_block()
631 (wlen / sc->sc_width) - 1); in cfi_write_block()
632 switch (sc->sc_width) { in cfi_write_block()
634 bus_space_write_region_1(sc->sc_tag, in cfi_write_block()
635 sc->sc_handle, sc->sc_wrofs + i, in cfi_write_block()
639 bus_space_write_region_2(sc->sc_tag, in cfi_write_block()
640 sc->sc_handle, sc->sc_wrofs + i, in cfi_write_block()
644 bus_space_write_region_4(sc->sc_tag, in cfi_write_block()
645 sc->sc_handle, sc->sc_wrofs + i, in cfi_write_block()
650 cfi_write(sc, sc->sc_wrofs + i, in cfi_write_block()
655 error = cfi_wait_ready(sc, sc->sc_wrofs + i, in cfi_write_block()
669 for (i = 0; i < sc->sc_wrbufsz; i += sc->sc_width) { in cfi_write_block()
673 switch (sc->sc_width) { in cfi_write_block()
697 switch (sc->sc_cmdset) { in cfi_write_block()
700 cfi_write(sc, sc->sc_wrofs + i, CFI_BCS_PROGRAM); in cfi_write_block()
704 cfi_amd_write(sc, 0, AMD_ADDR_START, CFI_AMD_PROGRAM); in cfi_write_block()
707 switch (sc->sc_width) { in cfi_write_block()
709 bus_space_write_1(sc->sc_tag, sc->sc_handle, in cfi_write_block()
710 sc->sc_wrofs + i, *(ptr.x8 + i)); in cfi_write_block()
713 bus_space_write_2(sc->sc_tag, sc->sc_handle, in cfi_write_block()
714 sc->sc_wrofs + i, *(ptr.x16 + i / 2)); in cfi_write_block()
717 bus_space_write_4(sc->sc_tag, sc->sc_handle, in cfi_write_block()
718 sc->sc_wrofs + i, *(ptr.x32 + i / 4)); in cfi_write_block()
724 error = cfi_wait_ready(sc, sc->sc_wrofs, start, in cfi_write_block()
733 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_write_block()
736 switch (sc->sc_cmdset) { in cfi_write_block()
739 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS); in cfi_write_block()
740 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LB); in cfi_write_block()
741 cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY); in cfi_write_block()
761 cfi_get16(struct cfi_softc *sc, int off) in cfi_get16() argument
763 uint16_t v = bus_space_read_2(sc->sc_tag, sc->sc_handle, off<<1); in cfi_get16()
769 cfi_put16(struct cfi_softc *sc, int off, uint16_t v) in cfi_put16() argument
771 bus_space_write_2(sc->sc_tag, sc->sc_handle, off<<1, v); in cfi_put16()
779 cfi_intel_get_factory_pr(struct cfi_softc *sc, uint64_t *id) in cfi_intel_get_factory_pr() argument
781 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_get_factory_pr()
783 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_get_factory_pr()
785 cfi_write(sc, 0, CFI_INTEL_READ_ID); in cfi_intel_get_factory_pr()
786 *id = ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(0)))<<48 | in cfi_intel_get_factory_pr()
787 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(1)))<<32 | in cfi_intel_get_factory_pr()
788 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(2)))<<16 | in cfi_intel_get_factory_pr()
789 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(3))); in cfi_intel_get_factory_pr()
790 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_get_factory_pr()
798 cfi_intel_get_oem_pr(struct cfi_softc *sc, uint64_t *id) in cfi_intel_get_oem_pr() argument
800 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_get_oem_pr()
802 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_get_oem_pr()
804 cfi_write(sc, 0, CFI_INTEL_READ_ID); in cfi_intel_get_oem_pr()
805 *id = ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(4)))<<48 | in cfi_intel_get_oem_pr()
806 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(5)))<<32 | in cfi_intel_get_oem_pr()
807 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(6)))<<16 | in cfi_intel_get_oem_pr()
808 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(7))); in cfi_intel_get_oem_pr()
809 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_get_oem_pr()
818 cfi_intel_set_oem_pr(struct cfi_softc *sc, uint64_t id) in cfi_intel_set_oem_pr() argument
826 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_set_oem_pr()
828 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_set_oem_pr()
834 cfi_write(sc, 0, CFI_INTEL_PP_SETUP); in cfi_intel_set_oem_pr()
835 cfi_put16(sc, CFI_INTEL_PR(i), id&0xffff); in cfi_intel_set_oem_pr()
837 error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start, in cfi_intel_set_oem_pr()
842 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_set_oem_pr()
845 device_printf(sc->sc_dev, "%s: OEM PR not set, " in cfi_intel_set_oem_pr()
855 cfi_intel_get_plr(struct cfi_softc *sc, uint32_t *plr) in cfi_intel_get_plr() argument
857 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_get_plr()
859 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_get_plr()
861 cfi_write(sc, 0, CFI_INTEL_READ_ID); in cfi_intel_get_plr()
862 *plr = cfi_get16(sc, CFI_INTEL_PLR); in cfi_intel_get_plr()
863 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_get_plr()
873 cfi_intel_set_plr(struct cfi_softc *sc) in cfi_intel_set_plr() argument
880 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) in cfi_intel_set_plr()
882 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); in cfi_intel_set_plr()
886 device_printf(sc->sc_dev, "set PLR\n"); in cfi_intel_set_plr()
889 cfi_write(sc, 0, CFI_INTEL_PP_SETUP); in cfi_intel_set_plr()
890 cfi_put16(sc, CFI_INTEL_PLR, 0xFFFD); in cfi_intel_set_plr()
892 error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start, in cfi_intel_set_plr()
894 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); in cfi_intel_set_plr()
897 device_printf(sc->sc_dev, "%s: PLR not set, " in cfi_intel_set_plr()