// SPDX-License-Identifier: GPL-2.0

//! Rust DMA api test (based on QEMU's `pci-testdev`).
//!
//! To make this driver probe, QEMU must be run with `-device pci-testdev`.

use kernel::{
    device::Core,
    dma::{
        Coherent,
        DataDirection,
        Device,
        DmaMask, //
    },
    page, pci,
    prelude::*,
    scatterlist::{Owned, SGTable},
    sync::aref::ARef,
};

#[pin_data(PinnedDrop)]
struct DmaSampleDriver {
    pdev: ARef<pci::Device>,
    ca: Coherent<[MyStruct]>,
    #[pin]
    sgt: SGTable<Owned<VVec<u8>>>,
}

const TEST_VALUES: [(u32, u32); 5] = [
    (0xa, 0xb),
    (0xc, 0xd),
    (0xe, 0xf),
    (0xab, 0xba),
    (0xcd, 0xef),
];

struct MyStruct {
    h: u32,
    b: u32,
}

impl MyStruct {
    fn new(h: u32, b: u32) -> Self {
        Self { h, b }
    }
}
// SAFETY: All bit patterns are acceptable values for `MyStruct`.
unsafe impl kernel::transmute::AsBytes for MyStruct {}
// SAFETY: Instances of `MyStruct` have no uninitialized portions.
unsafe impl kernel::transmute::FromBytes for MyStruct {}

kernel::pci_device_table!(
    PCI_TABLE,
    MODULE_PCI_TABLE,
    <DmaSampleDriver as pci::Driver>::IdInfo,
    [(pci::DeviceId::from_id(pci::Vendor::REDHAT, 0x5), ())]
);

impl pci::Driver for DmaSampleDriver {
    type IdInfo = ();
    type Data<'bound> = Self;
    const ID_TABLE: pci::IdTable<Self::IdInfo> = &PCI_TABLE;

    fn probe<'bound>(
        pdev: &'bound pci::Device<Core<'_>>,
        _info: &'bound Self::IdInfo,
    ) -> impl PinInit<Self, Error> + 'bound {
        pin_init::pin_init_scope(move || {
            dev_info!(pdev, "Probe DMA test driver.\n");

            let mask = DmaMask::new::<64>();

            // SAFETY: There are no concurrent calls to DMA allocation and mapping primitives.
            unsafe { pdev.dma_set_mask_and_coherent(mask)? };

            let ca: Coherent<[MyStruct]> =
                Coherent::zeroed_slice(pdev.as_ref(), TEST_VALUES.len(), GFP_KERNEL)?;

            for (i, value) in TEST_VALUES.into_iter().enumerate() {
                kernel::dma_write!(ca, [try: i], MyStruct::new(value.0, value.1));
            }

            let size = 4 * page::PAGE_SIZE;
            let pages = VVec::with_capacity(size, GFP_KERNEL)?;

            let sgt = SGTable::new(pdev.as_ref(), pages, DataDirection::ToDevice, GFP_KERNEL);

            Ok(try_pin_init!(Self {
                pdev: pdev.into(),
                ca,
                sgt <- sgt,
            }))
        })
    }
}

impl DmaSampleDriver {
    fn check_dma(&self) {
        for (i, value) in TEST_VALUES.into_iter().enumerate() {
            let val0 = kernel::dma_read!(self.ca, [panic: i].h);
            let val1 = kernel::dma_read!(self.ca, [panic: i].b);

            assert_eq!(val0, value.0);
            assert_eq!(val1, value.1);
        }
    }
}

#[pinned_drop]
impl PinnedDrop for DmaSampleDriver {
    fn drop(self: Pin<&mut Self>) {
        dev_info!(self.pdev, "Unload DMA test driver.\n");

        self.check_dma();

        for (i, entry) in self.sgt.iter().enumerate() {
            dev_info!(
                self.pdev,
                "Entry[{}]: DMA address: {:#x}",
                i,
                entry.dma_address(),
            );
        }
    }
}

kernel::module_pci_driver! {
    type: DmaSampleDriver,
    name: "rust_dma",
    authors: ["Abdiel Janulgue"],
    description: "Rust DMA test",
    license: "GPL v2",
}
