~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/powerpc/sysdev/fsl_rio.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*
  3  * Freescale MPC85xx/MPC86xx RapidIO support
  4  *
  5  * Copyright 2009 Sysgo AG
  6  * Thomas Moll <thomas.moll@sysgo.com>
  7  * - fixed maintenance access routines, check for aligned access
  8  *
  9  * Copyright 2009 Integrated Device Technology, Inc.
 10  * Alex Bounine <alexandre.bounine@idt.com>
 11  * - Added Port-Write message handling
 12  * - Added Machine Check exception handling
 13  *
 14  * Copyright (C) 2007, 2008, 2010, 2011 Freescale Semiconductor, Inc.
 15  * Zhang Wei <wei.zhang@freescale.com>
 16  *
 17  * Copyright 2005 MontaVista Software, Inc.
 18  * Matt Porter <mporter@kernel.crashing.org>
 19  */
 20 
 21 #include <linux/init.h>
 22 #include <linux/extable.h>
 23 #include <linux/types.h>
 24 #include <linux/dma-mapping.h>
 25 #include <linux/interrupt.h>
 26 #include <linux/of.h>
 27 #include <linux/of_address.h>
 28 #include <linux/of_irq.h>
 29 #include <linux/platform_device.h>
 30 #include <linux/delay.h>
 31 #include <linux/slab.h>
 32 
 33 #include <linux/io.h>
 34 #include <linux/uaccess.h>
 35 #include <asm/machdep.h>
 36 #include <asm/rio.h>
 37 
 38 #include "fsl_rio.h"
 39 
 40 #undef DEBUG_PW /* Port-Write debugging */
 41 
 42 #define RIO_PORT1_EDCSR         0x0640
 43 #define RIO_PORT2_EDCSR         0x0680
 44 #define RIO_PORT1_IECSR         0x10130
 45 #define RIO_PORT2_IECSR         0x101B0
 46 
 47 #define RIO_GCCSR               0x13c
 48 #define RIO_ESCSR               0x158
 49 #define ESCSR_CLEAR             0x07120204
 50 #define RIO_PORT2_ESCSR         0x178
 51 #define RIO_CCSR                0x15c
 52 #define RIO_LTLEDCSR_IER        0x80000000
 53 #define RIO_LTLEDCSR_PRT        0x01000000
 54 #define IECSR_CLEAR             0x80000000
 55 #define RIO_ISR_AACR            0x10120
 56 #define RIO_ISR_AACR_AA         0x1     /* Accept All ID */
 57 
 58 #define RIWTAR_TRAD_VAL_SHIFT   12
 59 #define RIWTAR_TRAD_MASK        0x00FFFFFF
 60 #define RIWBAR_BADD_VAL_SHIFT   12
 61 #define RIWBAR_BADD_MASK        0x003FFFFF
 62 #define RIWAR_ENABLE            0x80000000
 63 #define RIWAR_TGINT_LOCAL       0x00F00000
 64 #define RIWAR_RDTYP_NO_SNOOP    0x00040000
 65 #define RIWAR_RDTYP_SNOOP       0x00050000
 66 #define RIWAR_WRTYP_NO_SNOOP    0x00004000
 67 #define RIWAR_WRTYP_SNOOP       0x00005000
 68 #define RIWAR_WRTYP_ALLOC       0x00006000
 69 #define RIWAR_SIZE_MASK         0x0000003F
 70 
 71 static DEFINE_SPINLOCK(fsl_rio_config_lock);
 72 
 73 #define ___fsl_read_rio_config(x, addr, err, op, barrier)       \
 74         __asm__ __volatile__(                           \
 75                 "1:     "op" %1,0(%2)\n"                \
 76                 "       "barrier"\n"                    \
 77                 "2:\n"                                  \
 78                 ".section .fixup,\"ax\"\n"              \
 79                 "3:     li %1,-1\n"                     \
 80                 "       li %0,%3\n"                     \
 81                 "       b 2b\n"                         \
 82                 ".previous\n"                           \
 83                 EX_TABLE(1b, 3b)                        \
 84                 : "=r" (err), "=r" (x)                  \
 85                 : "b" (addr), "i" (-EFAULT), "" (err))
 86 
 87 #ifdef CONFIG_BOOKE
 88 #define __fsl_read_rio_config(x, addr, err, op) \
 89         ___fsl_read_rio_config(x, addr, err, op, "mbar")
 90 #else
 91 #define __fsl_read_rio_config(x, addr, err, op) \
 92         ___fsl_read_rio_config(x, addr, err, op, "eieio")
 93 #endif
 94 
 95 void __iomem *rio_regs_win;
 96 void __iomem *rmu_regs_win;
 97 resource_size_t rio_law_start;
 98 
 99 struct fsl_rio_dbell *dbell;
100 struct fsl_rio_pw *pw;
101 
102 #ifdef CONFIG_PPC_E500
103 int fsl_rio_mcheck_exception(struct pt_regs *regs)
104 {
105         const struct exception_table_entry *entry;
106         unsigned long reason;
107 
108         if (!rio_regs_win)
109                 return 0;
110 
111         reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR));
112         if (reason & (RIO_LTLEDCSR_IER | RIO_LTLEDCSR_PRT)) {
113                 /* Check if we are prepared to handle this fault */
114                 entry = search_exception_tables(regs->nip);
115                 if (entry) {
116                         pr_debug("RIO: %s - MC Exception handled\n",
117                                  __func__);
118                         out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR),
119                                  0);
120                         regs_set_recoverable(regs);
121                         regs_set_return_ip(regs, extable_fixup(entry));
122                         return 1;
123                 }
124         }
125 
126         return 0;
127 }
128 EXPORT_SYMBOL_GPL(fsl_rio_mcheck_exception);
129 #endif
130 
131 /**
132  * fsl_local_config_read - Generate a MPC85xx local config space read
133  * @mport: RapidIO master port info
134  * @index: ID of RapdiIO interface
135  * @offset: Offset into configuration space
136  * @len: Length (in bytes) of the maintenance transaction
137  * @data: Value to be read into
138  *
139  * Generates a MPC85xx local configuration space read. Returns %0 on
140  * success or %-EINVAL on failure.
141  */
142 static int fsl_local_config_read(struct rio_mport *mport,
143                                 int index, u32 offset, int len, u32 *data)
144 {
145         struct rio_priv *priv = mport->priv;
146         pr_debug("fsl_local_config_read: index %d offset %8.8x\n", index,
147                  offset);
148         *data = in_be32(priv->regs_win + offset);
149 
150         return 0;
151 }
152 
153 /**
154  * fsl_local_config_write - Generate a MPC85xx local config space write
155  * @mport: RapidIO master port info
156  * @index: ID of RapdiIO interface
157  * @offset: Offset into configuration space
158  * @len: Length (in bytes) of the maintenance transaction
159  * @data: Value to be written
160  *
161  * Generates a MPC85xx local configuration space write. Returns %0 on
162  * success or %-EINVAL on failure.
163  */
164 static int fsl_local_config_write(struct rio_mport *mport,
165                                 int index, u32 offset, int len, u32 data)
166 {
167         struct rio_priv *priv = mport->priv;
168         pr_debug
169                 ("fsl_local_config_write: index %d offset %8.8x data %8.8x\n",
170                 index, offset, data);
171         out_be32(priv->regs_win + offset, data);
172 
173         return 0;
174 }
175 
176 /**
177  * fsl_rio_config_read - Generate a MPC85xx read maintenance transaction
178  * @mport: RapidIO master port info
179  * @index: ID of RapdiIO interface
180  * @destid: Destination ID of transaction
181  * @hopcount: Number of hops to target device
182  * @offset: Offset into configuration space
183  * @len: Length (in bytes) of the maintenance transaction
184  * @val: Location to be read into
185  *
186  * Generates a MPC85xx read maintenance transaction. Returns %0 on
187  * success or %-EINVAL on failure.
188  */
189 static int
190 fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
191                         u8 hopcount, u32 offset, int len, u32 *val)
192 {
193         struct rio_priv *priv = mport->priv;
194         unsigned long flags;
195         u8 *data;
196         u32 rval, err = 0;
197 
198         pr_debug
199                 ("fsl_rio_config_read:"
200                 " index %d destid %d hopcount %d offset %8.8x len %d\n",
201                 index, destid, hopcount, offset, len);
202 
203         /* 16MB maintenance window possible */
204         /* allow only aligned access to maintenance registers */
205         if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
206                 return -EINVAL;
207 
208         spin_lock_irqsave(&fsl_rio_config_lock, flags);
209 
210         out_be32(&priv->maint_atmu_regs->rowtar,
211                  (destid << 22) | (hopcount << 12) | (offset >> 12));
212         out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
213 
214         data = (u8 *) priv->maint_win + (offset & (RIO_MAINT_WIN_SIZE - 1));
215         switch (len) {
216         case 1:
217                 __fsl_read_rio_config(rval, data, err, "lbz");
218                 break;
219         case 2:
220                 __fsl_read_rio_config(rval, data, err, "lhz");
221                 break;
222         case 4:
223                 __fsl_read_rio_config(rval, data, err, "lwz");
224                 break;
225         default:
226                 spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
227                 return -EINVAL;
228         }
229 
230         if (err) {
231                 pr_debug("RIO: cfg_read error %d for %x:%x:%x\n",
232                          err, destid, hopcount, offset);
233         }
234 
235         spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
236         *val = rval;
237 
238         return err;
239 }
240 
241 /**
242  * fsl_rio_config_write - Generate a MPC85xx write maintenance transaction
243  * @mport: RapidIO master port info
244  * @index: ID of RapdiIO interface
245  * @destid: Destination ID of transaction
246  * @hopcount: Number of hops to target device
247  * @offset: Offset into configuration space
248  * @len: Length (in bytes) of the maintenance transaction
249  * @val: Value to be written
250  *
251  * Generates an MPC85xx write maintenance transaction. Returns %0 on
252  * success or %-EINVAL on failure.
253  */
254 static int
255 fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
256                         u8 hopcount, u32 offset, int len, u32 val)
257 {
258         struct rio_priv *priv = mport->priv;
259         unsigned long flags;
260         u8 *data;
261         int ret = 0;
262 
263         pr_debug
264                 ("fsl_rio_config_write:"
265                 " index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
266                 index, destid, hopcount, offset, len, val);
267 
268         /* 16MB maintenance windows possible */
269         /* allow only aligned access to maintenance registers */
270         if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
271                 return -EINVAL;
272 
273         spin_lock_irqsave(&fsl_rio_config_lock, flags);
274 
275         out_be32(&priv->maint_atmu_regs->rowtar,
276                  (destid << 22) | (hopcount << 12) | (offset >> 12));
277         out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
278 
279         data = (u8 *) priv->maint_win + (offset & (RIO_MAINT_WIN_SIZE - 1));
280         switch (len) {
281         case 1:
282                 out_8((u8 *) data, val);
283                 break;
284         case 2:
285                 out_be16((u16 *) data, val);
286                 break;
287         case 4:
288                 out_be32((u32 *) data, val);
289                 break;
290         default:
291                 ret = -EINVAL;
292         }
293         spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
294 
295         return ret;
296 }
297 
298 static void fsl_rio_inbound_mem_init(struct rio_priv *priv)
299 {
300         int i;
301 
302         /* close inbound windows */
303         for (i = 0; i < RIO_INB_ATMU_COUNT; i++)
304                 out_be32(&priv->inb_atmu_regs[i].riwar, 0);
305 }
306 
307 static int fsl_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
308                            u64 rstart, u64 size, u32 flags)
309 {
310         struct rio_priv *priv = mport->priv;
311         u32 base_size;
312         unsigned int base_size_log;
313         u64 win_start, win_end;
314         u32 riwar;
315         int i;
316 
317         if ((size & (size - 1)) != 0 || size > 0x400000000ULL)
318                 return -EINVAL;
319 
320         base_size_log = ilog2(size);
321         base_size = 1 << base_size_log;
322 
323         /* check if addresses are aligned with the window size */
324         if (lstart & (base_size - 1))
325                 return -EINVAL;
326         if (rstart & (base_size - 1))
327                 return -EINVAL;
328 
329         /* check for conflicting ranges */
330         for (i = 0; i < RIO_INB_ATMU_COUNT; i++) {
331                 riwar = in_be32(&priv->inb_atmu_regs[i].riwar);
332                 if ((riwar & RIWAR_ENABLE) == 0)
333                         continue;
334                 win_start = ((u64)(in_be32(&priv->inb_atmu_regs[i].riwbar) & RIWBAR_BADD_MASK))
335                         << RIWBAR_BADD_VAL_SHIFT;
336                 win_end = win_start + ((1 << ((riwar & RIWAR_SIZE_MASK) + 1)) - 1);
337                 if (rstart < win_end && (rstart + size) > win_start)
338                         return -EINVAL;
339         }
340 
341         /* find unused atmu */
342         for (i = 0; i < RIO_INB_ATMU_COUNT; i++) {
343                 riwar = in_be32(&priv->inb_atmu_regs[i].riwar);
344                 if ((riwar & RIWAR_ENABLE) == 0)
345                         break;
346         }
347         if (i >= RIO_INB_ATMU_COUNT)
348                 return -ENOMEM;
349 
350         out_be32(&priv->inb_atmu_regs[i].riwtar, lstart >> RIWTAR_TRAD_VAL_SHIFT);
351         out_be32(&priv->inb_atmu_regs[i].riwbar, rstart >> RIWBAR_BADD_VAL_SHIFT);
352         out_be32(&priv->inb_atmu_regs[i].riwar, RIWAR_ENABLE | RIWAR_TGINT_LOCAL |
353                 RIWAR_RDTYP_SNOOP | RIWAR_WRTYP_SNOOP | (base_size_log - 1));
354 
355         return 0;
356 }
357 
358 static void fsl_unmap_inb_mem(struct rio_mport *mport, dma_addr_t lstart)
359 {
360         u32 win_start_shift, base_start_shift;
361         struct rio_priv *priv = mport->priv;
362         u32 riwar, riwtar;
363         int i;
364 
365         /* skip default window */
366         base_start_shift = lstart >> RIWTAR_TRAD_VAL_SHIFT;
367         for (i = 0; i < RIO_INB_ATMU_COUNT; i++) {
368                 riwar = in_be32(&priv->inb_atmu_regs[i].riwar);
369                 if ((riwar & RIWAR_ENABLE) == 0)
370                         continue;
371 
372                 riwtar = in_be32(&priv->inb_atmu_regs[i].riwtar);
373                 win_start_shift = riwtar & RIWTAR_TRAD_MASK;
374                 if (win_start_shift == base_start_shift) {
375                         out_be32(&priv->inb_atmu_regs[i].riwar, riwar & ~RIWAR_ENABLE);
376                         return;
377                 }
378         }
379 }
380 
381 void fsl_rio_port_error_handler(int offset)
382 {
383         /*XXX: Error recovery is not implemented, we just clear errors */
384         out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), 0);
385 
386         if (offset == 0) {
387                 out_be32((u32 *)(rio_regs_win + RIO_PORT1_EDCSR), 0);
388                 out_be32((u32 *)(rio_regs_win + RIO_PORT1_IECSR), IECSR_CLEAR);
389                 out_be32((u32 *)(rio_regs_win + RIO_ESCSR), ESCSR_CLEAR);
390         } else {
391                 out_be32((u32 *)(rio_regs_win + RIO_PORT2_EDCSR), 0);
392                 out_be32((u32 *)(rio_regs_win + RIO_PORT2_IECSR), IECSR_CLEAR);
393                 out_be32((u32 *)(rio_regs_win + RIO_PORT2_ESCSR), ESCSR_CLEAR);
394         }
395 }
396 static inline void fsl_rio_info(struct device *dev, u32 ccsr)
397 {
398         const char *str;
399         if (ccsr & 1) {
400                 /* Serial phy */
401                 switch (ccsr >> 30) {
402                 case 0:
403                         str = "1";
404                         break;
405                 case 1:
406                         str = "4";
407                         break;
408                 default:
409                         str = "Unknown";
410                         break;
411                 }
412                 dev_info(dev, "Hardware port width: %s\n", str);
413 
414                 switch ((ccsr >> 27) & 7) {
415                 case 0:
416                         str = "Single-lane 0";
417                         break;
418                 case 1:
419                         str = "Single-lane 2";
420                         break;
421                 case 2:
422                         str = "Four-lane";
423                         break;
424                 default:
425                         str = "Unknown";
426                         break;
427                 }
428                 dev_info(dev, "Training connection status: %s\n", str);
429         } else {
430                 /* Parallel phy */
431                 if (!(ccsr & 0x80000000))
432                         dev_info(dev, "Output port operating in 8-bit mode\n");
433                 if (!(ccsr & 0x08000000))
434                         dev_info(dev, "Input port operating in 8-bit mode\n");
435         }
436 }
437 
438 /**
439  * fsl_rio_setup - Setup Freescale PowerPC RapidIO interface
440  * @dev: platform_device pointer
441  *
442  * Initializes MPC85xx RapidIO hardware interface, configures
443  * master port with system-specific info, and registers the
444  * master port with the RapidIO subsystem.
445  */
446 static int fsl_rio_setup(struct platform_device *dev)
447 {
448         struct rio_ops *ops;
449         struct rio_mport *port;
450         struct rio_priv *priv;
451         int rc = 0;
452         const u32 *port_index;
453         u32 active_ports = 0;
454         struct device_node *np, *rmu_node;
455         u32 ccsr;
456         u64 range_start;
457         u32 i;
458         static int tmp;
459         struct device_node *rmu_np[MAX_MSG_UNIT_NUM] = {NULL};
460 
461         if (!dev->dev.of_node) {
462                 dev_err(&dev->dev, "Device OF-Node is NULL");
463                 return -ENODEV;
464         }
465 
466         rio_regs_win = of_iomap(dev->dev.of_node, 0);
467         if (!rio_regs_win) {
468                 dev_err(&dev->dev, "Unable to map rio register window\n");
469                 rc = -ENOMEM;
470                 goto err_rio_regs;
471         }
472 
473         ops = kzalloc(sizeof(struct rio_ops), GFP_KERNEL);
474         if (!ops) {
475                 rc = -ENOMEM;
476                 goto err_ops;
477         }
478         ops->lcread = fsl_local_config_read;
479         ops->lcwrite = fsl_local_config_write;
480         ops->cread = fsl_rio_config_read;
481         ops->cwrite = fsl_rio_config_write;
482         ops->dsend = fsl_rio_doorbell_send;
483         ops->pwenable = fsl_rio_pw_enable;
484         ops->open_outb_mbox = fsl_open_outb_mbox;
485         ops->open_inb_mbox = fsl_open_inb_mbox;
486         ops->close_outb_mbox = fsl_close_outb_mbox;
487         ops->close_inb_mbox = fsl_close_inb_mbox;
488         ops->add_outb_message = fsl_add_outb_message;
489         ops->add_inb_buffer = fsl_add_inb_buffer;
490         ops->get_inb_message = fsl_get_inb_message;
491         ops->map_inb = fsl_map_inb_mem;
492         ops->unmap_inb = fsl_unmap_inb_mem;
493 
494         rmu_node = of_parse_phandle(dev->dev.of_node, "fsl,srio-rmu-handle", 0);
495         if (!rmu_node) {
496                 dev_err(&dev->dev, "No valid fsl,srio-rmu-handle property\n");
497                 rc = -ENOENT;
498                 goto err_rmu;
499         }
500         rmu_regs_win = of_iomap(rmu_node, 0);
501 
502         of_node_put(rmu_node);
503         if (!rmu_regs_win) {
504                 dev_err(&dev->dev, "Unable to map rmu register window\n");
505                 rc = -ENOMEM;
506                 goto err_rmu;
507         }
508         for_each_compatible_node(np, NULL, "fsl,srio-msg-unit") {
509                 rmu_np[tmp] = np;
510                 tmp++;
511         }
512 
513         /*set up doobell node*/
514         np = of_find_compatible_node(NULL, NULL, "fsl,srio-dbell-unit");
515         if (!np) {
516                 dev_err(&dev->dev, "No fsl,srio-dbell-unit node\n");
517                 rc = -ENODEV;
518                 goto err_dbell;
519         }
520         dbell = kzalloc(sizeof(struct fsl_rio_dbell), GFP_KERNEL);
521         if (!(dbell)) {
522                 dev_err(&dev->dev, "Can't alloc memory for 'fsl_rio_dbell'\n");
523                 rc = -ENOMEM;
524                 goto err_dbell;
525         }
526         dbell->dev = &dev->dev;
527         dbell->bellirq = irq_of_parse_and_map(np, 1);
528         dev_info(&dev->dev, "bellirq: %d\n", dbell->bellirq);
529 
530         if (of_property_read_reg(np, 0, &range_start, NULL)) {
531                 pr_err("%pOF: unable to find 'reg' property\n",
532                         np);
533                 rc = -ENOMEM;
534                 goto err_pw;
535         }
536         dbell->dbell_regs = (struct rio_dbell_regs *)(rmu_regs_win +
537                                 (u32)range_start);
538 
539         /*set up port write node*/
540         np = of_find_compatible_node(NULL, NULL, "fsl,srio-port-write-unit");
541         if (!np) {
542                 dev_err(&dev->dev, "No fsl,srio-port-write-unit node\n");
543                 rc = -ENODEV;
544                 goto err_pw;
545         }
546         pw = kzalloc(sizeof(struct fsl_rio_pw), GFP_KERNEL);
547         if (!(pw)) {
548                 dev_err(&dev->dev, "Can't alloc memory for 'fsl_rio_pw'\n");
549                 rc = -ENOMEM;
550                 goto err_pw;
551         }
552         pw->dev = &dev->dev;
553         pw->pwirq = irq_of_parse_and_map(np, 0);
554         dev_info(&dev->dev, "pwirq: %d\n", pw->pwirq);
555         if (of_property_read_reg(np, 0, &range_start, NULL)) {
556                 pr_err("%pOF: unable to find 'reg' property\n",
557                         np);
558                 rc = -ENOMEM;
559                 goto err;
560         }
561         pw->pw_regs = (struct rio_pw_regs *)(rmu_regs_win + (u32)range_start);
562 
563         /*set up ports node*/
564         for_each_child_of_node(dev->dev.of_node, np) {
565                 struct resource res;
566 
567                 port_index = of_get_property(np, "cell-index", NULL);
568                 if (!port_index) {
569                         dev_err(&dev->dev, "Can't get %pOF property 'cell-index'\n",
570                                         np);
571                         continue;
572                 }
573 
574                 if (of_range_to_resource(np, 0, &res)) {
575                         dev_err(&dev->dev, "Can't get %pOF property 'ranges'\n",
576                                         np);
577                         continue;
578                 }
579 
580                 dev_info(&dev->dev, "%pOF: LAW %pR\n",
581                                 np, &res);
582 
583                 port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL);
584                 if (!port)
585                         continue;
586 
587                 rc = rio_mport_initialize(port);
588                 if (rc) {
589                         kfree(port);
590                         continue;
591                 }
592 
593                 i = *port_index - 1;
594                 port->index = (unsigned char)i;
595 
596                 priv = kzalloc(sizeof(struct rio_priv), GFP_KERNEL);
597                 if (!priv) {
598                         dev_err(&dev->dev, "Can't alloc memory for 'priv'\n");
599                         kfree(port);
600                         continue;
601                 }
602 
603                 INIT_LIST_HEAD(&port->dbells);
604                 port->iores = res;      /* struct copy */
605                 port->iores.name = "rio_io_win";
606 
607                 if (request_resource(&iomem_resource, &port->iores) < 0) {
608                         dev_err(&dev->dev, "RIO: Error requesting master port region"
609                                 " 0x%016llx-0x%016llx\n",
610                                 (u64)port->iores.start, (u64)port->iores.end);
611                                 kfree(priv);
612                                 kfree(port);
613                                 continue;
614                 }
615                 sprintf(port->name, "RIO mport %d", i);
616 
617                 priv->dev = &dev->dev;
618                 port->dev.parent = &dev->dev;
619                 port->ops = ops;
620                 port->priv = priv;
621                 port->phys_efptr = 0x100;
622                 port->phys_rmap = 1;
623                 priv->regs_win = rio_regs_win;
624 
625                 ccsr = in_be32(priv->regs_win + RIO_CCSR + i*0x20);
626 
627                 /* Checking the port training status */
628                 if (in_be32((priv->regs_win + RIO_ESCSR + i*0x20)) & 1) {
629                         dev_err(&dev->dev, "Port %d is not ready. "
630                         "Try to restart connection...\n", i);
631                         /* Disable ports */
632                         out_be32(priv->regs_win
633                                 + RIO_CCSR + i*0x20, 0);
634                         /* Set 1x lane */
635                         setbits32(priv->regs_win
636                                 + RIO_CCSR + i*0x20, 0x02000000);
637                         /* Enable ports */
638                         setbits32(priv->regs_win
639                                 + RIO_CCSR + i*0x20, 0x00600000);
640                         msleep(100);
641                         if (in_be32((priv->regs_win
642                                         + RIO_ESCSR + i*0x20)) & 1) {
643                                 dev_err(&dev->dev,
644                                         "Port %d restart failed.\n", i);
645                                 release_resource(&port->iores);
646                                 kfree(priv);
647                                 kfree(port);
648                                 continue;
649                         }
650                         dev_info(&dev->dev, "Port %d restart success!\n", i);
651                 }
652                 fsl_rio_info(&dev->dev, ccsr);
653 
654                 port->sys_size = (in_be32((priv->regs_win + RIO_PEF_CAR))
655                                         & RIO_PEF_CTLS) >> 4;
656                 dev_info(&dev->dev, "RapidIO Common Transport System size: %d\n",
657                                 port->sys_size ? 65536 : 256);
658 
659                 if (port->host_deviceid >= 0)
660                         out_be32(priv->regs_win + RIO_GCCSR, RIO_PORT_GEN_HOST |
661                                 RIO_PORT_GEN_MASTER | RIO_PORT_GEN_DISCOVERED);
662                 else
663                         out_be32(priv->regs_win + RIO_GCCSR,
664                                 RIO_PORT_GEN_MASTER);
665 
666                 priv->atmu_regs = (struct rio_atmu_regs *)(priv->regs_win
667                         + ((i == 0) ? RIO_ATMU_REGS_PORT1_OFFSET :
668                         RIO_ATMU_REGS_PORT2_OFFSET));
669 
670                 priv->maint_atmu_regs = priv->atmu_regs + 1;
671                 priv->inb_atmu_regs = (struct rio_inb_atmu_regs __iomem *)
672                         (priv->regs_win +
673                         ((i == 0) ? RIO_INB_ATMU_REGS_PORT1_OFFSET :
674                         RIO_INB_ATMU_REGS_PORT2_OFFSET));
675 
676                 /* Set to receive packets with any dest ID */
677                 out_be32((priv->regs_win + RIO_ISR_AACR + i*0x80),
678                          RIO_ISR_AACR_AA);
679 
680                 /* Configure maintenance transaction window */
681                 out_be32(&priv->maint_atmu_regs->rowbar,
682                         port->iores.start >> 12);
683                 out_be32(&priv->maint_atmu_regs->rowar,
684                          0x80077000 | (ilog2(RIO_MAINT_WIN_SIZE) - 1));
685 
686                 priv->maint_win = ioremap(port->iores.start,
687                                 RIO_MAINT_WIN_SIZE);
688 
689                 rio_law_start = range_start;
690 
691                 fsl_rio_setup_rmu(port, rmu_np[i]);
692                 fsl_rio_inbound_mem_init(priv);
693 
694                 dbell->mport[i] = port;
695                 pw->mport[i] = port;
696 
697                 if (rio_register_mport(port)) {
698                         release_resource(&port->iores);
699                         kfree(priv);
700                         kfree(port);
701                         continue;
702                 }
703                 active_ports++;
704         }
705 
706         if (!active_ports) {
707                 rc = -ENOLINK;
708                 goto err;
709         }
710 
711         fsl_rio_doorbell_init(dbell);
712         fsl_rio_port_write_init(pw);
713 
714         return 0;
715 err:
716         kfree(pw);
717         pw = NULL;
718 err_pw:
719         kfree(dbell);
720         dbell = NULL;
721 err_dbell:
722         iounmap(rmu_regs_win);
723         rmu_regs_win = NULL;
724 err_rmu:
725         kfree(ops);
726 err_ops:
727         iounmap(rio_regs_win);
728         rio_regs_win = NULL;
729 err_rio_regs:
730         return rc;
731 }
732 
733 /* The probe function for RapidIO peer-to-peer network.
734  */
735 static int fsl_of_rio_rpn_probe(struct platform_device *dev)
736 {
737         printk(KERN_INFO "Setting up RapidIO peer-to-peer network %pOF\n",
738                         dev->dev.of_node);
739 
740         return fsl_rio_setup(dev);
741 };
742 
743 static const struct of_device_id fsl_of_rio_rpn_ids[] = {
744         {
745                 .compatible = "fsl,srio",
746         },
747         {},
748 };
749 
750 static struct platform_driver fsl_of_rio_rpn_driver = {
751         .driver = {
752                 .name = "fsl-of-rio",
753                 .of_match_table = fsl_of_rio_rpn_ids,
754         },
755         .probe = fsl_of_rio_rpn_probe,
756 };
757 
758 static __init int fsl_of_rio_rpn_init(void)
759 {
760         return platform_driver_register(&fsl_of_rio_rpn_driver);
761 }
762 
763 subsys_initcall(fsl_of_rio_rpn_init);
764 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php