| README on the IOBARRIER for CardEngine IO | |
| ========================================= | |
| Due to an unfortunate oversight when the Card Engines were designed, | |
| the signals that control access to some peripherals, most notably the | |
| SMC91C9111 ethernet controller, are not properly handled. | |
| The symptom is that some back to back IO with the peripheral returns | |
| unreliable data. With the SMC chip, you'll see errors about the bank | |
| register being 'screwed'. | |
| The cause is that the AEN signal to the SMC chip does not transition | |
| for every memory access. It is driven through the CPLD from the CS7 | |
| line of the CPU's static memory controller which is optimized to | |
| eliminate unnecessary transitions. Yet, the SMC requires a transition | |
| for every write access. The Sharp website has more information about | |
| the effect this power-conserving feature has on peripheral | |
| interfacing. | |
| The solution is to follow every write access to the SMC chip with an | |
| access to another memory region that will force the CPU to release the | |
| chip select line. It is important to guarantee that this access | |
| forces the CPU off-chip. We map a page of SDRAM as if it were an | |
| uncacheable IO device and read from it after every SMC IO write | |
| operation. | |
| SMC IO | |
| BARRIER IO | |
| Only this sequence is important. It does not matter that there is no | |
| BARRIER IO before the access to the SMC chip because the AEN latch | |
| only needs occurs after the SMC IO write cycle. The routines that | |
| implement this work-around make an additional concession which is to | |
| disable interrupts during the IO sequence. Other hardware devices | |
| (the LogicPD CPLD) have registers in the same physical memory | |
| region as the SMC chip. An interrupt might allow an access to one of | |
| those registers while SMC IO is being performed. | |
| You might be tempted to think that we have to access another device | |
| attached to the static memory controller, but the empirical evidence | |
| indicates that this is not so. Mapping 0x00000000 (flash) and | |
| 0xc0000000 (SDRAM) appear to have the same effect. Using SDRAM seems | |
| to be faster. Choosing to access an undecoded memory region is not | |
| desirable as there is no way to know how that chip select will be used | |
| in the future. |