1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2023 Advanced Micro Devices, Inc */
4 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8 #include <linux/pds/pds_common.h>
12 MODULE_DESCRIPTION(PDSC_DRV_DESCRIPTION
);
13 MODULE_AUTHOR("Advanced Micro Devices, Inc");
14 MODULE_LICENSE("GPL");
16 /* Supported devices */
17 static const struct pci_device_id pdsc_id_table
[] = {
18 { PCI_VDEVICE(PENSANDO
, PCI_DEVICE_ID_PENSANDO_CORE_PF
) },
19 { PCI_VDEVICE(PENSANDO
, PCI_DEVICE_ID_PENSANDO_VDPA_VF
) },
20 { 0, } /* end of table */
22 MODULE_DEVICE_TABLE(pci
, pdsc_id_table
);
24 static void pdsc_wdtimer_cb(struct timer_list
*t
)
26 struct pdsc
*pdsc
= from_timer(pdsc
, t
, wdtimer
);
28 dev_dbg(pdsc
->dev
, "%s: jiffies %ld\n", __func__
, jiffies
);
29 mod_timer(&pdsc
->wdtimer
,
30 round_jiffies(jiffies
+ pdsc
->wdtimer_period
));
32 queue_work(pdsc
->wq
, &pdsc
->health_work
);
35 static void pdsc_unmap_bars(struct pdsc
*pdsc
)
37 struct pdsc_dev_bar
*bars
= pdsc
->bars
;
40 pdsc
->info_regs
= NULL
;
41 pdsc
->cmd_regs
= NULL
;
42 pdsc
->intr_status
= NULL
;
43 pdsc
->intr_ctrl
= NULL
;
45 for (i
= 0; i
< PDS_CORE_BARS_MAX
; i
++) {
47 pci_iounmap(pdsc
->pdev
, bars
[i
].vaddr
);
52 static int pdsc_map_bars(struct pdsc
*pdsc
)
54 struct pdsc_dev_bar
*bar
= pdsc
->bars
;
55 struct pci_dev
*pdev
= pdsc
->pdev
;
56 struct device
*dev
= pdsc
->dev
;
57 struct pdsc_dev_bar
*bars
;
65 /* Since the PCI interface in the hardware is configurable,
66 * we need to poke into all the bars to find the set we're
69 for (i
= 0, j
= 0; i
< PDS_CORE_BARS_MAX
; i
++) {
70 if (!(pci_resource_flags(pdev
, i
) & IORESOURCE_MEM
))
73 bars
[j
].len
= pci_resource_len(pdev
, i
);
74 bars
[j
].bus_addr
= pci_resource_start(pdev
, i
);
75 bars
[j
].res_index
= i
;
77 /* only map the whole bar 0 */
81 bars
[j
].vaddr
= pci_iomap(pdev
, i
, bars
[j
].len
);
83 dev_err(dev
, "Cannot map BAR %d, aborting\n", i
);
92 /* BAR0: dev_cmd and interrupts */
94 dev_err(dev
, "No bars found\n");
99 if (bar
->len
< PDS_CORE_BAR0_SIZE
) {
100 dev_err(dev
, "Resource bar size %lu too small\n", bar
->len
);
105 pdsc
->info_regs
= bar
->vaddr
+ PDS_CORE_BAR0_DEV_INFO_REGS_OFFSET
;
106 pdsc
->cmd_regs
= bar
->vaddr
+ PDS_CORE_BAR0_DEV_CMD_REGS_OFFSET
;
107 pdsc
->intr_status
= bar
->vaddr
+ PDS_CORE_BAR0_INTR_STATUS_OFFSET
;
108 pdsc
->intr_ctrl
= bar
->vaddr
+ PDS_CORE_BAR0_INTR_CTRL_OFFSET
;
110 sig
= ioread32(&pdsc
->info_regs
->signature
);
111 if (sig
!= PDS_CORE_DEV_INFO_SIGNATURE
) {
112 dev_err(dev
, "Incompatible firmware signature %x", sig
);
117 /* BAR1: doorbells */
120 dev_err(dev
, "Doorbell bar missing\n");
125 pdsc
->db_pages
= bar
->vaddr
;
126 pdsc
->phy_db_pages
= bar
->bus_addr
;
131 pdsc_unmap_bars(pdsc
);
135 void __iomem
*pdsc_map_dbpage(struct pdsc
*pdsc
, int page_num
)
137 return pci_iomap_range(pdsc
->pdev
,
138 pdsc
->bars
[PDS_CORE_PCI_BAR_DBELL
].res_index
,
139 (u64
)page_num
<< PAGE_SHIFT
, PAGE_SIZE
);
142 static int pdsc_sriov_configure(struct pci_dev
*pdev
, int num_vfs
)
144 struct pdsc
*pdsc
= pci_get_drvdata(pdev
);
145 struct device
*dev
= pdsc
->dev
;
149 pdsc
->vfs
= kcalloc(num_vfs
, sizeof(struct pdsc_vf
),
153 pdsc
->num_vfs
= num_vfs
;
155 ret
= pci_enable_sriov(pdev
, num_vfs
);
157 dev_err(dev
, "Cannot enable SRIOV: %pe\n",
166 pci_disable_sriov(pdev
);
175 static int pdsc_init_vf(struct pdsc
*vf
)
181 pf
= pdsc_get_pf_struct(vf
->pdev
);
182 if (IS_ERR_OR_NULL(pf
))
183 return PTR_ERR(pf
) ?: -1;
185 vf
->vf_id
= pci_iov_vf_id(vf
->pdev
);
187 dl
= priv_to_devlink(vf
);
192 pf
->vfs
[vf
->vf_id
].vf
= vf
;
193 err
= pdsc_auxbus_dev_add(vf
, pf
);
203 static const struct devlink_health_reporter_ops pdsc_fw_reporter_ops
= {
205 .diagnose
= pdsc_fw_reporter_diagnose
,
208 static const struct devlink_param pdsc_dl_params
[] = {
209 DEVLINK_PARAM_GENERIC(ENABLE_VNET
,
210 BIT(DEVLINK_PARAM_CMODE_RUNTIME
),
213 pdsc_dl_enable_validate
),
216 #define PDSC_WQ_NAME_LEN 24
218 static int pdsc_init_pf(struct pdsc
*pdsc
)
220 struct devlink_health_reporter
*hr
;
221 char wq_name
[PDSC_WQ_NAME_LEN
];
225 pcie_print_link_status(pdsc
->pdev
);
227 err
= pci_request_regions(pdsc
->pdev
, PDS_CORE_DRV_NAME
);
229 dev_err(pdsc
->dev
, "Cannot request PCI regions: %pe\n",
234 err
= pdsc_map_bars(pdsc
);
236 goto err_out_release_regions
;
238 /* General workqueue and timer, but don't start timer yet */
239 snprintf(wq_name
, sizeof(wq_name
), "%s.%d", PDS_CORE_DRV_NAME
, pdsc
->uid
);
240 pdsc
->wq
= create_singlethread_workqueue(wq_name
);
241 INIT_WORK(&pdsc
->health_work
, pdsc_health_thread
);
242 INIT_WORK(&pdsc
->pci_reset_work
, pdsc_pci_reset_thread
);
243 timer_setup(&pdsc
->wdtimer
, pdsc_wdtimer_cb
, 0);
244 pdsc
->wdtimer_period
= PDSC_WATCHDOG_SECS
* HZ
;
246 mutex_init(&pdsc
->devcmd_lock
);
247 mutex_init(&pdsc
->config_lock
);
248 spin_lock_init(&pdsc
->adminq_lock
);
250 mutex_lock(&pdsc
->config_lock
);
251 set_bit(PDSC_S_FW_DEAD
, &pdsc
->state
);
253 err
= pdsc_setup(pdsc
, PDSC_SETUP_INIT
);
255 mutex_unlock(&pdsc
->config_lock
);
256 goto err_out_unmap_bars
;
259 err
= pdsc_start(pdsc
);
261 mutex_unlock(&pdsc
->config_lock
);
262 goto err_out_teardown
;
265 mutex_unlock(&pdsc
->config_lock
);
267 dl
= priv_to_devlink(pdsc
);
269 err
= devl_params_register(dl
, pdsc_dl_params
,
270 ARRAY_SIZE(pdsc_dl_params
));
273 dev_warn(pdsc
->dev
, "Failed to register devlink params: %pe\n",
278 hr
= devl_health_reporter_create(dl
, &pdsc_fw_reporter_ops
, 0, pdsc
);
281 dev_warn(pdsc
->dev
, "Failed to create fw reporter: %pe\n", hr
);
283 goto err_out_unreg_params
;
285 pdsc
->fw_reporter
= hr
;
290 /* Lastly, start the health check timer */
291 mod_timer(&pdsc
->wdtimer
, round_jiffies(jiffies
+ pdsc
->wdtimer_period
));
295 err_out_unreg_params
:
296 devlink_params_unregister(dl
, pdsc_dl_params
,
297 ARRAY_SIZE(pdsc_dl_params
));
301 pdsc_teardown(pdsc
, PDSC_TEARDOWN_REMOVING
);
303 timer_shutdown_sync(&pdsc
->wdtimer
);
305 destroy_workqueue(pdsc
->wq
);
306 mutex_destroy(&pdsc
->config_lock
);
307 mutex_destroy(&pdsc
->devcmd_lock
);
308 pci_free_irq_vectors(pdsc
->pdev
);
309 pdsc_unmap_bars(pdsc
);
310 err_out_release_regions
:
311 pci_release_regions(pdsc
->pdev
);
316 static const struct devlink_ops pdsc_dl_ops
= {
317 .info_get
= pdsc_dl_info_get
,
318 .flash_update
= pdsc_dl_flash_update
,
321 static const struct devlink_ops pdsc_dl_vf_ops
= {
324 static DEFINE_IDA(pdsc_ida
);
326 static int pdsc_probe(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
328 struct device
*dev
= &pdev
->dev
;
329 const struct devlink_ops
*ops
;
335 is_pf
= !pdev
->is_virtfn
;
336 ops
= is_pf
? &pdsc_dl_ops
: &pdsc_dl_vf_ops
;
337 dl
= devlink_alloc(ops
, sizeof(struct pdsc
), dev
);
340 pdsc
= devlink_priv(dl
);
343 pdsc
->dev
= &pdev
->dev
;
344 set_bit(PDSC_S_INITING_DRIVER
, &pdsc
->state
);
345 pci_set_drvdata(pdev
, pdsc
);
346 pdsc_debugfs_add_dev(pdsc
);
348 err
= ida_alloc(&pdsc_ida
, GFP_KERNEL
);
350 dev_err(pdsc
->dev
, "%s: id alloc failed: %pe\n",
351 __func__
, ERR_PTR(err
));
352 goto err_out_free_devlink
;
356 /* Query system for DMA addressing limitation for the device. */
357 err
= dma_set_mask_and_coherent(dev
, DMA_BIT_MASK(PDS_CORE_ADDR_LEN
));
359 dev_err(dev
, "Unable to obtain 64-bit DMA for consistent allocations, aborting: %pe\n",
361 goto err_out_free_ida
;
364 err
= pci_enable_device(pdev
);
366 dev_err(dev
, "Cannot enable PCI device: %pe\n", ERR_PTR(err
));
367 goto err_out_free_ida
;
369 pci_set_master(pdev
);
372 err
= pdsc_init_pf(pdsc
);
374 err
= pdsc_init_vf(pdsc
);
376 dev_err(dev
, "Cannot init device: %pe\n", ERR_PTR(err
));
377 goto err_out_disable_device
;
380 clear_bit(PDSC_S_INITING_DRIVER
, &pdsc
->state
);
383 err_out_disable_device
:
384 pci_disable_device(pdev
);
386 ida_free(&pdsc_ida
, pdsc
->uid
);
387 err_out_free_devlink
:
388 pdsc_debugfs_del_dev(pdsc
);
394 static void pdsc_remove(struct pci_dev
*pdev
)
396 struct pdsc
*pdsc
= pci_get_drvdata(pdev
);
399 /* Unhook the registrations first to be sure there
400 * are no requests while we're stopping.
402 dl
= priv_to_devlink(pdsc
);
405 if (!pdev
->is_virtfn
) {
406 if (pdsc
->fw_reporter
) {
407 devl_health_reporter_destroy(pdsc
->fw_reporter
);
408 pdsc
->fw_reporter
= NULL
;
410 devl_params_unregister(dl
, pdsc_dl_params
,
411 ARRAY_SIZE(pdsc_dl_params
));
415 if (pdev
->is_virtfn
) {
418 pf
= pdsc_get_pf_struct(pdsc
->pdev
);
420 pdsc_auxbus_dev_del(pdsc
, pf
);
421 pf
->vfs
[pdsc
->vf_id
].vf
= NULL
;
424 /* Remove the VFs and their aux_bus connections before other
425 * cleanup so that the clients can use the AdminQ to cleanly
426 * shut themselves down.
428 pdsc_sriov_configure(pdev
, 0);
430 timer_shutdown_sync(&pdsc
->wdtimer
);
432 destroy_workqueue(pdsc
->wq
);
434 mutex_lock(&pdsc
->config_lock
);
435 set_bit(PDSC_S_STOPPING_DRIVER
, &pdsc
->state
);
438 pdsc_teardown(pdsc
, PDSC_TEARDOWN_REMOVING
);
439 mutex_unlock(&pdsc
->config_lock
);
440 mutex_destroy(&pdsc
->config_lock
);
441 mutex_destroy(&pdsc
->devcmd_lock
);
443 pdsc_unmap_bars(pdsc
);
444 pci_release_regions(pdev
);
447 pci_disable_device(pdev
);
449 ida_free(&pdsc_ida
, pdsc
->uid
);
450 pdsc_debugfs_del_dev(pdsc
);
454 static void pdsc_stop_health_thread(struct pdsc
*pdsc
)
456 if (pdsc
->pdev
->is_virtfn
)
459 timer_shutdown_sync(&pdsc
->wdtimer
);
460 if (pdsc
->health_work
.func
)
461 cancel_work_sync(&pdsc
->health_work
);
464 static void pdsc_restart_health_thread(struct pdsc
*pdsc
)
466 if (pdsc
->pdev
->is_virtfn
)
469 timer_setup(&pdsc
->wdtimer
, pdsc_wdtimer_cb
, 0);
470 mod_timer(&pdsc
->wdtimer
, jiffies
+ 1);
473 static void pdsc_reset_prepare(struct pci_dev
*pdev
)
475 struct pdsc
*pdsc
= pci_get_drvdata(pdev
);
477 pdsc_stop_health_thread(pdsc
);
480 if (pdev
->is_virtfn
) {
483 pf
= pdsc_get_pf_struct(pdsc
->pdev
);
485 pdsc_auxbus_dev_del(pdsc
, pf
);
488 pdsc_unmap_bars(pdsc
);
489 pci_release_regions(pdev
);
490 if (pci_is_enabled(pdev
))
491 pci_disable_device(pdev
);
494 static void pdsc_reset_done(struct pci_dev
*pdev
)
496 struct pdsc
*pdsc
= pci_get_drvdata(pdev
);
497 struct device
*dev
= pdsc
->dev
;
500 err
= pci_enable_device(pdev
);
502 dev_err(dev
, "Cannot enable PCI device: %pe\n", ERR_PTR(err
));
505 pci_set_master(pdev
);
507 if (!pdev
->is_virtfn
) {
508 pcie_print_link_status(pdsc
->pdev
);
510 err
= pci_request_regions(pdsc
->pdev
, PDS_CORE_DRV_NAME
);
512 dev_err(pdsc
->dev
, "Cannot request PCI regions: %pe\n",
517 err
= pdsc_map_bars(pdsc
);
523 pdsc_restart_health_thread(pdsc
);
525 if (pdev
->is_virtfn
) {
528 pf
= pdsc_get_pf_struct(pdsc
->pdev
);
530 pdsc_auxbus_dev_add(pdsc
, pf
);
534 static pci_ers_result_t
pdsc_pci_error_detected(struct pci_dev
*pdev
,
535 pci_channel_state_t error
)
537 if (error
== pci_channel_io_frozen
) {
538 pdsc_reset_prepare(pdev
);
539 return PCI_ERS_RESULT_NEED_RESET
;
542 return PCI_ERS_RESULT_NONE
;
545 static void pdsc_pci_error_resume(struct pci_dev
*pdev
)
547 struct pdsc
*pdsc
= pci_get_drvdata(pdev
);
549 if (test_bit(PDSC_S_FW_DEAD
, &pdsc
->state
))
550 pci_reset_function_locked(pdev
);
553 static const struct pci_error_handlers pdsc_err_handler
= {
555 .reset_prepare
= pdsc_reset_prepare
,
556 .reset_done
= pdsc_reset_done
,
559 .error_detected
= pdsc_pci_error_detected
,
560 .resume
= pdsc_pci_error_resume
,
563 static struct pci_driver pdsc_driver
= {
564 .name
= PDS_CORE_DRV_NAME
,
565 .id_table
= pdsc_id_table
,
567 .remove
= pdsc_remove
,
568 .sriov_configure
= pdsc_sriov_configure
,
569 .err_handler
= &pdsc_err_handler
,
572 void *pdsc_get_pf_struct(struct pci_dev
*vf_pdev
)
574 return pci_iov_get_pf_drvdata(vf_pdev
, &pdsc_driver
);
576 EXPORT_SYMBOL_GPL(pdsc_get_pf_struct
);
578 static int __init
pdsc_init_module(void)
580 if (strcmp(KBUILD_MODNAME
, PDS_CORE_DRV_NAME
))
583 pdsc_debugfs_create();
584 return pci_register_driver(&pdsc_driver
);
587 static void __exit
pdsc_cleanup_module(void)
589 pci_unregister_driver(&pdsc_driver
);
590 pdsc_debugfs_destroy();
593 module_init(pdsc_init_module
);
594 module_exit(pdsc_cleanup_module
);