Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/loongson/common/cs5536/cs5536_pci.c
10820 views
1
/*
2
* read/write operation to the PCI config space of CS5536
3
*
4
* Copyright (C) 2007 Lemote, Inc.
5
* Author : jlliu, [email protected]
6
*
7
* Copyright (C) 2009 Lemote, Inc.
8
* Author: Wu Zhangjin, [email protected]
9
*
10
* This program is free software; you can redistribute it and/or modify it
11
* under the terms of the GNU General Public License as published by the
12
* Free Software Foundation; either version 2 of the License, or (at your
13
* option) any later version.
14
*
15
* the Virtual Support Module(VSM) for virtulizing the PCI
16
* configure space are defined in cs5536_modulename.c respectively,
17
*
18
* after this virtulizing, user can access the PCI configure space
19
* directly as a normal multi-function PCI device which follows
20
* the PCI-2.2 spec.
21
*/
22
23
#include <linux/types.h>
24
#include <cs5536/cs5536_vsm.h>
25
26
enum {
27
CS5536_FUNC_START = -1,
28
CS5536_ISA_FUNC,
29
reserved_func,
30
CS5536_IDE_FUNC,
31
CS5536_ACC_FUNC,
32
CS5536_OHCI_FUNC,
33
CS5536_EHCI_FUNC,
34
CS5536_FUNC_END,
35
};
36
37
static const cs5536_pci_vsm_write vsm_conf_write[] = {
38
[CS5536_ISA_FUNC] pci_isa_write_reg,
39
[reserved_func] NULL,
40
[CS5536_IDE_FUNC] pci_ide_write_reg,
41
[CS5536_ACC_FUNC] pci_acc_write_reg,
42
[CS5536_OHCI_FUNC] pci_ohci_write_reg,
43
[CS5536_EHCI_FUNC] pci_ehci_write_reg,
44
};
45
46
static const cs5536_pci_vsm_read vsm_conf_read[] = {
47
[CS5536_ISA_FUNC] pci_isa_read_reg,
48
[reserved_func] NULL,
49
[CS5536_IDE_FUNC] pci_ide_read_reg,
50
[CS5536_ACC_FUNC] pci_acc_read_reg,
51
[CS5536_OHCI_FUNC] pci_ohci_read_reg,
52
[CS5536_EHCI_FUNC] pci_ehci_read_reg,
53
};
54
55
/*
56
* write to PCI config space and transfer it to MSR write.
57
*/
58
void cs5536_pci_conf_write4(int function, int reg, u32 value)
59
{
60
if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
61
return;
62
if ((reg < 0) || (reg > 0x100) || ((reg & 0x03) != 0))
63
return;
64
65
if (vsm_conf_write[function] != NULL)
66
vsm_conf_write[function](reg, value);
67
}
68
69
/*
70
* read PCI config space and transfer it to MSR access.
71
*/
72
u32 cs5536_pci_conf_read4(int function, int reg)
73
{
74
u32 data = 0;
75
76
if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
77
return 0;
78
if ((reg < 0) || ((reg & 0x03) != 0))
79
return 0;
80
if (reg > 0x100)
81
return 0xffffffff;
82
83
if (vsm_conf_read[function] != NULL)
84
data = vsm_conf_read[function](reg);
85
86
return data;
87
}
88
89