| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 1 | FMC Driver | 
 | 2 | ********** | 
 | 3 |  | 
 | 4 | An FMC driver is concerned with the specific mezzanine and associated | 
 | 5 | gateware. As such, it is expected to be independent of the carrier | 
 | 6 | being used: it will perform I/O accesses only by means of | 
 | 7 | carrier-provided functions. | 
 | 8 |  | 
 | 9 | The matching between device and driver is based on the content of the | 
 | 10 | EEPROM (as mandated by the FMC standard) or by the actual cores | 
 | 11 | configured in the FPGA; the latter technique is used when the FPGA is | 
 | 12 | already programmed when the device is registered to the bus core. | 
 | 13 |  | 
 | 14 | In some special cases it is possible for a driver to directly access | 
 | 15 | FPGA registers, by means of the `fpga_base' field of the device | 
 | 16 | structure. This may be needed for high-bandwidth peripherals like fast | 
 | 17 | ADC cards. If the device module registered a remote device (for example | 
 | 18 | by means of Etherbone), the `fpga_base' pointer will be NULL. | 
 | 19 | Therefore, drivers must be ready to deal with NULL base pointers, and | 
 | 20 | fail gracefully.  Most driver, however, are not expected to access the | 
 | 21 | pointer directly but run fmc_readl and fmc_writel instead, which will | 
 | 22 | work in any case. | 
 | 23 |  | 
 | 24 | In even more special cases, the driver may access carrier-specific | 
 | 25 | functionality: the `carrier_name' string allows the driver to check | 
 | 26 | which is the current carrier and make use of the `carrier_data' | 
 | 27 | pointer.  We chose to use carrier names rather than numeric identifiers | 
 | 28 | for greater flexibility, but also to avoid a central registry within | 
 | 29 | the `fmc.h' file - we hope other users will exploit our framework with | 
 | 30 | their own carriers.  An example use of carrier names is in GPIO setup | 
 | 31 | (see *note The GPIO Abstraction::), although the name match is not | 
 | 32 | expected to be performed by the driver.  If you depend on specific | 
 | 33 | carriers, please check the carrier name and fail gracefully if your | 
 | 34 | driver finds it is running in a yet-unknown-to-it environment. | 
 | 35 |  | 
 | 36 |  | 
 | 37 | ID Table | 
 | 38 | ======== | 
 | 39 |  | 
 | 40 | Like most other Linux drivers, and FMC driver must list all the devices | 
 | 41 | which it is able to drive.  This is usually done by means of a device | 
 | 42 | table, but in FMC we can match hardware based either on the contents of | 
 | 43 | their EEPROM or on the actual FPGA cores that can be enumerated. | 
 | 44 | Therefore, we have two tables of identifiers. | 
 | 45 |  | 
 | 46 | Matching of FRU information depends on two names, the manufacturer (or | 
 | 47 | vendor) and the device (see *note FMC Identification::); for | 
 | 48 | flexibility during production (i.e. before writing to the EEPROM) the | 
 | 49 | bus supports a catch-all driver that specifies NULL strings. For this | 
 | 50 | reason, the table is specified as pointer-and-length, not a a | 
 | 51 | null-terminated array - the entry with NULL names can be a valid entry. | 
 | 52 |  | 
 | 53 | Matching on FPGA cores depends on two numeric fields: the 64-bit vendor | 
 | 54 | number and the 32-bit device number. Support for matching based on | 
 | 55 | class is not yet implemented.  Each device is expected to be uniquely | 
 | 56 | identified by an array of cores (it matches if all of the cores are | 
 | 57 | instantiated), and for consistency the list is passed as | 
 | 58 | pointer-and-length.  Several similar devices can be driven by the same | 
 | 59 | driver, and thus the driver specifies and array of such arrays. | 
 | 60 |  | 
 | 61 | The complete set of involved data structures is thus the following: | 
 | 62 |  | 
 | 63 |         struct fmc_fru_id { char *manufacturer; char *product_name; }; | 
 | 64 |         struct fmc_sdb_one_id { uint64_t vendor; uint32_t device; }; | 
 | 65 |         struct fmc_sdb_id { struct fmc_sdb_one_id *cores; int cores_nr; }; | 
 | 66 |  | 
 | 67 |         struct fmc_device_id { | 
 | 68 |                 struct fmc_fru_id *fru_id; int fru_id_nr; | 
 | 69 |                 struct fmc_sdb_id *sdb_id; int sdb_id_nr; | 
 | 70 |         }; | 
 | 71 |  | 
 | 72 | A better reference, with full explanation, is the <linux/fmc.h> header. | 
 | 73 |  | 
 | 74 |  | 
 | 75 | Module Parameters | 
 | 76 | ================= | 
 | 77 |  | 
 | 78 | Most of the FMC drivers need the same set of kernel parameters. This | 
 | 79 | package includes support to implement common parameters by means of | 
 | 80 | fields in the `fmc_driver' structure and simple macro definitions. | 
 | 81 |  | 
 | 82 | The parameters are carrier-specific, in that they rely on the busid | 
 | 83 | concept, that varies among carriers. For the SPEC, the identifier is a | 
 | 84 | PCI bus and devfn number, 16 bits wide in total; drivers for other | 
 | 85 | carriers will most likely offer something similar but not identical, | 
 | 86 | and some code duplication is unavoidable. | 
 | 87 |  | 
 | 88 | This is the list of parameters that are common to several modules to | 
 | 89 | see how they are actually used, please look at spec-trivial.c. | 
 | 90 |  | 
 | 91 | `busid=' | 
 | 92 |      This is an array of integers, listing carrier-specific | 
 | 93 |      identification numbers. For PIC, for example, `0x0400' represents | 
 | 94 |      bus 4, slot 0.  If any such ID is specified, the driver will only | 
 | 95 |      accept to drive cards that appear in the list (even if the FMC ID | 
 | 96 |      matches). This is accomplished by the validate carrier method. | 
 | 97 |  | 
 | 98 | `gateware=' | 
 | 99 |      The argument is an array of strings. If no busid= is specified, | 
 | 100 |      the first string of gateware= is used for all cards; otherwise the | 
 | 101 |      identifiers and gateware names are paired one by one, in the order | 
 | 102 |      specified. | 
 | 103 |  | 
 | 104 | `show_sdb=' | 
 | 105 |      For modules supporting it, this parameter asks to show the SDB | 
 | 106 |      internal structure by means of kernel messages. It is disabled by | 
 | 107 |      default because those lines tend to hide more important messages, | 
 | 108 |      if you look at the system console while loading the drivers. | 
 | 109 |      Note: the parameter is being obsoleted, because fmc.ko itself now | 
 | 110 |      supports dump_sdb= that applies to every client driver. | 
 | 111 |  | 
 | 112 |  | 
 | 113 | For example, if you are using the trivial driver to load two different | 
 | 114 | gateware files to two different cards, you can use the following | 
 | 115 | parameters to load different binaries to the cards, after looking up | 
 | 116 | the PCI identifiers. This has been tested with a SPEC carrier. | 
 | 117 |  | 
 | 118 |         insmod fmc-trivial.ko \ | 
 | 119 |                               busid=0x0200,0x0400 \ | 
 | 120 |                               gateware=fmc/fine-delay.bin,fmc/simple-dio.bin | 
 | 121 |  | 
 | 122 | Please note that not all sub-modules support all of those parameters. | 
 | 123 | You can use modinfo to check what is supported by each module. |