git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: shell and signal demo as loadable user executable
[lunaix-os.git]
/
lunaix-os
/
includes
/
hal
/
pci.h
diff --git
a/lunaix-os/includes/hal/pci.h
b/lunaix-os/includes/hal/pci.h
index b31352b3428bec4653cd6e89f0d79a5c07f9d242..56ca3df8810bbdd37425dcf92cdda46167c1099b 100644
(file)
--- a/
lunaix-os/includes/hal/pci.h
+++ b/
lunaix-os/includes/hal/pci.h
@@
-3,6
+3,7
@@
#include <hal/io.h>
#include <lunaix/ds/llist.h>
#include <hal/io.h>
#include <lunaix/ds/llist.h>
+#include <lunaix/types.h>
#define PCI_CONFIG_ADDR 0xcf8
#define PCI_CONFIG_DATA 0xcfc
#define PCI_CONFIG_ADDR 0xcf8
#define PCI_CONFIG_DATA 0xcfc
@@
-34,7
+35,12
@@
#define PCI_BAR_ADDR_IO(x) ((x) & ~0x3)
#define PCI_MSI_ADDR(msi_base) ((msi_base) + 4)
#define PCI_BAR_ADDR_IO(x) ((x) & ~0x3)
#define PCI_MSI_ADDR(msi_base) ((msi_base) + 4)
-#define PCI_MSI_DATA(msi_base) ((msi_base) + 8)
+#define PCI_MSI_DATA(msi_base, offset) ((msi_base) + 8 + offset)
+#define PCI_MSI_MASK(msi_base, offset) ((msi_base) + 0xc + offset)
+
+#define MSI_CAP_64BIT 0x80
+#define MSI_CAP_MASK 0x100
+#define MSI_CAP_ENABLE 0x1
#define PCI_RCMD_DISABLE_INTR (1 << 10)
#define PCI_RCMD_FAST_B2B (1 << 9)
#define PCI_RCMD_DISABLE_INTR (1 << 10)
#define PCI_RCMD_FAST_B2B (1 << 9)
@@
-51,28
+57,58
@@
typedef unsigned int pci_reg_t;
// PCI device header format
// Ref: "PCI Local Bus Specification, Rev.3, Section 6.1"
// PCI device header format
// Ref: "PCI Local Bus Specification, Rev.3, Section 6.1"
+#define BAR_TYPE_MMIO 0x1
+#define BAR_TYPE_CACHABLE 0x2
+#define PCI_DRV_NAME_LEN 32
+
+struct pci_driver;
+
+struct pci_base_addr
+{
+ u32_t start;
+ u32_t size;
+ u32_t type;
+};
+
struct pci_device
{
struct llist_header dev_chain;
struct pci_device
{
struct llist_header dev_chain;
- u
int
32_t device_info;
- u
int
32_t class_info;
- u
int
32_t cspace_base;
- u
int
32_t msi_loc;
+ u32_t device_info;
+ u32_t class_info;
+ u32_t cspace_base;
+ u32_t msi_loc;
uint16_t intr_info;
uint16_t intr_info;
+ struct
+ {
+ struct pci_driver* type;
+ void* instance;
+ } driver;
+ struct pci_base_addr bar[6];
+};
+
+typedef void* (*pci_drv_init)(struct pci_device*);
+
+struct pci_driver
+{
+ struct llist_header drivers;
+ u32_t dev_info;
+ u32_t dev_class;
+ pci_drv_init create_driver;
+ char name[PCI_DRV_NAME_LEN];
};
// PCI Configuration Space (C-Space) r/w:
// Refer to "PCI Local Bus Specification, Rev.3, Section 3.2.2.3.2"
};
// PCI Configuration Space (C-Space) r/w:
// Refer to "PCI Local Bus Specification, Rev.3, Section 3.2.2.3.2"
-inline pci_reg_t
-pci_read_cspace(u
int
32_t base, int offset)
+
static
inline pci_reg_t
+pci_read_cspace(u32_t base, int offset)
{
io_outl(PCI_CONFIG_ADDR, base | (offset & ~0x3));
return io_inl(PCI_CONFIG_DATA);
}
{
io_outl(PCI_CONFIG_ADDR, base | (offset & ~0x3));
return io_inl(PCI_CONFIG_DATA);
}
-inline void
-pci_write_cspace(u
int
32_t base, int offset, pci_reg_t data)
+
static
inline void
+pci_write_cspace(u32_t base, int offset, pci_reg_t data)
{
io_outl(PCI_CONFIG_ADDR, base | (offset & ~0x3));
io_outl(PCI_CONFIG_DATA, data);
{
io_outl(PCI_CONFIG_ADDR, base | (offset & ~0x3));
io_outl(PCI_CONFIG_DATA, data);
@@
-86,16
+122,13
@@
pci_write_cspace(uint32_t base, int offset, pci_reg_t data)
void
pci_init();
void
pci_init();
-void
-pci_print_device();
-
/**
* @brief 根据类型代码(Class Code)去在拓扑中寻找一个设备
* 类型代码请参阅: PCI LB Spec. Appendix D.
*
* @return struct pci_device*
*/
/**
* @brief 根据类型代码(Class Code)去在拓扑中寻找一个设备
* 类型代码请参阅: PCI LB Spec. Appendix D.
*
* @return struct pci_device*
*/
-struct pci_device* pci_get_device_by_class(u
int
32_t class);
+struct pci_device* pci_get_device_by_class(u32_t class);
/**
* @brief 根据设备商ID和设备ID,在拓扑中寻找一个设备
/**
* @brief 根据设备商ID和设备ID,在拓扑中寻找一个设备
@@
-118,7
+151,7
@@
pci_get_device_by_id(uint16_t vendorId, uint16_t deviceId);
* @return size_t
*/
size_t
* @return size_t
*/
size_t
-pci_bar_sizing(struct pci_device* dev, u
int32_t* bar_out, uint
32_t bar_num);
+pci_bar_sizing(struct pci_device* dev, u
32_t* bar_out, u
32_t bar_num);
/**
* @brief 配置并启用设备MSI支持。
/**
* @brief 配置并启用设备MSI支持。
@@
-131,4
+164,14
@@
pci_bar_sizing(struct pci_device* dev, uint32_t* bar_out, uint32_t bar_num);
void
pci_setup_msi(struct pci_device* device, int vector);
void
pci_setup_msi(struct pci_device* device, int vector);
+void
+pci_add_driver(const char* name,
+ u32_t class,
+ u32_t vendor,
+ u32_t devid,
+ pci_drv_init init);
+
+int
+pci_bind_driver(struct pci_device* pci_dev);
+
#endif /* __LUNAIX_PCI_H */
#endif /* __LUNAIX_PCI_H */