Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'fpga-for-greg-20161129' of git://git.kernel.org/pub/scm/linux/kernel/git/atull/linux-fpga into char-misc-next

Alan writes:

fpga: Updates for 4.10

These are:
* Add git url to MAINTAINERS
* Allow write_init to specify how much buffer it needs
* Fixes for ISR state in zynq fpga manager driver
* Other small fixes for zynq
* Add Altera SoCFPGA drivers for COMPILE_TEST

+38 -28
+4 -1
Documentation/fpga/fpga-mgr.txt
··· 169 169 2. .write (may be called once or multiple times) 170 170 3. .write_complete 171 171 172 - The .write_init function will prepare the FPGA to receive the image data. 172 + The .write_init function will prepare the FPGA to receive the image data. The 173 + buffer passed into .write_init will be atmost .initial_header_size bytes long, 174 + if the whole bitstream is not immediately available then the core code will 175 + buffer up at least this much before starting. 173 176 174 177 The .write function writes a buffer to the FPGA. The buffer may be contain the 175 178 whole FPGA image or may be a smaller chunk of an FPGA image. In the latter
+1
MAINTAINERS
··· 4958 4958 R: Moritz Fischer <moritz.fischer@ettus.com> 4959 4959 L: linux-fpga@vger.kernel.org 4960 4960 S: Maintained 4961 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/atull/linux-fpga.git 4961 4962 F: drivers/fpga/ 4962 4963 F: include/linux/fpga/fpga-mgr.h 4963 4964 W: http://www.rocketboards.org
+3 -2
drivers/fpga/Kconfig
··· 22 22 23 23 config FPGA_MGR_SOCFPGA 24 24 tristate "Altera SOCFPGA FPGA Manager" 25 - depends on ARCH_SOCFPGA 25 + depends on ARCH_SOCFPGA || COMPILE_TEST 26 26 help 27 27 FPGA manager driver support for Altera SOCFPGA. 28 28 29 29 config FPGA_MGR_SOCFPGA_A10 30 30 tristate "Altera SoCFPGA Arria10" 31 - depends on ARCH_SOCFPGA 31 + depends on ARCH_SOCFPGA || COMPILE_TEST 32 + select REGMAP_MMIO 32 33 help 33 34 FPGA manager driver support for Altera Arria10 SoCFPGA. 34 35
+4 -2
drivers/fpga/fpga-mgr.c
··· 53 53 /* 54 54 * Call the low level driver's write_init function. This will do the 55 55 * device-specific things to get the FPGA into the state where it is 56 - * ready to receive an FPGA image. 56 + * ready to receive an FPGA image. The low level driver only gets to 57 + * see the first initial_header_size bytes in the buffer. 57 58 */ 58 59 mgr->state = FPGA_MGR_STATE_WRITE_INIT; 59 - ret = mgr->mops->write_init(mgr, info, buf, count); 60 + ret = mgr->mops->write_init(mgr, info, buf, 61 + min(mgr->mops->initial_header_size, count)); 60 62 if (ret) { 61 63 dev_err(dev, "Error preparing FPGA for writing\n"); 62 64 mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR;
+1
drivers/fpga/socfpga-a10.c
··· 470 470 } 471 471 472 472 static const struct fpga_manager_ops socfpga_a10_fpga_mgr_ops = { 473 + .initial_header_size = (RBF_DECOMPRESS_OFFSET + 1) * 4, 473 474 .state = socfpga_a10_fpga_state, 474 475 .write_init = socfpga_a10_fpga_write_init, 475 476 .write = socfpga_a10_fpga_write,
+23 -23
drivers/fpga/zynq-fpga.c
··· 118 118 #define FPGA_RST_NONE_MASK 0x0 119 119 120 120 struct zynq_fpga_priv { 121 - struct device *dev; 122 121 int irq; 123 122 struct clk *clk; 124 123 ··· 217 218 INIT_POLL_DELAY, 218 219 INIT_POLL_TIMEOUT); 219 220 if (err) { 220 - dev_err(priv->dev, "Timeout waiting for PCFG_INIT"); 221 + dev_err(&mgr->dev, "Timeout waiting for PCFG_INIT\n"); 221 222 goto out_err; 222 223 } 223 224 ··· 231 232 INIT_POLL_DELAY, 232 233 INIT_POLL_TIMEOUT); 233 234 if (err) { 234 - dev_err(priv->dev, "Timeout waiting for !PCFG_INIT"); 235 + dev_err(&mgr->dev, "Timeout waiting for !PCFG_INIT\n"); 235 236 goto out_err; 236 237 } 237 238 ··· 245 246 INIT_POLL_DELAY, 246 247 INIT_POLL_TIMEOUT); 247 248 if (err) { 248 - dev_err(priv->dev, "Timeout waiting for PCFG_INIT"); 249 + dev_err(&mgr->dev, "Timeout waiting for PCFG_INIT\n"); 249 250 goto out_err; 250 251 } 251 252 } ··· 262 263 /* check that we have room in the command queue */ 263 264 status = zynq_fpga_read(priv, STATUS_OFFSET); 264 265 if (status & STATUS_DMA_Q_F) { 265 - dev_err(priv->dev, "DMA command queue full"); 266 + dev_err(&mgr->dev, "DMA command queue full\n"); 266 267 err = -EBUSY; 267 268 goto out_err; 268 269 } ··· 295 296 in_count = count; 296 297 priv = mgr->priv; 297 298 298 - kbuf = dma_alloc_coherent(priv->dev, count, &dma_addr, GFP_KERNEL); 299 + kbuf = 300 + dma_alloc_coherent(mgr->dev.parent, count, &dma_addr, GFP_KERNEL); 299 301 if (!kbuf) 300 302 return -ENOMEM; 301 303 ··· 332 332 zynq_fpga_write(priv, INT_STS_OFFSET, intr_status); 333 333 334 334 if (!((intr_status & IXR_D_P_DONE_MASK) == IXR_D_P_DONE_MASK)) { 335 - dev_err(priv->dev, "Error configuring FPGA"); 335 + dev_err(&mgr->dev, "Error configuring FPGA\n"); 336 336 err = -EFAULT; 337 337 } 338 338 339 339 clk_disable(priv->clk); 340 340 341 341 out_free: 342 - dma_free_coherent(priv->dev, in_count, kbuf, dma_addr); 343 - 342 + dma_free_coherent(mgr->dev.parent, count, kbuf, dma_addr); 344 343 return err; 345 344 } 346 345 ··· 417 418 if (!priv) 418 419 return -ENOMEM; 419 420 420 - priv->dev = dev; 421 - 422 421 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 423 422 priv->io_base = devm_ioremap_resource(dev, res); 424 423 if (IS_ERR(priv->io_base)) ··· 425 428 priv->slcr = syscon_regmap_lookup_by_phandle(dev->of_node, 426 429 "syscon"); 427 430 if (IS_ERR(priv->slcr)) { 428 - dev_err(dev, "unable to get zynq-slcr regmap"); 431 + dev_err(dev, "unable to get zynq-slcr regmap\n"); 429 432 return PTR_ERR(priv->slcr); 430 433 } 431 434 ··· 433 436 434 437 priv->irq = platform_get_irq(pdev, 0); 435 438 if (priv->irq < 0) { 436 - dev_err(dev, "No IRQ available"); 439 + dev_err(dev, "No IRQ available\n"); 437 440 return priv->irq; 438 - } 439 - 440 - err = devm_request_irq(dev, priv->irq, zynq_fpga_isr, 0, 441 - dev_name(dev), priv); 442 - if (err) { 443 - dev_err(dev, "unable to request IRQ"); 444 - return err; 445 441 } 446 442 447 443 priv->clk = devm_clk_get(dev, "ref_clk"); 448 444 if (IS_ERR(priv->clk)) { 449 - dev_err(dev, "input clock not found"); 445 + dev_err(dev, "input clock not found\n"); 450 446 return PTR_ERR(priv->clk); 451 447 } 452 448 453 449 err = clk_prepare_enable(priv->clk); 454 450 if (err) { 455 - dev_err(dev, "unable to enable clock"); 451 + dev_err(dev, "unable to enable clock\n"); 456 452 return err; 457 453 } 458 454 459 455 /* unlock the device */ 460 456 zynq_fpga_write(priv, UNLOCK_OFFSET, UNLOCK_MASK); 461 457 458 + zynq_fpga_write(priv, INT_MASK_OFFSET, 0xFFFFFFFF); 459 + zynq_fpga_write(priv, INT_STS_OFFSET, IXR_ALL_MASK); 460 + err = devm_request_irq(dev, priv->irq, zynq_fpga_isr, 0, dev_name(dev), 461 + priv); 462 + if (err) { 463 + dev_err(dev, "unable to request IRQ\n"); 464 + clk_disable_unprepare(priv->clk); 465 + return err; 466 + } 467 + 462 468 clk_disable(priv->clk); 463 469 464 470 err = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", 465 471 &zynq_fpga_ops, priv); 466 472 if (err) { 467 - dev_err(dev, "unable to register FPGA manager"); 473 + dev_err(dev, "unable to register FPGA manager\n"); 468 474 clk_unprepare(priv->clk); 469 475 return err; 470 476 }
+2
include/linux/fpga/fpga-mgr.h
··· 84 84 85 85 /** 86 86 * struct fpga_manager_ops - ops for low level fpga manager drivers 87 + * @initial_header_size: Maximum number of bytes that should be passed into write_init 87 88 * @state: returns an enum value of the FPGA's state 88 89 * @write_init: prepare the FPGA to receive confuration data 89 90 * @write: write count bytes of configuration data to the FPGA ··· 96 95 * called, so leaving them out is fine. 97 96 */ 98 97 struct fpga_manager_ops { 98 + size_t initial_header_size; 99 99 enum fpga_mgr_states (*state)(struct fpga_manager *mgr); 100 100 int (*write_init)(struct fpga_manager *mgr, 101 101 struct fpga_image_info *info,