188a1c40aSLeo Liu /*
288a1c40aSLeo Liu  * Copyright 2019 Advanced Micro Devices, Inc.
388a1c40aSLeo Liu  *
488a1c40aSLeo Liu  * Permission is hereby granted, free of charge, to any person obtaining a
588a1c40aSLeo Liu  * copy of this software and associated documentation files (the "Software"),
688a1c40aSLeo Liu  * to deal in the Software without restriction, including without limitation
788a1c40aSLeo Liu  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
888a1c40aSLeo Liu  * and/or sell copies of the Software, and to permit persons to whom the
988a1c40aSLeo Liu  * Software is furnished to do so, subject to the following conditions:
1088a1c40aSLeo Liu  *
1188a1c40aSLeo Liu  * The above copyright notice and this permission notice shall be included in
1288a1c40aSLeo Liu  * all copies or substantial portions of the Software.
1388a1c40aSLeo Liu  *
1488a1c40aSLeo Liu  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1588a1c40aSLeo Liu  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1688a1c40aSLeo Liu  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1788a1c40aSLeo Liu  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1888a1c40aSLeo Liu  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1988a1c40aSLeo Liu  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2088a1c40aSLeo Liu  * OTHER DEALINGS IN THE SOFTWARE.
2188a1c40aSLeo Liu  *
2288a1c40aSLeo Liu  */
2388a1c40aSLeo Liu 
2488a1c40aSLeo Liu #ifndef __AMDGPU_JPEG_H__
2588a1c40aSLeo Liu #define __AMDGPU_JPEG_H__
2688a1c40aSLeo Liu 
27edd08fa1SMohammad Zafar Ziya #include "amdgpu_ras.h"
28edd08fa1SMohammad Zafar Ziya 
2945ed97adSJames Zhu #define AMDGPU_MAX_JPEG_INSTANCES	4
3020a30292SSathishkumar S #define AMDGPU_MAX_JPEG_RINGS           10
3120a30292SSathishkumar S #define AMDGPU_MAX_JPEG_RINGS_4_0_3     8
3288a1c40aSLeo Liu 
3314f43e8fSLeo Liu #define AMDGPU_JPEG_HARVEST_JPEG0 (1 << 0)
3414f43e8fSLeo Liu #define AMDGPU_JPEG_HARVEST_JPEG1 (1 << 1)
3514f43e8fSLeo Liu 
360a119d53SSaleemkhan Jamadar #define WREG32_SOC15_JPEG_DPG_MODE(inst_idx, offset, value, indirect)			\
370a119d53SSaleemkhan Jamadar 	do {										\
380a119d53SSaleemkhan Jamadar 		if (!indirect) {							\
390a119d53SSaleemkhan Jamadar 			WREG32_SOC15(JPEG, GET_INST(JPEG, inst_idx),			\
400a119d53SSaleemkhan Jamadar 				     mmUVD_DPG_LMA_DATA, value);			\
410a119d53SSaleemkhan Jamadar 			WREG32_SOC15(							\
420a119d53SSaleemkhan Jamadar 				JPEG, GET_INST(JPEG, inst_idx),				\
430a119d53SSaleemkhan Jamadar 				mmUVD_DPG_LMA_CTL,					\
440a119d53SSaleemkhan Jamadar 				(UVD_DPG_LMA_CTL__READ_WRITE_MASK |			\
450a119d53SSaleemkhan Jamadar 				 offset << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT |	\
460a119d53SSaleemkhan Jamadar 				 indirect << UVD_DPG_LMA_CTL__SRAM_SEL__SHIFT));	\
470a119d53SSaleemkhan Jamadar 		} else {								\
480a119d53SSaleemkhan Jamadar 			*adev->jpeg.inst[inst_idx].dpg_sram_curr_addr++ =		\
490a119d53SSaleemkhan Jamadar 				offset;							\
500a119d53SSaleemkhan Jamadar 			*adev->jpeg.inst[inst_idx].dpg_sram_curr_addr++ =		\
510a119d53SSaleemkhan Jamadar 				value;							\
520a119d53SSaleemkhan Jamadar 		}									\
530a119d53SSaleemkhan Jamadar 	} while (0)
540a119d53SSaleemkhan Jamadar 
550a119d53SSaleemkhan Jamadar #define RREG32_SOC15_JPEG_DPG_MODE(inst_idx, offset, mask_en)					\
560a119d53SSaleemkhan Jamadar 	({											\
570a119d53SSaleemkhan Jamadar 		WREG32_SOC15(JPEG, inst_idx, mmUVD_DPG_LMA_CTL,					\
580a119d53SSaleemkhan Jamadar 			(0x0 << UVD_DPG_LMA_CTL__READ_WRITE__SHIFT |				\
590a119d53SSaleemkhan Jamadar 			mask_en << UVD_DPG_LMA_CTL__MASK_EN__SHIFT |				\
600a119d53SSaleemkhan Jamadar 			offset << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT));			\
610a119d53SSaleemkhan Jamadar 		RREG32_SOC15(JPEG, inst_idx, mmUVD_DPG_LMA_DATA);				\
620a119d53SSaleemkhan Jamadar 	})
630a119d53SSaleemkhan Jamadar 
64d4b8386cSSonny Jiang #define WREG32_SOC24_JPEG_DPG_MODE(inst_idx, offset, value, indirect)		\
65d4b8386cSSonny Jiang 	do {									\
66d4b8386cSSonny Jiang 		WREG32_SOC15(JPEG, GET_INST(JPEG, inst_idx),			\
67d4b8386cSSonny Jiang 			     regUVD_DPG_LMA_DATA, value);			\
68d4b8386cSSonny Jiang 		WREG32_SOC15(JPEG, GET_INST(JPEG, inst_idx),			\
69d4b8386cSSonny Jiang 			     regUVD_DPG_LMA_MASK, 0xFFFFFFFF);			\
70d4b8386cSSonny Jiang 		WREG32_SOC15(							\
71d4b8386cSSonny Jiang 			JPEG, GET_INST(JPEG, inst_idx),				\
72d4b8386cSSonny Jiang 			regUVD_DPG_LMA_CTL,					\
73d4b8386cSSonny Jiang 			(UVD_DPG_LMA_CTL__READ_WRITE_MASK |			\
74d4b8386cSSonny Jiang 			 offset << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT |	\
75d4b8386cSSonny Jiang 			 indirect << UVD_DPG_LMA_CTL__SRAM_SEL__SHIFT));	\
76d4b8386cSSonny Jiang 	} while (0)
77d4b8386cSSonny Jiang 
78d4b8386cSSonny Jiang #define RREG32_SOC24_JPEG_DPG_MODE(inst_idx, offset, mask_en)			\
79d4b8386cSSonny Jiang 	do {									\
80d4b8386cSSonny Jiang 		WREG32_SOC15(JPEG, GET_INST(JPEG, inst_idx),			\
81d4b8386cSSonny Jiang 			regUVD_DPG_LMA_MASK, 0xFFFFFFFF);			\
82d4b8386cSSonny Jiang 		WREG32_SOC15(JPEG, GET_INST(JPEG, inst_idx),			\
83d4b8386cSSonny Jiang 			regUVD_DPG_LMA_CTL,					\
84d4b8386cSSonny Jiang 			(UVD_DPG_LMA_CTL__MASK_EN_MASK |			\
85d4b8386cSSonny Jiang 			offset << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT));	\
86d4b8386cSSonny Jiang 		RREG32_SOC15(JPEG, inst_idx, regUVD_DPG_LMA_DATA);		\
87d4b8386cSSonny Jiang 	} while (0)
88d4b8386cSSonny Jiang 
89d4b8386cSSonny Jiang #define ADD_SOC24_JPEG_TO_DPG_SRAM(inst_idx, offset, value, indirect)		\
90d4b8386cSSonny Jiang 	do {									\
91d4b8386cSSonny Jiang 		*adev->jpeg.inst[inst_idx].dpg_sram_curr_addr++ = offset;	\
92d4b8386cSSonny Jiang 		*adev->jpeg.inst[inst_idx].dpg_sram_curr_addr++ = value;	\
93d4b8386cSSonny Jiang 	} while (0)
94d4b8386cSSonny Jiang 
95*df996b5eSSathishkumar S struct amdgpu_hwip_reg_entry;
96*df996b5eSSathishkumar S 
97ca449221SLijo Lazar enum amdgpu_jpeg_caps {
98ca449221SLijo Lazar 	AMDGPU_JPEG_RRMT_ENABLED,
99ca449221SLijo Lazar };
100ca449221SLijo Lazar 
101ca449221SLijo Lazar #define AMDGPU_JPEG_CAPS(caps) BIT(AMDGPU_JPEG_##caps)
102ca449221SLijo Lazar 
10388a1c40aSLeo Liu struct amdgpu_jpeg_reg{
104bc224553SJames Zhu 	unsigned jpeg_pitch[AMDGPU_MAX_JPEG_RINGS];
10588a1c40aSLeo Liu };
10688a1c40aSLeo Liu 
10788a1c40aSLeo Liu struct amdgpu_jpeg_inst {
108bc224553SJames Zhu 	struct amdgpu_ring ring_dec[AMDGPU_MAX_JPEG_RINGS];
10988a1c40aSLeo Liu 	struct amdgpu_irq_src irq;
11018dad20cSHoratio Zhang 	struct amdgpu_irq_src ras_poison_irq;
11188a1c40aSLeo Liu 	struct amdgpu_jpeg_reg external;
1120a119d53SSaleemkhan Jamadar 	struct amdgpu_bo	*dpg_sram_bo;
1130a119d53SSaleemkhan Jamadar 	struct dpg_pause_state	pause_state;
1140a119d53SSaleemkhan Jamadar 	void			*dpg_sram_cpu_addr;
1150a119d53SSaleemkhan Jamadar 	uint64_t		dpg_sram_gpu_addr;
1160a119d53SSaleemkhan Jamadar 	uint32_t		*dpg_sram_curr_addr;
117492c4647SJames Zhu 	uint8_t aid_id;
11888a1c40aSLeo Liu };
11988a1c40aSLeo Liu 
120edd08fa1SMohammad Zafar Ziya struct amdgpu_jpeg_ras {
121edd08fa1SMohammad Zafar Ziya 	struct amdgpu_ras_block_object ras_block;
122edd08fa1SMohammad Zafar Ziya };
123edd08fa1SMohammad Zafar Ziya 
12488a1c40aSLeo Liu struct amdgpu_jpeg {
12588a1c40aSLeo Liu 	uint8_t	num_jpeg_inst;
12688a1c40aSLeo Liu 	struct amdgpu_jpeg_inst inst[AMDGPU_MAX_JPEG_INSTANCES];
127bc224553SJames Zhu 	unsigned num_jpeg_rings;
12888a1c40aSLeo Liu 	struct amdgpu_jpeg_reg internal;
12988a1c40aSLeo Liu 	unsigned harvest_config;
1302eb16729SLeo Liu 	struct delayed_work idle_work;
1312eb16729SLeo Liu 	enum amd_powergating_state cur_state;
132651a1465SJames Zhu 	struct mutex jpeg_pg_lock;
133651a1465SJames Zhu 	atomic_t total_submission_cnt;
134edd08fa1SMohammad Zafar Ziya 	struct ras_common_if	*ras_if;
135edd08fa1SMohammad Zafar Ziya 	struct amdgpu_jpeg_ras	*ras;
136aaf1090aSLijo Lazar 
137aaf1090aSLijo Lazar 	uint16_t inst_mask;
138492c4647SJames Zhu 	uint8_t num_inst_per_aid;
1390a119d53SSaleemkhan Jamadar 	bool	indirect_sram;
14096f0b56cS[email protected] 	uint32_t supported_reset;
141ca449221SLijo Lazar 	uint32_t caps;
142*df996b5eSSathishkumar S 	u32 *ip_dump;
143*df996b5eSSathishkumar S 	u32 reg_count;
144*df996b5eSSathishkumar S 	const struct amdgpu_hwip_reg_entry *reg_list;
14588a1c40aSLeo Liu };
14688a1c40aSLeo Liu 
1472eb16729SLeo Liu int amdgpu_jpeg_sw_init(struct amdgpu_device *adev);
1482eb16729SLeo Liu int amdgpu_jpeg_sw_fini(struct amdgpu_device *adev);
1492eb16729SLeo Liu int amdgpu_jpeg_suspend(struct amdgpu_device *adev);
1502eb16729SLeo Liu int amdgpu_jpeg_resume(struct amdgpu_device *adev);
1512eb16729SLeo Liu 
1522eb16729SLeo Liu void amdgpu_jpeg_ring_begin_use(struct amdgpu_ring *ring);
1532eb16729SLeo Liu void amdgpu_jpeg_ring_end_use(struct amdgpu_ring *ring);
1542eb16729SLeo Liu 
1559d9cc9b8SLeo Liu int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring);
1569d9cc9b8SLeo Liu int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout);
1579d9cc9b8SLeo Liu 
1587e0357fcSMohammad Zafar Ziya int amdgpu_jpeg_process_poison_irq(struct amdgpu_device *adev,
1597e0357fcSMohammad Zafar Ziya 				struct amdgpu_irq_src *source,
1607e0357fcSMohammad Zafar Ziya 				struct amdgpu_iv_entry *entry);
16118dad20cSHoratio Zhang int amdgpu_jpeg_ras_late_init(struct amdgpu_device *adev,
16218dad20cSHoratio Zhang 				struct ras_common_if *ras_block);
1635640e06eSHawking Zhang int amdgpu_jpeg_ras_sw_init(struct amdgpu_device *adev);
1640a119d53SSaleemkhan Jamadar int amdgpu_jpeg_psp_update_sram(struct amdgpu_device *adev, int inst_idx,
1650a119d53SSaleemkhan Jamadar 			       enum AMDGPU_UCODE_ID ucode_id);
166f0b19b84SSathishkumar S void amdgpu_debugfs_jpeg_sched_mask_init(struct amdgpu_device *adev);
16796f0b56cS[email protected] int amdgpu_jpeg_sysfs_reset_mask_init(struct amdgpu_device *adev);
16896f0b56cS[email protected] void amdgpu_jpeg_sysfs_reset_mask_fini(struct amdgpu_device *adev);
169*df996b5eSSathishkumar S int amdgpu_jpeg_reg_dump_init(struct amdgpu_device *adev,
170*df996b5eSSathishkumar S 			       const struct amdgpu_hwip_reg_entry *reg, u32 count);
171*df996b5eSSathishkumar S void amdgpu_jpeg_dump_ip_state(struct amdgpu_ip_block *ip_block);
172*df996b5eSSathishkumar S void amdgpu_jpeg_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm_printer *p);
1737e0357fcSMohammad Zafar Ziya 
17488a1c40aSLeo Liu #endif /*__AMDGPU_JPEG_H__*/
175