]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
zynq: Support fpga command for all zynq families
authorMichal Simek <michal.simek@xilinx.com>
Wed, 3 Apr 2013 10:34:19 +0000 (12:34 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 3 Apr 2013 13:03:26 +0000 (15:03 +0200)
Detect zynq idcode and based on that setup fpga device
which is connected to it.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/cpu/armv7/zynq/slcr.c
arch/arm/include/asm/arch-zynq/hardware.h
arch/arm/include/asm/arch-zynq/sys_proto.h
board/xilinx/zynq/board.c
include/zynqpl.h

index 80ca25d94a227cc5e153ab38a9ad0a31c2d1e2dd..e5f710d4e25c8812927d067ee9fcf7121514d8d4 100644 (file)
@@ -33,6 +33,9 @@
 #define SLCR_NAND_L2_SEL               0x10
 #define SLCR_NAND_L2_SEL_MASK          0x1F
 
+#define SLCR_IDCODE_MASK       0x1F000
+#define SLCR_IDCODE_SHIFT      12
+
 /*
  * zynq_slcr_mio_get_status - Get the status of MIO peripheral.
  *
@@ -200,6 +203,12 @@ u32 zynq_slcr_get_boot_mode(void)
        return readl(&slcr_base->boot_mode);
 }
 
+u32 zynq_slcr_get_idcode(void)
+{
+       return (readl(&slcr_base->pss_idcode) & SLCR_IDCODE_MASK) >>
+                                                       SLCR_IDCODE_SHIFT;
+}
+
 /*
  * zynq_slcr_get_mio_pin_status - Get the MIO pin status of peripheral.
  *
index 0e8f71740db5936dc5b714a8980175b3a4987b5a..3fd980ae294678b5bbfd20b3092e7b45305c9aba 100644 (file)
@@ -46,7 +46,9 @@ struct slcr_regs {
        u32 boot_mode; /* 0x25c */
        u32 reserved4[116];
        u32 trust_zone; /* 0x430 */ /* FIXME */
-       u32 reserved5[115];
+       u32 reserved5_1[63];
+       u32 pss_idcode; /* 0x530 */
+       u32 reserved5_2[51];
        u32 ddr_urgent; /* 0x600 */
        u32 reserved6[6];
        u32 ddr_urgent_sel; /* 0x61c */
index fd2ecc5ee0fa1ba385cc9b6bfeec1cf09b294ab1..411589eb525bcc03baec9aea7cbb5d6c53dfd418 100644 (file)
@@ -30,6 +30,7 @@ extern void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk);
 extern void zynq_slcr_devcfg_disable(void);
 extern void zynq_slcr_devcfg_enable(void);
 extern u32 zynq_slcr_get_boot_mode(void);
+extern u32 zynq_slcr_get_idcode(void);
 extern int zynq_slcr_get_mio_pin_status(const char *periph);
 
 #endif /* _SYS_PROTO_H_ */
index f259f2fcdbb40e5faf24163a946b5b86a1628808..3bb90f51479102f5fb35ec60d606d619d50507c6 100644 (file)
@@ -39,11 +39,38 @@ DECLARE_GLOBAL_DATA_PTR;
 #define JTAG_MODE              0x00000000
 
 #ifdef CONFIG_FPGA
-Xilinx_desc fpga = XILINX_XC7Z020_DESC(0);
+Xilinx_desc fpga;
+
+/* It can be done differently */
+Xilinx_desc fpga010 = XILINX_XC7Z010_DESC(0x10);
+Xilinx_desc fpga020 = XILINX_XC7Z020_DESC(0x20);
+Xilinx_desc fpga030 = XILINX_XC7Z030_DESC(0x30);
+Xilinx_desc fpga045 = XILINX_XC7Z045_DESC(0x45);
 #endif
 
 int board_init(void)
 {
+#ifdef CONFIG_FPGA
+       u32 idcode;
+
+       idcode = zynq_slcr_get_idcode();
+
+       switch (idcode) {
+       case XILINX_ZYNQ_7010:
+               fpga = fpga010;
+               break;
+       case XILINX_ZYNQ_7020:
+               fpga = fpga020;
+               break;
+       case XILINX_ZYNQ_7030:
+               fpga = fpga030;
+               break;
+       case XILINX_ZYNQ_7045:
+               fpga = fpga045;
+               break;
+       }
+#endif
+
        /* temporary hack to clear pending irqs before Linux as it
         * will hang Linux
         */
index eb87ba727abce8bce349c248372e09d469058edd..c9629e149e3cc3ec9e6f0a6808de6eac6608382a 100644 (file)
@@ -31,13 +31,30 @@ extern int zynq_load(Xilinx_desc *desc, const void *image, size_t size);
 extern int zynq_dump(Xilinx_desc *desc, const void *buf, size_t bsize);
 extern int zynq_info(Xilinx_desc *desc);
 
+#define XILINX_ZYNQ_7010       0x2
+#define XILINX_ZYNQ_7020       0x7
+#define XILINX_ZYNQ_7030       0xc
+#define XILINX_ZYNQ_7045       0x11
+
 /* Device Image Sizes
  *********************************************************************/
+#define XILINX_XC7Z010_SIZE    16669920/8
 #define XILINX_XC7Z020_SIZE    32364512/8
+#define XILINX_XC7Z030_SIZE    47839328/8
+#define XILINX_XC7Z045_SIZE    106571232/8
 
 /* Descriptor Macros
  *********************************************************************/
+#define XILINX_XC7Z010_DESC(cookie) \
+{ Xilinx_Zynq, devcfg, XILINX_XC7Z010_SIZE, NULL, cookie }
+
 #define XILINX_XC7Z020_DESC(cookie) \
 { Xilinx_Zynq, devcfg, XILINX_XC7Z020_SIZE, NULL, cookie }
 
+#define XILINX_XC7Z030_DESC(cookie) \
+{ Xilinx_Zynq, devcfg, XILINX_XC7Z030_SIZE, NULL, cookie }
+
+#define XILINX_XC7Z045_DESC(cookie) \
+{ Xilinx_Zynq, devcfg, XILINX_XC7Z045_SIZE, NULL, cookie }
+
 #endif /* _ZYNQPL_H_ */