]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Drivers/PL35xSmc/InitializeSMC.asm
ArmPkg/PL35xSmc: Split the SMC initialization in multiple Chip Select initialization...
[mirror_edk2.git] / ArmPkg / Drivers / PL35xSmc / InitializeSMC.asm
index ebf6a7980e93e5d552a40f0e725aa360c62d8c32..f868660336486787bcaa1d61134ad83a61dda844 100644 (file)
 \r
 #include <AsmMacroIoLib.h>\r
 #include <Library/PcdLib.h>\r
+#include <Drivers/PL354Smc.h>\r
 #include <AutoGen.h>\r
 \r
   INCLUDE AsmMacroIoLib.inc\r
   \r
-  EXPORT  InitializeSMC\r
+  EXPORT  SMCInitializeNOR\r
+  EXPORT  SMCInitializeSRAM\r
+  EXPORT  SMCInitializePeripherals\r
+  EXPORT  SMCInitializeVRAM\r
 \r
   PRESERVE8\r
   AREA    ModuleInitializeSMC, CODE, READONLY\r
   \r
-// Static memory configuation definitions for SMC\r
-SmcDirectCmd              EQU 0x10\r
-SmcSetCycles              EQU 0x14\r
-SmcSetOpMode              EQU 0x18\r
-\r
 // CS0  CS0-Interf0     NOR1 flash on the motherboard\r
 // CS1  CS1-Interf0     Reserved for the motherboard\r
 // CS2  CS2-Interf0     SRAM on the motherboard\r
@@ -37,133 +36,104 @@ SmcSetOpMode              EQU 0x18
 // CS7  CS3-Interf1     system memory-mapped peripherals on the motherboard.\r
 \r
 // IN r1 SmcBase\r
-// IN r2 VideoSRamBase\r
+// IN r2 ChipSelect\r
 // NOTE: This code is been called before any stack has been setup. It means some registers\r
 //       could be overwritten (case of 'r0')\r
-InitializeSMC\r
-//\r
-// Setup NOR1 (CS0-Interface0)\r
-//\r
-\r
-  //Write to set_cycle register(holding register for NOR 1 cycle register or NAND cycle register)\r
-     //Read cycle timeout = 0xA (0:3)\r
-     //Write cycle timeout = 0x3(7:4)\r
-     //OE Assertion Delay = 0x9(11:8)\r
-     //WE Assertion delay = 0x3(15:12)\r
-     //Page cycle timeout = 0x2(19:16)  \r
+SMCInitializeNOR\r
+  // Write to set_cycle register(holding register for NOR 1 cycle register or NAND cycle register)\r
+  //   - Read cycle timeout  = 0xA (0:3)\r
+  //   - Write cycle timeout = 0x3(7:4)\r
+  //   - OE Assertion Delay  = 0x9(11:8)\r
+  //   - WE Assertion delay  = 0x3(15:12)\r
+  //   - Page cycle timeout  = 0x2(19:16)\r
   ldr     r0, = 0x0002393A\r
-  str     r0, [r1, #SmcSetCycles]\r
+  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r
   \r
-  //Write to set_opmode register(holding register for NOR 1 opomode register or NAND opmode register)\r
-     // 0x00000002 = MemoryWidth: 32bit\r
-     // 0x00000028 = ReadMemoryBurstLength:continuous\r
-     // 0x00000280 = WriteMemoryBurstLength:continuous\r
-     // 0x00000800 = Set Address Valid\r
-  ldr     r0, = 0x00000AAA\r
-  str     r0, [r1, #SmcSetOpMode]    \r
-\r
- //Write to direct_cmd register so that the NOR 1 registers(set-cycles and opmode) are updated with holding registers\r
-     // 0x00000000 = ChipSelect0-Interface 0\r
-     // 0x00400000 = CmdTypes: UpdateRegs\r
-  ldr     r0, = 0x00400000\r
-  str     r0, [r1, #SmcDirectCmd]                              \r
+  // Write to set_opmode register(holding register for NOR 1 opomode register or NAND opmode register)\r
+  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)\r
+  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r
+\r
+  // Write to direct_cmd register so that the NOR 1 registers(set-cycles and opmode) are updated with holding registers\r
+  ldr     r0, =PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE\r
+  orr     r0, r0, r2\r
+  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r
   \r
+  bx    lr\r
+\r
+\r
 //\r
 // Setup SRAM (CS2-Interface0)\r
 //\r
+SMCInitializeSRAM\r
   ldr     r0, = 0x00027158\r
-  str     r0, [r1, #SmcSetCycles]\r
+  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r
 \r
-  // 0x00000002 = MemoryWidth: 32bit\r
-  // 0x00000800 = Set Address Valid\r
-  ldr     r0, = 0x00000802\r
-  str     r0, [r1, #SmcSetOpMode]\r
+  ldr     r0, =(PL354_SMC_SET_OPMODE_MEM_WIDTH_32 :OR: PL354_SMC_SET_OPMODE_SET_ADV)\r
+  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r
   \r
-  // 0x01000000 = ChipSelect2-Interface 0\r
-  // 0x00400000 = CmdTypes: UpdateRegs\r
-  ldr     r0, = 0x01400000\r
-  str     r0, [r1, #SmcDirectCmd]\r
+  ldr     r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,2))\r
+  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r
+\r
+  bx    lr\r
 \r
+SMCInitializePeripherals\r
 //\r
 // USB/Eth/VRAM (CS3-Interface0)\r
 //\r
   ldr     r0, = 0x000CD2AA\r
-  str     r0, [r1, #SmcSetCycles]\r
+  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r
  \r
-  // 0x00000002 = MemoryWidth: 32bit\r
-  // 0x00000004 = Memory reads are synchronous\r
-  // 0x00000040 = Memory writes are synchronous\r
-  ldr     r0, = 0x00000046\r
-  str     r0, [r1, #SmcSetOpMode]  \r
+  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)\r
+  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r
         \r
-  // 0x01800000 = ChipSelect3-Interface 0\r
-  // 0x00400000 = CmdTypes: UpdateRegs\r
-  ldr     r0, = 0x01C00000\r
-  str     r0, [r1, #SmcDirectCmd]  \r
+  ldr     r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,3))\r
+  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r
+\r
 \r
-//\r
-// Setup NOR3 (CS0-Interface1)\r
-//\r
-  ldr     r0, = 0x0002393A\r
-  str     r0, [r1, #SmcSetCycles]\r
\r
-  // 0x00000002 = MemoryWidth: 32bit\r
-  // 0x00000028 = ReadMemoryBurstLength:continuous\r
-  // 0x00000280 = WriteMemoryBurstLength:continuous\r
-  // 0x00000800 = Set Address Valid\r
-  ldr     r0, = 0x00000AAA\r
-  str     r0, [r1, #SmcSetOpMode]  \r
-        \r
-  // 0x02000000 = ChipSelect0-Interface 1\r
-  // 0x00400000 = CmdTypes: UpdateRegs\r
-  ldr     r0, = 0x02400000\r
-  str     r0, [r1, #SmcDirectCmd]  \r
\r
 //\r
 // Setup Peripherals (CS3-Interface1)\r
 //\r
   ldr     r0, = 0x00025156\r
-  str     r0, [r1, #SmcSetCycles]\r
+  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r
  \r
-  // 0x00000002 = MemoryWidth: 32bit\r
-  // 0x00000004 = Memory reads are synchronous\r
-  // 0x00000040 = Memory writes are synchronous\r
-  ldr     r0, = 0x00000046\r
-  str     r0, [r1, #SmcSetOpMode]  \r
+  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)\r
+  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r
         \r
-  // 0x03800000 = ChipSelect3-Interface 1\r
-  // 0x00400000 = CmdTypes: UpdateRegs\r
-  ldr     r0, = 0x03C00000\r
-  str     r0, [r1, #SmcDirectCmd] \r
+  ldr     r0, =(PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(1,3))\r
+  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r
 \r
-//\r
-// Setup VRAM (CS1-Interface0)\r
-//\r
+  bx    lr\r
+\r
+\r
+// IN r1 SmcBase\r
+// IN r2 VideoSRamBase\r
+// NOTE: This code is been called before any stack has been setup. It means some registers\r
+//       could be overwritten (case of 'r0')\r
+SMCInitializeVRAM\r
+  //\r
+  // Setup VRAM (CS1-Interface0)\r
+  //\r
   ldr     r0, =  0x00049249\r
-  str     r0, [r1, #SmcSetCycles]\r
+  str     r0, [r1, #PL354_SMC_SET_CYCLES_OFFSET]\r
  \r
-  // 0x00000002 = MemoryWidth: 32bit\r
-  // 0x00000004 = Memory reads are synchronous\r
-  // 0x00000040 = Memory writes are synchronous\r
-  ldr     r0, = 0x00000046\r
-  str     r0, [r1, #SmcSetOpMode]  \r
+  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)\r
+  str     r0, [r1, #PL354_SMC_SET_OPMODE_OFFSET]\r
         \r
-  // 0x00800000 = ChipSelect1-Interface 0\r
-  // 0x00400000 = CmdTypes: UpdateRegs\r
-  ldr     r0, = 0x00C00000\r
-  str     r0, [r1, #SmcDirectCmd]  \r
+  ldr     r0, = (PL354_SMC_DIRECT_CMD_ADDR_CMD_UPDATE :OR: PL354_SMC_DIRECT_CMD_ADDR_CS(0,1))\r
+  str     r0, [r1, #PL354_SMC_DIRECT_CMD_OFFSET]\r
   \r
-//\r
-// Page mode setup for VRAM\r
-//\r
-  //read current state \r
+  //\r
+  // Page mode setup for VRAM\r
+  //\r
+\r
+  // Read current state\r
   ldr     r0, [r2, #0]  \r
   ldr     r0, [r2, #0]  \r
   ldr     r0, = 0x00000000\r
   str     r0, [r2, #0] \r
   ldr     r0, [r2, #0]  \r
 \r
-  //enable page mode \r
+  // Enable page mode\r
   ldr     r0, [r2, #0]  \r
   ldr     r0, [r2, #0]  \r
   ldr     r0, = 0x00000000\r
@@ -171,7 +141,7 @@ InitializeSMC
   ldr     r0, = 0x00900090\r
   str     r0, [r2, #0] \r
 \r
-  //confirm page mode enabled\r
+  // Confirm page mode enabled\r
   ldr     r0, [r2, #0]  \r
   ldr     r0, [r2, #0]  \r
   ldr     r0, = 0x00000000\r