root/src/tests/add-ons/kernel/drivers/edu/edu.h
/*
 * Copyright 2004-2026, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Hamza Dridi, <dridiha@gmail.com>
 */

#ifndef EDU_H
#define EDU_H

#include <PCI.h>
#include <device_manager.h>

#include "IOScheduler.h"
#include "bus/PCI.h"
#include "dma_resources.h"

#define PCI_EDU_VENDOR_ID 0x1234
#define PCI_EDU_DEVICE_ID 0x11e8

#define EDU_LOW_ADDRESS 0x00
#define EDU_HIGH_ADDRESS 0x0fffffff

#define EDU_DMA_ADDR 0x40000
#define EDU_DMA_BUFFER_SIZE 4096
#define EDU_DISABLE_INTERRUPT 0x400
#define EDU_DMA_START 0x1
#define EDU_DMA_RAM_TO_EDU 0x0
#define EDU_DMA_EDU_TO_RAM 0x2
#define EDU_DMA_INTERRUPT 0x4
#define EDU_FACTORIAL_REG 0x08
#define EDU_STATUS_REG 0x20
#define EDU_INTERRUPT_STATUS_REG 0x24
#define EDU_INTERRUPT_ACK_REG 0x64
#define EDU_DMA_SRC_REG 0x80
#define EDU_DMA_DST_REG 0x88
#define EDU_DMA_COUNT_REG 0x90
#define EDU_DMA_CMD_REG 0x98

#define EDU_FACTORIAL_INTERRUPT 0x80

#define EDU_IOCTL_IDENT 0x00
#define EDU_IOCTL_LIVENESS 0x01
#define EDU_IOCTL_FACTORIAL 0x02

typedef struct edu_driver_data {
        pci_info* pci_device_info;
        device_node* node;
        pci_device_module_info* pci;
        pci_device* pci_dev;
} edu_driver_data;

class EduDeviceData {
public:
                                EduDeviceData(pci_device_module_info* pci, pci_info* pci_info,
                                    pci_device* pci_dev);

                                ~EduDeviceData();

            status_t            Init();
            void                EduWriteRegister(uint8 offset, uint32 value);
            uint32              EduReadRegister(uint8 offset);
            uint32              EduComputeFactorial(uint32 value);
                        void                            EduDoDma(phys_addr_t physaddr, uint32 length, off_t offset,
                                    bool isWrite);

            IOScheduler*        Scheduler() const { return fScheduler; };
            sem_id              Notify() const { return fNotify; };

private:

            area_id             fRegisterArea;
            uint8*              fRegisters;
            sem_id              fNotify;
            DMAResource*        fDMAResource;
            IOScheduler*        fScheduler;
            uchar               fIRQ;

            pci_device_module_info* fPci;
            struct pci_info*    fPciInfo;
            pci_device*         fPciDev;
};

#endif // !EDU_H