Skip to content

Commit 4b7b942

Browse files
raghav-nexthoplotus-nexthop
authored andcommitted
IGNORE THIS COMMIT: [PDDF] multifpgapci driver support for multiple protocols (PR sonic-net#24070)
1 parent 437dc69 commit 4b7b942

File tree

9 files changed

+914
-235
lines changed

9 files changed

+914
-235
lines changed

device/nexthop/x86_64-nexthop_4010-r0/pddf/pddf-device.json.j2

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
"optoe"
3838
],
3939
"pddf_kos": [
40+
"pddf_multifpgapci_i2c_module",
41+
"pddf_multifpgapci_gpio_module",
4042
"pddf_client_module",
4143
"pddf_multifpgapci_driver",
4244
"pddf_multifpgapci_module",

platform/broadcom/sonic-platform-modules-nexthop/common/modules/pddf_custom_fpga_algo.c

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -540,32 +540,25 @@ static int fpgai2c_init(struct fpgalogic_i2c *i2c)
540540

541541
static int adap_data_init(struct i2c_adapter *adap, int index)
542542
{
543-
struct pddf_multifpgapci_drvdata *pci_privdata = 0;
544-
pci_privdata = (struct pddf_multifpgapci_drvdata*) dev_get_drvdata(adap->dev.parent);
545-
546-
if (pci_privdata == 0) {
547-
printk("[%s]: ERROR pci_privdata is 0\n", __FUNCTION__);
543+
struct pci_dev *dev = to_pci_dev(adap->dev.parent);
544+
struct i2c_adapter_data i2c_data;
545+
int error = pddf_multifpgapci_i2c_get_adapter_data(dev, &i2c_data);
546+
if (error) {
547+
printk("[%s]: ERROR getting i2c adapter_data: %d\n", __FUNCTION__, error);
548548
return -1;
549549
}
550550

551-
if (pci_privdata->i2c_adapter_drvdata_initialized != 1) {
552-
printk("[%s]: ERROR i2c_adapter_drvdata is not initialized\n", __FUNCTION__);
553-
return -1;
554-
}
555-
struct i2c_adapter_drvdata *i2c_privdata = &pci_privdata->i2c_adapter_drvdata;
556-
557-
int i2c_ch_index = index + i2c_privdata->virt_bus;
551+
int i2c_ch_index = index + i2c_data.virt_bus;
558552

559-
pddf_dbg(FPGA, KERN_INFO "[%s] index: [%d] fpga_data__base_addr:0x%08lx"
560-
" fpgapci_bar_len:0x%08lx fpga_i2c_ch_base_addr:0x%08lx ch_ssize=0x%x supported_i2c_ch=%d",
561-
__FUNCTION__, i2c_ch_index, pci_privdata->fpga_data_base_addr,
562-
pci_privdata->bar_length, i2c_privdata->ch_base_addr,
563-
i2c_privdata->ch_size, i2c_privdata->num_virt_ch);
553+
pddf_dbg(FPGA, KERN_INFO "[%s] index: [%d] pci_dev: [%s]"
554+
" fpga_i2c_ch_base_addr:0x%08lx ch_ssize=0x%x supported_i2c_ch=%d",
555+
__FUNCTION__, i2c_ch_index, pci_name(dev),
556+
i2c_data.ch_base_addr, i2c_data.ch_size, i2c_data.num_virt_ch);
564557

565-
if (index >= i2c_privdata->num_virt_ch
566-
|| i2c_privdata->num_virt_ch > I2C_PCI_MAX_BUS){
558+
if (index >= i2c_data.num_virt_ch
559+
|| i2c_data.num_virt_ch > I2C_PCI_MAX_BUS){
567560
printk("[%s]: ERROR i2c_ch_index=%d max_ch_index=%d out of range: %d\n",
568-
__FUNCTION__, i2c_ch_index, i2c_privdata->num_virt_ch, I2C_PCI_MAX_BUS);
561+
__FUNCTION__, i2c_ch_index, i2c_data.num_virt_ch, I2C_PCI_MAX_BUS);
569562
return -1;
570563
}
571564

@@ -574,8 +567,8 @@ static int adap_data_init(struct i2c_adapter *adap, int index)
574567
#else
575568
memset(&fpgalogic_i2c[i2c_ch_index], 0, sizeof(fpgalogic_i2c[0]));
576569
#endif
577-
fpgalogic_i2c[i2c_ch_index].base = i2c_privdata->ch_base_addr +
578-
index * i2c_privdata->ch_size;
570+
fpgalogic_i2c[i2c_ch_index].base = i2c_data.ch_base_addr +
571+
index * i2c_data.ch_size;
579572
mutex_init(&fpgalogic_i2c[i2c_ch_index].lock);
580573
fpgai2c_init(&fpgalogic_i2c[i2c_ch_index]);
581574

@@ -597,7 +590,7 @@ static int pddf_i2c_multifpgapci_add_numbered_bus_default (struct i2c_adapter *a
597590
/*
598591
* FPGAPCI APIs
599592
*/
600-
static int board_i2c_fpgapci_read(const char *bdf, uint32_t offset)
593+
int board_i2c_fpgapci_read(const char *bdf, uint32_t offset)
601594
{
602595
if (get_fpga_ctl_addr == NULL) {
603596
printk(KERN_ERR "get_fpga_ctl_addr function not available\n");
@@ -615,7 +608,7 @@ static int board_i2c_fpgapci_read(const char *bdf, uint32_t offset)
615608
}
616609

617610

618-
static int board_i2c_fpgapci_write(const char *bdf, uint32_t offset, uint32_t value)
611+
int board_i2c_fpgapci_write(const char *bdf, uint32_t offset, uint32_t value)
619612
{
620613
if (get_fpga_ctl_addr == NULL) {
621614
printk(KERN_ERR "get_fpga_ctl_addr function not available\n");

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,19 @@
2525
#include "pddf_multifpgapci_i2c_defs.h"
2626

2727
#define NAME_SIZE 32
28+
29+
#ifndef KOBJ_FREE
2830
#define KOBJ_FREE(obj) \
2931
if (obj) \
3032
kobject_put(obj);
33+
#endif
3134

3235
struct pddf_multifpgapci_drvdata {
3336
struct pci_dev *pci_dev;
3437
resource_size_t bar_start;
3538
void *__iomem fpga_data_base_addr;
36-
// i2c
3739
size_t bar_length;
38-
struct kobject *i2c_kobj;
39-
struct i2c_adapter_drvdata i2c_adapter_drvdata;
40-
bool i2c_adapter_drvdata_initialized;
41-
// gpio
42-
struct kobject *gpio_kobj;
43-
struct gpio_chip_drvdata gpio_chip_drvdata;
44-
bool gpio_chip_drvdata_initialized;
40+
bool bar_initialized;
4541
};
4642

4743
// FPGA
@@ -54,9 +50,31 @@ struct pddf_multi_fpgapci_ops_t {
5450
int (*post_device_operation)(struct pci_dev *);
5551
};
5652

53+
// Protocol function pointer types
54+
typedef int (*attach_fn)(struct pci_dev *pci_dev, struct kobject *kobj);
55+
typedef void (*detach_fn)(struct pci_dev *pci_dev, struct kobject *kobj);
56+
typedef void (*map_bar_fn)(struct pci_dev *pci_dev, void *__iomem bar_base,
57+
unsigned long bar_start, unsigned long bar_len);
58+
typedef void (*unmap_bar_fn)(struct pci_dev *pci_dev, void *__iomem bar_base,
59+
unsigned long bar_start, unsigned long bar_len);
60+
61+
// Protocol operations structure
62+
struct protocol_ops {
63+
attach_fn attach;
64+
detach_fn detach;
65+
map_bar_fn map_bar;
66+
unmap_bar_fn unmap_bar;
67+
const char *name;
68+
};
69+
5770
extern struct pddf_multi_fpgapci_ops_t pddf_multi_fpgapci_ops;
5871

5972
extern int (*ptr_multifpgapci_readpci)(struct pci_dev *, uint32_t, uint32_t *);
6073
extern int (*ptr_multifpgapci_writepci)(struct pci_dev *, uint32_t, uint32_t);
6174

75+
extern int multifpgapci_register_protocol(const char *name,
76+
struct protocol_ops *ops);
77+
extern void multifpgapci_unregister_protocol(const char *name);
78+
extern unsigned long multifpgapci_get_pci_dev_index(struct pci_dev *pci_dev);
79+
6280
#endif

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct gpio_chip_attrs {
6161
sizeof(PDDF_ATTR))
6262

6363
struct gpio_chip_drvdata {
64+
struct kobject *gpio_kobj;
6465
// pdata is passed to gpio platform driver.
6566
struct pddf_multifpgapci_gpio_chip_pdata pdata;
6667
// temp_line_data is mutated by sysfs attrs and copied to pdata.

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,18 @@ struct i2c_adapter_sysfs_vals {
4444
uint32_t num_virt_ch;
4545
};
4646

47+
struct i2c_adapter_data {
48+
int virt_bus;
49+
void *__iomem ch_base_addr;
50+
int ch_size;
51+
int num_virt_ch;
52+
};
53+
4754
struct i2c_adapter_drvdata {
55+
struct pci_dev *pci_dev;
56+
size_t bar_length;
57+
struct kobject *i2c_kobj;
58+
4859
// temp_sysfs_vals store temporary values provided by sysfs,
4960
// which are eventually copied/saved to I2C adapter platform data.
5061
struct i2c_adapter_sysfs_vals temp_sysfs_vals;
@@ -70,4 +81,8 @@ extern int pddf_multifpgapci_i2c_module_init(struct pci_dev *pci_dev,
7081
extern void pddf_multifpgapci_i2c_module_exit(struct pci_dev *pci_dev,
7182
struct kobject *kobj);
7283

73-
#endif
84+
extern int
85+
pddf_multifpgapci_i2c_get_adapter_data(struct pci_dev *pci_dev,
86+
struct i2c_adapter_data *data);
87+
88+
#endif
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
obj-m := driver/ gpio/ i2c/
22
obj-m += pddf_multifpgapci_module.o
33

4-
ccflags-y:= -I$(M)/modules/include
4+
ccflags-y := -I$(M)/modules/include

0 commit comments

Comments
 (0)