162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * CDX bus public interface 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2022-2023, Advanced Micro Devices, Inc. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef _CDX_BUS_H_ 1062306a36Sopenharmony_ci#define _CDX_BUS_H_ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/device.h> 1362306a36Sopenharmony_ci#include <linux/list.h> 1462306a36Sopenharmony_ci#include <linux/mod_devicetable.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define MAX_CDX_DEV_RESOURCES 4 1762306a36Sopenharmony_ci#define CDX_CONTROLLER_ID_SHIFT 4 1862306a36Sopenharmony_ci#define CDX_BUS_NUM_MASK 0xF 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* Forward declaration for CDX controller */ 2162306a36Sopenharmony_cistruct cdx_controller; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cienum { 2462306a36Sopenharmony_ci CDX_DEV_RESET_CONF, 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistruct cdx_device_config { 2862306a36Sopenharmony_ci u8 type; 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_citypedef int (*cdx_scan_cb)(struct cdx_controller *cdx); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_citypedef int (*cdx_dev_configure_cb)(struct cdx_controller *cdx, 3462306a36Sopenharmony_ci u8 bus_num, u8 dev_num, 3562306a36Sopenharmony_ci struct cdx_device_config *dev_config); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/** 3862306a36Sopenharmony_ci * CDX_DEVICE_DRIVER_OVERRIDE - macro used to describe a CDX device with 3962306a36Sopenharmony_ci * override_only flags. 4062306a36Sopenharmony_ci * @vend: the 16 bit CDX Vendor ID 4162306a36Sopenharmony_ci * @dev: the 16 bit CDX Device ID 4262306a36Sopenharmony_ci * @driver_override: the 32 bit CDX Device override_only 4362306a36Sopenharmony_ci * 4462306a36Sopenharmony_ci * This macro is used to create a struct cdx_device_id that matches only a 4562306a36Sopenharmony_ci * driver_override device. 4662306a36Sopenharmony_ci */ 4762306a36Sopenharmony_ci#define CDX_DEVICE_DRIVER_OVERRIDE(vend, dev, driver_override) \ 4862306a36Sopenharmony_ci .vendor = (vend), .device = (dev), .override_only = (driver_override) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/** 5162306a36Sopenharmony_ci * struct cdx_ops - Callbacks supported by CDX controller. 5262306a36Sopenharmony_ci * @scan: scan the devices on the controller 5362306a36Sopenharmony_ci * @dev_configure: configuration like reset, master_enable, 5462306a36Sopenharmony_ci * msi_config etc for a CDX device 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_cistruct cdx_ops { 5762306a36Sopenharmony_ci cdx_scan_cb scan; 5862306a36Sopenharmony_ci cdx_dev_configure_cb dev_configure; 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/** 6262306a36Sopenharmony_ci * struct cdx_controller: CDX controller object 6362306a36Sopenharmony_ci * @dev: Linux device associated with the CDX controller. 6462306a36Sopenharmony_ci * @priv: private data 6562306a36Sopenharmony_ci * @id: Controller ID 6662306a36Sopenharmony_ci * @ops: CDX controller ops 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_cistruct cdx_controller { 6962306a36Sopenharmony_ci struct device *dev; 7062306a36Sopenharmony_ci void *priv; 7162306a36Sopenharmony_ci u32 id; 7262306a36Sopenharmony_ci struct cdx_ops *ops; 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/** 7662306a36Sopenharmony_ci * struct cdx_device - CDX device object 7762306a36Sopenharmony_ci * @dev: Linux driver model device object 7862306a36Sopenharmony_ci * @cdx: CDX controller associated with the device 7962306a36Sopenharmony_ci * @vendor: Vendor ID for CDX device 8062306a36Sopenharmony_ci * @device: Device ID for CDX device 8162306a36Sopenharmony_ci * @bus_num: Bus number for this CDX device 8262306a36Sopenharmony_ci * @dev_num: Device number for this device 8362306a36Sopenharmony_ci * @res: array of MMIO region entries 8462306a36Sopenharmony_ci * @res_attr: resource binary attribute 8562306a36Sopenharmony_ci * @res_count: number of valid MMIO regions 8662306a36Sopenharmony_ci * @dma_mask: Default DMA mask 8762306a36Sopenharmony_ci * @flags: CDX device flags 8862306a36Sopenharmony_ci * @req_id: Requestor ID associated with CDX device 8962306a36Sopenharmony_ci * @driver_override: driver name to force a match; do not set directly, 9062306a36Sopenharmony_ci * because core frees it; use driver_set_override() to 9162306a36Sopenharmony_ci * set or clear it. 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_cistruct cdx_device { 9462306a36Sopenharmony_ci struct device dev; 9562306a36Sopenharmony_ci struct cdx_controller *cdx; 9662306a36Sopenharmony_ci u16 vendor; 9762306a36Sopenharmony_ci u16 device; 9862306a36Sopenharmony_ci u8 bus_num; 9962306a36Sopenharmony_ci u8 dev_num; 10062306a36Sopenharmony_ci struct resource res[MAX_CDX_DEV_RESOURCES]; 10162306a36Sopenharmony_ci u8 res_count; 10262306a36Sopenharmony_ci u64 dma_mask; 10362306a36Sopenharmony_ci u16 flags; 10462306a36Sopenharmony_ci u32 req_id; 10562306a36Sopenharmony_ci const char *driver_override; 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define to_cdx_device(_dev) \ 10962306a36Sopenharmony_ci container_of(_dev, struct cdx_device, dev) 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/** 11262306a36Sopenharmony_ci * struct cdx_driver - CDX device driver 11362306a36Sopenharmony_ci * @driver: Generic device driver 11462306a36Sopenharmony_ci * @match_id_table: table of supported device matching Ids 11562306a36Sopenharmony_ci * @probe: Function called when a device is added 11662306a36Sopenharmony_ci * @remove: Function called when a device is removed 11762306a36Sopenharmony_ci * @shutdown: Function called at shutdown time to quiesce the device 11862306a36Sopenharmony_ci * @reset_prepare: Function called before is reset to notify driver 11962306a36Sopenharmony_ci * @reset_done: Function called after reset is complete to notify driver 12062306a36Sopenharmony_ci * @driver_managed_dma: Device driver doesn't use kernel DMA API for DMA. 12162306a36Sopenharmony_ci * For most device drivers, no need to care about this flag 12262306a36Sopenharmony_ci * as long as all DMAs are handled through the kernel DMA API. 12362306a36Sopenharmony_ci * For some special ones, for example VFIO drivers, they know 12462306a36Sopenharmony_ci * how to manage the DMA themselves and set this flag so that 12562306a36Sopenharmony_ci * the IOMMU layer will allow them to setup and manage their 12662306a36Sopenharmony_ci * own I/O address space. 12762306a36Sopenharmony_ci */ 12862306a36Sopenharmony_cistruct cdx_driver { 12962306a36Sopenharmony_ci struct device_driver driver; 13062306a36Sopenharmony_ci const struct cdx_device_id *match_id_table; 13162306a36Sopenharmony_ci int (*probe)(struct cdx_device *dev); 13262306a36Sopenharmony_ci int (*remove)(struct cdx_device *dev); 13362306a36Sopenharmony_ci void (*shutdown)(struct cdx_device *dev); 13462306a36Sopenharmony_ci void (*reset_prepare)(struct cdx_device *dev); 13562306a36Sopenharmony_ci void (*reset_done)(struct cdx_device *dev); 13662306a36Sopenharmony_ci bool driver_managed_dma; 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#define to_cdx_driver(_drv) \ 14062306a36Sopenharmony_ci container_of(_drv, struct cdx_driver, driver) 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/* Macro to avoid include chaining to get THIS_MODULE */ 14362306a36Sopenharmony_ci#define cdx_driver_register(drv) \ 14462306a36Sopenharmony_ci __cdx_driver_register(drv, THIS_MODULE) 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci/** 14762306a36Sopenharmony_ci * __cdx_driver_register - registers a CDX device driver 14862306a36Sopenharmony_ci * @cdx_driver: CDX driver to register 14962306a36Sopenharmony_ci * @owner: module owner 15062306a36Sopenharmony_ci * 15162306a36Sopenharmony_ci * Return: -errno on failure, 0 on success. 15262306a36Sopenharmony_ci */ 15362306a36Sopenharmony_ciint __must_check __cdx_driver_register(struct cdx_driver *cdx_driver, 15462306a36Sopenharmony_ci struct module *owner); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci/** 15762306a36Sopenharmony_ci * cdx_driver_unregister - unregisters a device driver from the 15862306a36Sopenharmony_ci * CDX bus. 15962306a36Sopenharmony_ci * @cdx_driver: CDX driver to register 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_civoid cdx_driver_unregister(struct cdx_driver *cdx_driver); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ciextern struct bus_type cdx_bus_type; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci/** 16662306a36Sopenharmony_ci * cdx_dev_reset - Reset CDX device 16762306a36Sopenharmony_ci * @dev: device pointer 16862306a36Sopenharmony_ci * 16962306a36Sopenharmony_ci * Return: 0 for success, -errno on failure 17062306a36Sopenharmony_ci */ 17162306a36Sopenharmony_ciint cdx_dev_reset(struct device *dev); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#endif /* _CDX_BUS_H_ */ 174