Author: andrew
Date: Fri Aug 14 09:55:25 2015
New Revision: 286768
URL: https://svnweb.freebsd.org/changeset/base/286768

Log:
  Add support for bus_space_read_region and bus_space_write_region. This is
  needed for the dwc USB controller driver.
  
  Sponsored by: ABT Systems Ltd

Modified:
  head/sys/arm64/arm64/bus_machdep.c
  head/sys/arm64/arm64/bus_space_asm.S

Modified: head/sys/arm64/arm64/bus_machdep.c
==============================================================================
--- head/sys/arm64/arm64/bus_machdep.c  Fri Aug 14 09:48:23 2015        
(r286767)
+++ head/sys/arm64/arm64/bus_machdep.c  Fri Aug 14 09:55:25 2015        
(r286768)
@@ -49,6 +49,15 @@ void generic_bs_rm_4(void *, bus_space_h
 void generic_bs_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
     bus_size_t);
 
+void generic_bs_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
+    bus_size_t);
+void generic_bs_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+    bus_size_t);
+void generic_bs_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+    bus_size_t);
+void generic_bs_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+    bus_size_t);
+
 void generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t);
 void generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
 void generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
@@ -63,6 +72,15 @@ void generic_bs_wm_4(void *, bus_space_h
 void generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
     bus_size_t);
 
+void generic_bs_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
+    bus_size_t);
+void generic_bs_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+    bus_size_t);
+void generic_bs_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+    bus_size_t);
+void generic_bs_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+    bus_size_t);
+
 static int
 generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
     bus_space_handle_t *bshp)
@@ -126,6 +144,12 @@ struct bus_space memmap_bus = {
        .bs_rm_4 = generic_bs_rm_4,
        .bs_rm_8 = generic_bs_rm_8,
 
+       /* read region */
+       .bs_rr_1 = generic_bs_rr_1,
+       .bs_rr_2 = generic_bs_rr_2,
+       .bs_rr_4 = generic_bs_rr_4,
+       .bs_rr_8 = generic_bs_rr_8,
+
        /* write single */
        .bs_w_1 = generic_bs_w_1,
        .bs_w_2 = generic_bs_w_2,
@@ -139,10 +163,10 @@ struct bus_space memmap_bus = {
        .bs_wm_8 = generic_bs_wm_8,
 
        /* write region */
-       .bs_wr_1 = NULL,
-       .bs_wr_2 = NULL,
-       .bs_wr_4 = NULL,
-       .bs_wr_8 = NULL,
+       .bs_wr_1 = generic_bs_wr_1,
+       .bs_wr_2 = generic_bs_wr_2,
+       .bs_wr_4 = generic_bs_wr_4,
+       .bs_wr_8 = generic_bs_wr_8,
 
        /* set multiple */
        .bs_sm_1 = NULL,

Modified: head/sys/arm64/arm64/bus_space_asm.S
==============================================================================
--- head/sys/arm64/arm64/bus_space_asm.S        Fri Aug 14 09:48:23 2015        
(r286767)
+++ head/sys/arm64/arm64/bus_space_asm.S        Fri Aug 14 09:55:25 2015        
(r286768)
@@ -133,6 +133,90 @@ ENTRY(generic_bs_rm_8)
 2:     ret
 END(generic_bs_rm_8)
 
+ENTRY(generic_bs_rr_1)
+       /* Is there is anything to read. */
+       cbz     x4, 2f
+
+       /* Calculate the device address. */
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Read the data. */
+1:     ldrb    w1, [x0], #1
+       strb    w1, [x3], #1
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_rr_1)
+
+ENTRY(generic_bs_rr_2)
+       /* Is there is anything to read. */
+       cbz     x4, 2f
+
+       /* Calculate the device address. */
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Read the data. */
+1:     ldrh    w1, [x0], #2
+       strh    w1, [x3], #2
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_rr_2)
+
+ENTRY(generic_bs_rr_4)
+       /* Is there is anything to read. */
+       cbz     x4, 2f
+
+       /* Calculate the device address. */
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Read the data. */
+1:     ldr     w1, [x0], #4
+       str     w1, [x3], #4
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_rr_4)
+
+ENTRY(generic_bs_rr_8)
+       /* Is there is anything to read. */
+       cbz     x4, 2f
+
+       /* Calculate the device address. */
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Read the data. */
+1:     ldr     x1, [x0], #8
+       str     x1, [x3], #8
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_rr_8)
+
 
 ENTRY(generic_bs_w_1)
        strb    w3, [x1, x2]
@@ -233,3 +317,83 @@ ENTRY(generic_bs_wm_8)
 
 2:     ret
 END(generic_bs_wm_8)
+
+ENTRY(generic_bs_wr_1)
+       /* Is there is anything to write. */
+       cbz     x4, 2f
+       
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Write the data */
+1:     ldrb    w1, [x3], #1
+       strb    w1, [x0], #1
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_wr_1)
+
+ENTRY(generic_bs_wr_2)
+       /* Is there is anything to write. */
+       cbz     x4, 2f
+       
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Write the data */
+1:     ldrh    w1, [x3], #2
+       strh    w1, [x0], #2
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_wr_2)
+
+ENTRY(generic_bs_wr_4)
+       /* Is there is anything to write. */
+       cbz     x4, 2f
+       
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Write the data */
+1:     ldr     w1, [x3], #4
+       str     w1, [x0], #4
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_wr_4)
+
+ENTRY(generic_bs_wr_8)
+       /* Is there is anything to write. */
+       cbz     x4, 2f
+       
+       add     x0, x1, x2
+       /*
+        * x0 = The device address.
+        * x3 = The kernel address.
+        * x4 = Count
+        */
+
+       /* Write the data */
+1:     ldr     x1, [x3], #8
+       str     x1, [x0], #8
+       subs    x4, x4, #1
+       b.ne    1b
+
+2:     ret
+END(generic_bs_wr_8)
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to