Added mm_realloc_range proxy call to ACPI service.
authorGerd Zellweger <mail@gerdzellweger.com>
Wed, 30 Oct 2013 13:34:26 +0000 (14:34 +0100)
committerGerd Zellweger <mail@gerdzellweger.com>
Tue, 14 Oct 2014 06:47:31 +0000 (08:47 +0200)
if/acpi.if
usr/acpi/acpi_service.c

index 6bbc968..a1b61a0 100644 (file)
@@ -13,39 +13,41 @@ interface acpi "acpi RPC Interface" {
         uint8 device;
         uint8 function;
     } pci_address;
-    
+
     // XXX: SKB fails when these values are stored as predicate?
     rpc get_pcie_confspace(out errval err,
-                           out uint64 address, 
-                           out uint16 segment, 
-                           out uint8 startbus, 
+                           out uint64 address,
+                           out uint16 segment,
+                           out uint8 startbus,
                            out uint8 endbus);
-    
-    rpc read_irq_table(in string handle, 
-                       in pci_address addr, 
+
+    rpc read_irq_table(in string handle,
+                       in pci_address addr,
                        in uint8 bus,
                        out errval error,
                        out string child);
-                       
+
     rpc set_device_irq(in string handle,
-                       in uint32 irq, 
-                       out errval error); 
+                       in uint32 irq,
+                       out errval error);
 
-    rpc enable_and_route_interrupt(in uint32 gsi, 
-                                   in coreid dest, 
+    rpc enable_and_route_interrupt(in uint32 gsi,
+                                   in coreid dest,
                                    in uint32 vector,
                                    out errval error_code);
 
     rpc reset(out errval err);
     rpc sleep(in uint32 state, out errval err);
-    
+
     // Kludge: retrieve frame cap to VBE BIOS;
     rpc get_vbe_bios_cap(out errval err, out cap cap, out uint32 size);
-    
+
     // More Kludge; cap retrieval for pci
     // We need a designated service to maintain the physical address
     // space caps (to avoid sibling errors).
     rpc mm_alloc_range_proxy(in uint8 sizebits, in uint64 minbase,
                              in uint64 maxlimit, out cap devframe, out errval err);
+    rpc mm_realloc_range_proxy(in uint8 sizebits, in uint64 minbase,
+                               out cap devframe, out errval err);
     rpc mm_free_proxy(in cap devframe, in uint64 base, in uint8 sizebits, out errval err);
 };
index ea3ac0f..77d2184 100644 (file)
@@ -28,7 +28,8 @@ extern bool mm_debug;
 static void mm_alloc_range_proxy_handler(struct acpi_binding* b, uint8_t sizebits,
                                                 genpaddr_t minbase, genpaddr_t maxlimit)
 {
-    ACPI_DEBUG("mm_alloc_range_proxy_handler: sizebits: %d, minbase: 0x%"PRIxGENPADDR" maxlimit: 0x%"PRIxGENPADDR"\n",
+    ACPI_DEBUG("mm_alloc_range_proxy_handler: sizebits: %d, "
+               "minbase: 0x%"PRIxGENPADDR" maxlimit: 0x%"PRIxGENPADDR"\n",
                sizebits, minbase, maxlimit);
 
     mm_debug = true;
@@ -45,6 +46,23 @@ static void mm_alloc_range_proxy_handler(struct acpi_binding* b, uint8_t sizebit
     assert(err_is_ok(err));
 }
 
+static void mm_realloc_range_proxy_handler(struct acpi_binding* b, uint8_t sizebits,
+                                           genpaddr_t minbase)
+{
+    ACPI_DEBUG("mm_realloc_range_proxy_handler: sizebits: %d, "
+               "minbase: 0x%"PRIxGENPADDR"\n",
+               sizebits, minbase);
+
+    struct capref devframe = NULL_CAP;
+    errval_t err = mm_realloc_range(&pci_mm_physaddr, sizebits, minbase, &devframe);
+    if (err_is_fail(err)) {
+        DEBUG_ERR(err, "mm alloc range failed...\n");
+    }
+
+    err = b->tx_vtbl.mm_realloc_range_proxy_response(b, NOP_CONT, devframe, err);
+    assert(err_is_ok(err));
+}
+
 // XXX: proper cap handling
 static void mm_free_proxy_handler(struct acpi_binding* b, struct capref devframe,
                                          uint64_t base, uint8_t sizebits)
@@ -253,6 +271,7 @@ struct acpi_rx_vtbl acpi_rx_vtbl = {
     .enable_and_route_interrupt_call = enable_interrupt_handler,
 
     .mm_alloc_range_proxy_call = mm_alloc_range_proxy_handler,
+    .mm_realloc_range_proxy_call = mm_realloc_range_proxy_handler,
     .mm_free_proxy_call = mm_free_proxy_handler,
 
     .reset_call = reset_handler,