blob: 5b4a6a89824c44c2cf4d8908049fa715235eda85 [file] [log] [blame]
Mark Kettenis67748ee2021-10-23 16:58:02 +02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2021 Mark Kettenis <kettenis@openbsd.org>
4 */
5
Mark Kettenis67748ee2021-10-23 16:58:02 +02006#include <dm.h>
Mark Kettenis15518962023-01-21 20:27:53 +01007#include <iommu.h>
8#include <lmb.h>
9#include <asm/io.h>
10#include <linux/sizes.h>
11
12#define IOMMU_PAGE_SIZE SZ_4K
13
Mark Kettenis15518962023-01-21 20:27:53 +010014static dma_addr_t sandbox_iommu_map(struct udevice *dev, void *addr,
15 size_t size)
16{
Mark Kettenis15518962023-01-21 20:27:53 +010017 phys_addr_t paddr, dva;
18 phys_size_t psize, off;
19
20 paddr = ALIGN_DOWN(virt_to_phys(addr), IOMMU_PAGE_SIZE);
21 off = virt_to_phys(addr) - paddr;
22 psize = ALIGN(size + off, IOMMU_PAGE_SIZE);
23
Sughosh Ganu291bf9c2024-08-26 17:29:18 +053024 dva = lmb_alloc(psize, IOMMU_PAGE_SIZE);
Mark Kettenis15518962023-01-21 20:27:53 +010025
26 return dva + off;
27}
28
29static void sandbox_iommu_unmap(struct udevice *dev, dma_addr_t addr,
30 size_t size)
31{
Mark Kettenis15518962023-01-21 20:27:53 +010032 phys_addr_t dva;
33 phys_size_t psize;
34
35 dva = ALIGN_DOWN(addr, IOMMU_PAGE_SIZE);
36 psize = size + (addr - dva);
37 psize = ALIGN(psize, IOMMU_PAGE_SIZE);
38
Sughosh Ganu291bf9c2024-08-26 17:29:18 +053039 lmb_free(dva, psize);
Mark Kettenis15518962023-01-21 20:27:53 +010040}
41
42static struct iommu_ops sandbox_iommu_ops = {
43 .map = sandbox_iommu_map,
44 .unmap = sandbox_iommu_unmap,
45};
46
47static int sandbox_iommu_probe(struct udevice *dev)
48{
Sughosh Ganu291bf9c2024-08-26 17:29:18 +053049 lmb_add(0x89abc000, SZ_16K);
Mark Kettenis15518962023-01-21 20:27:53 +010050
51 return 0;
52}
Mark Kettenis67748ee2021-10-23 16:58:02 +020053
54static const struct udevice_id sandbox_iommu_ids[] = {
55 { .compatible = "sandbox,iommu" },
56 { /* sentinel */ }
57};
58
59U_BOOT_DRIVER(sandbox_iommu) = {
60 .name = "sandbox_iommu",
61 .id = UCLASS_IOMMU,
62 .of_match = sandbox_iommu_ids,
Mark Kettenis15518962023-01-21 20:27:53 +010063 .ops = &sandbox_iommu_ops,
64 .probe = sandbox_iommu_probe,
Mark Kettenis67748ee2021-10-23 16:58:02 +020065};