162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * @File    ctvmem.h
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * @Brief
862306a36Sopenharmony_ci * This file contains the definition of virtual memory management object
962306a36Sopenharmony_ci * for card device.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * @Author Liu Chun
1262306a36Sopenharmony_ci * @Date Mar 28 2008
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifndef CTVMEM_H
1662306a36Sopenharmony_ci#define CTVMEM_H
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define CT_PTP_NUM	4	/* num of device page table pages */
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <linux/mutex.h>
2162306a36Sopenharmony_ci#include <linux/list.h>
2262306a36Sopenharmony_ci#include <linux/pci.h>
2362306a36Sopenharmony_ci#include <sound/memalloc.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* The chip can handle the page table of 4k pages
2662306a36Sopenharmony_ci * (emu20k1 can handle even 8k pages, but we don't use it right now)
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_ci#define CT_PAGE_SIZE	4096
2962306a36Sopenharmony_ci#define CT_PAGE_SHIFT	12
3062306a36Sopenharmony_ci#define CT_PAGE_MASK	(~(PAGE_SIZE - 1))
3162306a36Sopenharmony_ci#define CT_PAGE_ALIGN(addr)	ALIGN(addr, CT_PAGE_SIZE)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistruct ct_vm_block {
3462306a36Sopenharmony_ci	unsigned int addr;	/* starting logical addr of this block */
3562306a36Sopenharmony_ci	unsigned int size;	/* size of this device virtual mem block */
3662306a36Sopenharmony_ci	struct list_head list;
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct snd_pcm_substream;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/* Virtual memory management object for card device */
4262306a36Sopenharmony_cistruct ct_vm {
4362306a36Sopenharmony_ci	struct snd_dma_buffer ptp[CT_PTP_NUM];	/* Device page table pages */
4462306a36Sopenharmony_ci	unsigned int size;		/* Available addr space in bytes */
4562306a36Sopenharmony_ci	struct list_head unused;	/* List of unused blocks */
4662306a36Sopenharmony_ci	struct list_head used;		/* List of used blocks */
4762306a36Sopenharmony_ci	struct mutex lock;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	/* Map host addr (kmalloced/vmalloced) to device logical addr. */
5062306a36Sopenharmony_ci	struct ct_vm_block *(*map)(struct ct_vm *, struct snd_pcm_substream *,
5162306a36Sopenharmony_ci				   int size);
5262306a36Sopenharmony_ci	/* Unmap device logical addr area. */
5362306a36Sopenharmony_ci	void (*unmap)(struct ct_vm *, struct ct_vm_block *block);
5462306a36Sopenharmony_ci	dma_addr_t (*get_ptp_phys)(struct ct_vm *vm, int index);
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciint ct_vm_create(struct ct_vm **rvm, struct pci_dev *pci);
5862306a36Sopenharmony_civoid ct_vm_destroy(struct ct_vm *vm);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#endif /* CTVMEM_H */
61