diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/imx233/partitions-imx233.c | 20 | ||||
-rw-r--r-- | firmware/target/arm/imx233/partitions-imx233.h | 8 | ||||
-rw-r--r-- | firmware/target/arm/imx233/sdmmc-imx233.c | 10 |
3 files changed, 24 insertions, 14 deletions
diff --git a/firmware/target/arm/imx233/partitions-imx233.c b/firmware/target/arm/imx233/partitions-imx233.c index ebc7b9a6e6..508d6f0d66 100644 --- a/firmware/target/arm/imx233/partitions-imx233.c +++ b/firmware/target/arm/imx233/partitions-imx233.c | |||
@@ -71,11 +71,11 @@ static const char *creative_part_name(enum imx233_part_t part) | |||
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
74 | static int compute_window_creative(IF_MD(int drive,) enum imx233_part_t part, | 74 | static int compute_window_creative(intptr_t user, part_read_fn_t read_fn, |
75 | unsigned *start, unsigned *end) | 75 | enum imx233_part_t part, unsigned *start, unsigned *end) |
76 | { | 76 | { |
77 | uint8_t mblk[512]; | 77 | uint8_t mblk[512]; |
78 | int ret = storage_read_sectors(IF_MD(drive,) MBLK_ADDR / 512, 1, mblk); | 78 | int ret = read_fn(user, MBLK_ADDR / 512, 1, mblk); |
79 | if(ret < 0) | 79 | if(ret < 0) |
80 | return ret; | 80 | return ret; |
81 | struct mblk_header_t *hdr = (void *)mblk; | 81 | struct mblk_header_t *hdr = (void *)mblk; |
@@ -99,11 +99,11 @@ static int compute_window_creative(IF_MD(int drive,) enum imx233_part_t part, | |||
99 | #endif /* #(IMX233_PARTITIONS & IMX233_CREATIVE) */ | 99 | #endif /* #(IMX233_PARTITIONS & IMX233_CREATIVE) */ |
100 | 100 | ||
101 | #if (IMX233_PARTITIONS & IMX233_FREESCALE) | 101 | #if (IMX233_PARTITIONS & IMX233_FREESCALE) |
102 | static int compute_window_freescale(IF_MD(int drive,) enum imx233_part_t part, | 102 | static int compute_window_freescale(intptr_t user, part_read_fn_t read_fn, |
103 | unsigned *start, unsigned *end) | 103 | enum imx233_part_t part, unsigned *start, unsigned *end) |
104 | { | 104 | { |
105 | uint8_t mbr[512]; | 105 | uint8_t mbr[512]; |
106 | int ret = storage_read_sectors(IF_MD(drive,) 0, 1, mbr); | 106 | int ret = read_fn(user, 0, 1, mbr); |
107 | if(ret < 0) | 107 | if(ret < 0) |
108 | return ret; | 108 | return ret; |
109 | /** | 109 | /** |
@@ -161,17 +161,17 @@ static int compute_window_freescale(IF_MD(int drive,) enum imx233_part_t part, | |||
161 | } | 161 | } |
162 | #endif /* (IMX233_PARTITIONS & IMX233_FREESCALE) */ | 162 | #endif /* (IMX233_PARTITIONS & IMX233_FREESCALE) */ |
163 | 163 | ||
164 | int imx233_partitions_compute_window(IF_MD(int drive,) enum imx233_part_t part, | 164 | int imx233_partitions_compute_window(intptr_t user, part_read_fn_t read_fn, |
165 | unsigned *start, unsigned *end) | 165 | enum imx233_part_t part, unsigned *start, unsigned *end) |
166 | { | 166 | { |
167 | int ret = -1; | 167 | int ret = -1; |
168 | #if (IMX233_PARTITIONS & IMX233_CREATIVE) | 168 | #if (IMX233_PARTITIONS & IMX233_CREATIVE) |
169 | ret = compute_window_creative(IF_MD(drive,) part, start, end); | 169 | ret = compute_window_creative(user, read_fn, part, start, end); |
170 | if(ret >= 0) | 170 | if(ret >= 0) |
171 | return ret; | 171 | return ret; |
172 | #endif | 172 | #endif |
173 | #if (IMX233_PARTITIONS & IMX233_FREESCALE) | 173 | #if (IMX233_PARTITIONS & IMX233_FREESCALE) |
174 | ret = compute_window_freescale(IF_MD(drive,) part, start, end); | 174 | ret = compute_window_freescale(user, read_fn, part, start, end); |
175 | if(ret >= 0) | 175 | if(ret >= 0) |
176 | return ret; | 176 | return ret; |
177 | #endif | 177 | #endif |
diff --git a/firmware/target/arm/imx233/partitions-imx233.h b/firmware/target/arm/imx233/partitions-imx233.h index b7ed251dee..80936ad865 100644 --- a/firmware/target/arm/imx233/partitions-imx233.h +++ b/firmware/target/arm/imx233/partitions-imx233.h | |||
@@ -40,11 +40,15 @@ enum imx233_part_t | |||
40 | #endif | 40 | #endif |
41 | }; | 41 | }; |
42 | 42 | ||
43 | /** The computation function can be called very early in the boot, at which point | ||
44 | * usual storage read/write function may not be available. To workaround this | ||
45 | * issue, one must provide a read function. */ | ||
46 | typedef int (*part_read_fn_t)(intptr_t user, unsigned long start, int count, void* buf); | ||
43 | /* Enable/Disable window computations for internal storage following the | 47 | /* Enable/Disable window computations for internal storage following the |
44 | * Freescale convention */ | 48 | * Freescale convention */ |
45 | void imx233_partitions_enable_window(bool enable); | 49 | void imx233_partitions_enable_window(bool enable); |
46 | bool imx233_partitions_is_window_enabled(void); | 50 | bool imx233_partitions_is_window_enabled(void); |
47 | int imx233_partitions_compute_window(IF_MD(int drive,) enum imx233_part_t part, | 51 | int imx233_partitions_compute_window(intptr_t user, part_read_fn_t read_fn, |
48 | unsigned *start, unsigned *end); | 52 | enum imx233_part_t part, unsigned *start, unsigned *end); |
49 | 53 | ||
50 | #endif /* __PARTITIONS_IMX233__ */ \ No newline at end of file | 54 | #endif /* __PARTITIONS_IMX233__ */ \ No newline at end of file |
diff --git a/firmware/target/arm/imx233/sdmmc-imx233.c b/firmware/target/arm/imx233/sdmmc-imx233.c index cff801f6b9..24bf69e332 100644 --- a/firmware/target/arm/imx233/sdmmc-imx233.c +++ b/firmware/target/arm/imx233/sdmmc-imx233.c | |||
@@ -672,6 +672,12 @@ static int transfer_sectors(int drive, unsigned long start, int count, void *buf | |||
672 | return ret; | 672 | return ret; |
673 | } | 673 | } |
674 | 674 | ||
675 | // user specificies the sdmmc drive | ||
676 | static int part_read_fn(intptr_t user, unsigned long start, int count, void* buf) | ||
677 | { | ||
678 | return transfer_sectors(user, start, count, buf, true); | ||
679 | } | ||
680 | |||
675 | static int init_drive(int drive) | 681 | static int init_drive(int drive) |
676 | { | 682 | { |
677 | int ret; | 683 | int ret; |
@@ -693,8 +699,8 @@ static int init_drive(int drive) | |||
693 | { | 699 | { |
694 | /* NOTE: at this point the window shows the whole disk so raw disk | 700 | /* NOTE: at this point the window shows the whole disk so raw disk |
695 | * accesses can be made to lookup partitions */ | 701 | * accesses can be made to lookup partitions */ |
696 | ret = imx233_partitions_compute_window(IF_MD(drive,) IMX233_PART_USER, | 702 | ret = imx233_partitions_compute_window(IF_MD_DRV(drive), part_read_fn, |
697 | &window_start[drive], &window_end[drive]); | 703 | IMX233_PART_USER, &window_start[drive], &window_end[drive]); |
698 | if(ret) | 704 | if(ret) |
699 | panicf("cannot compute partitions window: %d", ret); | 705 | panicf("cannot compute partitions window: %d", ret); |
700 | SDMMC_INFO(drive).numblocks = window_end[drive] - window_start[drive]; | 706 | SDMMC_INFO(drive).numblocks = window_end[drive] - window_start[drive]; |