| 1179 | } |
| 1180 | |
| 1181 | int |
| 1182 | memory_mapping_mode(vm_paddr_t pa) |
| 1183 | { |
| 1184 | struct efi_md *map, *p; |
| 1185 | size_t efisz; |
| 1186 | int ndesc, i; |
| 1187 | |
| 1188 | if (efihdr == NULL) |
| 1189 | return (VM_MEMATTR_WRITE_BACK); |
| 1190 | |
| 1191 | /* |
| 1192 | * Memory map data provided by UEFI via the GetMemoryMap |
| 1193 | * Boot Services API. |
| 1194 | */ |
| 1195 | efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf; |
| 1196 | map = (struct efi_md *)((uint8_t *)efihdr + efisz); |
| 1197 | |
| 1198 | if (efihdr->descriptor_size == 0) |
| 1199 | return (VM_MEMATTR_WRITE_BACK); |
| 1200 | ndesc = efihdr->memory_size / efihdr->descriptor_size; |
| 1201 | |
| 1202 | for (i = 0, p = map; i < ndesc; i++, |
| 1203 | p = efi_next_descriptor(p, efihdr->descriptor_size)) { |
| 1204 | if (pa < p->md_phys || |
| 1205 | pa >= p->md_phys + p->md_pages * EFI_PAGE_SIZE) |
| 1206 | continue; |
| 1207 | if (p->md_type == EFI_MD_TYPE_IOMEM || |
| 1208 | p->md_type == EFI_MD_TYPE_IOPORT) |
| 1209 | return (VM_MEMATTR_DEVICE); |
| 1210 | else if ((p->md_attr & EFI_MD_ATTR_WB) != 0 || |
| 1211 | p->md_type == EFI_MD_TYPE_RECLAIM) |
| 1212 | return (VM_MEMATTR_WRITE_BACK); |
| 1213 | else if ((p->md_attr & EFI_MD_ATTR_WT) != 0) |
| 1214 | return (VM_MEMATTR_WRITE_THROUGH); |
| 1215 | else if ((p->md_attr & EFI_MD_ATTR_WC) != 0) |
| 1216 | return (VM_MEMATTR_WRITE_COMBINING); |
| 1217 | break; |
| 1218 | } |
| 1219 | |
| 1220 | return (VM_MEMATTR_DEVICE); |
| 1221 | } |
| 1222 | |
| 1223 | void |
| 1224 | initarm(struct arm64_bootparams *abp) |