// 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 = ();
    const ID_TABLE: pci::IdTable<Self::IdInfo> = &PCI_TABLE;

    fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, Error> {
        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, [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) -> Result {
        for (i, value) in TEST_VALUES.into_iter().enumerate() {
            let val0 = kernel::dma_read!(self.ca, [i]?.h);
            let val1 = kernel::dma_read!(self.ca, [i]?.b);

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

        Ok(())
    }
}

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

        assert!(self.check_dma().is_ok());

        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",
}
