<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Marcin Juszkiewicz - linux</title><link href="https://marcin.juszkiewicz.com.pl/" rel="alternate"/><link href="https://marcin.juszkiewicz.com.pl/tag/linux/feed/" rel="self"/><id>https://marcin.juszkiewicz.com.pl/</id><updated>2025-11-12T09:19:00+01:00</updated><entry><title>From the diary of AArch64 porter — ID registers</title><link href="https://marcin.juszkiewicz.com.pl/2025/11/12/from-the-diary-of-aarch64-porter-id-registers/" rel="alternate"/><published>2025-11-12T09:19:00+01:00</published><updated>2025-11-12T09:19:00+01:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2025-11-12:/2025/11/12/from-the-diary-of-aarch64-porter-id-registers/</id><summary type="html">Checking &lt;span class="caps"&gt;CPU&lt;/span&gt; features can be time&amp;nbsp;consuming.</summary><content type="html">&lt;p&gt;People are used to looking at &amp;#8220;Features&amp;#8221; field in&amp;nbsp;the &lt;code&gt;/proc/cpuinfo&lt;/code&gt; file under
Linux. But does it show everything about the &lt;span class="caps"&gt;CPU&lt;/span&gt; cores present in the&amp;nbsp;system?&lt;/p&gt;
&lt;!--MORE--&gt;

&lt;h3&gt;What &lt;span class="caps"&gt;ID&lt;/span&gt;&amp;nbsp;registers?&lt;/h3&gt;
&lt;p&gt;AArch64 CPUs have a set of &amp;#8220;identification registers&amp;#8221; which are named
&amp;#8220;ID_AA64*_EL1&amp;#8221;, where &amp;#8220;*&amp;#8221; can&amp;nbsp;be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="caps"&gt;AFR&lt;/span&gt;  &amp;#8212; Auxiliary Feature&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;DFR&lt;/span&gt;  &amp;#8212; Debug Feature&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;FPFR&lt;/span&gt; &amp;#8212; Floating-Point Feature&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;ISAR&lt;/span&gt; &amp;#8212; Instruction Set Attribute&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;MMFR&lt;/span&gt; &amp;#8212; Memory Model Feature&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;PFR&lt;/span&gt;  &amp;#8212; Processor Feature&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;SMFR&lt;/span&gt; &amp;#8212; &lt;span class="caps"&gt;SME&lt;/span&gt; Feature &lt;span class="caps"&gt;ID&lt;/span&gt;&amp;nbsp;Registers&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;ZFR&lt;/span&gt;  &amp;#8212; &lt;span class="caps"&gt;SVE&lt;/span&gt; Feature &lt;span class="caps"&gt;ID&lt;/span&gt;&amp;nbsp;Registers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They can be used to check which features are present in a given &lt;span class="caps"&gt;CPU&lt;/span&gt; core. Their
presence depends on things like age, generation, revision, and the design of the&amp;nbsp;SoC.&lt;/p&gt;
&lt;h3&gt;Introductions of&amp;nbsp;registers&lt;/h3&gt;
&lt;p&gt;As the AArch64 architecture was progressing, more and more identification
registers were needed to describe &lt;span class="caps"&gt;CPU&lt;/span&gt; core&amp;nbsp;features.&lt;/p&gt;
&lt;p&gt;From a quick look through Arm docs, I compiled a simple table of&amp;nbsp;chronology:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="caps"&gt;ID&lt;/span&gt; register&lt;/th&gt;
&lt;th&gt;Architecture version&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;First Arm core&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64DFR0_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2011/2012&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64PFR0_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2011/2012&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64ISAR0_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2011/2012&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64MMFR0_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2011/2012&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64AFR0_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2013/2014&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64AFR1_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2013/2014&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64DFR1_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2013/2014&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64PFR1_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2013/2014&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64ISAR1_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2013/2014&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64MMFR1_EL1&lt;/td&gt;
&lt;td&gt;v8.0-A&lt;/td&gt;
&lt;td&gt;2013/2014&lt;/td&gt;
&lt;td&gt;Cortex-A53, Cortex-A73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64MMFR2_EL1&lt;/td&gt;
&lt;td&gt;v8.2-A&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Cortex-A55, Cortex-A75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64ZFR0_EL1&lt;/td&gt;
&lt;td&gt;v8.2-A (&lt;span class="caps"&gt;SVE&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Fujitsu &lt;span class="caps"&gt;A64FX&lt;/span&gt;, Cortex-A710&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64MMFR3_EL1&lt;/td&gt;
&lt;td&gt;v8.3-A&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Cortex-X4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64ISAR2_EL1&lt;/td&gt;
&lt;td&gt;v8.5-A&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;Cortex-A520&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64ISAR3_EL1&lt;/td&gt;
&lt;td&gt;v8.5-A&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;Cortex-A520&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64MMFR4_EL1&lt;/td&gt;
&lt;td&gt;v8.7-A&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Cortex-A715&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64SMFR0_EL1&lt;/td&gt;
&lt;td&gt;v9.0-A (&lt;span class="caps"&gt;SME&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Neoverse V1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64FPFR0_EL1&lt;/td&gt;
&lt;td&gt;v9.5-A&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID_AA64PFR2_EL1&lt;/td&gt;
&lt;td&gt;v8.9-A/9.5-A&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;C1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I am not 100% sure about years and architecture versions. Not every document has
all versions available on the Arm developer&amp;nbsp;website.&lt;/p&gt;
&lt;p&gt;It also shows that the Cortex-A53 was a very popular core design &amp;#8212; it had
multiple revisions, which added several&amp;nbsp;features.&lt;/p&gt;
&lt;h3&gt;How to read&amp;nbsp;those?&lt;/h3&gt;
&lt;p&gt;In my opinion, the easiest way is to use my &lt;a href="https://github.com/hrw/edk2-armcpuinfo/"&gt;ArmCpuInfo tool&lt;/a&gt;.
It runs on any &lt;span class="caps"&gt;EFI&lt;/span&gt; environment (&lt;span class="caps"&gt;EDK2&lt;/span&gt;, U-Boot, and so on), reads the &lt;span class="caps"&gt;ID&lt;/span&gt; registers
and prints their meaning.
I &lt;a href="/2023/05/03/arm-cpu-info-efi-application/"&gt;wrote about it some time ago&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Empty&amp;nbsp;registers&lt;/h3&gt;
&lt;p&gt;A &lt;span class="caps"&gt;TRM&lt;/span&gt; document may list an &lt;span class="caps"&gt;ID&lt;/span&gt; register, explain all its fields, and it still can
look like something to ignore because it only contains zeros. Like the
ID_AA64MMFR3_EL1 register in
&lt;a href="https://developer.arm.com/documentation/107734/0002/AArch64-registers/AArch64-Identification-registers-summary/ID-AA64MMFR3-EL1--AArch64-Memory-Model-Feature-Register-3"&gt;the Neoverse-V3 &lt;span class="caps"&gt;TRM&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpecFPACC&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;ADERR&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;SDERR&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;RPZ&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;ANERR&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;SNERR&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;D128_2&lt;/li&gt;
&lt;li&gt;D128&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;MEC&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;AIE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;S2POE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;S1POE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;S2PIE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;S1PIE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;SCTLRX&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;TCRX&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All those fields have descriptions and they mean something. At the same time,
they all have a 0b0000 value. I assume that the value of some fields may change
when the SoC vendor pays more and begins designing its own version of a &lt;span class="caps"&gt;CPU&lt;/span&gt; core
based on Arm&amp;#8217;s&amp;nbsp;design.&lt;/p&gt;
&lt;h3&gt;Strange&amp;nbsp;cases&lt;/h3&gt;
&lt;p&gt;Cortex-A75 present in the MediaTek Helio G70 SoC reports &lt;span class="caps"&gt;SSBS&lt;/span&gt; (Speculative Store
Bypass Safe) feature under&amp;nbsp;Linux:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;processor       : 6
BogoMIPS        : 26.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp
                  asimdhp cpuid asimdrdm lrcpc dcpop asimddp asimddp sha512 ssbs
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x3
CPU part        : 0xd0a
CPU revision    : 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But to read it, you need the ID_AA64PRF1_EL1
register, which is not mentioned in
&lt;a href="https://developer.arm.com/documentation/100403/"&gt;the Cortex-A75 technical reference manual (&lt;span class="caps"&gt;TRM&lt;/span&gt;)&lt;/a&gt;.
It is present in the newer versions of 
&lt;a href="https://developer.arm.com/documentation/100442/"&gt;the Cortex-A55 &lt;span class="caps"&gt;TRM&lt;/span&gt;&lt;/a&gt;,
and both &lt;span class="caps"&gt;CPU&lt;/span&gt; core models are present in the Helio G70&amp;nbsp;SoC.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;SSBS&lt;/span&gt; (and &lt;span class="caps"&gt;SSBS2&lt;/span&gt;) were introduced into Arm v8.5 and then added to v8.0 to allow
every &lt;span class="caps"&gt;CPU&lt;/span&gt; core to have it&amp;nbsp;implemented.&lt;/p&gt;
&lt;h3&gt;Let me list it for&amp;nbsp;you&lt;/h3&gt;
&lt;p&gt;As you may know, I have &lt;a href="https://gpages.juszkiewicz.com.pl/arm-socs-table/arm-cpu-cores.html"&gt;a page about &lt;span class="caps"&gt;ARM&lt;/span&gt; &lt;span class="caps"&gt;CPU&lt;/span&gt; cores&lt;/a&gt;
where I list some basic information. Last weekend I added showing of potential
&lt;span class="caps"&gt;CPU&lt;/span&gt; features to it. Small&amp;nbsp;example:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="caps"&gt;CPU&lt;/span&gt;&amp;nbsp;core&amp;nbsp;name&lt;/th&gt;
&lt;th&gt;features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cortex-A53&lt;/td&gt;
&lt;td&gt;&lt;span class="caps"&gt;AA32EL0&lt;/span&gt;, &lt;span class="caps"&gt;AA32EL1&lt;/span&gt;, &lt;span class="caps"&gt;AA32EL2&lt;/span&gt;, &lt;span class="caps"&gt;AA32EL3&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL0&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL1&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL2&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL3&lt;/span&gt;, &lt;span class="caps"&gt;AES&lt;/span&gt;, &lt;span class="caps"&gt;ASID16&lt;/span&gt;, AdvSIMD, &lt;span class="caps"&gt;CRC32&lt;/span&gt;, Debugv8, DoubleLock, &lt;span class="caps"&gt;FP&lt;/span&gt;, MixedEnd, MixedEndEL0, &lt;span class="caps"&gt;PMULL&lt;/span&gt;, PMUv3, &lt;span class="caps"&gt;SHA1&lt;/span&gt;, &lt;span class="caps"&gt;SHA256&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cortex-A520&lt;/td&gt;
&lt;td&gt;&lt;span class="caps"&gt;AA64EL0&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL1&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL2&lt;/span&gt;, &lt;span class="caps"&gt;AA64EL3&lt;/span&gt;, &lt;span class="caps"&gt;AES&lt;/span&gt;, &lt;span class="caps"&gt;AFP&lt;/span&gt;, AMUv1, &lt;span class="caps"&gt;ASID16&lt;/span&gt;, AdvSIMD, &lt;span class="caps"&gt;BBM&lt;/span&gt;, &lt;span class="caps"&gt;BF16&lt;/span&gt;, &lt;span class="caps"&gt;BTI&lt;/span&gt;, &lt;span class="caps"&gt;CCIDX&lt;/span&gt;, &lt;span class="caps"&gt;CONSTPACFIELD&lt;/span&gt;, &lt;span class="caps"&gt;CRC32&lt;/span&gt;, CSV2_2, &lt;span class="caps"&gt;CSV3&lt;/span&gt;, &lt;span class="caps"&gt;DGH&lt;/span&gt;, &lt;span class="caps"&gt;DIT&lt;/span&gt;, &lt;span class="caps"&gt;DPB2&lt;/span&gt;, Debugv8p4, DotProd, &lt;span class="caps"&gt;E0PD&lt;/span&gt;, &lt;span class="caps"&gt;ECBHB&lt;/span&gt;, ECV_POFF, &lt;span class="caps"&gt;EVT&lt;/span&gt;, &lt;span class="caps"&gt;FCMA&lt;/span&gt;, &lt;span class="caps"&gt;FGT&lt;/span&gt;, &lt;span class="caps"&gt;FHM&lt;/span&gt;, &lt;span class="caps"&gt;FP&lt;/span&gt;, &lt;span class="caps"&gt;FP16&lt;/span&gt;, &lt;span class="caps"&gt;FRINTTS&lt;/span&gt;, FlagM2, &lt;span class="caps"&gt;HAFDBS&lt;/span&gt;, &lt;span class="caps"&gt;HCX&lt;/span&gt;, &lt;span class="caps"&gt;HPDS2&lt;/span&gt;, &lt;span class="caps"&gt;HPMN0&lt;/span&gt;, &lt;span class="caps"&gt;I8MM&lt;/span&gt;, &lt;span class="caps"&gt;IDST&lt;/span&gt;, &lt;span class="caps"&gt;IESB&lt;/span&gt;, &lt;span class="caps"&gt;JSCVT&lt;/span&gt;, &lt;span class="caps"&gt;LOR&lt;/span&gt;, &lt;span class="caps"&gt;LRCPC&lt;/span&gt;, &lt;span class="caps"&gt;LRCPC2&lt;/span&gt;, &lt;span class="caps"&gt;LSE&lt;/span&gt;, &lt;span class="caps"&gt;LSE2&lt;/span&gt;, &lt;span class="caps"&gt;MTE3&lt;/span&gt;, MixedEnd, MixedEndEL0, &lt;span class="caps"&gt;PACQARMA3&lt;/span&gt;, &lt;span class="caps"&gt;PAN3&lt;/span&gt;, PAuth2, &lt;span class="caps"&gt;PMULL&lt;/span&gt;, PMUv3p7, RASv1p1, &lt;span class="caps"&gt;RDM&lt;/span&gt;, &lt;span class="caps"&gt;S2FWB&lt;/span&gt;, &lt;span class="caps"&gt;SB&lt;/span&gt;, &lt;span class="caps"&gt;SHA1&lt;/span&gt;, &lt;span class="caps"&gt;SHA256&lt;/span&gt;, &lt;span class="caps"&gt;SHA3&lt;/span&gt;, &lt;span class="caps"&gt;SHA512&lt;/span&gt;, &lt;span class="caps"&gt;SM3&lt;/span&gt;, &lt;span class="caps"&gt;SM4&lt;/span&gt;, &lt;span class="caps"&gt;SPECRES&lt;/span&gt;, &lt;span class="caps"&gt;SSBS2&lt;/span&gt;, &lt;span class="caps"&gt;SVE&lt;/span&gt;, &lt;span class="caps"&gt;SVE2&lt;/span&gt;, SVE_AES, SVE_BitPerm, SVE_PMULL128, SVE_SHA3, SVE_SM4, &lt;span class="caps"&gt;TLBIOS&lt;/span&gt;, &lt;span class="caps"&gt;TLBIRANGE&lt;/span&gt;, &lt;span class="caps"&gt;TRBE&lt;/span&gt;, &lt;span class="caps"&gt;TRF&lt;/span&gt;, &lt;span class="caps"&gt;TTCNP&lt;/span&gt;, &lt;span class="caps"&gt;TTL&lt;/span&gt;, &lt;span class="caps"&gt;TTST&lt;/span&gt;, &lt;span class="caps"&gt;UAO&lt;/span&gt;, &lt;span class="caps"&gt;VHE&lt;/span&gt;, &lt;span class="caps"&gt;VMID16&lt;/span&gt;, &lt;span class="caps"&gt;XNX&lt;/span&gt;, &lt;span class="caps"&gt;XS&lt;/span&gt;, nTLBPA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;There may be some mistakes in the table &amp;#8212; I strongly advise checking Technical
Reference Manuals (TRMs) to be sure. Please report any error &amp;#8212; I will take a
look at fixing&amp;nbsp;them.&lt;/p&gt;</content><category term="aarch64"/><category term="python"/><category term="development"/><category term="edk2"/><category term="linux"/></entry><entry><title>I built my first mechanical keyboard</title><link href="https://marcin.juszkiewicz.com.pl/2025/03/09/i-built-my-first-mechanical-keyboard/" rel="alternate"/><published>2025-03-09T14:37:00+01:00</published><updated>2025-03-09T14:37:00+01:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2025-03-09:/2025/03/09/i-built-my-first-mechanical-keyboard/</id><summary type="html">Modified Adelheid. Simple, cheap, needs improvements but it is mine&amp;nbsp;;D</summary><content type="html">&lt;p&gt;About a year ago I wrote a post about &lt;a href="/2024/02/25/good-keyboard-is-a-must/"&gt;a need for a good keyboard&lt;/a&gt;. And that I am
thinking of making mechanical&amp;nbsp;one.&lt;/p&gt;
&lt;p&gt;During last week I built&amp;nbsp;one.&lt;/p&gt;
&lt;!--MORE--&gt;

&lt;h3&gt;Repetitive strain&amp;nbsp;injury&lt;/h3&gt;
&lt;p&gt;Twenty years ago I had a problem with repetitive strain injury (&lt;span class="caps"&gt;RSI&lt;/span&gt; in short).
Typing on normal &lt;span class="caps"&gt;PC&lt;/span&gt; keyboard was quite impossible for me. Someone recommended
buying one of those &amp;#8220;fancy&amp;#8221; ergonomic ones. And that&amp;#8217;s how I ended with Microsoft
Natural Keyboard&amp;nbsp;Elite.&lt;/p&gt;
&lt;figure id="__yafg-figure-1"&gt;
&lt;img alt="Microsoft Natural Keyboard" loading="lazy" src="/files/2005/04/klawiatura-700x.jpg" title="Microsoft Natural Keyboard"&gt;
&lt;figcaption&gt;Microsoft Natural Keyboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It was a great help. Got used to layout and my &lt;span class="caps"&gt;RSI&lt;/span&gt; problems were going away.
Then bought second one to have one at home and one at&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;Time passed, keycaps were worn up so I got another keyboard &amp;#8212; you can read the
story in &lt;a href="/2024/02/25/good-keyboard-is-a-must/"&gt;last year post about keyboards&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Let&amp;#8217;s get&amp;nbsp;mechanical&lt;/h3&gt;
&lt;p&gt;During last year I looked at several keyboards. Checked &lt;span class="caps"&gt;KMK&lt;/span&gt;, &lt;span class="caps"&gt;QMK&lt;/span&gt;, &lt;span class="caps"&gt;ZMK&lt;/span&gt; and other
solutions of keyboard firmware. Watched countless videos on how to make keyboard
and read many articles about&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;One layout caught my eye: &lt;a href="https://geekhack.org/index.php?topic=95054.0"&gt;&lt;span class="caps"&gt;TGR&lt;/span&gt; Alice&lt;/a&gt;
as it was quite simple ergonomic one. Then found
&lt;a href="https://github.com/FateNozomi/arisu-pcb"&gt;Arisu&lt;/a&gt; which added cursor keys and did
some other changes. And finally &lt;a href="https://github.com/floookay/adelheid"&gt;Adelheid&lt;/a&gt;
which added function&amp;nbsp;keys.&lt;/p&gt;
&lt;h3&gt;My&amp;nbsp;Adelheid&lt;/h3&gt;
&lt;p&gt;As those layouts are available on &lt;span class="caps"&gt;MIT&lt;/span&gt; license I took Adelheid and altered its
layout a&amp;nbsp;bit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;added Meta&amp;nbsp;key&lt;/li&gt;
&lt;li&gt;moved Backspace to were it is on &lt;span class="caps"&gt;PC105&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;moved Backslash to above Enter&amp;nbsp;key&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id="__yafg-figure-2"&gt;
&lt;img alt="My version of Adelheid" loading="lazy" src="/files/2025/03/mykeyboard-700x.jpg" title="My version of Adelheid"&gt;
&lt;figcaption&gt;My version of Adelheid&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Parts and&amp;nbsp;costs&lt;/h3&gt;
&lt;p&gt;I had some parts already (ordered then to my MS4KMech project which I abandoned
in meantime) and decided that my first keyboard will be as cheap as&amp;nbsp;possible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redragon switches (&lt;a href="https://www.aliexpress.com/item/1005005818790193.html"&gt;11€ on Aliexpress&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;cheap &lt;span class="caps"&gt;ABS&lt;/span&gt; keycaps (&lt;a href="https://www.aliexpress.com/item/1005006457541291.html"&gt;5€ oin Aliexpress&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Ultimate Pico &lt;span class="caps"&gt;RP2040&lt;/span&gt; (&lt;a href="https://www.aliexpress.com/item/1005004277013272.html"&gt;2.7€ on Aliexpress&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;hundred 1N4148 diodes&amp;nbsp;(2€)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So cost of parts was about 20 &lt;span class="caps"&gt;EUR&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;As a way to keep costs down I printed plate in two pieces (Ender 3 table size
was a limit) and used some screws and plates to keep them&amp;nbsp;together.&lt;/p&gt;
&lt;h3&gt;Soldering rows and&amp;nbsp;columns&lt;/h3&gt;
&lt;p&gt;Mounted switches and started soldering. Simple diode to diode to create rows.
And it is visible that I watched some video after first 3 rows of one half&amp;nbsp;;D&lt;/p&gt;
&lt;p&gt;Instead of forming diodes I soldered them and then use small pliers to form
rows. Later started cutting legs before&amp;nbsp;soldering.&lt;/p&gt;
&lt;p&gt;Columns were easier. Spool of kynar and stripping isolation using nails did the&amp;nbsp;job.&lt;/p&gt;
&lt;figure id="__yafg-figure-3"&gt;
&lt;img alt="First half of keyboard" src="/files/2025/03/firsthalf-700x.jpg" title="First half of keyboard"&gt;
&lt;figcaption&gt;First half of keyboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Added a bunch of colour wires to be able to test did my soldering resulted in
something working. Grabbed Raspberry Pico from a drawer, flashed it with &lt;span class="caps"&gt;QMK&lt;/span&gt;
firmware and testing bench was&amp;nbsp;ready:&lt;/p&gt;
&lt;figure id="__yafg-figure-4"&gt;
&lt;img alt="Testing bench" src="/files/2025/03/testinghalf-700x.jpg" title="Testing bench"&gt;
&lt;figcaption&gt;Testing bench&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And it almost worked! One key was not working. Turned out that diode was
soldered in wrong direction.&amp;nbsp;Happens.&lt;/p&gt;
&lt;p&gt;For second half I took a bit different strategy. Decided to solder columns
first as they took me more time than rows. Whole half went much faster then&amp;nbsp;first.&lt;/p&gt;
&lt;figure id="__yafg-figure-5"&gt;
&lt;img alt="Second half of keyboard" src="/files/2025/03/secondhalf-700x.jpg" title="Second half of keyboard"&gt;
&lt;figcaption&gt;Second half of keyboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Then all that left was finding a way to connect both halves (I did not wanted to
make a split keyboard) and connect rows. I used pieces of old universal &lt;span class="caps"&gt;PCB&lt;/span&gt; and&amp;nbsp;screws:&lt;/p&gt;
&lt;figure id="__yafg-figure-6"&gt;
&lt;img alt="Both halves of keyboard" src="/files/2025/03/bothhalves-700x.jpg" title="Both halves of keyboard"&gt;
&lt;figcaption&gt;Both halves of keyboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Connecting&amp;nbsp;controller&lt;/h3&gt;
&lt;p&gt;I bought Ultimate Pico &lt;span class="caps"&gt;RP2040&lt;/span&gt; especially for keyboard project months ago.
Compared to Raspberry Pico this board had &lt;span class="caps"&gt;USB&lt;/span&gt;-C port and one line more (&lt;span class="caps"&gt;GP29&lt;/span&gt;).
Also less &lt;span class="caps"&gt;GND&lt;/span&gt; pins so 17 &lt;span class="caps"&gt;GPIO&lt;/span&gt; lines are on one side. My keyboard has 16 columns
so this allowed me to have all columns connected on one side of board and use
second side connections for&amp;nbsp;rows:&lt;/p&gt;
&lt;figure id="__yafg-figure-7"&gt;
&lt;img alt="Final view of bottom side" src="/files/2025/03/finalbottom-700x.jpg" title="Final view of bottom side"&gt;
&lt;figcaption&gt;Final view of bottom side&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I may do not look nice but it works&amp;nbsp;:D&lt;/p&gt;
&lt;h3&gt;Powering&amp;nbsp;up&lt;/h3&gt;
&lt;p&gt;I flashed &lt;span class="caps"&gt;QMK&lt;/span&gt; and started testing. Turned out that one column is not working.
Soldered wire and it was&amp;nbsp;fine.&lt;/p&gt;
&lt;p&gt;3 other keys were not working. One needed soldering but other ones looked&amp;nbsp;fine.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;QMK&lt;/span&gt; has a solution for it: &amp;#8220;Console debugging&amp;#8221;. I added a bit of code&amp;nbsp;to
&lt;code&gt;keymap.c&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  // If console is enabled, it will print the matrix position and status
  // of each key pressed
#ifdef CONSOLE_ENABLE
    uprintf(&amp;quot;KL: kc: 0x%04X, row: %2u, col: %2u, pressed: %u, &amp;quot;
            &amp;quot;time: %5u, int: %u, count: %u\n&amp;quot;,
            keycode, record-&amp;gt;event.key.col, record-&amp;gt;event.key.row,
            record-&amp;gt;event.pressed, record-&amp;gt;event.time, record-&amp;gt;tap.interrupted,
            record-&amp;gt;tap.count);
#endif
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allowed me to notice that both Enter and End keys are seen. Turned out that
I wrote wrong row/column values for both of&amp;nbsp;them.&lt;/p&gt;
&lt;h3&gt;Mistakes&lt;/h3&gt;
&lt;p&gt;I made some mistakes with this keyboard. They were expected as usual with first&amp;nbsp;attempts.&lt;/p&gt;
&lt;p&gt;First mistake: 2mm plate. Should had do 1.5mm to make switches keep better.
Total thickness can be even 3-5 mm but with holes done in a way that
switches hold properly. Also it may make keyboard less&amp;nbsp;bendy.&lt;/p&gt;
&lt;p&gt;Second ones - holes for stabilisers. I have a few 2u - 2.75u keys and they
should get stabilisers. But I did holes in wrong way so the ones I have do not
fit. Will see how it affects keyboard&amp;nbsp;use.&lt;/p&gt;
&lt;p&gt;Third one: soldering. I do not remember when last time I soldered so many
points. So some of other are shitty. Just had to fix one&amp;nbsp;more&amp;#8230;&lt;/p&gt;
&lt;h3&gt;Tools&lt;/h3&gt;
&lt;p&gt;Community behind mechanical keyboards created many tools. Let me try to list
ones I&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;First comes &lt;a href="https://qmk.fm"&gt;&lt;span class="caps"&gt;QMK&lt;/span&gt; firmware&lt;/a&gt; which allows to forget about
programming microcontrollers as keyboard is done as simple &lt;span class="caps"&gt;JSON&lt;/span&gt; file and one C
file with keymap&amp;nbsp;definition.&lt;/p&gt;
&lt;p&gt;Then &lt;a href="https://www.keyboard-layout-editor.com"&gt;Keyboard Layout Editor&lt;/a&gt; which
allows to define layout of keys in any crazy way you want. Raw data from it is a
base for several other&amp;nbsp;tools.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kbfirmware.com/"&gt;Keyboard Firmware Builder&lt;/a&gt; is a simplest way to manage
wiring of keyboard. You paste raw data from previous tool and start simplifying
wiring. It can also generate ready to use &lt;span class="caps"&gt;QMK&lt;/span&gt; firmware images for several
popular micro controllers (but no &lt;span class="caps"&gt;RP2040&lt;/span&gt; I&amp;nbsp;used).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://builder.swillkb.com/"&gt;Plate &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; Case Builder&lt;/a&gt; also takes layout data. And
allows to choose switch/stabilizer types plus a bunch of other options. Then
generates plate for your layout with option to download it in &lt;span class="caps"&gt;SVG&lt;/span&gt;, &lt;span class="caps"&gt;DXF&lt;/span&gt;, &lt;span class="caps"&gt;EPS&lt;/span&gt; file
formats. I took &lt;span class="caps"&gt;SVG&lt;/span&gt;, extruded to 2mm and had a base plate for 3d&amp;nbsp;printing.&lt;/p&gt;
&lt;h3&gt;Was it worth the&amp;nbsp;time?&lt;/h3&gt;
&lt;p&gt;The question for the end: was it worth the time? I think that it was. Learnt new
things, got something working. Something I did on my own. Sure, it is far from
being perfect but gives me area for&amp;nbsp;improvements. &lt;/p&gt;
&lt;p&gt;I have two space keys and already see that for most of time I use right one.
There are no layers defined yet and I have a key for it. Some keycaps may get
replaced with other ones (like Calculator one next to left Space begs for lower&amp;nbsp;one).&lt;/p&gt;
&lt;p&gt;I have links to many interesting layouts so who knows, maybe I will make a new
keyboard soon. Split, orthogonal one. With volume knob. Will&amp;nbsp;see.&lt;/p&gt;</content><category term="keyboard"/><category term="desktop"/><category term="linux"/></entry><entry><title>Arm cpu info EFI application</title><link href="https://marcin.juszkiewicz.com.pl/2023/05/03/arm-cpu-info-efi-application/" rel="alternate"/><published>2023-05-03T15:38:00+02:00</published><updated>2023-05-03T15:38:00+02:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2023-05-03:/2023/05/03/arm-cpu-info-efi-application/</id><summary type="html">Want to check what your AArch64 cpu is capable of? Without running &lt;span class="caps"&gt;OS&lt;/span&gt;?</summary><content type="html">&lt;p&gt;As you may know one of my side projects is &lt;a href="/download/tables/arm-socs.html"&gt;AArch64 SoC features table&lt;/a&gt;.
It reports which features of AArch64 processor were recognized by Linux kernel
and presented in /proc/cpuinfo&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;But there are moments when I do not want to boot Linux just to check what
features cpu cores are capable of. So I wrote an &lt;span class="caps"&gt;EFI&lt;/span&gt; application for it and
called it&amp;nbsp;&amp;#8220;ArmCpuInfo&amp;#8221;.&lt;/p&gt;
&lt;!--MORE--&gt;

&lt;h3&gt;How it&amp;nbsp;works&lt;/h3&gt;
&lt;p&gt;AArch64 processors have set of system registers. All those ID_AA64DFR0_EL1 etc.
All you have to do is read them, split into nibbles (4-bit long segments) and
check armarm (Arm Architecture Reference Manual) for their meaning. Sometimes
even single bits are used for marking feature&amp;nbsp;support.&lt;/p&gt;
&lt;p&gt;Turned out that writing application was quite easy. First version was just a
bunch of &amp;#8220;if&amp;#8221; all over the place. Then I rewritten it to be more user friendly
&amp;#8212; now it uses &amp;#8220;switch/case/default&amp;#8221; schema so for each unknown nibble&amp;#8217;s value
simple &amp;#8220;unknown&amp;#8221; is printed. This allows to catch moments when either
application needs updates due to architecture changes or when SoC does not
follow the rules written in&amp;nbsp;armarm.&lt;/p&gt;
&lt;h3&gt;Where is source&amp;nbsp;code?&lt;/h3&gt;
&lt;p&gt;The ArmCpuInfo application &lt;del&gt;is part of &lt;span class="caps"&gt;EDK2&lt;/span&gt;. You can find it as a part of ArmPkg.&lt;/del&gt;
is hosted in &lt;a href="https://github.com/hrw/edk2-armcpuinfo"&gt;edk2-armcpuinfo repository&lt;/a&gt;.
I moved it there due to long review times in &lt;span class="caps"&gt;EDK2&lt;/span&gt;&amp;nbsp;project.&lt;/p&gt;
&lt;p&gt;Licensed under &lt;span class="caps"&gt;BSD&lt;/span&gt;-2-Clause-Patent license like &lt;span class="caps"&gt;EDK2&lt;/span&gt; project. May relicense it
to &lt;span class="caps"&gt;MIT&lt;/span&gt; (used by my other personal&amp;nbsp;projects).&lt;/p&gt;
&lt;h3&gt;How to&amp;nbsp;run&lt;/h3&gt;
&lt;p&gt;The ArmCpuInfo is simple &lt;span class="caps"&gt;EFI&lt;/span&gt; application therefore it can be run on any firmware
which provides a way to run such. It can be closed &lt;span class="caps"&gt;EFI&lt;/span&gt; implementation, can be
&lt;span class="caps"&gt;EDK2&lt;/span&gt; one or it can also be U-Boot with &lt;span class="caps"&gt;EFI&lt;/span&gt; services enabled (which nowadays
means basically any properly configured&amp;nbsp;one).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/hrw/edk2-armcpuinfo/releases/"&gt;download ArmCpuInfo from release&amp;nbsp;page&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Sample&amp;nbsp;output&lt;/h3&gt;
&lt;p&gt;As most of my development time I spend with &lt;span class="caps"&gt;SBSA&lt;/span&gt; Reference Platform in &lt;span class="caps"&gt;QEMU&lt;/span&gt; I
run ArmCpuInfo there (on &amp;#8220;max&amp;#8221; cpu core which has everything &lt;span class="caps"&gt;QEMU&lt;/span&gt; is capable of&amp;nbsp;emulating):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Shell&amp;gt; fs0:armcpuinfo.efi
ArmCpuInfo v1.0.0

ID_AA64MMFR0_EL1 = 0x0100032310201126
ID_AA64MMFR1_EL1 = 0x0010011010312122
ID_AA64MMFR2_EL1 = 0x1221011110011011
ID_AA64PFR0_EL1  = 0x1201001121112222
ID_AA64PFR1_EL1  = 0x0000000001000121
ID_AA64ISAR0_EL1 = 0x1221111110212120
ID_AA64ISAR1_EL1 = 0x0011111101211052
ID_AA64ISAR2_EL1 = 0x0000000000110000
ID_AA64DFR0_EL1  = 0x0000000010305609
ID_AA64SMFR0_EL1 = 0x80F100FD00000000
ID_AA64ZFR0_EL1  = 0x0110110100110021

Reg   |  Bits | Value | Feature
------|-------|-------|----------------------------------------------
MMFR0 |  3:0  |  0110 | 52 Bits (4PB) of physical address range supported.
      |       |       | FEAT_LPA implemented.
MMFR0 |  7:4  |  0010 | ASID: 16 Bits
MMFR0 | 11:8  |  0001 | Mixed-endian support.
MMFR0 | 19:16 |  0000 | No mixed-endian support at EL0.
MMFR0 | 15:12 |  0001 | Supports a distinction between Secure and Non-Secure Memory.
MMFR0 | 31:28 |  0001 |  4KB granule supported for 52-bit address.
MMFR0 | 43:40 |  0011 |  4KB granule supported at stage 2 for 52-bit address.
MMFR0 | 23:20 |  0010 | 16KB granule supported for 52-bit address.
MMFR0 | 35:32 |  0011 | 16KB granule supported at stage 2 for 52-bit address.
MMFR0 | 27:24 |  0000 | 64KB granule supported.
MMFR0 | 39:36 |  0010 | 64KB granule supported at stage 2.
MMFR0 | 47:44 |  0000 | FEAT_ExS not implemented.
MMFR0 | 59:56 |  0001 | FEAT_FGT implemented.
MMFR0 | 63:60 |  0000 | FEAT_ECV not implemented.
------|-------|-------|----------------------------------------------
MMFR1 |  3:0  |  0010 | FEAT_HAFDBS implemented with dirty status support.
MMFR1 |  7:4  |  0010 | FEAT_VMID16 implemented.
MMFR1 | 11:8  |  0001 | FEAT_VHE implemented.
MMFR1 | 15:12 |  0010 | FEAT_HPDS2 implemented.
MMFR1 | 19:16 |  0001 | FEAT_LOR implemented.
MMFR1 | 23:20 |  0011 | FEAT_PAN3 implemented.
MMFR1 | 27:24 |  0000 | The PE never generates an SError interrupt due to
      |       |       | an External abort on a speculative read.
MMFR1 | 31:28 |  0001 | FEAT_XNX implemented.
MMFR1 | 35:32 |  0000 | FEAT_TWED not implemented.
MMFR1 | 39:36 |  0001 | FEAT_ETS implemented.
MMFR1 | 43:40 |  0001 | FEAT_HCX implemented.
MMFR1 | 47:44 |  0000 | FEAT_AFP not implemented.
MMFR1 | 51:48 |  0000 | FEAT_nTLBPA not implemented.
MMFR1 | 55:52 |  0001 | FEAT_TIDCP1 implemented
MMFR1 | 59:56 |  0000 | FEAT_CMOW not implemented.
------|-------|-------|----------------------------------------------
MMFR2 |  3:0  |  0001 | FEAT_TTCNP implemented.
MMFR2 |  7:4  |  0001 | FEAT_UAO implemented.
MMFR2 | 11:8  |  0000 | FEAT_LSMAOC not implemented.
MMFR2 | 15:12 |  0001 | FEAT_IESB implemented.
MMFR2 | 19:16 |  0001 | FEAT_LVA implemented.
MMFR2 | 23:20 |  0000 | FEAT_CCIDX not implemented.
MMFR2 | 27:24 |  0000 | FEAT_NV not implemented.
MMFR2 | 31:28 |  0001 | FEAT_TTST implemented.
MMFR2 | 35:32 |  0001 | FEAT_LSE2 implemented.
MMFR2 | 39:36 |  0001 | FEAT_IDST implemented.
MMFR2 | 43:40 |  0001 | FEAT_S2FWB implemented.
MMFR2 | 51:48 |  0001 | FEAT_TTL implemented.
MMFR2 | 55:52 |  0010 | FEAT_BBM: Level 2 support for changing block size is supported.
MMFR2 | 59:56 |  0010 | FEAT_EVT: HCR_EL2.{TTLBOS, TTLSBIS, TOCU, TICAB, TID4} traps are supported.
MMFR2 | 63:60 |  0001 | FEAT_E0PD implemented.
------|-------|-------|----------------------------------------------
PFR0  |  3:0  |  0010 | EL0 in AArch64 and AArch32
PFR0  |  7:4  |  0010 | EL1 in AArch64 and AArch32
PFR0  | 11:8  |  0010 | EL2 in AArch64 and AArch32
PFR0  | 15:12 |  0010 | EL3 in AArch64 and AArch32
PFR0  | 19:16 |  0001 | Floating-point with half-precision support (FEAT_FP16).
PFR0  | 23:20 |  0001 | Advanced SIMD with half precision support (FEAT_FP16).
PFR0  | 27:24 |  0001 | System registers to versions 3.0/4.0 of GIC CPU implemented.
PFR0  | 31:28 |  0010 | FEAT_RASv1p1 implemented. FEAT_DoubleFault implemented.
PFR0  | 35:32 |  0001 | FEAT_SVE implemented.
PFR0  | 39:36 |  0001 | Secure EL2 implemented.
PFR0  | 43:40 |  0000 | FEAT_MPAM not implemented.
PFR0  | 47:44 |  0000 | FEAT_AMU not implemented.
PFR0  | 51:48 |  0001 | FEAT_DIT implemented.
PFR0  | 55:52 |  0000 | FEAT_RME not implemented
PFR0  | 59:56 |  0010 | FEAT_CSV2_2 implemented.
PFR0  | 63:60 |  0001 | FEAT_CSV3 implemented.
------|-------|-------|----------------------------------------------
PFR1  |  3:0  |  0001 | FEAT_BTI implemented.
PFR1  |  7:4  |  0010 | FEAT_SSBS2 implemented.
PFR1  | 11:8  |  0001 | FEAT_MTE implemented.
PFR1  | 27:24 |  0001 | FEAT_SME implemented.
PFR1  | 31:28 |  0000 | FEAT_RNG_TRAP not implemented.
PFR1  | 39:36 |  0000 | FEAT_NMI not implemented.
------|-------|-------|----------------------------------------------
ISAR0 |  7:4  |  0010 | FEAT_AES and FEAT_PMULL implemented.
ISAR0 | 11:8  |  0001 | FEAT_SHA1 implemented.
ISAR0 | 15:12 |  0010 | FEAT_SHA512 implemented.
ISAR0 | 19:16 |  0001 | CRC32 instructions implemented.
ISAR0 | 23:20 |  0010 | FEAT_LSE implemented.
ISAR0 | 27:24 |  0000 | TME instructions not implemented.
ISAR0 | 31:28 |  0001 | FEAT_RDM implemented.
ISAR0 | 35:32 |  0001 | FEAT_SHA3 implemented.
ISAR0 | 39:36 |  0001 | FEAT_SM3 implemented.
ISAR0 | 43:40 |  0001 | FEAT_SM4 implemented.
ISAR0 | 47:44 |  0001 | FEAT_DotProd implemented.
ISAR0 | 51:48 |  0001 | FEAT_FHM implemented.
ISAR0 | 55:52 |  0010 | FEAT_FlagM2 implemented.
ISAR0 | 59:56 |  0010 | FEAT_TLBIRANGE implemented.
ISAR0 | 63:60 |  0001 | FEAT_RNG implemented.
------|-------|-------|----------------------------------------------
ISAR1 |  3:0  |  0010 | FEAT_DPB2 implemented.
ISAR1 |  7:4  |  0101 | FEAT_FPACCOMBINE implemented.
      |       |       | FEAT_PACQARMA5 implemented.
ISAR1 | 11:8  |  0000 | Address Authentication (API) not implemented.
ISAR1 | 15:12 |  0001 | FEAT_JSCVT implemented.
ISAR1 | 19:16 |  0001 | FEAT_FCMA implemented.
ISAR1 | 23:20 |  0010 | FEAT_LRCPC2 implemented.
ISAR1 | 27:24 |  0001 | FEAT_PACQARMA5 implemented.
ISAR1 | 31:28 |  0000 | FEAT_PACIMP not implemented.
ISAR1 | 35:32 |  0001 | FEAT_FRINTTS implemented.
ISAR1 | 39:36 |  0001 | FEAT_SB implemented.
ISAR1 | 43:40 |  0001 | FEAT_SPECRES implemented.
ISAR1 | 47:44 |  0001 | FEAT_BF16 implemented.
ISAR1 | 51:48 |  0001 | FEAT_DGH implemented.
ISAR1 | 55:52 |  0001 | FEAT_I8MM implemented.
ISAR1 | 59:56 |  0000 | FEAT_XS not implemented.
ISAR1 | 63:60 |  0000 | FEAT_LS64 not implemented.
------|-------|-------|----------------------------------------------
ISAR2 |  3:0  |  0000 | FEAT_WFxT not implemented.
ISAR2 |  7:4  |  0000 | FEAT_RPRES not implemented.
ISAR2 | 11:8  |  0000 | FEAT_PACQARMA3 not implemented.
ISAR2 | 15:12 |  0000 | Address Authentication (APA3) not implemented.
ISAR2 | 19:16 |  0001 | FEAT_MOPS implemented.
ISAR2 | 23:20 |  0001 | FEAT_HBC implemented.
ISAR2 | 27:24 |  0000 | FEAT_CONSTPACFIELD not implemented.
------|-------|-------|----------------------------------------------
DFR0  |  3:0  |  1001 | FEAT_Debugv8p4 implemented.
DFR0  |  7:4  |  0000 | Trace unit System registers not implemented.
DFR0  | 11:8  |  0110 | FEAT_PMUv3p5 implemented.
DFR0  | 15:12 |  0101 | Number of breakpoints, minus 1.
DFR0  | 23:20 |  0011 | Number of watchpoints, minus 1.
DFR0  | 31:28 |  0001 | Number of breakpoints that are context-aware, minus 1.
DFR0  | 35:32 |  0000 | FEAT_SPE not implemented.
DFR0  | 39:36 |  0000 | FEAT_DoubleLock implemented.
DFR0  | 43:40 |  0000 | FEAT_TRF not implemented.
DFR0  | 47:44 |  0000 | FEAT_TRBE not implemented.
DFR0  | 51:48 |  0000 | FEAT_MTPMU not implemented.
DFR0  | 55:52 |  0000 | FEAT_BRBE not implemented.
DFR0  | 63:60 |  0000 | Setting MDCR_EL2.HPMN to zero has CONSTRAINED UNPREDICTABLE behavior.
------|-------|-------|----------------------------------------------
SMFR0 |    32 |  0001 | SME F32F32 implemented.
SMFR0 |    34 |  0001 | SME B16F32 implemented.
SMFR0 |    35 |  0001 | SME F16F32 implemented.
SMFR0 | 39:36 |  1111 | SME I8I32 implemented.
SMFR0 |    48 |  0001 | SME F64F64 implemented.
SMFR0 | 55:52 |  1111 | SME I16I64 implemented
SMFR0 | 59:56 |  0000 | Mandatory SME instructions are implemented.
SMFR0 |    63 |  0001 | SME_FA64 implemented.
------|-------|-------|----------------------------------------------
ZFR0  |  3:0  |  0001 | FEAT_SVE2 implemented.
ZFR0  |  7:4  |  0010 | FEAT_SVE_AES and FEAT_SVE_PMULL128 implemented.
ZFR0  | 19:16 |  0001 | FEAT_SVE_BitPerm implemented.
ZFR0  | 23:20 |  0001 | FEAT_BF16 SVE implemented.
ZFR0  | 35:32 |  0001 | FEAT_SVE_SHA3 implemented.
ZFR0  | 43:40 |  0001 | FEAT_SVE_SM4 implemented.
ZFR0  | 47:44 |  0001 | FEAT_I8MM SVE implemented.
ZFR0  | 55:52 |  0001 | FEAT_F32MM SVE implemented
ZFR0  | 59:56 |  0001 | FEAT_F64MM SVE implemented
------|-------|-------|----------------------------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s a lot of feature flags&amp;nbsp;:D&lt;/p&gt;</content><category term="aarch64"/><category term="edk2"/><category term="linux"/><category term="development"/></entry><entry><title>New toy arrived — RockPro64</title><link href="https://marcin.juszkiewicz.com.pl/2020/05/14/new-toy-arrived-rockpro64/" rel="alternate"/><published>2020-05-14T10:53:00+02:00</published><updated>2020-05-14T10:53:00+02:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2020-05-14:/2020/05/14/new-toy-arrived-rockpro64/</id><summary type="html">I got new toy &amp;#8212;&amp;nbsp;RockPro64</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;AArch64 world has toys on cheap side, servers on expensive and some attempts
in a&amp;nbsp;middle.&lt;/p&gt;
&lt;p&gt;Me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I started working on AArch64 in 2012 year. &lt;a href="/2012/10/25/aarch64-for-everyone/"&gt;Before hardware was available&lt;/a&gt;. Even
before toolchain bits were available. Then first prototype server arrived at Red
Hat, then it got replaced with Applied Micro Mustang. Then more servers, &lt;a href="/2014/06/10/aarch64-is-in-the-house/"&gt;Mustang
under desk&lt;/a&gt;. Joined Linaro (as Red Hat assignee) and started using their server&amp;nbsp;lab.&lt;/p&gt;
&lt;p&gt;And during all those years I never played with AArch64 &lt;span class="caps"&gt;SBC&lt;/span&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If it lacks proper storage and 16+&lt;span class="caps"&gt;GB&lt;/span&gt; ram then I am not&amp;nbsp;interested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some months ago I decided to change&amp;nbsp;it.&lt;/p&gt;
&lt;h3&gt;What to&amp;nbsp;choose?&lt;/h3&gt;
&lt;p&gt;There are many AArch64 boards to choose from. Some are better, some are not.
Popular ones and those with features. Like&amp;nbsp;usual.&lt;/p&gt;
&lt;p&gt;So I asked Peter Robinson and few other folks about their proposal and most of
them agreed that Rockchip &lt;span class="caps"&gt;RK3399&lt;/span&gt; looks most interesting. Has &lt;span class="caps"&gt;PCI&lt;/span&gt; Express slot on
several boards, uses Mali T860 so can play with Panfrost driver, &lt;span class="caps"&gt;USB&lt;/span&gt; 3 ports are
present&amp;nbsp;etc.&lt;/p&gt;
&lt;h4&gt;RockPro64&lt;/h4&gt;
&lt;p&gt;After some market research I decided on &lt;a href="https://wiki.pine64.org/index.php/ROCKPro64"&gt;RockPro64 from Pine64&lt;/a&gt;. Board has &lt;span class="caps"&gt;USB&lt;/span&gt; 3
in both A and C type, PCIe x4 slot is present and I can reuse acrylic case from
Pine A64 board I bought few years ago. And it has &lt;a href="/2020/01/29/the-most-expensive-chip-in-the-arm-world/"&gt;&amp;#8220;the most expensive chip in
&lt;span class="caps"&gt;ARM&lt;/span&gt; world&amp;#8221;&lt;/a&gt; present (&lt;span class="caps"&gt;16MB&lt;/span&gt; &lt;span class="caps"&gt;SPI&lt;/span&gt; flash for boot&amp;nbsp;firmware).&lt;/p&gt;
&lt;p&gt;Ordered in March, board arrived two days&amp;nbsp;ago.&lt;/p&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;p&gt;I digged in my boxes and found 12V/5A power supply (3A is recommended minimum),
used some Ethernet cable flying under desk, old &lt;span class="caps"&gt;64GB&lt;/span&gt; usb3 thumb drive for
storage and my lovely &lt;span class="caps"&gt;IOGEAR&lt;/span&gt; &lt;span class="caps"&gt;GKM561R&lt;/span&gt; keyboard/trackpoint which I use for all
boards&amp;nbsp;bring-up.&lt;/p&gt;
&lt;p&gt;Mounted board into acrylic case and started wiring extra&amp;nbsp;stuff.&lt;/p&gt;
&lt;h4&gt;Disable &lt;span class="caps"&gt;SPI&lt;/span&gt;&amp;nbsp;button&lt;/h4&gt;
&lt;p&gt;As boot firmware can be stored in onboard &lt;span class="caps"&gt;SPI&lt;/span&gt; chip there has to be a way to
ignore it on boot. According to &lt;a href="https://wiki.pine64.org/index.php/ROCKPro64#Disable_SPI_.28while_booting.29"&gt;disable &lt;span class="caps"&gt;SPI&lt;/span&gt; note&lt;/a&gt;
on vendor website it is a matter of crossing SPI_CLK with &lt;span class="caps"&gt;GND&lt;/span&gt; during&amp;nbsp;boot.&lt;/p&gt;
&lt;p&gt;So small breadboard, two wires, button and I am&amp;nbsp;ready.&lt;/p&gt;
&lt;h4&gt;Serial&amp;nbsp;console&lt;/h4&gt;
&lt;p&gt;As usual serial console is on pins. So breadboard got one of my cheap &lt;span class="caps"&gt;USB&lt;/span&gt;-Serial
dongles plugged and then wires&amp;nbsp;started.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://forum.pine64.org/showthread.php?tid=6387"&gt;Serial console setup post on forum&lt;/a&gt;
says that 6/8/10 pins are all I need. Did them, connected &lt;span class="caps"&gt;USB&lt;/span&gt; cable and started
picocom at 1.5Mbps&amp;nbsp;speed:&lt;/p&gt;
&lt;pre&gt;
Terminal ready
��tU�����UU���˕�U���TU J���UU���Q�UR�)���Q�
*�R��uT��*��U�
      �VQ��Y��ս+UJ.���I��zT����UQ])
&lt;/pre&gt;

&lt;p&gt;Lovely! Turned out that &lt;span class="caps"&gt;CP2102&lt;/span&gt; dongles are only &amp;#8220;expected&amp;#8221; to work at that
speed. Digged deeper in drawers and found &lt;a href="https://www.tincantools.com/product/spi-hook/"&gt;&lt;span class="caps"&gt;SPI&lt;/span&gt; Hook device&lt;/a&gt; from TinCanTools. It
uses &lt;span class="caps"&gt;FT2232HL&lt;/span&gt; so should be fine with up to 12Mbps&amp;nbsp;speed.&lt;/p&gt;
&lt;p&gt;And worked without&amp;nbsp;problems:&lt;/p&gt;
&lt;pre&gt;
U-Boot TPL 2020.04 (Apr 20 2020 - 00:00:00)
Channel 0: LPDDR4, 50MHz
BW=32 Col=10 Bk=8 CS0 Row=16/15 CS=1 Die BW=16 Size=2048MB
Channel 1: LPDDR4, 50MHz
BW=32 Col=10 Bk=8 CS0 Row=16/15 CS=1 Die BW=16 Size=2048MB
256B stride
256B stride
lpddr4_set_rate: change freq to 400000000 mhz 0, 1
lpddr4_set_rate: change freq to 800000000 mhz 1, 0
Trying to boot from BOOTROM
Returning to boot ROM...

U-Boot SPL 2020.04 (Apr 20 2020 - 00:00:00 +0000)
Trying to boot from MMC1

U-Boot 2020.04 (Apr 20 2020 - 00:00:00 +0000)

SoC: Rockchip rk3399
Reset cause: POR
Model: Pine64 RockPro64
DRAM:  3.9 GiB
PMIC:  RK808 
MMC:   dwmmc@fe320000: 1, sdhci@fe330000: 0
Loading Environment from MMC... Card did not respond to voltage select!
*** Warning - No block device, using default environment
&lt;/pre&gt;

&lt;p&gt;So I was ready to&amp;nbsp;play!&lt;/p&gt;
&lt;h3&gt;Mali&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;So when Arm will open source Mali&amp;nbsp;drivers?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This question is present on each &amp;#8220;Ask Arm Anything&amp;#8221; sessions during Linaro
Connect (&lt;span class="caps"&gt;ARM&lt;/span&gt; partners only session, badges are checked on room entry). And
answer always is more or less&amp;nbsp;&amp;#8220;never&amp;#8221;.&lt;/p&gt;
&lt;p&gt;But there is Panfrost now. Fully open source driver for Mali family used in
&lt;span class="caps"&gt;RK3399&lt;/span&gt;&amp;nbsp;SoC.&lt;/p&gt;
&lt;p&gt;Booted board and it got&amp;nbsp;stuck:&lt;/p&gt;
&lt;pre&gt;
[   29.043106] panfrost ff9a0000.gpu: clock rate = 500000000
[   29.053073] rockchip-vop ff8f0000.vop: Adding to iommu group 1
[   29.058099] panfrost ff9a0000.gpu: mali-t860 id 0x860 major 0x2 minor 0x0 status 0x0
[   29.058948] panfrost ff9a0000.gpu: features: 00000000,100e77bf, issues: 00000000,24040400
[   29.059820] panfrost ff9a0000.gpu: Features: L2:0x07120206 Shader:0x00000000 Tiler:0x00000809 Mem:0x1 MMU:0x00002830 AS:0xff JS:0x7
[   29.061053] panfrost ff9a0000.gpu: shader_present=0xf l2_present=0x1
[   29.063559] rockchip-vop ff900000.vop: Adding to iommu group 2
[   29.147966] panfrost ff9a0000.gpu: devfreq_add_device: Unable to find governor for the device
[   29.151244] panfrost ff9a0000.gpu: [drm:panfrost_devfreq_init [panfrost]] *ERROR* Couldn't initialize GPU devfreq
[   29.173499] panfrost ff9a0000.gpu: Fatal error during devfreq init
&lt;/pre&gt;

&lt;p&gt;Discussed issue with people on #panfrost &lt;span class="caps"&gt;IRC&lt;/span&gt; channel and they pointed me at
&amp;#8220;governor_simpleondemand&amp;#8221; kernel module being missing. So I rebuilt initramfs
with &amp;#8220;dracut -v &amp;#8212;force-drivers governor_simpleondemand &amp;#8212;force&amp;#8221; command and it
booted to FullHD&amp;nbsp;framebuffer.&lt;/p&gt;
&lt;p&gt;Some work is needed here as monitor has 3440x1440 resolution so at least
2560x1440 or 2560x1080 should be used. But that can wait for now. I plan to move
this board somewhere else on desk and connect to 24&amp;#8221; full hd&amp;nbsp;monitor.&lt;/p&gt;
&lt;h3&gt;Plans?&lt;/h3&gt;
&lt;p&gt;I do not plan to use that board for any serious stuff. More as a device to learn
how &lt;span class="caps"&gt;EBBR&lt;/span&gt; world looks. Boot sequence with U-Boot loading Grub from &lt;span class="caps"&gt;EFI&lt;/span&gt; system
partition looks&amp;nbsp;good.&lt;/p&gt;
&lt;p&gt;There are some things which need work. I want to have boot firmware stored in
&lt;span class="caps"&gt;SPI&lt;/span&gt; flash as now I have &lt;span class="caps"&gt;1GB&lt;/span&gt; microsd card in slot just to have U-Boot&amp;nbsp;loaded.&lt;/p&gt;
&lt;p&gt;There are some changes in U-Boot waiting for someone to test, &lt;span class="caps"&gt;USB&lt;/span&gt;-C port is not
enabled at all (it should work as &lt;span class="caps"&gt;USB&lt;/span&gt; 3 and&amp;nbsp;DisplayPort). &lt;/p&gt;
&lt;p&gt;So who knows&amp;nbsp;:D&lt;/p&gt;</content><category term="aarch64"/><category term="linux"/><category term="sbc"/><category term="rockpro64"/></entry><entry><title>Red Hat Platform Enablement meeting week</title><link href="https://marcin.juszkiewicz.com.pl/2018/11/20/red-hat-platform-enablement-meeting-week/" rel="alternate"/><published>2018-11-20T12:54:00+01:00</published><updated>2018-11-20T12:54:00+01:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2018-11-20:/2018/11/20/red-hat-platform-enablement-meeting-week/</id><summary type="html">ast week I was in Vancouver, Canada again. At the time when Linux Plumbers conference took place. But it was not the main reason to be there as I came&amp;nbsp;there.</summary><content type="html">&lt;p&gt;Last week I was in Vancouver, Canada again. At the time when Linux Plumbers conference took place. But it was not the main reason as I went there to meet people from Platform Enablement team at Red&amp;nbsp;Hat.&lt;/p&gt;
&lt;h2&gt;Linux&amp;nbsp;Plumbers&lt;/h2&gt;
&lt;p&gt;The idea was simple &amp;#8212; gather everyone in one place at same time and let them talk. Conference was selected to give something else to do at same time. And we were visible &amp;#8212; for 473 attendees about 60 was from Red&amp;nbsp;Hat.&lt;/p&gt;
&lt;figure id="__yafg-figure-1"&gt;
&lt;img alt="Red Hat team before going for team dinner" loading="lazy" src="/files/2018/11/PANO_20181114_184124.vr_-700x.jpg" title="Red Hat team before going for team dinner"&gt;
&lt;figcaption&gt;Red Hat team before going for team dinner&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I was talking with most of &lt;span class="caps"&gt;RH&lt;/span&gt; people to find out who they are, what they are working on etc. It ended in a lot of interesting discussions. Also many talks with non-&lt;span class="caps"&gt;RH&lt;/span&gt; people. The &amp;#8216;so you are &lt;span class="caps"&gt;IBM&lt;/span&gt; now&amp;#8217; phrase happened just a few&amp;nbsp;times.&lt;/p&gt;
&lt;p&gt;There were funny moments too. Like one when &lt;a href="https://airlied.blogspot.com/"&gt;Dave Airlie&lt;/a&gt; responded with &amp;#8220;ah, you are the &amp;#8216;arm64 + radeon guy&amp;#8217;&amp;#8221;&amp;nbsp;;D&lt;/p&gt;
&lt;h2&gt;Vancouver&lt;/h2&gt;
&lt;p&gt;As there was no breakfast option in &amp;#8216;The Burrard&amp;#8217; hotel I went for a walk to find some. Davie street is full of bars, diners, restaurants (but most of them open at 11:00). Interesting graffiti, cannabis stores (as it is now legal in Canada) and lot of &lt;span class="caps"&gt;LGBT&lt;/span&gt; rainbows&amp;nbsp;everywhere.&lt;/p&gt;
&lt;figure id="__yafg-figure-2"&gt;
&lt;img alt="Band graffiti" loading="lazy" src="/files/2018/11/IMG_20181112_0910451-700x.jpg" title="Band graffiti"&gt;
&lt;figcaption&gt;Band graffiti&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-3"&gt;
&lt;img alt="Some &amp;quot;Safe space&amp;quot; monument" loading="lazy" src="/files/2018/11/IMG_20181112_091326-1-700x.jpg" title="Some &amp;quot;Safe space&amp;quot; monument"&gt;
&lt;figcaption&gt;Some &amp;#8220;Safe space&amp;#8221; monument&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-4"&gt;
&lt;img alt="Tanning salon" loading="lazy" src="/files/2018/11/IMG_20181112_101522-700x.jpg" title="Tanning salon"&gt;
&lt;figcaption&gt;Tanning salon&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-5"&gt;
&lt;img alt="Cannabis Store" loading="lazy" src="/files/2018/11/IMG_20181112_091109-700x.jpg" title="Cannabis Store"&gt;
&lt;figcaption&gt;Cannabis Store&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-6"&gt;
&lt;img alt="Fountain" loading="lazy" src="/files/2018/11/IMG_20181112_131143-700x.jpg" title="Fountain"&gt;
&lt;figcaption&gt;Fountain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-7"&gt;
&lt;img alt="Shore" loading="lazy" src="/files/2018/11/IMG_20181112_122328-700x.jpg" title="Shore"&gt;
&lt;figcaption&gt;Shore&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-8"&gt;
&lt;img alt="A-maze-ing Laughter" loading="lazy" src="/files/2018/11/IMG_20181113_072410-1-700x.jpg" title="A-maze-ing Laughter"&gt;
&lt;figcaption&gt;A-maze-ing Laughter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;Toronto&lt;/h2&gt;
&lt;p&gt;Due to one of my flights being cancelled I had to choose: weekend in Vancouver, weekend in Toronto or rebooking whole trip. So I decided to go to Toronto and meet friend&amp;nbsp;there.&lt;/p&gt;
&lt;p&gt;On Saturday I meet Karol and we had long walk. It was good to not discuss about &lt;span class="caps"&gt;ARM&lt;/span&gt; or OpenStack &amp;#8212; we went for visual effects instead as this is Karol&amp;#8217;s area of expertise. Maya, Houdini, Renderman, Mr. X, &lt;span class="caps"&gt;ILM&lt;/span&gt;, Pixar and other names were going over. I was told &amp;#8220;they work on Houdini in that building&amp;#8221; and later &amp;#8220;here Maya is developed&amp;#8221;&amp;nbsp;;D&lt;/p&gt;
&lt;p&gt;So I asked about photo realistic movies &amp;#8212; are they possible now? Turns out that yes, they are. But it is too expensive to&amp;nbsp;make.&lt;/p&gt;
&lt;p&gt;During weekend I did over 20 kilometers by just walking through the city. Some random photos&amp;nbsp;below:&lt;/p&gt;
&lt;figure id="__yafg-figure-9"&gt;
&lt;img alt="Thimble monument" loading="lazy" src="/files/2018/11/IMG_20181117_145339-700x.jpg" title="Thimble monument"&gt;
&lt;figcaption&gt;Thimble monument&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-10"&gt;
&lt;img alt="Pink Panther graffiti" loading="lazy" src="/files/2018/11/IMG_20181117_160543-e1542714349918-700x.jpg" title="Pink Panther graffiti"&gt;
&lt;figcaption&gt;Pink Panther graffiti&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-11"&gt;
&lt;img alt="Dog graffiti" loading="lazy" src="/files/2018/11/IMG_20181118_132046-700x.jpg" title="Dog graffiti"&gt;
&lt;figcaption&gt;Dog graffiti&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-12"&gt;
&lt;img alt="Rabbits graffiti" loading="lazy" src="/files/2018/11/IMG_20181118_132035-700x.jpg" title="Rabbits graffiti"&gt;
&lt;figcaption&gt;Rabbits graffiti&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-13"&gt;
&lt;img alt="Leslieville graffiti" loading="lazy" src="/files/2018/11/IMG_20181118_123933-700x.jpg" title="Leslieville graffiti"&gt;
&lt;figcaption&gt;Leslieville graffiti&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-14"&gt;
&lt;img alt="Together sidewalk graffiti" loading="lazy" src="/files/2018/11/IMG_20181118_115320-700x.jpg" title="Together sidewalk graffiti"&gt;
&lt;figcaption&gt;Together sidewalk graffiti&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-15"&gt;
&lt;img alt="Halloween decorations" loading="lazy" src="/files/2018/11/IMG_20181118_123738-700x.jpg" title="Halloween decorations"&gt;
&lt;figcaption&gt;Halloween decorations&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-16"&gt;
&lt;img alt="Small house between bigger ones" loading="lazy" src="/files/2018/11/IMG_20181118_121806-700x.jpg" title="Small house between bigger ones"&gt;
&lt;figcaption&gt;Small house between bigger ones&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-17"&gt;
&lt;img alt="TORONTO city sign with buildings" loading="lazy" src="/files/2018/11/IMG_20181117_172358-700x.jpg" title="TORONTO city sign with buildings"&gt;
&lt;figcaption&gt;&lt;span class="caps"&gt;TORONTO&lt;/span&gt; city sign with buildings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-18"&gt;
&lt;img alt="TORONTO city sign" loading="lazy" src="/files/2018/11/IMG_20181117_172351-700x.jpg" title="TORONTO city sign"&gt;
&lt;figcaption&gt;&lt;span class="caps"&gt;TORONTO&lt;/span&gt; city sign&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id="__yafg-figure-19"&gt;
&lt;img alt="Me and TORONTO city sign" loading="lazy" src="/files/2018/11/IMG_20181117_172308-700x.jpg" title="Me and TORONTO city sign"&gt;
&lt;figcaption&gt;Me and &lt;span class="caps"&gt;TORONTO&lt;/span&gt; city sign&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It was great week. Despite sleep deprivation&amp;nbsp;;D&lt;/p&gt;</content><category term="aarch64"/><category term="conferences"/><category term="linux"/><category term="red hat"/><category term="travels"/></entry><entry><title>Ctrl-Q issue or “are Firefox developers using Linux at all?”</title><link href="https://marcin.juszkiewicz.com.pl/2018/08/02/ctrl-q-issue-or-are-firefox-developers-using-linux-at-all/" rel="alternate"/><published>2018-08-02T16:54:00+02:00</published><updated>2018-08-02T16:54:00+02:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2018-08-02:/2018/08/02/ctrl-q-issue-or-are-firefox-developers-using-linux-at-all/</id><summary type="html">Some words on why I suspect that none from Mozilla Firefox developers is using Linux anymore. All because of &amp;#8220;Ctrl-Q&amp;#8221; shortcut being such pain in the&amp;nbsp;a..</summary><content type="html">&lt;p&gt;When I started using Linux on my desktop there was only Mozilla based browsers
which were usable. They had different names: Galeon, Firebird, Phoenix, Mozilla
Suite and finally&amp;nbsp;Firefox.&lt;/p&gt;
&lt;p&gt;It worked better or worse but did. There were moments when on &lt;span class="caps"&gt;2GB&lt;/span&gt; ram machine
browser was using 6 gigabytes (which resulted in killing it). Then were moments
when it started to be slower and slower so I moved to Google Chrome&amp;nbsp;instead.&lt;/p&gt;
&lt;p&gt;But still &amp;#8212; Firefox had all those extensions which could do insane amount of
things with how browser looks, how it works etc. But then &lt;a href="/2017/11/27/firefox-quantum/"&gt;Quantum
came&lt;/a&gt; and changed that. Good bye all nice addons.
Hope we meet in other&amp;nbsp;life.&lt;/p&gt;
&lt;p&gt;But what it has with question from post title? Simple, little, annoying thing:
&amp;#8220;Ctrl-Q&amp;#8221; shortcut. Lovely one which everyone is using to close application they
work with. Not that it does not work &amp;#8212; it does. Perfectly. And this is a&amp;nbsp;problem&amp;#8230;&lt;/p&gt;
&lt;p&gt;Imagine you have few browser windows opened. On different virtual desktops. With
several tabs per window. Some open notes there, somewhere some not-finished wiki
edit etc. Normal day. And then you want to close &amp;#8216;funny kitten&amp;#8217; tab and instead
you close all those windows/tabs, drop not finished notes/edits etc. Just
because your finger slipped to&amp;nbsp;&amp;#8220;Ctrl-Q&amp;#8221;.&lt;/p&gt;
&lt;p&gt;For years most of users I know used one of those &amp;#8220;disable ctrl-q shortcut&amp;#8221;
addons to &lt;span class="caps"&gt;NOT&lt;/span&gt; close all browser windows when your finger slips a bit when you
wanted to close a tab (with &amp;#8220;Ctrl-W&amp;#8221;) or switch a tab (with &amp;#8220;Ctrl-Tab&amp;#8221;). Since
Quantum it is not possible at all as there is no way how addon can alter
shortcuts. Or how user can alter shortcut. No Way At&amp;nbsp;All.&lt;/p&gt;
&lt;p&gt;And then it appears that &amp;#8220;Ctrl-Q&amp;#8221; problem exists &lt;strong&gt;only under Linux&lt;/strong&gt;. Under
Microsoft Windows developers of Mozilla Firefox decided that &amp;#8220;Ctrl-&lt;strong&gt;Shift-&lt;/strong&gt;Q&amp;#8221;
will be a good workaround for the problem. Something similar under MacOS. But
Linux still on&amp;nbsp;&amp;#8220;Ctrl-Q&amp;#8221;.&lt;/p&gt;
&lt;p&gt;There is &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1325692"&gt;a bug report&lt;/a&gt;
opened for it but there were 4 major releases of Firefox without any change I
highly doubt that anything will change in this&amp;nbsp;regard.&lt;/p&gt;
&lt;p&gt;Slowly thinking of making &lt;span class="caps"&gt;COPR&lt;/span&gt; repo where I would provide Mozilla Firefox builds
with one patch: removing that &amp;#8220;Ctrl-Q&amp;#8221;&amp;nbsp;shortcut&amp;#8230;&lt;/p&gt;
&lt;h3&gt;2021 &lt;span class="caps"&gt;UPDATE&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 87+ has &amp;#8220;browser.quitShortcut.disabled&amp;#8221; option to get rid of shortcut
from menu. And even without it used it now warns user after shortcut is&amp;nbsp;used:&lt;/p&gt;
&lt;figure id="__yafg-figure-1"&gt;
&lt;img alt="Firefox warning about closing 5 windows after Ctrl-Q use" loading="lazy" src="/files/2021/11/firefox.jpg" title="Firefox warning about closing 5 windows after Ctrl-Q use"&gt;
&lt;figcaption&gt;Firefox warning about closing 5 windows after Ctrl-Q use&lt;/figcaption&gt;
&lt;/figure&gt;</content><category term="desktop"/><category term="fedora"/><category term="firefox"/><category term="linux"/></entry><entry><title>25 years of Red Hat</title><link href="https://marcin.juszkiewicz.com.pl/2018/03/26/25-years-of-red-hat/" rel="alternate"/><published>2018-03-26T20:35:00+02:00</published><updated>2018-03-26T20:35:00+02:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2018-03-26:/2018/03/26/25-years-of-red-hat/</id><summary type="html">&lt;p&gt;Years ago I bought Polish translation of &amp;#8220;Under the radar&amp;#8221; book about how Red Hat was started. Was a good read and went to&amp;nbsp;bookshelf.&lt;/p&gt;
&lt;p&gt;Years passed. In meantime I got hired by Red Hat. To work on Red Hat Enterprise Linux. For AArch64&amp;nbsp;architecture.&lt;/p&gt;
&lt;p&gt;Then one day I was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Years ago I bought Polish translation of &amp;#8220;Under the radar&amp;#8221; book about how Red Hat was started. Was a good read and went to&amp;nbsp;bookshelf.&lt;/p&gt;
&lt;p&gt;Years passed. In meantime I got hired by Red Hat. To work on Red Hat Enterprise Linux. For AArch64&amp;nbsp;architecture.&lt;/p&gt;
&lt;p&gt;Then one day I was talking with my wife about books and I looked at shelf. And found that book again. Took it and&amp;nbsp;said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You know, when I bought that book I did not even dreamt that one day I will be working at Red&amp;nbsp;Hat.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today company turned 25. Amount of time longer than my career. I remember how surprised I was when realised that some of my friends work at company for 20 years&amp;nbsp;already.&lt;/p&gt;
&lt;p&gt;This is the oldest company I worked for. Directly at least as some of the customers of companies I worked in past were probably older. And hope that one day my work title will be &amp;#8220;Retired Software Engineer&amp;#8221; as my wife once said. And that will be at this&amp;nbsp;company.&lt;/p&gt;</content><category term="aarch64"/><category term="books"/><category term="development"/><category term="life"/><category term="linux"/><category term="red hat"/></entry><entry><title>Twenty five years of Linux</title><link href="https://marcin.juszkiewicz.com.pl/2016/08/29/twenty-five-years-of-linux/" rel="alternate"/><published>2016-08-29T13:53:00+02:00</published><updated>2016-08-29T13:53:00+02:00</updated><author><name>Marcin Juszkiewicz</name></author><id>tag:marcin.juszkiewicz.com.pl,2016-08-29:/2016/08/29/twenty-five-years-of-linux/</id><summary type="html">&lt;p&gt;As I came back from &lt;span class="caps"&gt;PTO&lt;/span&gt; I had to dig into work mails. One of threads was about 25 years of Linux and there was a question &amp;#8220;which was your first kernel&amp;#8221; and I thought that it may be not an easy question to&amp;nbsp;answer.&lt;/p&gt;
&lt;p&gt;For me first was 2 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I came back from &lt;span class="caps"&gt;PTO&lt;/span&gt; I had to dig into work mails. One of threads was about 25 years of Linux and there was a question &amp;#8220;which was your first kernel&amp;#8221; and I thought that it may be not an easy question to&amp;nbsp;answer.&lt;/p&gt;
&lt;p&gt;For me first was 2.0.2[6-8] (do not remember) on some Uni server where I got my first Linux account (normally used SunOS and text terminal). I remember that there was simple root exploit we&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;Then 2.0.36 on my Amiga 1200 (Debian &amp;#8216;slink&amp;#8217;) was first I run on my&amp;nbsp;hardware.&lt;/p&gt;
&lt;p&gt;2.2.10 was first I used for longer as it was Debian &amp;#8216;potato&amp;#8217; m68k&amp;nbsp;one.&lt;/p&gt;
&lt;p&gt;2.3.47 was first I cross compiled (on i686/linux for m68k/linux). And it&amp;nbsp;worked!&lt;/p&gt;
&lt;p&gt;2.4.0-test5 was first I built for my x86 desktop once I moved from Amiga/AmigaOS to &lt;span class="caps"&gt;PC&lt;/span&gt;/Debian. I had Duron/600 desktop and old 386 desktop both running same version. Duron got newer ones later, 386 stayed with this one for about year when I returned&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;When I bought Sharp Zaurus &lt;span class="caps"&gt;SL&lt;/span&gt;-5500 &lt;span class="caps"&gt;PDA&lt;/span&gt; 2.4.18-rmk7-pxa3-embeddix was running on it. So this is my first Linux version on mobile device. Next jump was 2.6.11 on Zaurus c760 as first 2.6 one on&amp;nbsp;mobile.&lt;/p&gt;
&lt;p&gt;During OpenZaurus maintaince I started upstreaming kernel patches. 2.6.17 was &lt;a href="/2006/05/23/my-first-linux-26-kernel-patch-accepted/"&gt;first with my patches in&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I had that &lt;a href="/2006/11/10/i-got-progear-1050hx-webpad/"&gt;strange ProGear&lt;/a&gt; webpad &lt;a href="/2007/01/05/backlight-control-working-on-progear/"&gt;I wrote backlight for it&lt;/a&gt; (based on someone&amp;#8217;s code) and 2.6.21 was first with my driver in (and I removed it in&amp;nbsp;3.7).&lt;/p&gt;</content><category term="debian"/><category term="development"/><category term="kernel"/><category term="linux"/><category term="progear"/><category term="zaurus"/></entry></feed>