Author: mmel
Date: Tue May  9 11:05:32 2017
New Revision: 318021
URL: https://svnweb.freebsd.org/changeset/base/318021

Log:
  Introduce pmap_remap_vm_attr(),
  it allows to remap one VM memattr class to another.
  
  This function is intent to be used as workaround for various SoC bugs,
  mainly access ordering/sequencing related bugs in crossbar fabric.
  
  Inspired by:  https://reviews.freebsd.org/D10218
  MFC after:    2 weeks

Modified:
  head/sys/arm/arm/pmap-v6.c
  head/sys/arm/include/pmap-v6.h

Modified: head/sys/arm/arm/pmap-v6.c
==============================================================================
--- head/sys/arm/arm/pmap-v6.c  Tue May  9 10:42:23 2017        (r318020)
+++ head/sys/arm/arm/pmap-v6.c  Tue May  9 11:05:32 2017        (r318021)
@@ -498,6 +498,25 @@ pmap_set_tex(void)
 }
 
 /*
+ * Remap one vm_meattr class to another one. This can be useful as
+ * workaround for SOC errata, e.g. if devices must be accessed using
+ * SO memory class. 
+ */
+void
+pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr)
+{
+       int old_idx, new_idx;
+       
+       /* Map VM memattrs to indexes to tex_class table. */
+       old_idx = pte2_attr_tab[(int)old_attr];
+       new_idx = pte2_attr_tab[(int)new_attr];
+       
+       /* Replace TEX attribute and apply it. */
+       tex_class[old_idx] = tex_class[new_idx];
+       pmap_set_tex();
+}
+
+/*
  * KERNBASE must be multiple of NPT2_IN_PG * PTE1_SIZE. In other words,
  * KERNBASE is mapped by first L2 page table in L2 page table page. It
  * meets same constrain due to PT2MAP being placed just under KERNBASE.

Modified: head/sys/arm/include/pmap-v6.h
==============================================================================
--- head/sys/arm/include/pmap-v6.h      Tue May  9 10:42:23 2017        
(r318020)
+++ head/sys/arm/include/pmap-v6.h      Tue May  9 11:05:32 2017        
(r318021)
@@ -188,6 +188,7 @@ vm_offset_t pmap_preboot_reserve_pages(u
 vm_offset_t pmap_preboot_get_vpages(u_int);
 void pmap_preboot_map_attr(vm_paddr_t, vm_offset_t, vm_size_t, vm_prot_t,
     vm_memattr_t);
+void pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr);
 
 #endif /* _KERNEL */
 #endif /* !_MACHINE_PMAP_V6_H_ */
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to