Lines Matching refs:s

95 static void omap_gpmc_int_update(struct omap_gpmc_s *s)  in omap_gpmc_int_update()  argument
106 if (s->prefetch.fifopointer >= prefetch_threshold(s->prefetch.config1)) { in omap_gpmc_int_update()
107 s->irqst |= 1; in omap_gpmc_int_update()
109 if ((s->irqen & s->irqst) != s->lastirq) { in omap_gpmc_int_update()
110 s->lastirq = s->irqen & s->irqst; in omap_gpmc_int_update()
111 qemu_set_irq(s->irq, s->lastirq); in omap_gpmc_int_update()
115 static void omap_gpmc_dma_update(struct omap_gpmc_s *s, int value) in omap_gpmc_dma_update() argument
117 if (s->prefetch.config1 & 4) { in omap_gpmc_dma_update()
118 qemu_set_irq(s->drq, value); in omap_gpmc_dma_update()
219 static void fill_prefetch_fifo(struct omap_gpmc_s *s) in fill_prefetch_fifo() argument
236 int cs = prefetch_cs(s->prefetch.config1); in fill_prefetch_fifo()
237 int is16bit = (((s->cs_file[cs].config[0] >> 12) & 3) != 0); in fill_prefetch_fifo()
243 bytes = 64 - s->prefetch.fifopointer; in fill_prefetch_fifo()
244 if (bytes > s->prefetch.count) { in fill_prefetch_fifo()
245 bytes = s->prefetch.count; in fill_prefetch_fifo()
251 s->prefetch.count -= bytes; in fill_prefetch_fifo()
252 s->prefetch.fifopointer += bytes; in fill_prefetch_fifo()
253 fptr = 64 - s->prefetch.fifopointer; in fill_prefetch_fifo()
258 s->prefetch.fifo[fptr] = s->prefetch.fifo[fptr + bytes]; in fill_prefetch_fifo()
263 uint32_t v = omap_nand_read(&s->cs_file[cs], 0, 2); in fill_prefetch_fifo()
264 s->prefetch.fifo[fptr++] = v & 0xff; in fill_prefetch_fifo()
265 s->prefetch.fifo[fptr++] = (v >> 8) & 0xff; in fill_prefetch_fifo()
267 s->prefetch.fifo[fptr++] = omap_nand_read(&s->cs_file[cs], 0, 1); in fill_prefetch_fifo()
270 if (s->prefetch.startengine && (s->prefetch.count == 0)) { in fill_prefetch_fifo()
272 s->irqst |= 2; in fill_prefetch_fifo()
273 s->prefetch.startengine = 0; in fill_prefetch_fifo()
280 if (s->prefetch.fifopointer != 0) { in fill_prefetch_fifo()
281 omap_gpmc_dma_update(s, 1); in fill_prefetch_fifo()
283 omap_gpmc_int_update(s); in fill_prefetch_fifo()
293 struct omap_gpmc_s *s = opaque; in omap_gpmc_prefetch_read() local
295 if (s->prefetch.config1 & 1) { in omap_gpmc_prefetch_read()
303 if (s->prefetch.fifopointer) { in omap_gpmc_prefetch_read()
304 s->prefetch.fifopointer--; in omap_gpmc_prefetch_read()
306 data = s->prefetch.fifo[63 - s->prefetch.fifopointer]; in omap_gpmc_prefetch_read()
307 if (s->prefetch.fifopointer == in omap_gpmc_prefetch_read()
308 (64 - prefetch_threshold(s->prefetch.config1))) { in omap_gpmc_prefetch_read()
313 omap_gpmc_dma_update(s, 0); in omap_gpmc_prefetch_read()
314 fill_prefetch_fifo(s); in omap_gpmc_prefetch_read()
316 omap_gpmc_int_update(s); in omap_gpmc_prefetch_read()
323 struct omap_gpmc_s *s = opaque; in omap_gpmc_prefetch_write() local
324 int cs = prefetch_cs(s->prefetch.config1); in omap_gpmc_prefetch_write()
325 if ((s->prefetch.config1 & 1) == 0) { in omap_gpmc_prefetch_write()
332 if (s->prefetch.count == 0) { in omap_gpmc_prefetch_write()
343 int is16bit = (((s->cs_file[cs].config[0] >> 12) & 3) != 0); in omap_gpmc_prefetch_write()
348 if (s->prefetch.fifopointer == 64) { in omap_gpmc_prefetch_write()
349 s->prefetch.fifo[0] = value; in omap_gpmc_prefetch_write()
350 s->prefetch.fifopointer--; in omap_gpmc_prefetch_write()
352 value = (value << 8) | s->prefetch.fifo[0]; in omap_gpmc_prefetch_write()
353 omap_nand_write(&s->cs_file[cs], 0, value, 2); in omap_gpmc_prefetch_write()
354 s->prefetch.count--; in omap_gpmc_prefetch_write()
355 s->prefetch.fifopointer = 64; in omap_gpmc_prefetch_write()
359 omap_nand_write(&s->cs_file[cs], 0, value, 1); in omap_gpmc_prefetch_write()
360 s->prefetch.count--; in omap_gpmc_prefetch_write()
362 if (s->prefetch.count == 0) { in omap_gpmc_prefetch_write()
364 s->irqst |= 2; in omap_gpmc_prefetch_write()
365 s->prefetch.startengine = 0; in omap_gpmc_prefetch_write()
367 omap_gpmc_int_update(s); in omap_gpmc_prefetch_write()
378 static MemoryRegion *omap_gpmc_cs_memregion(struct omap_gpmc_s *s, int cs) in omap_gpmc_cs_memregion() argument
381 struct omap_gpmc_cs_file_s *f = &s->cs_file[cs]; in omap_gpmc_cs_memregion()
385 if ((s->prefetch.config1 & 0x80) && in omap_gpmc_cs_memregion()
386 (prefetch_cs(s->prefetch.config1) == cs)) { in omap_gpmc_cs_memregion()
388 return &s->prefetch.iomem; in omap_gpmc_cs_memregion()
393 static void omap_gpmc_cs_map(struct omap_gpmc_s *s, int cs) in omap_gpmc_cs_map() argument
395 struct omap_gpmc_cs_file_s *f = &s->cs_file[cs]; in omap_gpmc_cs_map()
411 && !(s->accept_256 && !mask)) { in omap_gpmc_cs_map()
424 omap_gpmc_cs_memregion(s, cs)); in omap_gpmc_cs_map()
429 static void omap_gpmc_cs_unmap(struct omap_gpmc_s *s, int cs) in omap_gpmc_cs_unmap() argument
431 struct omap_gpmc_cs_file_s *f = &s->cs_file[cs]; in omap_gpmc_cs_unmap()
440 memory_region_del_subregion(&f->container, omap_gpmc_cs_memregion(s, cs)); in omap_gpmc_cs_unmap()
444 void omap_gpmc_reset(struct omap_gpmc_s *s) in omap_gpmc_reset() argument
448 s->sysconfig = 0; in omap_gpmc_reset()
449 s->irqst = 0; in omap_gpmc_reset()
450 s->irqen = 0; in omap_gpmc_reset()
451 omap_gpmc_int_update(s); in omap_gpmc_reset()
456 omap_gpmc_cs_unmap(s, i); in omap_gpmc_reset()
458 s->timeout = 0; in omap_gpmc_reset()
459 s->config = 0xa00; in omap_gpmc_reset()
460 s->prefetch.config1 = 0x00004000; in omap_gpmc_reset()
461 s->prefetch.transfercount = 0x00000000; in omap_gpmc_reset()
462 s->prefetch.startengine = 0; in omap_gpmc_reset()
463 s->prefetch.fifopointer = 0; in omap_gpmc_reset()
464 s->prefetch.count = 0; in omap_gpmc_reset()
466 s->cs_file[i].config[1] = 0x101001; in omap_gpmc_reset()
467 s->cs_file[i].config[2] = 0x020201; in omap_gpmc_reset()
468 s->cs_file[i].config[3] = 0x10031003; in omap_gpmc_reset()
469 s->cs_file[i].config[4] = 0x10f1111; in omap_gpmc_reset()
470 s->cs_file[i].config[5] = 0; in omap_gpmc_reset()
471 s->cs_file[i].config[6] = 0xf00; in omap_gpmc_reset()
477 s->cs_file[i].config[0] &= 0x00433e00; in omap_gpmc_reset()
478 s->cs_file[i].config[6] |= 1 << 6; /* CSVALID */ in omap_gpmc_reset()
479 omap_gpmc_cs_map(s, i); in omap_gpmc_reset()
481 s->cs_file[i].config[0] &= 0x00403c00; in omap_gpmc_reset()
484 s->ecc_cs = 0; in omap_gpmc_reset()
485 s->ecc_ptr = 0; in omap_gpmc_reset()
486 s->ecc_cfg = 0x3fcff000; in omap_gpmc_reset()
488 ecc_reset(&s->ecc[i]); in omap_gpmc_reset()
512 struct omap_gpmc_s *s = opaque; in omap_gpmc_read() local
522 return s->revision; in omap_gpmc_read()
525 return s->sysconfig; in omap_gpmc_read()
531 return s->irqst; in omap_gpmc_read()
534 return s->irqen; in omap_gpmc_read()
537 return s->timeout; in omap_gpmc_read()
544 return s->config; in omap_gpmc_read()
552 f = s->cs_file + cs; in omap_gpmc_read()
577 return s->prefetch.config1; in omap_gpmc_read()
579 return s->prefetch.transfercount; in omap_gpmc_read()
581 return s->prefetch.startengine; in omap_gpmc_read()
590 return (s->prefetch.fifopointer << 24) | in omap_gpmc_read()
591 ((s->prefetch.fifopointer >= in omap_gpmc_read()
592 ((s->prefetch.config1 >> 8) & 0x7f) ? 1 : 0) << 16) | in omap_gpmc_read()
593 s->prefetch.count; in omap_gpmc_read()
596 return s->ecc_cs; in omap_gpmc_read()
598 return s->ecc_ptr; in omap_gpmc_read()
600 return s->ecc_cfg; in omap_gpmc_read()
605 ((s->ecc[cs].cp & 0x07) << 0) | in omap_gpmc_read()
606 ((s->ecc[cs].cp & 0x38) << 13) | in omap_gpmc_read()
607 ((s->ecc[cs].lp[0] & 0x1ff) << 3) | in omap_gpmc_read()
608 ((s->ecc[cs].lp[1] & 0x1ff) << 19); in omap_gpmc_read()
624 struct omap_gpmc_s *s = opaque; in omap_gpmc_write() local
649 omap_gpmc_reset(s); in omap_gpmc_write()
650 s->sysconfig = value & 0x19; in omap_gpmc_write()
654 s->irqst &= ~value; in omap_gpmc_write()
655 omap_gpmc_int_update(s); in omap_gpmc_write()
659 s->irqen = value & 0xf03; in omap_gpmc_write()
660 omap_gpmc_int_update(s); in omap_gpmc_write()
664 s->timeout = value & 0x1ff1; in omap_gpmc_write()
672 s->config = value & 0xf13; in omap_gpmc_write()
678 f = s->cs_file + cs; in omap_gpmc_write()
700 omap_gpmc_cs_unmap(s, cs); in omap_gpmc_write()
702 omap_gpmc_cs_map(s, cs); in omap_gpmc_write()
728 if (!s->prefetch.startengine) { in omap_gpmc_write()
731 changed = newconfig1 ^ s->prefetch.config1; in omap_gpmc_write()
741 int oldcs = prefetch_cs(s->prefetch.config1); in omap_gpmc_write()
743 omap_gpmc_cs_unmap(s, oldcs); in omap_gpmc_write()
745 omap_gpmc_cs_unmap(s, newcs); in omap_gpmc_write()
747 s->prefetch.config1 = newconfig1; in omap_gpmc_write()
748 omap_gpmc_cs_map(s, oldcs); in omap_gpmc_write()
750 omap_gpmc_cs_map(s, newcs); in omap_gpmc_write()
753 s->prefetch.config1 = newconfig1; in omap_gpmc_write()
759 if (!s->prefetch.startengine) { in omap_gpmc_write()
760 s->prefetch.transfercount = value & 0x3fff; in omap_gpmc_write()
765 if (s->prefetch.startengine != (value & 1)) { in omap_gpmc_write()
766 s->prefetch.startengine = value & 1; in omap_gpmc_write()
767 if (s->prefetch.startengine) { in omap_gpmc_write()
769 s->prefetch.count = s->prefetch.transfercount; in omap_gpmc_write()
770 if (s->prefetch.config1 & 1) { in omap_gpmc_write()
772 s->prefetch.fifopointer = 64; in omap_gpmc_write()
775 s->prefetch.fifopointer = 0; in omap_gpmc_write()
776 fill_prefetch_fifo(s); in omap_gpmc_write()
786 s->prefetch.count = 0; in omap_gpmc_write()
788 omap_gpmc_int_update(s); in omap_gpmc_write()
793 s->ecc_cs = 0x8f; in omap_gpmc_write()
798 ecc_reset(&s->ecc[cs]); in omap_gpmc_write()
799 s->ecc_ptr = value & 0xf; in omap_gpmc_write()
800 if (s->ecc_ptr == 0 || s->ecc_ptr > 9) { in omap_gpmc_write()
801 s->ecc_ptr = 0; in omap_gpmc_write()
802 s->ecc_cs &= ~1; in omap_gpmc_write()
806 s->ecc_cfg = value & 0x3fcff1ff; in omap_gpmc_write()
831 struct omap_gpmc_s *s = g_new0(struct omap_gpmc_s, 1); in omap_gpmc_init() local
833 memory_region_init_io(&s->iomem, NULL, &omap_gpmc_ops, s, "omap-gpmc", 0x1000); in omap_gpmc_init()
834 memory_region_add_subregion(get_system_memory(), base, &s->iomem); in omap_gpmc_init()
836 s->irq = irq; in omap_gpmc_init()
837 s->drq = drq; in omap_gpmc_init()
838 s->accept_256 = cpu_is_omap3630(mpu); in omap_gpmc_init()
839 s->revision = cpu_class_omap3(mpu) ? 0x50 : 0x20; in omap_gpmc_init()
840 s->lastirq = 0; in omap_gpmc_init()
841 omap_gpmc_reset(s); in omap_gpmc_init()
850 memory_region_init_io(&s->cs_file[cs].nandiomem, NULL, in omap_gpmc_init()
852 &s->cs_file[cs], in omap_gpmc_init()
857 memory_region_init_io(&s->prefetch.iomem, NULL, &omap_prefetch_ops, s, in omap_gpmc_init()
859 return s; in omap_gpmc_init()
862 void omap_gpmc_attach(struct omap_gpmc_s *s, int cs, MemoryRegion *iomem) in omap_gpmc_attach() argument
871 f = &s->cs_file[cs]; in omap_gpmc_attach()
873 omap_gpmc_cs_unmap(s, cs); in omap_gpmc_attach()
876 omap_gpmc_cs_map(s, cs); in omap_gpmc_attach()
879 void omap_gpmc_attach_nand(struct omap_gpmc_s *s, int cs, DeviceState *nand) in omap_gpmc_attach_nand() argument
888 f = &s->cs_file[cs]; in omap_gpmc_attach_nand()
890 omap_gpmc_cs_unmap(s, cs); in omap_gpmc_attach_nand()
897 omap_gpmc_cs_map(s, cs); in omap_gpmc_attach_nand()