PCIe driver: add functions to load/save internal packet generator memory

This commit is contained in:
2023-09-06 09:19:39 +02:00
parent caf950f99f
commit 7904a03e4b
8 changed files with 90 additions and 6 deletions
+11 -6
View File
@@ -35,12 +35,13 @@
// Offset for BAR #0 for action configuration
#define ACTION_CONFIG_OFFSET (0x10000)
#define MAILBOX_OFFSET (0x30000)
#define CALIB_BRAM_OFFSET (0x60000)
#define CMS_OFFSET (0xC0000)
#define CMAC_OFFSET (0x20000)
#define PCIE_OFFSET (0x90000)
#define ACTION_CONFIG_OFFSET (0x010000)
#define MAILBOX_OFFSET (0x030000)
#define CALIB_BRAM_OFFSET (0x060000)
#define CMS_OFFSET (0x0C0000)
#define CMAC_OFFSET (0x020000)
#define PCIE_OFFSET (0x090000)
#define INT_PKT_GEN_OFFSET (0x100000)
#define ADDR_CMS_CONTROL_REG 0x028018
#define ADDR_CMS_MB_RESETN_REG 0x020000
@@ -52,6 +53,8 @@
#define ADDR_CMS_HBM_TEMP1_INS_REG 0x028268 // in C
#define ADDR_CMS_HBM_TEMP2_INS_REG 0x0282BC // in C
#define INT_PKT_GEN_FRAME_SIZE_BYTES (512U*1024U*2UL)
struct jfjoch_buf {
dma_addr_t dma_address;
void *kernel_address;
@@ -100,6 +103,8 @@ void jfjoch_set_mac_addr(struct jfjoch_drvdata *drvdata, u64 *mac_addr);
void jfjoch_get_mac_addr(struct jfjoch_drvdata *drvdata, u64 *mac_addr);
void jfjoch_set_ipv4_addr(struct jfjoch_drvdata *drvdata, const u32 *addr);
void jfjoch_get_ipv4_addr(struct jfjoch_drvdata *drvdata, u32 *addr);
void jfjoch_load_int_pkt_gen(struct jfjoch_drvdata *drvdata, char* output);
void jfjoch_save_int_pkt_gen(struct jfjoch_drvdata *drvdata, const char* input);
u64 jfjoch_read_mac_addr(struct jfjoch_drvdata *drvdata);
+8
View File
@@ -85,6 +85,14 @@ int jfjoch_send_wr(struct jfjoch_drvdata *drvdata, u32 handle) {
return 0;
}
void jfjoch_load_int_pkt_gen(struct jfjoch_drvdata *drvdata, char* output) {
memcpy_fromio(output, drvdata->bar0 + INT_PKT_GEN_OFFSET, INT_PKT_GEN_FRAME_SIZE_BYTES);
}
void jfjoch_save_int_pkt_gen(struct jfjoch_drvdata *drvdata, const char* input) {
memcpy_toio(drvdata->bar0 + INT_PKT_GEN_OFFSET, input, INT_PKT_GEN_FRAME_SIZE_BYTES);
}
int jfjoch_read_wc(struct jfjoch_drvdata *drvdata, u32 *output) {
u32 rta;
int i;
+23
View File
@@ -11,6 +11,7 @@ long jfjoch_cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {
struct ActionEnvParams env_params;
u32 exchange[16];
int err;
void *tmp = NULL;
switch (cmd) {
case IOCTL_JFJOCH_START:
@@ -96,6 +97,28 @@ long jfjoch_cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {
case IOCTL_JFJOCH_DEFAULT_MAC:
jfjoch_read_mac_addr(drvdata);
return 0;
case IOCTL_JFJOCH_SET_INT_PKT:
tmp = vmalloc(INT_PKT_GEN_FRAME_SIZE_BYTES);
if (tmp == NULL)
return -ENOMEM;
if (copy_from_user(tmp, (char *) arg, INT_PKT_GEN_FRAME_SIZE_BYTES) != 0) {
vfree(tmp);
return -EFAULT;
}
jfjoch_save_int_pkt_gen(drvdata, tmp);
vfree(tmp);
return 0;
case IOCTL_JFJOCH_GET_INT_PKT:
tmp = vmalloc(INT_PKT_GEN_FRAME_SIZE_BYTES);
if (tmp == NULL)
return -ENOMEM;
jfjoch_load_int_pkt_gen(drvdata, tmp);
if (copy_to_user((char *) arg, tmp, INT_PKT_GEN_FRAME_SIZE_BYTES) != 0) {
vfree(tmp);
return -EFAULT;
}
vfree(tmp);
return 0;
default:
return -ENOTTY;
}
+2
View File
@@ -33,5 +33,7 @@
#define IOCTL_JFJOCH_DEFAULT_MAC _IO (IOCTL_JFJOCH_MAGIC, 16)
#define IOCTL_JFJOCH_SET_IPV4 _IOW(IOCTL_JFJOCH_MAGIC, 17, uint32_t)
#define IOCTL_JFJOCH_GET_IPV4 _IOR(IOCTL_JFJOCH_MAGIC, 18, uint32_t)
#define IOCTL_JFJOCH_SET_INT_PKT _IOW(IOCTL_JFJOCH_MAGIC, 19, char *)
#define IOCTL_JFJOCH_GET_INT_PKT _IOR(IOCTL_JFJOCH_MAGIC, 20, char *)
#endif //JUNGFRAUJOCH_JFJOCH_IOCTL_H
+4
View File
@@ -45,6 +45,10 @@ ADD_EXECUTABLE(jfjoch_pcie_clear_net_counters jfjoch_pcie_clear_net_counters.cpp
TARGET_LINK_LIBRARIES(jfjoch_pcie_clear_net_counters JungfraujochHost)
INSTALL(TARGETS jfjoch_pcie_clear_net_counters RUNTIME)
ADD_EXECUTABLE(jfjoch_pcie_read_int_packet_gen jfjoch_pcie_read_int_packet_gen.cpp)
TARGET_LINK_LIBRARIES(jfjoch_pcie_read_int_packet_gen JungfraujochHost)
INSTALL(TARGETS jfjoch_pcie_read_int_packet_gen RUNTIME)
ADD_LIBRARY(JFJochReceiver STATIC
JFJochReceiverService.cpp JFJochReceiverService.h
JFJochReceiverTest.cpp JFJochReceiverTest.h
+6
View File
@@ -201,3 +201,9 @@ std::string PCIExpressDevice::GetIPv4Address() const {
"Failed getting MAC address", errno);
return IPv4AddressToStr(tmp);
}
void PCIExpressDevice::HW_ReadInternalPacketGen(uint16_t *tmp) const {
if (ioctl(fd, IOCTL_JFJOCH_GET_INT_PKT, tmp) != 0)
throw JFJochException(JFJochExceptionCategory::PCIeError,
"Failed getting internal packet generator frame", errno);
}
+1
View File
@@ -30,6 +30,7 @@ public:
void Cancel() override;
void HW_GetStatus(ActionStatus *status) const override;
void HW_GetEnvParams(ActionEnvParams *status) const override;
void HW_ReadInternalPacketGen(uint16_t *tmp) const;
uint32_t GetNumKernelBuffers() const;
int32_t GetNUMANode() const override;
@@ -0,0 +1,35 @@
// Copyright (2019-2022) Paul Scherrer Institute
// SPDX-License-Identifier: GPL-3.0-or-later
#include <iostream>
#include "../common/JFJochException.h"
#include "PCIExpressDevice.h"
#include "../common/Logger.h"
#include <fstream>
int main(int argc, char **argv) {
Logger logger("jfjoch_pcie_read_int_packet_gen");
if (argc != 2) {
logger.Error("Usage: ./jfjoch_pcie_read_int_packet_gen <device name>");
exit(EXIT_FAILURE);
}
logger.Info("Device {}", argv[1]);
std::cout << std::endl;
try {
PCIExpressDevice test(argv[1], 0);
std::vector<uint8_t> data(RAW_MODULE_SIZE*2);
test.HW_ReadInternalPacketGen((uint16_t *) data.data());
std::ofstream file("out.bin", std::ios::binary);
file.write((char *) data.data(), data.size());
file.close();
logger.Info("Done");
} catch (const JFJochException &e) {
logger.ErrorException(e);
}
}