/* * sfi_map_table() * * Return address of mapped table * Check for common case that we can re-use mapping to SYST, * which requires syst_pa, syst_va to be initialized. */ struct sfi_table_header *sfi_map_table(u64 pa) { struct sfi_table_header *th; u32 length; pr_emerg("Entering sfi_map_table, pa = %llx\n", pa); if (!TABLE_ON_PAGE(syst_pa, pa, sizeof(struct sfi_table_header))) th = sfi_map_memory(pa, sizeof(struct sfi_table_header)); else th = (void *)syst_va + (pa - syst_pa); pr_emerg("sfi_map_table, th = %llx\n", (u64)th); /* If table fits on same page as its header, we are done */ if (TABLE_ON_PAGE(th, th, th->len)) return th; /* Entire table does not fit on same page as SYST */ length = th->len; if (!TABLE_ON_PAGE(syst_pa, pa, sizeof(struct sfi_table_header))) sfi_unmap_memory(th, sizeof(struct sfi_table_header)); return sfi_map_memory(pa, length); }
struct sfi_table_header *sfi_map_table(u64 pa) { struct sfi_table_header *th; u32 length; if (!TABLE_ON_PAGE(syst_pa, pa, sizeof(struct sfi_table_header))) th = sfi_map_memory(pa, sizeof(struct sfi_table_header)); else th = (void *)syst_va + (pa - syst_pa); if (TABLE_ON_PAGE(th, th, th->len)) return th; length = th->len; if (!TABLE_ON_PAGE(syst_pa, pa, sizeof(struct sfi_table_header))) sfi_unmap_memory(th, sizeof(struct sfi_table_header)); return sfi_map_memory(pa, length); }
/* * sfi_unmap_table() * * Undoes effect of sfi_map_table() by unmapping table * if it did not completely fit on same page as SYST. */ static void sfi_unmap_table(struct sfi_table_header *th) { if (!TABLE_ON_PAGE(syst_va, th, th->len)) sfi_unmap_memory(th, TABLE_ON_PAGE(th, th, th->len) ? sizeof(*th) : th->len); }