| /* |
| * Intel MIC Platform Software Stack (MPSS) |
| * |
| * Copyright(c) 2015 Intel Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License, version 2, as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * The full GNU General Public License is included in this distribution in |
| * the file called "COPYING". |
| * |
| * Intel MIC COSM Bus Driver |
| */ |
| #ifndef _COSM_BUS_H_ |
| #define _COSM_BUS_H_ |
| |
| #include <linux/scif.h> |
| #include <linux/mic_common.h> |
| #include "../common/mic_dev.h" |
| |
| /** |
| * cosm_device - representation of a cosm device |
| * |
| * @attr_group: Pointer to list of sysfs attribute groups. |
| * @sdev: Device for sysfs entries. |
| * @state: MIC state. |
| * @prev_state: MIC state previous to MIC_RESETTING |
| * @shutdown_status: MIC status reported by card for shutdown/crashes. |
| * @shutdown_status_int: Internal shutdown status maintained by the driver |
| * @cosm_mutex: Mutex for synchronizing access to data structures. |
| * @reset_trigger_work: Work for triggering reset requests. |
| * @scif_work: Work for handling per device SCIF connections |
| * @cmdline: Kernel command line. |
| * @firmware: Firmware file name. |
| * @ramdisk: Ramdisk file name. |
| * @bootmode: Boot mode i.e. "linux" or "elf" for flash updates. |
| * @log_buf_addr: Log buffer address for MIC. |
| * @log_buf_len: Log buffer length address for MIC. |
| * @state_sysfs: Sysfs dirent for notifying ring 3 about MIC state changes. |
| * @hw_ops: the hardware bus ops for this device. |
| * @dev: underlying device. |
| * @index: unique position on the cosm bus |
| * @dbg_dir: debug fs directory |
| * @newepd: new endpoint from scif accept to be assigned to this cdev |
| * @epd: SCIF endpoint for this cdev |
| * @heartbeat_watchdog_enable: if heartbeat watchdog is enabled for this cdev |
| * @sysfs_heartbeat_enable: sysfs setting for disabling heartbeat notification |
| */ |
| struct cosm_device { |
| const struct attribute_group **attr_group; |
| struct device *sdev; |
| u8 state; |
| u8 prev_state; |
| u8 shutdown_status; |
| u8 shutdown_status_int; |
| struct mutex cosm_mutex; |
| struct work_struct reset_trigger_work; |
| struct work_struct scif_work; |
| char *cmdline; |
| char *firmware; |
| char *ramdisk; |
| char *bootmode; |
| void *log_buf_addr; |
| int *log_buf_len; |
| struct kernfs_node *state_sysfs; |
| struct cosm_hw_ops *hw_ops; |
| struct device dev; |
| int index; |
| struct dentry *dbg_dir; |
| scif_epd_t newepd; |
| scif_epd_t epd; |
| bool heartbeat_watchdog_enable; |
| bool sysfs_heartbeat_enable; |
| }; |
| |
| /** |
| * cosm_driver - operations for a cosm driver |
| * |
| * @driver: underlying device driver (populate name and owner). |
| * @probe: the function to call when a device is found. Returns 0 or -errno. |
| * @remove: the function to call when a device is removed. |
| */ |
| struct cosm_driver { |
| struct device_driver driver; |
| int (*probe)(struct cosm_device *dev); |
| void (*remove)(struct cosm_device *dev); |
| }; |
| |
| /** |
| * cosm_hw_ops - cosm bus ops |
| * |
| * @reset: trigger MIC reset |
| * @force_reset: force MIC reset |
| * @post_reset: inform MIC reset is complete |
| * @ready: is MIC ready for OS download |
| * @start: boot MIC |
| * @stop: prepare MIC for reset |
| * @family: return MIC HW family string |
| * @stepping: return MIC HW stepping string |
| * @aper: return MIC PCIe aperture |
| */ |
| struct cosm_hw_ops { |
| void (*reset)(struct cosm_device *cdev); |
| void (*force_reset)(struct cosm_device *cdev); |
| void (*post_reset)(struct cosm_device *cdev, enum mic_states state); |
| bool (*ready)(struct cosm_device *cdev); |
| int (*start)(struct cosm_device *cdev, int id); |
| void (*stop)(struct cosm_device *cdev, bool force); |
| ssize_t (*family)(struct cosm_device *cdev, char *buf); |
| ssize_t (*stepping)(struct cosm_device *cdev, char *buf); |
| struct mic_mw *(*aper)(struct cosm_device *cdev); |
| }; |
| |
| struct cosm_device * |
| cosm_register_device(struct device *pdev, struct cosm_hw_ops *hw_ops); |
| void cosm_unregister_device(struct cosm_device *dev); |
| int cosm_register_driver(struct cosm_driver *drv); |
| void cosm_unregister_driver(struct cosm_driver *drv); |
| struct cosm_device *cosm_find_cdev_by_id(int id); |
| |
| static inline struct cosm_device *dev_to_cosm(struct device *dev) |
| { |
| return container_of(dev, struct cosm_device, dev); |
| } |
| |
| static inline struct cosm_driver *drv_to_cosm(struct device_driver *drv) |
| { |
| return container_of(drv, struct cosm_driver, driver); |
| } |
| #endif /* _COSM_BUS_H */ |