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) 请求的函数。下面是代码的主要功能和步骤解释:
-
首先,声明了一些本地变量,如
addr
、data
、write
、nposted
、error_id
和register_access_result
,以及检查是否有正在进行的 CSB 响应的标志is_there_ongoing_csb2glb_response_
。 -
在代码的开始部分,检查是否存在正在进行的 CSB 响应。如果存在正在进行的响应,则产生一个错误消息,并终止执行。否则,将
is_there_ongoing_csb2glb_response_
设置为true
,表示有一个 CSB 请求正在进行。 -
接下来,代码从传入的
payload
中提取 CSB 请求的信息,包括地址addr
、数据data
、写标志write
和非投递式写标志nposted
。 -
然后,代码调用
GlbAccessRegister
函数来访问寄存器。这个函数的目的是根据 CSB 请求对硬件寄存器进行读取或写入。如果访问成功,register_access_result
被设置为true
,否则设置为false
并且error_id
被设置为 1。 -
最后,根据写入标志
write
和非投递式写标志nposted
的值,决定是否发送 CSB 响应数据。如果write
为 0(表示读取)或nposted
不为 0(表示非投递式写入),则调用GlbSendCsbResponse
函数发送 CSB 响应数据,包括写入数据data
和错误信息error_id
。 -
最后,将
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) 响应数据。它的功能如下:
-
首先,创建一个名为
payload
的本地变量,类型为nvdla_xx2csb_resp_t
。这个变量将用于构建 CSB 响应数据。 -
接下来,根据传入的
type
参数的值来判断是读取响应还是写入响应。如果type
为 0,表示读取响应,那么将设置响应数据中的错误信息error_id
和读取到的数据data
。如果type
不为 0,表示写入响应,那么将设置错误信息error_id
并将读取到的数据data
设置为 0。 -
根据响应的类型,设置
payload
的tag
属性为相应的标签,通常是XX2CSB_RESP_TAG_READ
或XX2CSB_RESP_TAG_WRITE
,以表示响应的类型。 -
最后,调用
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)。以下是这段代码的功能解释:
-
首先,它检查
is_there_ongoing_csb2gec_response_
的状态,以确保没有正在进行的 CSB 响应操作。如果存在正在进行的响应操作,就会触发FAIL
函数,抛出错误消息,表示有未完成的 CSB 响应操作。否则,它将设置is_there_ongoing_csb2gec_response_
为true
,表示当前有一个 CSB 响应操作正在进行。 -
接下来,它从传入的
payload
参数中提取 CSB 请求的相关信息,包括地址addr
、数据data
、写入标志write
和非投递式标志nposted
。如果payload
为NULL
,则触发FAIL
函数,抛出错误消息,表示payload
指针不应为空。 -
然后,它调用
GecAccessRegister
函数,根据 CSB 请求的信息访问相关寄存器。如果寄存器访问操作返回false
,表示操作失败,它会将error_id
设置为 1,表示出现错误。 -
最后,它检查 CSB 请求的类型和非投递式标志,如果是读取操作或者需要非投递式写入响应,就调用
GecSendCsbResponse
函数来发送 CSB 响应数据,其中包括写入标志write
、数据data
和错误信息error_id
。 -
最后,它将
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) 发送响应数据。以下是这段代码的功能解释:
-
该函数接受三个参数:
type
、data
和error_id
。这些参数分别表示 CSB 响应的类型(读取或写入)、响应的数据和错误标识。 -
首先,它创建了一个名为
payload
的nvdla_xx2csb_resp_t
结构体,用于存储 CSB 响应数据。 -
接下来,根据
type
参数的值来区分读取响应和写入响应。如果type
的值为0,表示读取响应,则它将设置payload
结构体中的字段,包括error_id
表示的错误信息和data
表示的读取数据。如果type
的值不为0,表示写入响应,则它将设置相应的字段,但将rdat
设置为0。 -
最后,它使用
NV_NVDLA_glb_base::gec2csb_resp_b_transport
函数来发送 CSB 响应数据。这个函数将payload
和b_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
接口相关的数据。
以下是文件的主要内容和结构:
-
头文件保护宏:
#if !defined(_NV_MSDEC_csb2xx_16m_secure_be_lvl_iface_H_)
和#endif
用于确保头文件在同一编译单元中只被包含一次,以防止重复定义。 -
包含标准 C/C++ 头文件:
#include <stdint.h>
用于包含 C/C++ 标准库中定义的整数类型。 -
结构体定义:该文件包含了一个名为
csb2xx_16m_secure_be_lvl_t
的结构体,该结构体包含了多个字段,包括addr
、wdat
、write
、nposted
、srcpriv
、wrbe
、secure
和level
。这些字段可能用于描述一个与安全性有关的操作或事务。 -
联合类型定义:该文件包含了一个名为
NV_MSDEC_csb2xx_16m_secure_be_lvl_u
的联合类型,它的成员是csb2xx_16m_secure_be_lvl_t
结构体。这种联合类型的目的通常是为了方便在不同的数据类型之间进行转换。 -
结构体类型定义:最后,该文件定义了一个名为
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
接口相关的数据。
以下是文件的主要内容和结构:
-
头文件保护宏:
#if !defined(_NV_MSDEC_csb2xx_adr32_iface_H_)
和#endif
用于确保头文件在同一编译单元中只被包含一次,以防止重复定义。 -
包含标准 C/C++ 头文件:
#include <stdint.h>
用于包含 C/C++ 标准库中定义的整数类型。 -
结构体定义:该文件包含了一个名为
csb2xx_adr32_t
的结构体,该结构体包含了多个字段,包括addr
、wdat
、write
、nposted
、srcpriv
、wrbe
、secure
和level
。这些字段可能用于描述一个与地址和寻址方式有关的操作或事务。 -
联合类型定义:该文件包含了一个名为
NV_MSDEC_csb2xx_adr32_u
的联合类型,它的成员是csb2xx_adr32_t
结构体。这种联合类型的目的通常是为了方便在不同的数据类型之间进行转换。 -
结构体类型定义:最后,该文件定义了一个名为
NV_MSDEC_csb2xx_adr32_t
的结构体类型,其中包含一个pd
成员,该成员是一个NV_MSDEC_csb2xx_adr32_u
联合类型。这个结构体可能用于封装与csb2xx_adr32
接口相关的数据。
与前一个头文件类似,此头文件的目的是为了在源代码中引入与 csb2xx_adr32
接口相关的数据结构和类型定义,以便在代码中使用这些定义来处理与该接口相关的数据。