Commit graph

842 commits

Author SHA1 Message Date
Martin Braun
55379ae7fe mpm: x440: Move clock info logging out of policy
The logging of the final clock settings object is moved into
X4xxClockManager so that no intermediate clock objects are logged.
2023-07-07 12:35:55 -07:00
Javier Valenzuela
ff722cb9c8 mpm: x4xx: add intermediate clocking setting
- Move the configuration of SPLL and MMCM into its own method
- In set_master_clock_rate(), call this with intermediate clock settings
  if we decide that going direct from one clock setting to another would
  cause harm/failures

Co-authored-by: Martin Braun <martin.braun@ettus.com>
2023-07-07 12:35:55 -07:00
Martin Braun
8acae88919 mpm: x4xx: Explicitly pass MCR values to set_sync_source()
Before this commit, set_sync_source() would require the master clock
rate to be set after reclocking, but would pull it out of the
X4xxClockManager object (using the _master_clock_rates attribute). Now,
the new master clock rate is passed to set_sync_source() via the args
argument.

Note that it is still possible (for backward compat) to not provide
a new MCR, in which case the assumption is that the current MCR still
remains valid.
2023-07-07 12:35:55 -07:00
Martin Braun
b6ef88e534 mpm: x4xx: Add master_clock_rates argument to _set_ref_clock_freq()
This avoids unnecessary statefulness of this function and fixes an issue
where during init(), external reference clock frequencies would be
validated against the wrong master clock rates.
2023-07-07 12:35:55 -07:00
Martin Braun
eaba13f86b mpm: x4xx: Add intermediate clock settings to clock policy
This allows the clock policy to determine intermediate clock settings
when going from one MCR setting to another. This can avoid MMCM lock
issues.
2023-07-07 12:35:55 -07:00
Martin Braun
5100c6e01f mpm: x4xx: Add rfdc rate as a sensor to X4xx dboards
This enables querying the converter rate through the sensor API:

```python
>>> U = uhd.usrp.MultiUSRP("type=x4xx")
>>> print(U.get_tx_sensor('rfdc_rate').to_real())
3000000000.0
```
2023-07-07 12:35:55 -07:00
Javier Valenzuela
987f545d94 mpm: x4xx: filter MCR list 2023-07-07 12:35:55 -07:00
Martin Anderseck
b3b5e69b02 SelfCal: Trigger if clocking has changed
This change ensures that ADC selfcal is triggered during session start
if the clocking was reconfigured. So it saves time if several
consecutive sessions are opened with always the same settings.
It also makes the ADC self cal run if in an open session either
set_clock_source(), set_time_source() or set_sync_source() are called
and a clock reconfiguration was triggered by that.
2023-07-07 12:35:55 -07:00
Martin Braun
cd754412e7 mpm: x4xx: Remove internal_temp_sensor
This sensor is undefined and not connected. It probably got into the
codebase by accident or copy&paste.
2023-06-30 10:42:30 -05:00
Martin Anderseck
7f62283fb4 MPM: Updated default MCR for X440
This changes the default master clock rate for X440 to 368.64 MHz which
results in a converter rate of 2.94912 GSps which is in line with what
X410 uses.
2023-06-27 15:35:39 -05:00
Martin Braun
63a13c786c mpm: x4xx: Optimize clock configuration at init
Changes:
- X410 Honors the force_reinit flag now (like N310). When given, it will
  force a reinit of all clocking settings.
- When master_clock_rate is not given, and nothing else changes, then
  clocking configuration will be skipped. This shaves approx. 3s of
  startup time and avoids issues that can occur during clocking
  configuration.
- If anything changes, incl. clock/time source, then full clock
  configuration is still done.
- Multi-tile sync is done in all cases, as that happens outside of init()
2023-06-22 07:14:34 -05:00
Martin Anderseck
dae45a7081 mpm: Update X440 clock policy
This adds all clocking restrictions that are necessary for a stable
operation of the flex-rate feature of X440.
2023-06-21 09:22:41 -05:00
Martin Braun
371c4c139c mpm: Add support for X440/FBX
Co-authored-by: Lars Amsel <lars.amsel@ni.com>
Co-authored-by: Martin Anderseck <martin.anderseck@ni.com>
Co-authored-by: Virendra Kakade <virendra.kakade@ni.com>
Co-authored-by: Javier Valenzuela <javier.valenzuela@ni.com>
2023-06-12 10:27:29 -05:00
Martin Braun
cd5254c8cf mpm: rfdc: Enhance converter checks
This adds two changes:
- We assert that tile 0 / block 0 is always enabled for both ADC and
  DAC, even if not required by the daughterboard or RFNoC configuration
  to ensure it can be used as a reference in MTS.
- The converter-enable check also logs more info on the tiles like this:

```
tile/block | ADC | DAC | Notes
-----------+-----+-----+------
0/0        |  1  |  1  | RX Channel 2. TX Channel 0. MTS ref tile.
0/1        |  1  |  1  | RX Channel 1. TX Channel 3.
0/2        |  0  |  1  | TX Channel 1.
0/3        |  0  |  1  | TX Channel 2.
1/0        |  1  |  1  | RX Channel 3. TX Channel 4.
1/1        |  1  |  1  | RX Channel 0. TX Channel 7.
1/2        |  0  |  1  | TX Channel 5.
1/3        |  0  |  1  | TX Channel 6.
2/0        |  1  |  0  | RX Channel 6.
2/1        |  1  |  0  | RX Channel 5.
2/2        |  0  |  0  |
2/3        |  0  |  0  |
3/0        |  1  |  0  | RX Channel 7.
3/1        |  1  |  0  | RX Channel 4.
3/2        |  0  |  0  |
3/3        |  0  |  0  |
```
2023-06-09 13:40:38 -05:00
Martin Braun
1415cc1ebb mpm: Add LogRuntimeError class
This inherits RuntimeError and saves from logging and throwing in
separate steps. Instead of

```python
log.error("Error X occured!")
raise RuntimeError("Error X occured!")
```
do
```python
raise LogRuntimeError(log, "Error X occured!")
```
2023-06-09 13:40:38 -05:00
Martin Anderseck
7382cde9a4 MPM: Demote sync_tiles() error to warning
This demotes the sync_tiles() error to a warning to be consistent with
what the code does. We only raise a RuntimeError if the tile latencies
are not equal for all tiles, which is a little bit later. This is where
an error log was added now.
sync_tiles() may fail with some rare user configurations but it won't
make the device unusable for all use-cases. Therefore a warning is okay
in that place while bad latencies lead to an error.
2023-06-07 20:29:02 -05:00
Martin Braun
04b1f73631 mpm: x4xx: Move SPLL sync before RFDC config
This changes the clock-configuration order of operations such that all
SPLL-related settings are applied first (including syncing R-dividers to
PPS), and only then are MMCM and RFDC configured.

Previously, syncing R-dividers would happen after everything was
configured.
2023-06-07 07:51:21 -05:00
Martin Braun
c0ca74f206 mpm: x4xx: Improve SPLL comments 2023-06-07 07:51:21 -05:00
Martin Braun
50f7d064ea mpm: x4xx: Enable DBs to have updateable_components
This adds an updateable_components overridable dictionary into the
daughterboards base class.

On X410, because some of the FPGA compatibility stems from DB-specific
components, they are moved into class ZBX.
2023-06-06 16:11:36 -05:00
Martin Anderseck
c9cdbd4948 fixup! MPM: X4xx: Change reset strategy to cover all X4xx 2023-06-06 08:02:55 -05:00
Martin Anderseck
63b587ab9d MPM: X4xx: Change reset strategy to cover all X4xx
This change fixes issues with the reset strategy for devices that don't
use default clocking parameters. That used to cause issues when
restarting the tiles and made those devices have some bigger variations
in power measurements. For X410 this should not change the behavior
compared to uhd master.
2023-06-02 12:35:15 -05:00
Javier Valenzuela
a80f8a8250 mpm: x4xx: Make sysref_delay part of clock policy 2023-05-31 10:17:30 -07:00
Martin Braun
c45efbd57d mpm: x4xx: Add logging for metal and rfdc versions 2023-05-26 16:26:12 -05:00
Grant Meyerhoff
6e44588305 Revert "mpm: x4xx: Separate RFDC clock and tile reset"
This reverts commit 85c741bc71.
2023-05-26 07:39:35 -05:00
Javier Valenzuela
472eb77038 mpm: x4xx: add multiple latency detect iterations
This implements feedback from Xilinx who recommend several measurements
of the tile latency to get a better worst-case estimate.
2023-05-24 08:07:05 -05:00
Martin Braun
85c741bc71 mpm: x4xx: Separate RFDC clock and tile reset
This adds X4xxRfdcCtrl.reset_tiles(), which resets all enabled tiles and
sets their registers and settings back to initial defaults. The same
functionality was previously implemented in reset_rfdc(), but we want to
be able to reset the RFDC clocks without clearing all registers.

During device initialization, however, we retain this reset of all tiles
by modifying the initialization sequence.
2023-05-24 08:06:12 -05:00
Martin Braun
f3ec9fd368 mpm: x4xx: Add additional args parsing in init()
Before this change, we indiscriminately first set the sync source in
init(), then the master clock rate again (it is already set in
set_sync_source(), albeit to a potentially older value).

This adds checks to the args to see if things have actually changed, and
sets all settings in one go.
2023-05-24 08:06:12 -05:00
Martin Braun
009cb8b4c5 mpm: x4xx: Separate RFDC reset from its configuration 2023-05-24 08:06:12 -05:00
Javier Valenzuela
c1d268917e mpm/fpga: x4xx: Major updates in preparation for future devices
FPGA:
- Split up MB registers that control daughterboard specific settings so
  that daughterboards 0 and 1 could have different setings, in
  preparation for future devices that require different settings.
  This requires a compat number bump to 8.0.
- Add registers for additional RFDC information, including the
  block/tile mapping of the individual channels, and information about
  resampling capabilities
- Identify sections of code that would be specific to X410/ZBX and move
  them to their own headers, so it's trivial to add device-specific
  sections of code instead for other devices in the future.
  - This includes constraints for clocks and I/O pins.
- Remove ability to do timed ctrlport transactions to the MB CPLD, this
  was unused and possibly broken.
- Move daughterboard-specific code into its own code location
  (dboards/zbx)
- Move X410-specific register documentation to its own location
  (doc/X410)
- Refactor Makefiles to split out X410/ZBX specific components and allow
  switching between device types
- Add 512-bit AXI interconnects
- Make number of timekeepers configurable (X410 keeps the single
  timekeeper)

MPM:
- Required compat is bumped to 8.0
- Now supports new registers for detecting DSP capabilities and
  multi-rate settings for the daughterboards
- Adds MMCM controls (currently unused)

Co-authored-by: Wade Fife <wade.fife@ni.com>
Co-authored-by: Ryan Marlow <ryan@lmarlow.com>
Co-authored-by: Martin Braun <martin.braun@ettus.com>
Co-authored-by: Humberto Jimenez <humberto.jimenez@ni.com>
2023-05-23 09:06:17 +02:00
Martin Braun
5d98ef2b62 mpm: x4xx: Enable MMCM configuration based on policy 2023-05-22 18:27:23 -05:00
Martin Braun
f5bf1eec9c mpm: x4xx: Enable MPM sync API for X410
This will dynamically set tile latencies, but in a way that multiple
devices stay synchronized.
2023-05-22 18:27:23 -05:00
Martin Braun
63ba6b1c49 mpm: x4xx: Separate RFDC and MMCM resets
Resetting MMCM and RFDC separately will become a requirement once we
start to also program the MMCM. As of now, it is merely a refactoring,
and we continue to use default MMCM settings.
2023-05-22 18:27:23 -05:00
Martin Braun
8120db602a mpm: x4xx: Shut down tiles on tear_down()
- Adds startup_tiles() and shutdown_tiles()
- The latter is called on tear_down() to be compliant with Xilinx'
  documentation on bitstream reconfiguration
2023-05-22 18:27:23 -05:00
Martin Braun
cdc8158112 mpm: utils: Add LogWrapper
This is a debugging utility for MPM, where gdb-based debugging sometimes
leads to issues with timing. To use it, replace class instantiations
such as:
```python
c = SomeClass(arg1, arg2)
```
with
```python
c = LogWrapper(
    parent_log.getChild("SomeClass"), "info", SomeClass(arg1, arg2))
```

The class can be used as before, but the MPM log will include calls with
arguments, return values, and execution times, like this:

```
[MPM.PeriphManager.rfdcctl] [INFO] set_if(1, 0, True, 1058240000.0)
[MPM.PeriphManager.rfdcctl] [INFO] --> True [Execution time: 0.108 ms]
```
2023-05-22 13:30:35 -05:00
Martin Braun
387c2ab581 mpm: x4xx: rfdc: Pull fabric words value from registers
This replaces a hard-coded table of fabric word values (the number of
SPCs from the gearbox FIFO) with a value read back from the RFDC
registers.
2023-05-22 09:09:32 -05:00
Martin Braun
b586a615b5 mpm: x4xx: Refactor x4xx_rfdc_ctrl
Move the converters into more manageable data structures for easier
future access when we need to do more complex settings with the RFDCs.
2023-05-22 09:09:32 -05:00
Martin Anderseck
628b5744d9 MPM: Disable PRC to DB if not required
This change adds a flag to the clock policy that tells the sample PLL to
enable or disable the PLL ref clock (PRC) that goes to the
daughterboards. While for X410 the PRC is required, future USRPs may not
want the clock signal to propagate to the board.
2023-05-22 08:14:23 -05:00
Martin Braun
b1f2858250 mpm: x4xx: rfdc: Add get_converter_rate() API 2023-05-20 11:12:51 -05:00
Martin Braun
d398a02da7 mpm: x4xx: Prepare clock management for multi-mcr
This by itself does not enable dual-rate (or multi-mcr), but it
refactors the code to enable it in the future. Additional changes may be
required.

X4xxClockMgr is renamed to X4xxClockManager.
2023-05-20 11:12:51 -05:00
Martin Braun
cf1b65143d mpm: x4xx: Let RFDC control use clock policy
Before this change, x4xx_rfdc_ctrl.py had various backdoors to read out
required settings. Now that we have the clock policy object, we can
simply read them out from there.

This obviates some code paths (get_rfdc_resampling_factor(),
get_default_mcr(), set_rfdc_reset_cb()).
2023-05-17 13:16:27 -05:00
Martin Braun
3246aec020 mpm: x4xx: Check for tear_down()'s existence
On tear_down() (this is most commonly seen by users when updating the
FPGA image), we add a check to verify that subcomponents of the X4xx are
actually initialized, to avoid displaying a non-fatal error message that
looks like this:

[ERROR] [MPM.RPCServer] Error in update_component while resetting:
    'NoneType' object has no attribute 'tear_down'

The most common/easy way to trigger this error is by loading MPM with
a bitfile that has an invalid compat number (which would stop MPM from
initializing the RFDC controls) and then running `uhd_image_loader`
(which would force a tear_down()). In that circumstance, MPM would try
to call tear_down() on an uninitialized object.
2023-05-17 13:14:35 -05:00
Martin Braun
040d4bb0df mpm: x4xx: Factor clock control out of X4xxClockManager
This splits up x4xx_clk_mgr.py into PLL controls (which go into
x4xx_clock_ctrl.py) and just clock management (which stays in
x4xx_clk_mgr.py).
2023-05-16 18:18:56 -05:00
Martin Braun
8fdbcac6f0 mpm: x4xx: Trust the clock policy's default MCR
This removes a duplicate get_default_mcr() implementation.
2023-05-16 10:47:11 -05:00
Martin Braun
f22b392a00 mpm: x4xx: Rename 'both' argument to 'all'
All call sites that use 'both' as an argument for channel numbers now
use 'all', in preparation for daughterboards that have more than
2 channels.
2023-05-16 10:47:11 -05:00
Martin Braun
62eb62c781 mpm: rfdc: Remove set_sample_rate() API call
This API call is superseded by configure_pll(), and now we match the
RFDC API more closely.
2023-05-16 09:12:29 -05:00
Martin Braun
0b65839d03 x4xx: Update BIST to match clocking refactoring 2023-05-12 15:43:29 -05:00
Martin Braun
cf04329058 mpm: x4xx: Introduce X4xxClockPolicy
This new class encapsulates all clocking-related infos into a single
file and makes it easier to modify clocking settings.
2023-05-12 15:43:29 -05:00
Martin Braun
ac2799fac6 mpm: Fix ZBX CPLD updater
In 01ccb69, changes to the MB CPLD code were made which caused the
following issue when updating the CPLD:

root@ni-x4xx-xxxxxxx:~# zbx_update_cpld --dboards 0
Traceback (most recent call last):
File "/usr/bin/zbx_update_cpld", line 22, in <module>
from usrp_mpm.periph_manager.x4xx_mb_cpld import MboardCPLD
ImportError: cannot import name 'MboardCPLD' from
'usrp_mpm.periph_manager.x4xx_mb_cpld'
(/usr/lib/python3.7/site-packages/usrp_mpm/periph_manager/x4xx_mb_cpld.py)

This fixes this bug.
2023-05-09 17:20:06 -05:00
Martin Braun
f106875a47 mpm: x4xx: Move enable_iq_swap to x4xx_rfdc_ctrl.py
This fixes two issues:
- RfdcRegsControl.enable_iq_swap() now is consistent with other APIs in
  that it takes a channel number, not a block ID
- X4xxDboardIface.enable_iq_swap() doesn't use a backdoor API call to
  fish the enable_iq_swap() API out of the _rfdc_regs object that it
  doesn't own
2023-05-05 11:43:50 -05:00
Martin Braun
b25ed2b6c6 mpm: x4xx: Extend x4xx_rfdc_regs
- Add stubs for APIs we'll need in the future
- Add hard-coded versions of get_converter_mapping() and get_rfdc_info()
2023-05-05 11:43:50 -05:00