^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) AudioScience HPI driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) Copyright (C) 1997-2012 AudioScience Inc. <support@audioscience.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) HPI Operating System function implementation for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) (C) Copyright AudioScience Inc. 1997-2003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define SOURCEFILE_NAME "hpios.c"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "hpi_internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "hpidebug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) void hpios_delay_micro_seconds(u32 num_micro_sec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) if ((usecs_to_jiffies(num_micro_sec) > 1) && !in_interrupt()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) /* MUST NOT SCHEDULE IN INTERRUPT CONTEXT! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) schedule_timeout_uninterruptible(usecs_to_jiffies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) (num_micro_sec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) } else if (num_micro_sec <= 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) udelay(num_micro_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) mdelay(num_micro_sec / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /** Allocate an area of locked memory for bus master DMA operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) If allocation fails, return 1, and *pMemArea.size = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /*?? any benefit in using managed dmam_alloc_coherent? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) p_mem_area->vaddr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) dma_alloc_coherent(&pdev->dev, size, &p_mem_area->dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if (p_mem_area->vaddr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) HPI_DEBUG_LOG(DEBUG, "allocated %d bytes, dma 0x%x vma %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) size, (unsigned int)p_mem_area->dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) p_mem_area->vaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) p_mem_area->pdev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) p_mem_area->size = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) HPI_DEBUG_LOG(WARNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) "failed to allocate %d bytes locked memory\n", size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) p_mem_area->size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u16 hpios_locked_mem_free(struct consistent_dma_area *p_mem_area)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (p_mem_area->size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) dma_free_coherent(p_mem_area->pdev, p_mem_area->size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) p_mem_area->vaddr, p_mem_area->dma_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) HPI_DEBUG_LOG(DEBUG, "freed %lu bytes, dma 0x%x vma %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) (unsigned long)p_mem_area->size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) (unsigned int)p_mem_area->dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) p_mem_area->vaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) p_mem_area->size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }