1*abbc1723Svisa /* $OpenBSD: cache.h,v 1.9 2016/12/21 13:59:57 visa Exp $ */ 2737df64eSmiod 3737df64eSmiod /* 4737df64eSmiod * Copyright (c) 2012 Miodrag Vallat. 5737df64eSmiod * 6737df64eSmiod * Permission to use, copy, modify, and distribute this software for any 7737df64eSmiod * purpose with or without fee is hereby granted, provided that the above 8737df64eSmiod * copyright notice and this permission notice appear in all copies. 9737df64eSmiod * 10737df64eSmiod * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11737df64eSmiod * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12737df64eSmiod * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13737df64eSmiod * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14737df64eSmiod * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15737df64eSmiod * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16737df64eSmiod * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17737df64eSmiod */ 18737df64eSmiod 19737df64eSmiod #ifndef _MIPS64_CACHE_H_ 20737df64eSmiod #define _MIPS64_CACHE_H_ 21737df64eSmiod 22737df64eSmiod /* 23737df64eSmiod * Declare canonical cache functions for a given processor. 24737df64eSmiod * 25b94f5bc5Smiod * The following assumptions are made: 26b94f5bc5Smiod * - only L1 has split instruction and data caches. 27b94f5bc5Smiod * - L1 I$ is virtually indexed. 28737df64eSmiod * 29b94f5bc5Smiod * Processor-specific routines will make extra assumptions. 30737df64eSmiod */ 31737df64eSmiod 32737df64eSmiod #define CACHE_PROTOS(chip) \ 33737df64eSmiod /* Figure out cache configuration */ \ 34737df64eSmiod void chip##_ConfigCache(struct cpu_info *); \ 35737df64eSmiod /* Writeback and invalidate all caches */ \ 36737df64eSmiod void chip##_SyncCache(struct cpu_info *); \ 37737df64eSmiod /* Invalidate all I$ for the given range */ \ 38b94f5bc5Smiod void chip##_InvalidateICache(struct cpu_info *, vaddr_t, size_t); \ 3980941abeSmiod /* Register a given page for I$ invalidation */ \ 4080941abeSmiod void chip##_InvalidateICachePage(struct cpu_info *, vaddr_t); \ 4180941abeSmiod /* Perform postponed I$ invalidation */ \ 4280941abeSmiod void chip##_SyncICache(struct cpu_info *); \ 43737df64eSmiod /* Writeback all D$ for the given page */ \ 44b94f5bc5Smiod void chip##_SyncDCachePage(struct cpu_info *, vaddr_t, paddr_t); \ 451a4be959Svisa /* Writeback all D$ for the (currently mapped) given page */ \ 461a4be959Svisa void chip##_HitSyncDCachePage(struct cpu_info *, vaddr_t, paddr_t); \ 47737df64eSmiod /* Writeback all D$ for the given range */ \ 48b94f5bc5Smiod void chip##_HitSyncDCache(struct cpu_info *, vaddr_t, size_t); \ 49737df64eSmiod /* Invalidate all D$ for the given range */ \ 50b94f5bc5Smiod void chip##_HitInvalidateDCache(struct cpu_info *, vaddr_t, size_t); \ 51737df64eSmiod /* Enforce coherency of the given range */ \ 52b94f5bc5Smiod void chip##_IOSyncDCache(struct cpu_info *, vaddr_t, size_t, int); 53737df64eSmiod 54737df64eSmiod /* 55737df64eSmiod * Cavium Octeon. 56737df64eSmiod */ 5732426916Smiod CACHE_PROTOS(Octeon) 58737df64eSmiod 59*abbc1723Svisa void Octeon_lock_secondary_cache(struct cpu_info *, paddr_t, size_t); 60*abbc1723Svisa void Octeon_unlock_secondary_cache(struct cpu_info *, paddr_t, size_t); 61*abbc1723Svisa 62737df64eSmiod /* 63b94f5bc5Smiod * STC Loongson 2E and 2F. 64737df64eSmiod */ 6532426916Smiod CACHE_PROTOS(Loongson2) 66737df64eSmiod 67737df64eSmiod /* 68f8fa4920Smiod * Loongson 3A and 2Gq. 69f8fa4920Smiod */ 70f8fa4920Smiod CACHE_PROTOS(Loongson3) 71f8fa4920Smiod 72f8fa4920Smiod /* 73737df64eSmiod * MIPS R4000 and R4400. 74737df64eSmiod */ 7532426916Smiod CACHE_PROTOS(Mips4k) 76737df64eSmiod 77737df64eSmiod /* 78b94f5bc5Smiod * IDT/QED/PMC-Sierra R4600, R4700, R5000, RM52xx, RM7xxx, RM9xxx. 79737df64eSmiod */ 8032426916Smiod CACHE_PROTOS(Mips5k) 81737df64eSmiod 82737df64eSmiod /* 83a4a4ed5cSmiod * MIPS (SGI, really) R8000. 84a4a4ed5cSmiod */ 85a4a4ed5cSmiod CACHE_PROTOS(tfp) 86a4a4ed5cSmiod 87a4a4ed5cSmiod /* 88b94f5bc5Smiod * MIPS/NEC R10000/R120000/R140000/R16000. 89737df64eSmiod */ 9032426916Smiod CACHE_PROTOS(Mips10k) 91737df64eSmiod 92737df64eSmiod /* 93f8fa4920Smiod * mips64r2-compliant processors. 94f8fa4920Smiod */ 95f8fa4920Smiod CACHE_PROTOS(mips64r2) 96f8fa4920Smiod 97f8fa4920Smiod /* 98737df64eSmiod * Values used by the IOSyncDCache routine [which acts as the backend of 99737df64eSmiod * bus_dmamap_sync()]. 100737df64eSmiod */ 101737df64eSmiod #define CACHE_SYNC_R 0 /* WB invalidate, WT invalidate */ 102a4a4ed5cSmiod #define CACHE_SYNC_W 1 /* WB writeback, WT unaffected */ 103737df64eSmiod #define CACHE_SYNC_X 2 /* WB writeback + invalidate, WT invalidate */ 104737df64eSmiod 10525b86d72Smiod extern vaddr_t cache_valias_mask; 10625b86d72Smiod 107737df64eSmiod #endif /* _MIPS64_CACHE_H_ */ 108