summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/imx233/partitions-imx233.c20
-rw-r--r--firmware/target/arm/imx233/partitions-imx233.h8
-rw-r--r--firmware/target/arm/imx233/sdmmc-imx233.c10
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
74static int compute_window_creative(IF_MD(int drive,) enum imx233_part_t part, 74static 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)
102static int compute_window_freescale(IF_MD(int drive,) enum imx233_part_t part, 102static 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
164int imx233_partitions_compute_window(IF_MD(int drive,) enum imx233_part_t part, 164int 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. */
46typedef 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 */
45void imx233_partitions_enable_window(bool enable); 49void imx233_partitions_enable_window(bool enable);
46bool imx233_partitions_is_window_enabled(void); 50bool imx233_partitions_is_window_enabled(void);
47int imx233_partitions_compute_window(IF_MD(int drive,) enum imx233_part_t part, 51int 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
676static 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
675static int init_drive(int drive) 681static 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];