GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / net / ethernet / intel / ice / ice_devlink.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020, Intel Corporation. */
3
4 #include "ice.h"
5 #include "ice_lib.h"
6 #include "ice_devlink.h"
7 #include "ice_fw_update.h"
8
9 static void ice_info_get_dsn(struct ice_pf *pf, char *buf, size_t len)
10 {
11         u8 dsn[8];
12
13         /* Copy the DSN into an array in Big Endian format */
14         put_unaligned_be64(pci_get_dsn(pf->pdev), dsn);
15
16         snprintf(buf, len, "%8phD", dsn);
17 }
18
19 static int ice_info_pba(struct ice_pf *pf, char *buf, size_t len)
20 {
21         struct ice_hw *hw = &pf->hw;
22         enum ice_status status;
23
24         status = ice_read_pba_string(hw, (u8 *)buf, len);
25         if (status)
26                 /* We failed to locate the PBA, so just skip this entry */
27                 dev_dbg(ice_pf_to_dev(pf), "Failed to read Product Board Assembly string, status %s\n",
28                         ice_stat_str(status));
29
30         return 0;
31 }
32
33 static int ice_info_fw_mgmt(struct ice_pf *pf, char *buf, size_t len)
34 {
35         struct ice_hw *hw = &pf->hw;
36
37         snprintf(buf, len, "%u.%u.%u", hw->fw_maj_ver, hw->fw_min_ver,
38                  hw->fw_patch);
39
40         return 0;
41 }
42
43 static int ice_info_fw_api(struct ice_pf *pf, char *buf, size_t len)
44 {
45         struct ice_hw *hw = &pf->hw;
46
47         snprintf(buf, len, "%u.%u", hw->api_maj_ver, hw->api_min_ver);
48
49         return 0;
50 }
51
52 static int ice_info_fw_build(struct ice_pf *pf, char *buf, size_t len)
53 {
54         struct ice_hw *hw = &pf->hw;
55
56         snprintf(buf, len, "0x%08x", hw->fw_build);
57
58         return 0;
59 }
60
61 static int ice_info_orom_ver(struct ice_pf *pf, char *buf, size_t len)
62 {
63         struct ice_orom_info *orom = &pf->hw.nvm.orom;
64
65         snprintf(buf, len, "%u.%u.%u", orom->major, orom->build, orom->patch);
66
67         return 0;
68 }
69
70 static int ice_info_nvm_ver(struct ice_pf *pf, char *buf, size_t len)
71 {
72         struct ice_nvm_info *nvm = &pf->hw.nvm;
73
74         snprintf(buf, len, "%x.%02x", nvm->major_ver, nvm->minor_ver);
75
76         return 0;
77 }
78
79 static int ice_info_eetrack(struct ice_pf *pf, char *buf, size_t len)
80 {
81         struct ice_nvm_info *nvm = &pf->hw.nvm;
82
83         snprintf(buf, len, "0x%08x", nvm->eetrack);
84
85         return 0;
86 }
87
88 static int ice_info_ddp_pkg_name(struct ice_pf *pf, char *buf, size_t len)
89 {
90         struct ice_hw *hw = &pf->hw;
91
92         snprintf(buf, len, "%s", hw->active_pkg_name);
93
94         return 0;
95 }
96
97 static int ice_info_ddp_pkg_version(struct ice_pf *pf, char *buf, size_t len)
98 {
99         struct ice_pkg_ver *pkg = &pf->hw.active_pkg_ver;
100
101         snprintf(buf, len, "%u.%u.%u.%u", pkg->major, pkg->minor, pkg->update,
102                  pkg->draft);
103
104         return 0;
105 }
106
107 static int ice_info_ddp_pkg_bundle_id(struct ice_pf *pf, char *buf, size_t len)
108 {
109         snprintf(buf, len, "0x%08x", pf->hw.active_track_id);
110
111         return 0;
112 }
113
114 static int ice_info_netlist_ver(struct ice_pf *pf, char *buf, size_t len)
115 {
116         struct ice_netlist_ver_info *netlist = &pf->hw.netlist_ver;
117
118         /* The netlist version fields are BCD formatted */
119         snprintf(buf, len, "%x.%x.%x-%x.%x.%x", netlist->major, netlist->minor,
120                  netlist->type >> 16, netlist->type & 0xFFFF, netlist->rev,
121                  netlist->cust_ver);
122
123         return 0;
124 }
125
126 static int ice_info_netlist_build(struct ice_pf *pf, char *buf, size_t len)
127 {
128         struct ice_netlist_ver_info *netlist = &pf->hw.netlist_ver;
129
130         snprintf(buf, len, "0x%08x", netlist->hash);
131
132         return 0;
133 }
134
135 #define fixed(key, getter) { ICE_VERSION_FIXED, key, getter }
136 #define running(key, getter) { ICE_VERSION_RUNNING, key, getter }
137
138 enum ice_version_type {
139         ICE_VERSION_FIXED,
140         ICE_VERSION_RUNNING,
141         ICE_VERSION_STORED,
142 };
143
144 static const struct ice_devlink_version {
145         enum ice_version_type type;
146         const char *key;
147         int (*getter)(struct ice_pf *pf, char *buf, size_t len);
148 } ice_devlink_versions[] = {
149         fixed(DEVLINK_INFO_VERSION_GENERIC_BOARD_ID, ice_info_pba),
150         running(DEVLINK_INFO_VERSION_GENERIC_FW_MGMT, ice_info_fw_mgmt),
151         running("fw.mgmt.api", ice_info_fw_api),
152         running("fw.mgmt.build", ice_info_fw_build),
153         running(DEVLINK_INFO_VERSION_GENERIC_FW_UNDI, ice_info_orom_ver),
154         running("fw.psid.api", ice_info_nvm_ver),
155         running(DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID, ice_info_eetrack),
156         running("fw.app.name", ice_info_ddp_pkg_name),
157         running(DEVLINK_INFO_VERSION_GENERIC_FW_APP, ice_info_ddp_pkg_version),
158         running("fw.app.bundle_id", ice_info_ddp_pkg_bundle_id),
159         running("fw.netlist", ice_info_netlist_ver),
160         running("fw.netlist.build", ice_info_netlist_build),
161 };
162
163 /**
164  * ice_devlink_info_get - .info_get devlink handler
165  * @devlink: devlink instance structure
166  * @req: the devlink info request
167  * @extack: extended netdev ack structure
168  *
169  * Callback for the devlink .info_get operation. Reports information about the
170  * device.
171  *
172  * Return: zero on success or an error code on failure.
173  */
174 static int ice_devlink_info_get(struct devlink *devlink,
175                                 struct devlink_info_req *req,
176                                 struct netlink_ext_ack *extack)
177 {
178         struct ice_pf *pf = devlink_priv(devlink);
179         char buf[100];
180         size_t i;
181         int err;
182
183         err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
184         if (err) {
185                 NL_SET_ERR_MSG_MOD(extack, "Unable to set driver name");
186                 return err;
187         }
188
189         ice_info_get_dsn(pf, buf, sizeof(buf));
190
191         err = devlink_info_serial_number_put(req, buf);
192         if (err) {
193                 NL_SET_ERR_MSG_MOD(extack, "Unable to set serial number");
194                 return err;
195         }
196
197         for (i = 0; i < ARRAY_SIZE(ice_devlink_versions); i++) {
198                 enum ice_version_type type = ice_devlink_versions[i].type;
199                 const char *key = ice_devlink_versions[i].key;
200
201                 err = ice_devlink_versions[i].getter(pf, buf, sizeof(buf));
202                 if (err) {
203                         NL_SET_ERR_MSG_MOD(extack, "Unable to obtain version info");
204                         return err;
205                 }
206
207                 switch (type) {
208                 case ICE_VERSION_FIXED:
209                         err = devlink_info_version_fixed_put(req, key, buf);
210                         if (err) {
211                                 NL_SET_ERR_MSG_MOD(extack, "Unable to set fixed version");
212                                 return err;
213                         }
214                         break;
215                 case ICE_VERSION_RUNNING:
216                         err = devlink_info_version_running_put(req, key, buf);
217                         if (err) {
218                                 NL_SET_ERR_MSG_MOD(extack, "Unable to set running version");
219                                 return err;
220                         }
221                         break;
222                 case ICE_VERSION_STORED:
223                         err = devlink_info_version_stored_put(req, key, buf);
224                         if (err) {
225                                 NL_SET_ERR_MSG_MOD(extack, "Unable to set stored version");
226                                 return err;
227                         }
228                         break;
229                 }
230         }
231
232         return 0;
233 }
234
235 /**
236  * ice_devlink_flash_update - Update firmware stored in flash on the device
237  * @devlink: pointer to devlink associated with device to update
238  * @params: flash update parameters
239  * @extack: netlink extended ACK structure
240  *
241  * Perform a device flash update. The bulk of the update logic is contained
242  * within the ice_flash_pldm_image function.
243  *
244  * Returns: zero on success, or an error code on failure.
245  */
246 static int
247 ice_devlink_flash_update(struct devlink *devlink,
248                          struct devlink_flash_update_params *params,
249                          struct netlink_ext_ack *extack)
250 {
251         struct ice_pf *pf = devlink_priv(devlink);
252         struct device *dev = &pf->pdev->dev;
253         struct ice_hw *hw = &pf->hw;
254         const struct firmware *fw;
255         u8 preservation;
256         int err;
257
258         if (!params->overwrite_mask) {
259                 /* preserve all settings and identifiers */
260                 preservation = ICE_AQC_NVM_PRESERVE_ALL;
261         } else if (params->overwrite_mask == DEVLINK_FLASH_OVERWRITE_SETTINGS) {
262                 /* overwrite settings, but preserve the vital device identifiers */
263                 preservation = ICE_AQC_NVM_PRESERVE_SELECTED;
264         } else if (params->overwrite_mask == (DEVLINK_FLASH_OVERWRITE_SETTINGS |
265                                               DEVLINK_FLASH_OVERWRITE_IDENTIFIERS)) {
266                 /* overwrite both settings and identifiers, preserve nothing */
267                 preservation = ICE_AQC_NVM_NO_PRESERVATION;
268         } else {
269                 NL_SET_ERR_MSG_MOD(extack, "Requested overwrite mask is not supported");
270                 return -EOPNOTSUPP;
271         }
272
273         if (!hw->dev_caps.common_cap.nvm_unified_update) {
274                 NL_SET_ERR_MSG_MOD(extack, "Current firmware does not support unified update");
275                 return -EOPNOTSUPP;
276         }
277
278         err = ice_check_for_pending_update(pf, NULL, extack);
279         if (err)
280                 return err;
281
282         err = request_firmware(&fw, params->file_name, dev);
283         if (err) {
284                 NL_SET_ERR_MSG_MOD(extack, "Unable to read file from disk");
285                 return err;
286         }
287
288         dev_dbg(dev, "Beginning flash update with file '%s'\n", params->file_name);
289
290         devlink_flash_update_begin_notify(devlink);
291         devlink_flash_update_status_notify(devlink, "Preparing to flash", NULL, 0, 0);
292         err = ice_flash_pldm_image(pf, fw, preservation, extack);
293         devlink_flash_update_end_notify(devlink);
294
295         release_firmware(fw);
296
297         return err;
298 }
299
300 static const struct devlink_ops ice_devlink_ops = {
301         .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
302         .info_get = ice_devlink_info_get,
303         .flash_update = ice_devlink_flash_update,
304 };
305
306 static void ice_devlink_free(void *devlink_ptr)
307 {
308         devlink_free((struct devlink *)devlink_ptr);
309 }
310
311 /**
312  * ice_allocate_pf - Allocate devlink and return PF structure pointer
313  * @dev: the device to allocate for
314  *
315  * Allocate a devlink instance for this device and return the private area as
316  * the PF structure. The devlink memory is kept track of through devres by
317  * adding an action to remove it when unwinding.
318  */
319 struct ice_pf *ice_allocate_pf(struct device *dev)
320 {
321         struct devlink *devlink;
322
323         devlink = devlink_alloc(&ice_devlink_ops, sizeof(struct ice_pf));
324         if (!devlink)
325                 return NULL;
326
327         /* Add an action to teardown the devlink when unwinding the driver */
328         if (devm_add_action(dev, ice_devlink_free, devlink)) {
329                 devlink_free(devlink);
330                 return NULL;
331         }
332
333         return devlink_priv(devlink);
334 }
335
336 /**
337  * ice_devlink_register - Register devlink interface for this PF
338  * @pf: the PF to register the devlink for.
339  *
340  * Register the devlink instance associated with this physical function.
341  *
342  * Return: zero on success or an error code on failure.
343  */
344 int ice_devlink_register(struct ice_pf *pf)
345 {
346         struct devlink *devlink = priv_to_devlink(pf);
347         struct device *dev = ice_pf_to_dev(pf);
348         int err;
349
350         err = devlink_register(devlink, dev);
351         if (err) {
352                 dev_err(dev, "devlink registration failed: %d\n", err);
353                 return err;
354         }
355
356         return 0;
357 }
358
359 /**
360  * ice_devlink_unregister - Unregister devlink resources for this PF.
361  * @pf: the PF structure to cleanup
362  *
363  * Releases resources used by devlink and cleans up associated memory.
364  */
365 void ice_devlink_unregister(struct ice_pf *pf)
366 {
367         devlink_unregister(priv_to_devlink(pf));
368 }
369
370 /**
371  * ice_devlink_create_port - Create a devlink port for this VSI
372  * @vsi: the VSI to create a port for
373  *
374  * Create and register a devlink_port for this VSI.
375  *
376  * Return: zero on success or an error code on failure.
377  */
378 int ice_devlink_create_port(struct ice_vsi *vsi)
379 {
380         struct devlink_port_attrs attrs = {};
381         struct ice_port_info *pi;
382         struct devlink *devlink;
383         struct device *dev;
384         struct ice_pf *pf;
385         int err;
386
387         /* Currently we only create devlink_port instances for PF VSIs */
388         if (vsi->type != ICE_VSI_PF)
389                 return -EINVAL;
390
391         pf = vsi->back;
392         devlink = priv_to_devlink(pf);
393         dev = ice_pf_to_dev(pf);
394         pi = pf->hw.port_info;
395
396         attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
397         attrs.phys.port_number = pi->lport;
398         devlink_port_attrs_set(&vsi->devlink_port, &attrs);
399         err = devlink_port_register(devlink, &vsi->devlink_port, vsi->idx);
400         if (err) {
401                 dev_err(dev, "devlink_port_register failed: %d\n", err);
402                 return err;
403         }
404
405         vsi->devlink_port_registered = true;
406
407         return 0;
408 }
409
410 /**
411  * ice_devlink_destroy_port - Destroy the devlink_port for this VSI
412  * @vsi: the VSI to cleanup
413  *
414  * Unregisters the devlink_port structure associated with this VSI.
415  */
416 void ice_devlink_destroy_port(struct ice_vsi *vsi)
417 {
418         if (!vsi->devlink_port_registered)
419                 return;
420
421         devlink_port_type_clear(&vsi->devlink_port);
422         devlink_port_unregister(&vsi->devlink_port);
423
424         vsi->devlink_port_registered = false;
425 }
426
427 /**
428  * ice_devlink_nvm_snapshot - Capture a snapshot of the Shadow RAM contents
429  * @devlink: the devlink instance
430  * @ops: the devlink region being snapshotted
431  * @extack: extended ACK response structure
432  * @data: on exit points to snapshot data buffer
433  *
434  * This function is called in response to the DEVLINK_CMD_REGION_TRIGGER for
435  * the shadow-ram devlink region. It captures a snapshot of the shadow ram
436  * contents. This snapshot can later be viewed via the devlink-region
437  * interface.
438  *
439  * @returns zero on success, and updates the data pointer. Returns a non-zero
440  * error code on failure.
441  */
442 static int ice_devlink_nvm_snapshot(struct devlink *devlink,
443                                     const struct devlink_region_ops *ops,
444                                     struct netlink_ext_ack *extack, u8 **data)
445 {
446         struct ice_pf *pf = devlink_priv(devlink);
447         struct device *dev = ice_pf_to_dev(pf);
448         struct ice_hw *hw = &pf->hw;
449         enum ice_status status;
450         void *nvm_data;
451         u32 nvm_size;
452
453         nvm_size = hw->nvm.flash_size;
454         nvm_data = vzalloc(nvm_size);
455         if (!nvm_data)
456                 return -ENOMEM;
457
458         status = ice_acquire_nvm(hw, ICE_RES_READ);
459         if (status) {
460                 dev_dbg(dev, "ice_acquire_nvm failed, err %d aq_err %d\n",
461                         status, hw->adminq.sq_last_status);
462                 NL_SET_ERR_MSG_MOD(extack, "Failed to acquire NVM semaphore");
463                 vfree(nvm_data);
464                 return -EIO;
465         }
466
467         status = ice_read_flat_nvm(hw, 0, &nvm_size, nvm_data, false);
468         if (status) {
469                 dev_dbg(dev, "ice_read_flat_nvm failed after reading %u bytes, err %d aq_err %d\n",
470                         nvm_size, status, hw->adminq.sq_last_status);
471                 NL_SET_ERR_MSG_MOD(extack, "Failed to read NVM contents");
472                 ice_release_nvm(hw);
473                 vfree(nvm_data);
474                 return -EIO;
475         }
476
477         ice_release_nvm(hw);
478
479         *data = nvm_data;
480
481         return 0;
482 }
483
484 /**
485  * ice_devlink_devcaps_snapshot - Capture snapshot of device capabilities
486  * @devlink: the devlink instance
487  * @ops: the devlink region being snapshotted
488  * @extack: extended ACK response structure
489  * @data: on exit points to snapshot data buffer
490  *
491  * This function is called in response to the DEVLINK_CMD_REGION_TRIGGER for
492  * the device-caps devlink region. It captures a snapshot of the device
493  * capabilities reported by firmware.
494  *
495  * @returns zero on success, and updates the data pointer. Returns a non-zero
496  * error code on failure.
497  */
498 static int
499 ice_devlink_devcaps_snapshot(struct devlink *devlink,
500                              const struct devlink_region_ops *ops,
501                              struct netlink_ext_ack *extack, u8 **data)
502 {
503         struct ice_pf *pf = devlink_priv(devlink);
504         struct device *dev = ice_pf_to_dev(pf);
505         struct ice_hw *hw = &pf->hw;
506         enum ice_status status;
507         void *devcaps;
508
509         devcaps = vzalloc(ICE_AQ_MAX_BUF_LEN);
510         if (!devcaps)
511                 return -ENOMEM;
512
513         status = ice_aq_list_caps(hw, devcaps, ICE_AQ_MAX_BUF_LEN, NULL,
514                                   ice_aqc_opc_list_dev_caps, NULL);
515         if (status) {
516                 dev_dbg(dev, "ice_aq_list_caps: failed to read device capabilities, err %d aq_err %d\n",
517                         status, hw->adminq.sq_last_status);
518                 NL_SET_ERR_MSG_MOD(extack, "Failed to read device capabilities");
519                 vfree(devcaps);
520                 return -EIO;
521         }
522
523         *data = (u8 *)devcaps;
524
525         return 0;
526 }
527
528 static const struct devlink_region_ops ice_nvm_region_ops = {
529         .name = "nvm-flash",
530         .destructor = vfree,
531         .snapshot = ice_devlink_nvm_snapshot,
532 };
533
534 static const struct devlink_region_ops ice_devcaps_region_ops = {
535         .name = "device-caps",
536         .destructor = vfree,
537         .snapshot = ice_devlink_devcaps_snapshot,
538 };
539
540 /**
541  * ice_devlink_init_regions - Initialize devlink regions
542  * @pf: the PF device structure
543  *
544  * Create devlink regions used to enable access to dump the contents of the
545  * flash memory on the device.
546  */
547 void ice_devlink_init_regions(struct ice_pf *pf)
548 {
549         struct devlink *devlink = priv_to_devlink(pf);
550         struct device *dev = ice_pf_to_dev(pf);
551         u64 nvm_size;
552
553         nvm_size = pf->hw.nvm.flash_size;
554         pf->nvm_region = devlink_region_create(devlink, &ice_nvm_region_ops, 1,
555                                                nvm_size);
556         if (IS_ERR(pf->nvm_region)) {
557                 dev_err(dev, "failed to create NVM devlink region, err %ld\n",
558                         PTR_ERR(pf->nvm_region));
559                 pf->nvm_region = NULL;
560         }
561
562         pf->devcaps_region = devlink_region_create(devlink,
563                                                    &ice_devcaps_region_ops, 10,
564                                                    ICE_AQ_MAX_BUF_LEN);
565         if (IS_ERR(pf->devcaps_region)) {
566                 dev_err(dev, "failed to create device-caps devlink region, err %ld\n",
567                         PTR_ERR(pf->devcaps_region));
568                 pf->devcaps_region = NULL;
569         }
570 }
571
572 /**
573  * ice_devlink_destroy_regions - Destroy devlink regions
574  * @pf: the PF device structure
575  *
576  * Remove previously created regions for this PF.
577  */
578 void ice_devlink_destroy_regions(struct ice_pf *pf)
579 {
580         if (pf->nvm_region)
581                 devlink_region_destroy(pf->nvm_region);
582         if (pf->devcaps_region)
583                 devlink_region_destroy(pf->devcaps_region);
584 }