Re: [PATCH RESEND V5 2/3] misc/pvpanic : add pci interface for pvpanic

2019-01-03 Thread Andy Shevchenko
On Thu, Dec 20, 2018 at 6:57 AM Peng Hao  wrote:
>
> Support pvpanic as a pci device in guest kernel.
>

After my vacation followed by holidays I hardly remember what I suggested.
Looking to this code I would recommend to split it in a way how it's
done for ChipIdea USB driver, for example.
(drivers/usb/chipidea if I'm not mistaken)

> Suggested-by: Andy Shevchenko 
> [Use pcim_* API. - Andy]
> Signed-off-by: Peng Hao 
> ---
>  drivers/misc/pvpanic.c | 72 
> --
>  1 file changed, 70 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c
> index f84ed30..c30bf62 100644
> --- a/drivers/misc/pvpanic.c
> +++ b/drivers/misc/pvpanic.c
> @@ -13,9 +13,12 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>
> +#define PCI_VENDOR_ID_REDHAT 0x1b36
> +#define PCI_DEVICE_ID_REDHAT_PVPANIC 0x0101
>  static void __iomem *base;
>
>  #define PVPANIC_PANICKED(1 << 0)
> @@ -172,12 +175,76 @@ static int pvpanic_mmio_remove(struct platform_device 
> *pdev)
> .remove = pvpanic_mmio_remove,
>  };
>
> +#ifdef CONFIG_PCI
> +static const struct pci_device_id pvpanic_pci_id_tbl[]  = {
> +   { PCI_DEVICE(PCI_VENDOR_ID_REDHAT, PCI_DEVICE_ID_REDHAT_PVPANIC),},
> +   {}
> +};
> +
> +static int pvpanic_pci_probe(struct pci_dev *pdev,
> +const struct pci_device_id *ent)
> +{
> +   int ret;
> +
> +   ret = pcim_enable_device(pdev);
> +   if (ret < 0)
> +   return ret;
> +
> +   ret = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));
> +   if (ret)
> +   return ret;
> +
> +   base = pcim_iomap_table(pdev)[0];
> +
> +   atomic_notifier_chain_register(_notifier_list,
> +  _panic_nb);
> +   return 0;
> +}
> +
> +static void pvpanic_pci_remove(struct pci_dev *pdev)
> +{
> +   atomic_notifier_chain_unregister(_notifier_list,
> +_panic_nb);
> +}
> +
> +static struct pci_driver pvpanic_pci_driver = {
> +   .name = "pvpanic-pci",
> +   .id_table = pvpanic_pci_id_tbl,
> +   .probe =pvpanic_pci_probe,
> +   .remove =   pvpanic_pci_remove,
> +};
> +
> +static int pvpanic_register_pci_driver(void)
> +{
> +   return pci_register_driver(_pci_driver);
> +}
> +
> +static void pvpanic_unregister_pci_driver(void)
> +{
> +   pci_unregister_driver(_pci_driver);
> +}
> +#else
> +static int pvpanic_register_pci_driver(void)
> +{
> +   return 0;
> +}
> +
> +static void pvpanic_unregister_pci_driver(void) {}
> +#endif
> +
>  static int __init pvpanic_mmio_init(void)
>  {
> +   int r1, r2;
> +
> if (acpi_disabled)
> -   return platform_driver_register(_mmio_driver);
> +   r1 = platform_driver_register(_mmio_driver);
> +   else
> +   r1 = pvpanic_register_acpi_driver();
> +   r2 = pvpanic_register_pci_driver();
> +   if (r1 && r2) /* all drivers register failed */
> +   return 1;
> else
> -   return pvpanic_register_acpi_driver();
> +   return 0;
>  }
>
>  static void __exit pvpanic_mmio_exit(void)
> @@ -186,6 +253,7 @@ static void __exit pvpanic_mmio_exit(void)
> platform_driver_unregister(_mmio_driver);
> else
> pvpanic_unregister_acpi_driver();
> +   pvpanic_unregister_pci_driver();
>  }
>
>  module_init(pvpanic_mmio_init);
> --
> 1.8.3.1
>


-- 
With Best Regards,
Andy Shevchenko


[PATCH RESEND V5 2/3] misc/pvpanic : add pci interface for pvpanic

2018-12-19 Thread Peng Hao
Support pvpanic as a pci device in guest kernel.

Suggested-by: Andy Shevchenko 
[Use pcim_* API. - Andy]
Signed-off-by: Peng Hao 
---
 drivers/misc/pvpanic.c | 72 --
 1 file changed, 70 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c
index f84ed30..c30bf62 100644
--- a/drivers/misc/pvpanic.c
+++ b/drivers/misc/pvpanic.c
@@ -13,9 +13,12 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
+#define PCI_VENDOR_ID_REDHAT 0x1b36
+#define PCI_DEVICE_ID_REDHAT_PVPANIC 0x0101
 static void __iomem *base;
 
 #define PVPANIC_PANICKED(1 << 0)
@@ -172,12 +175,76 @@ static int pvpanic_mmio_remove(struct platform_device 
*pdev)
.remove = pvpanic_mmio_remove,
 };
 
+#ifdef CONFIG_PCI
+static const struct pci_device_id pvpanic_pci_id_tbl[]  = {
+   { PCI_DEVICE(PCI_VENDOR_ID_REDHAT, PCI_DEVICE_ID_REDHAT_PVPANIC),},
+   {}
+};
+
+static int pvpanic_pci_probe(struct pci_dev *pdev,
+const struct pci_device_id *ent)
+{
+   int ret;
+
+   ret = pcim_enable_device(pdev);
+   if (ret < 0)
+   return ret;
+
+   ret = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));
+   if (ret)
+   return ret;
+
+   base = pcim_iomap_table(pdev)[0];
+
+   atomic_notifier_chain_register(_notifier_list,
+  _panic_nb);
+   return 0;
+}
+
+static void pvpanic_pci_remove(struct pci_dev *pdev)
+{
+   atomic_notifier_chain_unregister(_notifier_list,
+_panic_nb);
+}
+
+static struct pci_driver pvpanic_pci_driver = {
+   .name = "pvpanic-pci",
+   .id_table = pvpanic_pci_id_tbl,
+   .probe =pvpanic_pci_probe,
+   .remove =   pvpanic_pci_remove,
+};
+
+static int pvpanic_register_pci_driver(void)
+{
+   return pci_register_driver(_pci_driver);
+}
+
+static void pvpanic_unregister_pci_driver(void)
+{
+   pci_unregister_driver(_pci_driver);
+}
+#else
+static int pvpanic_register_pci_driver(void)
+{
+   return 0;
+}
+
+static void pvpanic_unregister_pci_driver(void) {}
+#endif
+
 static int __init pvpanic_mmio_init(void)
 {
+   int r1, r2;
+
if (acpi_disabled)
-   return platform_driver_register(_mmio_driver);
+   r1 = platform_driver_register(_mmio_driver);
+   else
+   r1 = pvpanic_register_acpi_driver();
+   r2 = pvpanic_register_pci_driver();
+   if (r1 && r2) /* all drivers register failed */
+   return 1;
else
-   return pvpanic_register_acpi_driver();
+   return 0;
 }
 
 static void __exit pvpanic_mmio_exit(void)
@@ -186,6 +253,7 @@ static void __exit pvpanic_mmio_exit(void)
platform_driver_unregister(_mmio_driver);
else
pvpanic_unregister_acpi_driver();
+   pvpanic_unregister_pci_driver();
 }
 
 module_init(pvpanic_mmio_init);
-- 
1.8.3.1