OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [pci/] [hotplug/] [pciehp.h] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * PCI Express Hot Plug Controller Driver
3
 *
4
 * Copyright (C) 1995,2001 Compaq Computer Corporation
5
 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
6
 * Copyright (C) 2001 IBM Corp.
7
 * Copyright (C) 2003-2004 Intel Corporation
8
 *
9
 * All rights reserved.
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or (at
14
 * your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful, but
17
 * WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
19
 * NON INFRINGEMENT.  See the GNU General Public License for more
20
 * details.
21
 *
22
 * You should have received a copy of the GNU General Public License
23
 * along with this program; if not, write to the Free Software
24
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25
 *
26
 * Send feedback to <greg@kroah.com>, <kristen.c.accardi@intel.com>
27
 *
28
 */
29
#ifndef _PCIEHP_H
30
#define _PCIEHP_H
31
 
32
#include <linux/types.h>
33
#include <linux/pci.h>
34
#include <linux/pci_hotplug.h>
35
#include <linux/delay.h>
36
#include <linux/sched.h>                /* signal_pending() */
37
#include <linux/pcieport_if.h>
38
#include <linux/mutex.h>
39
 
40
#define MY_NAME "pciehp"
41
 
42
extern int pciehp_poll_mode;
43
extern int pciehp_poll_time;
44
extern int pciehp_debug;
45
extern int pciehp_force;
46
extern struct workqueue_struct *pciehp_wq;
47
 
48
#define dbg(format, arg...)                                             \
49
        do {                                                            \
50
                if (pciehp_debug)                                       \
51
                        printk("%s: " format, MY_NAME , ## arg);        \
52
        } while (0)
53
#define err(format, arg...)                                             \
54
        printk(KERN_ERR "%s: " format, MY_NAME , ## arg)
55
#define info(format, arg...)                                            \
56
        printk(KERN_INFO "%s: " format, MY_NAME , ## arg)
57
#define warn(format, arg...)                                            \
58
        printk(KERN_WARNING "%s: " format, MY_NAME , ## arg)
59
 
60
#define SLOT_NAME_SIZE 10
61
struct slot {
62
        u8 bus;
63
        u8 device;
64
        u32 number;
65
        u8 state;
66
        struct timer_list task_event;
67
        u8 hp_slot;
68
        struct controller *ctrl;
69
        struct hpc_ops *hpc_ops;
70
        struct hotplug_slot *hotplug_slot;
71
        struct list_head        slot_list;
72
        char name[SLOT_NAME_SIZE];
73
        unsigned long last_emi_toggle;
74
        struct delayed_work work;       /* work for button event */
75
        struct mutex lock;
76
};
77
 
78
struct event_info {
79
        u32 event_type;
80
        struct slot *p_slot;
81
        struct work_struct work;
82
};
83
 
84
struct controller {
85
        struct controller *next;
86
        struct mutex crit_sect;         /* critical section mutex */
87
        struct mutex ctrl_lock;         /* controller lock */
88
        int num_slots;                  /* Number of slots on ctlr */
89
        int slot_num_inc;               /* 1 or -1 */
90
        struct pci_dev *pci_dev;
91
        struct list_head slot_list;
92
        struct slot *slot;
93
        struct hpc_ops *hpc_ops;
94
        wait_queue_head_t queue;        /* sleep & wake process */
95
        u8 bus;
96
        u8 device;
97
        u8 function;
98
        u8 slot_device_offset;
99
        u32 first_slot;         /* First physical slot number */  /* PCIE only has 1 slot */
100
        u8 slot_bus;            /* Bus where the slots handled by this controller sit */
101
        u8 ctrlcap;
102
        u16 vendor_id;
103
        u8 cap_base;
104
        struct timer_list poll_timer;
105
        volatile int cmd_busy;
106
        spinlock_t lock;
107
};
108
 
109
#define INT_BUTTON_IGNORE               0
110
#define INT_PRESENCE_ON                 1
111
#define INT_PRESENCE_OFF                2
112
#define INT_SWITCH_CLOSE                3
113
#define INT_SWITCH_OPEN                 4
114
#define INT_POWER_FAULT                 5
115
#define INT_POWER_FAULT_CLEAR           6
116
#define INT_BUTTON_PRESS                7
117
#define INT_BUTTON_RELEASE              8
118
#define INT_BUTTON_CANCEL               9
119
 
120
#define STATIC_STATE                    0
121
#define BLINKINGON_STATE                1
122
#define BLINKINGOFF_STATE               2
123
#define POWERON_STATE                   3
124
#define POWEROFF_STATE                  4
125
 
126
/* Error messages */
127
#define INTERLOCK_OPEN                  0x00000002
128
#define ADD_NOT_SUPPORTED               0x00000003
129
#define CARD_FUNCTIONING                0x00000005
130
#define ADAPTER_NOT_SAME                0x00000006
131
#define NO_ADAPTER_PRESENT              0x00000009
132
#define NOT_ENOUGH_RESOURCES            0x0000000B
133
#define DEVICE_TYPE_NOT_SUPPORTED       0x0000000C
134
#define WRONG_BUS_FREQUENCY             0x0000000D
135
#define POWER_FAILURE                   0x0000000E
136
 
137
/* Field definitions in Slot Capabilities Register */
138
#define ATTN_BUTTN_PRSN 0x00000001
139
#define PWR_CTRL_PRSN   0x00000002
140
#define MRL_SENS_PRSN   0x00000004
141
#define ATTN_LED_PRSN   0x00000008
142
#define PWR_LED_PRSN    0x00000010
143
#define HP_SUPR_RM_SUP  0x00000020
144
#define EMI_PRSN        0x00020000
145
 
146
#define ATTN_BUTTN(cap)         (cap & ATTN_BUTTN_PRSN)
147
#define POWER_CTRL(cap)         (cap & PWR_CTRL_PRSN)
148
#define MRL_SENS(cap)           (cap & MRL_SENS_PRSN)
149
#define ATTN_LED(cap)           (cap & ATTN_LED_PRSN)
150
#define PWR_LED(cap)            (cap & PWR_LED_PRSN) 
151
#define HP_SUPR_RM(cap)         (cap & HP_SUPR_RM_SUP)
152
#define EMI(cap)                (cap & EMI_PRSN)
153
 
154
extern int pciehp_sysfs_enable_slot(struct slot *slot);
155
extern int pciehp_sysfs_disable_slot(struct slot *slot);
156
extern u8 pciehp_handle_attention_button(u8 hp_slot, struct controller *ctrl);
157
extern u8 pciehp_handle_switch_change(u8 hp_slot, struct controller *ctrl);
158
extern u8 pciehp_handle_presence_change(u8 hp_slot, struct controller *ctrl);
159
extern u8 pciehp_handle_power_fault(u8 hp_slot, struct controller *ctrl);
160
extern int pciehp_configure_device(struct slot *p_slot);
161
extern int pciehp_unconfigure_device(struct slot *p_slot);
162
extern void pciehp_queue_pushbutton_work(struct work_struct *work);
163
int pcie_init(struct controller *ctrl, struct pcie_device *dev);
164
 
165
static inline struct slot *pciehp_find_slot(struct controller *ctrl, u8 device)
166
{
167
        struct slot *slot;
168
 
169
        list_for_each_entry(slot, &ctrl->slot_list, slot_list) {
170
                if (slot->device == device)
171
                        return slot;
172
        }
173
 
174
        err("%s: slot (device=0x%x) not found\n", __FUNCTION__, device);
175
        return NULL;
176
}
177
 
178
struct hpc_ops {
179
        int (*power_on_slot)(struct slot *slot);
180
        int (*power_off_slot)(struct slot *slot);
181
        int (*get_power_status)(struct slot *slot, u8 *status);
182
        int (*get_attention_status)(struct slot *slot, u8 *status);
183
        int (*set_attention_status)(struct slot *slot, u8 status);
184
        int (*get_latch_status)(struct slot *slot, u8 *status);
185
        int (*get_adapter_status)(struct slot *slot, u8 *status);
186
        int (*get_emi_status)(struct slot *slot, u8 *status);
187
        int (*toggle_emi)(struct slot *slot);
188
        int (*get_max_bus_speed)(struct slot *slot, enum pci_bus_speed *speed);
189
        int (*get_cur_bus_speed)(struct slot *slot, enum pci_bus_speed *speed);
190
        int (*get_max_lnk_width)(struct slot *slot, enum pcie_link_width *val);
191
        int (*get_cur_lnk_width)(struct slot *slot, enum pcie_link_width *val);
192
        int (*query_power_fault)(struct slot *slot);
193
        void (*green_led_on)(struct slot *slot);
194
        void (*green_led_off)(struct slot *slot);
195
        void (*green_led_blink)(struct slot *slot);
196
        void (*release_ctlr)(struct controller *ctrl);
197
        int (*check_lnk_status)(struct controller *ctrl);
198
};
199
 
200
#ifdef CONFIG_ACPI
201
#include <acpi/acpi.h>
202
#include <acpi/acpi_bus.h>
203
#include <acpi/actypes.h>
204
#include <linux/pci-acpi.h>
205
 
206
#define pciehp_get_hp_hw_control_from_firmware(dev)                     \
207
        pciehp_acpi_get_hp_hw_control_from_firmware(dev)
208
static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev,
209
                        struct hotplug_params *hpp)
210
{
211
        if (ACPI_FAILURE(acpi_get_hp_params_from_firmware(dev->bus, hpp)))
212
                return -ENODEV;
213
        return 0;
214
}
215
#else
216
#define pciehp_get_hp_hw_control_from_firmware(dev)     0
217
#define pciehp_get_hp_params_from_firmware(dev, hpp)    (-ENODEV)
218
#endif                          /* CONFIG_ACPI */
219
#endif                          /* _PCIEHP_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.