cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

jsm_driver.c (9659B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/************************************************************************
      3 * Copyright 2003 Digi International (www.digi.com)
      4 *
      5 * Copyright (C) 2004 IBM Corporation. All rights reserved.
      6 *
      7 * Contact Information:
      8 * Scott H Kilau <Scott_Kilau@digi.com>
      9 * Wendy Xiong   <wendyx@us.ibm.com>
     10 *
     11 *
     12 ***********************************************************************/
     13#include <linux/module.h>
     14#include <linux/pci.h>
     15#include <linux/slab.h>
     16
     17#include "jsm.h"
     18
     19MODULE_AUTHOR("Digi International, https://www.digi.com");
     20MODULE_DESCRIPTION("Driver for the Digi International Neo and Classic PCI based product line");
     21MODULE_LICENSE("GPL");
     22
     23#define JSM_DRIVER_NAME "jsm"
     24#define NR_PORTS	32
     25#define JSM_MINOR_START	0
     26
     27struct uart_driver jsm_uart_driver = {
     28	.owner		= THIS_MODULE,
     29	.driver_name	= JSM_DRIVER_NAME,
     30	.dev_name	= "ttyn",
     31	.major		= 0,
     32	.minor		= JSM_MINOR_START,
     33	.nr		= NR_PORTS,
     34};
     35
     36static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
     37					pci_channel_state_t state);
     38static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev);
     39static void jsm_io_resume(struct pci_dev *pdev);
     40
     41static const struct pci_error_handlers jsm_err_handler = {
     42	.error_detected = jsm_io_error_detected,
     43	.slot_reset = jsm_io_slot_reset,
     44	.resume = jsm_io_resume,
     45};
     46
     47int jsm_debug;
     48module_param(jsm_debug, int, 0);
     49MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
     50
     51static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
     52{
     53	int rc = 0;
     54	struct jsm_board *brd;
     55	static int adapter_count;
     56
     57	rc = pci_enable_device(pdev);
     58	if (rc) {
     59		dev_err(&pdev->dev, "Device enable FAILED\n");
     60		goto out;
     61	}
     62
     63	rc = pci_request_regions(pdev, JSM_DRIVER_NAME);
     64	if (rc) {
     65		dev_err(&pdev->dev, "pci_request_region FAILED\n");
     66		goto out_disable_device;
     67	}
     68
     69	brd = kzalloc(sizeof(*brd), GFP_KERNEL);
     70	if (!brd) {
     71		rc = -ENOMEM;
     72		goto out_release_regions;
     73	}
     74
     75	/* store the info for the board we've found */
     76	brd->boardnum = adapter_count++;
     77	brd->pci_dev = pdev;
     78
     79	switch (pdev->device) {
     80	case PCI_DEVICE_ID_NEO_2DB9:
     81	case PCI_DEVICE_ID_NEO_2DB9PRI:
     82	case PCI_DEVICE_ID_NEO_2RJ45:
     83	case PCI_DEVICE_ID_NEO_2RJ45PRI:
     84	case PCI_DEVICE_ID_NEO_2_422_485:
     85		brd->maxports = 2;
     86		break;
     87
     88	case PCI_DEVICE_ID_CLASSIC_4:
     89	case PCI_DEVICE_ID_CLASSIC_4_422:
     90	case PCI_DEVICE_ID_NEO_4:
     91	case PCIE_DEVICE_ID_NEO_4:
     92	case PCIE_DEVICE_ID_NEO_4RJ45:
     93	case PCIE_DEVICE_ID_NEO_4_IBM:
     94		brd->maxports = 4;
     95		break;
     96
     97	case PCI_DEVICE_ID_CLASSIC_8:
     98	case PCI_DEVICE_ID_CLASSIC_8_422:
     99	case PCI_DEVICE_ID_DIGI_NEO_8:
    100	case PCIE_DEVICE_ID_NEO_8:
    101	case PCIE_DEVICE_ID_NEO_8RJ45:
    102		brd->maxports = 8;
    103		break;
    104
    105	default:
    106		brd->maxports = 1;
    107		break;
    108	}
    109
    110	spin_lock_init(&brd->bd_intr_lock);
    111
    112	/* store which revision we have */
    113	brd->rev = pdev->revision;
    114
    115	brd->irq = pdev->irq;
    116
    117	switch (pdev->device) {
    118	case PCI_DEVICE_ID_CLASSIC_4:
    119	case PCI_DEVICE_ID_CLASSIC_4_422:
    120	case PCI_DEVICE_ID_CLASSIC_8:
    121	case PCI_DEVICE_ID_CLASSIC_8_422:
    122
    123		jsm_dbg(INIT, &brd->pci_dev,
    124			"jsm_found_board - Classic adapter\n");
    125
    126		/*
    127		 * For PCI ClassicBoards
    128		 * PCI Local Address (.i.e. "resource" number) space
    129		 * 0	PLX Memory Mapped Config
    130		 * 1	PLX I/O Mapped Config
    131		 * 2	I/O Mapped UARTs and Status
    132		 * 3	Memory Mapped VPD
    133		 * 4	Memory Mapped UARTs and Status
    134		 */
    135
    136		/* Get the PCI Base Address Registers */
    137		brd->membase = pci_resource_start(pdev, 4);
    138		brd->membase_end = pci_resource_end(pdev, 4);
    139
    140		if (brd->membase & 0x1)
    141			brd->membase &= ~0x3;
    142		else
    143			brd->membase &= ~0xF;
    144
    145		brd->iobase = pci_resource_start(pdev, 1);
    146		brd->iobase_end = pci_resource_end(pdev, 1);
    147		brd->iobase = ((unsigned int)(brd->iobase)) & 0xFFFE;
    148
    149		/* Assign the board_ops struct */
    150		brd->bd_ops = &jsm_cls_ops;
    151
    152		brd->bd_uart_offset = 0x8;
    153		brd->bd_dividend = 921600;
    154
    155		brd->re_map_membase = ioremap(brd->membase,
    156						pci_resource_len(pdev, 4));
    157		if (!brd->re_map_membase) {
    158			dev_err(&pdev->dev,
    159				"Card has no PCI Memory resources, failing board.\n");
    160			rc = -ENOMEM;
    161			goto out_kfree_brd;
    162		}
    163
    164		/*
    165		 * Enable Local Interrupt 1			(0x1),
    166		 * Local Interrupt 1 Polarity Active high	(0x2),
    167		 * Enable PCI interrupt				(0x43)
    168		 */
    169		outb(0x43, brd->iobase + 0x4c);
    170
    171		break;
    172
    173	case PCI_DEVICE_ID_NEO_2DB9:
    174	case PCI_DEVICE_ID_NEO_2DB9PRI:
    175	case PCI_DEVICE_ID_NEO_2RJ45:
    176	case PCI_DEVICE_ID_NEO_2RJ45PRI:
    177	case PCI_DEVICE_ID_NEO_2_422_485:
    178	case PCI_DEVICE_ID_NEO_4:
    179	case PCIE_DEVICE_ID_NEO_4:
    180	case PCIE_DEVICE_ID_NEO_4RJ45:
    181	case PCIE_DEVICE_ID_NEO_4_IBM:
    182	case PCI_DEVICE_ID_DIGI_NEO_8:
    183	case PCIE_DEVICE_ID_NEO_8:
    184	case PCIE_DEVICE_ID_NEO_8RJ45:
    185
    186		jsm_dbg(INIT, &brd->pci_dev, "jsm_found_board - NEO adapter\n");
    187
    188		/* get the PCI Base Address Registers */
    189		brd->membase	= pci_resource_start(pdev, 0);
    190		brd->membase_end = pci_resource_end(pdev, 0);
    191
    192		if (brd->membase & 1)
    193			brd->membase &= ~0x3;
    194		else
    195			brd->membase &= ~0xF;
    196
    197		/* Assign the board_ops struct */
    198		brd->bd_ops = &jsm_neo_ops;
    199
    200		brd->bd_uart_offset = 0x200;
    201		brd->bd_dividend = 921600;
    202
    203		brd->re_map_membase = ioremap(brd->membase,
    204						pci_resource_len(pdev, 0));
    205		if (!brd->re_map_membase) {
    206			dev_err(&pdev->dev,
    207				"Card has no PCI Memory resources, failing board.\n");
    208			rc = -ENOMEM;
    209			goto out_kfree_brd;
    210		}
    211
    212		break;
    213	default:
    214		return -ENXIO;
    215	}
    216
    217	rc = request_irq(brd->irq, brd->bd_ops->intr, IRQF_SHARED, "JSM", brd);
    218	if (rc) {
    219		dev_warn(&pdev->dev, "Failed to hook IRQ %d\n", brd->irq);
    220		goto out_iounmap;
    221	}
    222
    223	rc = jsm_tty_init(brd);
    224	if (rc < 0) {
    225		dev_err(&pdev->dev, "Can't init tty devices (%d)\n", rc);
    226		rc = -ENXIO;
    227		goto out_free_irq;
    228	}
    229
    230	rc = jsm_uart_port_init(brd);
    231	if (rc < 0) {
    232		/* XXX: leaking all resources from jsm_tty_init here! */
    233		dev_err(&pdev->dev, "Can't init uart port (%d)\n", rc);
    234		rc = -ENXIO;
    235		goto out_free_irq;
    236	}
    237
    238	/* Log the information about the board */
    239	dev_info(&pdev->dev, "board %d: Digi Classic/Neo (rev %d), irq %d\n",
    240			adapter_count, brd->rev, brd->irq);
    241
    242	pci_set_drvdata(pdev, brd);
    243	pci_save_state(pdev);
    244
    245	return 0;
    246 out_free_irq:
    247	jsm_remove_uart_port(brd);
    248	free_irq(brd->irq, brd);
    249 out_iounmap:
    250	iounmap(brd->re_map_membase);
    251 out_kfree_brd:
    252	kfree(brd);
    253 out_release_regions:
    254	pci_release_regions(pdev);
    255 out_disable_device:
    256	pci_disable_device(pdev);
    257 out:
    258	return rc;
    259}
    260
    261static void jsm_remove_one(struct pci_dev *pdev)
    262{
    263	struct jsm_board *brd = pci_get_drvdata(pdev);
    264	int i = 0;
    265
    266	switch (pdev->device) {
    267	case PCI_DEVICE_ID_CLASSIC_4:
    268	case PCI_DEVICE_ID_CLASSIC_4_422:
    269	case PCI_DEVICE_ID_CLASSIC_8:
    270	case PCI_DEVICE_ID_CLASSIC_8_422:
    271		/* Tell card not to interrupt anymore. */
    272		outb(0x0, brd->iobase + 0x4c);
    273		break;
    274	default:
    275		break;
    276	}
    277
    278	jsm_remove_uart_port(brd);
    279
    280	free_irq(brd->irq, brd);
    281	iounmap(brd->re_map_membase);
    282
    283	/* Free all allocated channels structs */
    284	for (i = 0; i < brd->maxports; i++) {
    285		if (brd->channels[i]) {
    286			kfree(brd->channels[i]->ch_rqueue);
    287			kfree(brd->channels[i]->ch_equeue);
    288			kfree(brd->channels[i]);
    289		}
    290	}
    291
    292	pci_release_regions(pdev);
    293	pci_disable_device(pdev);
    294	kfree(brd);
    295}
    296
    297static const struct pci_device_id jsm_pci_tbl[] = {
    298	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2DB9), 0, 0, 0 },
    299	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2DB9PRI), 0, 0, 1 },
    300	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
    301	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
    302	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
    303	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
    304	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_4), 0, 0, 6 },
    305	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_1_422), 0, 0, 7 },
    306	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_1_422_485), 0, 0, 8 },
    307	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2_422_485), 0, 0, 9 },
    308	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_8), 0, 0, 10 },
    309	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4), 0, 0, 11 },
    310	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4RJ45), 0, 0, 12 },
    311	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_8RJ45), 0, 0, 13 },
    312	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_4), 0, 0, 14 },
    313	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_4_422), 0, 0, 15 },
    314	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_8), 0, 0, 16 },
    315	{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_8_422), 0, 0, 17 },
    316	{ 0, }
    317};
    318MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
    319
    320static struct pci_driver jsm_driver = {
    321	.name		= JSM_DRIVER_NAME,
    322	.id_table	= jsm_pci_tbl,
    323	.probe		= jsm_probe_one,
    324	.remove		= jsm_remove_one,
    325	.err_handler    = &jsm_err_handler,
    326};
    327
    328static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
    329					pci_channel_state_t state)
    330{
    331	struct jsm_board *brd = pci_get_drvdata(pdev);
    332
    333	jsm_remove_uart_port(brd);
    334
    335	return PCI_ERS_RESULT_NEED_RESET;
    336}
    337
    338static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev)
    339{
    340	int rc;
    341
    342	rc = pci_enable_device(pdev);
    343
    344	if (rc)
    345		return PCI_ERS_RESULT_DISCONNECT;
    346
    347	pci_set_master(pdev);
    348
    349	return PCI_ERS_RESULT_RECOVERED;
    350}
    351
    352static void jsm_io_resume(struct pci_dev *pdev)
    353{
    354	struct jsm_board *brd = pci_get_drvdata(pdev);
    355
    356	pci_restore_state(pdev);
    357	pci_save_state(pdev);
    358
    359	jsm_uart_port_init(brd);
    360}
    361
    362static int __init jsm_init_module(void)
    363{
    364	int rc;
    365
    366	rc = uart_register_driver(&jsm_uart_driver);
    367	if (!rc) {
    368		rc = pci_register_driver(&jsm_driver);
    369		if (rc)
    370			uart_unregister_driver(&jsm_uart_driver);
    371	}
    372	return rc;
    373}
    374
    375static void __exit jsm_exit_module(void)
    376{
    377	pci_unregister_driver(&jsm_driver);
    378	uart_unregister_driver(&jsm_uart_driver);
    379}
    380
    381module_init(jsm_init_module);
    382module_exit(jsm_exit_module);