Apply consistent spaces and style across project
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

This commit is contained in:
DataHoarder 2021-12-19 15:32:37 +01:00
parent 702209cbe6
commit 37b1644120
5 changed files with 135 additions and 131 deletions

View file

@ -53,14 +53,14 @@ int main(int argc, char **argv) {
}
FM10K_PCI_MAPPED_DEVICE map;
FM10K_PCI_DEVICES devices = fm10k_pci_findDevices();
FM10K_PCI_DEVICES devices = fm10k_pci_findDevices();
if(fm10k_pci_findDevice(&devices, &map)){
printf("Unable to find FM10K device with BAR4 port access, or could not take SPI lock. Check bifurcation settings?\n");
return 1;
}
if (fm10k_pci_findDevice(&devices, &map)) {
printf("Unable to find FM10K device with BAR4 port access, or could not take SPI lock. Check bifurcation settings?\n");
return 1;
}
printf("FM10K device found at %s :: Vendor 0x%04x :: Class 0x%04x\n", map.device->bar4Path, map.device->vendor, map.device->class);
printf("FM10K device found at %s :: Vendor 0x%04x :: Class 0x%04x\n", map.device->bar4Path, map.device->vendor, map.device->class);
SPI_COMMAND_READ_MANUFACTURER_RESULT manufacturerInfo = fm10k_mem_spi_ReadManufacturerData((uintptr_t) map.map);
if (manufacturerInfo.value == 0) {
@ -129,7 +129,7 @@ int main(int argc, char **argv) {
fm10k_mem_ReleasePlatformLock((uintptr_t) map.map);
fm10k_pci_unmapDevice(&map);
fm10k_pci_unmapDevice(&map);
printf("Read %u bytes\n", bootImageSize);

View file

@ -39,7 +39,6 @@
#include <unistd.h>
int main(int argc, char **argv) {
FILE *fdBackup;
FILE *fdInput;
@ -76,15 +75,15 @@ int main(int argc, char **argv) {
return 1;
}
FM10K_PCI_MAPPED_DEVICE map;
FM10K_PCI_DEVICES devices = fm10k_pci_findDevices();
FM10K_PCI_MAPPED_DEVICE map;
FM10K_PCI_DEVICES devices = fm10k_pci_findDevices();
if(fm10k_pci_findDevice(&devices, &map)){
printf("Unable to find FM10K device with BAR4 port access, or could not take SPI lock. Check bifurcation settings?\n");
return 1;
}
if (fm10k_pci_findDevice(&devices, &map)) {
printf("Unable to find FM10K device with BAR4 port access, or could not take SPI lock. Check bifurcation settings?\n");
return 1;
}
printf("FM10K device found at %s :: Vendor 0x%04x :: Class 0x%04x\n", map.device->bar4Path, map.device->vendor, map.device->class);
printf("FM10K device found at %s :: Vendor 0x%04x :: Class 0x%04x\n", map.device->bar4Path, map.device->vendor, map.device->class);
SPI_COMMAND_READ_MANUFACTURER_RESULT manufacturerInfo = fm10k_mem_spi_ReadManufacturerData((uintptr_t) map.map);
if (manufacturerInfo.value == 0) {
@ -238,7 +237,7 @@ int main(int argc, char **argv) {
fm10k_mem_ReleasePlatformLock((uintptr_t) map.map);
fm10k_pci_unmapDevice(&map);
fm10k_pci_unmapDevice(&map);
free(value);

View file

@ -46,11 +46,11 @@ KNOWN_FLASH_DEVICE KNOWN_FLASH_DEVICE_LIST[] = {
};
void ReadRegister32(uintptr_t mem, uint32_t addr, uint32_t *value) {
*value = *(((volatile uint32_t *) mem) + addr);
*value = *(((volatile uint32_t *) mem) + addr);
}
void WriteRegister32(uintptr_t mem, uint32_t addr, uint32_t value) {
*(((volatile uint32_t *) mem) + addr) = value;
*(((volatile uint32_t *) mem) + addr) = value;
//If returning instantly this will caused missed writes. nanosleep wait of 1 nsec was too much. Busy wait works
#pragma GCC diagnostic push
@ -430,43 +430,43 @@ const KNOWN_FLASH_DEVICE *getKnownFlashFromManufacturerData(SPI_COMMAND_READ_MAN
return NULL;
}
uint8_t fm10k_mem_spi_LockTake(uintptr_t mem){
uint8_t fm10k_mem_spi_LockTake(uintptr_t mem) {
uint32_t maxTries = 64;
API_SPI_LOCK_STATE spiLock;
do{
do {
ReadRegister32(mem, FM10K_API_SPI_LOCK_STATE, &spiLock.value);
if(!spiLock.fields.LockTaken){
if (!spiLock.fields.LockTaken) {
spiLock.fields.LockTaken = 1;
spiLock.fields.LockOwner = 0; //Switch API
WriteRegister32(mem, FM10K_API_SPI_LOCK_STATE, spiLock.value);
nanosleep(&(struct timespec){0, 50000}, NULL); //Delay to observe if lock was actually taken by us
nanosleep(&(struct timespec) {0, 50000}, NULL); //Delay to observe if lock was actually taken by us
ReadRegister32(mem, FM10K_API_SPI_LOCK_STATE, &spiLock.value);
if(spiLock.fields.LockTaken && spiLock.fields.LockOwner == 0){
if (spiLock.fields.LockTaken && spiLock.fields.LockOwner == 0) {
printf("Taken SPI Lock\n");
return 0;
}
}else if(spiLock.fields.LockOwner == 0){ //Are we taking a lock again, with same owner?
} else if (spiLock.fields.LockOwner == 0) { //Are we taking a lock again, with same owner?
printf("WARNING: SPI Lock was already taken by us, maybe other process was using it?\n");
return 0;
}
nanosleep(&(struct timespec){0, 1000}, NULL);
nanosleep(&(struct timespec) {0, 1000}, NULL);
} while (--maxTries);
return 1;
}
void fm10k_mem_spi_LockRelease(uintptr_t mem){
void fm10k_mem_spi_LockRelease(uintptr_t mem) {
API_SPI_LOCK_STATE spiLock;
ReadRegister32(mem, FM10K_API_SPI_LOCK_STATE, &spiLock.value);
if(!spiLock.fields.LockTaken) {
if (!spiLock.fields.LockTaken) {
printf("WARNING: SPI Lock was already released\n");
return;
}
if(spiLock.fields.LockOwner != 0){
if (spiLock.fields.LockOwner != 0) {
printf("WARNING: SPI Lock Owner unexpected: %u\n", spiLock.fields.LockOwner);
return;
}
@ -479,7 +479,7 @@ void fm10k_mem_spi_LockRelease(uintptr_t mem){
uint32_t bsm_interruptMask[2] = {0, 0};
void fm10k_mem_bsm_DisableInterrupts(uintptr_t mem){
void fm10k_mem_bsm_DisableInterrupts(uintptr_t mem) {
//Save old registers
ReadRegister32(mem, FM10K_REGISTER_INTERRUPT_MASK_BSM(0), bsm_interruptMask);
ReadRegister32(mem, FM10K_REGISTER_INTERRUPT_MASK_BSM(1), bsm_interruptMask + 1);
@ -487,90 +487,90 @@ void fm10k_mem_bsm_DisableInterrupts(uintptr_t mem){
WriteRegister32(mem, FM10K_REGISTER_INTERRUPT_MASK_BSM(1), 0xFFFFFFFF);
}
void fm10k_mem_bsm_RestoreInterrupts(uintptr_t mem){
void fm10k_mem_bsm_RestoreInterrupts(uintptr_t mem) {
WriteRegister32(mem, FM10K_REGISTER_INTERRUPT_MASK_BSM(0), bsm_interruptMask[0]);
WriteRegister32(mem, FM10K_REGISTER_INTERRUPT_MASK_BSM(1), bsm_interruptMask[1]);
}
uint8_t fm10k_mem_TakePlatformLock(uintptr_t mem){
if(fm10k_mem_spi_LockTake(mem)){
uint8_t fm10k_mem_TakePlatformLock(uintptr_t mem) {
if (fm10k_mem_spi_LockTake(mem)) {
return 1;
}
fm10k_mem_bsm_DisableInterrupts(mem);
return 0;
}
void fm10k_mem_ReleasePlatformLock(uintptr_t mem){
void fm10k_mem_ReleasePlatformLock(uintptr_t mem) {
fm10k_mem_spi_LockRelease(mem);
fm10k_mem_bsm_RestoreInterrupts(mem);
}
int fm10k_pci_unmapDevice(FM10K_PCI_MAPPED_DEVICE* map){
if(map->map != NULL && map->map != MAP_FAILED){
if(munmap(map->map, FM10K_BAR4_SIZE) != 0){
return 1;
}
map->map = NULL;
}
int fm10k_pci_unmapDevice(FM10K_PCI_MAPPED_DEVICE *map) {
if (map->map != NULL && map->map != MAP_FAILED) {
if (munmap(map->map, FM10K_BAR4_SIZE) != 0) {
return 1;
}
map->map = NULL;
}
if (map->fd > 0) {
if(close(map->fd) != 0){
return 1;
}
map->fd = 0;
}
if (map->fd > 0) {
if (close(map->fd) != 0) {
return 1;
}
map->fd = 0;
}
return 0;
return 0;
}
int fm10k_pci_mapDevice(const FM10K_PCI_DEVICE* device, FM10K_PCI_MAPPED_DEVICE* map){
int fdBAR4;
fdBAR4 = open(device->bar4Path, O_RDWR);
if (fdBAR4 <= 0) {
printf("Unable to open BAR4 resource %s to read NVM\n", device->bar4Path);
return 1;
}
int fm10k_pci_mapDevice(const FM10K_PCI_DEVICE *device, FM10K_PCI_MAPPED_DEVICE *map) {
int fdBAR4;
fdBAR4 = open(device->bar4Path, O_RDWR);
if (fdBAR4 <= 0) {
printf("Unable to open BAR4 resource %s to read NVM\n", device->bar4Path);
return 1;
}
void *memmapAddr;
memmapAddr = mmap(NULL, FM10K_BAR4_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fdBAR4, 0);
if (memmapAddr == MAP_FAILED) {
printf("Unable to map BAR4 resource %s to read NVM\n", device->bar4Path);
close(fdBAR4);
return 1;
}
void *memmapAddr;
memmapAddr = mmap(NULL, FM10K_BAR4_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fdBAR4, 0);
if (memmapAddr == MAP_FAILED) {
printf("Unable to map BAR4 resource %s to read NVM\n", device->bar4Path);
close(fdBAR4);
return 1;
}
map->device = device;
map->fd = fdBAR4;
map->map = memmapAddr;
map->device = device;
map->fd = fdBAR4;
map->map = memmapAddr;
if(fm10k_mem_TakePlatformLock((uintptr_t) map->map)){
//Error taking lock
fm10k_pci_unmapDevice(map);
return 1;
}
if (fm10k_mem_TakePlatformLock((uintptr_t) map->map)) {
//Error taking lock
fm10k_pci_unmapDevice(map);
return 1;
}
return 0;
return 0;
}
int fm10k_pci_findDevice(const FM10K_PCI_DEVICES* devices, FM10K_PCI_MAPPED_DEVICE* map) {
if(devices->count == 0){
return 1;
}
int fm10k_pci_findDevice(const FM10K_PCI_DEVICES *devices, FM10K_PCI_MAPPED_DEVICE *map) {
if (devices->count == 0) {
return 1;
}
for(uint32_t i = 0; i < devices->count; ++i){
if(fm10k_pci_mapDevice(&devices->devices[i], map) == 0){
return 0;
}
}
for (uint32_t i = 0; i < devices->count; ++i) {
if (fm10k_pci_mapDevice(&devices->devices[i], map) == 0) {
return 0;
}
}
return 1;
return 1;
}
FM10K_PCI_DEVICES fm10k_pci_findDevices() {
DIR *folder;
char fileName[PATH_MAX];
FM10K_PCI_DEVICES devices;
devices.count = 0;
devices.count = 0;
folder = opendir("/sys/bus/pci/devices");
if (folder == NULL) {
@ -600,16 +600,17 @@ FM10K_PCI_DEVICES fm10k_pci_findDevices() {
size_t classBytesRead = getdelim(&classBytesBuffer, &classBytesLen, '\0',
classBytesPointer);
if (classBytesRead != -1) {
unsigned int class = (unsigned int) strtoul(classBytesBuffer, NULL, 0);
unsigned int class = (unsigned int) strtoul(classBytesBuffer, NULL, 0);
if (class == 0x15a4 || class == 0x15d0 || class == 0x15d5) { //FM10000 devices
sprintf(fileName, "/sys/bus/pci/devices/%s/resource4", entry->d_name);
if (access(fileName, F_OK) == 0) {
devices.devices[devices.count].vendor = vendor;
devices.devices[devices.count].class = class;
devices.devices[devices.count].vendor = vendor;
devices.devices[devices.count].class = class;
sprintf(devices.devices[devices.count].bar4Path, "/sys/bus/pci/devices/%s/resource4", entry->d_name);
++devices.count;
sprintf(devices.devices[devices.count].bar4Path, "/sys/bus/pci/devices/%s/resource4",
entry->d_name);
++devices.count;
}
}
}

View file

@ -68,49 +68,49 @@
#endif
typedef union {
uint32_t value;
struct {
uint8_t LockTaken : 1; //Whether lock is currently taken by anyone
uint8_t LockOwner : 2; //Who owns the lock. Switch API = 0, QV tools = 1, Board Manager = 2, RESERVED = 3
uint32_t Reserved : 29;
} __attribute__((packed)) fields;
uint32_t value;
struct {
uint8_t LockTaken: 1; //Whether lock is currently taken by anyone
uint8_t LockOwner: 2; //Who owns the lock. Switch API = 0, QV tools = 1, Board Manager = 2, RESERVED = 3
uint32_t Reserved: 29;
} __attribute__((packed)) fields;
} API_SPI_LOCK_STATE;
typedef union {
uint32_t value;
struct {
uint16_t Freq: 10; // Actual speed is PCIE_REFCLK/(2*(1+Freq))
uint8_t Enable: 1;
uint8_t Command: 4; // 0b00 = reset
uint8_t HeaderSize: 2; // 0b00 = 4 bytes
uint8_t DataSize: 2; // 0b00 = 4 bytes
uint8_t DataShiftMethod: 2; // 0b00 = SINGLE, 0b01 = DUAL, 0b10 = QUAD, 0b11 = Reserved
uint8_t Busy: 1; // volatile ReadOnly
uint8_t Selected: 1; // volatile ReadOnly
uint8_t DirIO2: 1; // 0b0 = Input, 0b1 = Output
uint8_t DirIO3: 1; // 0b0 = Input, 0b1 = Output
uint8_t PinIO2: 1; // volatile ReadWrite
uint8_t PinIO3: 1; // volatile ReadWrite
uint8_t Reserved: 5;
} __attribute__((packed)) fields;
uint32_t value;
struct {
uint16_t Freq: 10; // Actual speed is PCIE_REFCLK/(2*(1+Freq))
uint8_t Enable: 1;
uint8_t Command: 4; // 0b00 = reset
uint8_t HeaderSize: 2; // 0b00 = 4 bytes
uint8_t DataSize: 2; // 0b00 = 4 bytes
uint8_t DataShiftMethod: 2; // 0b00 = SINGLE, 0b01 = DUAL, 0b10 = QUAD, 0b11 = Reserved
uint8_t Busy: 1; // volatile ReadOnly
uint8_t Selected: 1; // volatile ReadOnly
uint8_t DirIO2: 1; // 0b0 = Input, 0b1 = Output
uint8_t DirIO3: 1; // 0b0 = Input, 0b1 = Output
uint8_t PinIO2: 1; // volatile ReadWrite
uint8_t PinIO3: 1; // volatile ReadWrite
uint8_t Reserved: 5;
} __attribute__((packed)) fields;
} SPI_CTRL;
typedef union {
uint32_t value;
struct {
uint8_t manufacturerId: 8;
uint8_t densityCode: 5;
uint8_t familyCode: 3;
uint8_t productVariant: 5;
uint8_t subCode: 3;
uint8_t Reserved: 8;
} __attribute__((packed)) fields;
uint32_t value;
struct {
uint8_t manufacturerId: 8;
uint8_t densityCode: 5;
uint8_t familyCode: 3;
uint8_t productVariant: 5;
uint8_t subCode: 3;
uint8_t Reserved: 8;
} __attribute__((packed)) fields;
} SPI_COMMAND_READ_MANUFACTURER_RESULT;
typedef struct {
SPI_COMMAND_READ_MANUFACTURER_RESULT data;
char name[64];
uint32_t sizeInMbit;
SPI_COMMAND_READ_MANUFACTURER_RESULT data;
char name[64];
uint32_t sizeInMbit;
} KNOWN_FLASH_DEVICE;
#if defined(__TINYC__)
@ -163,14 +163,14 @@ uint32_t fm10k_mem_spi_WriteFlash(uintptr_t mem, uint32_t address, const uint8_t
#define FM10K_PCI_DEVICE_MAX 16
typedef struct {
uint16_t vendor;
uint16_t class;
char bar4Path[PATH_MAX];
uint16_t vendor;
uint16_t class;
char bar4Path[PATH_MAX];
} FM10K_PCI_DEVICE;
typedef struct {
const FM10K_PCI_DEVICE* device;
void* map;
const FM10K_PCI_DEVICE *device;
void *map;
int fd;
} FM10K_PCI_MAPPED_DEVICE;
@ -181,7 +181,9 @@ typedef struct {
FM10K_PCI_DEVICES fm10k_pci_findDevices();
int fm10k_pci_findDevice(const FM10K_PCI_DEVICES* devices, FM10K_PCI_MAPPED_DEVICE* map);
int fm10k_pci_mapDevice(const FM10K_PCI_DEVICE* device, FM10K_PCI_MAPPED_DEVICE* map);
int fm10k_pci_unmapDevice(FM10K_PCI_MAPPED_DEVICE* map);
int fm10k_pci_findDevice(const FM10K_PCI_DEVICES *devices, FM10K_PCI_MAPPED_DEVICE *map);
int fm10k_pci_mapDevice(const FM10K_PCI_DEVICE *device, FM10K_PCI_MAPPED_DEVICE *map);
int fm10k_pci_unmapDevice(FM10K_PCI_MAPPED_DEVICE *map);

View file

@ -41,15 +41,17 @@ int main(int argc, char **argv) {
uint32_t testsFailed = 0;
{
SPI_CTRL s;
TEST((uint32_t)sizeof(s.fields), (uint32_t)sizeof(s.value), "SPI_CTRL packed misalignment. size struct %u, size value %u");
TEST((uint32_t) sizeof(s.fields), (uint32_t) sizeof(s.value), "SPI_CTRL packed misalignment. size struct %u, size value %u");
}
{
SPI_COMMAND_READ_MANUFACTURER_RESULT s;
TEST((uint32_t)sizeof(s.fields), (uint32_t)sizeof(s.value), "SPI_COMMAND_READ_MANUFACTURER_RESULT packed misalignment. size struct %u, size value %u");
TEST((uint32_t) sizeof(s.fields), (uint32_t) sizeof(s.value),
"SPI_COMMAND_READ_MANUFACTURER_RESULT packed misalignment. size struct %u, size value %u");
}
{
API_SPI_LOCK_STATE s;
TEST((uint32_t)sizeof(s.fields), (uint32_t)sizeof(s.value), "API_SPI_LOCK_STATE packed misalignment. size struct %u, size value %u");
TEST((uint32_t) sizeof(s.fields), (uint32_t) sizeof(s.value),
"API_SPI_LOCK_STATE packed misalignment. size struct %u, size value %u");
}
printf("\nTests run, failed %u/%u\n", testsFailed, tests);