view rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch @ 5:e94d4a9e6bd5

WIP on the PCI LKM
author Louis Opter <louis@lse.epitech.net>
date Thu, 05 Jan 2012 20:53:28 +0100
parents d102c9be499c
children 5b128dbd2c17
line wrap: on
line source

# HG changeset patch
# Parent 23fc39d03d6679b631adc6c22f312e6cda9aa82f
rathaxes: start to implement the PCI registration part in the LKM sample

diff --git a/rathaxes/samples/lkm/CMakeLists.txt b/rathaxes/samples/lkm/CMakeLists.txt
--- a/rathaxes/samples/lkm/CMakeLists.txt
+++ b/rathaxes/samples/lkm/CMakeLists.txt
@@ -1,3 +1,3 @@
 ADD_RATHAXES_SOURCES(lkm lkm.rtx
-                     RTI log.rti lkm.rti
-                     BLT log.blt lkm.blt)
+                     RTI log.rti lkm.rti pci.rti
+                     BLT log.blt lkm.blt pci.blt)
diff --git a/rathaxes/samples/lkm/lkm.blt b/rathaxes/samples/lkm/lkm.blt
--- a/rathaxes/samples/lkm/lkm.blt
+++ b/rathaxes/samples/lkm/lkm.blt
@@ -1,8 +1,10 @@
 with LKM
 {
+    /* Skel of the generated C file: */
     ${pointcut LKM::includes};
-    ${pointcut LKM::init};
-    ${pointcut LKM::exit};
+    ${pointcut LKM::prototypes};
+    ${pointcut LKM::data};
+    ${pointcut LKM::code};
 
     template sequence   LKM::init()
     {
@@ -17,7 +19,7 @@
             MODULE_LICENSE(${config.license});
         }
 
-        chunk   LKM::init()
+        chunk   LKM::code()
         {
             /*
              * Rathaxes doesn't yet support arbitrary "decorators" like __init
@@ -34,7 +36,7 @@
 
     template sequence   LKM::exit()
     {
-        chunk   LKM::exit
+        chunk   LKM::code()
         {
             static void __attribute((__section__(.exit.text)))   rtx_module_exit(void)
             {
diff --git a/rathaxes/samples/lkm/lkm.rti b/rathaxes/samples/lkm/lkm.rti
--- a/rathaxes/samples/lkm/lkm.rti
+++ b/rathaxes/samples/lkm/lkm.rti
@@ -1,8 +1,9 @@
 interface LKM
 {
     provided pointcut   LKM::includes;
-    provided pointcut   LKM::init;
-    provided pointcut   LKM::exit;
+    provided pointcut   LKM::prototypes;
+    provided pointcut   LKM::data;
+    provided pointcut   LKM::code;
 
     required variable ::string  LKM::author;
     required variable ::string  LKM::description;
@@ -11,11 +12,11 @@
     required sequence   LKM::init()
     {
         provided chunk  LKM::includes;
-        provided chunk  LKM::init;
+        provided chunk  LKM::code;
     }
 
     required sequence   LKM::exit()
     {
-        provided chunk  LKM::exit;
+        provided chunk  LKM::code;
     }
 }
diff --git a/rathaxes/samples/lkm/lkm.rtx b/rathaxes/samples/lkm/lkm.rtx
--- a/rathaxes/samples/lkm/lkm.rtx
+++ b/rathaxes/samples/lkm/lkm.rtx
@@ -1,5 +1,15 @@
-device LKM use LKM, Log
+device LKM use LKM, PCI, Log
 {
+    PCI::probe(PCI::Device dev)
+    {
+
+    }
+
+    PCI::remove(PCI::Device dev)
+    {
+
+    }
+
     LKM::init()
     {
         Log::info("Hello this is LKM");
@@ -12,7 +22,11 @@
 
 configuration
 {
+    LKM::name = "hello";
     LKM::author = "Rathaxes";
     LKM::description = "Hello World Loadable Kernel Module (LKM)";
     LKM::license = "BSD";
+
+    PCI::vendor_id = "0x8080";
+    PCI::product_id = "0x42";
 }
diff --git a/rathaxes/samples/lkm/pci.blt b/rathaxes/samples/lkm/pci.blt
new file mode 100644
--- /dev/null
+++ b/rathaxes/samples/lkm/pci.blt
@@ -0,0 +1,103 @@
+with PCI, LKM
+{
+    template type   PCI::Device()
+    {
+        /*
+         * chunk   LKM::includes()
+         * {
+         *     #include <linux/pci.h>
+         *
+         *     typedef int include_linux_pci_stamp;
+         * }
+         */
+
+        chunk   ::decl()
+        {
+            struct  rtx_pci_device
+            {
+                struct pci_dev  *pci_dev;
+            };
+        }
+
+        chunk   ::init(pci_dev)
+        {
+            ${self}.pci_dev = pci_dev;
+        }
+
+        map
+        {
+        }
+    }
+
+    template sequence   PCI::probe(PCI::Device dev)
+    {
+        chunk LKM::prototypes()
+        {
+            static int /* __devinit */  rtx_pci_probe(struct pci_dev *,
+                                                      const struct pci_device_id *);
+        }
+
+        chunk LKM::data()
+        {
+            /*
+             * CNorm doesn't seem to like "dynamic" arrays (i.e: you always
+             * have to specify the exact size).
+             */
+            static struct pci_device_id	rtx_pci_device_table[2] = {
+                { ${config.vendor_id}, ${config.product_id}, 0, PCI_ANY_ID, PCI_ANY_ID },
+                { 0, }
+            };
+
+            static struct pci_driver rtx_pci_driver = {
+                .name = ${config.name},
+                .id_table = rtx_pci_device_table,
+                .probe = rtx_pci_probe,
+                .remove = rtx_pci_remove
+            };
+        }
+
+        chunk LKM::code()
+        {
+            static int /* __devinit */  rtx_pci_probe(struct pci_dev *pdev,
+                                                      const struct pci_device_id *pdev_id)
+            {
+                /* workaround for CNorm __std__ dialect, shouldn't be here */
+                typedef int ${PCI::Device};
+
+                int             err;
+                ${PCI::Device}  *dev = NULL; /* Doesn't work with a pointer */
+
+                err = pci_enable_device(pdev);
+//              if (err < 0) /* `if' doesn't work */
+//                  goto fail;
+
+                ${pointcut ::IMPLEMENTATION};
+
+                pci_set_drvdata(pdev, dev);
+
+                return 0;
+
+                fail:
+                    return err;
+            }
+        }
+    }
+
+    template sequence   PCI::remove(PCI::Device dev)
+    {
+        chunk LKM::prototypes()
+        {
+            static void rtx_pci_remove(struct pci_dev *);
+        }
+
+        chunk LKM::code()
+        {
+            static void rtx_pci_remove(struct pci_dev *pdev)
+            {
+                pci_disable_device(pdev);
+
+                ${pointcut ::IMPLEMENTATION};
+            }
+        }
+    }
+}
diff --git a/rathaxes/samples/lkm/pci.rti b/rathaxes/samples/lkm/pci.rti
new file mode 100644
--- /dev/null
+++ b/rathaxes/samples/lkm/pci.rti
@@ -0,0 +1,25 @@
+interface PCI : LKM
+{
+    provided type       PCI::Device;
+
+    required variable ::number  PCI::vendor_id;
+    required variable ::number  PCI::product_id;
+
+    provided sequence   PCI::register()
+    {
+        provided chunk  ::CALL;
+    }
+
+    required sequence   PCI::probe(PCI::Device)
+    {
+        provided chunk  LKM::prototypes;
+        provided chunk  LKM::data;
+        provided chunk  LKM::code;
+    }
+
+    required sequence   PCI::remove(PCI::Device)
+    {
+        provided chunk  LKM::prototypes;
+        provided chunk  LKM::code;
+    }
+}