#ifndef _SONY_FPGA_CMD_H_
#define _SONY_FPGA_CMD_H_
/**
 * @file sony_fpga_cmd.h
 * @brief sony_fpga外部インタフェース定義ファイル
 */
#include <linux/ioctl.h>
#include <linux/types.h>
#define SONY_FPGA_IOC_MAGIC                (0x73)

/**
 * @brief QSFP自己診断シーケンス<br>
 * ライフラインについては抽象的に表記しています。(FPGAとドライバを一緒くたに表記する等)
 *
 * @startuml
 * title QSFP自己診断シーケンス:(監視スレッドの起動)
 *
 * participant "self_ctrl" as Self
 * participant "systemd"
 * participant "xpt_fpga_driver" as xpt
 *
 * participant "qsfp_poll_thread_0" as poll0
 * participant "qsfp_poll_thread_1" as poll1
 * participant "qsfp_poll_thread_2" as poll2
 * participant "xpt_local_if" as devif
 * entity "Local IF 自己診断情報" as diag_data
 * entity "LED状態データ" as led_data
 *
 * == 起動シーケンス ==
 * create Self
 * systemd -> Self : 起動
 * Self -> Self : 初期化ドライバ
 * activate Self
 * |||
 * create xpt
 * Self -> xpt : Probe
 * activate xpt
 * note over xpt
 *  QSFP初期設定、Retimer初期設定等
 * end note
 * |||
 * create poll0
 * xpt -> poll0 : create
 * create poll1
 * xpt -> poll1 : create
 * create poll2
 * xpt -> poll2 : create
 * xpt ->> poll0 ++ : wakeup
 * xpt ->> poll1 ++ : wakeup
 * xpt ->> poll2 ++ : wakeup
 * |||
 * note over poll0 : EXT_IO_01 - 08の監視スレッド(cpu7を指定して実行する)
 *  / note over poll1  : EXT_IO_09 - 16の監視スレッド(cpu8を指定して実行する)
 *  / note over poll2  : EXT_IO_17 - 24の監視スレッド(cpu9を指定して実行する)
 * note right of poll0
 *  ・2Hz点滅制御のため250ms間隔で駆動
 *    ・MOD_PRS_L監視
 *    ・LED点灯・消灯・点滅制御
 *    ・500ms周期でQSFPのステータスをI2Cで収集 (CPUリソース節約のため500ms周期)
 *  ※ 8Port毎にI2C Controllerが用意されている
 * endnote
 * poll0 ->> xpt -- : mod_prs_l情報、QSFP_Status情報の書き込み
 * poll1 ->> xpt -- : mod_prs_l情報、QSFP_Status情報の書き込み
 * poll2 ->> xpt -- : mod_prs_l情報、QSFP_Status情報の書き込み
 * return
 *
 * note over Self, devif : 初期化ドライバ実行後でないとdeviceファイルがないので自己診断できない
 * create devif
 * Self -> devif : create (handler)
 * activate devif
 * note right of devif : handler登録
 * create diag_data
 * devif -> diag_data ** : create
 * note over diag_data : StatusInformationをqsfpの数(24)個分保持
 * create led_data
 * devif -> led_data ** : create
 * note over led_data : 各QSFP毎のLED設定値(24)個分保持
 * |||
 * deactivate devif
 *
 * Self -> devif ++ : Initialize (監視周期)
 * |||
 * note over devif : 監視スレッド起動
 * return
 *
 * == 初期化完了 ==
 *
 * hide footbox
 * @enduml
 * ---
 */

/**
 * @brief QSFP自己診断シーケンス(定常処理)<br>
 *
 * @startuml
 * title QSFP自己診断シーケンス:(定常処理)
 *
 * participant "self_ctrl" as Self
 * participant "xpt_fpga_driver" as xpt
 *
 * participant "qsfp_poll_thread_0" as poll0
 * participant "qsfp_poll_thread_1" as poll1
 * participant "qsfp_poll_thread_2" as poll2
 * participant "xpt_local_if" as devif
 * entity "Local IF 自己診断情報" as diag_data
 * entity "LED状態データ" as led_data
 * note over Self, led_data : ステータス変化通知 : LED設定
 * devif -> devif ++ : 起床
 * |||
 * note over devif : 定常処理
 * loop i = 0 i < qsfp数(24) ; i++
 *     note over devif
 *       RxInformation , TempInformation, OpticalPowerInformation 情報取得
 *     end note
 *     devif -> xpt ++ : SONY_FPGA_GET_QSFP_STATUS(qsfp_number=i)
 *     note right of xpt
 *       xpt_driverが保持するqsfp_status情報を返す
 *       <qsfp_status>
 *       mod_prs_l       :  module present
 *       rx_signal_loss  :  RX信号喪失フラグ
 *       rx_cdr_unlock   :  RX CDRロック外れフラグ
 *       temperature     :  モジュール内部温度
 *       rx_power_ch1    :  RX光信号強度CH1
 *       rx_power_ch2    :  RX光信号強度CH2
 *       rx_power_ch3    :  RX光信号強度CH3
 *       rx_power_ch4    :  RX光信号強度CH4
 *       tx_power_ch1    :  TX光信号強度CH1
 *       tx_power_ch2    :  TX光信号強度CH2
 *       tx_power_ch3    :  TX光信号強度CH3
 *       tx_power_ch4    :  TX光信号強度CH4
 *     end note
 *     return qsfp_status
 *     note over devif : LinkUpInformation情報取得
 *     devif -> xpt ++ : SONY_FPGA_GET_AURORA_STATUS(qsfp_number=1)
 *     |||
 *     note right of xpt : BAR0からAURORA_STATUSをReadして返す
 *     return channel_status
 *     note over devif : channel_statusは0x55555555ならOK\nそれ以外ならエラー
 *     note over devif
 *       8Lane全てChannel Upしている場合、 LED点灯
 *       1～7Lane Channel Upしている場合、 LED点滅(2Hz)
 *       8Lane全てChannel Upしていない場合、LED消灯
 *     end note
 *     devif -> led_data : 設定
 *
 *     devif ->> diag_data : StatusInformationの更新
 *     opt StatusInformationに変化あり
 *       devif -> Self ++ : OnStatusChange(i, StatusInformation)
 *       |||
 *       Self -> : 自己診断変化通知
 *       note right of Self
 *         Menuへの通知コンテキストは要検討 grpcで時間を使ってしまうと監視周期が破綻してしまうため、別スレッドで行うほうが好ましい
 *       end note
 *       |||
 *       return
 *       |||
 *     end
 * end
 * |||
 * devif -> xpt ++ : SONY_FPGA_SET_QSFP_LED(led_param)
 * note over xpt : QSFP毎のLED点灯データを更新（実際の反映はPoll Threadで行う）
 * return
 * deactivate devif
 * |||
 * poll0 -> poll0 ++ : 起床
 * poll1 -> poll1 ++ : 起床
 * poll2 -> poll2 ++ : 起床
 * poll0 -> xpt : mod_prs情報、QSFP Status情報の書き込み
 * poll1 -> xpt : mod_prs情報、QSFP Status情報の書き込み
 * poll2 -> xpt : mod_prs情報、QSFP Status情報の書き込み
 * poll0 -> xpt ++ : LED設定反映
 * return
 * poll1 -> xpt ++ : LED設定反映
 * return
 * poll2 -> xpt ++ : LED設定反映
 * return
 *
 * deactivate poll0
 * deactivate poll1
 * deactivate poll2
 *
 * == QSFP挿抜検出（qsfp_number = 1 が 抜かれた例) ==
 *
 * [-> xpt : QSFP1を抜去
 * poll0 -> poll0 ++ : 起床
 * note over poll0 : QSFP1の不在を確認
 * poll0 -> xpt : mod_prs_lを書込み
 * |||
 * return
 * devif -> devif ++ : 起床
 * devif -> xpt ++ : SONY_FPGA_GET_QSFP_STATUS(qsfp_number=1)
 * |||
 * return qsfp_status(qsfp 1が存在しない)
 * devif -> diag_data : mod_prs_lの変化を保持
 * |||
 * deactivate devif
 * ...
 * note over devif : 1秒後
 * ...
 *
 * [-> xpt : QSFP1を装着
 * poll0 -> poll0 ++ : 起床
 * note over poll0 : QSFP1の存在を確認
 * poll0 -> xpt : mod_prs_lを書込み
 * |||
 * return
 * devif -> devif ++ : 起床
 * devif -> xpt ++ : SONY_FPGA_GET_QSFP_STATUS(qsfp_number=1)
 * |||
 * return qsfp_status(qsfp 1が存在した)
 * devif -> diag_data : mod_prs_lの変化を保持
 * devif -> xpt ++ : SONY_FPGA_GET_AURORA_STATUS(qsfp_number=1)
 * return channel_status
 * opt QSFPの挿抜を検出したら\n(diag_dataとqsfp_statusのmod_prs_lが不一致かつ\n、qsfp_statusのmod_prs_lがpresentの場合)
 * devif -> xpt ++ : SONY_FPGA_QSFP_INITIALIZE((qsfp_number=1)
 * note over xpt : QSFPの初期設定を行う
 * |||
 * return
 * note over devif
 *   QSFP初期化後、次の周期でAURORA Channel Upを
 *   チェックするため状態制御が必要
 *     未装着、検出、AURORA_Linkup待ち、定常
 * end note
 * deactivate devif
 * end
 * ...
 * note over devif : 1秒後
 * ...
 * devif -> devif ++ : 起床
 * devif -> xpt ++ : SONY_FPGA_GET_QSFP_STATUS(qsfp_number=1)
 * |||
 * return qsfp_status(qsfp 1が存在した)
 * note over devif : AURORA Link Upをチェック
 * devif -> xpt ++ : SONY_FPGA_GET_AURORA_STATUS(qsfp_number=1)
 * return channel_status
 * alt channel_upしていない
 *   note over devif: AURORA_RESETを実行
 *   devif -> xpt ++ : SONY_FPGA_QSFP_AURORA_RESET(qsfp_number=1)
 *   |||
 *   return
 *   note over devif
 *     Aurora Reset後次の監視回でLinkupしていなければ再度Aurora Resetを発行する
 *   end note
 * else channel_upした
 *   |||
 *   note over devif : Retimer CDR Resetを発行
 *   devif -> xpt ++ : SONY_FPGA_QSFP_CDR_RESET
 *   |||
 *   return
 *   |||
 * end
 *
 * hide footbox
 *
 * @enduml
 * ---
 */

/**
 * @brief SelfCtrlからの状態取得シーケンス
 * @startuml
 * title SelfCtrlからの状態取得シーケンス
 * participant "self_ctrl" as Self
 * participant "xpt_fpga_driver" as xpt
 *
 * participant "qsfp_poll_thread_0" as poll0
 * participant "qsfp_poll_thread_1" as poll1
 * participant "qsfp_poll_thread_2" as poll2
 * participant "xpt_local_if" as devif
 * entity "Local IF 自己診断情報" as diag_data
 * == 周期処理(30秒周期?) ==
 * activate Self
 * loop XPT_LOCAL_IF_MAX
 * Self -> devif ++ : GetStatus
 * |||
 * return StatusInformation
 * end
 * deactivate Self
 * hide footbox
 * @enduml
 */

/**
 * @brief VideoDescriptor設定シーケンス<br>
 * ライフラインについては抽象的に表記しています。(FPGAとドライバを一緒くたに表記する等)
 *
 * @startuml
 * title Video Dscriptor設定シーケンス
 * actor User
 * create OS
 * [->OS : 起動
 *
 * create "gif-video"
 * create "gif-fpga"
 * create GPU
 * [->GPU : 起動
 * OS -> "gif-video" : Probe
 * activate "gif-video"
 * note right of "gif-video"
 *   Descriptor領域の生成、Video DMA Portの設定等を行う.
 * end note
 * return
 *
 * OS -> "gif-fpga" : Probe
 * activate "gif-fpga"
 * return
 *
 * create User
 * activate User
 * OS -> User : 起動
 *
 * group Video関連初期設定
 *   User -> GPU : GPUメモリ確保
 *   activate GPU
 *   |||
 *   return GPUメモリ
 *   User -> GPU : Attribute Page固定設定 (PIN)
 *   activate GPU
 *   |||
 *   return
 *   |||
 *   User -> "gif-video" : SONY_FPGA_PIN_GPU_MEMORY (GPUメモリ)
 *   activate "gif-video"
 *   "gif-video" -> GPU : nvidia_p2p_get_pages
 *   activate GPU
 *   note right of "gif-video"
 *     物理ページ情報を取得することでDMACに通知できるようにする
 *   end note
 *   return
 *   return
 *
 *   ||50||
 *
 *   loop 0 , Descriptorの数
 *     |||
 *     note over User, GPU
 *       Descriptorは各Port(9port) x ch(1-4ch) x R/W x strip(0-3 or 2?) 個作成する
 *       4Kフォーマットの場合は1ch目だけ設定する。
 *     end note
 *     |||
 *     User -> "gif-video" : SONY_FPGA_MAKE_VIDEO_DESCRIPTOR(gpuオフセット,size)
 *     activate "gif-video"
 *     return handle (Descriptorを識別するもの)
 *     |||
 *     User -> "gif-video" : SONY_FPGA_SET_VIDEO_DESCRIPTOR(port, handle, ch, strip, direction)
 *     activate "gif-video"
 *     note over User, GPU
 *       各DMAポート毎のdmac_mediaレジスタを設定する。
 *     end note
 *     return
 *     |||
 *   end
 *
 *   ||50||
 *
 *   User -> "gif-video" : SONY_FPGA_SET_VIDEO_DMAC(1: enable)
 *   activate "gif-video"
 *   note over User , GPU
 *     Video DMAを開始する。※ 開始タイミングについてはFPGA制約がないか確認が必要
 *   end note
 *   return
 *   |||
 * end
 *
 * == 初期化完了 ==
 *
 * User -> "gif-fpga" : SONY_FPGA_WAIT_VD_INFO
 * activate "gif-fpga"
 *
 * == INT_COUNT(0) ==
 * [->"gif-video" : VD割り込み(0)
 * activate "gif-video"
 * "gif-video"->"gif-video" : Video DMA Read(strip 0)
 * "gif-video"->"gif-video" : Video DMA Write(strip 0)
 * return int_count(0)
 * deactivate "gif-video"
 *
 * note over User , GPU
 * GPU演算処理をstrip毎に行う。
 * end note
 *
 * User -> "gif-fpga" : SONY_FPGA_WAIT_VD_INFO
 * activate "gif-fpga"
 *
 * == INT_COUNT(1) ==
 * [->"gif-video" : VD割り込み(1)
 * activate "gif-video"
 * "gif-video"->"gif-video" : Video DMA Read(strip 1)
 * "gif-video"->"gif-video" : Video DMA Write(strip 1)
 * return int_count(1)
 * deactivate "gif-video"
 *
 * User -> "gif-fpga" : SONY_FPGA_WAIT_VD_INFO
 * activate "gif-fpga"
 *
 * == INT_COUNT(2) ==
 * [->"gif-video" : VD割り込み(2)
 * activate "gif-video"
 * "gif-video"->"gif-video" : Video DMA Read(strip 2)
 * "gif-video"->"gif-video" : Video DMA Write(strip 2)
 * return int_count(2)
 * deactivate "gif-video"
 * hide footbox
 * @enduml
 * ---
 */

/**
 * @brief VD同期レジスタR/Wシーケンス
 * @startuml
 * title VD同期レジスタR/Wシーケンス
 * actor SelfCtrl
 * == サービス起動 ==
 *
 * create SelfCtrl
 * create InitScript
 * SelfCtrl -> InitScript : 実行
 * activate InitScript
 * create gif
 * InitScript -> gif: 生成
 * create swr
 * InitScript -> swr : 生成
 * create sdi
 * InitScript -> sdi : 生成
 * note over InitScript , sdi
 *   ドライバ初期化処理(制御DMAC初期設定)
 * end note
 * return
 * deactivate InitScript
 *
 * create User
 * SelfCtrl -> User : 起動
 * User -> gif : mmap
 * activate gif
 * return DMAバッファへのポインタ
 * User -> swr : mmap
 * activate swr
 * return DMAバッファへのポインタ
 * User -> sdi : mmap
 * activate sdi
 * return DMAバッファへのポインタ
 * note over gif , User
 *   Write DMAはFPGAからCPUへのWriteを指す。
 *   Userから見るとFPGAから情報をReadすることに相当する。
 *   mmapで返るDMAバッファ領域は
 *   Write DMA Buffer (3Page) _ Read DMA Buffer (任意サイズ)となっており、
 *   Read DMA Bufferについてはデバッグ用途でのみ使用する。
 *   Write DMA Bufferは2Page分確保しているが、
 *   FPGAが書き込むデータはFPGA毎に異なる。(SDI Informationの有無等)
 * end note
 *
 * ... アプリケーション初期化処理等...
 *
 * note over User
 *   定常状態へ遷移
 * end note
 *
 * User -> gif : SONY_FPGA_WAIT_VD_INFO
 * activate gif
 * note over gif , User
 *   Write DMAC (ステータスのRead)はint_count(0,4,8...のタイミングで自動的に動作する)
 * end note
 *
 * [->gif : Write DMAC完了(Diag Status 0, Diag Staus 1)
 * [->swr : Write DMAC完了(Diag Status 0, Diag Staus 1)
 * [->sdi : Write DMAC完了(Diag Status 0, Diag Staus 1, SDI Information, Audio/Meta)
 * |||
 * [->gif : VD割り込み(0)
 * return int_count (0)
 *
 * == int_count(0) ==
 * User -> gif : SONY_FPGA_REG_WRITE(Resizer(CH1))
 * activate gif
 * |||
 * return
 *
 * User -> gif : SONY_FPGA_WAIT_VD_INFO
 * activate gif
 * [->gif : VD割り込み(1)
 * return int_count (1)
 *
 * == int_count(1) ==
 * User -> gif : SONY_FPGA_REG_WRITE(MultiViewer(CH1))
 * activate gif
 * |||
 * return
 * User -> gif : SONY_FPGA_REG_WRITE(REF_MGR)
 * activate gif
 * |||
 * return
 *
 * User -> gif : SONY_FPGA_WAIT_VD_INFO
 * activate gif
 * [->gif : VD割り込み(2)
 * return int_count (2)
 *
 * == int_count(2) ==
 * note over gif , User
 *   SONY_FPGA_REG_WRITEは機能ブロック単位に呼び出すこと。タイミングや対象は一例として記載している。
 * end note
 * User -> swr : SONY_FPGA_REG_WRITE(MIX(PP))
 * activate swr
 * |||
 * return
 * User -> swr : SONY_FPGA_REG_WRITE(MIX(ME))
 * activate swr
 * |||
 * return
 * User -> sdi : SONY_FPGA_REG_WRITE(FC)
 * activate sdi
 * |||
 * return
 * User -> sdi : SONY_FPGA_REG_WRITE(HDR)
 * activate sdi
 * |||
 * return
 * User -> gif : SONY_FPGA_WAIT_VD_INFO
 * activate gif
 * [->gif : VD割り込み(3)
 * return int_count (3)
 *
 * == int_count(3) ==
 * alt レジスタ設定完了 case
 *     note over gif , User
 *       必ずしもint_count(3)である必要はない。
 *       各FPGAを同じint_countで設定する必要はない。
 *     end note
 *     User -> gif : SONY_FPGA_REG_UPDATE_OK
 *     activate gif
 *     return
 *     User -> swr : SONY_FPGA_REG_UPDATE_OK
 *     activate swr
 *     return
 *     User -> sdi : SONY_FPGA_REG_UPDATE_OK
 *     activate sdi
 *     return
 * end
 * |||
 * alt 全FPGAレジスタ設定完了 case
 *     note over gif , User
 *       全FPGAのSONY_FPGA_REG_UPDATE_OK呼び出し後に呼び出すこと。
 *       必ずしもint_count(3)である必要はない。
 *     end note
 *     User -> gif : SONY_FPGA_REG_UPDATE_COMPLETED (更新領域の更新)
 *     activate gif
 *     return
 * end
 *
 * par
 * note over gif , User
 *   15msで自動起動。1ms以内に完了することをH/Wにて保証する。
 *   更新判定領域が更新されていない場合は、FPGAへの書込みは行われない。
 * end note
 * gif -> gif : Read DMA + FGPAレジスタ更新
 * else
 * swr -> swr : Read DMA + FPGAレジスタ更新
 * else
 * sdi -> sdi : Read DMA + FPGAレジスタ更新
 * end
 * [->gif : VD割り込み(4)
 * ||100||
 * hide footbox
 * @enduml
 */

/**
 * ---
 * @brief @b デバイスファイル
 * @details     /dev/sony_fpga_xxという名称でデバイスファイルが生成される。xxはfpga名称を示す。<br>
 *              | fpga名称  | 説明                  |
 *              | ----      | ----                  |
 *              | gif       | GIF FPGA              |
 *              | gif_video | GIF FPGA x16 EndPoint |
 *              | swr1      | SWR FPGA(VIF-81)      |
 *              | sdi1      | SDI FPGA              |
 *              | xpt       | XPT FPGA              |
 *              | net1_nem  | NEM FPGA (NET53#1)    |
 *              | net1_bima | BIMA FPGA (NET53#1)   |
 *              | net1_bimb | BIMB FPGA (NET53#1)   |
 *              | net2_nem  | NEM FPGA (NET53#2)    |
 *              | net2_bima | BIMA FPGA (NET53#2)   |
 *              | net2_bimb | BIMB FPGA (NET53#2)   |
 *
 */

/**
 * ---
 * @brief @b ファイルオペレーション
 *
 *  ---
 *
 * @details @b mmap <br>
 *         制御DMAC用のDMAバッファを仮想アドレス空間にマッピングする。
 * @return 仮想アドレス
 * @sa mmap
 * @details 使用方法はPOSIX mmapのとおり。<br>
 * 先頭2PAGE分がWrite DMA Buffer領域、それ以降がRead DMA Buffer領域となる。Read DMA BufferサイズはFPGA毎に異なる。
 *
 * @note
 *  制御DMAC搭載FPGAでのみ有効<br>
 *  Write DMA とはDMACがWriteするという意味なのでFPGAのステータス等をリードすることを示す。<br>
 *  Read DMA とはDMACがReadするという意味なので、アプリケーションからの設定データをDMAで読み、FPGAに反映する。
 *
 *  ---
 */

/**
 * @name 外部インタフェース
 *   @b ioctl <br>
 *   有効なIOCTL番号定義を記述する
 * @{
 */

#ifndef GPU_DISABLE
/**
 * @brief GPU Memory PIN設定
 * @param[in] struct gpu_mem_info
 * @note GIF-Videoでのみ有効 <br>
 *  GPU非搭載時は未定義
 */
#define SONY_FPGA_PIN_GPU_MEMORY      _IOW(SONY_FPGA_IOC_MAGIC, 1, struct gpu_mem_info)
#endif

/**
 * @brief VD割り込み受信
 * @param[out] u32 割り込み位置番号 0から23までのカウンター値
 * @note GIF-FPGAでのみ有効
 */
#define SONY_FPGA_WAIT_VD_INFO    _IOR(SONY_FPGA_IOC_MAGIC, 2, __u32)


/**
 * @brief VD割り込み設定
 * @param[in] u32 0: Disable, 1: Enable(Default)
 */
#define SONY_FPGA_VD_INT_ENABLE   _IOW(SONY_FPGA_IOC_MAGIC, 3, __u32)

/**
 * @brief レジスタ書込み設定
 * @param[in] struct fpga_reg_write_arg
 *
 * @note 機能ブロック毎に設定すること。設定する順序は順不同で良い。
 * @sa SONY_FPGA_CTRL_DMAC_IGNORE_ADDRESS <br>
 *  module_param_ctrl_dmac_debug_enable = 1のとき無視リストに登録されているベースアドレスについては書込みを抑止する。
 */
#define SONY_FPGA_REG_WRITE       _IOW(SONY_FPGA_IOC_MAGIC, 4, struct fpga_reg_write_arg)

/**
 * @brief 全FPGAレジスタ更新完了通知
 * @note 全てのレジスタ更新設定が完了後に1VD内で1度だけ呼ぶこと。GIF-FPGAでのみ有効
 */
#define SONY_FPGA_REG_UPDATE_COMPLETED   _IO(SONY_FPGA_IOC_MAGIC, 5)

/**
 * @brief レジスタ更新完了通知
 * @note 各FPGAのレジスタ更新が完了したことを通知する
 */
#define SONY_FPGA_REG_UPDATE_OK   _IO(SONY_FPGA_IOC_MAGIC, 6)

#ifndef GPU_DISABLE
/**
 * @brief Video転送用 Descriptor作成
 * @param[in] struct video_dmac_region
 * @sa SONY_FPGA_PIN_GPU_MEMORY
 * @note GPU非搭載時は未定義
 */
#define SONY_FPGA_MAKE_VIDEO_DESCRIPTOR  _IOWR(SONY_FPGA_IOC_MAGIC, 7, struct video_dmac_region)

/**
 * @brief Video転送用 Descriptor領域初期化
 * @param なし
 * @details SONY_FPGA_MAKE_VIDEO_DESCRIPTORで設定した情報を消去する<br>
 *  以降はvideo_descriptor領域の先頭から割り当てる。
 * @note debug用途。本番では使用しない予定 <br>
 *  GPU非搭載時は未定義
 */
#define SONY_FPGA_RESET_VIDEO_DESCRIPTOR  _IO(SONY_FPGA_IOC_MAGIC, 8)

/**
 * @brief Video転送用 Descriptor設定
 * @param[in] struct video_dmac_descriptor
 * @note GPU非搭載時は未定義
 */
#define SONY_FPGA_SET_VIDEO_DESCRIPTOR  _IOW(SONY_FPGA_IOC_MAGIC, 9, struct video_dmac_descriptor)

/**
 * @brief Video転送用 Descriptor設定
 * @param[in] u32 enable ::SONY_FPGA_ENABLE , ::SONY_FPGA_DISABLE
 * @note GIF-Videoでのみ有効 <br>
 *  GPU非搭載時は未定義
 */
#define SONY_FPGA_SET_VIDEO_DMAC  _IOW(SONY_FPGA_IOC_MAGIC, 10, __u32)

#endif

/**
 * @brief Master Mode設定
 * @param[in] u32 master_mode @n
 *                [7:4]: Slave FPGA数 @n
 *                [0]: 0: Slave, 1: Master
 * @note for Debug
 */
#define SONY_FPGA_SET_MASTER_MODE _IOW(SONY_FPGA_IOC_MAGIC, 11, __u32)

/**
 * @brief Ctrl DMAC設定
 * @param[in] u32 enable ::SONY_FPGA_ENABLE , ::SONY_FPGA_DISABLE
 */
#define SONY_FPGA_SET_CTRL_DMAC   _IOW(SONY_FPGA_IOC_MAGIC, 12, __u32)

/**
 * @brief Multicast設定
 * @param[in] u32 enable ::SONY_FPGA_ENABLE , ::SONY_FPGA_DISABLE
 * @note GIF-FPGAでのみ有効
 */
#define SONY_FPGA_SET_MULTICAST   _IOW(SONY_FPGA_IOC_MAGIC, 13, __u32)

/**
 * @brief Multicast Address設定
 * @param[in] struct multicast_info
 * @note GIF-FPGAでのみ有効
 */
#define SONY_FPGA_SET_MULTICAST_ADDRESS   _IOW(SONY_FPGA_IOC_MAGIC, 14, struct multicast_info)


/**
 * @brief 制御DMAC無視リスト設定
 * @param[in] struct ctrl_dmac_ignore_list
 * @details Read DMAバッファに登録する際に無視するベースアドレスを登録する。<br>
 * 任意のFPGAで実行した結果が全FPGAに反映される。
 * @note デバッグ用途
 * @sa SONY_FPGA_REG_WRITE
 */
#define SONY_FPGA_CTRL_DMAC_IGNORE_ADDRESS _IOW(SONY_FPGA_IOC_MAGIC, 15, struct ctrl_dmac_ignore_list)

/**
 * @brief 制御DMAC無視リストクリア
 * @details SONY_FPGA_CTRL_DMAC_IGNORE_ADDRESSで設定した無視リストをクリアする。<br>任意のFPGAで実行した結果が全FPGAに反映される。
 * @note デバッグ用途。 排他制御等は未実装。
 */
#define SONY_FPGA_CTRL_DMAC_IGNORE_LIST_CLEAR _IO(SONY_FPGA_IOC_MAGIC, 16)

/**
 * @brief DMAC_FILE ステータス取得
 * @details dmac_file空間のmodule_statusを返す
 */
#define SONY_FPGA_GET_DMAC_FILE_STATUS _IOR(SONY_FPGA_IOC_MAGIC, 17, __u32)

/**
 * @brief Video File Write
 * @details Video FileをDDRに書き込む
 * @param[in] struct video_file_info
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先) <br>
 *       GIF FPGA以外で実行された場合はなにもしない。
 */
#define SONY_FPGA_VIDEO_FILE_WRITE _IOWR(SONY_FPGA_IOC_MAGIC, 18, struct video_file_info)

/**
 * @brief Video File Read
 * @details Video FileをDDRから読み出す
 * @param[in] struct video_file_info
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先) <br>
 *       GIF FPGA以外で実行された場合はなにもしない。
 */
#define SONY_FPGA_VIDEO_FILE_READ _IOWR(SONY_FPGA_IOC_MAGIC, 19, struct video_file_info)

/**
 * @brief SDI OUT CH Enable設定
 * @details SDI OUT CH Enable/Disableを設定する
 * @param[in] __u32 : [31:24] = 0h , [23:00] = SDI OUT 24ch 〜 1chのEnable(0)/Disable(1) ビット 出力抑止対象のCHのBITを立てる
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、NIOSステータス監視を行うため長時間のブロックの可能性あり。(最大90ms程度)<br>
 *       SDI FPGA専用のため、SDI FPGA以外で実行された場合は無処理で正常終了を返す。
 */
#define SONY_FPGA_SET_SDI_OUT_CH               _IOW(SONY_FPGA_IOC_MAGIC, 20, __u32)

/**
 * @brief Ref Lock通知
 * @details Ref LockしたことをSlave基板に通知し、VideoFormat処理を実行させる
 * @param[in] struct video_file_info
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先)
 */
#define SONY_FPGA_REF_LOCK                     _IO(SONY_FPGA_IOC_MAGIC, 21)

/**
 * @brief mute設定
 * @details Audioのmuteを設定する
 * @param[in] __u32 mute<br>
 *     mute[09:00] : CH1〜10を示す(LSB CH1) <br>
 *     mute[25:16] : CH11〜20を示す(LSB CH11) <br>
 *     各CH毎に 0x1: Mute On / 0x0: Mute Offを設定する
 *
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note SDI FPGA以外で実行された場合はなにもせず正常終了する。
 */
#define SONY_FPGA_AUDIO_MUTE                   _IOW(SONY_FPGA_IOC_MAGIC, 22, __u32)

/**
 * @brief Audio File Write
 * @details Audio FileをHBM2に書き込む
 * @param[in] struct audio_file_info
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先) <br>
 *       SDI FPGA以外で実行された場合はなにもしない。
 */
#define SONY_FPGA_AUDIO_FILE_WRITE _IOWR(SONY_FPGA_IOC_MAGIC, 23, struct audio_file_info)

/**
 * @brief Audio File Read
 * @details Audio FileをDDRから読み出す
 * @param[in] struct audio_file_info
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先) <br>
 *       SDI FPGA以外で実行された場合はなにもしない。
 */
#define SONY_FPGA_AUDIO_FILE_READ _IOWR(SONY_FPGA_IOC_MAGIC, 24, struct audio_file_info)

/**
 * @brief SlaveData File Write
 * @details Slave基板のアップデート用データを1ブロック転送する
 * @param[in] struct slavedata_write_info
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先) <br>
 *       GIF/SDI FPGA以外で実行された場合はなにもしない。
 */
#define SONY_FPGA_SLAVEDATA_FILE_WRITE _IOWR(SONY_FPGA_IOC_MAGIC, 25, struct slavedata_write_info)

/**
 * @brief SlaveData Update Progress
 * @details Slave基板のアップデート状態を返す
 * @retval  2: Processing/Wait
 * @retval  4: Done 1Block
 * @retval  8: Error 1Block
 * @retval  1: Done All Block
 * @note ドライバ内で、DMAの完了を待機する。<br>
 *       timeout時間は1sec(暫定)とする。<br>
 *       DMA実行中に実行されたら即時エラーを返す。(前優先) <br>
 *       GIF/SDI FPGA以外で実行された場合はなにもしない。
 */
#define SONY_FPGA_SLAVEDATA_UPDATE_PROGRESS _IOR(SONY_FPGA_IOC_MAGIC, 26, __u32)

/**
 * @brief SlaveData Update Start
 * @details Slave基板のアップデートを開始を通知する
 * @param[in] struct slavedata_start_param
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note アップデート完了通知が発行されるまでPUG FILE機能の使用を制限する
 */
#define SONY_FPGA_SLAVEDATA_UPDATE_START _IOW(SONY_FPGA_IOC_MAGIC, 27, struct slavedata_start_param)

/**
 * @brief SlaveData Update Finish
 * @details Slave基板のアップデートを完了を通知する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note PUG FILEの使用制限を解除する
 */
#define SONY_FPGA_SLAVEDATA_UPDATE_FINISH _IOR(SONY_FPGA_IOC_MAGIC, 28, __u32)

/**
 * @brief SlaveData Update Error Clear
 * @details Slave基板の Error Status を Clear する
 * @param[in] u32 終了コード(Clear 前の file_target の値)
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note SONY_FPGA_SLAVEDATA_UPDATE_PROGRESS で3回エラーとなった時に Error Status を Clear するために呼ぶ
 */
#define SONY_FPGA_SLAVEDATA_UPDATE_ERROR_CLEAR _IOR(SONY_FPGA_IOC_MAGIC, 35, __u32)

/**
 * @}
 */

#define SONY_FPGA_WAIT_VD         _IO(SONY_FPGA_IOC_MAGIC, 29)

#define SONY_FPGA_READ_FRAME_CNT               _IOR(SONY_FPGA_IOC_MAGIC, 30, __u32)
#define SONY_FPGA_CMP_TEST_CTRL                _IOW(SONY_FPGA_IOC_MAGIC, 31, __u32)
#define SONY_FPGA_REFSYNC_MON_CLEAR            _IO(SONY_FPGA_IOC_MAGIC, 32)
#define SONY_FPGA_SET_VIDEO_FORMAT             _IOW(SONY_FPGA_IOC_MAGIC, 33, __u32)
#define SONY_FPGA_SET_VIDEO_TRANSFER           _IOW(SONY_FPGA_IOC_MAGIC, 34, __u32)
#define SONY_FPGA_PAUSE_VIDEO_DMAC             _IO(SONY_FPGA_IOC_MAGIC, 35)
#define SONY_FPGA_RESTART_VIDEO_DMAC           _IO(SONY_FPGA_IOC_MAGIC, 36)
#define SONY_FPGA_VIDEO_FORMAT_INTR            _IO(SONY_FPGA_IOC_MAGIC, 37)
/**
 * @brief (BIM or NEM)-RTP Aurora Reset
 * @details (BIM or NEM)-RTP間のAuroraReset を 発行 する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 */
#define SONY_FPGA_RTP_AURORA_RESET             _IO(SONY_FPGA_IOC_MAGIC, 38)
/**
 * @brief (BIM or XPT)-SWR Aurora Reset
 * @details (BIM or XPT)-SWR間のAuroraReset を 発行 する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 */
#define SONY_FPGA_SWR_AURORA_RESET             _IO(SONY_FPGA_IOC_MAGIC, 39)

/**
 * @brief BIM-XPT Aurora Reset
 * @details BIM-XPT間のAuroraReset を 発行 する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note BIM FPGA以外ではなにもしない
 */
#define SONY_FPGA_XPT_AURORA_RESET             _IO(SONY_FPGA_IOC_MAGIC, 40)

/**
 * @brief XPT-BIM Aurora Reset
 * @details XPT-BIM間のAuroraReset を 発行 する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない
 */
#define SONY_FPGA_BIM_AURORA_RESET             _IO(SONY_FPGA_IOC_MAGIC, 41)

/**
 * @brief XPT Aurora Status取得
 * @details XPT-BIM間のAurora Status を 取得 する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない
 */
#define SONY_FPGA_GET_AURORA_STATUS            _IOR(SONY_FPGA_IOC_MAGIC, 42, struct aurora_status_param)

#define SONY_FPGA_XPT_I2C_TX                   _IOWR(SONY_FPGA_IOC_MAGIC, 43, struct i2c_param)
#define SONY_FPGA_XPT_I2C_RX                   _IOWR(SONY_FPGA_IOC_MAGIC, 44, struct i2c_param)

/**
 * @brief QSFP Status取得
 * @details QSFPの各種ステータスを取得する
 * @param[in/out] qsfp_status_param QSFPステータス
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない
 */
#define SONY_FPGA_GET_QSFP_STATUS              _IOWR(SONY_FPGA_IOC_MAGIC, 45, struct qsfp_status_param)

/**
 * @brief BoxMode設定
 * @details BIM FPGAにBoxMode(OneBox or Stackable)を設定する
 * @param[in] u32 BoxMode
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note BIM FPGA以外ではなにもしない
 */
#define SONY_FPGA_SET_BOX_MODE                 _IOW(SONY_FPGA_IOC_MAGIC, 46, __u32)

/**
 * @brief QSFP LED設定
 * @details QSFP LEDを設定する
 * @param[in] qsfp_led_param LED設定パラメタ
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない
 */
#define SONY_FPGA_SET_QSFP_LED                 _IOW(SONY_FPGA_IOC_MAGIC, 47, struct qsfp_led_param)

/**
 * @brief QSFP Aurora Reset
 * @details QSFPのAurora Resetを行う
 * @param[in] qsfp number
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない. 複数コンテキストでの実行は禁止する
 */
#define SONY_FPGA_QSFP_AURORA_RESET            _IOW(SONY_FPGA_IOC_MAGIC, 48, __u32)

/**
 * @brief QSFP初期設定
 * @details QSFPの初期設定を行う（Module装着時処理)
 * @param[in] qsfp number
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない
 */
#define SONY_FPGA_QSFP_INITIALIZE              _IOW(SONY_FPGA_IOC_MAGIC, 49, __u32)

#define SONY_FPGA_QSFP_PAUSE_THREAD            _IOW(SONY_FPGA_IOC_MAGIC, 50, __u32)
#define SONY_FPGA_QSFP_RESUME_THREAD           _IOW(SONY_FPGA_IOC_MAGIC, 51, __u32)

/**
 * @brief (BIM or NEM)-C2C Aurora Reset
 * @details (BIM or NEM)-C2C間のAuroraReset を 発行 する
 * @param[in] u32 終了コード
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 */
#define SONY_FPGA_C2C_AURORA_RESET             _IO(SONY_FPGA_IOC_MAGIC, 52)

/**
 * @brief QSFP RETIMER CDR Reset実行
 * @details RETIMER CDR Restを行う（Module装着時処理)
 * @param[in] qsfp number
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGA以外ではなにもしない
 */
#define SONY_FPGA_QSFP_CDR_RESET               _IOW(SONY_FPGA_IOC_MAGIC, 53, __u32)
#define SONY_FPGA_SET_VIDEO_DMAC_CHANNEL       _IOW(SONY_FPGA_IOC_MAGIC, 54, struct video_dmac_channel_setting)

/**
 * @brief GIF1/2共有機能の遅延調整回路を有効化する
 * @note GIF1 FPGA以外ではなにもしない
 */
#define SONY_FPGA_ENABLE_GIF_DELAY_ADJUSTMENT  _IO(SONY_FPGA_IOC_MAGIC, 55)

/**
 * @brief AURORA TEST MODE入場
 * @details BIM/XPT FPGAでAurora Test Modeを開始する
 * @param[in] phisical box id
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note XPT FPGAではphicial box idは参照しない
 */
#define SONY_FPGA_ENTER_AURORA_TESTMODE        _IOW(SONY_FPGA_IOC_MAGIC, 56, __u32)

/**
 * @brief AURORA TEST 実行
 * @details BIM/XPT FPGAでAurora Test を実行する
 * @param[out] aurora_test_result
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note 10秒間テスト実行完了を待つ。
 */
#define SONY_FPGA_START_AURORA_TESTMODE        _IOR(SONY_FPGA_IOC_MAGIC, 57, struct aurora_test_result_param)

/**
 * @brief AURORA TEST 実行
 * @details BIM/XPT FPGAでAurora Test を実行する
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 */
#define SONY_FPGA_EXIT_AURORA_TESTMODE        _IO(SONY_FPGA_IOC_MAGIC, 58)

/**
 * @brief RTP AURORA CHECK 実行
 * @details NEM FPGAでAURORA STATUSをチェックする
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 */
#define SONY_FPGA_RTP_AURORA_CHECK            _IO(SONY_FPGA_IOC_MAGIC, 59)

/**
 * @brief AURORA nStop解除実行
 * @details AURORA nStopを解除する
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 */
#define SONY_FPGA_AURORA_NSTOP_RELEASE        _IO(SONY_FPGA_IOC_MAGIC, 60)

/**
 * @brief Serial番号書込
 * @details Serial番号をCADEC内蔵FLASHに書き込む
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note 各基板の代表FPGA以外ではなにもしない
 */
#define SONY_FPGA_WRITE_SERIAL_NUMBER        _IOW(SONY_FPGA_IOC_MAGIC, 61, __u32)

/**
 * @brief AXI_Firewall初期設定
 * @details AXI Firewall初期設定を行う
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note AXI Firewall非搭載FPGAではなにもしない
 */
#define SONY_FPGA_SET_AXI_FIREWALL_WAIT      _IO(SONY_FPGA_IOC_MAGIC, 62)

/**
 * @brief AURORA初期設定
 * @details AURORA初期設定,IO-293のQSFP初期化を行う
 * @return  0: 正常終了 , 0以外: 異常終了 (errnoを参照)
 * @note
 */
#define SONY_FPGA_AURORA_INIT                _IO(SONY_FPGA_IOC_MAGIC, 63)

/**
 * @brief SDI Box起動時の黒マスク設定
 * @details SDI Box起動時の黒マスク処理を行う
 * @param[in] __u32 : 黒マスクのon(1)/off(0)
 * @return  0: 正常終了, 0以外: 異常終了 (errnoを参照)
 * @note SIS FPGA以外ではなにもしない
 */
#define SONY_FPGA_SET_SDI_MUTE           _IOW(SONY_FPGA_IOC_MAGIC, 64, __u32)

/**
 * @brief Auto Reset有効化設定
 * @details Auto Reset有効化処理を行う
 * @param[in] __u32 : Auto Reset有効化のon(1)/off(0)
 * @return  0: 正常終了, 0以外: 異常終了 (errnoを参照)
 * @note SIS FPGA以外ではなにもしない
 */
#define SONY_FPGA_SET_SDI_AUTO_RESET        _IOW(SONY_FPGA_IOC_MAGIC, 65, __u32)

/**
 * @brief VD割り込み受信
 * @param[out] u32 割り込み位置番号 0から23までのカウンター値
 * @param[in]  u32 timeout値(ms)
 * @note GIF-FPGAでのみ有効
 */
#define SONY_FPGA_WAIT_VD_INFO_TIMEOUT      _IOWR(SONY_FPGA_IOC_MAGIC, 66, __u32)

/**
 * @brief MIB回路キック
 * @note BIM-FPGAでのみ有効
 */
#define SONY_FPGA_MIB_START                 _IO(SONY_FPGA_IOC_MAGIC, 67)

/**
 * @brief MIB回路カウンタReset
 * @note NEM-FPGAでのみ有効
 */
#define SONY_FPGA_RESET_MIB_COUNTER         _IO(SONY_FPGA_IOC_MAGIC, 68)

#ifndef __KERNEL__

#include <sys/ioctl.h>

#endif

#ifndef GPU_DISABLE
struct video_dmac_region {
    uint32_t gpu_offset; //!< PINしたGPUメモリ先頭からのオフセット
    uint32_t size;       //!< サイズ PAGE_SIZE(4096byte)の倍数を設定すること
    uint32_t handle;     //!< [out] ハンドル
};

struct video_dmac_descriptor {
    uint32_t port;       //!< ポート
    uint32_t handle;     //!< ハンドル
    uint32_t ch;         //!< チャンネル
    uint32_t strip;      //!< 短冊番号
    uint32_t direction;  //!< 方向 ::DMA_DIRECTION_READ (fpga->gpu), ::DMA_DIRECTION_WRITE (gpu->fpga)
    uint32_t kind;       //!< Descriptorの種類(未定)
};

struct video_dmac_channel_setting {
    uint32_t ch;           //!< チャンネル
    uint32_t write_port;   //!< write_port setting (Enable/Disable)
    uint32_t read_port;    //!< read_port setting (Enable/Disable)
};
#endif

enum {
    SONY_FPGA_DISABLE = 0,  //!< 0:Disable
    SONY_FPGA_ENABLE        //!< 1:Enable
};

enum {
    DMA_DIRECTION_READ = 0, //!< 0:Read  (FPGA->GPU)
    DMA_DIRECTION_WRITE     //!< 1:Write (GPU->FPGA)
};

enum {
    VIDEO_FILE_FORMAT_4096 = 0, //!< Video Fileフォーマット 4K 4096
    VIDEO_FILE_FORMAT_3840,     //!< Video Fileフォーマット 4K 3840
    VIDEO_FILE_FORMAT_1920,     //!< Video Fileフォーマット HD 1920
    VIDEO_FILE_FORMAT_1280,     //!< Video Fileフォーマット HD 1280
    VIDEO_FILE_RES1,
    VIDEO_FILE_RES2,
    VIDEO_FILE_RES3,
    VIDEO_FILE_RES7,
    VIDEO_FILE_THUMB_256,       //!<Video Fileフォーマット サムネイル 256
    VIDEO_FILE_THUMB_240,       //!<Video Fileフォーマット サムネイル 240
    VIDEO_FILE_MAX
};

#ifndef GPU_DISABLE
/**
 * @brief GPUメモリ情報
 */
struct gpu_mem_info {
    void* address; //!< 仮想アドレス
    uint32_t size; //!< サイズ
};
#endif

/**
 * @brief 制御系 DMACレジスタ書込み設定
 */
struct fpga_reg_write_arg {
    uint32_t dst_address;  //!< FPGAベースアドレス
    uint32_t* reg_top;     //!< 読み出し先アドレス
    uint32_t size;         //!< サイズ
};

/**
 * @brief マルチキャストアドレス情報
 */
struct multicast_info {
    uint32_t number;
    uint64_t address;
};

/**
 * @brief 制御DMAC無視リスト
 */
struct ctrl_dmac_ignore_list {
    uint32_t* list_addr;
    uint32_t  size;
};

/**
 * @brief Video File情報 */
struct video_file_info {
    uint32_t  format;           //!< ::VIDEO_FILE_FORMAT_4096 etc
    uint64_t  dst_address;      //!< 転送先アドレス
    uint32_t* buffer_address;   //!< バッファアドレス(4096バイト境界に配置されていること)
    uint32_t  buffer_size;      //!< バッファサイズ
};

/**
 * @brief Audio Header情報
 */
struct audio_header {
    uint8_t   sample_status;  //!< 5Frame Sample Status 0:Sample, 1:Sample+1
    uint8_t   endian;         //!< Endian 0:Little, 1:Big
    uint16_t  ch_assign;      //!< Audio Channel Assign
    uint32_t  payload_size;   //!< Audio Sample Size + padding (byte)
    uint32_t  sample_size;    //!< 有効CH数 x sample数 x 3Byte(24bit)
};
typedef struct audio_header audio_header;

/**
 * @brief Audio File情報
 */
struct audio_file_info {
    audio_header head; //!< Audioヘッダ情報
    uint64_t  target_addr;    //!< HMB2内の対象アドレス(29bit : MSB3bitは0固定)
    uint32_t  next_read;      //!< Next Frame Memory Read Address
    uint32_t* buffer_address; //!< バッファアドレス(4096バイト境界に配置されていること)
    uint32_t  buffer_size;    //!< バッファサイズ(Audioデータブロックサイズ:48KB固定値)
};

/**
 * @brief SlaveData File情報
 */
struct slavedata_write_info {
    uint32_t  block_num;      //!< これから転送するブロック番号
    uint32_t* buffer_address; //!< バッファアドレス(4096バイト境界に配置されていること)
};

enum {
    INSTALL_STATUS_INIT = 0,
    INSTALL_STATUS_FINISH = 1,
    INSTALL_STATUS_PROCESSING = 2,
    INSTALL_STATUS_BLOCK_DONE = 4,
    INSTALL_STATUS_ERROR = 8,
};
enum {
    UPDATE_TARGET_CADEC, //!< CADEC
    UPDATE_TARGET_NIOS,  //!< NIOS
    UPDATE_TARGET_FPGA1, //!< FPGA1
    UPDATE_TARGET_FPGA2  //!< FPGA2
};

/**
 * @brief SlaveUpdate起動パラメタ
 */
struct slavedata_start_param {
    uint32_t  file_target;    //!< 更新対象を選択
    uint32_t  block_count;    //!< ブロック数
};

/**
 * @brief Aurora Statusパラメタ
 */
struct aurora_status_param {
    uint32_t  qsfp_number;    //!< QSFP番号(0〜23)
    uint32_t  status;         //!< channel status<out>
};

enum {
    I2C_QSFP_CTRL_1,
    I2C_QSFP_CTRL_2,
    I2C_QSFP_CTRL_3,
    I2C_RTM,
    I2C_MAX
};

/**
 * @brief XPT I2Cパラメタ
 */
struct i2c_param {
    uint32_t  i2c_bus;        //!< I2C Bus種別 I2C_QSFP_CTRL_x/I2C_RTM
    uint32_t  pci_addr;       //!< I2C Driver Offset Address
    uint32_t  slave_addr;     //!< Slave Address
    uint32_t  i2c_addr;       //!< I2C Register Addr
    uint8_t   buff[256];      //!< buffer
    uint32_t  size;           //!< R/W Size
};

struct qsfp_thresholds {
    uint16_t high_alarm;
    uint16_t low_alarm;
    uint16_t high_warning;
    uint16_t low_warning;
};

/**
 * @brief QSFPの状態(キャッシュ)
 */
struct qsfp_status {
    uint32_t  mod_prs_l;        //!< Module Present
    bool      initialized;      //!< 初期設定完了
    uint8_t   rx_signal_loss;   //!< RX信号喪失フラグ
    uint8_t   rx_cdr_unlock;    //!< RX CDRロック外れフラグ
    int16_t   temperature;      //!< モジュール内部温度
    uint16_t  rx_power_ch1;     //!< RX光信号強度CH1
    uint16_t  rx_power_ch2;     //!< RX光信号強度CH2
    uint16_t  rx_power_ch3;     //!< RX光信号強度CH3
    uint16_t  rx_power_ch4;     //!< RX光信号強度CH4
    uint16_t  tx_power_ch1;     //!< TX光信号強度CH1
    uint16_t  tx_power_ch2;     //!< TX光信号強度CH2
    uint16_t  tx_power_ch3;     //!< TX光信号強度CH3
    uint16_t  tx_power_ch4;     //!< TX光信号強度CH4
    uint8_t   rx_power_mon[2];  //!< RX Power Monitor
    uint8_t   tx_power_mon[2];  //!< TX Power Monitor
    struct qsfp_thresholds rx_power_threshold;  //!< rx power閾値
    struct qsfp_thresholds tx_power_threshold;  //!< tx power閾値
};

enum {
    QSFP1,
    QSFP2,
    QSFP3,
    QSFP4,
    QSFP5,
    QSFP6,
    QSFP7,
    QSFP8,
    QSFP9,
    QSFP10,
    QSFP11,
    QSFP12,
    QSFP13,
    QSFP14,
    QSFP15,
    QSFP16,
    QSFP17,
    QSFP18,
    QSFP19,
    QSFP20,
    QSFP21,
    QSFP22,
    QSFP23,
    QSFP24,
};

/**
 * @brief QSFPステータスパラメタ
 */
struct qsfp_status_param {
    uint32_t qsfp_number;       //!< QSFP番号
    struct qsfp_status status;  //!< QSFP Status
};

enum {
    QSFP_LED_OFF,
    QSFP_LED_ON,
    QSFP_LED_BLINK
};

struct qsfp_led_setting {
    uint32_t qsfp_number;
    uint32_t led_status;
};

/**
 * @brief QSFP LEDパラメタ
 */
struct qsfp_led_param {
    uint32_t num;                       //!< 設定数
    struct qsfp_led_setting* settings;  //!< 設定
};

/**
 * @brief Aurora Test Result
 */
struct aurora_test_result {
    uint32_t connect_result_pri_0;
    uint32_t connect_result_pri_1;
    uint32_t connect_result_meo;
    uint32_t compare_result_pri_0;
    uint32_t compare_result_pri_1;
    uint32_t compare_result_meo;
};

struct aurora_test_result_param {
    uint32_t num;
    struct aurora_test_result* result;
};

#define REGCLR_STATUS_IRQ_NIOS 1
#define REGCLR_STATUS_FILE_TARGET 2
#define REGCLR_STATUS_FILE_BLOCK 4
#define REGCLR_STATUS_CHECKSUM 8
#endif /* _SONY_FPGA_CMD_H_ */
