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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * PCI Hot Plug Controller Driver for RPA-compliant PPC64 platform.
3
 * Copyright (C) 2003 Linda Xie <lxie@us.ibm.com>
4
 *
5
 * All rights reserved.
6
 *
7
 * This program is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 2 of the License, or (at
10
 * your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful, but
13
 * WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
15
 * NON INFRINGEMENT.  See the GNU General Public License for more
16
 * details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
 *
22
 * Send feedback to <lxie@us.ibm.com>
23
 *
24
 */
25
#include <linux/pci.h>
26
#include <linux/string.h>
27
 
28
#include <asm/pci-bridge.h>
29
#include <asm/rtas.h>
30
#include <asm/machdep.h>
31
 
32
#include "../pci.h"             /* for pci_add_new_bus */
33
#include "rpaphp.h"
34
 
35
int rpaphp_get_sensor_state(struct slot *slot, int *state)
36
{
37
        int rc;
38
        int setlevel;
39
 
40
        rc = rtas_get_sensor(DR_ENTITY_SENSE, slot->index, state);
41
 
42
        if (rc < 0) {
43
                if (rc == -EFAULT || rc == -EEXIST) {
44
                        dbg("%s: slot must be power up to get sensor-state\n",
45
                            __FUNCTION__);
46
 
47
                        /* some slots have to be powered up
48
                         * before get-sensor will succeed.
49
                         */
50
                        rc = rtas_set_power_level(slot->power_domain, POWER_ON,
51
                                                  &setlevel);
52
                        if (rc < 0) {
53
                                dbg("%s: power on slot[%s] failed rc=%d.\n",
54
                                    __FUNCTION__, slot->name, rc);
55
                        } else {
56
                                rc = rtas_get_sensor(DR_ENTITY_SENSE,
57
                                                     slot->index, state);
58
                        }
59
                } else if (rc == -ENODEV)
60
                        info("%s: slot is unusable\n", __FUNCTION__);
61
                else
62
                        err("%s failed to get sensor state\n", __FUNCTION__);
63
        }
64
        return rc;
65
}
66
 
67
static void set_slot_name(struct slot *slot)
68
{
69
        struct pci_bus *bus = slot->bus;
70
        struct pci_dev *bridge;
71
 
72
        bridge = bus->self;
73
        if (bridge)
74
                strcpy(slot->name, pci_name(bridge));
75
        else
76
                sprintf(slot->name, "%04x:%02x:00.0", pci_domain_nr(bus),
77
                        bus->number);
78
}
79
 
80
/**
81
 * rpaphp_enable_slot - record slot state, config pci device
82
 * @slot: target &slot
83
 *
84
 * Initialize values in the slot, and the hotplug_slot info
85
 * structures to indicate if there is a pci card plugged into
86
 * the slot. If the slot is not empty, run the pcibios routine
87
 * to get pcibios stuff correctly set up.
88
 */
89
int rpaphp_enable_slot(struct slot *slot)
90
{
91
        int rc, level, state;
92
        struct pci_bus *bus;
93
        struct hotplug_slot_info *info = slot->hotplug_slot->info;
94
 
95
        info->adapter_status = NOT_VALID;
96
        slot->state = EMPTY;
97
 
98
        /* Find out if the power is turned on for the slot */
99
        rc = rtas_get_power_level(slot->power_domain, &level);
100
        if (rc)
101
                return rc;
102
        info->power_status = level;
103
 
104
        /* Figure out if there is an adapter in the slot */
105
        rc = rpaphp_get_sensor_state(slot, &state);
106
        if (rc)
107
                return rc;
108
 
109
        bus = pcibios_find_pci_bus(slot->dn);
110
        if (!bus) {
111
                err("%s: no pci_bus for dn %s\n", __FUNCTION__, slot->dn->full_name);
112
                return -EINVAL;
113
        }
114
 
115
        info->adapter_status = EMPTY;
116
        slot->bus = bus;
117
        slot->pci_devs = &bus->devices;
118
        set_slot_name(slot);
119
 
120
        /* if there's an adapter in the slot, go add the pci devices */
121
        if (state == PRESENT) {
122
                info->adapter_status = NOT_CONFIGURED;
123
                slot->state = NOT_CONFIGURED;
124
 
125
                /* non-empty slot has to have child */
126
                if (!slot->dn->child) {
127
                        err("%s: slot[%s]'s device_node doesn't have child for adapter\n",
128
                            __FUNCTION__, slot->name);
129
                        return -EINVAL;
130
                }
131
 
132
                if (list_empty(&bus->devices))
133
                        pcibios_add_pci_devices(bus);
134
 
135
                if (!list_empty(&bus->devices)) {
136
                        info->adapter_status = CONFIGURED;
137
                        slot->state = CONFIGURED;
138
                }
139
 
140
                if (debug) {
141
                        struct pci_dev *dev;
142
                        dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, slot->dn->full_name);
143
                        list_for_each_entry (dev, &bus->devices, bus_list)
144
                                dbg("\t%s\n", pci_name(dev));
145
                }
146
        }
147
 
148
        return 0;
149
}
150
 

powered by: WebSVN 2.1.0

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