summaryrefslogtreecommitdiffstats
path: root/ArmPlatformPkg/Drivers/PL35xSmc/InitializeSMC.asm
blob: 732500e13a37efc2294ccd3ed4c4fa7b32544435 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//
//  Copyright (c) 2011, ARM Limited. All rights reserved.
//  
//  This program and the accompanying materials                          
//  are licensed and made available under the terms and conditions of the BSD License         
//  which accompanies this distribution.  The full text of the license may be found at        
//  http://opensource.org/licenses/bsd-license.php                                            
//
//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
//
//

#include <AsmMacroIoLib.h>
#include <Library/PcdLib.h>
#include <Drivers/PL35xSmc.h>
#include <AutoGen.h>

  INCLUDE AsmMacroIoLib.inc
  
  EXPORT  SMCInitializeNOR
  EXPORT  SMCInitializeSRAM
  EXPORT  SMCInitializePeripherals
  EXPORT  SMCInitializeVRAM

  PRESERVE8
  AREA    ModuleInitializeSMC, CODE, READONLY
  
// CS0  CS0-Interf0     NOR1 flash on the motherboard
// CS1  CS1-Interf0     Reserved for the motherboard
// CS2  CS2-Interf0     SRAM on the motherboard
// CS3  CS3-Interf0     memory-mapped Ethernet and USB controllers on the motherboard
// CS4  CS0-Interf1     NOR2 flash on the motherboard
// CS5  CS1-Interf1     memory-mapped peripherals
// CS6  CS2-Interf1     memory-mapped peripherals
// CS7  CS3-Interf1     system memory-mapped peripherals on the motherboard.

// IN r1 SmcBase
// IN r2 ChipSelect
// NOTE: This code is been called before any stack has been setup. It means some registers
//       could be overwritten (case of 'r0')
SMCInitializeNOR
  // Write to set_cycle register(holding register for NOR 1 cycle register or NAND cycle register)
  //   - Read cycle timeout  = 0xA (0:3)
  //   - Write cycle timeout = 0x3(7:4)
  //   - OE Assertion Delay  = 0x9(11:8)
  //   - WE Assertion delay  = 0x3(15:12)
  //   - Page cycle timeout  = 0x2(19:16)
  ldr     r0, = 0x0002393A
  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
  
  // Write to set_opmode register(holding register for NOR 1 opomode register or NAND opmode register)
  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)
  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]

  // Write to direct_cmd register so that the NOR 1 registers(set-cycles and opmode) are updated with holding registers
  ldr     r0, =PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE
  orr     r0, r0, r2
  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
  
  bx    lr


//
// Setup SRAM (CS2-Interface0)
//
SMCInitializeSRAM
  ldr     r0, = 0x00027158
  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]

  ldr     r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_ADV)
  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
  
  ldr     r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,2))
  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]

  bx    lr

SMCInitializePeripherals
//
// USB/Eth/VRAM (CS3-Interface0)
//
  ldr     r0, = 0x000CD2AA
  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
 
  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)
  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
        
  ldr     r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,3))
  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]


//
// Setup Peripherals (CS3-Interface1)
//
  ldr     r0, = 0x00025156
  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
 
  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)
  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
        
  ldr     r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(1,3))
  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]

  bx    lr


// IN r1 SmcBase
// IN r2 VideoSRamBase
// NOTE: This code is been called before any stack has been setup. It means some registers
//       could be overwritten (case of 'r0')
SMCInitializeVRAM
  //
  // Setup VRAM (CS1-Interface0)
  //
  ldr     r0, =  0x00049249
  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]
 
  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)
  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]
        
  ldr     r0, = (PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,1))
  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]
  
  //
  // Page mode setup for VRAM
  //

  // Read current state
  ldr     r0, [r2, #0]  
  ldr     r0, [r2, #0]  
  ldr     r0, = 0x00000000
  str     r0, [r2, #0] 
  ldr     r0, [r2, #0]  

  // Enable page mode
  ldr     r0, [r2, #0]  
  ldr     r0, [r2, #0]  
  ldr     r0, = 0x00000000
  str     r0, [r2, #0] 
  ldr     r0, = 0x00900090
  str     r0, [r2, #0] 

  // Confirm page mode enabled
  ldr     r0, [r2, #0]  
  ldr     r0, [r2, #0]  
  ldr     r0, = 0x00000000
  str     r0, [r2, #0] 
  ldr     r0, [r2, #0]  
  
  bx    lr
  
  END