lkml.org 
[lkml]   [2020]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/22] misc: xlink-pcie: Add asynchronous event notification support for XLink
    Date
    From: Srikanth Thokala <srikanth.thokala@intel.com>

    Add support to notify XLink layer upon PCIe link UP/DOWN events

    Reviewed-by: Mark Gross <mgross@linux.intel.com>
    Signed-off-by: Srikanth Thokala <srikanth.thokala@intel.com>
    ---
    drivers/misc/xlink-pcie/common/core.h | 3 ++
    drivers/misc/xlink-pcie/common/interface.c | 17 ++++++++++
    drivers/misc/xlink-pcie/local_host/core.c | 11 +++++++
    drivers/misc/xlink-pcie/remote_host/main.c | 3 ++
    drivers/misc/xlink-pcie/remote_host/pci.c | 36 ++++++++++++++++++++++
    drivers/misc/xlink-pcie/remote_host/pci.h | 3 ++
    include/linux/xlink_drv_inf.h | 12 ++++++++
    7 files changed, 85 insertions(+)

    diff --git a/drivers/misc/xlink-pcie/common/core.h b/drivers/misc/xlink-pcie/common/core.h
    index eec8566c19d9..34b6c268aac5 100644
    --- a/drivers/misc/xlink-pcie/common/core.h
    +++ b/drivers/misc/xlink-pcie/common/core.h
    @@ -241,4 +241,7 @@ int intel_xpcie_pci_connect_device(u32 id);
    int intel_xpcie_pci_read(u32 id, void *data, size_t *size, u32 timeout);
    int intel_xpcie_pci_write(u32 id, void *data, size_t *size, u32 timeout);
    int intel_xpcie_pci_reset_device(u32 id);
    +int intel_xpcie_pci_register_device_event(u32 sw_device_id,
    + xlink_device_event event_notif_fn);
    +int intel_xpcie_pci_unregister_device_event(u32 sw_device_id);
    #endif /* XPCIE_CORE_HEADER_ */
    diff --git a/drivers/misc/xlink-pcie/common/interface.c b/drivers/misc/xlink-pcie/common/interface.c
    index 56c1d9ed9d8f..4ad291ff97c8 100644
    --- a/drivers/misc/xlink-pcie/common/interface.c
    +++ b/drivers/misc/xlink-pcie/common/interface.c
    @@ -107,3 +107,20 @@ int xlink_pcie_reset_device(u32 sw_device_id)
    return intel_xpcie_pci_reset_device(sw_device_id);
    }
    EXPORT_SYMBOL(xlink_pcie_reset_device);
    +
    +int xlink_pcie_register_device_event(u32 sw_device_id,
    + xlink_device_event event_notif_fn)
    +{
    + if (!event_notif_fn)
    + return -EINVAL;
    +
    + return intel_xpcie_pci_register_device_event(sw_device_id,
    + event_notif_fn);
    +}
    +EXPORT_SYMBOL(xlink_pcie_register_device_event);
    +
    +int xlink_pcie_unregister_device_event(u32 sw_device_id)
    +{
    + return intel_xpcie_pci_unregister_device_event(sw_device_id);
    +}
    +EXPORT_SYMBOL(xlink_pcie_unregister_device_event);
    diff --git a/drivers/misc/xlink-pcie/local_host/core.c b/drivers/misc/xlink-pcie/local_host/core.c
    index 0f83b5ffc4f2..628c383113ca 100644
    --- a/drivers/misc/xlink-pcie/local_host/core.c
    +++ b/drivers/misc/xlink-pcie/local_host/core.c
    @@ -892,3 +892,14 @@ int intel_xpcie_pci_reset_device(u32 id)
    {
    return 0;
    }
    +
    +int intel_xpcie_pci_register_device_event(u32 sw_device_id,
    + xlink_device_event event_notif_fn)
    +{
    + return 0;
    +}
    +
    +int intel_xpcie_pci_unregister_device_event(u32 sw_device_id)
    +{
    + return 0;
    +}
    diff --git a/drivers/misc/xlink-pcie/remote_host/main.c b/drivers/misc/xlink-pcie/remote_host/main.c
    index 810da1509418..421635321f1b 100644
    --- a/drivers/misc/xlink-pcie/remote_host/main.c
    +++ b/drivers/misc/xlink-pcie/remote_host/main.c
    @@ -55,6 +55,8 @@ static int intel_xpcie_probe(struct pci_dev *pdev,
    if (new_device)
    intel_xpcie_list_add_device(xdev);

    + intel_xpcie_pci_notify_event(xdev, NOTIFY_DEVICE_CONNECTED);
    +
    return ret;
    }

    @@ -64,6 +66,7 @@ static void intel_xpcie_remove(struct pci_dev *pdev)

    if (xdev) {
    intel_xpcie_pci_cleanup(xdev);
    + intel_xpcie_pci_notify_event(xdev, NOTIFY_DEVICE_DISCONNECTED);
    intel_xpcie_remove_device(xdev);
    }
    }
    diff --git a/drivers/misc/xlink-pcie/remote_host/pci.c b/drivers/misc/xlink-pcie/remote_host/pci.c
    index f92a78f41324..0046bff5f604 100644
    --- a/drivers/misc/xlink-pcie/remote_host/pci.c
    +++ b/drivers/misc/xlink-pcie/remote_host/pci.c
    @@ -8,6 +8,7 @@
    ****************************************************************************/

    #include <linux/mutex.h>
    +#include <linux/pci.h>
    #include <linux/sched.h>
    #include <linux/wait.h>
    #include <linux/workqueue.h>
    @@ -487,3 +488,38 @@ int intel_xpcie_pci_reset_device(u32 id)

    return intel_xpcie_pci_prepare_dev_reset(xdev, true);
    }
    +
    +int intel_xpcie_pci_register_device_event(u32 sw_device_id,
    + xlink_device_event event_notif_fn)
    +{
    + struct xpcie_dev *xdev = intel_xpcie_get_device_by_id(sw_device_id);
    +
    + if (!xdev)
    + return -ENOMEM;
    +
    + xdev->event_fn = event_notif_fn;
    +
    + return 0;
    +}
    +
    +int intel_xpcie_pci_unregister_device_event(u32 sw_device_id)
    +{
    + struct xpcie_dev *xdev = intel_xpcie_get_device_by_id(sw_device_id);
    +
    + if (!xdev)
    + return -ENOMEM;
    +
    + xdev->event_fn = NULL;
    +
    + return 0;
    +}
    +
    +void intel_xpcie_pci_notify_event(struct xpcie_dev *xdev,
    + enum xlink_device_event_type event_type)
    +{
    + if (event_type >= NUM_EVENT_TYPE)
    + return;
    +
    + if (xdev->event_fn)
    + xdev->event_fn(xdev->devid, event_type);
    +}
    diff --git a/drivers/misc/xlink-pcie/remote_host/pci.h b/drivers/misc/xlink-pcie/remote_host/pci.h
    index 72de3701f83a..a05dedf36a12 100644
    --- a/drivers/misc/xlink-pcie/remote_host/pci.h
    +++ b/drivers/misc/xlink-pcie/remote_host/pci.h
    @@ -38,6 +38,7 @@ struct xpcie_dev {
    irq_handler_t core_irq_callback;

    struct xpcie xpcie;
    + xlink_device_event event_fn;
    };

    static inline struct device *xpcie_to_dev(struct xpcie *xpcie)
    @@ -60,5 +61,7 @@ struct xpcie_dev *intel_xpcie_create_device(u32 sw_device_id,
    void intel_xpcie_remove_device(struct xpcie_dev *xdev);
    void intel_xpcie_list_add_device(struct xpcie_dev *xdev);
    void intel_xpcie_list_del_device(struct xpcie_dev *xdev);
    +void intel_xpcie_pci_notify_event(struct xpcie_dev *xdev,
    + enum xlink_device_event_type event_type);

    #endif /* XPCIE_PCI_HEADER_ */
    diff --git a/include/linux/xlink_drv_inf.h b/include/linux/xlink_drv_inf.h
    index ffe8f4c253e6..5ca0ae1ae2e3 100644
    --- a/include/linux/xlink_drv_inf.h
    +++ b/include/linux/xlink_drv_inf.h
    @@ -44,6 +44,15 @@ enum _xlink_device_status {
    _XLINK_DEV_READY
    };

    +enum xlink_device_event_type {
    + NOTIFY_DEVICE_DISCONNECTED,
    + NOTIFY_DEVICE_CONNECTED,
    + NUM_EVENT_TYPE
    +};
    +
    +typedef int (*xlink_device_event)(u32 sw_device_id,
    + enum xlink_device_event_type event_type);
    +
    int xlink_pcie_get_device_list(u32 *sw_device_id_list,
    u32 *num_devices);
    int xlink_pcie_get_device_name(u32 sw_device_id, char *device_name,
    @@ -57,4 +66,7 @@ int xlink_pcie_read(u32 sw_device_id, void *data, size_t *const size,
    int xlink_pcie_write(u32 sw_device_id, void *data, size_t *const size,
    u32 timeout);
    int xlink_pcie_reset_device(u32 sw_device_id);
    +int xlink_pcie_register_device_event(u32 sw_device_id,
    + xlink_device_event event_notif_fn);
    +int xlink_pcie_unregister_device_event(u32 sw_device_id);
    #endif
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-12-01 23:38    [W:4.037 / U:0.392 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site