mirror of https://gitee.com/openkylin/linux.git
46 lines
2.1 KiB
Plaintext
46 lines
2.1 KiB
Plaintext
|
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 the 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.
|