NVDLA系列之C-model:glb-gen&include<108>

NV_NVDLA_glb_glb_gen.h

// ================================================================
// NVDLA Open Source Project
// 
// Copyright(c) 2016 - 2017 NVIDIA Corporation.  Licensed under the
// NVDLA Open Hardware License; Check "LICENSE" which comes with 
// this distribution for more information.
// ================================================================

// File Name: NV_NVDLA_glb_glb_gen.h

#include "NV_NVDLA_glb.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>

USING_SCSIM_NAMESPACE(cmod)
USING_SCSIM_NAMESPACE(clib)

csb2glb_req_b_transport

inline void
NV_NVDLA_glb::csb2glb_req_b_transport (int ID, NV_MSDEC_csb2xx_16m_secure_be_lvl_t* payload, sc_time& delay) {
    
    
    uint32_t addr;
    uint32_t data;
    uint8_t write;
    uint8_t nposted;
    uint8_t error_id=0;
    bool    register_access_result;
    if (true == is_there_ongoing_csb2glb_response_) {
    
    
        FAIL(("NVDLA NV_NVDLA_glb::csb2glb_b_transport: there is onging CSB response."));
    } else {
    
    
        is_there_ongoing_csb2glb_response_ = true;
    }
    // Extract CSB request information from payload
    if (NULL != payload) {
    
    
        addr = payload->pd.csb2xx_16m_secure_be_lvl.addr;
        data = payload->pd.csb2xx_16m_secure_be_lvl.wdat;
        write = payload->pd.csb2xx_16m_secure_be_lvl.write;
        nposted = payload->pd.csb2xx_16m_secure_be_lvl.nposted;
    } else {
    
    
        FAIL(("NVDLA NV_NVDLA_glb::csb2glb_b_transport: payload pointer shall not be NULL"));
    }
    // Accessing registers
    register_access_result = GlbAccessRegister (addr, data, 0!=write);
    if (false == register_access_result) {
    
    
        error_id = 1;
    }
    // Read and nposted write need to send response data
    if ( (0==write) || (0!=nposted) ) {
    
    
        // Read     or  is non-posted
        GlbSendCsbResponse(write, data, error_id);
    }
    is_there_ongoing_csb2glb_response_ = false;
}

这段代码是一个成员函数 csb2glb_req_b_transport,看起来它是用于处理 CSB (Config Space Bridge) 请求的函数。下面是代码的主要功能和步骤解释:

  1. 首先,声明了一些本地变量,如 addrdatawritenpostederror_idregister_access_result,以及检查是否有正在进行的 CSB 响应的标志 is_there_ongoing_csb2glb_response_

  2. 在代码的开始部分,检查是否存在正在进行的 CSB 响应。如果存在正在进行的响应,则产生一个错误消息,并终止执行。否则,将 is_there_ongoing_csb2glb_response_ 设置为 true,表示有一个 CSB 请求正在进行。

  3. 接下来,代码从传入的 payload 中提取 CSB 请求的信息,包括地址 addr、数据 data、写标志 write 和非投递式写标志 nposted

  4. 然后,代码调用 GlbAccessRegister 函数来访问寄存器。这个函数的目的是根据 CSB 请求对硬件寄存器进行读取或写入。如果访问成功,register_access_result 被设置为 true,否则设置为 false 并且 error_id 被设置为 1。

  5. 最后,根据写入标志 write 和非投递式写标志 nposted 的值,决定是否发送 CSB 响应数据。如果 write 为 0(表示读取)或 nposted 不为 0(表示非投递式写入),则调用 GlbSendCsbResponse 函数发送 CSB 响应数据,包括写入数据 data 和错误信息 error_id

  6. 最后,将 is_there_ongoing_csb2glb_response_ 设置为 false,表示 CSB 请求处理完毕。

这段代码主要是处理 CSB 请求的过程,包括解析请求、访问硬件寄存器、发送响应等操作,用于管理硬件配置空间的访问。

GlbSendCsbResponse

inline void
NV_NVDLA_glb::GlbSendCsbResponse(uint8_t type, uint32_t data, uint8_t error_id) {
    
    
    nvdla_xx2csb_resp_t payload;
    if (0==type) {
    
    
        // Read return data
        payload.pd.xx2csb_rd_erpt.error   = error_id;
        payload.pd.xx2csb_rd_erpt.rdat    = data;
		payload.tag =  XX2CSB_RESP_TAG_READ;
    } else {
    
    
        // Write return data
        payload.pd.xx2csb_wr_erpt.error   = error_id;
        payload.pd.xx2csb_wr_erpt.rdat    = 0;
		payload.tag =  XX2CSB_RESP_TAG_WRITE;
    }
    NV_NVDLA_glb_base::glb2csb_resp_b_transport(&payload, b_transport_delay_);
}

这段代码是一个函数 GlbSendCsbResponse,用于发送 CSB (Config Space Bridge) 响应数据。它的功能如下:

  1. 首先,创建一个名为 payload 的本地变量,类型为 nvdla_xx2csb_resp_t。这个变量将用于构建 CSB 响应数据。

  2. 接下来,根据传入的 type 参数的值来判断是读取响应还是写入响应。如果 type 为 0,表示读取响应,那么将设置响应数据中的错误信息 error_id 和读取到的数据 data。如果 type 不为 0,表示写入响应,那么将设置错误信息 error_id 并将读取到的数据 data 设置为 0。

  3. 根据响应的类型,设置 payloadtag 属性为相应的标签,通常是 XX2CSB_RESP_TAG_READXX2CSB_RESP_TAG_WRITE,以表示响应的类型。

  4. 最后,调用 glb2csb_resp_b_transport 函数来将构建好的响应数据 payload 发送出去,其中 b_transport_delay_ 是响应传输的延迟时间。

这段代码的主要作用是根据 CSB 请求的类型,构建相应的响应数据并发送出去,用于与硬件配置空间的通信。根据响应类型的不同,响应数据中包含不同的信息。

cmod/glb/gen/NV_NVDLA_glb_gec_gen.h

// ================================================================
// NVDLA Open Source Project
// 
// Copyright(c) 2016 - 2017 NVIDIA Corporation.  Licensed under the
// NVDLA Open Hardware License; Check "LICENSE" which comes with 
// this distribution for more information.
// ================================================================

// File Name: NV_NVDLA_glb_gec_gen.h

#include "NV_NVDLA_glb.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>

USING_SCSIM_NAMESPACE(cmod)
USING_SCSIM_NAMESPACE(clib)

csb2gec_req_b_transport

inline void
NV_NVDLA_glb::csb2gec_req_b_transport (int ID, NV_MSDEC_csb2xx_16m_secure_be_lvl_t* payload, sc_time& delay) {
    
    
    uint32_t addr;
    uint32_t data;
    uint8_t write;
    uint8_t nposted;
    uint8_t error_id=0;
    bool    register_access_result;
    if (true == is_there_ongoing_csb2gec_response_) {
    
    
        FAIL(("NVDLA NV_NVDLA_glb::csb2gec_b_transport: there is onging CSB response."));
    } else {
    
    
        is_there_ongoing_csb2gec_response_ = true;
    }
    // Extract CSB request information from payload
    if (NULL != payload) {
    
    
        addr = payload->pd.csb2xx_16m_secure_be_lvl.addr;
        data = payload->pd.csb2xx_16m_secure_be_lvl.wdat;
        write = payload->pd.csb2xx_16m_secure_be_lvl.write;
        nposted = payload->pd.csb2xx_16m_secure_be_lvl.nposted;
    } else {
    
    
        FAIL(("NVDLA NV_NVDLA_glb::csb2gec_b_transport: payload pointer shall not be NULL"));
    }
    // Accessing registers
    register_access_result = GecAccessRegister (addr, data, 0!=write);
    if (false == register_access_result) {
    
    
        error_id = 1;
    }
    // Read and nposted write need to send response data
    if ( (0==write) || (0!=nposted) ) {
    
    
        // Read     or  is non-posted
        GecSendCsbResponse(write, data, error_id);
    }
    is_there_ongoing_csb2gec_response_ = false;
}

这段代码是一个函数 csb2gec_req_b_transport,用于处理 CSB (Config Space Bridge) 请求并发送相应的响应数据给 GEC (Global Error Controller)。以下是这段代码的功能解释:

  1. 首先,它检查 is_there_ongoing_csb2gec_response_ 的状态,以确保没有正在进行的 CSB 响应操作。如果存在正在进行的响应操作,就会触发 FAIL 函数,抛出错误消息,表示有未完成的 CSB 响应操作。否则,它将设置 is_there_ongoing_csb2gec_response_true,表示当前有一个 CSB 响应操作正在进行。

  2. 接下来,它从传入的 payload 参数中提取 CSB 请求的相关信息,包括地址 addr、数据 data、写入标志 write 和非投递式标志 nposted。如果 payloadNULL,则触发 FAIL 函数,抛出错误消息,表示 payload 指针不应为空。

  3. 然后,它调用 GecAccessRegister 函数,根据 CSB 请求的信息访问相关寄存器。如果寄存器访问操作返回 false,表示操作失败,它会将 error_id 设置为 1,表示出现错误。

  4. 最后,它检查 CSB 请求的类型和非投递式标志,如果是读取操作或者需要非投递式写入响应,就调用 GecSendCsbResponse 函数来发送 CSB 响应数据,其中包括写入标志 write、数据 data 和错误信息 error_id

  5. 最后,它将 is_there_ongoing_csb2gec_response_ 设置为 false,表示 CSB 响应操作已完成。这个状态标志用于确保在进行新的 CSB 响应操作之前没有未完成的响应操作。

GecSendCsbResponse

inline void
NV_NVDLA_glb::GecSendCsbResponse(uint8_t type, uint32_t data, uint8_t error_id) {
    
    
    nvdla_xx2csb_resp_t payload;
    if (0==type) {
    
    
        // Read return data
        payload.pd.xx2csb_rd_erpt.error   = error_id;
        payload.pd.xx2csb_rd_erpt.rdat    = data;
		payload.tag =  XX2CSB_RESP_TAG_READ;
    } else {
    
    
        // Write return data
        payload.pd.xx2csb_wr_erpt.error   = error_id;
        payload.pd.xx2csb_wr_erpt.rdat    = 0;
		payload.tag =  XX2CSB_RESP_TAG_WRITE;
    }
    NV_NVDLA_glb_base::gec2csb_resp_b_transport(&payload, b_transport_delay_);
}

这段代码是一个函数 GecSendCsbResponse,用于向 CSB (Config Space Bridge) 发送响应数据。以下是这段代码的功能解释:

  1. 该函数接受三个参数:typedataerror_id。这些参数分别表示 CSB 响应的类型(读取或写入)、响应的数据和错误标识。

  2. 首先,它创建了一个名为 payloadnvdla_xx2csb_resp_t 结构体,用于存储 CSB 响应数据。

  3. 接下来,根据 type 参数的值来区分读取响应和写入响应。如果 type 的值为0,表示读取响应,则它将设置 payload 结构体中的字段,包括 error_id 表示的错误信息和 data 表示的读取数据。如果 type 的值不为0,表示写入响应,则它将设置相应的字段,但将 rdat 设置为0。

  4. 最后,它使用 NV_NVDLA_glb_base::gec2csb_resp_b_transport 函数来发送 CSB 响应数据。这个函数将 payloadb_transport_delay_ 作为参数传递,用于执行 CSB 响应的传输操作。

总之,这个函数用于构建 CSB 响应数据包,并将其发送给 CSB 接口,以响应 CSB 请求操作。具体的响应数据内容根据 type 参数的值而异,可以是读取响应数据或写入响应的确认信息。

// cmod/include/nvdla_ness_header/NV_MSDEC_csb2xx_16m_secure_be_lvl_iface.h

NV_MSDEC_csb2xx_16m_secure_be_lvl_iface.h

// ================================================================
// NVDLA Open Source Project
// 
// Copyright(c) 2016 - 2017 NVIDIA Corporation.  Licensed under the
// NVDLA Open Hardware License; Check "LICENSE" which comes with 
// this distribution for more information.
// ================================================================

// File Name: NV_MSDEC_csb2xx_16m_secure_be_lvl_iface.h

#if !defined(_NV_MSDEC_csb2xx_16m_secure_be_lvl_iface_H_)
#define _NV_MSDEC_csb2xx_16m_secure_be_lvl_iface_H_

#include <stdint.h>
#ifndef _csb2xx_16m_secure_be_lvl_struct_H_
#define _csb2xx_16m_secure_be_lvl_struct_H_

typedef struct csb2xx_16m_secure_be_lvl_s {
    
    
    uint32_t addr ; 
    uint32_t wdat ; 
    uint8_t write ; 
    uint8_t nposted ; 
    uint8_t srcpriv ; 
    uint8_t wrbe ; 
    uint8_t secure ; 
    uint8_t level ; 
} csb2xx_16m_secure_be_lvl_t;

#endif

union NV_MSDEC_csb2xx_16m_secure_be_lvl_u {
    
    
    csb2xx_16m_secure_be_lvl_t csb2xx_16m_secure_be_lvl;
};
typedef struct NV_MSDEC_csb2xx_16m_secure_be_lvl_s {
    
    
    union NV_MSDEC_csb2xx_16m_secure_be_lvl_u pd ; 
} NV_MSDEC_csb2xx_16m_secure_be_lvl_t;

#endif // !defined(_NV_MSDEC_csb2xx_16m_secure_be_lvl_iface_H_)

这是一个C/C++头文件,文件名为 NV_MSDEC_csb2xx_16m_secure_be_lvl_iface.h。该文件包含了一些结构体和类型定义,可能用于处理与 csb2xx_16m_secure_be_lvl 接口相关的数据。

以下是文件的主要内容和结构:

  1. 头文件保护宏:#if !defined(_NV_MSDEC_csb2xx_16m_secure_be_lvl_iface_H_)#endif 用于确保头文件在同一编译单元中只被包含一次,以防止重复定义。

  2. 包含标准 C/C++ 头文件:#include <stdint.h> 用于包含 C/C++ 标准库中定义的整数类型。

  3. 结构体定义:该文件包含了一个名为 csb2xx_16m_secure_be_lvl_t 的结构体,该结构体包含了多个字段,包括 addrwdatwritenpostedsrcprivwrbesecurelevel。这些字段可能用于描述一个与安全性有关的操作或事务。

  4. 联合类型定义:该文件包含了一个名为 NV_MSDEC_csb2xx_16m_secure_be_lvl_u 的联合类型,它的成员是 csb2xx_16m_secure_be_lvl_t 结构体。这种联合类型的目的通常是为了方便在不同的数据类型之间进行转换。

  5. 结构体类型定义:最后,该文件定义了一个名为 NV_MSDEC_csb2xx_16m_secure_be_lvl_t 的结构体类型,其中包含一个 pd 成员,该成员是一个 NV_MSDEC_csb2xx_16m_secure_be_lvl_u 联合类型。这个结构体可能用于封装与 csb2xx_16m_secure_be_lvl 接口相关的数据。

此头文件的目的是为了在源代码中引入与 csb2xx_16m_secure_be_lvl 接口相关的数据结构和类型定义,以便在代码中使用这些定义来处理与该接口相关的数据。

//cmod/include/nvdla_ness_header/NV_MSDEC_csb2xx_adr32_iface.h

NV_MSDEC_csb2xx_adr32_iface.h

// ================================================================
// NVDLA Open Source Project
// 
// Copyright(c) 2016 - 2017 NVIDIA Corporation.  Licensed under the
// NVDLA Open Hardware License; Check "LICENSE" which comes with 
// this distribution for more information.
// ================================================================

// File Name: NV_MSDEC_csb2xx_adr32_iface.h

#if !defined(_NV_MSDEC_csb2xx_adr32_iface_H_)
#define _NV_MSDEC_csb2xx_adr32_iface_H_

#include <stdint.h>
#ifndef _csb2xx_adr32_struct_H_
#define _csb2xx_adr32_struct_H_

typedef struct csb2xx_adr32_s {
    
    
    uint32_t addr ; 
    uint32_t wdat ; 
    uint8_t write ; 
    uint8_t nposted ; 
    uint8_t srcpriv ; 
    uint8_t wrbe ; 
    uint8_t secure ; 
    uint8_t level ; 
} csb2xx_adr32_t;

#endif

union NV_MSDEC_csb2xx_adr32_u {
    
    
    csb2xx_adr32_t csb2xx_adr32;
};
typedef struct NV_MSDEC_csb2xx_adr32_s {
    
    
    union NV_MSDEC_csb2xx_adr32_u pd ; 
} NV_MSDEC_csb2xx_adr32_t;

#endif // !defined(_NV_MSDEC_csb2xx_adr32_iface_H_)

这也是一个C/C++头文件,文件名为 NV_MSDEC_csb2xx_adr32_iface.h。与之前的头文件类似,该文件包含了一些结构体和类型定义,可能用于处理与 csb2xx_adr32 接口相关的数据。

以下是文件的主要内容和结构:

  1. 头文件保护宏:#if !defined(_NV_MSDEC_csb2xx_adr32_iface_H_)#endif 用于确保头文件在同一编译单元中只被包含一次,以防止重复定义。

  2. 包含标准 C/C++ 头文件:#include <stdint.h> 用于包含 C/C++ 标准库中定义的整数类型。

  3. 结构体定义:该文件包含了一个名为 csb2xx_adr32_t 的结构体,该结构体包含了多个字段,包括 addrwdatwritenpostedsrcprivwrbesecurelevel。这些字段可能用于描述一个与地址和寻址方式有关的操作或事务。

  4. 联合类型定义:该文件包含了一个名为 NV_MSDEC_csb2xx_adr32_u 的联合类型,它的成员是 csb2xx_adr32_t 结构体。这种联合类型的目的通常是为了方便在不同的数据类型之间进行转换。

  5. 结构体类型定义:最后,该文件定义了一个名为 NV_MSDEC_csb2xx_adr32_t 的结构体类型,其中包含一个 pd 成员,该成员是一个 NV_MSDEC_csb2xx_adr32_u 联合类型。这个结构体可能用于封装与 csb2xx_adr32 接口相关的数据。

与前一个头文件类似,此头文件的目的是为了在源代码中引入与 csb2xx_adr32 接口相关的数据结构和类型定义,以便在代码中使用这些定义来处理与该接口相关的数据。

猜你喜欢

转载自blog.csdn.net/lincolnjunior_lj/article/details/134995287
gen