svn commit: r286768 - head/sys/arm64/arm64
Andrew Turner
andrew at FreeBSD.org
Fri Aug 14 09:55:26 UTC 2015
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)
More information about the svn-src-all
mailing list