Skip to content

Commit 506540c

Browse files
lotus-nexthopmichaelc-nexthoplouis-nexthop
authored andcommitted
[PDDF] Add multi PCIE FPGA controlled LED (sonic-net#22766)
* IGNORE THIS COMMIT: Multiple FPGAs w/ I2C IP block (PR sonic-net#22748) * [PDDF] Add multi PCIE FPGA controlled LED * parse multifpgapciesystem appropriately * IGNORE THIS COMMIT: Remove PDDF_DATA_ATTR_VAL and use client device table (PR sonic-net#22748) * [PDDF] Remove attr_bdf for MultiFPGA LED * IGNORE THIS COMMIT: Remove multifpgapcisystem_parse() in pddfapi.py (PR sonic-net#22748) * no-op commit to retrigger workflow --------- Co-authored-by: Michael Chan <michaelc@nexthop.ai> Co-authored-by: Louis Maliyam <louis@nexthop.ai>
1 parent d6fb200 commit 506540c

2 files changed

Lines changed: 98 additions & 16 deletions

File tree

platform/pddf/i2c/modules/include/pddf_led_defs.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,11 @@ typedef enum{
123123
LED_FANTRAY,
124124
LED_DIAG,
125125
LED_LOC,
126-
LED_BMC,
126+
LED_BMC,
127+
LED_PORT,
127128
LED_TYPE_MAX
128129
} LED_TYPE;
130+
129131
char* LED_TYPE_STR[LED_TYPE_MAX] =
130132
{
131133
"LED_SYS",
@@ -134,7 +136,8 @@ char* LED_TYPE_STR[LED_TYPE_MAX] =
134136
"LED_FANTRAY",
135137
"LED_DIAG",
136138
"LED_LOC",
137-
"LED_BMC"
139+
"LED_BMC",
140+
"LED_PORT",
138141
};
139142

140143
/*****************************************

platform/pddf/i2c/modules/led/pddf_led_module.c

Lines changed: 93 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,25 @@
2323
#include <linux/module.h>
2424
#include <linux/init.h>
2525
#include <linux/hwmon-sysfs.h>
26-
#include "pddf_led_defs.h"
27-
#include "pddf_client_defs.h"
2826
#include <linux/err.h>
2927
#include <linux/mutex.h>
3028
#include <linux/slab.h>
29+
#include "pddf_client_defs.h"
30+
#include "pddf_led_defs.h"
31+
#include "pddf_multifpgapci_defs.h"
3132

3233
#define DEBUG 0
3334
#define MAX_PSU_NUM 2
3435
#define MAX_FANTRAY_NUM 6
36+
#define MAX_PORT_NUM (48 * 8)
3537
LED_OPS_DATA sys_led_ops_data[1]={0};
3638
LED_OPS_DATA psu_led_ops_data[MAX_PSU_NUM]={0};
3739
LED_OPS_DATA diag_led_ops_data[1]= {0};
3840
LED_OPS_DATA fan_led_ops_data[1]= {0};
3941
LED_OPS_DATA loc_led_ops_data[1]= {0};
4042
LED_OPS_DATA bmc_led_ops_data[1]= {0};
4143
LED_OPS_DATA fantray_led_ops_data[MAX_FANTRAY_NUM]={0};
44+
LED_OPS_DATA port_led_ops_data[MAX_PORT_NUM] = {0};
4245
LED_OPS_DATA temp_data={0};
4346
LED_OPS_DATA* dev_list[LED_TYPE_MAX] = {
4447
sys_led_ops_data,
@@ -48,6 +51,7 @@ LED_OPS_DATA* dev_list[LED_TYPE_MAX] = {
4851
diag_led_ops_data,
4952
loc_led_ops_data,
5053
bmc_led_ops_data,
54+
port_led_ops_data,
5155
NULL
5256
};
5357
int num_psus = 0;
@@ -63,6 +67,8 @@ extern ssize_t store_pddf_data(struct device *dev, struct device_attribute *da,
6367
extern ssize_t show_pddf_s3ip_data(struct device *dev, struct device_attribute *da, char *buf);
6468
extern ssize_t store_pddf_s3ip_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count);
6569

70+
extern void* get_device_table(char *name);
71+
6672
static LED_STATUS find_state_index(const char* state_str) {
6773
int index;
6874
char *ptr = (char *)state_str;
@@ -91,6 +97,8 @@ static LED_TYPE get_dev_type(char* name)
9197
ret = LED_LOC;
9298
} else if(strstr(name, "FANTRAY_LED")) {
9399
ret = LED_FANTRAY;
100+
} else if(strstr(name, "PORT_LED")) {
101+
ret = LED_PORT;
94102
}
95103
#if DEBUG > 1
96104
pddf_dbg(LED, KERN_INFO "LED get_dev_type: %s; %d\n", name, ret);
@@ -111,6 +119,9 @@ static int dev_index_check(LED_TYPE type, int index)
111119
case LED_FANTRAY:
112120
if(index >= MAX_FANTRAY_NUM) return (-1);
113121
break;
122+
case LED_PORT:
123+
if(index >= MAX_PORT_NUM) return (-1);
124+
break;
114125
default:
115126
if(index >= 1) return (-1);
116127
break;
@@ -160,6 +171,42 @@ static void print_led_data(LED_OPS_DATA *ptr, LED_STATUS state)
160171
}
161172
}
162173

174+
int led_multifpgapci_read(LED_OPS_DATA *ops_ptr, uint32_t *output) {
175+
struct pci_dev *pci_dev = NULL;
176+
177+
if (ptr_multifpgapci_readpci == NULL) {
178+
printk(KERN_ERR "PDDF_LED: pddf_multifpgapci_module is not loaded");
179+
return -1;
180+
}
181+
182+
pci_dev = (struct pci_dev *)get_device_table(ops_ptr->attr_devname);
183+
if (pci_dev == NULL) {
184+
printk(KERN_ERR "PDDF_LED: Unable to get pci_dev of %s for %s\n",
185+
ops_ptr->attr_devname, ops_ptr->device_name);
186+
return -1;
187+
}
188+
return ptr_multifpgapci_readpci(
189+
pci_dev, ops_ptr->swpld_addr + ops_ptr->swpld_addr_offset, output);
190+
}
191+
192+
int led_multifpgapci_write(LED_OPS_DATA *ops_ptr, uint32_t val) {
193+
struct pci_dev *pci_dev = NULL;
194+
195+
if (ptr_multifpgapci_readpci == NULL || ptr_multifpgapci_writepci == NULL) {
196+
printk(KERN_ERR "PDDF_LED: pddf_multifpgapci_module is not loaded");
197+
return -1;
198+
}
199+
200+
pci_dev = (struct pci_dev *)get_device_table(ops_ptr->attr_devname);
201+
if (pci_dev == NULL) {
202+
printk(KERN_ERR "PDDF_LED: Unable to get pci_dev of %s for %s\n",
203+
ops_ptr->attr_devname, ops_ptr->device_name);
204+
return -1;
205+
}
206+
return ptr_multifpgapci_writepci(
207+
pci_dev, val, ops_ptr->swpld_addr + ops_ptr->swpld_addr_offset);
208+
}
209+
163210
ssize_t get_status_led(struct device_attribute *da)
164211
{
165212
int ret=0;
@@ -185,35 +232,51 @@ ssize_t get_status_led(struct device_attribute *da)
185232
if (strcmp(ops_ptr->attr_devtype, "cpld") == 0) {
186233
cpld_type = 1;
187234
sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
235+
if (sys_val < 0) {
236+
pddf_dbg(LED, KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x read failed\n",__func__,
237+
ops_ptr->device_name, ops_ptr->index, ops_ptr->attr_devtype, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
238+
return sys_val;
239+
}
188240
} else if (strcmp(ops_ptr->attr_devtype, "fpgai2c") == 0) {
189241
sys_val = board_i2c_fpga_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
242+
if (sys_val < 0) {
243+
pddf_dbg(LED, KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x read failed\n",__func__,
244+
ops_ptr->device_name, ops_ptr->index, ops_ptr->attr_devtype, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
245+
return sys_val;
246+
}
247+
} else if (strcmp(ops_ptr->attr_devtype, "multifpgapci") == 0) {
248+
ret = led_multifpgapci_read(ops_ptr, &sys_val);
249+
if (ret)
250+
goto ret;
190251
} else {
191252
pddf_dbg(LED, KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x not configured\n",__func__,
192253
ops_ptr->device_name, ops_ptr->index, ops_ptr->attr_devtype, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
193254
return (-1);
194255
}
195256

196-
if (sys_val < 0) {
197-
pddf_dbg(LED, KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x read failed\n",__func__,
198-
ops_ptr->device_name, ops_ptr->index, ops_ptr->attr_devtype, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
199-
return sys_val;
200-
}
201-
202257
strcpy(temp_data.cur_state.color, "None");
203258
for (state=0; state<MAX_LED_STATUS; state++) {
204259
color_val = (sys_val & ~ops_ptr->data[state].bits.mask_bits);
205260
for (j = 0; j < VALUE_SIZE && ops_ptr->data[state].reg_values[j] != 0xff; j++) {
206261
if ((color_val ^ (ops_ptr->data[state].reg_values[j] << ops_ptr->data[state].bits.pos)) == 0) {
207262
strcpy(temp_data.cur_state.color, LED_STATUS_STR[state]);
208-
break;
263+
goto found_match;
209264
}
210265
}
211266
}
267+
268+
found_match:
212269
#if DEBUG
213270
pddf_dbg(LED, KERN_ERR "Get : %s:%d addr/offset:0x%x; 0x%x devtype:%s;%s value=0x%x [%s]\n",
214271
ops_ptr->device_name, ops_ptr->index, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset,
215272
ops_ptr->attr_devtype, cpld_type? "cpld": "fpgai2c", sys_val, temp_data.cur_state.color);
216273
#endif
274+
275+
ret:
276+
if (ret) {
277+
printk(KERN_ERR "%s: Error status = %d", __FUNCTION__, ret);
278+
}
279+
217280
return(ret);
218281
}
219282

@@ -253,17 +316,22 @@ ssize_t set_status_led(struct device_attribute *da)
253316
if (strcmp(ops_ptr->data[cur_state].attr_devtype, "cpld") == 0) {
254317
cpld_type = 1;
255318
sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
319+
if (sys_val < 0)
320+
return sys_val;
256321
} else if (strcmp(ops_ptr->data[cur_state].attr_devtype, "fpgai2c") == 0) {
257322
sys_val = board_i2c_fpga_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
323+
if (sys_val < 0)
324+
return sys_val;
325+
} else if (strcmp(ops_ptr->attr_devtype, "multifpgapci") == 0) {
326+
ret = led_multifpgapci_read(ops_ptr, &sys_val);
327+
if (ret)
328+
goto ret;
258329
} else {
259330
pddf_dbg(LED, KERN_ERR "ERROR %s: %s %d devtype:%s not configured\n",__func__,
260331
ops_ptr->device_name, ops_ptr->index, ops_ptr->attr_devtype);
261332
return (-1);
262333
}
263334

264-
if (sys_val < 0)
265-
return sys_val;
266-
267335
new_val = (sys_val & ops_ptr->data[cur_state].bits.mask_bits) |
268336
(ops_ptr->data[cur_state].reg_values[0] << ops_ptr->data[cur_state].bits.pos);
269337

@@ -279,6 +347,13 @@ ssize_t set_status_led(struct device_attribute *da)
279347
} else if (strcmp(ops_ptr->data[cur_state].attr_devtype, "fpgai2c") == 0) {
280348
ret = board_i2c_fpga_write(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, (uint8_t)new_val);
281349
read_val = board_i2c_fpga_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset);
350+
} else if (strcmp(ops_ptr->attr_devtype, "multifpgapci") == 0) {
351+
ret = led_multifpgapci_write(ops_ptr, new_val);
352+
if (ret)
353+
goto ret;
354+
ret = led_multifpgapci_read(ops_ptr, &read_val);
355+
if (ret)
356+
goto ret;
282357
} else {
283358
pddf_dbg(LED, KERN_ERR "ERROR %s: %s %d devtype:%s not configured\n",__func__,
284359
ops_ptr->device_name, ops_ptr->index, ops_ptr->attr_devtype);
@@ -291,6 +366,11 @@ ssize_t set_status_led(struct device_attribute *da)
291366
cpld_type? "cpld":"fpgai2c", ret, read_val, ops_ptr->data[cur_state].attr_devtype);
292367
#endif
293368

369+
ret:
370+
if (ret) {
371+
printk(KERN_ERR "%s: Error status = %d", __FUNCTION__, ret);
372+
}
373+
294374
return(ret);
295375
}
296376

@@ -634,7 +714,7 @@ ssize_t store_config_data(struct device *dev, struct device_attribute *da, const
634714
ssize_t store_bits_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
635715
{
636716
int len = 0, num1 = 0, num2 = 0, i=0, rc1=0, rc2=0;
637-
char mask=0xFF;
717+
unsigned int mask = 0xFFFFFFFF;
638718
char *pptr=NULL;
639719
char bits[NAME_SIZE];
640720
struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da;
@@ -853,7 +933,6 @@ static int __init led_init(void) {
853933
return (0);
854934
}
855935

856-
857936
static void __exit led_exit(void) {
858937
pddf_dbg(LED, "PDDF GENERIC LED MODULE exit..\n");
859938
free_kobjs();

0 commit comments

Comments
 (0)