2 * Copyright (C) 2016 Xilinx, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #include <linux/clk.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/fpga/fpga-mgr.h>
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/of_address.h>
22 #include <linux/string.h>
23 #include <linux/firmware/xilinx/zynqmp/firmware.h>
25 /* Constant Definitions */
26 #define IXR_FPGA_DONE_MASK 0X00000008U
27 #define IXR_FPGA_ENCRYPTION_EN 0x00000008U
29 #define READ_DMA_SIZE 0x200
30 #define DUMMY_FRAMES_SIZE 0x64
31 #define PCAP_READ_CLKFREQ 25000000
33 static bool readback_type;
34 module_param(readback_type, bool, 0644);
35 MODULE_PARM_DESC(readback_type,
36 "readback_type 0-configuration register read "
37 "1- configuration data read (default: 0)");
40 * struct zynqmp_configreg - Configuration register offsets
41 * @reg: Name of the configuration register.
42 * @offset: Register offset.
44 struct zynqmp_configreg {
49 static struct zynqmp_configreg cfgreg[] = {
50 {.reg = "CRC", .offset = 0},
51 {.reg = "FAR", .offset = 1},
52 {.reg = "FDRI", .offset = 2},
53 {.reg = "FDRO", .offset = 3},
54 {.reg = "CMD", .offset = 4},
55 {.reg = "CTRL0", .offset = 5},
56 {.reg = "MASK", .offset = 6},
57 {.reg = "STAT", .offset = 7},
58 {.reg = "LOUT", .offset = 8},
59 {.reg = "COR0", .offset = 9},
60 {.reg = "MFWR", .offset = 10},
61 {.reg = "CBC", .offset = 11},
62 {.reg = "IDCODE", .offset = 12},
63 {.reg = "AXSS", .offset = 13},
64 {.reg = "COR1", .offset = 14},
65 {.reg = "WBSTR", .offset = 16},
66 {.reg = "TIMER", .offset = 17},
67 {.reg = "BOOTSTS", .offset = 22},
68 {.reg = "CTRL1", .offset = 24},
73 * struct zynqmp_fpga_priv - Private data structure
74 * @dev: Device data structure
75 * @lock: Mutex lock for device
76 * @clk: Clock resource for pcap controller
77 * @flags: flags which is used to identify the bitfile type
78 * @size: Size of the Bitstream used for readback
80 struct zynqmp_fpga_priv {
88 static int zynqmp_fpga_ops_write_init(struct fpga_manager *mgr,
89 struct fpga_image_info *info,
90 const char *buf, size_t size)
92 struct zynqmp_fpga_priv *priv;
95 priv->flags = info->flags;
100 static int zynqmp_fpga_ops_write(struct fpga_manager *mgr,
101 const char *buf, size_t size)
103 struct zynqmp_fpga_priv *priv;
108 const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops();
110 if (!eemi_ops || !eemi_ops->fpga_load)
116 if (!mutex_trylock(&priv->lock))
119 ret = clk_enable(priv->clk);
123 if (mgr->flags & IXR_FPGA_ENCRYPTION_EN)
124 dma_size = size + ENCRYPTED_KEY_LEN;
128 kbuf = dma_alloc_coherent(priv->dev, dma_size, &dma_addr, GFP_KERNEL);
134 memcpy(kbuf, buf, size);
136 if (mgr->flags & IXR_FPGA_ENCRYPTION_EN)
137 memcpy(kbuf + size, mgr->key, ENCRYPTED_KEY_LEN);
139 wmb(); /* ensure all writes are done before initiate FW call */
141 if (mgr->flags & IXR_FPGA_ENCRYPTION_EN)
142 ret = eemi_ops->fpga_load(dma_addr, dma_addr + size,
145 ret = eemi_ops->fpga_load(dma_addr, size,
148 dma_free_coherent(priv->dev, dma_size, kbuf, dma_addr);
150 clk_disable(priv->clk);
152 mutex_unlock(&priv->lock);
156 static int zynqmp_fpga_ops_write_complete(struct fpga_manager *mgr,
157 struct fpga_image_info *info)
162 static enum fpga_mgr_states zynqmp_fpga_ops_state(struct fpga_manager *mgr)
165 const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops();
167 if (!eemi_ops || !eemi_ops->fpga_get_status)
168 return FPGA_MGR_STATE_UNKNOWN;
170 eemi_ops->fpga_get_status(&status);
171 if (status & IXR_FPGA_DONE_MASK)
172 return FPGA_MGR_STATE_OPERATING;
174 return FPGA_MGR_STATE_UNKNOWN;
177 static int zynqmp_fpga_read_cfgreg(struct fpga_manager *mgr,
180 const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops();
181 struct zynqmp_fpga_priv *priv = mgr->priv;
185 struct zynqmp_configreg *p = cfgreg;
187 ret = clk_enable(priv->clk);
191 buf = dma_zalloc_coherent(mgr->dev.parent, READ_DMA_SIZE,
192 &dma_addr, GFP_KERNEL);
198 seq_puts(s, "zynqMP FPGA Configuration register contents are\n");
201 ret = eemi_ops->fpga_read(p->offset, dma_addr, readback_type,
205 seq_printf(s, "%s --> \t %x \t\r\n", p->reg, val);
210 dma_free_coherent(mgr->dev.parent, READ_DMA_SIZE, buf,
213 clk_disable(priv->clk);
218 static int zynqmp_fpga_read_cfgdata(struct fpga_manager *mgr,
221 const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops();
222 struct zynqmp_fpga_priv *priv;
223 int ret, data_offset;
230 size = priv->size + READ_DMA_SIZE + DUMMY_FRAMES_SIZE;
233 * There is no h/w flow control for pcap read
234 * to prevent the FIFO from over flowing, reduce
235 * the PCAP operating frequency.
237 clk_rate = clk_get_rate(priv->clk);
238 clk_unprepare(priv->clk);
239 ret = clk_set_rate(priv->clk, PCAP_READ_CLKFREQ);
241 dev_err(&mgr->dev, "Unable to reduce the PCAP freq %d\n", ret);
244 ret = clk_prepare_enable(priv->clk);
246 dev_err(&mgr->dev, "Cannot enable clock.\n");
247 goto restore_pcap_clk;
250 buf = dma_zalloc_coherent(mgr->dev.parent, size, &dma_addr,
257 seq_puts(s, "zynqMP FPGA Configuration data contents are\n");
258 ret = eemi_ops->fpga_read((priv->size + DUMMY_FRAMES_SIZE) / 4,
259 dma_addr, readback_type, &data_offset);
263 seq_write(s, &buf[data_offset], priv->size);
266 dma_free_coherent(mgr->dev.parent, size, buf, dma_addr);
268 clk_disable_unprepare(priv->clk);
270 clk_set_rate(priv->clk, clk_rate);
272 clk_prepare(priv->clk);
277 static int zynqmp_fpga_ops_read(struct fpga_manager *mgr, struct seq_file *s)
279 const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops();
280 struct zynqmp_fpga_priv *priv = mgr->priv;
283 if (!eemi_ops || !eemi_ops->fpga_read)
286 if (!mutex_trylock(&priv->lock))
290 ret = zynqmp_fpga_read_cfgdata(mgr, s);
292 ret = zynqmp_fpga_read_cfgreg(mgr, s);
294 mutex_unlock(&priv->lock);
298 static const struct fpga_manager_ops zynqmp_fpga_ops = {
299 .state = zynqmp_fpga_ops_state,
300 .write_init = zynqmp_fpga_ops_write_init,
301 .write = zynqmp_fpga_ops_write,
302 .write_complete = zynqmp_fpga_ops_write_complete,
303 .read = zynqmp_fpga_ops_read,
306 static int zynqmp_fpga_probe(struct platform_device *pdev)
308 struct device *dev = &pdev->dev;
309 struct zynqmp_fpga_priv *priv;
312 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
317 mutex_init(&priv->lock);
318 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44));
320 dev_err(dev, "no usable DMA configuration");
322 priv->clk = devm_clk_get(dev, "ref_clk");
323 if (IS_ERR(priv->clk)) {
324 ret = PTR_ERR(priv->clk);
325 dev_err(dev, "failed to to get pcp ref_clk (%d)\n", ret);
329 ret = clk_prepare(priv->clk);
331 dev_err(dev, "Cannot enable clock.\n");
335 err = fpga_mgr_register(dev, "Xilinx ZynqMP FPGA Manager",
336 &zynqmp_fpga_ops, priv);
338 dev_err(dev, "unable to register FPGA manager");
339 clk_unprepare(priv->clk);
346 static int zynqmp_fpga_remove(struct platform_device *pdev)
348 struct zynqmp_fpga_priv *priv;
349 struct fpga_manager *mgr;
351 mgr = platform_get_drvdata(pdev);
354 fpga_mgr_unregister(&pdev->dev);
355 clk_unprepare(priv->clk);
360 static const struct of_device_id zynqmp_fpga_of_match[] = {
361 { .compatible = "xlnx,zynqmp-pcap-fpga", },
365 MODULE_DEVICE_TABLE(of, zynqmp_fpga_of_match);
367 static struct platform_driver zynqmp_fpga_driver = {
368 .probe = zynqmp_fpga_probe,
369 .remove = zynqmp_fpga_remove,
371 .name = "zynqmp_fpga_manager",
372 .of_match_table = of_match_ptr(zynqmp_fpga_of_match),
376 module_platform_driver(zynqmp_fpga_driver);
378 MODULE_AUTHOR("Nava kishore Manne <navam@xilinx.com>");
379 MODULE_DESCRIPTION("Xilinx ZynqMp FPGA Manager");
380 MODULE_LICENSE("GPL");