cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dma.c (1046B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * DMA implementation for Hexagon
      4 *
      5 * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
      6 */
      7
      8#include <linux/dma-map-ops.h>
      9#include <linux/memblock.h>
     10#include <asm/page.h>
     11
     12void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
     13		enum dma_data_direction dir)
     14{
     15	void *addr = phys_to_virt(paddr);
     16
     17	switch (dir) {
     18	case DMA_TO_DEVICE:
     19		hexagon_clean_dcache_range((unsigned long) addr,
     20		(unsigned long) addr + size);
     21		break;
     22	case DMA_FROM_DEVICE:
     23		hexagon_inv_dcache_range((unsigned long) addr,
     24		(unsigned long) addr + size);
     25		break;
     26	case DMA_BIDIRECTIONAL:
     27		flush_dcache_range((unsigned long) addr,
     28		(unsigned long) addr + size);
     29		break;
     30	default:
     31		BUG();
     32	}
     33}
     34
     35/*
     36 * Our max_low_pfn should have been backed off by 16MB in mm/init.c to create
     37 * DMA coherent space.  Use that for the pool.
     38 */
     39static int __init hexagon_dma_init(void)
     40{
     41	return dma_init_global_coherent(PFN_PHYS(max_low_pfn),
     42					hexagon_coherent_pool_size);
     43}
     44core_initcall(hexagon_dma_init);