Skip to main content

PlatformManager Block Configuration

Block configurations allow defining multiple similar FPGA sub-devices using offset calculation expressions. This reduces configuration verbosity when an FPGA has many identical controllers at regular address offsets.

Overview​

Instead of listing each I2C adapter, LED controller, or transceiver controller individually, block configs define a pattern with:

  • A name prefix
  • An offset calculation expression
  • The number of instances

Offset Calculation Expressions​

Expressions support:

  • Hexadecimal constants: 0x1000
  • Arithmetic: +, -, *
  • Variables in braces (context-dependent, e.g., {adapterIndex}, {busIndex})

Available variables depend on the block config type:

  • I2C adapter blocks: {adapterIndex}, {startAdapterIndex}
  • MDIO bus blocks: {busIndex}
  • Port/LED configs: {portNum}, {startPort}, {ledNum}

The result is computed as a hexadecimal offset.

Example Calculation​

For csrOffsetCalc: "0x1000 + ({adapterIndex} - {startAdapterIndex}) * 0x100" with startAdapterIndex=1:

adapterIndexCalculationResult
10x1000 + (1-1)*0x1000x1000
20x1000 + (2-1)*0x1000x1100
30x1000 + (3-1)*0x1000x1200

I2C Adapter Block Config​

Creates multiple I2C adapters from an FPGA:

{
"i2cAdapterBlockConfigs": [
{
"pmUnitScopedNamePrefix": "SMB_I2C_ADAPTER",
"deviceName": "fbiob_i2c",
"csrOffsetCalc": "0x1000 + ({adapterIndex} - {startAdapterIndex}) * 0x100",
"iobufOffsetCalc": "0x2000 + ({adapterIndex} - {startAdapterIndex}) * 0x100",
"startAdapterIndex": 1,
"numAdapters": 8,
"numBusesPerAdapter": 1
}
]
}

This creates devices named SMB_I2C_ADAPTER_1 through SMB_I2C_ADAPTER_8.

FieldDescription
pmUnitScopedNamePrefixPrefix for generated device names
deviceNameKernel driver name
csrOffsetCalcExpression for CSR register offset
iobufOffsetCalcExpression for I/O buffer offset
startAdapterIndexStarting index for numbering
numAdaptersNumber of adapters to create
numBusesPerAdapterI2C buses per adapter (default: 1)

Available variables:

VariableDescription
{adapterIndex}Current adapter index (from startAdapterIndex to startAdapterIndex + numAdapters - 1)
{startAdapterIndex}Value of startAdapterIndex field

Transceiver Controller Block Config​

Creates multiple transceiver (QSFP/SFP) controllers:

{
"xcvrCtrlBlockConfigs": [
{
"pmUnitScopedNamePrefix": "XCVR_CTRL",
"deviceName": "fbiob_xcvr",
"csrOffsetCalc": "0x3000 + ({portNum} - {startPort}) * 0x4",
"iobufOffsetCalc": "0x4000 + ({portNum} - {startPort}) * 0x4",
"startPort": 1,
"numPorts": 32
}
]
}

This creates devices named XCVR_CTRL_PORT_1 through XCVR_CTRL_PORT_32.

FieldDescription
pmUnitScopedNamePrefixPrefix for generated device names
deviceNameKernel driver name
csrOffsetCalcExpression for CSR register offset
iobufOffsetCalcExpression for I/O buffer offset
startPortStarting port number
numPortsNumber of ports

Available variables:

VariableDescription
{portNum}Current port number (from startPort to startPort + numPorts - 1)
{startPort}Value of startPort field

LED Controller Block Config​

Creates multiple LED controllers (typically per-port):

{
"ledCtrlBlockConfigs": [
{
"pmUnitScopedNamePrefix": "LED_CTRL",
"deviceName": "fbiob_led",
"csrOffsetCalc": "0x5000 + ({portNum} - {startPort}) * 0x8 + ({ledNum} - 1) * 0x4",
"iobufOffsetCalc": "0x6000 + ({portNum} - {startPort}) * 0x8 + ({ledNum} - 1) * 0x4",
"startPort": 1,
"numPorts": 32,
"ledPerPort": 2
}
]
}

This creates devices named LED_CTRL_PORT_1_LED_1, LED_CTRL_PORT_1_LED_2, through LED_CTRL_PORT_32_LED_2.

FieldDescription
pmUnitScopedNamePrefixPrefix for generated device names
deviceNameKernel driver name
csrOffsetCalcExpression for CSR register offset
iobufOffsetCalcExpression for I/O buffer offset
startPortStarting port number
numPortsNumber of ports
ledPerPortLEDs per port

Available variables:

VariableDescription
{portNum}Current port number (from startPort to startPort + numPorts - 1)
{startPort}Value of startPort field
{ledNum}Current LED number (from 1 to ledPerPort)

MDIO Bus Block Config​

Creates multiple MDIO bus controllers:

{
"mdioBusBlockConfigs": [
{
"pmUnitScopedNamePrefix": "RTM_MDIO_BUS",
"deviceName": "fbiob_mdio",
"csrOffsetCalc": "0x200 + {busIndex} * 0x20",
"iobufOffsetCalc": "0x300 + {busIndex} * 0x4",
"numBuses": 4
}
]
}

This creates devices named RTM_MDIO_BUS_0 through RTM_MDIO_BUS_3.

FieldDescription
pmUnitScopedNamePrefixPrefix for generated device names
deviceNameKernel driver name
csrOffsetCalcExpression for CSR register offset
iobufOffsetCalcExpression for I/O buffer offset
numBusesNumber of MDIO buses

Available variables:

VariableDescription
{busIndex}Current bus index (from 0 to numBuses - 1)

Legacy Configs​

Block configs replace the deprecated individual configs:

  • i2cAdapterConfigs -> i2cAdapterBlockConfigs
  • xcvrCtrlConfigs -> xcvrCtrlBlockConfigs
  • ledCtrlConfigs -> ledCtrlBlockConfigs
  • mdioBusConfigs -> mdioBusBlockConfigs

The legacy configs are still supported but should not be used for new platforms.