This enables disk drivers to call the dma-* words as required by the specification.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- arch/sparc32/tree.fs | 20 ++++++++++++++++++++ drivers/esp.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- drivers/iommu.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 3 deletions(-)
diff --git a/arch/sparc32/tree.fs b/arch/sparc32/tree.fs index fc95636..e9d0333 100644 --- a/arch/sparc32/tree.fs +++ b/arch/sparc32/tree.fs @@ -93,6 +93,11 @@ new-device : decode-unit decode-unit-sbus ; : map-in map-in-sbus ; : map-out map-out-sbus ; + : dma-alloc " dma-alloc" $call-parent ; + : dma-free " dma-free" $call-parent ; + : dma-map-in " dma-map-in" $call-parent ; + : dma-map-out " dma-map-out" $call-parent ; + : dma-sync " dma-sync" $call-parent ; finish-device
[IFDEF] CONFIG_BPP @@ -110,6 +115,11 @@ new-device external : encode-unit encode-unit-sbus ; : decode-unit decode-unit-sbus ; + : dma-alloc " dma-alloc" $call-parent ; + : dma-free " dma-free" $call-parent ; + : dma-map-in " dma-map-in" $call-parent ; + : dma-map-out " dma-map-out" $call-parent ; + : dma-sync " dma-sync" $call-parent ; finish-device
" /iommu/sbus" find-device @@ -119,6 +129,11 @@ new-device external : encode-unit encode-unit-sbus ; : decode-unit decode-unit-sbus ; + : dma-alloc " dma-alloc" $call-parent ; + : dma-free " dma-free" $call-parent ; + : dma-map-in " dma-map-in" $call-parent ; + : dma-map-out " dma-map-out" $call-parent ; + : dma-sync " dma-sync" $call-parent ; finish-device
" /iommu/sbus/ledma" find-device @@ -127,6 +142,11 @@ new-device " network" device-type h# 7 encode-int " busmaster-regval" property h# 26 encode-int 0 encode-int encode+ " intr" property + : dma-alloc " dma-alloc" $call-parent ; + : dma-free " dma-free" $call-parent ; + : dma-map-in " dma-map-in" $call-parent ; + : dma-map-out " dma-map-out" $call-parent ; + : dma-sync " dma-sync" $call-parent ; finish-device
\ obio (on-board IO) diff --git a/drivers/esp.c b/drivers/esp.c index 44b2096..0454d5c 100644 --- a/drivers/esp.c +++ b/drivers/esp.c @@ -248,6 +248,35 @@ inquiry(esp_private_t *esp, sd_private_t *sd) return 1; }
+static void +ob_esp_dma_alloc(__attribute__((unused)) esp_private_t **esp) +{ + call_parent_method("dma-alloc"); +} + +static void +ob_esp_dma_free(__attribute__((unused)) esp_private_t **esp) +{ + call_parent_method("dma-free"); +} + +static void +ob_esp_dma_map_in(__attribute__((unused)) esp_private_t **esp) +{ + call_parent_method("dma-map-in"); +} + +static void +ob_esp_dma_map_out(__attribute__((unused)) esp_private_t **esp) +{ + call_parent_method("dma-map-out"); +} + +static void +ob_esp_dma_sync(__attribute__((unused)) esp_private_t **esp) +{ + call_parent_method("dma-sync"); +}
static void ob_sd_read_blocks(sd_private_t **sd) @@ -333,6 +362,11 @@ NODE_METHODS(ob_sd) = { { "close", ob_sd_close }, { "read-blocks", ob_sd_read_blocks }, { "block-size", ob_sd_block_size }, + { "dma-alloc", ob_esp_dma_alloc }, + { "dma-free", ob_esp_dma_free }, + { "dma-map-in", ob_esp_dma_map_in }, + { "dma-map-out", ob_esp_dma_map_out }, + { "dma-sync", ob_esp_dma_sync }, };
@@ -443,9 +477,14 @@ ob_esp_encodeunit(__attribute__((unused)) esp_private_t **esp) }
NODE_METHODS(ob_esp) = { - { NULL, ob_esp_initialize }, - { "decode-unit", ob_esp_decodeunit }, - { "encode-unit", ob_esp_encodeunit }, + { NULL, ob_esp_initialize }, + { "decode-unit", ob_esp_decodeunit }, + { "encode-unit", ob_esp_encodeunit }, + { "dma-alloc", ob_esp_dma_alloc }, + { "dma-free", ob_esp_dma_free }, + { "dma-map-in", ob_esp_dma_map_in }, + { "dma-map-out", ob_esp_dma_map_out }, + { "dma-sync", ob_esp_dma_sync }, };
static void diff --git a/drivers/iommu.c b/drivers/iommu.c index c414894..a6c02b8 100644 --- a/drivers/iommu.c +++ b/drivers/iommu.c @@ -207,6 +207,36 @@ ob_iommu_map_out(void) ofmem_release_io(virt, size); }
+static void +ob_iommu_dma_alloc(void) +{ + call_parent_method("dma-alloc"); +} + +static void +ob_iommu_dma_free(void) +{ + call_parent_method("dma-free"); +} + +static void +ob_iommu_dma_map_in(void) +{ + call_parent_method("dma-map-in"); +} + +static void +ob_iommu_dma_map_out(void) +{ + call_parent_method("dma-map-out"); +} + +static void +ob_iommu_dma_sync(void) +{ + call_parent_method("dma-sync"); +} + void ob_init_iommu(uint64_t base) { @@ -234,4 +264,9 @@ ob_init_iommu(uint64_t base)
bind_func("map-in", ob_iommu_map_in); bind_func("map-out", ob_iommu_map_out); + bind_func("dma-alloc", ob_iommu_dma_alloc); + bind_func("dma-free", ob_iommu_dma_free); + bind_func("dma-map-in", ob_iommu_dma_map_in); + bind_func("dma-map-out", ob_iommu_dma_map_out); + bind_func("dma-sync", ob_iommu_dma_sync); }