Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
Bare Metal Firmware
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
3
Issues
3
List
Boards
Labels
Milestones
Merge Requests
3
Merge Requests
3
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kestrel Collaboration
Kestrel Firmware
Bare Metal Firmware
Commits
85358b28
Commit
85358b28
authored
Jun 28, 2021
by
Raptor Engineering Development Team
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add optional DRAM-free mode
parent
10599423
Pipeline
#246
passed with stage
in 21 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
218 additions
and
77 deletions
+218
-77
main.c
main.c
+218
-77
No files found.
main.c
View file @
85358b28
...
...
@@ -29,8 +29,9 @@
// Performance controls
#define ENABLE_LPC_FW_CYCLE_IRQ_HANDLER 1 // Set to 1 to enable LPC master transfer interrupts to the BMC soft core
#define ENABLE_LPC_FW_CYCLE_DMA 1 // Set to 1 to allow the LPC master to DMA data to/from the Wishbone bus
#define ENABLE_LPC_FW_CYCLE_DMA 1 // Set to 1 to allow the LPC master to DMA data to/from the Wishbone bus
(not compatible with direct SPI access)
#define ALLOW_SPI_QUAD_MODE 1 // Set to 1 to allow quad-mode SPI transfers if the hardware supports them
#define WITH_DRAM 1 // Set to 1 to enable the use of attached external DRAM (fast IPL, needs a minimum of 64MB DRAM)
// Debug knobs
#define DEBUG_HOST_SPI_FLASH_READ 0 // Set to 1 to enable verbose logging of SPI flash read process
...
...
@@ -43,6 +44,8 @@
// Host platform configuration
#define HOST_PLATFORM_FPGA_I2C_ADDRESS 0x31
uint8_t
host_flash_write_buffer
[
FLASH_MAX_WR_WINDOW_BYTES
];
extern
uint32_t
irq_unhandled_vector
;
extern
uint32_t
irq_unhandled_source
;
extern
uint8_t
irq_unhandled_vector_valid
;
...
...
@@ -344,11 +347,13 @@ void lpc_slave_isr(void)
#endif
uint32_t
dword
;
uint32_t
ev_status
;
#if (ENABLE_LPC_FW_CYCLE_IRQ_HANDLER)
uint32_t
address
;
uint32_t
physical_flash_address
;
uint8_t
write_not_read
;
uint32_t
status1_reg
;
uint32_t
status2_reg
;
#endif
uint32_t
status4_reg
;
uint32_t
vuart_status
;
volatile
ipmi_request_message_t
*
ipmi_bt_request_ptr
;
...
...
@@ -390,16 +395,34 @@ void lpc_slave_isr(void)
{
for
(
word
=
0
;
word
<
(
lpc_fw_msize_to_bytes
(
fw_cycle_msize
)
/
4
);
word
++
)
{
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)))
=
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)));
if
((
WITH_DRAM
)
||
((
!
WITH_DRAM
)
&&
(
hiomap_config
.
window_type
!=
HIOMAP_WINDOW_TYPE_WRITE
)))
{
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)))
=
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)))
=
*
(
(
uint32_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
(
word
*
4
)));
}
}
}
else
{
for
(
byte
=
0
;
byte
<
lpc_fw_msize_to_bytes
(
fw_cycle_msize
);
byte
++
)
{
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
))
=
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
));
if
((
WITH_DRAM
)
||
((
!
WITH_DRAM
)
&&
(
hiomap_config
.
window_type
!=
HIOMAP_WINDOW_TYPE_WRITE
)))
{
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
))
=
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
))
=
*
((
uint8_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
byte
));
}
}
}
...
...
@@ -414,16 +437,34 @@ void lpc_slave_isr(void)
{
for
(
word
=
0
;
word
<
(
lpc_fw_msize_to_bytes
(
fw_cycle_msize
)
/
4
);
word
++
)
{
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)))
=
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)));
if
(
WITH_DRAM
)
{
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)))
=
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
uint32_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
(
word
*
4
)))
=
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)));
}
}
}
else
{
for
(
byte
=
0
;
byte
<
lpc_fw_msize_to_bytes
(
fw_cycle_msize
);
byte
++
)
{
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
))
=
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
));
if
(
WITH_DRAM
)
{
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
))
=
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
uint8_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
byte
))
=
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
));
}
}
}
...
...
@@ -1010,34 +1051,52 @@ static void process_host_to_bmc_ipmi_bt_transactions(void)
break
;
}
#if (ENABLE_LPC_FW_CYCLE_DMA)
// Disable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
// Reconfigure LPC firmware cycle DMA ranges
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG2
,
(
uintptr_t
)
host_flash_buffer
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG3
,
FLASH_SIZE_BYTES
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG4
,
hiomap_config
.
window_start_address
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG5
,
hiomap_config
.
window_start_address
+
hiomap_config
.
window_length_bytes
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG6
,
FLASH_SIZE_BYTES
-
1
);
// Enable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
|=
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
if
(
hiomap_config
.
window_type
==
HIOMAP_WINDOW_TYPE_WRITE
)
if
(
ENABLE_LPC_FW_CYCLE_DMA
)
{
dword
|=
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
// Disable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
if
(
WITH_DRAM
||
(
hiomap_config
.
window_type
!=
HIOMAP_WINDOW_TYPE_WRITE
))
{
// Reconfigure LPC firmware cycle DMA ranges
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG2
,
(
uintptr_t
)
host_flash_buffer
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG3
,
FLASH_SIZE_BYTES
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG4
,
hiomap_config
.
window_start_address
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG5
,
hiomap_config
.
window_start_address
+
hiomap_config
.
window_length_bytes
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG6
,
FLASH_SIZE_BYTES
-
1
);
// Enable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
|=
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
if
(
hiomap_config
.
window_type
==
HIOMAP_WINDOW_TYPE_WRITE
)
{
dword
|=
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
}
else
{
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
}
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
}
}
else
if
((
!
WITH_DRAM
)
&&
(
hiomap_config
.
window_type
==
HIOMAP_WINDOW_TYPE_WRITE
))
{
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
// Flush the window (if dirty)
for
(
i
=
0
;
i
<
hiomap_config
.
dirty_range_count
;
i
++
)
{
write_data_to_flash
(((
uint8_t
*
)(
host_flash_write_buffer
)),
hiomap_config
.
dirty_ranges
[
i
].
bytes
,
hiomap_config
.
dirty_ranges
[
i
].
start_address
,
!
hiomap_config
.
dirty_ranges
[
i
].
erased
);
}
hiomap_config
.
dirty_range_count
=
0
;
// Copy data from Flash into cache buffer
memcpy
(
host_flash_write_buffer
,
(
uint8_t
*
)(
HOSTSPIFLASH_BASE
+
hiomap_config
.
window_start_address
),
FLASH_MAX_WR_WINDOW_BYTES
);
}
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
#endif
// Generate response
switch
(
hiomap_config
.
protocol_version
)
...
...
@@ -1096,11 +1155,14 @@ static void process_host_to_bmc_ipmi_bt_transactions(void)
break
;
}
// Record dirty page
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
start_address
=
offset_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
bytes
=
length_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
erased
=
flags
&
0x1
;
hiomap_config
.
dirty_range_count
++
;
if
(
hiomap_config
.
window_type
==
HIOMAP_WINDOW_TYPE_WRITE
)
{
// Record dirty page
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
start_address
=
offset_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
bytes
=
length_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
erased
=
flags
&
0x1
;
hiomap_config
.
dirty_range_count
++
;
}
response
.
data
[
0
]
=
ipmi_bt_current_request
.
data
[
0
];
response
.
data
[
1
]
=
ipmi_bt_current_request
.
data
[
1
];
...
...
@@ -1119,18 +1181,29 @@ static void process_host_to_bmc_ipmi_bt_transactions(void)
((((
uint32_t
)
ipmi_bt_current_request
.
data
[
7
])
<<
24
)
|
(((
uint32_t
)
ipmi_bt_current_request
.
data
[
6
])
<<
16
)
|
(((
uint32_t
)
ipmi_bt_current_request
.
data
[
5
])
<<
8
)
|
ipmi_bt_current_request
.
data
[
4
]);
// Record dirty page
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
start_address
=
offset_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
bytes
=
length_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
erased
=
0
;
hiomap_config
.
dirty_range_count
++
;
if
(
hiomap_config
.
window_type
==
HIOMAP_WINDOW_TYPE_WRITE
)
{
// Record dirty page
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
start_address
=
offset_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
bytes
=
length_bytes
;
hiomap_config
.
dirty_ranges
[
hiomap_config
.
dirty_range_count
].
erased
=
0
;
hiomap_config
.
dirty_range_count
++
;
}
}
for
(
i
=
0
;
i
<
hiomap_config
.
dirty_range_count
;
i
++
)
{
write_data_to_flash
(((
uint8_t
*
)(
host_flash_buffer
+
hiomap_config
.
dirty_ranges
[
i
].
start_address
)),
hiomap_config
.
dirty_ranges
[
i
].
bytes
,
hiomap_config
.
dirty_ranges
[
i
].
start_address
,
!
hiomap_config
.
dirty_ranges
[
i
].
erased
);
if
(
WITH_DRAM
)
{
write_data_to_flash
(((
uint8_t
*
)(
host_flash_buffer
+
hiomap_config
.
dirty_ranges
[
i
].
start_address
)),
hiomap_config
.
dirty_ranges
[
i
].
bytes
,
hiomap_config
.
dirty_ranges
[
i
].
start_address
,
!
hiomap_config
.
dirty_ranges
[
i
].
erased
);
}
else
{
write_data_to_flash
(((
uint8_t
*
)(
host_flash_write_buffer
)),
hiomap_config
.
dirty_ranges
[
i
].
bytes
,
hiomap_config
.
dirty_ranges
[
i
].
start_address
,
!
hiomap_config
.
dirty_ranges
[
i
].
erased
);
}
}
hiomap_config
.
dirty_range_count
=
0
;
...
...
@@ -1208,7 +1281,7 @@ static void process_host_to_bmc_ipmi_bt_transactions(void)
}
#if !(ENABLE_LPC_FW_CYCLE_IRQ_HANDLER)
static
uint32_t
previous_fw_read_address
;
static
uint32_t
previous_fw_read_address
=
0xdeadbeef
;
#endif
static
void
process_interrupts_stage2
(
void
)
...
...
@@ -1357,21 +1430,22 @@ static void run_pre_ipl_bmc_peripheral_setup(void)
hiomap_config
.
window_type
=
HIOMAP_WINDOW_TYPE_READ
;
hiomap_config
.
dirty_range_count
=
0
;
#if (ENABLE_LPC_FW_CYCLE_DMA)
// Configure and enable LPC firmware cycle DMA
// Set up default window with address masking based on physical ROM size
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG2
,
(
uintptr_t
)
host_flash_buffer
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG3
,
FLASH_SIZE_BYTES
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG4
,
0x0
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG5
,
FLASH_SIZE_BYTES
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG6
,
FLASH_SIZE_BYTES
-
1
);
// Enable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
|=
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
#endif
if
(
ENABLE_LPC_FW_CYCLE_DMA
)
{
// Configure and enable LPC firmware cycle DMA
// Set up default window with address masking based on physical ROM size
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG2
,
(
uintptr_t
)
host_flash_buffer
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG3
,
FLASH_SIZE_BYTES
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG4
,
0x0
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG5
,
FLASH_SIZE_BYTES
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG6
,
FLASH_SIZE_BYTES
-
1
);
// Enable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
|=
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
}
// Enable host background service task
host_background_service_task_active
=
1
;
...
...
@@ -1400,13 +1474,14 @@ static void run_post_shutdown_bmc_peripheral_teardown(void)
}
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_IPMI_BT_STATUS
,
dword
);
#if (ENABLE_LPC_FW_CYCLE_DMA)
// Disable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
#endif
if
(
ENABLE_LPC_FW_CYCLE_DMA
)
{
// Disable DMA engine
dword
=
read_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_R_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_R_SHIFT
);
dword
&=
~
((
1
&
AQUILA_LPC_CTL_EN_FW_DMA_W_MASK
)
<<
AQUILA_LPC_CTL_EN_FW_DMA_W_SHIFT
);
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_DMA_CONFIG1
,
dword
);
}
#if (ENABLE_LPC_FW_CYCLE_IRQ_HANDLER)
// Disable LPC firmware cycle IRQ
...
...
@@ -1744,6 +1819,9 @@ static void host_background_service_task_event_loop(void)
int
byte
;
int
word
;
uint32_t
physical_flash_address
;
#if (ENABLE_LPC_FW_CYCLE_NONCONTIGUOUS_DEBUG)
uint8_t
noncontiguous_access
;
#endif
#endif
// IRQ debugging routines
...
...
@@ -1776,6 +1854,17 @@ static void host_background_service_task_event_loop(void)
// Limit firmware address to 64MB (wrap around)
address
&=
0x3ffffff
;
#if (ENABLE_LPC_FW_CYCLE_NONCONTIGUOUS_DEBUG)
if
((
previous_fw_read_address
+
4
)
!=
address
)
{
noncontiguous_access
=
1
;
printf
(
"[DEBG] Non-contiguous firmware access to address 0x%08x
\n
"
,
address
);
}
else
{
noncontiguous_access
=
0
;
}
#endif
previous_fw_read_address
=
address
;
physical_flash_address
=
address
;
if
((
address
>=
hiomap_config
.
window_start_address
)
&&
((
address
-
hiomap_config
.
window_start_address
)
<
hiomap_config
.
window_length_bytes
))
...
...
@@ -1786,16 +1875,41 @@ static void host_background_service_task_event_loop(void)
{
for
(
word
=
0
;
word
<
(
lpc_fw_msize_to_bytes
(
fw_cycle_msize
)
/
4
);
word
++
)
{
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)))
=
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)));
#if (ENABLE_LPC_FW_CYCLE_NONCONTIGUOUS_DEBUG)
if
(
noncontiguous_access
)
{
printf
(
"[DEBG] Non-contiguous firmware access returning read data 0x%08x from physical flash address 0x%08x
\n
"
,
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
))),
physical_flash_address
);
}
#endif
if
((
WITH_DRAM
)
||
((
!
WITH_DRAM
)
&&
(
hiomap_config
.
window_type
!=
HIOMAP_WINDOW_TYPE_WRITE
)))
{
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)))
=
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)))
=
*
((
uint32_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
(
word
*
4
)));
}
}
}
else
{
for
(
byte
=
0
;
byte
<
lpc_fw_msize_to_bytes
(
fw_cycle_msize
);
byte
++
)
{
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
))
=
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
));
if
((
WITH_DRAM
)
||
((
!
WITH_DRAM
)
&&
(
hiomap_config
.
window_type
!=
HIOMAP_WINDOW_TYPE_WRITE
)))
{
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
))
=
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
))
=
*
((
uint8_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
byte
));
}
}
}
...
...
@@ -1810,16 +1924,34 @@ static void host_background_service_task_event_loop(void)
{
for
(
word
=
0
;
word
<
(
lpc_fw_msize_to_bytes
(
fw_cycle_msize
)
/
4
);
word
++
)
{
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)))
=
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)));
if
(
WITH_DRAM
)
{
*
((
uint32_t
*
)(
host_flash_buffer
+
physical_flash_address
+
(
word
*
4
)))
=
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
uint32_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
(
word
*
4
)))
=
*
((
volatile
uint32_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
(
word
*
4
)));
}
}
}
else
{
for
(
byte
=
0
;
byte
<
lpc_fw_msize_to_bytes
(
fw_cycle_msize
);
byte
++
)
{
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
))
=
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
));
if
(
WITH_DRAM
)
{
*
((
uint8_t
*
)(
host_flash_buffer
+
physical_flash_address
+
byte
))
=
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
));
}
else
if
((
physical_flash_address
>=
hiomap_config
.
window_start_address
)
&&
((
physical_flash_address
-
hiomap_config
.
window_start_address
)
<
FLASH_MAX_WR_WINDOW_BYTES
))
{
*
((
uint8_t
*
)(
host_flash_write_buffer
+
(
physical_flash_address
-
hiomap_config
.
window_start_address
)
+
byte
))
=
*
((
volatile
uint8_t
*
)(
HOSTLPCSLAVE_BASE
+
AQUILA_LPC_FW_DATA_BLOCK_OFFSET
+
byte
));
}
}
}
...
...
@@ -2288,6 +2420,7 @@ static void memcpy32(uint32_t *destination, uint32_t *source, int words)
}
}
#if (WITH_DRAM)
static
void
memset32
(
uint32_t
*
destination
,
uint32_t
value
,
int
words
)
{
int
word
;
...
...
@@ -2297,6 +2430,7 @@ static void memset32(uint32_t *destination, uint32_t value, int words)
destination
++
;
}
}
#endif
#if (WITH_SPI)
static
uint32_t
read_host_spi_flash_id
(
void
)
...
...
@@ -2606,6 +2740,7 @@ int main(void)
write_aquila_register
(
HOSTLPCSLAVE_BASE
,
AQUILA_LPC_REG_CONTROL1
,
dword
);
}
#if (WITH_DRAM)
// Allocate internal host SPI Flash ROM buffer
host_flash_buffer
=
(
uint8_t
*
)(
MAIN_RAM_BASE
+
0x3e00000
);
...
...
@@ -2613,6 +2748,7 @@ int main(void)
printf
(
"Clearing host ROM internal buffer..."
);
memset32
((
uint32_t
*
)
host_flash_buffer
,
0xdeadbeef
,
0x4000000
/
4
);
printf
(
"
\r
Internal host ROM buffer cleared
\n
"
);
#endif
display_character
(
'1'
,
0
);
// STATUS CODE: 1
...
...
@@ -2625,6 +2761,7 @@ int main(void)
reset_flash_device
();
configure_flash_device
();
#if (WITH_DRAM)
// Copy external SPI Flash ROM contents to internal host SPI Flash ROM buffer
copy_spi_flash_to_internal_buffer
(
HOSTSPIFLASH_BASE
,
HOSTSPIFLASHCFG_BASE
,
host_flash_buffer
);
...
...
@@ -2663,6 +2800,10 @@ int main(void)
}
printf
(
"CRC of HBBL region: %08x
\n
"
,
crc32
(
host_flash_buffer
+
0x206200ULL
,
4488
));
#endif
#else
// No DRAM -- direct access only
host_flash_buffer
=
(
uint8_t
*
)
HOSTSPIFLASH_BASE
;
#endif
#endif
display_character
(
'2'
,
0
);
// STATUS CODE: 2
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment