Zynq Ultrascale+ MPSoC の pinctrl のグループとピン番号の対応

はじめに
----------------------------------------------------------

最近の Linux Kernel には pinctrl というデバイスドライバが追加されています。これは SoC 等の I/O pin の機能を Linux から自由に設定できるためのデバイスドライバです。

Zynq Ultrascale+ MPSoC (以下 ZynqMP) でも、Xilinx が提供している Linux Kernel の v2018.2 版から device tree に設定を記述することにより pinctrl による I/O pin の設定が可能になりました。

この記事では、ZynqMP で pinctrl を設定する際のグループ(後述)とピン番号の対応を説明します。

Zynq Ultrascale+ MPSoC の pinctrl のグループとピン番号の対応表
----------------------------------------------------------

いきなりですが、以下の URL にグループ(後述)と I/O pin のピン番号の対応表を示します。

 * [pinctrl-zynqmp.md(https://gist.github.com/ikwzm/ad21c20f30302324f5dea097b138fd1f)](https://gist.github.com/ikwzm/ad21c20f30302324f5dea097b138fd1f)

この対応表は markdown 形式です。しかし Qiita でこの対応表を表示しようとすると、グループ名が1文字毎に折り返されてしまってとてもとても見辛くなります。しかたがないので github の gist の方に上げてましたので、そちらの方で見てください。


pinctrl の基本的な設定方法
----------------------------------------------------------

### pinctrl の group とは

pinctrl では、幾つかの I/O pin をまとめてグループにすることが出来ます。例えば UART は TxD と RxD の２つの I/O pin を使うので、これらを UART0 というグループにまとめる等のように使います。
グループ名やグループがどの I/O pin を使うかは Linux Kernel の pinctrl デバイスドライバ等に定義されています。

### pinctrl の function とは

SoC は UART や USB 等の機能を持っており、これらの機能を使う際に I/O pin を使います。pinctrl は I/O pin に SoC のどの機能(function)を割り当てるかを設定することが出来ます。
機能の名前は Linux Kernel の pinctrl デバイスドライバ等に定義されています。

### function と group/pin の対応付け

device tree で function と group を対応付けるには、mux ノード内で groups プロパティにグループ名を、function プロパティに機能名を記述します。


```devicetree:
	pinctrl0: pinctrl@ff180000 {
		compatible = "xlnx,zynqmp-pinctrl";

		pinctrl_uart1_default: uart1-default {
			mux {
				groups = "uart0_4_grp";
				function = "uart0";
			};

			conf {
				groups = "uart0_4_grp";
				slew-rate = <SLEW_RATE_SLOW>;
				io-standard = <IO_STANDARD_LVCMOS18>;
			};

			conf-rx {
				pins = "MIO18";
				bias-high-impedance;
			};

			conf-tx {
				pins = "MIO19";
				bias-disable;
				schmitt-cmos = <PIN_INPUT_TYPE_CMOS>;
			};
		};
	};
```

余談: ZynqMP がサポートしているグループとピン番号の配置を調べてみた話
-----------------------------------------------------------------

device tree を自分で記述する際は、ZynqMP がどのようなグループ名を持っていて、そのグループがどの I/O pin を使うかを知る必要があります。ここでは、これらの情報をどのように得たかを説明します。

### Linux Kernel 編

まずは、Linux Kernel のソースコードを調べてみましょう。ここで見ている Linux Kernel は、Xilinx が提供している Linux Kernel の v2018.2 版です。次のようにしてダウンロードしました。

```console
shell$ git clone --depth 1 -b xilinx-v2018.2 https://github.com/Xilinx/linux-xlnx.git linux-xlnx-v2018.2-zynqmp-fpga
```

#### Documentation/devicetree/bindings/pinctrl/xlnx,zynqmp-pinctrl.txt

Linux Kernel のソースコードに Documentation/devicetree/bindings/pinctrl/xlnx,zynqmp-pinctrl.txt というドキュメントがあります。ここに ZynqMP がサポートしているグループ名があります。以下に引用します。

<details><summary>Documentation/devicetree/bindings/pinctrl/xlnx,zynqmp-pinctrl.txt より抜粋（ちょっと長いので折り畳み)</summary><div>

> Valid values for groups are:
> ethernet0_0_grp, ethernet1_0_grp, ethernet2_0_grp,
> ethernet3_0_grp, gemtsu0_0_grp, gemtsu0_1_grp,
> gemtsu0_2_grp, mdio0_0_grp, mdio1_0_grp,
> mdio1_1_grp, mdio2_0_grp, mdio3_0_grp,
> qspi0_0_grp, qspi_ss_0_grp, qspi_fbclk_0_grp,
> spi0_0_grp, spi0_ss_0_grp, spi0_ss_1_grp,
> spi0_ss_2_grp, spi0_1_grp, spi0_ss_3_grp,
> spi0_ss_4_grp, spi0_ss_5_grp, spi0_2_grp,
> spi0_ss_6_grp, spi0_ss_7_grp, spi0_ss_8_grp,
> spi0_3_grp, spi0_ss_9_grp, spi0_ss_10_grp,
> spi0_ss_11_grp, spi0_4_grp, spi0_ss_12_grp,
> spi0_ss_13_grp, spi0_ss_14_grp, spi0_5_grp,
> spi0_ss_15_grp, spi0_ss_16_grp, spi0_ss_17_grp,
> spi1_0_grp, spi1_ss_0_grp, spi1_ss_1_grp,
> spi1_ss_2_grp, spi1_1_grp, spi1_ss_3_grp,
> spi1_ss_4_grp, spi1_ss_5_grp, spi1_2_grp,
> spi1_ss_6_grp, spi1_ss_7_grp, spi1_ss_8_grp,
> spi1_3_grp, spi1_ss_9_grp, spi1_ss_10_grp,
> spi1_ss_11_grp, spi1_4_grp, spi1_ss_12_grp,
> spi1_ss_13_grp, spi1_ss_14_grp, spi1_5_grp,
> spi1_ss_15_grp, spi1_ss_16_grp, spi1_ss_17_grp,
> sdio0_0_grp, sdio0_1_grp, sdio0_2_grp,
> sdio0_3_grp, sdio0_4_grp, sdio0_5_grp,
> sdio0_6_grp, sdio0_7_grp, sdio0_8_grp,
> sdio0_9_grp, sdio0_10_grp, sdio0_11_grp,
> sdio0_12_grp, sdio0_13_grp, sdio0_14_grp,
> sdio0_15_grp, sdio0_16_grp, sdio0_17_grp,
> sdio0_18_grp, sdio0_19_grp, sdio0_20_grp,
> sdio0_21_grp, sdio0_22_grp, sdio0_23_grp,
> sdio0_24_grp, sdio0_25_grp, sdio0_26_grp,
> sdio0_27_grp, sdio0_28_grp, sdio0_29_grp,
> sdio0_30_grp, sdio0_31_grp, sdio0_32_grp,
> sdio0_pc_0_grp, sdio0_cd_0_grp, sdio0_wp_0_grp,
> sdio0_pc_1_grp, sdio0_cd_1_grp, sdio0_wp_1_grp,
> sdio0_pc_2_grp, sdio0_cd_2_grp, sdio0_wp_2_grp,
> sdio1_0_grp, sdio1_1_grp, sdio1_2_grp,
> sdio1_3_grp, sdio1_4_grp, sdio1_5_grp,
> sdio1_6_grp, sdio1_7_grp, sdio1_8_grp,
> sdio1_9_grp, sdio1_10_grp, sdio1_11_grp,
> sdio1_12_grp, sdio1_13_grp, sdio1_14_grp,
> sdio1_15_grp, sdio1_pc_0_grp, sdio1_cd_0_grp,
> sdio1_wp_0_grp, sdio1_pc_1_grp, sdio1_cd_1_grp,
> sdio1_wp_1_grp, nand0_0_grp, nand0_ce_0_grp,
> nand0_rb_0_grp, nand0_dqs_0_grp, nand0_ce_1_grp,
> nand0_rb_1_grp, nand0_dqs_1_grp, can0_0_grp,
> can0_1_grp, can0_2_grp, can0_3_grp,
> can0_4_grp, can0_5_grp, can0_6_grp,
> can0_7_grp, can0_8_grp, can0_9_grp,
> can0_10_grp, can0_11_grp, can0_12_grp,
> can0_13_grp, can0_14_grp, can0_15_grp,
> can0_16_grp, can0_17_grp, can0_18_grp,
> can1_0_grp, can1_1_grp, can1_2_grp,
> can1_3_grp, can1_4_grp, can1_5_grp,
> can1_6_grp, can1_7_grp, can1_8_grp,
> can1_9_grp, can1_10_grp, can1_11_grp,
> can1_12_grp, can1_13_grp, can1_14_grp,
> can1_15_grp, can1_16_grp, can1_17_grp,
> can1_18_grp, can1_19_grp, uart0_0_grp,
> uart0_1_grp, uart0_2_grp, uart0_3_grp,
> uart0_4_grp, uart0_5_grp, uart0_6_grp,
> uart0_7_grp, uart0_8_grp, uart0_9_grp,
> uart0_10_grp, uart0_11_grp, uart0_12_grp,
> uart0_13_grp, uart0_14_grp, uart0_15_grp,
> uart0_16_grp, uart0_17_grp, uart0_18_grp,
> uart1_0_grp, uart1_1_grp, uart1_2_grp,
> uart1_3_grp, uart1_4_grp, uart1_5_grp,
> uart1_6_grp, uart1_7_grp, uart1_8_grp,
> uart1_9_grp, uart1_10_grp, uart1_11_grp,
> uart1_12_grp, uart1_13_grp, uart1_14_grp,
> uart1_15_grp, uart1_16_grp, uart1_17_grp,
> uart1_18_grp, i2c0_0_grp, i2c0_1_grp,
> i2c0_2_grp, i2c0_3_grp, i2c0_4_grp,
> i2c0_5_grp, i2c0_6_grp, i2c0_7_grp,
> i2c0_8_grp, i2c0_9_grp, i2c0_10_grp,
> i2c0_11_grp, i2c0_12_grp, i2c0_13_grp,
> i2c0_14_grp, i2c0_15_grp, i2c0_16_grp,
> i2c0_17_grp, i2c0_18_grp, i2c1_0_grp,
> i2c1_1_grp, i2c1_2_grp, i2c1_3_grp,
> i2c1_4_grp, i2c1_5_grp, i2c1_6_grp,
> i2c1_7_grp, i2c1_8_grp, i2c1_9_grp,
> i2c1_10_grp, i2c1_11_grp, i2c1_12_grp,
> i2c1_13_grp, i2c1_14_grp, i2c1_15_grp,
> i2c1_16_grp, i2c1_17_grp, i2c1_18_grp,
> i2c1_19_grp, ttc0_clk_0_grp, ttc0_wav_0_grp,
> ttc0_clk_1_grp, ttc0_wav_1_grp, ttc0_clk_2_grp,
> ttc0_wav_2_grp, ttc0_clk_3_grp, ttc0_wav_3_grp,
> ttc0_clk_4_grp, ttc0_wav_4_grp, ttc0_clk_5_grp,
> ttc0_wav_5_grp, ttc0_clk_6_grp, ttc0_wav_6_grp,
> ttc0_clk_7_grp, ttc0_wav_7_grp, ttc0_clk_8_grp,
> ttc0_wav_8_grp, ttc1_clk_0_grp, ttc1_wav_0_grp,
> ttc1_clk_1_grp, ttc1_wav_1_grp, ttc1_clk_2_grp,
> ttc1_wav_2_grp, ttc1_clk_3_grp, ttc1_wav_3_grp,
> ttc1_clk_4_grp, ttc1_wav_4_grp, ttc1_clk_5_grp,
> ttc1_wav_5_grp, ttc1_clk_6_grp, ttc1_wav_6_grp,
> ttc1_clk_7_grp, ttc1_wav_7_grp, ttc1_clk_8_grp,
> ttc1_wav_8_grp, ttc2_clk_0_grp, ttc2_wav_0_grp,
> ttc2_clk_1_grp, ttc2_wav_1_grp, ttc2_clk_2_grp,
> ttc2_wav_2_grp, ttc2_clk_3_grp, ttc2_wav_3_grp,
> ttc2_clk_4_grp, ttc2_wav_4_grp, ttc2_clk_5_grp,
> ttc2_wav_5_grp, ttc2_clk_6_grp, ttc2_wav_6_grp,
> ttc2_clk_7_grp, ttc2_wav_7_grp, ttc2_clk_8_grp,
> ttc2_wav_8_grp, ttc3_clk_0_grp, ttc3_wav_0_grp,
> ttc3_clk_1_grp, ttc3_wav_1_grp, ttc3_clk_2_grp,
> ttc3_wav_2_grp, ttc3_clk_3_grp, ttc3_wav_3_grp,
> ttc3_clk_4_grp, ttc3_wav_4_grp, ttc3_clk_5_grp,
> ttc3_wav_5_grp, ttc3_clk_6_grp, ttc3_wav_6_grp,
> ttc3_clk_7_grp, ttc3_wav_7_grp, ttc3_clk_8_grp,
> ttc3_wav_8_grp, swdt0_clk_0_grp, swdt0_rst_0_grp,
> swdt0_clk_1_grp, swdt0_rst_1_grp, swdt0_clk_2_grp,
> swdt0_rst_2_grp, swdt0_clk_3_grp, swdt0_rst_3_grp,
> swdt0_clk_4_grp, swdt0_rst_4_grp, swdt0_clk_5_grp,
> swdt0_rst_5_grp, swdt0_clk_6_grp, swdt0_rst_6_grp,
> swdt0_clk_7_grp, swdt0_rst_7_grp, swdt0_clk_8_grp,
> swdt0_rst_8_grp, swdt0_clk_9_grp, swdt0_rst_9_grp,
> swdt0_clk_10_grp, swdt0_rst_10_grp, swdt0_clk_11_grp,
> swdt0_rst_11_grp, swdt0_clk_12_grp, swdt0_rst_12_grp,
> swdt1_clk_0_grp, swdt1_rst_0_grp, swdt1_clk_1_grp,
> swdt1_rst_1_grp, swdt1_clk_2_grp, swdt1_rst_2_grp,
> swdt1_clk_3_grp, swdt1_rst_3_grp, swdt1_clk_4_grp,
> swdt1_rst_4_grp, swdt1_clk_5_grp, swdt1_rst_5_grp,
> swdt1_clk_6_grp, swdt1_rst_6_grp, swdt1_clk_7_grp,
> swdt1_rst_7_grp, swdt1_clk_8_grp, swdt1_rst_8_grp,
> swdt1_clk_9_grp, swdt1_rst_9_grp, swdt1_clk_10_grp,
> swdt1_rst_10_grp, swdt1_clk_11_grp, swdt1_rst_11_grp,
> swdt1_clk_12_grp, swdt1_rst_12_grp, gpio0_0_grp,
> gpio0_1_grp, gpio0_2_grp, gpio0_3_grp,
> gpio0_4_grp, gpio0_5_grp, gpio0_6_grp,
> gpio0_7_grp, gpio0_8_grp, gpio0_9_grp,
> gpio0_10_grp, gpio0_11_grp, gpio0_12_grp,
> gpio0_13_grp, gpio0_14_grp, gpio0_15_grp,
> gpio0_16_grp, gpio0_17_grp, gpio0_18_grp,
> gpio0_19_grp, gpio0_20_grp, gpio0_21_grp,
> gpio0_22_grp, gpio0_23_grp, gpio0_24_grp,
> gpio0_25_grp, gpio0_26_grp, gpio0_27_grp,
> gpio0_28_grp, gpio0_29_grp, gpio0_30_grp,
> gpio0_31_grp, gpio0_32_grp, gpio0_33_grp,
> gpio0_34_grp, gpio0_35_grp, gpio0_36_grp,
> gpio0_37_grp, gpio0_38_grp, gpio0_39_grp,
> gpio0_40_grp, gpio0_41_grp, gpio0_42_grp,
> gpio0_43_grp, gpio0_44_grp, gpio0_45_grp,
> gpio0_46_grp, gpio0_47_grp, gpio0_48_grp,
> gpio0_49_grp, gpio0_50_grp, gpio0_51_grp,
> gpio0_52_grp, gpio0_53_grp, gpio0_54_grp,
> gpio0_55_grp, gpio0_56_grp, gpio0_57_grp,
> gpio0_58_grp, gpio0_59_grp, gpio0_60_grp,
> gpio0_61_grp, gpio0_62_grp, gpio0_63_grp,
> gpio0_64_grp, gpio0_65_grp, gpio0_66_grp,
> gpio0_67_grp, gpio0_68_grp, gpio0_69_grp,
> gpio0_70_grp, gpio0_71_grp, gpio0_72_grp,
> gpio0_73_grp, gpio0_74_grp, gpio0_75_grp,
> gpio0_76_grp, gpio0_77_grp, usb0_0_grp,
> usb1_0_grp, pmu0_0_grp, pmu0_1_grp,
> pmu0_2_grp, pmu0_3_grp, pmu0_4_grp,
> pmu0_5_grp, pmu0_6_grp, pmu0_7_grp,
> pmu0_8_grp, pmu0_9_grp, pmu0_10_grp,
> pmu0_11_grp, pcie0_0_grp, pcie0_1_grp,
> pcie0_2_grp, pcie0_3_grp, pcie0_4_grp,
> pcie0_5_grp, pcie0_6_grp, pcie0_7_grp,
> csu0_0_grp, csu0_1_grp, csu0_2_grp,
> csu0_3_grp, csu0_4_grp, csu0_5_grp,
> csu0_6_grp, csu0_7_grp, csu0_8_grp,
> csu0_9_grp, csu0_10_grp, csu0_11_grp,
> dpaux0_0_grp, dpaux0_1_grp, dpaux0_2_grp,
> dpaux0_3_grp, pjtag0_0_grp, pjtag0_1_grp,
> pjtag0_2_grp, pjtag0_3_grp, pjtag0_4_grp,
> pjtag0_5_grp, trace0_0_grp, trace0_clk_0_grp,
> trace0_1_grp, trace0_clk_1_grp, trace0_2_grp,
> trace0_clk_2_grp, testscan0_0_grp

</div></details>

とても多いです。しかもグループ名だけが書いてあって、そのグループがどの I/O pin を使うか書いてません。はっきり言って、ほとんど役に立ちません。

#### drivers/pinctrl/pinctrl-zynqmp.c

資料(Documentation/devicetree/bindings/pinctrl/xlnx,zynqmp-pinctrl.txt) がほとんど役に立たなかったので、今度はデバイスドライバのソースコードを直接調べてみましょう。ZynqMP 用の pinctrl のデバイスドライバのソースコードは drivers/pinctrl/pinctrl-zynqmp.c です。

ところが、このソースコードを見てもどこにもそれらしい記述はありません。

実は Xilinx が提供している Linux Kernel の v2018.2 版から、pinctrl や FPGA のロードなどは Linux Kernel が直接行うのではなく、BL31(ARM Trused Firmware Boot Loader Stage 3-1) に依頼するようになっています。drivers/pinctrl/pinctrl-zynqmp.c では、単に BL31 へ要求を丸投げして結果を受けとるためのラッパー関数が定義されているだけです。

BL31(ARM Trused Firmware Boot Loader Stage 3-1) に関しては以下の記事を参照してください。

 * [「UltraZed 向け Debian GNU/Linux (v2018.2版) の構築(Boot Loader編)」 @Qiita](https://qiita.com/ikwzm/items/a0dfef6355cf839ebc08)
 * [「UltraZed 向け Debian GNU/Linux (v2018.2版) の構築(BL31編)」 @Qiita](https://qiita.com/ikwzm/items/4735be0fbdd1e51c7c59)

### ARM Trused Firmware 編
 
次に ARM Trused Firmware のソースコードを調べてみましょう。ここで見ている ARM Trused Firmware は Xilinx が提供している ARM Trused Firmware の v2018.2 です。次のようにしてダウンロードしました。

```console
vivado% git clone https://github.com/Xilinx/arm-trusted-firmware.git
vivado% cd arm-trusted-firmware
vivado% git checkout xilinx-v2018.2
```

#### plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.h

plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.h に pinctrl_group_ids という enum が定義されています。これがそのままデバイスツリーで指定する pinctrl のグループに1対1で対応しているようです。

<details><summary>plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.h より抜粋（ちょっと長いので折り畳み)</summary><div>

```C:plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.h
enum pinctrl_group_ids {
	PINCTRL_GRP_ETHERNET0_0,
	PINCTRL_GRP_ETHERNET1_0,
	PINCTRL_GRP_ETHERNET2_0,
	PINCTRL_GRP_ETHERNET3_0,
	PINCTRL_GRP_GEMTSU0_0,
	PINCTRL_GRP_GEMTSU0_1,
	PINCTRL_GRP_GEMTSU0_2,
	PINCTRL_GRP_MDIO0_0,
	PINCTRL_GRP_MDIO1_0,
	PINCTRL_GRP_MDIO1_1,
	PINCTRL_GRP_MDIO2_0,
	PINCTRL_GRP_MDIO3_0,
	PINCTRL_GRP_QSPI0_0,
	PINCTRL_GRP_QSPI_SS,
	PINCTRL_GRP_QSPI_FBCLK,
	PINCTRL_GRP_SPI0_0,
	PINCTRL_GRP_SPI0_0_SS0,
	PINCTRL_GRP_SPI0_0_SS1,
	PINCTRL_GRP_SPI0_0_SS2,
	PINCTRL_GRP_SPI0_1,
	PINCTRL_GRP_SPI0_1_SS0,
	PINCTRL_GRP_SPI0_1_SS1,
	PINCTRL_GRP_SPI0_1_SS2,
	PINCTRL_GRP_SPI0_2,
	PINCTRL_GRP_SPI0_2_SS0,
	PINCTRL_GRP_SPI0_2_SS1,
	PINCTRL_GRP_SPI0_2_SS2,
	PINCTRL_GRP_SPI0_3,
	PINCTRL_GRP_SPI0_3_SS0,
	PINCTRL_GRP_SPI0_3_SS1,
	PINCTRL_GRP_SPI0_3_SS2,
	PINCTRL_GRP_SPI0_4,
	PINCTRL_GRP_SPI0_4_SS0,
	PINCTRL_GRP_SPI0_4_SS1,
	PINCTRL_GRP_SPI0_4_SS2,
	PINCTRL_GRP_SPI0_5,
	PINCTRL_GRP_SPI0_5_SS0,
	PINCTRL_GRP_SPI0_5_SS1,
	PINCTRL_GRP_SPI0_5_SS2,
	PINCTRL_GRP_SPI1_0,
	PINCTRL_GRP_SPI1_0_SS0,
	PINCTRL_GRP_SPI1_0_SS1,
	PINCTRL_GRP_SPI1_0_SS2,
	PINCTRL_GRP_SPI1_1,
	PINCTRL_GRP_SPI1_1_SS0,
	PINCTRL_GRP_SPI1_1_SS1,
	PINCTRL_GRP_SPI1_1_SS2,
	PINCTRL_GRP_SPI1_2,
	PINCTRL_GRP_SPI1_2_SS0,
	PINCTRL_GRP_SPI1_2_SS1,
	PINCTRL_GRP_SPI1_2_SS2,
	PINCTRL_GRP_SPI1_3,
	PINCTRL_GRP_SPI1_3_SS0,
	PINCTRL_GRP_SPI1_3_SS1,
	PINCTRL_GRP_SPI1_3_SS2,
	PINCTRL_GRP_SPI1_4,
	PINCTRL_GRP_SPI1_4_SS0,
	PINCTRL_GRP_SPI1_4_SS1,
	PINCTRL_GRP_SPI1_4_SS2,
	PINCTRL_GRP_SPI1_5,
	PINCTRL_GRP_SPI1_5_SS0,
	PINCTRL_GRP_SPI1_5_SS1,
	PINCTRL_GRP_SPI1_5_SS2,
	PINCTRL_GRP_SDIO0_0,
	PINCTRL_GRP_SDIO0_1,
	PINCTRL_GRP_SDIO0_2,
	PINCTRL_GRP_SDIO0_4BIT_0_0,
	PINCTRL_GRP_SDIO0_4BIT_0_1,
	PINCTRL_GRP_SDIO0_4BIT_1_0,
	PINCTRL_GRP_SDIO0_4BIT_1_1,
	PINCTRL_GRP_SDIO0_4BIT_2_0,
	PINCTRL_GRP_SDIO0_4BIT_2_1,
	PINCTRL_GRP_SDIO0_1BIT_0_0,
	PINCTRL_GRP_SDIO0_1BIT_0_1,
	PINCTRL_GRP_SDIO0_1BIT_0_2,
	PINCTRL_GRP_SDIO0_1BIT_0_3,
	PINCTRL_GRP_SDIO0_1BIT_0_4,
	PINCTRL_GRP_SDIO0_1BIT_0_5,
	PINCTRL_GRP_SDIO0_1BIT_0_6,
	PINCTRL_GRP_SDIO0_1BIT_0_7,
	PINCTRL_GRP_SDIO0_1BIT_1_0,
	PINCTRL_GRP_SDIO0_1BIT_1_1,
	PINCTRL_GRP_SDIO0_1BIT_1_2,
	PINCTRL_GRP_SDIO0_1BIT_1_3,
	PINCTRL_GRP_SDIO0_1BIT_1_4,
	PINCTRL_GRP_SDIO0_1BIT_1_5,
	PINCTRL_GRP_SDIO0_1BIT_1_6,
	PINCTRL_GRP_SDIO0_1BIT_1_7,
	PINCTRL_GRP_SDIO0_1BIT_2_0,
	PINCTRL_GRP_SDIO0_1BIT_2_1,
	PINCTRL_GRP_SDIO0_1BIT_2_2,
	PINCTRL_GRP_SDIO0_1BIT_2_3,
	PINCTRL_GRP_SDIO0_1BIT_2_4,
	PINCTRL_GRP_SDIO0_1BIT_2_5,
	PINCTRL_GRP_SDIO0_1BIT_2_6,
	PINCTRL_GRP_SDIO0_1BIT_2_7,
	PINCTRL_GRP_SDIO0_0_PC,
	PINCTRL_GRP_SDIO0_0_CD,
	PINCTRL_GRP_SDIO0_0_WP,
	PINCTRL_GRP_SDIO0_1_PC,
	PINCTRL_GRP_SDIO0_1_CD,
	PINCTRL_GRP_SDIO0_1_WP,
	PINCTRL_GRP_SDIO0_2_PC,
	PINCTRL_GRP_SDIO0_2_CD,
	PINCTRL_GRP_SDIO0_2_WP,
	PINCTRL_GRP_SDIO1_0,
	PINCTRL_GRP_SDIO1_4BIT_0_0,
	PINCTRL_GRP_SDIO1_4BIT_0_1,
	PINCTRL_GRP_SDIO1_4BIT_1_0,
	PINCTRL_GRP_SDIO1_1BIT_0_0,
	PINCTRL_GRP_SDIO1_1BIT_0_1,
	PINCTRL_GRP_SDIO1_1BIT_0_2,
	PINCTRL_GRP_SDIO1_1BIT_0_3,
	PINCTRL_GRP_SDIO1_1BIT_0_4,
	PINCTRL_GRP_SDIO1_1BIT_0_5,
	PINCTRL_GRP_SDIO1_1BIT_0_6,
	PINCTRL_GRP_SDIO1_1BIT_0_7,
	PINCTRL_GRP_SDIO1_1BIT_1_0,
	PINCTRL_GRP_SDIO1_1BIT_1_1,
	PINCTRL_GRP_SDIO1_1BIT_1_2,
	PINCTRL_GRP_SDIO1_1BIT_1_3,
	PINCTRL_GRP_SDIO1_0_PC,
	PINCTRL_GRP_SDIO1_0_CD,
	PINCTRL_GRP_SDIO1_0_WP,
	PINCTRL_GRP_SDIO1_1_PC,
	PINCTRL_GRP_SDIO1_1_CD,
	PINCTRL_GRP_SDIO1_1_WP,
	PINCTRL_GRP_NAND0_0,
	PINCTRL_GRP_NAND0_0_CE,
	PINCTRL_GRP_NAND0_0_RB,
	PINCTRL_GRP_NAND0_0_DQS,
	PINCTRL_GRP_NAND0_1_CE,
	PINCTRL_GRP_NAND0_1_RB,
	PINCTRL_GRP_NAND0_1_DQS,
	PINCTRL_GRP_CAN0_0,
	PINCTRL_GRP_CAN0_1,
	PINCTRL_GRP_CAN0_2,
	PINCTRL_GRP_CAN0_3,
	PINCTRL_GRP_CAN0_4,
	PINCTRL_GRP_CAN0_5,
	PINCTRL_GRP_CAN0_6,
	PINCTRL_GRP_CAN0_7,
	PINCTRL_GRP_CAN0_8,
	PINCTRL_GRP_CAN0_9,
	PINCTRL_GRP_CAN0_10,
	PINCTRL_GRP_CAN0_11,
	PINCTRL_GRP_CAN0_12,
	PINCTRL_GRP_CAN0_13,
	PINCTRL_GRP_CAN0_14,
	PINCTRL_GRP_CAN0_15,
	PINCTRL_GRP_CAN0_16,
	PINCTRL_GRP_CAN0_17,
	PINCTRL_GRP_CAN0_18,
	PINCTRL_GRP_CAN1_0,
	PINCTRL_GRP_CAN1_1,
	PINCTRL_GRP_CAN1_2,
	PINCTRL_GRP_CAN1_3,
	PINCTRL_GRP_CAN1_4,
	PINCTRL_GRP_CAN1_5,
	PINCTRL_GRP_CAN1_6,
	PINCTRL_GRP_CAN1_7,
	PINCTRL_GRP_CAN1_8,
	PINCTRL_GRP_CAN1_9,
	PINCTRL_GRP_CAN1_10,
	PINCTRL_GRP_CAN1_11,
	PINCTRL_GRP_CAN1_12,
	PINCTRL_GRP_CAN1_13,
	PINCTRL_GRP_CAN1_14,
	PINCTRL_GRP_CAN1_15,
	PINCTRL_GRP_CAN1_16,
	PINCTRL_GRP_CAN1_17,
	PINCTRL_GRP_CAN1_18,
	PINCTRL_GRP_CAN1_19,
	PINCTRL_GRP_UART0_0,
	PINCTRL_GRP_UART0_1,
	PINCTRL_GRP_UART0_2,
	PINCTRL_GRP_UART0_3,
	PINCTRL_GRP_UART0_4,
	PINCTRL_GRP_UART0_5,
	PINCTRL_GRP_UART0_6,
	PINCTRL_GRP_UART0_7,
	PINCTRL_GRP_UART0_8,
	PINCTRL_GRP_UART0_9,
	PINCTRL_GRP_UART0_10,
	PINCTRL_GRP_UART0_11,
	PINCTRL_GRP_UART0_12,
	PINCTRL_GRP_UART0_13,
	PINCTRL_GRP_UART0_14,
	PINCTRL_GRP_UART0_15,
	PINCTRL_GRP_UART0_16,
	PINCTRL_GRP_UART0_17,
	PINCTRL_GRP_UART0_18,
	PINCTRL_GRP_UART1_0,
	PINCTRL_GRP_UART1_1,
	PINCTRL_GRP_UART1_2,
	PINCTRL_GRP_UART1_3,
	PINCTRL_GRP_UART1_4,
	PINCTRL_GRP_UART1_5,
	PINCTRL_GRP_UART1_6,
	PINCTRL_GRP_UART1_7,
	PINCTRL_GRP_UART1_8,
	PINCTRL_GRP_UART1_9,
	PINCTRL_GRP_UART1_10,
	PINCTRL_GRP_UART1_11,
	PINCTRL_GRP_UART1_12,
	PINCTRL_GRP_UART1_13,
	PINCTRL_GRP_UART1_14,
	PINCTRL_GRP_UART1_15,
	PINCTRL_GRP_UART1_16,
	PINCTRL_GRP_UART1_17,
	PINCTRL_GRP_UART1_18,
	PINCTRL_GRP_I2C0_0,
	PINCTRL_GRP_I2C0_1,
	PINCTRL_GRP_I2C0_2,
	PINCTRL_GRP_I2C0_3,
	PINCTRL_GRP_I2C0_4,
	PINCTRL_GRP_I2C0_5,
	PINCTRL_GRP_I2C0_6,
	PINCTRL_GRP_I2C0_7,
	PINCTRL_GRP_I2C0_8,
	PINCTRL_GRP_I2C0_9,
	PINCTRL_GRP_I2C0_10,
	PINCTRL_GRP_I2C0_11,
	PINCTRL_GRP_I2C0_12,
	PINCTRL_GRP_I2C0_13,
	PINCTRL_GRP_I2C0_14,
	PINCTRL_GRP_I2C0_15,
	PINCTRL_GRP_I2C0_16,
	PINCTRL_GRP_I2C0_17,
	PINCTRL_GRP_I2C0_18,
	PINCTRL_GRP_I2C1_0,
	PINCTRL_GRP_I2C1_1,
	PINCTRL_GRP_I2C1_2,
	PINCTRL_GRP_I2C1_3,
	PINCTRL_GRP_I2C1_4,
	PINCTRL_GRP_I2C1_5,
	PINCTRL_GRP_I2C1_6,
	PINCTRL_GRP_I2C1_7,
	PINCTRL_GRP_I2C1_8,
	PINCTRL_GRP_I2C1_9,
	PINCTRL_GRP_I2C1_10,
	PINCTRL_GRP_I2C1_11,
	PINCTRL_GRP_I2C1_12,
	PINCTRL_GRP_I2C1_13,
	PINCTRL_GRP_I2C1_14,
	PINCTRL_GRP_I2C1_15,
	PINCTRL_GRP_I2C1_16,
	PINCTRL_GRP_I2C1_17,
	PINCTRL_GRP_I2C1_18,
	PINCTRL_GRP_I2C1_19,
	PINCTRL_GRP_TTC0_0_CLK,
	PINCTRL_GRP_TTC0_0_WAV,
	PINCTRL_GRP_TTC0_1_CLK,
	PINCTRL_GRP_TTC0_1_WAV,
	PINCTRL_GRP_TTC0_2_CLK,
	PINCTRL_GRP_TTC0_2_WAV,
	PINCTRL_GRP_TTC0_3_CLK,
	PINCTRL_GRP_TTC0_3_WAV,
	PINCTRL_GRP_TTC0_4_CLK,
	PINCTRL_GRP_TTC0_4_WAV,
	PINCTRL_GRP_TTC0_5_CLK,
	PINCTRL_GRP_TTC0_5_WAV,
	PINCTRL_GRP_TTC0_6_CLK,
	PINCTRL_GRP_TTC0_6_WAV,
	PINCTRL_GRP_TTC0_7_CLK,
	PINCTRL_GRP_TTC0_7_WAV,
	PINCTRL_GRP_TTC0_8_CLK,
	PINCTRL_GRP_TTC0_8_WAV,
	PINCTRL_GRP_TTC1_0_CLK,
	PINCTRL_GRP_TTC1_0_WAV,
	PINCTRL_GRP_TTC1_1_CLK,
	PINCTRL_GRP_TTC1_1_WAV,
	PINCTRL_GRP_TTC1_2_CLK,
	PINCTRL_GRP_TTC1_2_WAV,
	PINCTRL_GRP_TTC1_3_CLK,
	PINCTRL_GRP_TTC1_3_WAV,
	PINCTRL_GRP_TTC1_4_CLK,
	PINCTRL_GRP_TTC1_4_WAV,
	PINCTRL_GRP_TTC1_5_CLK,
	PINCTRL_GRP_TTC1_5_WAV,
	PINCTRL_GRP_TTC1_6_CLK,
	PINCTRL_GRP_TTC1_6_WAV,
	PINCTRL_GRP_TTC1_7_CLK,
	PINCTRL_GRP_TTC1_7_WAV,
	PINCTRL_GRP_TTC1_8_CLK,
	PINCTRL_GRP_TTC1_8_WAV,
	PINCTRL_GRP_TTC2_0_CLK,
	PINCTRL_GRP_TTC2_0_WAV,
	PINCTRL_GRP_TTC2_1_CLK,
	PINCTRL_GRP_TTC2_1_WAV,
	PINCTRL_GRP_TTC2_2_CLK,
	PINCTRL_GRP_TTC2_2_WAV,
	PINCTRL_GRP_TTC2_3_CLK,
	PINCTRL_GRP_TTC2_3_WAV,
	PINCTRL_GRP_TTC2_4_CLK,
	PINCTRL_GRP_TTC2_4_WAV,
	PINCTRL_GRP_TTC2_5_CLK,
	PINCTRL_GRP_TTC2_5_WAV,
	PINCTRL_GRP_TTC2_6_CLK,
	PINCTRL_GRP_TTC2_6_WAV,
	PINCTRL_GRP_TTC2_7_CLK,
	PINCTRL_GRP_TTC2_7_WAV,
	PINCTRL_GRP_TTC2_8_CLK,
	PINCTRL_GRP_TTC2_8_WAV,
	PINCTRL_GRP_TTC3_0_CLK,
	PINCTRL_GRP_TTC3_0_WAV,
	PINCTRL_GRP_TTC3_1_CLK,
	PINCTRL_GRP_TTC3_1_WAV,
	PINCTRL_GRP_TTC3_2_CLK,
	PINCTRL_GRP_TTC3_2_WAV,
	PINCTRL_GRP_TTC3_3_CLK,
	PINCTRL_GRP_TTC3_3_WAV,
	PINCTRL_GRP_TTC3_4_CLK,
	PINCTRL_GRP_TTC3_4_WAV,
	PINCTRL_GRP_TTC3_5_CLK,
	PINCTRL_GRP_TTC3_5_WAV,
	PINCTRL_GRP_TTC3_6_CLK,
	PINCTRL_GRP_TTC3_6_WAV,
	PINCTRL_GRP_TTC3_7_CLK,
	PINCTRL_GRP_TTC3_7_WAV,
	PINCTRL_GRP_TTC3_8_CLK,
	PINCTRL_GRP_TTC3_8_WAV,
	PINCTRL_GRP_SWDT0_0_CLK,
	PINCTRL_GRP_SWDT0_0_RST,
	PINCTRL_GRP_SWDT0_1_CLK,
	PINCTRL_GRP_SWDT0_1_RST,
	PINCTRL_GRP_SWDT0_2_CLK,
	PINCTRL_GRP_SWDT0_2_RST,
	PINCTRL_GRP_SWDT0_3_CLK,
	PINCTRL_GRP_SWDT0_3_RST,
	PINCTRL_GRP_SWDT0_4_CLK,
	PINCTRL_GRP_SWDT0_4_RST,
	PINCTRL_GRP_SWDT0_5_CLK,
	PINCTRL_GRP_SWDT0_5_RST,
	PINCTRL_GRP_SWDT0_6_CLK,
	PINCTRL_GRP_SWDT0_6_RST,
	PINCTRL_GRP_SWDT0_7_CLK,
	PINCTRL_GRP_SWDT0_7_RST,
	PINCTRL_GRP_SWDT0_8_CLK,
	PINCTRL_GRP_SWDT0_8_RST,
	PINCTRL_GRP_SWDT0_9_CLK,
	PINCTRL_GRP_SWDT0_9_RST,
	PINCTRL_GRP_SWDT0_10_CLK,
	PINCTRL_GRP_SWDT0_10_RST,
	PINCTRL_GRP_SWDT0_11_CLK,
	PINCTRL_GRP_SWDT0_11_RST,
	PINCTRL_GRP_SWDT0_12_CLK,
	PINCTRL_GRP_SWDT0_12_RST,
	PINCTRL_GRP_SWDT1_0_CLK,
	PINCTRL_GRP_SWDT1_0_RST,
	PINCTRL_GRP_SWDT1_1_CLK,
	PINCTRL_GRP_SWDT1_1_RST,
	PINCTRL_GRP_SWDT1_2_CLK,
	PINCTRL_GRP_SWDT1_2_RST,
	PINCTRL_GRP_SWDT1_3_CLK,
	PINCTRL_GRP_SWDT1_3_RST,
	PINCTRL_GRP_SWDT1_4_CLK,
	PINCTRL_GRP_SWDT1_4_RST,
	PINCTRL_GRP_SWDT1_5_CLK,
	PINCTRL_GRP_SWDT1_5_RST,
	PINCTRL_GRP_SWDT1_6_CLK,
	PINCTRL_GRP_SWDT1_6_RST,
	PINCTRL_GRP_SWDT1_7_CLK,
	PINCTRL_GRP_SWDT1_7_RST,
	PINCTRL_GRP_SWDT1_8_CLK,
	PINCTRL_GRP_SWDT1_8_RST,
	PINCTRL_GRP_SWDT1_9_CLK,
	PINCTRL_GRP_SWDT1_9_RST,
	PINCTRL_GRP_SWDT1_10_CLK,
	PINCTRL_GRP_SWDT1_10_RST,
	PINCTRL_GRP_SWDT1_11_CLK,
	PINCTRL_GRP_SWDT1_11_RST,
	PINCTRL_GRP_SWDT1_12_CLK,
	PINCTRL_GRP_SWDT1_12_RST,
	PINCTRL_GRP_GPIO0_0,
	PINCTRL_GRP_GPIO0_1,
	PINCTRL_GRP_GPIO0_2,
	PINCTRL_GRP_GPIO0_3,
	PINCTRL_GRP_GPIO0_4,
	PINCTRL_GRP_GPIO0_5,
	PINCTRL_GRP_GPIO0_6,
	PINCTRL_GRP_GPIO0_7,
	PINCTRL_GRP_GPIO0_8,
	PINCTRL_GRP_GPIO0_9,
	PINCTRL_GRP_GPIO0_10,
	PINCTRL_GRP_GPIO0_11,
	PINCTRL_GRP_GPIO0_12,
	PINCTRL_GRP_GPIO0_13,
	PINCTRL_GRP_GPIO0_14,
	PINCTRL_GRP_GPIO0_15,
	PINCTRL_GRP_GPIO0_16,
	PINCTRL_GRP_GPIO0_17,
	PINCTRL_GRP_GPIO0_18,
	PINCTRL_GRP_GPIO0_19,
	PINCTRL_GRP_GPIO0_20,
	PINCTRL_GRP_GPIO0_21,
	PINCTRL_GRP_GPIO0_22,
	PINCTRL_GRP_GPIO0_23,
	PINCTRL_GRP_GPIO0_24,
	PINCTRL_GRP_GPIO0_25,
	PINCTRL_GRP_GPIO0_26,
	PINCTRL_GRP_GPIO0_27,
	PINCTRL_GRP_GPIO0_28,
	PINCTRL_GRP_GPIO0_29,
	PINCTRL_GRP_GPIO0_30,
	PINCTRL_GRP_GPIO0_31,
	PINCTRL_GRP_GPIO0_32,
	PINCTRL_GRP_GPIO0_33,
	PINCTRL_GRP_GPIO0_34,
	PINCTRL_GRP_GPIO0_35,
	PINCTRL_GRP_GPIO0_36,
	PINCTRL_GRP_GPIO0_37,
	PINCTRL_GRP_GPIO0_38,
	PINCTRL_GRP_GPIO0_39,
	PINCTRL_GRP_GPIO0_40,
	PINCTRL_GRP_GPIO0_41,
	PINCTRL_GRP_GPIO0_42,
	PINCTRL_GRP_GPIO0_43,
	PINCTRL_GRP_GPIO0_44,
	PINCTRL_GRP_GPIO0_45,
	PINCTRL_GRP_GPIO0_46,
	PINCTRL_GRP_GPIO0_47,
	PINCTRL_GRP_GPIO0_48,
	PINCTRL_GRP_GPIO0_49,
	PINCTRL_GRP_GPIO0_50,
	PINCTRL_GRP_GPIO0_51,
	PINCTRL_GRP_GPIO0_52,
	PINCTRL_GRP_GPIO0_53,
	PINCTRL_GRP_GPIO0_54,
	PINCTRL_GRP_GPIO0_55,
	PINCTRL_GRP_GPIO0_56,
	PINCTRL_GRP_GPIO0_57,
	PINCTRL_GRP_GPIO0_58,
	PINCTRL_GRP_GPIO0_59,
	PINCTRL_GRP_GPIO0_60,
	PINCTRL_GRP_GPIO0_61,
	PINCTRL_GRP_GPIO0_62,
	PINCTRL_GRP_GPIO0_63,
	PINCTRL_GRP_GPIO0_64,
	PINCTRL_GRP_GPIO0_65,
	PINCTRL_GRP_GPIO0_66,
	PINCTRL_GRP_GPIO0_67,
	PINCTRL_GRP_GPIO0_68,
	PINCTRL_GRP_GPIO0_69,
	PINCTRL_GRP_GPIO0_70,
	PINCTRL_GRP_GPIO0_71,
	PINCTRL_GRP_GPIO0_72,
	PINCTRL_GRP_GPIO0_73,
	PINCTRL_GRP_GPIO0_74,
	PINCTRL_GRP_GPIO0_75,
	PINCTRL_GRP_GPIO0_76,
	PINCTRL_GRP_GPIO0_77,
	PINCTRL_GRP_USB0_0,
	PINCTRL_GRP_USB1_0,
	PINCTRL_GRP_PMU0_0,
	PINCTRL_GRP_PMU0_1,
	PINCTRL_GRP_PMU0_2,
	PINCTRL_GRP_PMU0_3,
	PINCTRL_GRP_PMU0_4,
	PINCTRL_GRP_PMU0_5,
	PINCTRL_GRP_PMU0_6,
	PINCTRL_GRP_PMU0_7,
	PINCTRL_GRP_PMU0_8,
	PINCTRL_GRP_PMU0_9,
	PINCTRL_GRP_PMU0_10,
	PINCTRL_GRP_PMU0_11,
	PINCTRL_GRP_PCIE0_0,
	PINCTRL_GRP_PCIE0_1,
	PINCTRL_GRP_PCIE0_2,
	PINCTRL_GRP_PCIE0_3,
	PINCTRL_GRP_PCIE0_4,
	PINCTRL_GRP_PCIE0_5,
	PINCTRL_GRP_PCIE0_6,
	PINCTRL_GRP_PCIE0_7,
	PINCTRL_GRP_CSU0_0,
	PINCTRL_GRP_CSU0_1,
	PINCTRL_GRP_CSU0_2,
	PINCTRL_GRP_CSU0_3,
	PINCTRL_GRP_CSU0_4,
	PINCTRL_GRP_CSU0_5,
	PINCTRL_GRP_CSU0_6,
	PINCTRL_GRP_CSU0_7,
	PINCTRL_GRP_CSU0_8,
	PINCTRL_GRP_CSU0_9,
	PINCTRL_GRP_CSU0_10,
	PINCTRL_GRP_CSU0_11,
	PINCTRL_GRP_DPAUX0_0,
	PINCTRL_GRP_DPAUX0_1,
	PINCTRL_GRP_DPAUX0_2,
	PINCTRL_GRP_DPAUX0_3,
	PINCTRL_GRP_PJTAG0_0,
	PINCTRL_GRP_PJTAG0_1,
	PINCTRL_GRP_PJTAG0_2,
	PINCTRL_GRP_PJTAG0_3,
	PINCTRL_GRP_PJTAG0_4,
	PINCTRL_GRP_PJTAG0_5,
	PINCTRL_GRP_TRACE0_0,
	PINCTRL_GRP_TRACE0_0_CLK,
	PINCTRL_GRP_TRACE0_1,
	PINCTRL_GRP_TRACE0_1_CLK,
	PINCTRL_GRP_TRACE0_2,
	PINCTRL_GRP_TRACE0_2_CLK,
	PINCTRL_GRP_TESTSCAN0_0,
};
```

</div></details>

#### plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.c

plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.c に zynqmp_pin_groups という配列が定義されています。ここに I/O pin 番号ごとにどのグループに属し得るかが定義されています。

```C:plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.c

static struct zynqmp_pin_group zynqmp_pin_groups[MAX_PIN] = {
	[PINCTRL_PIN_0] = {
		.groups = &((uint16_t []) {
			PINCTRL_GRP_QSPI0_0,
			PINCTRL_GRP_RESERVED,
			PINCTRL_GRP_RESERVED,
			PINCTRL_GRP_TESTSCAN0_0,
			PINCTRL_GRP_RESERVED,
			PINCTRL_GRP_GPIO0_0,
			PINCTRL_GRP_CAN1_0,
			PINCTRL_GRP_I2C1_0,
			PINCTRL_GRP_PJTAG0_0,
			PINCTRL_GRP_SPI0_0,
			PINCTRL_GRP_TTC3_0_CLK,
			PINCTRL_GRP_UART1_0,
			PINCTRL_GRP_TRACE0_0_CLK,
			END_OF_GROUPS,
		}),
	},
	:
	(中略)
	:
};
```

結局、このコードを調べて対応表を作成しました。