114b25846SDingchen Zhang /*
214b25846SDingchen Zhang * Copyright 2019 Advanced Micro Devices, Inc.
314b25846SDingchen Zhang *
414b25846SDingchen Zhang * Permission is hereby granted, free of charge, to any person obtaining a
514b25846SDingchen Zhang * copy of this software and associated documentation files (the "Software"),
614b25846SDingchen Zhang * to deal in the Software without restriction, including without limitation
714b25846SDingchen Zhang * the rights to use, copy, modify, merge, publish, distribute, sublicense,
814b25846SDingchen Zhang * and/or sell copies of the Software, and to permit persons to whom the
914b25846SDingchen Zhang * Software is furnished to do so, subject to the following conditions:
1014b25846SDingchen Zhang *
1114b25846SDingchen Zhang * The above copyright notice and this permission notice shall be included in
1214b25846SDingchen Zhang * all copies or substantial portions of the Software.
1314b25846SDingchen Zhang *
1414b25846SDingchen Zhang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1514b25846SDingchen Zhang * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1614b25846SDingchen Zhang * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1714b25846SDingchen Zhang * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1814b25846SDingchen Zhang * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1914b25846SDingchen Zhang * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2014b25846SDingchen Zhang * OTHER DEALINGS IN THE SOFTWARE.
2114b25846SDingchen Zhang *
2214b25846SDingchen Zhang * Authors: AMD
2314b25846SDingchen Zhang *
2414b25846SDingchen Zhang */
2514b25846SDingchen Zhang
2614b25846SDingchen Zhang #ifndef AMD_DAL_DEV_AMDGPU_DM_AMDGPU_DM_CRC_H_
2714b25846SDingchen Zhang #define AMD_DAL_DEV_AMDGPU_DM_AMDGPU_DM_CRC_H_
2814b25846SDingchen Zhang
2957638021SNicholas Kazlauskas struct drm_crtc;
3057638021SNicholas Kazlauskas struct dm_crtc_state;
3157638021SNicholas Kazlauskas
3214b25846SDingchen Zhang enum amdgpu_dm_pipe_crc_source {
3314b25846SDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_NONE = 0,
3414b25846SDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_CRTC,
35f1cdc98fSDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_CRTC_DITHER,
3614b25846SDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_DPRX,
37f1cdc98fSDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_DPRX_DITHER,
3814b25846SDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_MAX,
3914b25846SDingchen Zhang AMDGPU_DM_PIPE_CRC_SOURCE_INVALID = -1,
4014b25846SDingchen Zhang };
4114b25846SDingchen Zhang
4286bc2219SWayne Lin #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
4358a8467aSWayne Lin #define MAX_CRTC 6
4458a8467aSWayne Lin
45*44cea2bbSWayne Lin enum secure_display_mode {
46*44cea2bbSWayne Lin /* via dmub + psp */
47*44cea2bbSWayne Lin LEGACY_MODE = 0,
48*44cea2bbSWayne Lin /* driver directly */
49*44cea2bbSWayne Lin DISPLAY_CRC_MODE,
50*44cea2bbSWayne Lin SECURE_DISPLAY_MODE_MAX,
51*44cea2bbSWayne Lin };
52*44cea2bbSWayne Lin
5334b6c4b1SWayne Lin struct phy_id_mapping {
5434b6c4b1SWayne Lin bool assigned;
5534b6c4b1SWayne Lin bool is_mst;
5634b6c4b1SWayne Lin uint8_t enc_hw_inst;
5734b6c4b1SWayne Lin u8 lct;
5834b6c4b1SWayne Lin u8 port_num;
5934b6c4b1SWayne Lin u8 rad[8];
6034b6c4b1SWayne Lin };
6134b6c4b1SWayne Lin
629a45ad15SWayne Lin struct crc_data {
639a45ad15SWayne Lin uint32_t crc_R;
649a45ad15SWayne Lin uint32_t crc_G;
659a45ad15SWayne Lin uint32_t crc_B;
669a45ad15SWayne Lin uint32_t frame_count;
679a45ad15SWayne Lin bool crc_ready;
689a45ad15SWayne Lin };
699a45ad15SWayne Lin
709a45ad15SWayne Lin struct crc_info {
719a45ad15SWayne Lin struct crc_data crc[MAX_CRC_WINDOW_NUM];
729a45ad15SWayne Lin struct completion completion;
739a45ad15SWayne Lin spinlock_t lock;
749a45ad15SWayne Lin };
759a45ad15SWayne Lin
76c0459bddSAlan Liu struct crc_window_param {
7762fa035bSAlan Liu uint16_t x_start;
7862fa035bSAlan Liu uint16_t y_start;
7962fa035bSAlan Liu uint16_t x_end;
8062fa035bSAlan Liu uint16_t y_end;
811b11ff76SAlan Liu /* CRC window is activated or not*/
829a45ad15SWayne Lin bool enable;
8386bc2219SWayne Lin /* Update crc window during vertical blank or not */
8486bc2219SWayne Lin bool update_win;
859a65df19SWayne Lin /* skip reading/writing for few frames */
869a65df19SWayne Lin int skip_frame_cnt;
879a65df19SWayne Lin };
889a65df19SWayne Lin
8958a8467aSWayne Lin struct secure_display_crtc_context {
90b8ff7e08SAlan Liu /* work to notify PSP TA*/
919a65df19SWayne Lin struct work_struct notify_ta_work;
92c0459bddSAlan Liu
931b11ff76SAlan Liu /* work to forward ROI to dmcu/dmub */
94c0459bddSAlan Liu struct work_struct forward_roi_work;
951b11ff76SAlan Liu
961b11ff76SAlan Liu struct drm_crtc *crtc;
971b11ff76SAlan Liu
981b11ff76SAlan Liu /* Region of Interest (ROI) */
999a45ad15SWayne Lin struct crc_window roi[MAX_CRC_WINDOW_NUM];
1009a45ad15SWayne Lin
1019a45ad15SWayne Lin struct crc_info crc_info;
102c0459bddSAlan Liu };
10358a8467aSWayne Lin
10458a8467aSWayne Lin struct secure_display_context {
10558a8467aSWayne Lin
10658a8467aSWayne Lin struct secure_display_crtc_context *crtc_ctx;
1079a45ad15SWayne Lin /* Whether dmub support multiple ROI setting */
1089a45ad15SWayne Lin bool support_mul_roi;
109*44cea2bbSWayne Lin enum secure_display_mode op_mode;
11058a8467aSWayne Lin bool phy_mapping_updated;
11158a8467aSWayne Lin int phy_id_mapping_cnt;
11258a8467aSWayne Lin struct phy_id_mapping phy_id_mapping[MAX_CRTC];
11358a8467aSWayne Lin };
11486bc2219SWayne Lin #endif
11586bc2219SWayne Lin
amdgpu_dm_is_valid_crc_source(enum amdgpu_dm_pipe_crc_source source)11614b25846SDingchen Zhang static inline bool amdgpu_dm_is_valid_crc_source(enum amdgpu_dm_pipe_crc_source source)
11714b25846SDingchen Zhang {
118f1cdc98fSDingchen Zhang return (source > AMDGPU_DM_PIPE_CRC_SOURCE_NONE) &&
119f1cdc98fSDingchen Zhang (source < AMDGPU_DM_PIPE_CRC_SOURCE_MAX);
12014b25846SDingchen Zhang }
12114b25846SDingchen Zhang
12214b25846SDingchen Zhang /* amdgpu_dm_crc.c */
12324eb9374SRodrigo Siqueira #ifdef CONFIG_DEBUG_FS
12457638021SNicholas Kazlauskas int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
12557638021SNicholas Kazlauskas struct dm_crtc_state *dm_crtc_state,
12657638021SNicholas Kazlauskas enum amdgpu_dm_pipe_crc_source source);
12714b25846SDingchen Zhang int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name);
12814b25846SDingchen Zhang int amdgpu_dm_crtc_verify_crc_source(struct drm_crtc *crtc,
12914b25846SDingchen Zhang const char *src_name,
13014b25846SDingchen Zhang size_t *values_cnt);
1318fb843d1SDingchen Zhang const char *const *amdgpu_dm_crtc_get_crc_sources(struct drm_crtc *crtc,
1328fb843d1SDingchen Zhang size_t *count);
13314b25846SDingchen Zhang void amdgpu_dm_crtc_handle_crc_irq(struct drm_crtc *crtc);
13414b25846SDingchen Zhang #else
13514b25846SDingchen Zhang #define amdgpu_dm_crtc_set_crc_source NULL
13614b25846SDingchen Zhang #define amdgpu_dm_crtc_verify_crc_source NULL
1378fb843d1SDingchen Zhang #define amdgpu_dm_crtc_get_crc_sources NULL
13814b25846SDingchen Zhang #define amdgpu_dm_crtc_handle_crc_irq(x)
13914b25846SDingchen Zhang #endif
14014b25846SDingchen Zhang
14186bc2219SWayne Lin #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
14286bc2219SWayne Lin bool amdgpu_dm_crc_window_is_activated(struct drm_crtc *crtc);
14386bc2219SWayne Lin void amdgpu_dm_crtc_handle_crc_window_irq(struct drm_crtc *crtc);
14458a8467aSWayne Lin void amdgpu_dm_crtc_secure_display_create_contexts(struct amdgpu_device *adev);
14586bc2219SWayne Lin #else
14686bc2219SWayne Lin #define amdgpu_dm_crc_window_is_activated(x)
14786bc2219SWayne Lin #define amdgpu_dm_crtc_handle_crc_window_irq(x)
148f477c7b5SAlan Liu #define amdgpu_dm_crtc_secure_display_create_contexts(x)
14986bc2219SWayne Lin #endif
15086bc2219SWayne Lin
15114b25846SDingchen Zhang #endif /* AMD_DAL_DEV_AMDGPU_DM_AMDGPU_DM_CRC_H_ */
152