| ======================== |
| Linux Switchtec Support |
| ======================== |
| |
| Microsemi's "Switchtec" line of PCI switch devices is already |
| supported by the kernel with standard PCI switch drivers. However, the |
| Switchtec device advertises a special management endpoint which |
| enables some additional functionality. This includes: |
| |
| * Packet and Byte Counters |
| * Firmware Upgrades |
| * Event and Error logs |
| * Querying port link status |
| * Custom user firmware commands |
| |
| The switchtec kernel module implements this functionality. |
| |
| |
| Interface |
| ========= |
| |
| The primary means of communicating with the Switchtec management firmware is |
| through the Memory-mapped Remote Procedure Call (MRPC) interface. |
| Commands are submitted to the interface with a 4-byte command |
| identifier and up to 1KB of command specific data. The firmware will |
| respond with a 4-byte return code and up to 1KB of command-specific |
| data. The interface only processes a single command at a time. |
| |
| |
| Userspace Interface |
| =================== |
| |
| The MRPC interface will be exposed to userspace through a simple char |
| device: /dev/switchtec#, one for each management endpoint in the system. |
| |
| The char device has the following semantics: |
| |
| * A write must consist of at least 4 bytes and no more than 1028 bytes. |
| The first 4 bytes will be interpreted as the Command ID and the |
| remainder will be used as the input data. A write will send the |
| command to the firmware to begin processing. |
| |
| * Each write must be followed by exactly one read. Any double write will |
| produce an error and any read that doesn't follow a write will |
| produce an error. |
| |
| * A read will block until the firmware completes the command and return |
| the 4-byte Command Return Value plus up to 1024 bytes of output |
| data. (The length will be specified by the size parameter of the read |
| call -- reading less than 4 bytes will produce an error.) |
| |
| * The poll call will also be supported for userspace applications that |
| need to do other things while waiting for the command to complete. |
| |
| The following IOCTLs are also supported by the device: |
| |
| * SWITCHTEC_IOCTL_FLASH_INFO - Retrieve firmware length and number |
| of partitions in the device. |
| |
| * SWITCHTEC_IOCTL_FLASH_PART_INFO - Retrieve address and lengeth for |
| any specified partition in flash. |
| |
| * SWITCHTEC_IOCTL_EVENT_SUMMARY - Read a structure of bitmaps |
| indicating all uncleared events. |
| |
| * SWITCHTEC_IOCTL_EVENT_CTL - Get the current count, clear and set flags |
| for any event. This ioctl takes in a switchtec_ioctl_event_ctl struct |
| with the event_id, index and flags set (index being the partition or PFF |
| number for non-global events). It returns whether the event has |
| occurred, the number of times and any event specific data. The flags |
| can be used to clear the count or enable and disable actions to |
| happen when the event occurs. |
| By using the SWITCHTEC_IOCTL_EVENT_FLAG_EN_POLL flag, |
| you can set an event to trigger a poll command to return with |
| POLLPRI. In this way, userspace can wait for events to occur. |
| |
| * SWITCHTEC_IOCTL_PFF_TO_PORT and SWITCHTEC_IOCTL_PORT_TO_PFF convert |
| between PCI Function Framework number (used by the event system) |
| and Switchtec Logic Port ID and Partition number (which is more |
| user friendly). |
| |
| |
| Non-Transparent Bridge (NTB) Driver |
| =================================== |
| |
| An NTB hardware driver is provided for the Switchtec hardware in |
| ntb_hw_switchtec. Currently, it only supports switches configured with |
| exactly 2 NT partitions and zero or more non-NT partitions. It also requires |
| the following configuration settings: |
| |
| * Both NT partitions must be able to access each other's GAS spaces. |
| Thus, the bits in the GAS Access Vector under Management Settings |
| must be set to support this. |
| * Kernel configuration MUST include support for NTB (CONFIG_NTB needs |
| to be set) |
| |
| NT EP BAR 2 will be dynamically configured as a Direct Window, and |
| the configuration file does not need to configure it explicitly. |
| |
| Please refer to Documentation/driver-api/ntb.rst in Linux source tree for an overall |
| understanding of the Linux NTB stack. ntb_hw_switchtec works as an NTB |
| Hardware Driver in this stack. |