1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <types.h>
21#include <console.h>
22#include <device/pci.h>
23#include <device/pci_ids.h>
24#include <statictree.h>
25#include <config.h>
26#include "vt8237.h"
27
28
29
30
31
32
33void vt8237_enable(struct device *dev)
34{
35 struct device *lpc_dev;
36 u16 sb_fn_ctrl;
37
38 const u8 func = dev->path.pci.devfn & 0x7;
39 const u8 device = dev->path.pci.devfn >> 3;
40 const int d16_index[6] = {12, 13, 10, 8, 9, 7};
41
42
43 printk(BIOS_DEBUG, "Enabling/Disabling device 0x%x function 0x%x.\n",
44 device, func);
45
46 if(dev->id.pci.vendor != PCI_VENDOR_ID_VIA)
47 return;
48
49 lpc_dev = dev_find_slot(0, PCI_BDF(0, 17, 0));
50 sb_fn_ctrl = pci_read_config8(lpc_dev, 0x50) << 8;
51 sb_fn_ctrl |= pci_read_config8(lpc_dev, 0x51);
52
53 if (device == 16)
54 {
55
56 if (dev->enabled)
57 {
58 sb_fn_ctrl &= ~(1 << d16_index[0]);
59 sb_fn_ctrl &= ~(1 << d16_index[func]);
60 }
61 else
62 {
63 sb_fn_ctrl |= (1 << d16_index[func]);
64 }
65 }
66 else if (device == 17)
67 {
68 if (func == 5)
69 {
70 sb_fn_ctrl &= ~(dev->enabled << 14);
71 sb_fn_ctrl |= (!dev->enabled << 14);
72 }
73 else if (func == 6)
74 {
75 sb_fn_ctrl &= ~(dev->enabled << 15);
76 sb_fn_ctrl |= (!dev->enabled << 15);
77 }
78 }
79
80 pci_write_config8(dev, 0x50, (sb_fn_ctrl >> 8) & 0xff);
81 pci_write_config8(dev, 0x51, sb_fn_ctrl & 0xff);
82
83
84}
85