[RTEMS Project] #4003: Zynq-7000 BSP: Support using OCM as cacheable memory

RTEMS trac trac at rtems.org
Thu Jun 11 02:21:15 UTC 2020


#4003: Zynq-7000 BSP: Support using OCM as cacheable memory
----------------------------------+--------------------
  Reporter:  Jonathan Brandmeyer  |      Owner:  (none)
      Type:  enhancement          |     Status:  new
  Priority:  normal               |  Milestone:  6.1
 Component:  admin                |    Version:  5
  Severity:  normal               |   Keywords:
Blocked By:                       |   Blocking:
----------------------------------+--------------------
 Background: During normal startup, the ROM bootloader performs vendor-
 specific initialization of  core 1, and then sits in a wait-for-event loop
 until a special value has been written to a specific address in OCM.  In
 that state, the MMU has not yet been initialized and core 1 is treating
 OCM as Device memory.

 By the time the RTEMS boot gets to _CPU_SMP_Start_processor, core 0's MMU
 has already been initialized with the application-defined memory map.  I'd
 like to use the on-chip memory as inner cacheable memory in my
 application.  In order to ensure that the kick address write actually
 becomes visible to core 1, a cache line flush of the affected line is
 necessary prior to sending the event that wakes up the other core.

 I also added an invalidation prior to the kick-address write out of an
 abundance of caution.  it shouldn't be necessary, but I had a hard time
 proving it definitively.

 There are a plethora of cache maintenance functions available for the job
 in RTEMS.  I picked an inline helper that operates directly on CP15.  The
 code's commentary suggests that the L2 hasn't been initialized yet, and
 the higher-level `rtems_cache_*_multiple_data_lines` API affects both L1D
 and L2.  Also, I'm using inner-cacheable/outer-shareable memory attributes
 for OCM specifically because of where it sits in the SOC's busswork, so it
 turns out that we *never* need to flush L2 for that memory anyway.

 This patch also works with the default memory map, which defines upper OCM
 as Device memory.  It is harmless to perform a flush by modified virtual
 address to memory which is marked as Device memory.

--
Ticket URL: <http://devel.rtems.org/ticket/4003>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list