Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2024
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.33 KB | None | 0 0
  1. int nvme_init(char * rsdp)
  2. {
  3.     ...
  4.  
  5.     /* get and store ECAM base address and starting and ending pcie bus number */
  6.     pcie_ecam = (uint64_t *) *(mcfg + 44);
  7.     start_bus_num = (uint8_t) *((char *) mcfg + 44 + 10);
  8.     end_bus_num = (uint8_t) *((char *) mcfg + 44 + 11);
  9.  
  10.     /* enumerate pcie bus */
  11.     printk("@@@debug\n");
  12.     check_all_buses(start_bus_num, end_bus_num);
  13.     printk("@@@debug\n");
  14.  
  15.     return 0;
  16. }
  17.  
  18. uint64_t get_vendor_id(uint8_t bus, uint8_t start, uint8_t device, uint8_t function)
  19. {
  20.     uint64_t *phy_addr;
  21.  
  22.     phy_addr = pcie_ecam + ((bus - start) << 20 | device << 15 | function << 12);
  23.  
  24.     return *phy_addr; /* hangs here */
  25. }
  26.  
  27. void check_device(uint8_t bus, uint8_t start, uint8_t device)
  28. {
  29.     uint8_t function = 0;
  30.     uint16_t vendor_id;
  31.  
  32.     vendor_id = (uint16_t) get_vendor_id(bus, start, device, function);
  33.     printk("@@@vendor_id={d}\n", (int) vendor_id);
  34.     if (vendor_id == 0xFFFF)    /* device doesn't exist */
  35.         return;
  36.  
  37.     printk("device #{d} exists!\n", (int) device);
  38.  
  39.     /* TODO: check for class and subclass */
  40. }
  41.  
  42. void check_all_buses(uint8_t start, uint8_t end)
  43. {
  44.      uint8_t bus;
  45.      uint8_t device;
  46.  
  47.      if(end == -1)
  48.          end = start;
  49.  
  50.      for (bus = start; bus <= end; bus++) {
  51.          for (device = 0; device < 32; device++) {
  52.              check_device(bus, start, device);
  53.          }
  54.      }
  55. }
  56.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement