Coelacanth's Dream

AMD が Sound Open Firmware プロジェクトに参加か

AMD のソフトウェアエンジニアであり、オーディオモジュールを担当している Bala Kishore Pati 氏により、
Renoir APU に搭載されている ACP (Audio CoProcessor) のサポートを、SOF (Sound Open Firmware) に追加するプルリクエストが投稿されている。

SOF はプラットフォームとアーキテクチャに依存せずに、オーディオDSP のファームウェアと開発ツールを提供することを目的としたオープンソース・プロジェクトであり、Intel、Google といった巨大な組織がサポートを進めている。
今回 Renoir APU のサポートが追加されることは AMD が SOFプロジェクトに参加することを意味し、ACP のさらなる活用が期待される。
AMD は Stoney RidgePicassoRaven2 (Dali/Pollock) をベースにした Chromebook 向けプロセッサをリリースしており、今後に向けて Chrome OS におけるサポートを強化する狙いもあるのではないかと思われる。
AMD、Chromebook向け “Zen” プロセッサを正式発表 | Coelacanth’s Dream

ACP (Audio CoProcessor)

ACP について少し触れると、CarrizoStoney RidgeRaven とそれ以降の AMD APU に搭載されているオーディオDSP であり、バージョンは Carrizo/ Stoney RidgeACP 2.xRaven/ Picasso/ Raven2/ Renoir/ Lucienne/ Cezanne/ (Barcelo?)ACP 3.x 、そして VanGoghACP 5.x を採用しているとされる。にしても Vega APU を列挙しようとすると長くなる。

AMD が開発している ACP の ALSAドライバーのコードを見ると、スペックらしきものが記述されているが、同バージョンでも対応する機能、フォーマット、チャンネル数、サンプリングレートが異なり、世代が同じだからスペックが同じとか、バージョンが進んでいるから単純に強化されているという訳でもないようだ。
例えばキャプチャ機能だけを見ると、Raven ではサンプリングレートが 8-48 kHZ の範囲で対応していたのが Renoir では 48 kHz で固定となっていたり、RenoirSNDRV_PCM_INFO_BATCH (double buffering) や一部フォーマットの対応が外されたり このあたりは最適化とも捉えられるが している。

Raven (ACP 3.x)

 static const struct snd_pcm_hardware acp3x_pcm_hardware_capture = {
 	.info = SNDRV_PCM_INFO_INTERLEAVED |
 		SNDRV_PCM_INFO_BLOCK_TRANSFER |
 		SNDRV_PCM_INFO_BATCH |
 		SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID |
 		SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
 	.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
 		   SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
 	.channels_min = 2,
 	.channels_max = 2,
 	.rates = SNDRV_PCM_RATE_8000_48000,
 	.rate_min = 8000,
 	.rate_max = 48000,
 	.buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
 	.period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
 	.period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
 	.periods_min = CAPTURE_MIN_NUM_PERIODS,
 	.periods_max = CAPTURE_MAX_NUM_PERIODS,
 };

Renoir (ACP 3.x)

  static const struct snd_pcm_hardware acp_pdm_hardware_capture = {
 	.info = SNDRV_PCM_INFO_INTERLEAVED |
 		SNDRV_PCM_INFO_BLOCK_TRANSFER |
 		SNDRV_PCM_INFO_MMAP |
 		SNDRV_PCM_INFO_MMAP_VALID |
 		SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
 	.formats = SNDRV_PCM_FMTBIT_S32_LE,
 	.channels_min = 2,
 	.channels_max = 2,
 	.rates = SNDRV_PCM_RATE_48000,
 	.rate_min = 48000,
 	.rate_max = 48000,
 	.buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
 	.period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
 	.period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
 	.periods_min = CAPTURE_MIN_NUM_PERIODS,
 	.periods_max = CAPTURE_MAX_NUM_PERIODS,
 };

ACP 5.x になる VanGogh を見ると、キャプチャ部は 8-96 kHZ のサンプリングレートに対応し、フォーマットも Raven と同様のものに戻っている。

 static const struct snd_pcm_hardware acp5x_pcm_hardware_capture = {
 	.info = SNDRV_PCM_INFO_INTERLEAVED |
 		SNDRV_PCM_INFO_BLOCK_TRANSFER |
 		SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID |
 		SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
 	.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
 		   SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
 	.channels_min = 2,
 	.channels_max = 2,
 	.rates = SNDRV_PCM_RATE_8000_96000,
 	.rate_min = 8000,
 	.rate_max = 96000,
 	.buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
 	.period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
 	.period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
 	.periods_min = CAPTURE_MIN_NUM_PERIODS,
 	.periods_max = CAPTURE_MAX_NUM_PERIODS,
 };

サンプリングレートの対応範囲が広がったことは、バージョンが進んだと言える、らしい 部分ではあるが、他の関連するコードを見るに VanGogh の ACP には DeviceID: 0x15E2 が割り当てられているらしく、これは Vega APU と同じ ID。
こういった点も含めて、各 APU に搭載された ACP の相違点やバージョンについて分かりにくいこともあり、ACP はあまり自分には語れない部分ではある。

 #define ACP_DEVICE_ID 0x15E2

それと、上記 SOF へのプルリクエストではドライバー部が DeviceID: 0x15E2 を対象にしており、Renoir プラットフォームというより Vega APU に搭載された ACP をサポートしているのではないかと思われる。1
今後変更されるかもしれないが、VanGogh の ACP も DeviceID: 0x15E2 が割り当てられるのであれば、ACP 5.x のサポートも含んでいることとなる。

参考リンク