root/drivers/dma/amd/ae4dma/ae4dma.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * AMD AE4DMA driver
 *
 * Copyright (c) 2024, Advanced Micro Devices, Inc.
 * All Rights Reserved.
 *
 * Author: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
 */
#ifndef __AE4DMA_H__
#define __AE4DMA_H__

#include <linux/device.h>
#include <linux/dmaengine.h>
#include <linux/dmapool.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/pci.h>
#include <linux/spinlock.h>
#include <linux/wait.h>

#include "../ptdma/ptdma.h"
#include "../../virt-dma.h"

#define MAX_AE4_HW_QUEUES               16

#define AE4_DESC_COMPLETED              0x03

#define AE4_MAX_IDX_OFF                 0x08
#define AE4_RD_IDX_OFF                  0x0c
#define AE4_WR_IDX_OFF                  0x10
#define AE4_INTR_STS_OFF                0x14
#define AE4_Q_BASE_L_OFF                0x18
#define AE4_Q_BASE_H_OFF                0x1c
#define AE4_Q_SZ                        0x20

#define AE4_DMA_VERSION                 4
#define CMD_AE4_DESC_DW0_VAL            2

#define AE4_TIME_OUT                    5000

struct ae4_msix {
        int msix_count;
        struct msix_entry msix_entry[MAX_AE4_HW_QUEUES];
};

struct ae4_cmd_queue {
        struct ae4_device *ae4;
        struct pt_cmd_queue cmd_q;
        struct list_head cmd;
        /* protect command operations */
        struct mutex cmd_lock;
        struct delayed_work p_work;
        struct workqueue_struct *pws;
        struct completion cmp;
        wait_queue_head_t q_w;
        atomic64_t intr_cnt;
        atomic64_t done_cnt;
        u64 q_cmd_count;
        u32 dridx;
        u32 tail_wi;
        u32 id;
};

union dwou {
        u32 dw0;
        struct dword0 {
        u8      byte0;
        u8      byte1;
        u16     timestamp;
        } dws;
};

struct dword1 {
        u8      status;
        u8      err_code;
        u16     desc_id;
};

struct ae4dma_desc {
        union dwou dwouv;
        struct dword1 dw1;
        u32 length;
        u32 rsvd;
        u32 src_hi;
        u32 src_lo;
        u32 dst_hi;
        u32 dst_lo;
};

struct ae4_device {
        struct pt_device pt;
        struct ae4_msix *ae4_msix;
        struct ae4_cmd_queue ae4cmd_q[MAX_AE4_HW_QUEUES];
        unsigned int ae4_irq[MAX_AE4_HW_QUEUES];
        unsigned int cmd_q_count;
};

int ae4_core_init(struct ae4_device *ae4);
void ae4_destroy_work(struct ae4_device *ae4);
void ae4_check_status_error(struct ae4_cmd_queue *ae4cmd_q, int idx);
#endif