1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Intel Elkhart Lake Programmable Service Engine (PSE) I/O 4 * 5 * Copyright (c) 2025 Intel Corporation. 6 * 7 * Author: Raag Jadav <raag.jadav@intel.com> 8 */ 9 10 #include <linux/auxiliary_bus.h> 11 #include <linux/device/devres.h> 12 #include <linux/errno.h> 13 #include <linux/gfp_types.h> 14 #include <linux/ioport.h> 15 #include <linux/module.h> 16 #include <linux/pci.h> 17 #include <linux/sizes.h> 18 #include <linux/types.h> 19 20 #include <linux/ehl_pse_io_aux.h> 21 22 #define EHL_PSE_IO_DEV_SIZE SZ_4K 23 24 static int ehl_pse_io_dev_create(struct pci_dev *pci, const char *name, int idx) 25 { 26 struct device *dev = &pci->dev; 27 struct auxiliary_device *adev; 28 struct ehl_pse_io_data *data; 29 resource_size_t start, offset; 30 u32 id; 31 32 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); 33 if (!data) 34 return -ENOMEM; 35 36 id = (pci_domain_nr(pci->bus) << 16) | pci_dev_id(pci); 37 start = pci_resource_start(pci, 0); 38 offset = EHL_PSE_IO_DEV_SIZE * idx; 39 40 data->mem = DEFINE_RES_MEM(start + offset, EHL_PSE_IO_DEV_SIZE); 41 data->irq = pci_irq_vector(pci, idx); 42 43 adev = __devm_auxiliary_device_create(dev, EHL_PSE_IO_NAME, name, data, id); 44 45 return adev ? 0 : -ENODEV; 46 } 47 48 static int ehl_pse_io_probe(struct pci_dev *pci, const struct pci_device_id *id) 49 { 50 int ret; 51 52 ret = pcim_enable_device(pci); 53 if (ret) 54 return ret; 55 56 pci_set_master(pci); 57 58 ret = pci_alloc_irq_vectors(pci, 2, 2, PCI_IRQ_MSI); 59 if (ret < 0) 60 return ret; 61 62 ret = ehl_pse_io_dev_create(pci, EHL_PSE_GPIO_NAME, 0); 63 if (ret) 64 return ret; 65 66 return ehl_pse_io_dev_create(pci, EHL_PSE_TIO_NAME, 1); 67 } 68 69 static const struct pci_device_id ehl_pse_io_ids[] = { 70 { PCI_VDEVICE(INTEL, 0x4b88) }, 71 { PCI_VDEVICE(INTEL, 0x4b89) }, 72 { } 73 }; 74 MODULE_DEVICE_TABLE(pci, ehl_pse_io_ids); 75 76 static struct pci_driver ehl_pse_io_driver = { 77 .name = EHL_PSE_IO_NAME, 78 .id_table = ehl_pse_io_ids, 79 .probe = ehl_pse_io_probe, 80 }; 81 module_pci_driver(ehl_pse_io_driver); 82 83 MODULE_AUTHOR("Raag Jadav <raag.jadav@intel.com>"); 84 MODULE_DESCRIPTION("Intel Elkhart Lake PSE I/O driver"); 85 MODULE_LICENSE("GPL"); 86