PCIe driver: add functions to load/save internal packet generator memory
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user