2 // Copyright (c) 2011, ARM Limited. All rights reserved.
4 // This program and the accompanying materials
5 // are licensed and made available under the terms and conditions of the BSD License
6 // which accompanies this distribution. The full text of the license may be found at
7 // http://opensource.org/licenses/bsd-license.php
9 // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 #include <AsmMacroIoLib.h>
15 #include <Library/PcdLib.h>
16 #include <Drivers/PL354Smc.h>
19 INCLUDE AsmMacroIoLib.inc
21 EXPORT SMCInitializeNOR
22 EXPORT SMCInitializeSRAM
23 EXPORT SMCInitializePeripherals
24 EXPORT SMCInitializeVRAM
27 AREA ModuleInitializeSMC, CODE, READONLY
29 // CS0 CS0-Interf0 NOR1 flash on the motherboard
30 // CS1 CS1-Interf0 Reserved for the motherboard
31 // CS2 CS2-Interf0 SRAM on the motherboard
32 // CS3 CS3-Interf0 memory-mapped Ethernet and USB controllers on the motherboard
33 // CS4 CS0-Interf1 NOR2 flash on the motherboard
34 // CS5 CS1-Interf1 memory-mapped peripherals
35 // CS6 CS2-Interf1 memory-mapped peripherals
36 // CS7 CS3-Interf1 system memory-mapped peripherals on the motherboard.
40 // NOTE: This code is been called before any stack has been setup. It means some registers
41 // could be overwritten (case of 'r0')
43 // Write to set_cycle register(holding register for NOR 1 cycle register or NAND cycle register)
44 // - Read cycle timeout = 0xA (0:3)
45 // - Write cycle timeout = 0x3(7:4)
46 // - OE Assertion Delay = 0x9(11:8)
47 // - WE Assertion delay = 0x3(15:12)
48 // - Page cycle timeout = 0x2(19:16)
50 str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
52 // Write to set_opmode register(holding register for NOR 1 opomode register or NAND opmode register)
53 ldr r0, = (PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_BURST_LENGTH_CONT :OR: PL354_SMC_SET_OPMODE_SET_WR_BURST_LENGTH_CONT :OR: PL354_SMC_SET_OPMODE_SET_ADV)
54 str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
56 // Write to direct_cmd register so that the NOR 1 registers(set-cycles and opmode) are updated with holding registers
57 ldr r0, =PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE
59 str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
65 // Setup SRAM (CS2-Interface0)
69 str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
71 ldr r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_ADV)
72 str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
74 ldr r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,2))
75 str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
79 SMCInitializePeripherals
81 // USB/Eth/VRAM (CS3-Interface0)
84 str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
86 ldr r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_SYNC :OR: PL354_SMC_SET_OPMODE_SET_WR_SYNC)
87 str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
89 ldr r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,3))
90 str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
94 // Setup Peripherals (CS3-Interface1)
97 str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
99 ldr r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_SYNC :OR: PL354_SMC_SET_OPMODE_SET_WR_SYNC)
100 str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
102 ldr r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(1,3))
103 str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
109 // IN r2 VideoSRamBase
110 // NOTE: This code is been called before any stack has been setup. It means some registers
111 // could be overwritten (case of 'r0')
114 // Setup VRAM (CS1-Interface0)
117 str r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
119 ldr r0, = (PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_RD_SYNC :OR: PL354_SMC_SET_OPMODE_SET_WR_SYNC)
120 str r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
122 ldr r0, = (PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,1))
123 str r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
126 // Page mode setup for VRAM
129 // Read current state
144 // Confirm page mode enabled