€•cDŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ-/translations/zh_CN/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/zh_TW/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/it_IT/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ja_JP/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ko_KR/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/pt_BR/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/sp_SP/admin-guide/perf/hns3-pmu”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ&HNS3 Performance Monitoring Unit (PMU)”h]”hŒ&HNS3 Performance Monitoring Unit (PMU)”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒG/var/lib/git/docbuild/linux/Documentation/admin-guide/perf/hns3-pmu.rst”h´KubhŒ paragraph”“”)”}”(hŒÌHNS3(HiSilicon network system 3) Performance Monitoring Unit (PMU) is an End Point device to collect performance statistics of HiSilicon SoC NIC. On Hip09, each SICL(Super I/O cluster) has one PMU device.”h]”hŒÌHNS3(HiSilicon network system 3) Performance Monitoring Unit (PMU) is an End Point device to collect performance statistics of HiSilicon SoC NIC. On Hip09, each SICL(Super I/O cluster) has one PMU device.”…””}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hŒrHNS3 PMU supports collection of performance statistics such as bandwidth, latency, packet rate and interrupt rate.”h]”hŒrHNS3 PMU supports collection of performance statistics such as bandwidth, latency, packet rate and interrupt rate.”…””}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hh·h²hubhÌ)”}”(hŒ)Each HNS3 PMU supports 8 hardware events.”h]”hŒ)Each HNS3 PMU supports 8 hardware events.”…””}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hh·h²hubh¶)”}”(hhh]”(h»)”}”(hŒHNS3 PMU driver”h]”hŒHNS3 PMU driver”…””}”(hhúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh÷h²hh³hÊh´KubhÌ)”}”(hŒHThe HNS3 PMU driver registers a perf PMU with the name of its sicl id.::”h]”hŒGThe HNS3 PMU driver registers a perf PMU with the name of its sicl id.:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh÷h²hubhŒ literal_block”“”)”}”(hŒ5/sys/bus/event_source/devices/hns3_pmu_sicl_”h]”hŒ5/sys/bus/event_source/devices/hns3_pmu_sicl_”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jh³hÊh´Khh÷h²hubhÌ)”}”(hŒkPMU driver provides description of available events, filter modes, format, identifier and cpumask in sysfs.”h]”hŒkPMU driver provides description of available events, filter modes, format, identifier and cpumask in sysfs.”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh÷h²hubhÌ)”}”(hŒ[The "events" directory describes the event code of all supported events shown in perf list.”h]”hŒ_The “events†directory describes the event code of all supported events shown in perf list.”…””}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh÷h²hubhÌ)”}”(hŒNThe "filtermode" directory describes the supported filter modes of each event.”h]”hŒRThe “filtermode†directory describes the supported filter modes of each event.”…””}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh÷h²hubhÌ)”}”(hŒ‰The "format" directory describes all formats of the config (events) and config1 (filter options) fields of the perf_event_attr structure.”h]”hŒThe “format†directory describes all formats of the config (events) and config1 (filter options) fields of the perf_event_attr structure.”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh÷h²hubhÌ)”}”(hŒ;The "identifier" file shows version of PMU hardware device.”h]”hŒ?The “identifier†file shows version of PMU hardware device.”…””}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K!hh÷h²hubhÌ)”}”(hŒRThe "bdf_min" and "bdf_max" files show the supported bdf range of each pmu device.”h]”hŒZThe “bdf_min†and “bdf_max†files show the supported bdf range of each pmu device.”…””}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K#hh÷h²hubhÌ)”}”(hŒMThe "hw_clk_freq" file shows the hardware clock frequency of each pmu device.”h]”hŒQThe “hw_clk_freq†file shows the hardware clock frequency of each pmu device.”…””}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K&hh÷h²hubhÌ)”}”(hŒ8Example usage of checking event code and subevent code::”h]”hŒ7Example usage of checking event code and subevent code:”…””}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K)hh÷h²hubj)”}”(hŒÏ$# cat /sys/bus/event_source/devices/hns3_pmu_sicl_0/events/dly_tx_normal_to_mac_time config=0x00204 $# cat /sys/bus/event_source/devices/hns3_pmu_sicl_0/events/dly_tx_normal_to_mac_packet_num config=0x10204”h]”hŒÏ$# cat /sys/bus/event_source/devices/hns3_pmu_sicl_0/events/dly_tx_normal_to_mac_time config=0x00204 $# cat /sys/bus/event_source/devices/hns3_pmu_sicl_0/events/dly_tx_normal_to_mac_packet_num config=0x10204”…””}”hj˜sbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´K+hh÷h²hubhÌ)”}”(hŒrEach performance statistic has a pair of events to get two values to calculate real performance data in userspace.”h]”hŒrEach performance statistic has a pair of events to get two values to calculate real performance data in userspace.”…””}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K0hh÷h²hubhÌ)”}”(hŒòThe bits 0~15 of config (here 0x0204) are the true hardware event code. If two events have same value of bits 0~15 of config, that means they are event pair. And the bit 16 of config indicates getting counter 0 or counter 1 of hardware event.”h]”hŒòThe bits 0~15 of config (here 0x0204) are the true hardware event code. If two events have same value of bits 0~15 of config, that means they are event pair. And the bit 16 of config indicates getting counter 0 or counter 1 of hardware event.”…””}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K3hh÷h²hubhÌ)”}”(hŒxAfter getting two values of event pair in userspace, the formula of computation to calculate real performance data is:::”h]”hŒwAfter getting two values of event pair in userspace, the formula of computation to calculate real performance data is::”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K8hh÷h²hubj)”}”(hŒcounter 0 / counter 1”h]”hŒcounter 0 / counter 1”…””}”hjÐsbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´K;hh÷h²hubhÌ)”}”(hŒ1Example usage of checking supported filter mode::”h]”hŒ0Example usage of checking supported filter mode:”…””}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K=hh÷h²hubj)”}”(hŒ$# cat /sys/bus/event_source/devices/hns3_pmu_sicl_0/filtermode/bw_ssu_rpu_byte_num filter mode supported: global/port/port-tc/func/func-queue/”h]”hŒ$# cat /sys/bus/event_source/devices/hns3_pmu_sicl_0/filtermode/bw_ssu_rpu_byte_num filter mode supported: global/port/port-tc/func/func-queue/”…””}”hjìsbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´K?hh÷h²hubhÌ)”}”(hŒExample usage of perf::”h]”hŒExample usage of perf:”…””}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KBhh÷h²hubj)”}”(hX‘$# perf list hns3_pmu_sicl_0/bw_ssu_rpu_byte_num/ [kernel PMU event] hns3_pmu_sicl_0/bw_ssu_rpu_time/ [kernel PMU event] ------------------------------------------ $# perf stat -g -e hns3_pmu_sicl_0/bw_ssu_rpu_byte_num,global=1/ -e hns3_pmu_sicl_0/bw_ssu_rpu_time,global=1/ -I 1000 or $# perf stat -g -e hns3_pmu_sicl_0/config=0x00002,global=1/ -e hns3_pmu_sicl_0/config=0x10002,global=1/ -I 1000”h]”hX‘$# perf list hns3_pmu_sicl_0/bw_ssu_rpu_byte_num/ [kernel PMU event] hns3_pmu_sicl_0/bw_ssu_rpu_time/ [kernel PMU event] ------------------------------------------ $# perf stat -g -e hns3_pmu_sicl_0/bw_ssu_rpu_byte_num,global=1/ -e hns3_pmu_sicl_0/bw_ssu_rpu_time,global=1/ -I 1000 or $# perf stat -g -e hns3_pmu_sicl_0/config=0x00002,global=1/ -e hns3_pmu_sicl_0/config=0x10002,global=1/ -I 1000”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´KDhh÷h²hubh¶)”}”(hhh]”(h»)”}”(hŒ Filter modes”h]”hŒ Filter modes”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KOubhÌ)”}”(hŒ«1. global mode PMU collect performance statistics for all HNS3 PCIe functions of IO DIE. Set the "global" filter option to 1 will enable this mode. Example usage of perf::”h]”hŒ®1. global mode PMU collect performance statistics for all HNS3 PCIe functions of IO DIE. Set the “global†filter option to 1 will enable this mode. Example usage of perf:”…””}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KQhjh²hubj)”}”(hŒC$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,global=1/ -I 1000”h]”hŒC$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,global=1/ -I 1000”…””}”hj5sbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´KVhjh²hubhÌ)”}”(hŒÃ2. port mode PMU collect performance statistic of one whole physical port. The port id is same as mac id. The "tc" filter option must be set to 0xF in this mode, here tc stands for traffic class.”h]”hŒÇ2. port mode PMU collect performance statistic of one whole physical port. The port id is same as mac id. The “tc†filter option must be set to 0xF in this mode, here tc stands for traffic class.”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KXhjh²hubhÌ)”}”(hŒExample usage of perf::”h]”hŒExample usage of perf:”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K]hjh²hubj)”}”(hŒH$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,port=0,tc=0xF/ -I 1000”h]”hŒH$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,port=0,tc=0xF/ -I 1000”…””}”hj_sbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´K_hjh²hubhÌ)”}”(hŒ¾3. port-tc mode PMU collect performance statistic of one tc of physical port. The port id is same as mac id. The "tc" filter option must be set to 0 ~ 7 in this mode. Example usage of perf::”h]”hŒÁ3. port-tc mode PMU collect performance statistic of one tc of physical port. The port id is same as mac id. The “tc†filter option must be set to 0 ~ 7 in this mode. Example usage of perf:”…””}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kahjh²hubj)”}”(hŒF$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,port=0,tc=0/ -I 1000”h]”hŒF$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,port=0,tc=0/ -I 1000”…””}”hj{sbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´Kghjh²hubhÌ)”}”(hŒv4. func mode PMU collect performance statistic of one PF/VF. The function id is BDF of PF/VF, its conversion formula::”h]”hŒu4. func mode PMU collect performance statistic of one PF/VF. The function id is BDF of PF/VF, its conversion formula:”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kihjh²hubj)”}”(hŒ.func = (bus << 8) + (device << 3) + (function)”h]”hŒ.func = (bus << 8) + (device << 3) + (function)”…””}”hj—sbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´Kmhjh²hubhŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hŒTfor example: BDF func 35:00.0 0x3500 35:00.1 0x3501 35:01.0 0x3508 ”h]”(hŒterm”“”)”}”(hŒ for example:”h]”hŒ for example:”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÊh´Kshj¬ubhŒ definition”“”)”}”(hhh]”hÌ)”}”(hŒFBDF func 35:00.0 0x3500 35:00.1 0x3501 35:01.0 0x3508”h]”hŒFBDF func 35:00.0 0x3500 35:00.1 0x3501 35:01.0 0x3508”…””}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KphjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jªh³hÊh´Kshj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjh²hh³hÊh´NubhÌ)”}”(hŒVIn this mode, the "queue" filter option must be set to 0xFFFF. Example usage of perf::”h]”hŒYIn this mode, the “queue†filter option must be set to 0xFFFF. Example usage of perf:”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kuhjh²hubj)”}”(hŒR$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,bdf=0x3500,queue=0xFFFF/ -I 1000”h]”hŒR$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,bdf=0x3500,queue=0xFFFF/ -I 1000”…””}”hjósbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´Kxhjh²hubhÌ)”}”(hŒÍ5. func-queue mode PMU collect performance statistic of one queue of PF/VF. The function id is BDF of PF/VF, the "queue" filter option must be set to the exact queue id of function. Example usage of perf::”h]”hŒÐ5. func-queue mode PMU collect performance statistic of one queue of PF/VF. The function id is BDF of PF/VF, the “queue†filter option must be set to the exact queue id of function. Example usage of perf:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kzhjh²hubj)”}”(hŒM$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,bdf=0x3500,queue=0/ -I 1000”h]”hŒM$# perf stat -a -e hns3_pmu_sicl_0/config=0x1020F,bdf=0x3500,queue=0/ -I 1000”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´K€hjh²hubhÌ)”}”(hŒÓ6. func-intr mode PMU collect performance statistic of one interrupt of PF/VF. The function id is BDF of PF/VF, the "intr" filter option must be set to the exact interrupt id of function. Example usage of perf::”h]”hŒÖ6. func-intr mode PMU collect performance statistic of one interrupt of PF/VF. The function id is BDF of PF/VF, the “intr†filter option must be set to the exact interrupt id of function. Example usage of perf:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K‚hjh²hubj)”}”(hŒL$# perf stat -a -e hns3_pmu_sicl_0/config=0x00301,bdf=0x3500,intr=0/ -I 1000”h]”hŒL$# perf stat -a -e hns3_pmu_sicl_0/config=0x00301,bdf=0x3500,intr=0/ -I 1000”…””}”hj+sbah}”(h]”h ]”h"]”h$]”h&]”j&j'uh1jh³hÊh´Kˆhjh²hubeh}”(h]”Œ filter-modes”ah ]”h"]”Œ filter modes”ah$]”h&]”uh1hµhh÷h²hh³hÊh´KOubeh}”(h]”Œhns3-pmu-driver”ah ]”h"]”Œhns3 pmu driver”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubeh}”(h]”Œ$hns3-performance-monitoring-unit-pmu”ah ]”h"]”Œ&hns3 performance monitoring unit (pmu)”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jtŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jNjKjFjCj>j;uŒ nametypes”}”(jN‰jF‰j>‰uh}”(jKh·jCh÷j;juŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.