#include "linux/pci.h"
 #include "ena_devlink.h"
+#include "ena_phc.h"
+
+static int ena_devlink_enable_phc_validate(struct devlink *devlink, u32 id,
+                                          union devlink_param_value val,
+                                          struct netlink_ext_ack *extack)
+{
+       struct ena_adapter *adapter = ENA_DEVLINK_PRIV(devlink);
+
+       if (!val.vbool)
+               return 0;
+
+       if (!ena_com_phc_supported(adapter->ena_dev)) {
+               NL_SET_ERR_MSG_MOD(extack, "Device doesn't support PHC");
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
+static const struct devlink_param ena_devlink_params[] = {
+       DEVLINK_PARAM_GENERIC(ENABLE_PHC,
+                             BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
+                             NULL,
+                             NULL,
+                             ena_devlink_enable_phc_validate),
+};
+
+void ena_devlink_params_get(struct devlink *devlink)
+{
+       struct ena_adapter *adapter = ENA_DEVLINK_PRIV(devlink);
+       union devlink_param_value val;
+       int err;
+
+       err = devl_param_driverinit_value_get(devlink,
+                                             DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC,
+                                             &val);
+       if (err) {
+               netdev_err(adapter->netdev, "Failed to query PHC param\n");
+               return;
+       }
+
+       ena_phc_enable(adapter, val.vbool);
+}
+
+void ena_devlink_disable_phc_param(struct devlink *devlink)
+{
+       union devlink_param_value value;
+
+       value.vbool = false;
+       devl_param_driverinit_value_set(devlink,
+                                       DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC,
+                                       value);
+}
 
 static void ena_devlink_port_register(struct devlink *devlink)
 {
        .reload_up      = ena_devlink_reload_up,
 };
 
+static int ena_devlink_configure_params(struct devlink *devlink)
+{
+       struct ena_adapter *adapter = ENA_DEVLINK_PRIV(devlink);
+       union devlink_param_value value;
+       int rc;
+
+       rc = devlink_params_register(devlink, ena_devlink_params,
+                                    ARRAY_SIZE(ena_devlink_params));
+       if (rc) {
+               netdev_err(adapter->netdev, "Failed to register devlink params\n");
+               return rc;
+       }
+
+       value.vbool = ena_phc_is_enabled(adapter);
+       devl_param_driverinit_value_set(devlink,
+                                       DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC,
+                                       value);
+
+       return 0;
+}
+
 struct devlink *ena_devlink_alloc(struct ena_adapter *adapter)
 {
        struct device *dev = &adapter->pdev->dev;
        ENA_DEVLINK_PRIV(devlink) = adapter;
        adapter->devlink = devlink;
 
+       if (ena_devlink_configure_params(devlink))
+               goto free_devlink;
+
        return devlink;
+
+free_devlink:
+       devlink_free(devlink);
+       return NULL;
+}
+
+static void ena_devlink_configure_params_clean(struct devlink *devlink)
+{
+       devlink_params_unregister(devlink, ena_devlink_params,
+                                 ARRAY_SIZE(ena_devlink_params));
 }
 
 void ena_devlink_free(struct devlink *devlink)
 {
+       ena_devlink_configure_params_clean(devlink);
+
        devlink_free(devlink);
 }