-
Notifications
You must be signed in to change notification settings - Fork 5.2k
CM4 is missing IEEE1588-2008 support through BCM54210PE #4151
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Just compiling a kernel with PTP timestamping support enabled (by default not). Will see if this changes anything. I'm new to kernel topics, so I missed the obvious. Will report back |
Built a new kernel according to docs and changed the following settings (through make menuconfig):
No change observed, ie
I figure because there is no particular PTP hardware clock (driver) there's no recognized PTP clock (...) - but this would depend on wether BCM54210PE actually would have a hardware clock (?) bcmgenet does not seem to use so enabling timestamping has no effect... For reference: https://github.com/raspberrypi/linux/blob/c9226080e513181ffb3909a905e9c23b8a6e8f62/include/linux/mii_timestamper.h |
We're currently discussing getting support for writing a driver from Broadcom, although we have access to the datasheet, to me it's pretty meaningless! Unfortunately, so is the Linux interface to the clock... But we'll endeavour to get there |
Ok, thanks! Hoping to be hearing more from you! Just to say, as for the docs, I wouldn't mind signing an NDA to have a look to see if can make sense of it.. |
Damn you Broadcom and your closed datasheets! Timestamping at the PHY level is the best one can get, but not if unimplemented in software... I also do hope those SYNC_IN and SYNC_OUT pins are actual event inputs/outputs for external sync and were preserved on the I/O board and not repurposed for something else. I've seen countless SBCs where this potential was wasted. So, @ghollingworth, aside from a PTP driver eventually being developed - do we know if the two pins mentioned (pins 16 and 18 on the CM4) are presented on the I/O board? Thanks! |
From what I see in the CM4IO datasheet (page 7) SYNC_IN, SYNC_OUT are available on J2 pins 8+9 |
Damn those open datasheets! |
@pelwell haha, senior moment :) |
I saw @wowczarek message on TimeNuts. I used to work for Broadcom's Ethernet PHY group and worked on the 5421x series including the IEEE1588 part of the chip. I remain on good relations with my former colleagues. There are several packages and two dies which map to the BCM54210 part number. I think the part on the Raspberry Pi (BCM54213PE? is that correct) does not pin out the SYNC_IN and SYNC_OUT pins even though they are on the die (36 pin package). I will check with them. Even if the HW SYNC pins are not brought out, some functionality of the IEEE-1588 portion of the PHY may be able to be enabled. @ghollingworth, does the datasheet you have access to mention IEEE-1588? |
On the CM4 we use the BCM54210PE and the SYNC_IN and SYNC_OUT are exposed to pins on the CM4 connector. The CM4IO board exposes these signals on connector J2. @jaycordaro if the PHY team are looking at a driver for this it would be great. |
ok I spoke to some friends who are still at Broadcom. The PHY does support HW timestamping, the register writes required to enable HW timestamping and the SYNC pins are described in an applications note, "IEEE-1588 for Timing Applications," not in the datasheet, so that may explain why the datasheet didn't provide anything useful. Someone who has Broadcom DocSafe access for BCM54210PE could request that document to be added to their account. The Product Line Manager would then approve the request. The PHY team people that I talked to (senior ASIC mgr for the PHY and someone in Marketing) are not aware of any effort inside the company to support a driver but they will try to help. |
Thanks to everyone on this... Especially to Philphil on the forums and @jaycordaro for their help! I do have access to the register information and Broadcom Docsafe and am currently trying to play catchup with the PTP kernel interface and ioctl interface to understand what it is I need to implement to get a working timestamping system. What's clear is that there are a number of interfaces implementing different functionality, just need to decide on the order of implementation. What is it that people actually want out of this?
Gordon |
@ghollingworth actually 4. is implied exactly in 3., at least from the kernel interface point of view, for network sync (IEEE 1588) to work. What is needed is all of the items you list, but as to the order: a. 4. is required because this is the interface to controlling the clock.
So unselfishly I'd say 3,4, then 1,2, but really it's the whole that people / we are / should be after. (*) While we are at it, a set of u.fl (or ideally SMA) connectors could be considered for these two pins in the next revision of the carrier board instead, and freeing up the pins for something else. That would mean plug and play for serious timing, but it's not a big issue otherwise, we have the header. This is debatable though - a GNSS receiver on a board will also have a pin, but a more serious GNSS driven oscillator will have a coax connector. Thanks! |
Thanks that helps a lot. If you've got a suggestion for an Ethernet device that does actually implement these functions from the standard set of drivers: I would suggest one of these (i.e. drivers that reference the ptp_clock_register function) https://elixir.bootlin.com/linux/latest/C/ident/ptp_clock_register That would help me with an initial implementation... Also how would you test it? I can run ptp4l which I'm assuming would test the hardware timestamping, but may not test the hardware clock interface... |
many thanks also! Well, simply put I would think that all features might serve one use case or other and thus - optimally - all should be available to make the CM4 an attractive platform for any of those use cases. The PTP hardware clock would seem the most reliable/precise possible and thus if it would be available that would be a definite yes. Sync'ing external components to the PTP clock is - as I would think - also a core feature 1588 capable platforms should offer; an example being where audio ADCs and DACs should be driven by the sampling frequency derived from the network clock (thinking of AES67 here). As I understand from your wording, the periodic signal is adjustable within a particular range/frequency? Analogously sync'ing the PTP clock to an external component would be quite interesting a feature to have, but as I understand the way SYNC_IN works is just timestamp generation. Knowing the precise timestamp of an event on an external component would seem as important; ex knowing the precise time of sample acquisition, in particular if external components are not sync'ed to the PTP clock. So I would consider 1, 2 and 4 to be quite important features to have for a module aiming at deeply embedded applications and would make the CM4 an interesting base indeed. As for 3 (selective TX/RX hardware timestamping) nothing immediately comes to mind (not working with such tech) but I'm sure there are meaningful use cases. wowczarek: I'm not sure 3 is required for actual network/ptp syncing, depends a bit how the 1588 functionalities are implemented (on-chip?) but yes, I agree, 1+2 are indeed rare opportunities for hardware this common and it's indeed the whole package that should be aimed for |
@tschiemer indeed, so this is why I made a distinction of sorts in the items from Gordon's list. However, IEEE 1588 == network time sync, don't forget. Without hardware packet timestamping (3,4) you cannot have a working PTP stack. |
Spontaneous ideas... use a (HW or peripheral) clock for comparison? Observe SYNC_OUT on some external component use SYNC_IN to generate a timestamp and compare values?.... if it's an on-PHY clock, you just have to see how it runs, I guess? Ja, I'm aware, just don't know what magic the PHY is capable of by itself.. thinking bout it, it likely won't have a PTP stack of it's own.. :/ |
I think the closest are Intel i2xx/i3xx etc. where there are the two SDIO pins that can be ordered to be event inputs / outputs. The Linux PTP/PHC API has a way to grab the input event timestamps I would prefer a /dev/ppsX device, but that's just me.
Yes, ptp4l for the h/w timestamping and PTP Hardware Clock. I mean really what the "PTP hardware clock" is, "merely" two things, plus some initialisation logic:
The timestamps captured are obviously latched counter values with a FIFO. So the timestamping driver part will pick these up, associate with frames/packets and attach these as out of band mesages (SCM) to the socket kernel buffer. So the PHC driver provides an interface to this, allowing us to read time, set time, and steer the clock. If you use ptp4l as a PTP slave ('slave' term is under debate these days), you will utilise h/w timestamps to compute offset and control the hardware clock, this is why timestamps and PHC are one item. |
It won't. The PHY only timestamps packets, that is it, you need a software stack like ptp4l. |
Testing 3. and 4, at least preliminary, can be done with two boards back to back, but ideally you need a time interval counter / frequency counter. Time nuts around the world will handle the rest. Two boards, Ethernet back to back, crossed over event pins, one is a PTP master, the other a PTP slave (ptp4l), PTP syncs them, and the inputs will show the clock difference between the two. That's the minimal DUT/SUT setup. |
Unfortunately, I was able to find out in December. I put an i210 in the PCIe slot and built a kernel. The PHY clock is synchronized and so is the board. Unfortunately the clock of the CM4 is not good enough and the whole thing runs away after hours and the clock can no longer be synchronized with the PHY . |
@marcohabeck this is off-topic - but if you mean it runs away after being synchronised once and then leaving it, then welcome to the real world. In a PC or server it would be no different. This hardware can timestamp, but it can't keep time, that's just the way it is. Poor oscillators. Timing cards with oscillators good enough to hold better than hundreds of microseconds per day and few and far between. Oregano/Meinberg and high-end Exablaze are the only ones I know can do decent holdover. Solarflare right behind them. These systems have to be kept actively synchronised all the time, they drift very quickly. But technically PTP NICs can be steered much more aggressively than the OS clock (I assume this is what you mean by 'clock' vs. PHY), so the CM4 or drivers or software would have had to be severely broken if the OS clock couldn't keep up with the NIC. OS clock control is limited to +/- 512ppm (~half a millisecond per second) adjustment, which is huge. People would have noticed drift of this magnitude. You'd have to check your software stack. Was the PHY (MAC really) synchronised to PTP, or were you just synchronizing the OS clock to the NIC without PTP? |
I'm quite happy to help out with hardware-side testing on this stuff; the PHY hardware timestamping support is most of the reason I picked up a CM4+CM4IO board, and it would be absolutely killer for something like a next-gen LimeNET Micro (and for time sync applications in general) I've got a number of PTP-equipped devices and 1PPS sources - some commercial, some homemade - available for testing, though I doubt you'd have much trouble finding plenty of people who're interested! |
Hi @ghollingworth, I've been working on the ptp 1588 driver for the bcm54210pe, at the moment I've got the full skeleton implemented and the kernel can check configuration available for the PTP and PHC:
Also I can get and set the PHC using phc_ctl tool:
The current blocking point is that, despite reading and setting the PHC using phc_ctl set/get tool, this counter is not increasing its value, so it's not counting. Has any of the contributors in here got a contact in Broadcom in order to know whats happening with the register configuration? I've checked several times and I think it's correct. I cannot get any more ideas from the datasheet. In parallel, I'm currently developing the time stamping routines in order to get the info from the Broadcom internal FIFO. I think I will have the first draft maybe during next week. I'll be glad to contribute to this issue. Maybe we can create an branch in order to start collaborating here. |
Can you share your code, so I can see your implementation? |
I have access to support from Broadcom and have been using it to get the PHY setup correctly, currently I've got it set up timestamping packets and working correctly, but am also having trouble reading back the current timer counter. Whick register set are you using? The original time stamp or the heartbeat time stamp registers? Gordon |
I'm currently using the Original Time register, I can read and write in it, but it's not counting. Mi register setup is the following one (extracted from Broadcom .vbs scripts and the other is added from my side in order to configure the SYNC_OUT)
|
Please @ghollingworth tell me how can I send you my code as soon as I've got green light to share it. |
email me [email protected] |
What is the current state of this issue? Does raspberrypi kernel for CM4 finally support PTP hardware timestamping? Is |
I can only speak from experience. I am evaluating the CM4 for PTP and sync4e for a work project. For a while it was broken, but an update some time this year seems to have fixed it and the results are now acceptable, pending longer term tests. There are some limitations due to the hardware. It's not clear if the official IO board is badly designed or the CM4 is, but you can't use one of the IO pins which means you can't have both a PPS in and PPS out at the same time. At least it has PPS in though, some SoCs rely on GPIOs and interrupts. There is also no facility for using an external PTP clock, which seems to be a limitation of the SoC. The steering of the internal clock is okay in my limited testing, but is affected by system load (i.e. heat, particularly when ramping up or down). Once I have some better data I'll see about sharing it. Overall it looks good but does need further validation. I think it was a firmware update that broke and then fixed it, so careful version control is probably required. The CM5 is also on the horizon. Think about your requirements, for sub microsecond I think it is fine, and maybe sub 0.1µS over temperature. Thanks to everyone who worked on this and made it happen. |
@kuro68k what is your # ethtool -T eth0
Time stamping parameters for eth0:
Capabilities:
hardware-transmit
hardware-receive
hardware-raw-clock
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
off
on
onestep-sync
onestep-p2p
Hardware Receive Filter Modes:
none
ptpv2-event and it seems not to be enough to run ptp with hardware timestamping. |
Sorry for the delay in replying, I'm a bit busy. I'll get the output of my PI when I have a chance. |
@anthonio9 That is the expected output. What is it that makes you say that it is not enough to run ptp with hardware timestamping? |
Should that also work with the kernel being used for Ubuntu 22.04.4 LTS? If not, is there any chance of getting it running without recompiling the kernel? |
Ubuntu 22.04.4 uses kernel 6.5, which includes the necessary support, so it should work, although I haven't tried it. |
@jclark on some other platforms with the hardware timestamping support the output to ![]() Why does RPI not list these flags like in the picture? An app I'm working with requires |
The line From a quick glance at the ethtool source code, it looks like the |
I also saw that, but the ubuntu 22.04 for the raspberry still uses the kernel 5.15 (and is somehow not upgradeable), which does not include the necessary support. |
It's becoming a little bit moot now because linuxptp has dropped support for the CM4. The maintainer won't accept patches that fix the bug in the BCM54210 that prevents it accepting packets with a version number of 2.1, so only the old V3.5 release works. Hopefully the CM5 fixes it. |
The maintainer changed his mind and it's fixed in linuxptp 4.2 nwtime/linuxptp@02a13b0 |
I think the RPi5 (and thus presumably the CM5) has a BCM54213PE, FWIW. (Out of interest does anyone have a reference indicating the issue is in the transceiver and not the MAC in the SoC?) |
I don't think that can be assumed, the PHY between the RPi4 and CM4 are different. The RPi5 also moves from the Broadcom eth to a Cadence ethernet mac [1 ch7] (linux driver: MACB) although it does appear to be a broadcom PHY [2]. [1] https://datasheets.raspberrypi.com/rp1/rp1-peripherals.pdf |
It's probably too late now, but is there a good way to contact the RPF about requirements for the CM5? |
Ah, re: Cadence MAC, see RP1 [1]. [1] https://datasheets.raspberrypi.com/rp1/rp1-peripherals.pdf |
Much too late. Please see the forward guidance here https://pip.raspberrypi.com/categories/945-forward-guidance/documents/RP-005110-WP/CM5-Forward-Guidance.pdf |
Thanks. They have removed the SYNC_IN pin, which suggests that PTP is low priority. Seems like it will remain unsuitable for most PTP master mode applications, unless your requirements are note very demanding. |
Yes, well, what one can glance from this document is that the SYNC IN pin (which after 1588 was implemented for the PHY used in the CM4 had no purpose) has been repurposed, but also implicitly that the SYNC OUT pin (which in reality can be used for both SYNC IN and SYNC OUT) for the CM5 has been retained. Conversely the RPI5 has no SYNC pins because its PHY doesn't support hardware timestamping. In the RPI5 timestamping is done (less accurately) in the MAC inside the RP1. It is left to the reader to draw the conclusions that follows therefrom :-) /Lasse
|
Indeed, but aside from wanting both IN and OUT pins to make testing easier and avoid having to multiplex signals when switching roles, the lack of an external clock option does limit the stability of the PTP clock. It's a shame because the CM5 could be a very powerful device for PTP and SyncE if the full capabilities of the peripheral were available, even via a test point. |
@dp111 Any thoughts? |
Kinda curious is there a way to output the PPS signal to a GPIO (or other measurable ways) on the Raspberry Pi 5? Came across this question but there seems no answer yet... https://forums.raspberrypi.com/viewtopic.php?t=360556 |
Hi,No PHC driven sync pins on the Pi5. We explored in the past with Broadcom if the 54213 PHY on the Pi4 had any undocumented features, but it wasn’t the case. For sync, the CM4 is your friend and odds are the CM5 will be too as the sync pin is retained in the forward guidance. Alternatively, in the interim if you want to play, you could always attach an Intel 225/226 retail card to the PCIe bus. It has three SDPs exposed. On the opentimecard.org we combine the CM4 and the i226… it’s a winner for sync. I can’t wait to see how the CM5 performs. We are big fans.-- Best regards,Lasse L. JohnsenE ***@***.*** 7 Jul 2024, at 14:06, regymm ***@***.***> wrote:
Kinda curious is there a way to output the PPS signal to a GPIO (or other measurable ways) on the Raspberry Pi 5? Came across this question but there seems no answer yet... https://forums.raspberrypi.com/viewtopic.php?t=360556
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: ***@***.***>
|
If you don't have €7,000 spare for an OpenTimeCard, a cheaper alternative is to get some Microchip eval boards. I'm playing with them at the moment. I'll write it up when I have it fully working. Another option for the Pi5 is interrupts. I don't know if you can interrupt from the PPS, but if you can then you could use the interrupt to toggle a GPIO. The interrupt introduces some random latency, but it's already pretty bad due to the very poor clock being used for PTP (same on the CM4). |
Thanks for the information, I probably need to go for a CM4. |
There is a discussion in #5904 about a non-compliance of the current implementation of the CM4, Pi5 and CM5 with regards to IEEE 1588-2008 compliance in the presence of IEEE 1588-2019 traffic. As far as I understand it:
I am hoping this is an oversight in the driver implementation and not a more fundamental issue with the PHY. |
@mfurseman My understanding is that for the CM4/CM5 it is a hardware problem. As mentioned in that thread, ptp4l as of version 4.2 has the ptp_minor_version option that can work around this for ptp4l. Before I was aware of that, I developed https://github.com/jclark/bpf-ptpver20/ which uses a BPF TC egress filter to set the PTP minor version to 0; this can workaround the problem for any application. The Pi5 has a different PHY, which doesn't support hardware timestamping (the Pi5 does hardware timestamping in the MAC), so that's a separate problem. |
None of the B models have had PHYs with HW capable of timestamping. They are built to a price and it adds cost. The Pi5 had moved from onboard Broadcom MACs to one on the RP1 from Cadence, at least the upstream linux driver has PTP support, so hopefully it's all wired up properly in the RP1 chip. The CM5 has the same BCM54210PE that the CM4 had, and they explicitly mention "supporting IEEE 1588" so should have similar capabilities of the CM4. |
Do you happen to know, since the schematics are not available, if that means you can inject an external clock for the Cadence part? One of the major limitations of the Pi as a PTP master is that only the rather poor internal clock is available, which is steered towards sync with a PPS but is far from ideal. Being able to inject a more stable 25MHz clock would be very useful. For the moment our design uses a Microchip PCIe ethernet IC that includes the PHY and accepts an external 25MHz clock, for that reason. |
TBH I don't know, I'm guessing even if the MAC IP could accept an external clock it would depend on how RPi wired it up on in the RP1 as to whether it could accept that clock source, we would need someone from RPi to confirm those details. |
Is this the right place for my bug report?
Yes: I asked on the forum, I asked the raspberry foundation through the contact form but didn't get any response - it is very much kernel related as is explained in the forum post.
Describe the bug
The CM4 has an undocumented inofficial PHY (BCM54210PE) that supports hardware timestamping (and a hardware clock, actually??), but there seems to be no driver supporting these features.
So CM4 does actually not provide hardware based IEEE1588-2008 support as opposed to what the raspberry pi foundation actually communicates in the CM4 datasheet.
To reproduce
sudo ethtool -T eth0
only shows software timestamping capabilities.Expected behaviour
Depends - the raspberry pi foundation never communicated what IEEE1588-2008 features are supported such that is is unclear what exactly can be expected; also the PHY documentation is not available such that possibilities (ie optimal expected behaviour) can not be described.
Expected (according to https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s1-using_ptp):
The CM4 datasheet lists SYNC_IN, SYNC_OUT pins ment for IEEE1588-2008 support but has not further specified this.
It actually is a question wether these pins are needed in the first place - because the PHY would seem to have a hardware-clock itself.
Further it must be clear wether the PHY's internal clock (if any) is routed to a CM4 pin in any form and if not this should be fixed in future revisions because custom boards for the CM4 might require tight synchronization to a hardware clock.
Actual behaviour
sudo ethtool -T eth0
only shows software timestamping capabilities.There is no (documented) synchronizable IEEE1588-2008 clock signal going from the CM4.
System
Raspberry Pi Compute Module 4
Raspberry Pi OS Lite, January 11th 2021, Kernel version: 5.4
Ubuntu Server 20.04.2 LTS,
Logs
none
Additional context
BCM54210PE documentation is required to implement to see actual features provided and configuration options - IEEE802.3-2018 seems to define said capabilities etc.
Possibly also required are CM4 schematics and BCM2711 documentation.
Also see IEEE802.3-2018 Section 90. Ethernet support for time synchronization protocols
I can try to take care of the implementation, but I would like to have the mentioned documents.
The text was updated successfully, but these errors were encountered: