Add support for Cambium Networks XE3-4 ipq6010

RPM fails, thus cpufreq will fail as well

I guess this is the error

[    0.077983] qcom_glink_rpm remoteproc:glink-edge: RPM TOC has invalid magic
[    0.077991] qcom_glink_rpm: probe of remoteproc:glink-edge failed with error -22

So it fails here?

rpm_msg_ram: memory@60000 {
	reg = <0x0 0x00060000 0x0 0x6000>;
rpm: remoteproc {
	compatible = "qcom,ipq6018-rpm-proc", "qcom,rpm-proc";

	glink-edge {
		compatible = "qcom,glink-rpm";
		interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>;
		qcom,rpm-msg-ram = <&rpm_msg_ram>;
		mboxes = <&apcs_glb 0>;

		rpm_requests: rpm-requests {
			compatible = "qcom,rpm-ipq6018";
			qcom,glink-channels = "rpm_requests";

			regulators {
				compatible = "qcom,rpm-mp5496-regulators";

				ipq6018_s2: s2 {
					regulator-min-microvolt = <725000>;
					regulator-max-microvolt = <1062500>;

I see the same error on stock

[    0.293750] qcom_glink_rpm soc:qcom,rpmsg-rpm@60000: RPM TOC has invalid magic
[    0.293770] qcom_glink_rpm: probe of soc:qcom,rpmsg-rpm@60000 failed with error -22
qcom,rpmsg-rpm@60000 {
	compatible = "qcom,glink-rpm";
	interrupts = <0x00 0xa8 0x01>;
	label = "rpm";
	mboxes = <0x1a 0x08>;
	qcom,rpm-msg-ram = <0x19>;
	qcom,subsys-id = <0x06>;
	status = "ok";

	glink_edge {
		qcom,glink-channels = "rpm_requests";
		qcom,rpm-channel-type = <0x0f>;

@kirdes Are you using a WAX214 with IPQ6010? And if so, do you have cpu frequency scaling working and don't get the error below?

[    0.077983] qcom_glink_rpm remoteproc:glink-edge: RPM TOC has invalid magic
[    0.077991] qcom_glink_rpm: probe of remoteproc:glink-edge failed with error -22

If it's working you will have this folder

# /sys/devices/system/cpu/cpufreq/policy0/

Thank you. And I apologize if I called the wrong person :slight_smile:

yeah, I'm using the wax214 and cpu scaling is working fine.

The only rpm related message I see in dmesg is:

qcom_rpm_smd_regulator remoteproc:glink-edge:rpm-requests:regulators: Supply for l2 (l2) resolved to itself

The magic is hardcoded in qcom_glink_rpm.c, but I've no idea why it' not matching in your case.

Hmm... that's quite interesting to be honest. I've trying to figure out where the magic is coming from on my device. But so far I got nothing.

#define RPM_TOC_MAGIC		0x67727430 /* grt0 */

I did look at your DTS but I can't see anything that I'm missing.

But thanks for the quick reply. :+1:
Really helps to know that it's supposed to work, so the error is on this device only.

Edit: @kirdes Could you check the size of your RPM partition?
I don't know if this is related, but my RPM partition is 262KB compared to wax630 that is 524KB. Is the system reading from this partition for managing power, frequency etc?

And is this partition specific to model/device or could any IPQ6010 device use the same? Why I'm asking this is if this is more like a "driver", maybe I can fix this with a copy of another IPQ6010 device.

@robimarko sorry to bother you again, but are you able to explain how RPM partitions work and if there's any relation to what I'm mentioning above?

This error has nothing to do with partitioning at all, RPM is a FW that is loaded in early boot at it manages power.

I think it means that RPM channel for regulators is not working, my guess is that a fixed regulator is being used instead of the programmable MP5496 PMIC.

Do you know the FCC ID or have high resolution PCB pictures?

Okey, sorry for the noise about that. :+1:

Internal photos:

Looks like it's missing the MP5496 (should be near by the soc actually
as a reference page 6 in the left corner inside the metall shielding:

Then you need to define a fixed regulator and use that for the cpu supply to enable cpu scaling.

Hmm, okay. Never done that before. But trying to do some research, is this a fixed regulator?

Yeah, put one of those under the soc, with a voltage of say 1.1V, disable the RPM regulator node and provide that regulator as the cpu-supply.

It may also be required to remove the OPP point voltages

Ok thanks, I'll give it at try. Naming is probably off, but I created #include "ipq6018-fixed-cpu.dtsi" that I included in the ipq6010-xe34.dts.

Then I created the dummy_reg inside soc, and cpu-supply = <&dummy_reg>; inside ipq6018-fixed-cpu.dtsi. 1.1V <1100000>.

Let's hope I'm not too far from what I'm supposed to do.

I was unsure about inside soc or not, but updated with your changes.

Is the new changes fine @robimarko or is anything else missing?

You are going to need to test it, it possible that OPP point voltages will need to be removed

1 Like

I believe you are right.

[    0.081255] qcom_glink_rpm remoteproc:glink-edge: RPM TOC has invalid magic
[    0.081263] qcom_glink_rpm: probe of remoteproc:glink-edge failed with error -22
[    1.727327] core: _opp_supported_by_regulators: OPP minuV: 1 maxuV: 1, not supported by regulator
[    1.731982] cpu cpu0: _opp_add: OPP not supported by regulators (864000000)
[    1.741136] core: _opp_supported_by_regulators: OPP minuV: 2 maxuV: 2, not supported by regulator
[    1.747797] cpu cpu0: _opp_add: OPP not supported by regulators (1056000000)
[    1.756908] core: _opp_supported_by_regulators: OPP minuV: 3 maxuV: 3, not supported by regulator
[    1.763936] cpu cpu0: _opp_add: OPP not supported by regulators (1320000000)
[    1.772777] core: _opp_supported_by_regulators: OPP minuV: 4 maxuV: 4, not supported by regulator
[    1.779810] cpu cpu0: _opp_add: OPP not supported by regulators (1440000000)
[    1.788696] core: _opp_supported_by_regulators: OPP minuV: 5 maxuV: 5, not supported by regulator
[    1.795707] cpu cpu0: _opp_add: OPP not supported by regulators (1608000000)
[    1.804562] core: _opp_supported_by_regulators: OPP minuV: 6 maxuV: 6, not supported by regulator
[    1.811582] cpu cpu0: _opp_add: OPP not supported by regulators (1800000000)
[    1.820361] cpu cpu0: OPP table can't be empty

Is this the code the error is referring to?
And I have to remove/disable apc_vreg: regulator or something inside it?

qcom,corner-frequencies =
	<864000000 1056000000 1320000000
	1440000000 1608000000 1800000000>;

Ok, I remembered I have a board that also doesn't use MP5496:

Try doing what this board does, it's even simpler as there is no need for cpu-supply at all (I looked at the code) and CPUFreq worked with it.

1 Like

Thanks. That worked like a charm. But do you think it would be a good idea to split that particular code to a separate file for use on other devices too.

I'm thinking of the code below, and maybe name it ipq6018-fixed-smps.dtsi.

 * Board does not use companion MP5496 PMIC,
 * but rather uses fixed external SMPS.
&rpm {
	status = "disabled";

&CPU0 {
	/delete-property/ cpu-supply;

&CPU1 {
	/delete-property/ cpu-supply;

&CPU2 {
	/delete-property/ cpu-supply;

&CPU3 {
	/delete-property/ cpu-supply;

&cpu_opp_table {
	opp-864000000 {
		opp-microvolt = <1100000>;

	opp-1056000000 {
		opp-microvolt = <1100000>;

	opp-1320000000 {
		opp-microvolt = <1100000>;

	opp-1440000000 {
		opp-microvolt = <1100000>;

	opp-1608000000 {
		opp-microvolt = <1100000>;

	opp-1800000000 {
		opp-microvolt = <1100000>;

Yes, that is a good idea, as there will be more boards with the same setup.

1 Like