-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Platform Driver Development Framework (PDDF): Generic drivers and plugins #3387
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As comments.
Also, when do you plan on integrating the generic platform 2.0 API into PDDF? Most vendors are currently working on transitioning to the new API. The old plugins should no longer be used.
This PR has dependency on sonic-net/sonic-platform-common#62 which is approved. I have taken care of the comments related to tab-width etc. |
This PR has dependency over 1- sonic-net/sonic-platform-common#62 , and Out of these '1' is approved as well. |
When is the plan to support thermal devices behind BMC chip also media behind a FPGA chip ? |
pddf_obj = pddfparse.PddfParse() | ||
# system EEPROM always has device name EEPROM1 | ||
self.eeprom_path = pddf_obj.get_path("EEPROM1", "eeprom") | ||
super(board, self).__init__(self.eeprom_path, 0, '', True) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is it linux dev name EEPROM1 created by the PPDF framework driver ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
EEPROM1 is just the object name mentioned in the PDDF device json file. In PDDF, we call the system EEPROM with the name EEPROM1. For AS7712 and SA7726, we have used '1t24' driver for this device.
for port_num in range(self._port_start, self._port_end): | ||
device = "PORT" + "%d"%(port_num+1) | ||
port_eeprom_path = pddf_obj.get_path(device,"eeprom") | ||
self._port_to_eeprom_mapping[port_num] = port_eeprom_path |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
how do we handle platforms which does not have to create eeprom for the ports example ( 1G ports) platforms ?
We need to device a eeprom mapping as none to skip the loop.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In such case, we wouldn't mention the 'PORT<>-EEPROM' objects in pddf device json files. That way, get_path() would return None.
self._qsfp_ports.append(port) | ||
elif self._port_to_type_mapping[port] == 'SFP': | ||
self._sfp_ports.append(port) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These port types are supposed to added by ODM when a new platform support is created example SPF28 or DDQSFP ?
TODO: This function need to be implemented | ||
when decide to support monitoring SFP(Xcvrd) | ||
on this platform. | ||
""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When is the plan to implement this. So once PDDF is adapted change of events will be critical for run-time plug-in/out of media.
@@ -0,0 +1,94 @@ | |||
#!/usr/bin/env python |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we have comments of what each file in the plugins does ? It helps in easy understanding also it could be incremented with comment any new api's added
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sysstatusutil.py is not used as of now. Sure we will add the comments.
* Copyright 2019 Broadcom. All rights reserved. | ||
* The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. | ||
* | ||
* A pddf kernel module to create I2C client for pca954x type of multiplexer |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this driver needed when native linux pca954x driver can create devices in sysfs/devfs as clients?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, we are also using the same PCA954x driver. However, There are some fields we have modified using the "pddf_mux_module". e.g base_bus which should be taken form device json object field 'parent_bus' which is a user-provided field. Hence we used pddf_mux_module. It works sort of wrapper on top of PCA954x module
|
||
|
||
static unsigned short normal_i2c[] = {0x50, 0x58, 0x51, 0x59, 0x53, 0x5b, I2C_CLIENT_END}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
these addresses vary from platform to platform . how could we make it simple ? and keep it generic
Just parsing as arguments during insmodule ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Normal i2c should be made normal_i2c[] = {I2C_CLIENT_END } ... Will make that change.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We already parse the dev_addr from the JSON file descriptor. This normal_i2c for for quick scan. The device gets initialised even if the addresses is not mentioned in normal_i2c array.
PDDF_DATA_ATTR(cpld2_version, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); | ||
PDDF_DATA_ATTR(cpld3_version, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); | ||
PDDF_DATA_ATTR(power_module_status, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); | ||
PDDF_DATA_ATTR(system_reset1, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does different types of reset means ? how will be common for all platforms ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally SYSSTATUS object stores the miscellaneous information. The fields mentioned here were in relation to the platforms where PDDF is supported.
Different resets were, hard_reset, soft_reset, MAC reset etc.
return True | ||
|
||
kos = [ | ||
'modprobe i2c-ismt', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This lis of ko's include linux specific dirvers and also pddf specific drivers. can we not keep it separate ?
Also allow users to add in /etc/module.d/generic.conf and /etc/module.d/pddf.conf ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Separating the pddf drivers and linux drivers (which might differ based on platform) is already in plan for PDDF 2.0, where we will be moving to 2.0 Platform APIs implementation as well.
Changes in psu driver module as per the review comments |
@@ -0,0 +1,291 @@ | |||
/* | |||
* Copyright 2019 Broadcom. All rights reserved. | |||
* The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
need gpl license
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
taken care in
@fk410167
- GPL license disclaimer inclusion 2) Removal of commented code, as … …
8e8cf2f
|
||
ret = sysfs_create_group(i2c_kobj, &pddf_psu_client_data_group); | ||
if (ret) | ||
{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the spacing is not consistent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is already taken care in commit: a654dc7.
|
||
|
||
|
||
#if __name__== "__main__": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove these testing code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
taken care of in ,
@fk410167
- GPL license disclaimer inclusion 2) Removal of commented code, as … …
8e8cf2f
…per the latest review comments
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Made changes are per the review comments
#GCOV_PROFILE := y | ||
|
||
ccflags-y := -I$(M)/modules/include | ||
#ccflags-y += -I$(M)/modules/psu |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove commented code?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
obj-m := $(TARGET).o | ||
|
||
$(TARGET)-objs := pddf_psu_api.o pddf_psu_driver.o | ||
#GCOV_PROFILE := y |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove commented code?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
struct cpld_client_node *cpld_node = NULL; | ||
int ret = -EPERM; | ||
|
||
//hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove commented code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
#$(MAKE) -C /projects/slxos_dev/fk410167/18.2.01X/slxos_main/build/swbd4000/linux_4_9/ M=$(PWD) modules ; | ||
|
||
#clean: | ||
#$(MAKE) -C /projects/slxos_dev/fk410167/18.2.01X/slxos_main/build/swbd4000/linux_4_9/ M=$(PWD) clean ; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove commented code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
@@ -0,0 +1,4 @@ | |||
obj-m:= pddf_client_module.o | |||
#GCOV_PROFILE := y |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove commented.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
since pddf is a driver framework, I am wondering if it should be in the src folder instead of platform folder. |
ret = kstrtoint(buf,16,&num); | ||
if (ret==0) | ||
*(uint32_t *)(ptr->addr) = (uint32_t)num; | ||
/*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove commented code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
Took care of the latest review comments in Removing commented code as per the latest review comments 33ab9b7 Regarding movement of the code to 'src' folder,
Hence in my view it is better to keep PDDF kernel module code under 'platform'. |
We need to push the PDDF v1.0 first. The reason is
So, below comment needs to be modified. We have PDDF v2.0 code changes ready and we are waiting for v1.0 changes to get in. |
retest vsimage please |
Retest this please |
Retest vsimage please |
1 similar comment
Retest vsimage please |
Retest this please |
retest vsimage please |
Retest this please |
retest this please |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please fix conflicts
- What I did
This change introduces PDDF which is described here,
sonic-net/SONiC#406
Most of the platform bring up effort goes in developing the platform device drivers, SONiC plugins and validating them. Typically each platform vendor writes their own drivers and plugins which is very tailor made to that platform. This involves writing code, building, installing it on the target platform devices and testing. Many of the details of the platform are hard coded into these drivers, from the HW spec. They go through this cycle repetitively till everything works fine, and is validated before upstreaming the code.
PDDF aims to make this platform driver and plugin development process much simpler by providing a data driven development framework. This is enabled by:
- How I did it
PDDF generic platform drivers and utils are provided under
sonic-buildimage/platform/pddf
PDDF generic user space plugins are added here,
sonic-buildimage/device/common/pddf
Rest of the changes are added to enable the framework.
- How to verify it
New platforms may use this framework for their development. Currently, Accton AS7712-32X and AS7726-32X platforms support PDDF mode as an alternate to the usual bringup. I have provided the scripts to switch between PDDF and non-PDDF modes.
To switch to PDDF mode,
# sudo /usr/local/bin/pddf_util.py switch-pddf
Under PDDF mode, pddf utils can be verified,
# sudo pddf_psuutil <options>
# sudo pddf_fanutil <options>
# sudo pddf_thermalutil <options>
# sudo pddf_ledutil <options>
To switch back to the non-PDDF mode,
# sudo /usr/local/bin/pddf_util.py switch-nonpddf
- Description for the changelog
Platform Driver Development Framework (PDDF): Generic kernel device drivers and user plugins
- A picture of a cute animal (not mandatory but encouraged)