Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d36b94fc authored by Oded Gabbay's avatar Oded Gabbay
Browse files

drm/radeon: Add init interrupt kfd->kgd interface



This patch adds a new interface function to the kfd->kgd interface.
The function is kgd_init_interrupts() and its function is to
initialize a pipe's interrupts.

The function currently enables the timestamp interrupt and the
bad opcode interrupt.

Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent 1241e0b4
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -144,6 +144,8 @@ struct kfd2kgd_calls {
	int (*init_pipeline)(struct kgd_dev *kgd, uint32_t pipe_id,
	int (*init_pipeline)(struct kgd_dev *kgd, uint32_t pipe_id,
				uint32_t hpd_size, uint64_t hpd_gpu_addr);
				uint32_t hpd_size, uint64_t hpd_gpu_addr);


	int (*init_interrupts)(struct kgd_dev *kgd, uint32_t pipe_id);

	int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
	int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
			uint32_t queue_id, uint32_t __user *wptr);
			uint32_t queue_id, uint32_t __user *wptr);


+2 −0
Original line number Original line Diff line number Diff line
@@ -149,6 +149,8 @@


#define KFD_CIK_SDMA_QUEUE_OFFSET		0x200
#define KFD_CIK_SDMA_QUEUE_OFFSET		0x200


#define CPC_INT_CNTL					0xC2D0

#define CP_HQD_IQ_RPTR					0xC970u
#define CP_HQD_IQ_RPTR					0xC970u
#define AQL_ENABLE					(1U << 0)
#define AQL_ENABLE					(1U << 0)
#define SDMA0_RLC0_RB_CNTL				0xD400u
#define SDMA0_RLC0_RB_CNTL				0xD400u
+1 −0
Original line number Original line Diff line number Diff line
@@ -1335,6 +1335,7 @@
#       define CNTX_EMPTY_INT_ENABLE                    (1 << 20)
#       define CNTX_EMPTY_INT_ENABLE                    (1 << 20)
#       define PRIV_INSTR_INT_ENABLE                    (1 << 22)
#       define PRIV_INSTR_INT_ENABLE                    (1 << 22)
#       define PRIV_REG_INT_ENABLE                      (1 << 23)
#       define PRIV_REG_INT_ENABLE                      (1 << 23)
#       define OPCODE_ERROR_INT_ENABLE                  (1 << 24)
#       define TIME_STAMP_INT_ENABLE                    (1 << 26)
#       define TIME_STAMP_INT_ENABLE                    (1 << 26)
#       define CP_RINGID2_INT_ENABLE                    (1 << 29)
#       define CP_RINGID2_INT_ENABLE                    (1 << 29)
#       define CP_RINGID1_INT_ENABLE                    (1 << 30)
#       define CP_RINGID1_INT_ENABLE                    (1 << 30)
+20 −1
Original line number Original line Diff line number Diff line
@@ -66,7 +66,7 @@ static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid,


static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id,
static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id,
				uint32_t hpd_size, uint64_t hpd_gpu_addr);
				uint32_t hpd_size, uint64_t hpd_gpu_addr);

static int kgd_init_interrupts(struct kgd_dev *kgd, uint32_t pipe_id);
static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
			uint32_t queue_id, uint32_t __user *wptr);
			uint32_t queue_id, uint32_t __user *wptr);
static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd);
static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd);
@@ -89,6 +89,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
	.program_sh_mem_settings = kgd_program_sh_mem_settings,
	.program_sh_mem_settings = kgd_program_sh_mem_settings,
	.set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
	.set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
	.init_pipeline = kgd_init_pipeline,
	.init_pipeline = kgd_init_pipeline,
	.init_interrupts = kgd_init_interrupts,
	.hqd_load = kgd_hqd_load,
	.hqd_load = kgd_hqd_load,
	.hqd_sdma_load = kgd_hqd_sdma_load,
	.hqd_sdma_load = kgd_hqd_sdma_load,
	.hqd_is_occupied = kgd_hqd_is_occupied,
	.hqd_is_occupied = kgd_hqd_is_occupied,
@@ -407,6 +408,24 @@ static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id,
	return 0;
	return 0;
}
}


static int kgd_init_interrupts(struct kgd_dev *kgd, uint32_t pipe_id)
{
	uint32_t mec;
	uint32_t pipe;

	mec = (pipe_id / CIK_PIPE_PER_MEC) + 1;
	pipe = (pipe_id % CIK_PIPE_PER_MEC);

	lock_srbm(kgd, mec, pipe, 0, 0);

	write_register(kgd, CPC_INT_CNTL,
			TIME_STAMP_INT_ENABLE | OPCODE_ERROR_INT_ENABLE);

	unlock_srbm(kgd);

	return 0;
}

static inline uint32_t get_sdma_base_addr(struct cik_sdma_rlc_registers *m)
static inline uint32_t get_sdma_base_addr(struct cik_sdma_rlc_registers *m)
{
{
	uint32_t retval;
	uint32_t retval;