339 lines
8.9 KiB
Diff
339 lines
8.9 KiB
Diff
From 9fdfc44ac699584fdbc10ea5115fa717d13caf23 Mon Sep 17 00:00:00 2001
|
|
From: Jason Montleon <jmontleo@redhat.com>
|
|
Date: Thu, 5 Dec 2024 13:06:08 -0500
|
|
Subject: [PATCH 219/219] stop triggering vmlinux rebuild
|
|
|
|
---
|
|
drivers/memory/eswin/Makefile | 4 -
|
|
drivers/memory/eswin/es_dev_buf/Makefile | 4 -
|
|
include/linux/buddy.h | 217 +++++++++++++++++++++++
|
|
include/linux/dsp_dma_buf.h | 44 +++++
|
|
include/linux/eswin_memblock.h | 18 ++
|
|
5 files changed, 279 insertions(+), 8 deletions(-)
|
|
create mode 100644 include/linux/buddy.h
|
|
create mode 100644 include/linux/dsp_dma_buf.h
|
|
create mode 100644 include/linux/eswin_memblock.h
|
|
|
|
diff --git a/drivers/memory/eswin/Makefile b/drivers/memory/eswin/Makefile
|
|
index c07fadc64d44..e165878cd894 100644
|
|
--- a/drivers/memory/eswin/Makefile
|
|
+++ b/drivers/memory/eswin/Makefile
|
|
@@ -8,7 +8,3 @@ obj-$(CONFIG_ESWIN_RSVMEM_HEAP) += es_rsvmem_heap/
|
|
obj-$(CONFIG_ESWIN_RSVMEM_HEAP) += es_mmz_vb/
|
|
obj-$(CONFIG_ESWIN_DEV_DMA_BUF) += es_dev_buf/
|
|
obj-$(CONFIG_ESWIN_IOMMU_RSV) += es_iommu_rsv/
|
|
-
|
|
-ES_MEM_HEADER := drivers/memory/eswin/
|
|
-
|
|
-COPY_HEADERS := $(shell cp $(ES_MEM_HEADER)/*.h include/linux)
|
|
diff --git a/drivers/memory/eswin/es_dev_buf/Makefile b/drivers/memory/eswin/es_dev_buf/Makefile
|
|
index 3ba183ff62bd..391af838aada 100644
|
|
--- a/drivers/memory/eswin/es_dev_buf/Makefile
|
|
+++ b/drivers/memory/eswin/es_dev_buf/Makefile
|
|
@@ -1,5 +1 @@
|
|
obj-$(CONFIG_ESWIN_DEV_DMA_BUF) += es_dev_buf.o
|
|
-
|
|
-ES_DEV_DMA_BUF_HEADER := drivers/memory/eswin/es_dev_buf/include/linux
|
|
-COPY_HEADERS:=$(shell cp $(ES_DEV_DMA_BUF_HEADER)/*.h include/linux)
|
|
-
|
|
diff --git a/include/linux/buddy.h b/include/linux/buddy.h
|
|
new file mode 100644
|
|
index 000000000000..ff47325f2d27
|
|
--- /dev/null
|
|
+++ b/include/linux/buddy.h
|
|
@@ -0,0 +1,217 @@
|
|
+// SPDX-License-Identifier: GPL-2.0-only
|
|
+/*
|
|
+ * Header file of ESWIN internal buddy allocator
|
|
+ *
|
|
+ * Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd.
|
|
+ * Authors:
|
|
+ * LinMin<linmin@eswincomputing.com>
|
|
+ *
|
|
+ */
|
|
+
|
|
+#ifndef __BUDDY_H__
|
|
+#define __BUDDY_H__
|
|
+
|
|
+#define RUN_IN_KERNEL 1
|
|
+
|
|
+#ifdef RUN_IN_KERNEL
|
|
+#include <linux/mm.h>
|
|
+#include <linux/mm_types.h>
|
|
+#include <linux/bug.h>
|
|
+#include <linux/list.h>
|
|
+#include <linux/string.h>
|
|
+#include <linux/spinlock.h>
|
|
+
|
|
+// #define buddy_print(fmt...) printk(fmt)
|
|
+#define buddy_print(fmt...)
|
|
+#define BUDDY_BUG_ON(condition) WARN_ON(condition)
|
|
+
|
|
+#define es_spin_lock_init(esLock) spin_lock_init(esLock)
|
|
+#define es_spin_lock(esLock) spin_lock(esLock)
|
|
+#define es_spin_unlock(esLock) spin_unlock(esLock)
|
|
+#define buddy_spin_lock_init(lock)
|
|
+#define buddy_spin_lock(lock)
|
|
+#define buddy_spin_unlock(lock)
|
|
+#else
|
|
+#include "list.h"
|
|
+#include <stdio.h> //printf
|
|
+#include <string.h> //memset
|
|
+#include <assert.h> //assert
|
|
+
|
|
+#define buddy_print(fmt...) printf(fmt)
|
|
+#define BUDDY_BUG_ON(condition) assert(condition)
|
|
+
|
|
+#define buddy_spin_lock_init(lock) do {}while(0)
|
|
+#define buddy_spin_lock(lock) do {}while(0)
|
|
+#define buddy_spin_unlock(lock) do {}while(0)
|
|
+
|
|
+#define es_spin_lock_init(esLock)
|
|
+#define es_spin_lock(esLock)
|
|
+#define es_spin_unlock(esLock)
|
|
+#endif
|
|
+
|
|
+enum esPageflags_e{
|
|
+ enPG_head,
|
|
+ enPG_tail,
|
|
+ enPG_buddy,
|
|
+};
|
|
+
|
|
+#define BUDDY_PAGE_SHIFT PAGE_SHIFT//(12UL)
|
|
+#define BUDDY_PAGE_SIZE (1UL << BUDDY_PAGE_SHIFT)
|
|
+#define BUDDY_MAX_ORDER MAX_ORDER // (10UL)//(9UL)
|
|
+
|
|
+struct esPage_s
|
|
+{
|
|
+ // spin_lock lock;
|
|
+ struct list_head lru;
|
|
+ unsigned long flags;
|
|
+ union {
|
|
+ unsigned long order;
|
|
+ struct esPage_s *first_page;
|
|
+ };
|
|
+};
|
|
+
|
|
+struct es_free_area_s
|
|
+{
|
|
+ struct list_head free_list;
|
|
+ unsigned long nr_free;
|
|
+};
|
|
+
|
|
+struct mem_zone
|
|
+{
|
|
+#ifdef RUN_IN_KERNEL
|
|
+ spinlock_t lock;
|
|
+#endif
|
|
+ unsigned long page_num;
|
|
+ unsigned long page_size;
|
|
+ struct esPage_s *first_page;
|
|
+ unsigned long start_addr;
|
|
+ unsigned long end_addr;
|
|
+ struct es_free_area_s free_area[BUDDY_MAX_ORDER];
|
|
+};
|
|
+
|
|
+#ifdef RUN_IN_KERNEL
|
|
+#define BLOCK_MAX_NAME 64
|
|
+struct mem_block {
|
|
+#ifdef RUN_IN_KERNEL
|
|
+ spinlock_t esLock;
|
|
+#endif
|
|
+ struct mem_zone zone;
|
|
+ unsigned long page_num;
|
|
+ struct esPage_s *esPagesStart;
|
|
+ struct page *kPageStart;
|
|
+ char name[BLOCK_MAX_NAME];
|
|
+};
|
|
+#else
|
|
+struct mem_block {
|
|
+ struct mem_zone zone;
|
|
+ struct esPage_s *pages;
|
|
+};
|
|
+#endif
|
|
+
|
|
+void buddy_system_init(struct mem_block *memblock,
|
|
+ struct esPage_s *start_page,
|
|
+ unsigned long start_addr,
|
|
+ unsigned long page_num);
|
|
+struct esPage_s *buddy_get_pages(struct mem_zone *zone,
|
|
+ unsigned long order);
|
|
+void buddy_free_pages(struct mem_zone *zone,
|
|
+ struct esPage_s *page);
|
|
+unsigned long buddy_num_free_page(struct mem_zone *zone);
|
|
+
|
|
+
|
|
+static inline void __esSetPageHead(struct esPage_s *page)
|
|
+{
|
|
+ page->flags |= (1UL<<enPG_head);
|
|
+}
|
|
+
|
|
+static inline void __SetPageTail(struct esPage_s *page)
|
|
+{
|
|
+ page->flags |= (1UL<<enPG_tail);
|
|
+}
|
|
+
|
|
+static inline void __esSetPageBuddy(struct esPage_s *page)
|
|
+{
|
|
+ page->flags |= (1UL<<enPG_buddy);
|
|
+}
|
|
+/**/
|
|
+static inline void __esClearPageHead(struct esPage_s *page)
|
|
+{
|
|
+ page->flags &= ~(1UL<<enPG_head);
|
|
+}
|
|
+
|
|
+static inline void __ClearPageTail(struct esPage_s *page)
|
|
+{
|
|
+ page->flags &= ~(1UL<<enPG_tail);
|
|
+}
|
|
+
|
|
+static inline void __esClearPageBuddy(struct esPage_s *page)
|
|
+{
|
|
+ page->flags &= ~(1UL<<enPG_buddy);
|
|
+}
|
|
+/**/
|
|
+static inline int esPageHead(struct esPage_s *page)
|
|
+{
|
|
+ return (page->flags & (1UL<<enPG_head));
|
|
+}
|
|
+
|
|
+static inline int esPageTail(struct esPage_s *page)
|
|
+{
|
|
+ return (page->flags & (1UL<<enPG_tail));
|
|
+}
|
|
+
|
|
+static inline int esPageBuddy(struct esPage_s *page)
|
|
+{
|
|
+ return (page->flags & (1UL<<enPG_buddy));
|
|
+}
|
|
+
|
|
+
|
|
+static inline void set_page_order_buddy(struct esPage_s *page, unsigned long order)
|
|
+{
|
|
+ page->order = order;
|
|
+ __esSetPageBuddy(page);
|
|
+}
|
|
+
|
|
+static inline void rmv_page_order_buddy(struct esPage_s *page)
|
|
+{
|
|
+ page->order = 0;
|
|
+ __esClearPageBuddy(page);
|
|
+}
|
|
+
|
|
+
|
|
+static inline unsigned long
|
|
+__find_buddy_index(unsigned long page_idx, unsigned int order)
|
|
+{
|
|
+ return (page_idx ^ (1 << order));
|
|
+}
|
|
+
|
|
+static inline unsigned long
|
|
+__find_combined_index(unsigned long page_idx, unsigned int order)
|
|
+{
|
|
+ return (page_idx & ~(1 << order));
|
|
+}
|
|
+
|
|
+
|
|
+static inline unsigned long esCompound_order(struct esPage_s *page)
|
|
+{
|
|
+ if (!esPageHead(page))
|
|
+ return 0;
|
|
+
|
|
+ return page->order;
|
|
+}
|
|
+
|
|
+static inline void esSet_compound_order(struct esPage_s *page, unsigned long order)
|
|
+{
|
|
+ page->order = order;
|
|
+}
|
|
+
|
|
+static inline void BUDDY_BUG(const char *f, int line)
|
|
+{
|
|
+ buddy_print("BUDDY_BUG in %s, %d.\n", f, line);
|
|
+ BUDDY_BUG_ON(1);
|
|
+}
|
|
+
|
|
+// print buddy system status
|
|
+void dump_print(struct mem_zone *zone);
|
|
+void dump_print_dot(struct mem_zone *zone);
|
|
+
|
|
+#endif
|
|
diff --git a/include/linux/dsp_dma_buf.h b/include/linux/dsp_dma_buf.h
|
|
new file mode 100644
|
|
index 000000000000..ab6962ad1ccf
|
|
--- /dev/null
|
|
+++ b/include/linux/dsp_dma_buf.h
|
|
@@ -0,0 +1,44 @@
|
|
+// Copyright © 2023 ESWIN. All rights reserved.
|
|
+//
|
|
+// Beijing ESWIN Computing Technology Co., Ltd and its affiliated companies ("ESWIN") retain
|
|
+// all intellectual property and proprietary rights in and to this software. Except as expressly
|
|
+// authorized by ESWIN, no part of the software may be released, copied, distributed, reproduced,
|
|
+// modified, adapted, translated, or created derivative work of, in whole or in part.
|
|
+
|
|
+#ifndef __DSP_DMA_BUF_H_
|
|
+#define __DSP_DMA_BUF_H_
|
|
+#include <linux/dma-buf.h>
|
|
+
|
|
+struct dev_buffer_desc {
|
|
+ struct dma_buf *buf;
|
|
+ u32 offset;
|
|
+ u32 len;
|
|
+};
|
|
+
|
|
+enum es_malloc_policy {
|
|
+ ES_MEM_ALLOC_RSV,
|
|
+ ES_MEM_ALLOC_NORMAL,
|
|
+ ES_MEM_ALLOC_NORMAL_COHERENT,
|
|
+ ES_MEM_ALLOC_CMA,
|
|
+ ES_MEM_ALLOC_CMA_COHERENT,
|
|
+ ES_MEM_ALLOC_CMA_LLC,
|
|
+ ES_MEM_ALLOC_SPRAM_DIE0,
|
|
+ ES_MEM_ALLOC_SPRAM_DIE1,
|
|
+};
|
|
+
|
|
+int dev_mem_alloc(size_t size, enum es_malloc_policy policy,
|
|
+ struct dma_buf **buf);
|
|
+int dev_mem_free(struct dma_buf *buf);
|
|
+
|
|
+int dev_mem_alloc_pool(size_t size, enum es_malloc_policy policy, char *mmb,
|
|
+ char *zone, struct dma_buf **buf);
|
|
+
|
|
+dma_addr_t dev_mem_attach(struct dma_buf *buf, struct device *dev,
|
|
+ enum dma_data_direction direc,
|
|
+ struct dma_buf_attachment **attachment);
|
|
+int dev_mem_detach(struct dma_buf_attachment *attach,
|
|
+ enum dma_data_direction direction);
|
|
+void *dev_mem_vmap(struct dev_buffer_desc *dev_buffer);
|
|
+void dev_mem_vunmap(struct dev_buffer_desc *dev_buf, void *vaddr);
|
|
+
|
|
+#endif
|
|
diff --git a/include/linux/eswin_memblock.h b/include/linux/eswin_memblock.h
|
|
new file mode 100644
|
|
index 000000000000..6c18444599de
|
|
--- /dev/null
|
|
+++ b/include/linux/eswin_memblock.h
|
|
@@ -0,0 +1,18 @@
|
|
+/* SPDX-License-Identifier: GPL-2.0 */
|
|
+#ifndef __ESWIN_RSVMEM_H__
|
|
+#define __ESWIN_RSVMEM_H__
|
|
+
|
|
+#include <linux/init.h>
|
|
+#include <linux/types.h>
|
|
+#include <linux/numa.h>
|
|
+#include "buddy.h"
|
|
+
|
|
+// #define QEMU_DEBUG 1
|
|
+
|
|
+#define MAX_ESWIN_RSVMEM_AREAS (64)
|
|
+
|
|
+struct mem_block *eswin_rsvmem_get_memblock(const char *memBlkName);
|
|
+int eswin_rsvmem_for_each_block(int (*it)(struct mem_block *rsvmem_block, void *data), void *data);
|
|
+const char *eswin_rsvmem_get_name(const struct mem_block *memblock);
|
|
+
|
|
+#endif
|
|
--
|
|
2.47.0
|
|
|