鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

默认场景

  1. 队列申请时,需首先声明一个struct wd_queue的结构体变量(结构体当前定义如下表)并初始化为全0,在这个成员变量capa的成员变量alg中指定需要的算法字符串,算法的字符串需要和注册到UACCE的设备支持的算法字符串匹配,其它结构体成员暂时不需要赋值。在用户环境中的shell中,通过执行cat /sys/class/uacce/*/attrs/algorithms,可以列举出当前注册到UACCE的设备都支持哪些算法。

    如果需要从注册到UACCE的指定设备中搜索支持这种算法的队列,需要指定dev_path或node_mask的值,dev_path必须是已经注册到UACCE中设备的路径,node_mask必须是numa node的掩码或组合。

    对外可见

    对外可见

    对外不可见,只是为了逻辑完整而列出

    1
    2
    3
    4
    5
    6
    struct wd_queue {
    struct wd_capa capa;
    char dev_path[PATH_STR_SIZE];
    unsigned int node_mask;
    void *qinfo; 指向内部私有信息,用户不要处理
    };
    
    1
    2
    3
    4
    5
    6
    7
    struct wd_capa {
    char *alg;
    int throughput;
    int latency;
    __u32 flags;
    struct wcrypto_paras priv;
    };
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    struct q_info {
    const char *hw_type;
    int hw_type_id;
    int ref;
    void *priv; 指向硬件数据
    const void *dev_info;
    int fd;
    int ctx_num;
    ...
    }
    
  2. 队列申请时,取第1步struct wd_queue结构体变量的地址作为参数,调用int wd_request_queue(struct wd_queue *q)申请指定算法的队列,如果返回值是负值说明失败;否则成功,并把申请到的queue的私有信息保存到struct wd_queue结构体变量的成员变量qinfo中,后续queue相关的操作都会访问qinfo中保存的信息,qinfo指向的内存在调用wd_release_queue时释放。
  3. 消息发送前,首先要声明一个某种算法消息结构体的变量(具体请参考算法层接口),比如RSA算法消息,填充好算法要求的数据,in,out和key等指向的内存需要用户先申请好,处理完之后相关内存由用户负责释放。用户也可以声明自定的消息结构体变量,但是前提是该消息结构体能被硬件加速器用户态驱动识别处理。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    struct wcrypto_rsa_msg {
    __u8 alg_type:3;/* Denoted by enum wcrypto_type */
    __u8 op_type:2;/* Denoted by enum wcrypto_rsa_op_type */
    __u8 key_type:2;/* Denoted by enum wcrypto_rsa_key_type */
    __u8 data_fmt:1; /* Data format, denoted by enum wd_buff_type */
    __u8 result;/* Data format, denoted by WD error code */
    __u16 in_bytes;/* Input data bytes */
    __u16 out_bytes;/* Output data bytes */
    __u16 key_bytes;/* Input key bytes */
    __u8 *in;/* Input data VA, buf should be DMA buffer. */
    __u8 *out;/* Output data VA pointer, should be DMA buffer */
    __u8 *key;/* Input key VA pointer, should be DMA buffer */
    __u64 usr_data;/* Input user tag, used for indentify data stream/user: struct wcrypto_cb_tag */
    };
    
  4. 消息发送时,取第1步struct wd_queue结构体变量的地址和第3步的算法消息结构体变量的地址作为参数,调用int wd_send(struct wd_queue *q, void *req)将请求发给硬件处理,成功返回0,同时请不要释放第3步申请的变量及内存;失败返回负值。内部逻辑中将根据wd_queue的成员变量qinfo中的hw_type找到合适的硬件加速器用户态驱动,并调用该驱动的方法将请求发给该硬件。
  5. 消息接受前,首先声明一个和第3步一样的算法消息结构体的指针变量。
  6. 消息接受时,取第1步struct wd_queue结构体变量的地址和第5步的算法消息结构体指针变量的地址作为参数,调用int wd_recv(struct wd_queue *q, void **resp)从硬件接收回应消息,成功返回0,处理完的数据会更新到第3步中的req中,并把resp指向req;失败返回负值。内部逻辑中将根据wd_queue的成员变量qinfo中的hw_type找到合适的硬件加速器用户态驱动,并调用该驱动的方法从硬件接收回应消息。
  7. 队列释放前,处理完数据之后,释放第3步中申请的变量及内存。
  8. 队列释放时,取第1步struct wd_queue结构体变量的地址作为参数,调用void wd_release_queue(struct wd_queue *q)释放队列和涉及到的硬件资源。