mrfioc2  2.3.0
jtag_mrf.c
Go to the documentation of this file.
1 /* Copyright (C) 2014 Brookhaven National Lab
2  * All rights reserved.
3  * See file LICENSE for terms.
4  */
5 /* This file contains hooks to access
6  * the GPIO lines of the PLX PCI9030
7  * which on the PMC-EVR-230
8  * are connected use for a JTAG interface.
9  *
10  * These lines may be accessed through
11  * the GPIO sub-system, or through
12  * an emulated parallel port programing cable.
13  */
14 
15 #include "mrf.h"
16 
17 #ifdef CONFIG_GENERIC_GPIO
18 static int modparam_gpiobase = -1;
19 module_param_named(gpiobase, modparam_gpiobase, int, 0440);
20 MODULE_PARM_DESC(gpiobase, "The GPIO number base. -1 means dynamic, which is the default.");
21 #endif
22 
23 
24 #ifdef CONFIG_PARPORT_NOT_PC
25 // parallel port programming cable description
26 struct ppcable {
27  const char *name;
28  // bit masks for each JTAG signal
29 
30  // output (host -> devices signals)
31  // may be in data or control byte
32  unsigned char tms_data, tms_ctrl;
33  unsigned char tck_data, tck_ctrl;
34  unsigned char tdi_data, tdi_ctrl;
35 
36  // input (device -> host)
37  // may be in status or control byte
38  unsigned char tdo_sts, tdo_ctrl;
39 };
40 
41 static const struct ppcable cables[];
42 static char *cablename = "Minimal";
43 module_param_named(cable, cablename, charp, 0444);
44 MODULE_PARM_DESC(cable, "Name of JTAG parallel port cable to emulate");
45 #endif
46 
47 #ifdef CONFIG_GENERIC_GPIO
48 /************************* GPIO for JTAG **************************/
49 
50 static
51 int mrf_gpio_request(struct gpio_chip *chip, unsigned offset)
52 {
53  if(offset>=GPIOC_num_pins)
54  return -EINVAL;
55  return 0;
56 }
57 
58 static
59 void mrf_gpio_free(struct gpio_chip *chip, unsigned offset)
60 {}
61 
62 static
63 int mrf_gpio_get(struct gpio_chip *chip, unsigned offset)
64 {
65  int ret;
66  struct mrf_priv *priv = container_of(chip, struct mrf_priv, gpio);
67  void __iomem *plx = priv->uio.mem[0].internal_addr;
68 
69  if(offset>=GPIOC_num_pins)
70  return 0;
71 
72  ret = ioread32(plx + GPIOC) & GPIOC_pin_data(offset);
73 
74  return !!ret;
75 }
76 
77 static
78 void mrf_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
79 {
80  u32 val;
81  struct mrf_priv *priv = container_of(chip, struct mrf_priv, gpio);
82  void __iomem *plx = priv->uio.mem[0].internal_addr;
83 
84  if(offset==2 || offset>=GPIOC_num_pins)
85  return;
86 
87  spin_lock(&priv->lock);
88 
89  val = ioread32(plx + GPIOC);
90  if(value)
91  val |= GPIOC_pin_data(offset);
92  else
93  val &= ~GPIOC_pin_data(offset);
94 
95  iowrite32(val, plx + GPIOC);
96 
97  spin_unlock(&priv->lock);
98 }
99 
100 static
101 int mrf_gpio_dir_in(struct gpio_chip *chip, unsigned offset)
102 {
103  if(offset!=2) /* Only TDO may be input */
104  return -EINVAL;
105  return 0;
106 }
107 
108 static
109 int mrf_gpio_dir_out(struct gpio_chip *chip, unsigned offset, int value)
110 {
111  if(offset==2) /* All but TDO are output */
112  return -EINVAL;
113  mrf_gpio_set(chip, offset, value);
114  return 0;
115 }
116 
117 void mrf_gpio_setup(struct mrf_priv *priv)
118 {
119  int ret;
120  /* Setup GPIO config */
121  priv->gpio.label = dev_name(&priv->pdev->dev);
122  priv->gpio.owner = THIS_MODULE;
123  priv->gpio.base = modparam_gpiobase;
124  priv->gpio.ngpio = GPIOC_num_pins;
125  priv->gpio.can_sleep = 0;
126  priv->gpio.request = &mrf_gpio_request;
127  priv->gpio.free = &mrf_gpio_free;
128  priv->gpio.direction_input = &mrf_gpio_dir_in;
129  priv->gpio.direction_output = &mrf_gpio_dir_out;
130  priv->gpio.set = &mrf_gpio_set;
131  priv->gpio.get = &mrf_gpio_get;
132 
133  /* gpiochip register fail is not fatal. Likely due
134  * to collision of gpiobase numbers. Must use dynamic
135  * numbers when multiple MRF cards w/ PLX 9030 are present.
136  */
137  ret = gpiochip_add(&priv->gpio);
138  if (ret) {
139  dev_warn(&priv->pdev->dev, "GPIO setup error, JTAG unavailable\n");
140  } else {
141  priv->gpio_cleanup = 1;
142  dev_info(&priv->pdev->dev, "GPIO setup ok, JTAG available at bit %d\n",
143  priv->gpio.base);
144  }
145 }
146 
147 void mrf_gpio_cleanup(struct mrf_priv *priv)
148 {
149  if (priv->gpio_cleanup) {
150  int status = gpiochip_remove(&priv->gpio);
151  while (status==-EBUSY) {
152  msleep(10); /* operation in progress... zzzzz */
153  status = gpiochip_remove(&priv->gpio);
154  }
155  BUG_ON(status && status!=-EBUSY);
156  dev_info(&priv->pdev->dev, "GPIO Cleaned up\n");
157  }
158 }
159 #endif
160 
161 /******************** Parallel port for JTAG **********************/
162 #ifdef CONFIG_PARPORT_NOT_PC
163 
164 /* if this signal SIG is included in register REG (non-zero mask)
165  * then set/clear the appropriate HW bit.
166  * Translation between cable bit mask and GPIO bit mask
167  */
168 #define PPBITSET(REG, SIG, BIT) \
169  if(dev->cable->SIG ## _ ## REG) {if(d & dev->cable->SIG ## _ ## REG) \
170  {val |= GPIOC_pin_data(BIT);} else {val &= ~GPIOC_pin_data(BIT);}}
171 
172 /* if this signal SIG is included in register REG (non-zero mask)
173  * and the GPIO bit is active, then set the appropriate cable bit
174  */
175 #define PPBITGET(REG, SIG, BIT) \
176  if(dev->cable->SIG ## _ ## REG && val & GPIOC_pin_data(BIT)) \
177  {ret |= dev->cable->SIG ## _ ## REG;}
178 
179 static void mrfpp_write_data(struct parport *port, unsigned char d)
180 {
181  struct mrf_priv *dev = port->private_data;
182  void __iomem *plx = dev->uio.mem[0].internal_addr;
183  u32 val;
184 
185  spin_lock(&dev->lock);
186  if(!dev->ppenable) {
187  spin_unlock(&dev->lock);
188  return;
189  }
190  val = ioread32(plx + GPIOC);
191 
192  PPBITSET(data, tck, 0)
193  PPBITSET(data, tms, 1)
194  PPBITSET(data, tdi, 3)
195  // Don't write TDO
196 
197  iowrite32(val, plx + GPIOC);
198  spin_unlock(&dev->lock);
199 }
200 
201 static void mrfpp_write_control(struct parport *port, unsigned char d)
202 {
203  struct mrf_priv *dev = port->private_data;
204  void __iomem *plx = dev->uio.mem[0].internal_addr;
205  u32 val;
206 
207  d ^= 0x0b; // bits are hardware inverted
208 
209  spin_lock(&dev->lock);
210  if(!dev->ppenable) {
211  spin_unlock(&dev->lock);
212  return;
213  }
214  val = ioread32(plx + GPIOC);
215 
216  PPBITSET(ctrl, tck, 0)
217  PPBITSET(ctrl, tms, 1)
218  PPBITSET(ctrl, tdi, 3)
219  // Don't write TDO
220 
221  iowrite32(val, plx + GPIOC);
222  spin_unlock(&dev->lock);
223 }
224 
225 static unsigned char mrfpp_read_data(struct parport *port)
226 {
227  unsigned char ret = 0;
228  struct mrf_priv *dev = port->private_data;
229  void __iomem *plx = dev->uio.mem[0].internal_addr;
230  u32 val;
231 
232  val = ioread32(plx + GPIOC);
233  PPBITGET(data, tck, 0)
234  PPBITGET(data, tms, 1)
235  PPBITGET(data, tdi, 3)
236 
237  return ret;
238 }
239 
240 static unsigned char mrfpp_read_control(struct parport *port)
241 {
242  unsigned char ret = 0;
243  struct mrf_priv *dev = port->private_data;
244  void __iomem *plx = dev->uio.mem[0].internal_addr;
245  u32 val;
246 
247  val = ioread32(plx + GPIOC);
248  PPBITGET(ctrl, tck, 0)
249  PPBITGET(ctrl, tms, 1)
250  PPBITGET(ctrl, tdo, 2)
251  PPBITGET(ctrl, tdi, 3)
252  ret ^= 0x0b; // bits are hardware inverted
253 
254  return ret;
255 }
256 
257 static unsigned char mrfpp_read_status(struct parport *port)
258 {
259  unsigned char ret = 0;
260  struct mrf_priv *dev = port->private_data;
261  void __iomem *plx = dev->uio.mem[0].internal_addr;
262  u32 val;
263 
264  val = ioread32(plx + GPIOC);
265  PPBITGET(sts, tdo, 2)
266  ret ^= 0x80; // BUSY line is hardware inverted
267 
268  return ret;
269 }
270 
271 static unsigned char mrfpp_frob_control(struct parport *dev, unsigned char mask,
272  unsigned char val)
273 {
274  unsigned char ret;
275 
276  // TODO, not atomic
277  ret = mrfpp_read_control(dev);
278  ret = (ret & ~mask) ^ val;
279  mrfpp_write_control(dev, ret);
280  return ret;
281 }
282 
283 static void mrfpp_noop(struct parport *dev) {}
284 
285 static void mrfpp_initstate(struct pardevice *dev, struct parport_state *s)
286 {
287  // New clients clear all JTAG bits
288  s->u.pc.ctr = 0x0b;
289  s->u.pc.ecr = 0;
290 }
291 
292 static void mrfpp_savestate(struct parport *dev, struct parport_state *s)
293 {
294  s->u.pc.ctr = mrfpp_read_control(dev);
295  s->u.pc.ecr = mrfpp_read_data(dev);
296 }
297 static void mrfpp_restorestate(struct parport *dev, struct parport_state *s)
298 {
299  mrfpp_write_control(dev, s->u.pc.ctr);
300  mrfpp_write_data(dev, s->u.pc.ecr);
301 }
302 
303 static struct parport_operations mrfppops = {
304  .owner = THIS_MODULE,
305 
306  .write_data = mrfpp_write_data,
307  .write_control = mrfpp_write_control,
308 
309  .read_data = mrfpp_read_data,
310  .read_status = mrfpp_read_status,
311  .read_control = mrfpp_read_control,
312 
313  .frob_control = mrfpp_frob_control,
314 
315  .enable_irq = mrfpp_noop,
316  .disable_irq = mrfpp_noop,
317  .data_forward = mrfpp_noop,
318  .data_reverse = mrfpp_noop,
319 
320  .init_state = mrfpp_initstate,
321  .save_state = mrfpp_savestate,
322  .restore_state = mrfpp_restorestate,
323 };
324 
325 void mrf_pp_setup(struct mrf_priv* dev)
326 {
327  const struct ppcable *ccable = cables;
328 
329  for(; ccable->name; ccable++) {
330  if(strcmp(ccable->name, cablename)==0)
331  break;
332  }
333  if(!ccable) {
334  dev_err(&dev->pdev->dev, "Cable '%s' is not defined\n", cablename);
335  return;
336  }
337 
338  dev->port = parport_register_port(0, PARPORT_IRQ_NONE,
339  PARPORT_DMA_NONE,
340  &mrfppops);
341 
342  if(!dev->port) {
343  dev_err(&dev->pdev->dev, "Failed to register parallel port\n");
344  return;
345  }
346 
347  dev->cable = ccable;
348  dev->port->modes = PARPORT_MODE_PCSPP; /* support only basic PC port ops */
349  dev->port->private_data = dev;
350  dev->port->dev = &dev->pdev->dev;
351 
352  parport_announce_port(dev->port);
353  /* Protection from whatever random drivers have just tried
354  * to print to us...
355  */
356  dev->ppenable = 1;
357 
358  dev_info(&dev->pdev->dev, "Emulating cable: %s\n", ccable->name);
359  return;
360 }
361 
362 void mrf_pp_cleanup(struct mrf_priv* priv)
363 {
364  if(priv->port)
365  parport_remove_port(priv->port);
366 }
367 
368 #undef PPBITGET
369 #undef PPBITSET
370 
371 
372 static const struct ppcable cables[] =
373 {
374  { // Urjtag minimal
375  .name = "Minimal",
376  .tms_data = 1 << 1,
377  .tck_data = 1 << 2,
378  .tdi_data = 1 << 3,
379  .tdo_sts = 1 << 7,
380  },
381  { // Altera ByteBlaster
382  .name = "ByteBlaster",
383  .tck_data = 1 << 0,
384  .tms_data = 1 << 1,
385  .tdi_data = 1 << 6,
386  .tdo_sts = 1 << 7,
387  },
388  {NULL}
389 };
390 
391 #endif
Definition: mrf.h:138
struct pci_dev * pdev
Definition: mrf.h:140
#define GPIOC_num_pins
Definition: mrf.h:66
#define GPIOC_pin_data(N)
Definition: mrf.h:62
module_param_named(interfaceversion, modparam_iversion, int, 0444)
MODULE_PARM_DESC(interfaceversion, "User space interface version")
#define GPIOC
Definition: mrf.h:56
struct uio_info uio
Definition: mrf.h:139